Question2. The Public Service Answering Point (PSAP) in San Francisco employs \(19\) operators in \(8\)-hour shifts to process \(911\) calls. There are at least \(5\) operators always answering calls. The number of calls processed per operator can be modeled with a Poisson random variable with rate \(\lambda_0 =20\) calls per hour.

Quesion 2 (a) What is the probability an operator can process 20 calls in an hour? Repeat for 30 calls in an hour?

#Answer 2a
lambda <- 20
prob20 <- dpois (20, lambda)
prob30 <-dpois (30, lambda)
cat (prob20,  "is the probability an operator can process 20 calls in an hour")
0.08883532 is the probability an operator can process 20 calls in an hour
cat("\n")
cat (prob30, "is the probability an operator can process 30 calls in an hour")
0.008343536 is the probability an operator can process 30 calls in an hour

Quesion 2 (b) Given that 240 calls occurred in an hour, what is the probability that the ten operators can process them all assuming they are split equally among the operators?

#Answer 2b
##each op takes 24 calls wtihin an hour
prob24 <- dpois (24, lambda)
probAll <- (prob24)^10
probAll
[1] 2.892317e-13

Quesion 2 (c) Now, If the aggregate call rate per hour \(\lambda_c\) , is measured by \(\lambda_c = 85\) calls per hour, what is the probability of more than \(100\) calls in an hour

#Answer 2c
newLambda <- 85
Prob100<-1-ppois(100, 85)
cat("The probability of more than 100 calls in an hour is", Prob100)
The probability of more than 100 calls in an hour is 0.04934533

Question 3. For the two random number generator below A and B(don’t forget to add your R code)

- [A] \(Z_i = (9Z_{i-1} + 1) \mod 16\) with \(Z_0 = 5\).

- [B] \(Z_i = (7Z_{i-1} + 3) \mod 32\) with \(Z_0 = 10\),

Quesion 3 (a) Compute \(Z_i\) and \(U_i\) for values of \(i\) until a number is repeated, what is the period of both the generator? Provide your comments about the period of both RNG

#Answer 3a
seed <- 5
a <- 9
c<- 1
m<- 16
rlength <- 50

lcg <- function(a, c, m, rlength, seed) {
z <-rep (0, rlength)
z[1] <- seed

# loop to gen random numbers
for (i in 1:(rlength-1)) {
  #compute next lcg value
  z[i+1] <- (a*z[i] +c) %% m
}
U <- z / m
return (list(z=z,U=U))
}

lcg (9,1,16, 25, 5)
$z
 [1]  5 14 15  8  9  2  3 12 13  6  7  0  1 10 11  4  5 14 15  8  9  2  3 12 13

$U
 [1] 0.3125 0.8750 0.9375 0.5000 0.5625 0.1250 0.1875 0.7500 0.8125 0.3750 0.4375 0.0000 0.0625 0.6250 0.6875 0.2500 0.3125
[18] 0.8750 0.9375 0.5000 0.5625 0.1250 0.1875 0.7500 0.8125
cat ("The period for equation A is 16. This is equal to the modulus, meaning this is its full period, the same value as the mod.")
The period for equation A is 16. This is equal to the modulus, meaning this is its full period, the same value as the mod.
seed <- 10
a <- 7
c <- 3
m <- 32
rlength <- 50

lcg <- function(a, c, m, rlength, seed) {
z <- rep(0,rlength)
z[1] <- Z0_forB
for (i in 1:(rlength-1)) {
  z[i+1] <- (a*z[i] +c) %% m
}

#Calculate uniform rand value U in [0,1]
U <- z/m

#Return
return (list(z=z,U=U))
}
lcg(7,3,32,25,10)
$z
 [1] 10  9  2 17 26 25 18  1 10  9  2 17 26 25 18  1 10  9  2 17 26 25 18  1 10

$U
 [1] 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125 0.56250 0.03125 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125
[15] 0.56250 0.03125 0.31250 0.28125 0.06250 0.53125 0.81250 0.78125 0.56250 0.03125 0.31250

Question 3 (b) Which of these parameters effect the period of LCG – \(a\), \(b\), \(Z_0\)

#Answer 
cat("Parameters a and c affect the period of the LCG. The seed is multiplied by a and added to by c, and this number is operated upon by the modulo value.")
Parameters a and c affect the period of the LCG. The seed is multiplied by a and added to by c, and this number is operated upon by the modulo value.

Quesion 3 (c) For both generators plot a scatter diagram of the Zi values 1 apart. What are your observations from these plots? What do you think about the property of randomness of these generators?

#Answer
lcg <- function(a, c, m, rlength, seed) {
z <- rep(0,rlength)
z[1] <- Z0_forB
for (i in 1:(rlength-1)) {
  z[i+1] <- (a*z[i] +c) %% m
}

#Calculate uniform rand value U in [0,1]
U <- z/m

#Return
return (list(z=z,U=U)) }
example <- lcg(9,1,16, 25, 5)
ZT = example$z
Z1 =ZT[1:16]
Z2 = ZT[2:17]
plot (Z1, Z2, main = "Scatterplot of Zi Values for Equation A")


