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
given_mean = 20
x1 = 20
x2 = 30

call_a <- ((given_mean^x1)* (exp(-1 * given_mean))) / (factorial(x1))
call_b <- ((given_mean^x2)* (exp(-1 * given_mean))) / (factorial(x2))

cat("The probability that the operator can process 20 calls an hour is ", call_a,"\n")
The probability that the operator can process 20 calls an hour is  0.08883532 
cat("The probability that the operator can process 30 calls an hour is ", call_b)
The probability that the operator can process 30 calls an hour is  0.008343536

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
given_mean = 20
operator = 10
x1 = 24

#The value is risen to the number of operators to show the percentage being multiplied by the number of instances it has to occur in.
call_a <- ((given_mean^x1)* (exp(-1 * given_mean))) / (factorial(x1))
prob <- call_a^operator

cat("The probability that 10 operators can process 240 calls an hour is", prob)
The probability that 10 operators can process 240 calls an hour is 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

given_mean = 85
x1 = 100

call_a <-((given_mean^x1)* (exp(-1 * given_mean))) / (factorial(x1))
cat("The probability that the operator can process 20 calls an hour is ", call_a)
The probability that the operator can process 20 calls an hour is  0.01139877

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 RGN

#Answer 3a

lcg <- function(a,c,m,rlength,seed) {
    x <- rep(0,rlength)
    x[1] <- seed
    for (i in 1:(rlength-1))
    {
       x[i+1] <- (a * x[i] + c) %% m
    }
    U <- x/m 
    return(list(x=x,U=U))
}

z1 <- lcg(9,1,16,20,5)
z2 <- lcg(7,3,32,20,10)
z1
$x
 [1]  5 14 15  8  9  2  3 12 13  6  7  0  1 10 11  4  5 14 15  8

$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 0.8750 0.9375
[20] 0.5000
z2
$x
 [1] 10  9  2 17 26 25 18  1 10  9  2 17 26 25 18  1 10  9  2 17

$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 0.56250 0.03125 0.31250
[18] 0.28125 0.06250 0.53125
print("This shows that for LCG A the system has a period of 17 and LCG B has a period of 8. This means that form a security and randomness measurment LCG A is stronger as it takes longer before it repeats itself.")
[1] "This shows that for LCG A the system has a period of 17 and LCG B has a period of 8. This means that form a security and randomness measurment LCG A is stronger as it takes longer before it repeats itself."

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

#Answer 
cat("Answer:", "The parameters of 'a' and 'seed or Z0' effect the period of a LCG")
Answer: The parameters of 'a' and 'seed or Z0' effect the period of a LCG

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) {
    x <- rep(0,rlength)
    x[1] <- seed
    for (i in 1:(rlength-1))
    {
       x[i+1] <- (a * x[i] + c) %% m
    }
    U <- x/m 
    return(list(x=x,U=U))
}

z1 <- lcg(9,1,16,20,5)
z2 <- lcg(7,3,32,20,10)

ZT = z1$z
length(ZT)
[1] 0
z1 = ZT[1:19]
z2 = ZT[2:20]

plot(z1,z2, main="Scatter Plot of Zi Values", xlim = c(0, 30), ylim = c(0, 30))

Quesion 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

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

#Answer

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

#Answer

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)
}


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

Quesion 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

Quesion 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

n_sims <- 10000
counts <- numeric(n_sims)

# Perform the Monte Carlo simulation
for (i in 1:n_sims) {
  sum_numbers <- 0
  count <- 0
  while (sum_numbers <= 1) {
    sum_numbers <- sum_numbers + runif(1)
    count <- count + 1
  }
  counts[i] <- count
}

mean_count <- mean(counts)
cat("Mean count:", mean_count, "\n")
Mean count: 2.7091 
print("I'm unclear on why this number would be familiar. However, as for why every studetn would get a diffrent answer that is becuase the answer changes with every run of the simulation based on the numbers generated, creating diffrent results every time.")
[1] "I'm unclear on why this number would be familiar. However, as for why every studetn would get a diffrent answer that is becuase the answer changes with every run of the simulation based on the numbers generated, creating diffrent results every time."

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

Quesion 1 (b)