example <- lcg(7,3,32,25,10)
ZT = example$z
Z1 =ZT[1:8]
Z2 = ZT[2:9]
plot (Z1, Z2, main = "Scatterplot of Zi Values for Equation B")


cat("In scatterplot A, a visible and predictable pattern is shown. This means that LCG equation A is not very random. In scatterplot B, there is a less predictable pattern and the plot points are more scattered about. This shows that LCG B is more random, and can generate more unpreditable sequences than A.")
In scatterplot A, a visible and predictable pattern is shown. This means that LCG equation A is not very random. In scatterplot B, there is a less predictable pattern and the plot points are more scattered about. This shows that LCG B is more random, and can generate more unpreditable sequences than A.

Question 3 (d) Randomness of default random generator of R – Run runif command to generate 100 random numbers and plot the scatter diagram of these numbers ( values 1 apart) and discuss your observations about randomness of this random generator.

#Answer
rand <-runif(100)
rand
  [1] 0.57608160 0.90633661 0.86341068 0.06518454 0.94756522 0.31624360 0.39735815 0.29912225 0.61354231 0.62707194
 [11] 0.58216907 0.82012066 0.19860669 0.08905146 0.21158870 0.30366478 0.31175807 0.96213756 0.22735787 0.81010627
 [21] 0.13580325 0.55613351 0.19740285 0.78554348 0.88587381 0.28749707 0.84680518 0.56461377 0.35905576 0.26812346
 [31] 0.35646099 0.36033073 0.16581994 0.32082877 0.66402564 0.95992280 0.95425132 0.47297589 0.48864110 0.52958244
 [41] 0.99667129 0.69244686 0.95172444 0.63557902 0.66240638 0.12003894 0.71171426 0.52332448 0.49005332 0.14609978
 [51] 0.77039162 0.94400060 0.30546333 0.74528827 0.83473715 0.84479895 0.79791058 0.79453675 0.82380320 0.95854745
 [61] 0.03976804 0.65061744 0.12354842 0.01488115 0.42201990 0.31200090 0.98822245 0.60617974 0.38253127 0.97231882
 [71] 0.87166879 0.61465042 0.58090161 0.29415328 0.33103456 0.93238347 0.38675807 0.90356363 0.46713331 0.92869827
 [81] 0.23277721 0.25709528 0.86156281 0.69523689 0.14707560 0.35884933 0.07953704 0.20422794 0.15875490 0.77472802
 [91] 0.92148488 0.08272197 0.04469671 0.67531416 0.24090663 0.57905143 0.59784965 0.84457965 0.89290587 0.90498868
##Scatterplot

plot(rand[-length(rand)],rand[-1])


cat("This random generator is very unpredictable, as shown by the pattern on the scatterplot. There is no discernable pattern, and it appears that it is much stronger at generating unpredictable numbers than an LCG.")
This random generator is very unpredictable, as shown by the pattern on the scatterplot. There is no discernable pattern, and it appears that it is much stronger at generating unpredictable numbers than an LCG.

Question 3 (e) Compute the mean value of \(U_i\) across the period

#Answer
meanUi <- mean(rand)
cat("The mean value of Ui across the period is", meanUi, "\n")
The mean value of Ui across the period is 0.5441508 

Question 3 (f) By providing a plot of density (histogram) discuss the uniformity of both of the generators

#Answer
exampleA <- lcg(9,1,16,16, 5)
hdataA<- exampleA$U
hist(hdataA)



exampleB <- lcg(7,3,32,32,10)
hdataB<- exampleB$U
hist(hdataB)


cat("A shows more uniformity, supporting that it fully utilizes the whole period with its generated values. B on the other hand is more dispersed, showing it does not use its full period.")
A shows more uniformity, supporting that it fully utilizes the whole period with its generated values. B on the other hand is more dispersed, showing it does not use its full period.

Question 4. Using the inverse transform method

Question 4.(a) Develop an algorithm for the random variable with cumulative distribution function F(x) below.

\[ F(x) = 1 - e^{-(x/\lambda)^k} \]

where \(x \geq 0\), \(\lambda \geq 0\), and \(k \geq 0\).

# Answer 4a
# This might be hard to print using R - you can write the step in your notebook and then include image here / or you can include as seperate file when upload

# Check if the IRdisplay package is already installed
if (!require(IRdisplay, quietly = TRUE)) {
  # If not installed, install it
  install.packages("IRdisplay")
  
  # Load the IRdisplay library
  library(IRdisplay)
} else {
  # If already installed, just load the library
  library(IRdisplay)
}

inversetransform <- function(amount, lambda, k) {
  U <- runif(amount, 0,1)
  values <- rep(0, amount)
  i <- 1
for (i in 1: length(U)) {
  values[i] <- lambda * (nthroot(log(1-U[i]),k))
}  
  return (values=values)
  values
}


# Embed an image
#display_png(file = "example.png")

Question 4 (b) Use the first three Ui values from part (a) and generator [A] of previous problem to create 3 values from the random variable when, \(\lambda = 1\), \(𝑘 = 5\)

#Answer
Ui1 <- -1.0307
Ui2 <- -0.6685
Ui3 <- -0.5780

Question 4 (c) sing R generate 10,000 values from your algorithm when = 1 , 𝑘 = 5 and plot a histogram of the density. Discuss what insights you obtain when you look at the plot generated here vs the plot you generated in question 3 (e)

#Answer

Question 5. Develop a Monte Carlo simulation in R that counts the number of uniform [0,1] random numbers that must be summed to get a sum greater than 1. Run a single simulation with n = 10,000 times and find the mean of the number of counts. Do you think this number looks somewhat familiar. Every student might get slightly different value any ideas why?

#Answer
simulation_counts = function() {
  values <- 0
  count <- 0
  while (values <=1) {
    count = count +1
    values = values +runif(1)
  }
  return (count)
}


n <- 10000
rep = replicate(n, simulation_counts())
meanCounts = mean(rep)
cat ("The mean number of counts is", meanCounts, "\n")
The mean number of counts is 2.7131 
cat ("Students get different values because the numbers are randomly generated.")
Students get different values because the numbers are randomly generated.

Question 6. For our specific random variable, we know that its PDF is defined by the function \(f(x) = 10x(1-x)\). Utilize the accept-reject algorithm to draw samples from this distribution. Take a look at Lecture 10 slide 8 and 9

#Answer 

accept_reject <- function(f, c, g, rg, n) {
n.accepts <- 0
result.sample <- rep(NA, n)
while (n.accepts < n) {
x.star <- rg(1) # step 1
u <- runif(1,0,1) # step 2
if (u < f(x.star)/(c*g(x.star))) { # step 3 (accept)
n.accepts <- n.accepts+1
result.sample[n.accepts] = x.star
}
}
result.sample
}

f <- function(x) 10*x*(1-x) 
g <- function(x) x/x 
rg <- function(n) runif(n,0,1) 
c <- 2 
vals <- accept_reject(f, c, g, rg, 1000)
hist(vals,freq=FALSE, main="Histogram")

Quesion 1 (b)