#Answer
LS0tDQp0aXRsZTogIiA8Y2VudGVyPjxzcGFuIHN0eWxlPSdjb2xvcjogYmx1ZTsnPiBIb21ld29yayAzIDwvc3Bhbj48L2NlbnRlcj4iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4NCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYSkgUGxvdCB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBhbmQgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZm9yIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM8L3NwYW4+DQoNCmBgYHtyfQ0KI0Fuc3dlciAxYQ0KeCA8LSAwOjI0DQpwbG90KHgsIGRiaW5vbSh4LCBzaXplPTI0LCBwcm9iPTAuOSksIHhsYWI9Ik51bWJlciBvZiBCaXRzIFJlY2VpdmVkIiwgeWxhYj0iUChYID0geCkiLCB0eXBlPSJoIiwgbWFpbj0iQml0cywgbiA9IDI0LCBwID0gMC45LCIsIGZvbnQubWFpbj0xKQ0KDQp4IDwtIDA6MjQNCnBsb3QoeCwgcGJpbm9tKHgsIHNpemU9MjQsIHByb2I9MC45KSwgeGxhYj0iTnVtYmVyIG9mIEJpdHMgUmVjZWl2ZWQiLCB5bGFiPSJQKFggPD14KSIsIHlsaW09YygwLDEpLCB0eXBlPSJzIiwgbWFpbj0iQml0cywgbj0gMjQsIHA9MC45IiwgZm9udC5tYWluPTEpDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWINCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlDQojdmFyaWFibGVfbmFtZT0xMCANCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQ0KDQpwcm9iIDwtIDAuOQ0KeCA8LSAwOjI0DQptZWFuX3ZhbHVlIDwtIHJvdW5kKGRiaW5vbSh4LCBzaXplPTI0LCBwcm9iKSwgMykNCg0Kc2ltcGxlX21lYW4gPSAyNCAqIDAuOQ0KY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCBzaW1wbGVfbWVhbiwgIlxuIikNCg0KdmFyaWFuY2UgPC0gMSAtIHByb2INCnN0YW5kYXJkX2RldiA9IHNxcnQoMjQgKiB2YXJpYW5jZSAqIHByb2IpDQpjYXQoIlN0YW5kYXJkIERldmlhdGlvbiBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCBzdGFuZGFyZF9kZXYpDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYykgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQzJC1iaXQgZXJyb3JzIGluIHRoZSBibG9jayBvZiAkMjQkPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAxYw0KDQpzaXplID0gMjQNCnByb2IgPSAwLjkNCmZpbmFsX3Byb2IgPSAxIC0gcGJpbm9tKDMsIHNpemUsIHByb2IpDQoNCmNhdCgiVGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAzIGJpdCBlcnJvcnMgb2NjdWluZyBpcyAiLCBmaW5hbF9wcm9iLCAiXG4iKQ0KcHJpbnQoIk5vdGUgdGhhdCB0aGUgcHJvYmFiaWxpdHkgaXMgc28gbG93IHRoYXQgaXQgaXMgYXV0byByb3VuZGVkIHRvIDEsIHRydWUgdmFsdWUgaXMgMS0xLjQ5OCoxMF4oLTE4KSIpDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChkKSBXaGF0IGlzIHRoZSBtZWRpYW4gb2YgdGhpcyBkaXN0cmlidXRpb24/IFdoYXQgY2FuIHlvdSBpbnRlcnByZXQgZnJvbSB0aGUgbWVkaWFuIHZhbHVlPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWQNCg0Kc2l6ZSA9IDI0DQpwcm9iID0gMC45DQptZWRpYW4gPC0gcWJpbm9tKDAuNSwgc2l6ZSwgcHJvYikNCg0KY2F0KCJJbnRlcnByZXRhdGlvbjogVGhlIG1lZGlhbiBpcyIsIG1lZGlhbiwgInRoaXMgdmFsdWUgdGVsbHMgdXMgdGhhdCBoYWxmIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhhdCBhbmQgaGFsZiB3aWxsIGJlIG1vcmUuIEl0IGFsc28gbWVhbnMgdGhpcyBpcyBtaWRkbGUgb3IgY2VudHJhbCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWUNCg0Kc2l6ZSA9IDI0DQpwcm9iID0gMC45DQpxdWFudGlsZSA8LSBxYmlub20oMC42LCBzaXplLCBwcm9iKQ0KDQojSW50ZXJwcmV0YXRpb24NCmNhdCgiSW50ZXJwcmV0YXRpb246IFRoZSA2MHRoIHF1YW50aWxlIGlzIiwgcXVhbnRpbGUsInRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc3VjY2Vzc2VzIHJlcXVpcmVkIGZvciB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA2MCUuIEluIG90aGVyIHdvcmRzLCBpdCBpcyB0aGUgcG9pbnQgaW4gdGhlIGRpc3RyaWJ1dGlvbiB3aGVyZSB0aGVyZSBpcyBhIDYwJSBwcm9iYWJpbGl0eSBvciBtb3JlIG9mIGFjaGlldmluZyBhdCBsZWFzdCB0aGF0IG1hbnkgc3VjY2Vzc2VzLiIpDQpgYGANCg0KIyBRdWVzdGlvbjIuIFRoZSBQdWJsaWMgU2VydmljZSBBbnN3ZXJpbmcgUG9pbnQgKFBTQVApIGluIFNhbiBGcmFuY2lzY28gZW1wbG95cyAkMTkkIG9wZXJhdG9ycyBpbiAkOCQtaG91ciBzaGlmdHMgdG8gcHJvY2VzcyAkOTExJCBjYWxscy4gVGhlcmUgYXJlIGF0IGxlYXN0ICQ1JCBvcGVyYXRvcnMgYWx3YXlzIGFuc3dlcmluZyBjYWxscy4gVGhlIG51bWJlciBvZiBjYWxscyBwcm9jZXNzZWQgcGVyIG9wZXJhdG9yIGNhbiBiZSBtb2RlbGVkIHdpdGggYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSB3aXRoIHJhdGUgJFxsYW1iZGFfMCA9MjAkIGNhbGxzIHBlciBob3VyLg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChhKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBhbiBvcGVyYXRvciBjYW4gcHJvY2VzcyAyMCBjYWxscyBpbiBhbiBob3VyPyBSZXBlYXQgZm9yIDMwIGNhbGxzIGluIGFuIGhvdXI/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYQ0KZ2l2ZW5fbWVhbiA9IDIwDQp4MSA9IDIwDQp4MiA9IDMwDQoNCmNhbGxfYSA8LSAoKGdpdmVuX21lYW5eeDEpKiAoZXhwKC0xICogZ2l2ZW5fbWVhbikpKSAvIChmYWN0b3JpYWwoeDEpKQ0KY2FsbF9iIDwtICgoZ2l2ZW5fbWVhbl54MikqIChleHAoLTEgKiBnaXZlbl9tZWFuKSkpIC8gKGZhY3RvcmlhbCh4MikpDQoNCmNhdCgiVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGFuIGhvdXIgaXMgIiwgY2FsbF9hLCJcbiIpDQpjYXQoIlRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBvcGVyYXRvciBjYW4gcHJvY2VzcyAzMCBjYWxscyBhbiBob3VyIGlzICIsIGNhbGxfYikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYg0KZ2l2ZW5fbWVhbiA9IDIwDQpvcGVyYXRvciA9IDEwDQp4MSA9IDI0DQoNCiNUaGUgdmFsdWUgaXMgcmlzZW4gdG8gdGhlIG51bWJlciBvZiBvcGVyYXRvcnMgdG8gc2hvdyB0aGUgcGVyY2VudGFnZSBiZWluZyBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGl0IGhhcyB0byBvY2N1ciBpbi4NCmNhbGxfYSA8LSAoKGdpdmVuX21lYW5eeDEpKiAoZXhwKC0xICogZ2l2ZW5fbWVhbikpKSAvIChmYWN0b3JpYWwoeDEpKQ0KcHJvYiA8LSBjYWxsX2Feb3BlcmF0b3INCg0KY2F0KCJUaGUgcHJvYmFiaWxpdHkgdGhhdCAxMCBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgMjQwIGNhbGxzIGFuIGhvdXIgaXMiLCBwcm9iKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYykgTm93LCBJZiB0aGUgYWdncmVnYXRlIGNhbGwgcmF0ZSBwZXIgaG91ciAkXGxhbWJkYV9jJCAsIGlzIG1lYXN1cmVkIGJ5ICRcbGFtYmRhX2MgPSA4NSQgY2FsbHMgcGVyIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMTAwJCBjYWxscyBpbiBhbiBob3VyPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDJjDQoNCmdpdmVuX21lYW4gPSA4NQ0KeDEgPSAxMDANCg0KY2FsbF9hIDwtKChnaXZlbl9tZWFuXngxKSogKGV4cCgtMSAqIGdpdmVuX21lYW4pKSkgLyAoZmFjdG9yaWFsKHgxKSkNCmNhdCgiVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGFuIGhvdXIgaXMgIiwgY2FsbF9hKQ0KYGBgDQoNCiMgUXVlc3Rpb24gMy4gRm9yIHRoZSB0d28gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmVsb3cgQSBhbmQgQihkb27igJl0IGZvcmdldCB0byBhZGQgeW91ciBSIGNvZGUpDQojIyMgLSBbQV0gXChaX2kgPSAoOVpfe2ktMX0gKyAxKSBcbW9kIDE2XCkgd2l0aCBcKFpfMCA9IDVcKS4NCiMjIyAtIFtCXSBcKFpfaSA9ICg3Wl97aS0xfSArIDMpIFxtb2QgMzJcKSB3aXRoIFwoWl8wID0gMTBcKSwNCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChhKSBDb21wdXRlICRaX2kkIGFuZCAkVV9pJCBmb3IgdmFsdWVzIG9mICRpJCB1bnRpbCBhIG51bWJlciBpcyByZXBlYXRlZCwgd2hhdCBpcyB0aGUgcGVyaW9kIG9mIGJvdGggdGhlIGdlbmVyYXRvcj8gUHJvdmlkZSB5b3VyIGNvbW1lbnRzIGFib3V0IHRoZSBwZXJpb2Qgb2YgYm90aCBSR04gPC9zcGFuPg0KDQpgYGB7cn0NCiNBbnN3ZXIgM2ENCg0KbGNnIDwtIGZ1bmN0aW9uKGEsYyxtLHJsZW5ndGgsc2VlZCkgew0KICAgIHggPC0gcmVwKDAscmxlbmd0aCkNCiAgICB4WzFdIDwtIHNlZWQNCiAgICBmb3IgKGkgaW4gMToocmxlbmd0aC0xKSkNCiAgICB7DQogICAgICAgeFtpKzFdIDwtIChhICogeFtpXSArIGMpICUlIG0NCiAgICB9DQogICAgVSA8LSB4L20gDQogICAgcmV0dXJuKGxpc3QoeD14LFU9VSkpDQp9DQoNCnoxIDwtIGxjZyg5LDEsMTYsMjAsNSkNCnoyIDwtIGxjZyg3LDMsMzIsMjAsMTApDQp6MQ0KejINCnByaW50KCJUaGlzIHNob3dzIHRoYXQgZm9yIExDRyBBIHRoZSBzeXN0ZW0gaGFzIGEgcGVyaW9kIG9mIDE3IGFuZCBMQ0cgQiBoYXMgYSBwZXJpb2Qgb2YgOC4gVGhpcyBtZWFucyB0aGF0IGZvcm0gYSBzZWN1cml0eSBhbmQgcmFuZG9tbmVzcyBtZWFzdXJtZW50IExDRyBBIGlzIHN0cm9uZ2VyIGFzIGl0IHRha2VzIGxvbmdlciBiZWZvcmUgaXQgcmVwZWF0cyBpdHNlbGYuIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGIpIFdoaWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMgZWZmZWN0IHRoZSBwZXJpb2Qgb2YgTENHIOKAkyAkYSQsICRiJCwgJFpfMCQgPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIA0KY2F0KCJBbnN3ZXI6IiwgIlRoZSBwYXJhbWV0ZXJzIG9mICdhJyBhbmQgJ3NlZWQgb3IgWjAnIGVmZmVjdCB0aGUgcGVyaW9kIG9mIGEgTENHIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGMpIEZvciBib3RoIGdlbmVyYXRvcnMgcGxvdCBhIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGUgWmkgdmFsdWVzIDEgYXBhcnQuIFdoYXQgYXJlIHlvdXIgb2JzZXJ2YXRpb25zIGZyb20gdGhlc2UgcGxvdHM/IFdoYXQgZG8geW91IHRoaW5rIGFib3V0IHRoZSBwcm9wZXJ0eSBvZiByYW5kb21uZXNzIG9mIHRoZXNlIGdlbmVyYXRvcnM/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpsY2cgPC0gZnVuY3Rpb24oYSxjLG0scmxlbmd0aCxzZWVkKSB7DQogICAgeCA8LSByZXAoMCxybGVuZ3RoKQ0KICAgIHhbMV0gPC0gc2VlZA0KICAgIGZvciAoaSBpbiAxOihybGVuZ3RoLTEpKQ0KICAgIHsNCiAgICAgICB4W2krMV0gPC0gKGEgKiB4W2ldICsgYykgJSUgbQ0KICAgIH0NCiAgICBVIDwtIHgvbSANCiAgICByZXR1cm4obGlzdCh4PXgsVT1VKSkNCn0NCg0KejEgPC0gbGNnKDksMSwxNiwyMCw1KQ0KejIgPC0gbGNnKDcsMywzMiwyMCwxMCkNCg0KWlQgPSB6MSR6DQpsZW5ndGgoWlQpDQoNCnoxID0gWlRbMToxOV0NCnoyID0gWlRbMjoyMF0NCg0KcGxvdCh6MSx6MiwgbWFpbj0iU2NhdHRlciBQbG90IG9mIFppIFZhbHVlcyIsIHhsaW0gPSBjKDAsIDMwKSwgeWxpbSA9IGMoMCwgMzApKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoZCkgUmFuZG9tbmVzcyBvZiBkZWZhdWx0IHJhbmRvbSBnZW5lcmF0b3Igb2YgUiDigJMgUnVuIHJ1bmlmIGNvbW1hbmQgdG8gZ2VuZXJhdGUgMTAwIHJhbmRvbSBudW1iZXJzIGFuZCBwbG90IHRoZSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlc2UgbnVtYmVycyAoIHZhbHVlcyAxIGFwYXJ0KSBhbmQgZGlzY3VzcyB5b3VyIG9ic2VydmF0aW9ucyBhYm91dCByYW5kb21uZXNzIG9mIHRoaXMgcmFuZG9tIGdlbmVyYXRvci4gPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGUpIENvbXB1dGUgdGhlIG1lYW4gdmFsdWUgb2YgJFVfaSQgYWNyb3NzIHRoZSBwZXJpb2Q8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoZikgQnkgcHJvdmlkaW5nIGEgcGxvdCBvZiBkZW5zaXR5IChoaXN0b2dyYW0pIGRpc2N1c3MgdGhlIHVuaWZvcm1pdHkgb2YgYm90aCBvZiB0aGUgZ2VuZXJhdG9ycyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCiMgUXVlc3Rpb24gNC4gVXNpbmcgdGhlIGludmVyc2UgdHJhbnNmb3JtIG1ldGhvZA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNC4oYSkgRGV2ZWxvcCBhbiBhbGdvcml0aG0gZm9yIHRoZSByYW5kb20gdmFyaWFibGUgd2l0aCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBGKHgpIGJlbG93Ljwvc3Bhbj4NCg0KXFsgRih4KSA9IDEgLSBlXnstKHgvXGxhbWJkYSlea30gXF0NCg0Kd2hlcmUgXCggeCBcZ2VxIDAgXCksIFwoIFxsYW1iZGEgXGdlcSAwIFwpLCBhbmQgXCggayBcZ2VxIDAgXCkuDQoNCmBgYHtyfQ0KIyBBbnN3ZXIgNGENCiMgVGhpcyBtaWdodCBiZSBoYXJkIHRvIHByaW50IHVzaW5nIFIgLSB5b3UgY2FuIHdyaXRlIHRoZSBzdGVwIGluIHlvdXIgbm90ZWJvb2sgYW5kIHRoZW4gaW5jbHVkZSBpbWFnZSBoZXJlIC8gb3IgeW91IGNhbiBpbmNsdWRlIGFzIHNlcGFyYXRlIGZpbGUgd2hlbiB1cGxvYWQNCg0KIyBDaGVjayBpZiB0aGUgSVJkaXNwbGF5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQNCmlmICghcmVxdWlyZShJUmRpc3BsYXksIHF1aWV0bHkgPSBUUlVFKSkgew0KICAjIElmIG5vdCBpbnN0YWxsZWQsIGluc3RhbGwgaXQNCiAgaW5zdGFsbC5wYWNrYWdlcygiSVJkaXNwbGF5IikNCiAgDQogICMgTG9hZCB0aGUgSVJkaXNwbGF5IGxpYnJhcnkNCiAgbGlicmFyeShJUmRpc3BsYXkpDQp9IGVsc2Ugew0KICAjIElmIGFscmVhZHkgaW5zdGFsbGVkLCBqdXN0IGxvYWQgdGhlIGxpYnJhcnkNCiAgbGlicmFyeShJUmRpc3BsYXkpDQp9DQoNCg0KIyBFbWJlZCBhbiBpbWFnZQ0KI2Rpc3BsYXlfcG5nKGZpbGUgPSAiZXhhbXBsZS5wbmciKQ0KDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGIpIFVzZSB0aGUgZmlyc3QgdGhyZWUgVWkgdmFsdWVzIGZyb20gcGFydCAoYSkgYW5kIGdlbmVyYXRvciBbQV0gb2YgcHJldmlvdXMgcHJvYmxlbSB0byBjcmVhdGUgMyB2YWx1ZXMgZnJvbSB0aGUgcmFuZG9tIHZhcmlhYmxlIHdoZW4sICRcbGFtYmRhID0gMSQsICTwnZGYID0gNSQ8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gNCAoYykgc2luZyBSIGdlbmVyYXRlIDEwLDAwMCB2YWx1ZXMgZnJvbSB5b3VyIGFsZ29yaXRobSB3aGVuICBcbGFtYmRhID0gMSAsIPCdkZggPSA1ICBhbmQgcGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGVuc2l0eS4gRGlzY3VzcyB3aGF0IGluc2lnaHRzIHlvdSBvYnRhaW4gd2hlbiB5b3UgbG9vayBhdCB0aGUgcGxvdCBnZW5lcmF0ZWQgaGVyZSB2cyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHF1ZXN0aW9uIDMgKGUpIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpgYGANCg0KIyBRdWVzdGlvbiA1LiBEZXZlbG9wIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBpbiBSIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBbMCwxXSByYW5kb20gbnVtYmVycyB0aGF0IG11c3QgYmUgc3VtbWVkIHRvIGdldCBhIHN1bSBncmVhdGVyIHRoYW4gMS4gUnVuIGEgc2luZ2xlIHNpbXVsYXRpb24gd2l0aCBuID0gMTAsMDAwIHRpbWVzIGFuZCBmaW5kIHRoZSBtZWFuIG9mIHRoZSBudW1iZXIgb2YgY291bnRzLiBEbyB5b3UgdGhpbmsgdGhpcyBudW1iZXIgbG9va3Mgc29tZXdoYXQgZmFtaWxpYXIuIEV2ZXJ5IHN0dWRlbnQgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBhbnkgaWRlYXMgd2h5Pw0KYGBge3J9DQojQW5zd2VyDQoNCm5fc2ltcyA8LSAxMDAwMA0KY291bnRzIDwtIG51bWVyaWMobl9zaW1zKQ0KDQojIFBlcmZvcm0gdGhlIE1vbnRlIENhcmxvIHNpbXVsYXRpb24NCmZvciAoaSBpbiAxOm5fc2ltcykgew0KICBzdW1fbnVtYmVycyA8LSAwDQogIGNvdW50IDwtIDANCiAgd2hpbGUgKHN1bV9udW1iZXJzIDw9IDEpIHsNCiAgICBzdW1fbnVtYmVycyA8LSBzdW1fbnVtYmVycyArIHJ1bmlmKDEpDQogICAgY291bnQgPC0gY291bnQgKyAxDQogIH0NCiAgY291bnRzW2ldIDwtIGNvdW50DQp9DQoNCm1lYW5fY291bnQgPC0gbWVhbihjb3VudHMpDQpjYXQoIk1lYW4gY291bnQ6IiwgbWVhbl9jb3VudCwgIlxuIikNCnByaW50KCJJJ20gdW5jbGVhciBvbiB3aHkgdGhpcyBudW1iZXIgd291bGQgYmUgZmFtaWxpYXIuIEhvd2V2ZXIsIGFzIGZvciB3aHkgZXZlcnkgc3R1ZGV0biB3b3VsZCBnZXQgYSBkaWZmcmVudCBhbnN3ZXIgdGhhdCBpcyBiZWN1YXNlIHRoZSBhbnN3ZXIgY2hhbmdlcyB3aXRoIGV2ZXJ5IHJ1biBvZiB0aGUgc2ltdWxhdGlvbiBiYXNlZCBvbiB0aGUgbnVtYmVycyBnZW5lcmF0ZWQsIGNyZWF0aW5nIGRpZmZyZW50IHJlc3VsdHMgZXZlcnkgdGltZS4iKQ0KDQpgYGANCg0KIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkNCg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGIpIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpgYGANCg0K