#Answer
LS0tCnRpdGxlOiAiIDxjZW50ZXI+PHNwYW4gc3R5bGU9J2NvbG9yOiBibHVlOyc+IEhvbWV3b3JrIDMgPC9zcGFuPjwvY2VudGVyPiIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGEpIFBsb3QgdGhlIHByb2JhYmlsaXR5IGRlbnNpdHkgZnVuY3Rpb24gYW5kIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIGZvciB0aGUgbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzPC9zcGFuPgoKYGBge3J9CiNBbnN3ZXIgMWEKbiA8LSAyNAp4IDwtIDA6bgpwIDwtIDAuOQojUERGCnBsb3QgKHgsZGJpbm9tKHgsbixwKSwgdHlwZSA9ICdoJykKeGxhYiA9ICJOdW1iZXIgb2YgY29ycmVjdGx5LXJlY2VpdmVkIGJpdHMiCnlsYWI9ICJwcm9iYWJpbGl0eSIKCiNDREYKY2RmPC1wYmlub20gKDA6biwgMjQsIDAuOSkKcGxvdCh4LGNkZiwgdHlwZSA9J3MnKQp4bGFiPSAiTnVtYmVyIG9mIGNvcnJlY3RseS1yZWNlaXZlZCBiaXRzIiAKeWxhYj0gIkNERiIKCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFiCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlCiN2YXJpYWJsZV9uYW1lPTEwIAojY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCAgdmFyaWFibGVfbmFtZSkKbiA8LSAyNApwIDwtIDAuOQpiaXRNZWFuIDwtIChuKnApCmNhdCAoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzIGlzIiwgYml0TWVhbikgCmNhdCAoIlxuIikKc3REZXYgPC0gc3FydCgobipwKSooMS1wKSkKY2F0ICgiU3RhbmRhcmQgRGV2aWF0aW9uIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzIGlzIiwgc3REZXYpCmBgYAoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYykgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQzJC1iaXQgZXJyb3JzIGluIHRoZSBibG9jayBvZiAkMjQkPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMWMKcHJvYk1vcmVUaGFuVGhyZWUgPC0gMS1wYmlub20oMywgMjQsIDAuMSkKY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDMgYml0IGVycm9ycyBpbiB0aGUgYmxvY2sgaXMiLCBwcm9iTW9yZVRoYW5UaHJlZSkKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoZCkgV2hhdCBpcyB0aGUgbWVkaWFuIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhlIG1lZGlhbiB2YWx1ZT8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAxZAptZWRpYW5EaXN0PC1xYmlub20oMC41LCAyNCwgMC45KQptZWRpYW5EaXN0CmNhdCAoIlRoZSBtZWRpYW4gaXMiLCBtZWRpYW5EaXN0LCAiYW5kIGl0IGNhbiB0ZWxsIHlvdSB0aGUgYW1vdW50IG9mIHRpbWVzICgyMiBvciBmZXdlcikgdGhlIGNvcnJlY3QgYml0IHdpbGwgYmUgcmVjZWl2ZWQgNTAlIG9mIHRoZSB0aW1lLiIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+CmBgYHtyfQojQW5zd2VyIDFlCnF1YW50NjAgPC0gcWJpbm9tICgwLjYsIDI0LCAwLjkpCnF1YW50NjAKI0ludGVycHJldGF0aW9uCmNhdCgiVGhlIDYwdGggcXVhbnRpbGUgaXMgMjIsIG1lYW5pbmcgdGhhdCA2MCUgb2YgdGhlIHRpbWUsIHRoZXJlIHdpbGwgYmUgMjIgb3IgbGVzcyBiaXRzIGJlaW5nIHJlY2VpdmVkIGNvcnJlY3RseS4iKQpgYGAKCiMgUXVlc3Rpb24yLiBUaGUgUHVibGljIFNlcnZpY2UgQW5zd2VyaW5nIFBvaW50IChQU0FQKSBpbiBTYW4gRnJhbmNpc2NvIGVtcGxveXMgJDE5JCBvcGVyYXRvcnMgaW4gJDgkLWhvdXIgc2hpZnRzIHRvIHByb2Nlc3MgJDkxMSQgY2FsbHMuIFRoZXJlIGFyZSBhdCBsZWFzdCAkNSQgb3BlcmF0b3JzIGFsd2F5cyBhbnN3ZXJpbmcgY2FsbHMuIFRoZSBudW1iZXIgb2YgY2FsbHMgcHJvY2Vzc2VkIHBlciBvcGVyYXRvciBjYW4gYmUgbW9kZWxlZCB3aXRoIGEgUG9pc3NvbiByYW5kb20gdmFyaWFibGUgd2l0aCByYXRlICRcbGFtYmRhXzAgPTIwJCBjYWxscyBwZXIgaG91ci4KCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGEpIFdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGluIGFuIGhvdXI/IFJlcGVhdCBmb3IgMzAgY2FsbHMgaW4gYW4gaG91cj8gPC9zcGFuPgpgYGB7cn0KI0Fuc3dlciAyYQpsYW1iZGEgPC0gMjAKcHJvYjIwIDwtIGRwb2lzICgyMCwgbGFtYmRhKQpwcm9iMzAgPC1kcG9pcyAoMzAsIGxhbWJkYSkKY2F0IChwcm9iMjAsICAiaXMgdGhlIHByb2JhYmlsaXR5IGFuIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGluIGFuIGhvdXIiKQpjYXQoIlxuIikKY2F0IChwcm9iMzAsICJpcyB0aGUgcHJvYmFiaWxpdHkgYW4gb3BlcmF0b3IgY2FuIHByb2Nlc3MgMzAgY2FsbHMgaW4gYW4gaG91ciIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmIKIyNlYWNoIG9wIHRha2VzIDI0IGNhbGxzIHd0aWhpbiBhbiBob3VyCnByb2IyNCA8LSBkcG9pcyAoMjQsIGxhbWJkYSkKcHJvYkFsbCA8LSAocHJvYjI0KV4xMApwcm9iQWxsCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGMpIE5vdywgSWYgdGhlIGFnZ3JlZ2F0ZSBjYWxsIHJhdGUgcGVyIGhvdXIgJFxsYW1iZGFfYyQgLCBpcyBtZWFzdXJlZCBieSAkXGxhbWJkYV9jID0gODUkIGNhbGxzIHBlciBob3VyLCB3aGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiBtb3JlIHRoYW4gJDEwMCQgY2FsbHMgaW4gYW4gaG91cjwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgMmMKbmV3TGFtYmRhIDwtIDg1ClByb2IxMDA8LTEtcHBvaXMoMTAwLCA4NSkKY2F0KCJUaGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuIDEwMCBjYWxscyBpbiBhbiBob3VyIGlzIiwgUHJvYjEwMCkKCmBgYAoKIyBRdWVzdGlvbiAzLiBGb3IgdGhlIHR3byByYW5kb20gbnVtYmVyIGdlbmVyYXRvciBiZWxvdyBBIGFuZCBCKGRvbuKAmXQgZm9yZ2V0IHRvIGFkZCB5b3VyIFIgY29kZSkKIyMjIC0gW0FdIFwoWl9pID0gKDlaX3tpLTF9ICsgMSkgXG1vZCAxNlwpIHdpdGggXChaXzAgPSA1XCkuCiMjIyAtIFtCXSBcKFpfaSA9ICg3Wl97aS0xfSArIDMpIFxtb2QgMzJcKSB3aXRoIFwoWl8wID0gMTBcKSwKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGEpIENvbXB1dGUgJFpfaSQgYW5kICRVX2kkIGZvciB2YWx1ZXMgb2YgJGkkIHVudGlsIGEgbnVtYmVyIGlzIHJlcGVhdGVkLCB3aGF0IGlzIHRoZSBwZXJpb2Qgb2YgYm90aCB0aGUgZ2VuZXJhdG9yPyBQcm92aWRlIHlvdXIgY29tbWVudHMgYWJvdXQgdGhlIHBlcmlvZCBvZiBib3RoIFJORyA8L3NwYW4+CgpgYGB7cn0KI0Fuc3dlciAzYQpzZWVkIDwtIDUKYSA8LSA5CmM8LSAxCm08LSAxNgpybGVuZ3RoIDwtIDUwCgpsY2cgPC0gZnVuY3Rpb24oYSwgYywgbSwgcmxlbmd0aCwgc2VlZCkgewp6IDwtcmVwICgwLCBybGVuZ3RoKQp6WzFdIDwtIHNlZWQKCiMgbG9vcCB0byBnZW4gcmFuZG9tIG51bWJlcnMKZm9yIChpIGluIDE6KHJsZW5ndGgtMSkpIHsKICAjY29tcHV0ZSBuZXh0IGxjZyB2YWx1ZQogIHpbaSsxXSA8LSAoYSp6W2ldICtjKSAlJSBtCn0KVSA8LSB6IC8gbQpyZXR1cm4gKGxpc3Qoej16LFU9VSkpCn0KCmxjZyAoOSwxLDE2LCAyNSwgNSkKY2F0ICgiVGhlIHBlcmlvZCBmb3IgZXF1YXRpb24gQSBpcyAxNi4gVGhpcyBpcyBlcXVhbCB0byB0aGUgbW9kdWx1cywgbWVhbmluZyB0aGlzIGlzIGl0cyBmdWxsIHBlcmlvZCwgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG1vZC4iKQpgYGAKCmBgYHtyfQpzZWVkIDwtIDEwCmEgPC0gNwpjIDwtIDMKbSA8LSAzMgpybGVuZ3RoIDwtIDUwCgpsY2cgPC0gZnVuY3Rpb24oYSwgYywgbSwgcmxlbmd0aCwgc2VlZCkgewp6IDwtIHJlcCgwLHJsZW5ndGgpCnpbMV0gPC0gWjBfZm9yQgpmb3IgKGkgaW4gMToocmxlbmd0aC0xKSkgewogIHpbaSsxXSA8LSAoYSp6W2ldICtjKSAlJSBtCn0KCiNDYWxjdWxhdGUgdW5pZm9ybSByYW5kIHZhbHVlIFUgaW4gWzAsMV0KVSA8LSB6L20KCiNSZXR1cm4KcmV0dXJuIChsaXN0KHo9eixVPVUpKQp9CmxjZyg3LDMsMzIsMjUsMTApCgpjYXQgKCJUaGUgcGVyaW9kIGZvciBlcXVhdGlvbiBCIGlzIDguIFRoaXMgaXMgMS80IG9mIHRoZSBtb2R1bHVzLCBtZWFuaW5nIGl0IGlzIG5vdCBpdHMgZnVsbCBwZXJpb2QsIHdoaWNoIGlzIDMyLiIpCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiAzIChiKSBXaGljaCBvZiB0aGVzZSBwYXJhbWV0ZXJzIGVmZmVjdCB0aGUgcGVyaW9kIG9mIExDRyDigJMgJGEkLCAkYiQsICRaXzAkIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIgCmNhdCgiUGFyYW1ldGVycyBhIGFuZCBjIGFmZmVjdCB0aGUgcGVyaW9kIG9mIHRoZSBMQ0cuIFRoZSBzZWVkIGlzIG11bHRpcGxpZWQgYnkgYSBhbmQgYWRkZWQgdG8gYnkgYywgYW5kIHRoaXMgbnVtYmVyIGlzIG9wZXJhdGVkIHVwb24gYnkgdGhlIG1vZHVsbyB2YWx1ZS4iKQpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChjKSBGb3IgYm90aCBnZW5lcmF0b3JzIHBsb3QgYSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlIFppIHZhbHVlcyAxIGFwYXJ0LiBXaGF0IGFyZSB5b3VyIG9ic2VydmF0aW9ucyBmcm9tIHRoZXNlIHBsb3RzPyBXaGF0IGRvIHlvdSB0aGluayBhYm91dCB0aGUgcHJvcGVydHkgb2YgcmFuZG9tbmVzcyBvZiB0aGVzZSBnZW5lcmF0b3JzPyA8L3NwYW4+CmBgYHtyfQojQW5zd2VyCmxjZyA8LSBmdW5jdGlvbihhLCBjLCBtLCBybGVuZ3RoLCBzZWVkKSB7CnogPC0gcmVwKDAscmxlbmd0aCkKelsxXSA8LSBaMF9mb3JCCmZvciAoaSBpbiAxOihybGVuZ3RoLTEpKSB7CiAgeltpKzFdIDwtIChhKnpbaV0gK2MpICUlIG0KfQoKI0NhbGN1bGF0ZSB1bmlmb3JtIHJhbmQgdmFsdWUgVSBpbiBbMCwxXQpVIDwtIHovbQoKI1JldHVybgpyZXR1cm4gKGxpc3Qoej16LFU9VSkpIH0KZXhhbXBsZSA8LSBsY2coOSwxLDE2LCAyNSwgNSkKWlQgPSBleGFtcGxlJHoKWjEgPVpUWzE6MTZdCloyID0gWlRbMjoxN10KcGxvdCAoWjEsIFoyLCBtYWluID0gIlNjYXR0ZXJwbG90IG9mIFppIFZhbHVlcyBmb3IgRXF1YXRpb24gQSIpCgpleGFtcGxlIDwtIGxjZyg3LDMsMzIsMjUsMTApClpUID0gZXhhbXBsZSR6CloxID1aVFsxOjhdCloyID0gWlRbMjo5XQpwbG90IChaMSwgWjIsIG1haW4gPSAiU2NhdHRlcnBsb3Qgb2YgWmkgVmFsdWVzIGZvciBFcXVhdGlvbiBCIikKCmNhdCgiSW4gc2NhdHRlcnBsb3QgQSwgYSB2aXNpYmxlIGFuZCBwcmVkaWN0YWJsZSBwYXR0ZXJuIGlzIHNob3duLiBUaGlzIG1lYW5zIHRoYXQgTENHIGVxdWF0aW9uIEEgaXMgbm90IHZlcnkgcmFuZG9tLiBJbiBzY2F0dGVycGxvdCBCLCB0aGVyZSBpcyBhIGxlc3MgcHJlZGljdGFibGUgcGF0dGVybiBhbmQgdGhlIHBsb3QgcG9pbnRzIGFyZSBtb3JlIHNjYXR0ZXJlZCBhYm91dC4gVGhpcyBzaG93cyB0aGF0IExDRyBCIGlzIG1vcmUgcmFuZG9tLCBhbmQgY2FuIGdlbmVyYXRlIG1vcmUgdW5wcmVkaXRhYmxlIHNlcXVlbmNlcyB0aGFuIEEuIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXN0aW9uIDMgKGQpIFJhbmRvbW5lc3Mgb2YgZGVmYXVsdCByYW5kb20gZ2VuZXJhdG9yIG9mIFIg4oCTIFJ1biBydW5pZiBjb21tYW5kIHRvIGdlbmVyYXRlIDEwMCByYW5kb20gbnVtYmVycyBhbmQgcGxvdCB0aGUgc2NhdHRlciBkaWFncmFtIG9mIHRoZXNlIG51bWJlcnMgKCB2YWx1ZXMgMSBhcGFydCkgYW5kIGRpc2N1c3MgeW91ciBvYnNlcnZhdGlvbnMgYWJvdXQgcmFuZG9tbmVzcyBvZiB0aGlzIHJhbmRvbSBnZW5lcmF0b3IuIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKcmFuZCA8LXJ1bmlmKDEwMCkKcmFuZAojI1NjYXR0ZXJwbG90CnBsb3QocmFuZFstbGVuZ3RoKHJhbmQpXSxyYW5kWy0xXSkKCmNhdCgiVGhpcyByYW5kb20gZ2VuZXJhdG9yIGlzIHZlcnkgc3Ryb25nLCBhcyBzaG93biBieSB0aGUgcGF0dGVybiBvbiB0aGUgc2NhdHRlcnBsb3QuIFRoZXJlIGlzIG5vIGRpc2Nlcm5hYmxlIHBhdHRlcm4sIGFuZCBpdCBhcHBlYXJzIHRoYXQgaXQgaXMgbXVjaCBzdHJvbmdlciBhdCBnZW5lcmF0aW5nIHVucHJlZGljdGFibGUgbnVtYmVycyB0aGFuIGFuIExDRy4iKQpgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gMyAoZSkgQ29tcHV0ZSB0aGUgbWVhbiB2YWx1ZSBvZiAkVV9pJCBhY3Jvc3MgdGhlIHBlcmlvZDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKbWVhblVpIDwtIG1lYW4ocmFuZCkKY2F0KCJUaGUgbWVhbiB2YWx1ZSBvZiBVaSBhY3Jvc3MgdGhlIHBlcmlvZCBpcyIsIG1lYW5VaSwgIlxuIikKCmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiAzIChmKSBCeSBwcm92aWRpbmcgYSBwbG90IG9mIGRlbnNpdHkgKGhpc3RvZ3JhbSkgZGlzY3VzcyB0aGUgdW5pZm9ybWl0eSBvZiBib3RoIG9mIHRoZSBnZW5lcmF0b3JzIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKZXhhbXBsZUEgPC0gbGNnKDksMSwxNiwxNiwgNSkKaGRhdGFBPC0gZXhhbXBsZUEkVQpoaXN0KGhkYXRhQSkKCgpleGFtcGxlQiA8LSBsY2coNywzLDMyLDMyLDEwKQpoZGF0YUI8LSBleGFtcGxlQiRVCmhpc3QoaGRhdGFCKQoKY2F0KCJBIHNob3dzIG1vcmUgdW5pZm9ybWl0eSwgc3VwcG9ydGluZyB0aGF0IGl0IGZ1bGx5IHV0aWxpemVzIHRoZSB3aG9sZSBwZXJpb2Qgd2l0aCBpdHMgZ2VuZXJhdGVkIHZhbHVlcy4gQiBvbiB0aGUgb3RoZXIgaGFuZCBpcyBtb3JlIGRpc3BlcnNlZCwgc2hvd2luZyBpdCBkb2VzIG5vdCB1c2UgaXRzIGZ1bGwgcGVyaW9kLiIpCmBgYAoKIyBRdWVzdGlvbiA0LiBVc2luZyB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gbWV0aG9kCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNC4oYSkgRGV2ZWxvcCBhbiBhbGdvcml0aG0gZm9yIHRoZSByYW5kb20gdmFyaWFibGUgd2l0aCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBGKHgpIGJlbG93Ljwvc3Bhbj4KClxbIEYoeCkgPSAxIC0gZV57LSh4L1xsYW1iZGEpXmt9IFxdCgp3aGVyZSBcKCB4IFxnZXEgMCBcKSwgXCggXGxhbWJkYSBcZ2VxIDAgXCksIGFuZCBcKCBrIFxnZXEgMCBcKS4KCmBgYHtyfQojIEFuc3dlciA0YQojIFRoaXMgbWlnaHQgYmUgaGFyZCB0byBwcmludCB1c2luZyBSIC0geW91IGNhbiB3cml0ZSB0aGUgc3RlcCBpbiB5b3VyIG5vdGVib29rIGFuZCB0aGVuIGluY2x1ZGUgaW1hZ2UgaGVyZSAvIG9yIHlvdSBjYW4gaW5jbHVkZSBhcyBzZXBlcmF0ZSBmaWxlIHdoZW4gdXBsb2FkCgojIENoZWNrIGlmIHRoZSBJUmRpc3BsYXkgcGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZAppZiAoIXJlcXVpcmUoSVJkaXNwbGF5LCBxdWlldGx5ID0gVFJVRSkpIHsKICAjIElmIG5vdCBpbnN0YWxsZWQsIGluc3RhbGwgaXQKICBpbnN0YWxsLnBhY2thZ2VzKCJJUmRpc3BsYXkiKQogIAogICMgTG9hZCB0aGUgSVJkaXNwbGF5IGxpYnJhcnkKICBsaWJyYXJ5KElSZGlzcGxheSkKfSBlbHNlIHsKICAjIElmIGFscmVhZHkgaW5zdGFsbGVkLCBqdXN0IGxvYWQgdGhlIGxpYnJhcnkKICBsaWJyYXJ5KElSZGlzcGxheSkKfQoKaW52ZXJzZXRyYW5zZm9ybSA8LSBmdW5jdGlvbihudW0sIGxhbWJkYSwgaykgewogIFUgPC0gcnVuaWYobnVtLCAwLDEpCiAgdmFsdWVzIDwtIHJlcCgwLCBudW0pCiAgaSA8LSAxCmZvciAoaSBpbiAxOiBsZW5ndGgoVSkpIHsKICB2YWx1ZXNbaV0gPC0gbGFtYmRhICogKG50aHJvb3QobG9nKDEtVVtpXSksaykpCn0gIAp9CmBgYAoKCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzdGlvbiA0IChiKSBVc2UgdGhlIGZpcnN0IHRocmVlIFVpIHZhbHVlcyBmcm9tIHBhcnQgKGEpIGFuZCBnZW5lcmF0b3IgW0FdIG9mIHByZXZpb3VzIHByb2JsZW0gdG8gY3JlYXRlIDMgdmFsdWVzIGZyb20gdGhlIHJhbmRvbSB2YXJpYWJsZSB3aGVuLCAkXGxhbWJkYSA9IDEkLCAk8J2RmCA9IDUkPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgpVaTEgPC0gLTEuMDMwNwpVaTIgPC0gLTAuNjY4NQpVaTMgPC0gLTAuNTc4MApgYGAKCgojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNCAoYykgc2luZyBSIGdlbmVyYXRlIDEwLDAwMCB2YWx1ZXMgZnJvbSB5b3VyIGFsZ29yaXRobSB3aGVuICBcbGFtYmRhID0gMSAsIPCdkZggPSA1ICBhbmQgcGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGVuc2l0eS4gRGlzY3VzcyB3aGF0IGluc2lnaHRzIHlvdSBvYnRhaW4gd2hlbiB5b3UgbG9vayBhdCB0aGUgcGxvdCBnZW5lcmF0ZWQgaGVyZSB2cyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHF1ZXN0aW9uIDMgKGUpIDwvc3Bhbj4KYGBge3J9CiNBbnN3ZXIKCmBgYAoKIyBRdWVzdGlvbiA1LiBEZXZlbG9wIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBpbiBSIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBbMCwxXSByYW5kb20gbnVtYmVycyB0aGF0IG11c3QgYmUgc3VtbWVkIHRvIGdldCBhIHN1bSBncmVhdGVyIHRoYW4gMS4gUnVuIGEgc2luZ2xlIHNpbXVsYXRpb24gd2l0aCBuID0gMTAsMDAwIHRpbWVzIGFuZCBmaW5kIHRoZSBtZWFuIG9mIHRoZSBudW1iZXIgb2YgY291bnRzLiBEbyB5b3UgdGhpbmsgdGhpcyBudW1iZXIgbG9va3Mgc29tZXdoYXQgZmFtaWxpYXIuIEV2ZXJ5IHN0dWRlbnQgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBhbnkgaWRlYXMgd2h5PwpgYGB7cn0KI0Fuc3dlcgpzaW11bGF0aW9uX2NvdW50cyA9IGZ1bmN0aW9uKCkgewogIHZhbHVlcyA8LSAwCiAgY291bnQgPC0gMAogIHdoaWxlICh2YWx1ZXMgPD0xKSB7CiAgICBjb3VudCA9IGNvdW50ICsxCiAgICB2YWx1ZXMgPSB2YWx1ZXMgK3J1bmlmKDEpCiAgfQogIHJldHVybiAoY291bnQpCn0KCgpuIDwtIDEwMDAwCnJlcCA9IHJlcGxpY2F0ZShuLCBzaW11bGF0aW9uX2NvdW50cygpKQptZWFuQ291bnRzID0gbWVhbihyZXApCmNhdCAoIlRoZSBtZWFuIG51bWJlciBvZiBjb3VudHMgaXMiLCBtZWFuQ291bnRzLCAiXG4iKQpjYXQgKCJTdHVkZW50cyBnZXQgZGlmZmVyZW50IHZhbHVlcyBiZWNhdXNlIHRoZSBudW1iZXJzIGFyZSByYW5kb21seSBnZW5lcmF0ZWQuIikKCmBgYAoKIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkKCmBgYHtyfQojQW5zd2VyIAoKYWNjZXB0X3JlamVjdCA8LSBmdW5jdGlvbihmLCBjLCBnLCByZywgbikgewpuLmFjY2VwdHMgPC0gMApyZXN1bHQuc2FtcGxlIDwtIHJlcChOQSwgbikKd2hpbGUgKG4uYWNjZXB0cyA8IG4pIHsKeC5zdGFyIDwtIHJnKDEpICMgc3RlcCAxCnUgPC0gcnVuaWYoMSwwLDEpICMgc3RlcCAyCmlmICh1IDwgZih4LnN0YXIpLyhjKmcoeC5zdGFyKSkpIHsgIyBzdGVwIDMgKGFjY2VwdCkKbi5hY2NlcHRzIDwtIG4uYWNjZXB0cysxCnJlc3VsdC5zYW1wbGVbbi5hY2NlcHRzXSA9IHguc3Rhcgp9Cn0KcmVzdWx0LnNhbXBsZQp9CgpmIDwtIGZ1bmN0aW9uKHgpIDEwKngqKDEteCkgCmcgPC0gZnVuY3Rpb24oeCkgeC94IApyZyA8LSBmdW5jdGlvbihuKSBydW5pZihuLDAsMSkgCmMgPC0gMiAKdmFscyA8LSBhY2NlcHRfcmVqZWN0KGYsIGMsIGcsIHJnLCAxMDAwKQpoaXN0KHZhbHMsZnJlcT1GQUxTRSwgbWFpbj0iSGlzdG9ncmFtIikKYGBgCgoKIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgPC9zcGFuPgpgYGB7cn0KI0Fuc3dlcgoKYGBgCgo=