Question 1. Consider the Binomial distribution with \(n = 24\) and \(p
= .9\) that is used to model the number of correctly received
bits on a satellite link that transmits data in \(24\)-bit blocks.
Quesion 1 (a) Plot the probability
density function and cumulative distribution function for the number of
correctly received bits
#Answer 1a
x <- 0:24
plot(x, dbinom(x, size=24, prob=0.9), xlab="Number of Bits Received", ylab="P(X = x)", type="h", main="Bits, n = 24, p = 0.9,", font.main=1)

x <- 0:24
plot(x, pbinom(x, size=24, prob=0.9), xlab="Number of Bits Received", ylab="P(X <=x)", ylim=c(0,1), type="s", main="Bits, n= 24, p=0.9", font.main=1)

Quesion 1 (b) What is the mean number of
correctly received bits? What is the standard deviation?
#Answer 1b
#(make sure that what you print make sense to me) - for example to print mean you can use cat command once you done with the calculation and have value in the variable
#variable_name=10
#cat("Mean number of correctly received bits ", variable_name)
prob <- 0.9
x <- 0:24
mean_value <- round(dbinom(x, size=24, prob), 3)
simple_mean = 24 * 0.9
cat("Mean number of correctly received bits ", simple_mean, "\n")
Mean number of correctly received bits 21.6
variance <- 1 - prob
standard_dev = sqrt(24 * variance * prob)
cat("Standard Deviation of correctly received bits ", standard_dev)
Standard Deviation of correctly received bits 1.469694
Quesion 1 (c) What is the probability of
more than \(3\)-bit errors in the block
of \(24\)?
#Answer 1c
size = 24
prob = 0.9
final_prob = 1 - pbinom(3, size, prob)
cat("The probability of more than 3 bit errors occuing is ", final_prob, "\n")
The probability of more than 3 bit errors occuing is 1
print("Note that the probability is so low that it is auto rounded to 1, true value is 1-1.498*10^(-18)")
[1] "Note that the probability is so low that it is auto rounded to 1, true value is 1-1.498*10^(-18)"
Quesion 1 (e) What is the 60th quantile
of this distribution? What can you interpret from this
value?
#Answer 1e
size = 24
prob = 0.9
quantile <- qbinom(0.6, size, prob)
#Interpretation
cat("Interpretation: The 60th quantile is", quantile,"this value represents the minimum number of successes required for the cumulative probability of success to be greater than or equal to 60%. In other words, it is the point in the distribution where there is a 60% probability or more of achieving at least that many successes.")
Interpretation: The 60th quantile is 22 this value represents the minimum number of successes required for the cumulative probability of success to be greater than or equal to 60%. In other words, it is the point in the distribution where there is a 60% probability or more of achieving at least that many successes.
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 (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
LS0tDQp0aXRsZTogIiA8Y2VudGVyPjxzcGFuIHN0eWxlPSdjb2xvcjogYmx1ZTsnPiBIb21ld29yayAzIDwvc3Bhbj48L2NlbnRlcj4iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMgUXVlc3Rpb24gMS4gIENvbnNpZGVyIHRoZSBCaW5vbWlhbCBkaXN0cmlidXRpb24gd2l0aCAkbiA9IDI0JCBhbmQgJHAgPSAuOSQgdGhhdCBpcyB1c2VkIHRvIG1vZGVsIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHMgb24gYSBzYXRlbGxpdGUgbGluayB0aGF0IHRyYW5zbWl0cyBkYXRhIGluICQyNCQtYml0IGJsb2Nrcy4NCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYSkgUGxvdCB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiBhbmQgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24gZm9yIHRoZSBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM8L3NwYW4+DQoNCmBgYHtyfQ0KI0Fuc3dlciAxYQ0KeCA8LSAwOjI0DQpwbG90KHgsIGRiaW5vbSh4LCBzaXplPTI0LCBwcm9iPTAuOSksIHhsYWI9Ik51bWJlciBvZiBCaXRzIFJlY2VpdmVkIiwgeWxhYj0iUChYID0geCkiLCB0eXBlPSJoIiwgbWFpbj0iQml0cywgbiA9IDI0LCBwID0gMC45LCIsIGZvbnQubWFpbj0xKQ0KDQp4IDwtIDA6MjQNCnBsb3QoeCwgcGJpbm9tKHgsIHNpemU9MjQsIHByb2I9MC45KSwgeGxhYj0iTnVtYmVyIG9mIEJpdHMgUmVjZWl2ZWQiLCB5bGFiPSJQKFggPD14KSIsIHlsaW09YygwLDEpLCB0eXBlPSJzIiwgbWFpbj0iQml0cywgbj0gMjQsIHA9MC45IiwgZm9udC5tYWluPTEpDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYikgV2hhdCBpcyB0aGUgbWVhbiBudW1iZXIgb2YgY29ycmVjdGx5IHJlY2VpdmVkIGJpdHM/IFdoYXQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbj88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWINCiMobWFrZSBzdXJlIHRoYXQgd2hhdCB5b3UgcHJpbnQgbWFrZSBzZW5zZSB0byBtZSkgLSBmb3IgZXhhbXBsZSB0byBwcmludCBtZWFuIHlvdSBjYW4gdXNlIGNhdCBjb21tYW5kIG9uY2UgeW91IGRvbmUgd2l0aCB0aGUgY2FsY3VsYXRpb24gYW5kIGhhdmUgdmFsdWUgaW4gdGhlIHZhcmlhYmxlDQojdmFyaWFibGVfbmFtZT0xMCANCiNjYXQoIk1lYW4gbnVtYmVyIG9mIGNvcnJlY3RseSByZWNlaXZlZCBiaXRzICIsICB2YXJpYWJsZV9uYW1lKQ0KDQpwcm9iIDwtIDAuOQ0KeCA8LSAwOjI0DQptZWFuX3ZhbHVlIDwtIHJvdW5kKGRiaW5vbSh4LCBzaXplPTI0LCBwcm9iKSwgMykNCg0Kc2ltcGxlX21lYW4gPSAyNCAqIDAuOQ0KY2F0KCJNZWFuIG51bWJlciBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCBzaW1wbGVfbWVhbiwgIlxuIikNCg0KdmFyaWFuY2UgPC0gMSAtIHByb2INCnN0YW5kYXJkX2RldiA9IHNxcnQoMjQgKiB2YXJpYW5jZSAqIHByb2IpDQpjYXQoIlN0YW5kYXJkIERldmlhdGlvbiBvZiBjb3JyZWN0bHkgcmVjZWl2ZWQgYml0cyAiLCBzdGFuZGFyZF9kZXYpDQpgYGANCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMSAoYykgV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgbW9yZSB0aGFuICQzJC1iaXQgZXJyb3JzIGluIHRoZSBibG9jayBvZiAkMjQkPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAxYw0KDQpzaXplID0gMjQNCnByb2IgPSAwLjkNCmZpbmFsX3Byb2IgPSAxIC0gcGJpbm9tKDMsIHNpemUsIHByb2IpDQoNCmNhdCgiVGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAzIGJpdCBlcnJvcnMgb2NjdWluZyBpcyAiLCBmaW5hbF9wcm9iLCAiXG4iKQ0KcHJpbnQoIk5vdGUgdGhhdCB0aGUgcHJvYmFiaWxpdHkgaXMgc28gbG93IHRoYXQgaXQgaXMgYXV0byByb3VuZGVkIHRvIDEsIHRydWUgdmFsdWUgaXMgMS0xLjQ5OCoxMF4oLTE4KSIpDQpgYGANCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAxIChkKSBXaGF0IGlzIHRoZSBtZWRpYW4gb2YgdGhpcyBkaXN0cmlidXRpb24/IFdoYXQgY2FuIHlvdSBpbnRlcnByZXQgZnJvbSB0aGUgbWVkaWFuIHZhbHVlPyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWQNCg0Kc2l6ZSA9IDI0DQpwcm9iID0gMC45DQptZWRpYW4gPC0gcWJpbm9tKDAuNSwgc2l6ZSwgcHJvYikNCg0KY2F0KCJJbnRlcnByZXRhdGlvbjogVGhlIG1lZGlhbiBpcyIsIG1lZGlhbiwgInRoaXMgdmFsdWUgdGVsbHMgdXMgdGhhdCBoYWxmIG9mIHRoZSBleHBlY3RlZCB2YWx1ZXMgd2lsbCBiZSBsZXNzIHRoYW4gdGhhdCBhbmQgaGFsZiB3aWxsIGJlIG1vcmUuIEl0IGFsc28gbWVhbnMgdGhpcyBpcyBtaWRkbGUgb3IgY2VudHJhbCB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGUpICBXaGF0IGlzIHRoZSA2MHRoIHF1YW50aWxlIG9mIHRoaXMgZGlzdHJpYnV0aW9uPyBXaGF0IGNhbiB5b3UgaW50ZXJwcmV0IGZyb20gdGhpcyB2YWx1ZT88L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXIgMWUNCg0Kc2l6ZSA9IDI0DQpwcm9iID0gMC45DQpxdWFudGlsZSA8LSBxYmlub20oMC42LCBzaXplLCBwcm9iKQ0KDQojSW50ZXJwcmV0YXRpb24NCmNhdCgiSW50ZXJwcmV0YXRpb246IFRoZSA2MHRoIHF1YW50aWxlIGlzIiwgcXVhbnRpbGUsInRoaXMgdmFsdWUgcmVwcmVzZW50cyB0aGUgbWluaW11bSBudW1iZXIgb2Ygc3VjY2Vzc2VzIHJlcXVpcmVkIGZvciB0aGUgY3VtdWxhdGl2ZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA2MCUuIEluIG90aGVyIHdvcmRzLCBpdCBpcyB0aGUgcG9pbnQgaW4gdGhlIGRpc3RyaWJ1dGlvbiB3aGVyZSB0aGVyZSBpcyBhIDYwJSBwcm9iYWJpbGl0eSBvciBtb3JlIG9mIGFjaGlldmluZyBhdCBsZWFzdCB0aGF0IG1hbnkgc3VjY2Vzc2VzLiIpDQpgYGANCg0KIyBRdWVzdGlvbjIuIFRoZSBQdWJsaWMgU2VydmljZSBBbnN3ZXJpbmcgUG9pbnQgKFBTQVApIGluIFNhbiBGcmFuY2lzY28gZW1wbG95cyAkMTkkIG9wZXJhdG9ycyBpbiAkOCQtaG91ciBzaGlmdHMgdG8gcHJvY2VzcyAkOTExJCBjYWxscy4gVGhlcmUgYXJlIGF0IGxlYXN0ICQ1JCBvcGVyYXRvcnMgYWx3YXlzIGFuc3dlcmluZyBjYWxscy4gVGhlIG51bWJlciBvZiBjYWxscyBwcm9jZXNzZWQgcGVyIG9wZXJhdG9yIGNhbiBiZSBtb2RlbGVkIHdpdGggYSBQb2lzc29uIHJhbmRvbSB2YXJpYWJsZSB3aXRoIHJhdGUgJFxsYW1iZGFfMCA9MjAkIGNhbGxzIHBlciBob3VyLg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAyIChhKSBXaGF0IGlzIHRoZSBwcm9iYWJpbGl0eSBhbiBvcGVyYXRvciBjYW4gcHJvY2VzcyAyMCBjYWxscyBpbiBhbiBob3VyPyBSZXBlYXQgZm9yIDMwIGNhbGxzIGluIGFuIGhvdXI/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYQ0KZ2l2ZW5fbWVhbiA9IDIwDQp4MSA9IDIwDQp4MiA9IDMwDQoNCmNhbGxfYSA8LSAoKGdpdmVuX21lYW5eeDEpKiAoZXhwKC0xICogZ2l2ZW5fbWVhbikpKSAvIChmYWN0b3JpYWwoeDEpKQ0KY2FsbF9iIDwtICgoZ2l2ZW5fbWVhbl54MikqIChleHAoLTEgKiBnaXZlbl9tZWFuKSkpIC8gKGZhY3RvcmlhbCh4MikpDQoNCmNhdCgiVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGFuIGhvdXIgaXMgIiwgY2FsbF9hLCJcbiIpDQpjYXQoIlRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBvcGVyYXRvciBjYW4gcHJvY2VzcyAzMCBjYWxscyBhbiBob3VyIGlzICIsIGNhbGxfYikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDIgKGIpIEdpdmVuIHRoYXQgMjQwIGNhbGxzIG9jY3VycmVkIGluIGFuIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIHRlbiBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgdGhlbSBhbGwgYXNzdW1pbmcgdGhleSBhcmUgc3BsaXQgZXF1YWxseSBhbW9uZyB0aGUgb3BlcmF0b3JzPzwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlciAyYg0KZ2l2ZW5fbWVhbiA9IDIwDQpvcGVyYXRvciA9IDEwDQp4MSA9IDI0DQoNCiNUaGUgdmFsdWUgaXMgcmlzZW4gdG8gdGhlIG51bWJlciBvZiBvcGVyYXRvcnMgdG8gc2hvdyB0aGUgcGVyY2VudGFnZSBiZWluZyBtdWx0aXBsaWVkIGJ5IHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGl0IGhhcyB0byBvY2N1ciBpbi4NCmNhbGxfYSA8LSAoKGdpdmVuX21lYW5eeDEpKiAoZXhwKC0xICogZ2l2ZW5fbWVhbikpKSAvIChmYWN0b3JpYWwoeDEpKQ0KcHJvYiA8LSBjYWxsX2Feb3BlcmF0b3INCg0KY2F0KCJUaGUgcHJvYmFiaWxpdHkgdGhhdCAxMCBvcGVyYXRvcnMgY2FuIHByb2Nlc3MgMjQwIGNhbGxzIGFuIGhvdXIgaXMiLCBwcm9iKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMiAoYykgTm93LCBJZiB0aGUgYWdncmVnYXRlIGNhbGwgcmF0ZSBwZXIgaG91ciAkXGxhbWJkYV9jJCAsIGlzIG1lYXN1cmVkIGJ5ICRcbGFtYmRhX2MgPSA4NSQgY2FsbHMgcGVyIGhvdXIsIHdoYXQgaXMgdGhlIHByb2JhYmlsaXR5IG9mIG1vcmUgdGhhbiAkMTAwJCBjYWxscyBpbiBhbiBob3VyPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIDJjDQoNCmdpdmVuX21lYW4gPSA4NQ0KeDEgPSAxMDANCg0KY2FsbF9hIDwtKChnaXZlbl9tZWFuXngxKSogKGV4cCgtMSAqIGdpdmVuX21lYW4pKSkgLyAoZmFjdG9yaWFsKHgxKSkNCmNhdCgiVGhlIHByb2JhYmlsaXR5IHRoYXQgdGhlIG9wZXJhdG9yIGNhbiBwcm9jZXNzIDIwIGNhbGxzIGFuIGhvdXIgaXMgIiwgY2FsbF9hKQ0KYGBgDQoNCiMgUXVlc3Rpb24gMy4gRm9yIHRoZSB0d28gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmVsb3cgQSBhbmQgQihkb27igJl0IGZvcmdldCB0byBhZGQgeW91ciBSIGNvZGUpDQojIyMgLSBbQV0gXChaX2kgPSAoOVpfe2ktMX0gKyAxKSBcbW9kIDE2XCkgd2l0aCBcKFpfMCA9IDVcKS4NCiMjIyAtIFtCXSBcKFpfaSA9ICg3Wl97aS0xfSArIDMpIFxtb2QgMzJcKSB3aXRoIFwoWl8wID0gMTBcKSwNCg0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc2lvbiAzIChhKSBDb21wdXRlICRaX2kkIGFuZCAkVV9pJCBmb3IgdmFsdWVzIG9mICRpJCB1bnRpbCBhIG51bWJlciBpcyByZXBlYXRlZCwgd2hhdCBpcyB0aGUgcGVyaW9kIG9mIGJvdGggdGhlIGdlbmVyYXRvcj8gUHJvdmlkZSB5b3VyIGNvbW1lbnRzIGFib3V0IHRoZSBwZXJpb2Qgb2YgYm90aCBSR04gPC9zcGFuPg0KDQpgYGB7cn0NCiNBbnN3ZXIgM2ENCg0KbGNnIDwtIGZ1bmN0aW9uKGEsYyxtLHJsZW5ndGgsc2VlZCkgew0KICAgIHggPC0gcmVwKDAscmxlbmd0aCkNCiAgICB4WzFdIDwtIHNlZWQNCiAgICBmb3IgKGkgaW4gMToocmxlbmd0aC0xKSkNCiAgICB7DQogICAgICAgeFtpKzFdIDwtIChhICogeFtpXSArIGMpICUlIG0NCiAgICB9DQogICAgVSA8LSB4L20gDQogICAgcmV0dXJuKGxpc3QoeD14LFU9VSkpDQp9DQoNCnoxIDwtIGxjZyg5LDEsMTYsMjAsNSkNCnoyIDwtIGxjZyg3LDMsMzIsMjAsMTApDQp6MQ0KejINCnByaW50KCJUaGlzIHNob3dzIHRoYXQgZm9yIExDRyBBIHRoZSBzeXN0ZW0gaGFzIGEgcGVyaW9kIG9mIDE3IGFuZCBMQ0cgQiBoYXMgYSBwZXJpb2Qgb2YgOC4gVGhpcyBtZWFucyB0aGF0IGZvcm0gYSBzZWN1cml0eSBhbmQgcmFuZG9tbmVzcyBtZWFzdXJtZW50IExDRyBBIGlzIHN0cm9uZ2VyIGFzIGl0IHRha2VzIGxvbmdlciBiZWZvcmUgaXQgcmVwZWF0cyBpdHNlbGYuIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGIpIFdoaWNoIG9mIHRoZXNlIHBhcmFtZXRlcnMgZWZmZWN0IHRoZSBwZXJpb2Qgb2YgTENHIOKAkyAkYSQsICRiJCwgJFpfMCQgPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyIA0KY2F0KCJBbnN3ZXI6IiwgIlRoZSBwYXJhbWV0ZXJzIG9mICdhJyBhbmQgJ3NlZWQgb3IgWjAnIGVmZmVjdCB0aGUgcGVyaW9kIG9mIGEgTENHIikNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGMpIEZvciBib3RoIGdlbmVyYXRvcnMgcGxvdCBhIHNjYXR0ZXIgZGlhZ3JhbSBvZiB0aGUgWmkgdmFsdWVzIDEgYXBhcnQuIFdoYXQgYXJlIHlvdXIgb2JzZXJ2YXRpb25zIGZyb20gdGhlc2UgcGxvdHM/IFdoYXQgZG8geW91IHRoaW5rIGFib3V0IHRoZSBwcm9wZXJ0eSBvZiByYW5kb21uZXNzIG9mIHRoZXNlIGdlbmVyYXRvcnM/IDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpsY2cgPC0gZnVuY3Rpb24oYSxjLG0scmxlbmd0aCxzZWVkKSB7DQogICAgeCA8LSByZXAoMCxybGVuZ3RoKQ0KICAgIHhbMV0gPC0gc2VlZA0KICAgIGZvciAoaSBpbiAxOihybGVuZ3RoLTEpKQ0KICAgIHsNCiAgICAgICB4W2krMV0gPC0gKGEgKiB4W2ldICsgYykgJSUgbQ0KICAgIH0NCiAgICBVIDwtIHgvbSANCiAgICByZXR1cm4obGlzdCh4PXgsVT1VKSkNCn0NCg0KejEgPC0gbGNnKDksMSwxNiwyMCw1KQ0KejIgPC0gbGNnKDcsMywzMiwyMCwxMCkNCg0KWlQgPSB6MSR6DQpsZW5ndGgoWlQpDQoNCnoxID0gWlRbMToxOV0NCnoyID0gWlRbMjoyMF0NCg0KcGxvdCh6MSx6MiwgbWFpbj0iU2NhdHRlciBQbG90IG9mIFppIFZhbHVlcyIsIHhsaW0gPSBjKDAsIDMwKSwgeWxpbSA9IGMoMCwgMzApKQ0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoZCkgUmFuZG9tbmVzcyBvZiBkZWZhdWx0IHJhbmRvbSBnZW5lcmF0b3Igb2YgUiDigJMgUnVuIHJ1bmlmIGNvbW1hbmQgdG8gZ2VuZXJhdGUgMTAwIHJhbmRvbSBudW1iZXJzIGFuZCBwbG90IHRoZSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlc2UgbnVtYmVycyAoIHZhbHVlcyAxIGFwYXJ0KSBhbmQgZGlzY3VzcyB5b3VyIG9ic2VydmF0aW9ucyBhYm91dCByYW5kb21uZXNzIG9mIHRoaXMgcmFuZG9tIGdlbmVyYXRvci4gPC9zcGFuPg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDMgKGUpIENvbXB1dGUgdGhlIG1lYW4gdmFsdWUgb2YgJFVfaSQgYWNyb3NzIHRoZSBwZXJpb2Q8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gMyAoZikgQnkgcHJvdmlkaW5nIGEgcGxvdCBvZiBkZW5zaXR5IChoaXN0b2dyYW0pIGRpc2N1c3MgdGhlIHVuaWZvcm1pdHkgb2YgYm90aCBvZiB0aGUgZ2VuZXJhdG9ycyA8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCiMgUXVlc3Rpb24gNC4gVXNpbmcgdGhlIGludmVyc2UgdHJhbnNmb3JtIG1ldGhvZA0KDQojIyMgPHNwYW4gc3R5bGU9J2NvbG9yOiBncmV5Oyc+UXVlc3Rpb24gNC4oYSkgRGV2ZWxvcCBhbiBhbGdvcml0aG0gZm9yIHRoZSByYW5kb20gdmFyaWFibGUgd2l0aCBjdW11bGF0aXZlIGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBGKHgpIGJlbG93Ljwvc3Bhbj4NCg0KXFsgRih4KSA9IDEgLSBlXnstKHgvXGxhbWJkYSlea30gXF0NCg0Kd2hlcmUgXCggeCBcZ2VxIDAgXCksIFwoIFxsYW1iZGEgXGdlcSAwIFwpLCBhbmQgXCggayBcZ2VxIDAgXCkuDQoNCmBgYHtyfQ0KIyBBbnN3ZXIgNGENCiMgVGhpcyBtaWdodCBiZSBoYXJkIHRvIHByaW50IHVzaW5nIFIgLSB5b3UgY2FuIHdyaXRlIHRoZSBzdGVwIGluIHlvdXIgbm90ZWJvb2sgYW5kIHRoZW4gaW5jbHVkZSBpbWFnZSBoZXJlIC8gb3IgeW91IGNhbiBpbmNsdWRlIGFzIHNlcGFyYXRlIGZpbGUgd2hlbiB1cGxvYWQNCg0KIyBDaGVjayBpZiB0aGUgSVJkaXNwbGF5IHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQNCmlmICghcmVxdWlyZShJUmRpc3BsYXksIHF1aWV0bHkgPSBUUlVFKSkgew0KICAjIElmIG5vdCBpbnN0YWxsZWQsIGluc3RhbGwgaXQNCiAgaW5zdGFsbC5wYWNrYWdlcygiSVJkaXNwbGF5IikNCiAgDQogICMgTG9hZCB0aGUgSVJkaXNwbGF5IGxpYnJhcnkNCiAgbGlicmFyeShJUmRpc3BsYXkpDQp9IGVsc2Ugew0KICAjIElmIGFscmVhZHkgaW5zdGFsbGVkLCBqdXN0IGxvYWQgdGhlIGxpYnJhcnkNCiAgbGlicmFyeShJUmRpc3BsYXkpDQp9DQoNCg0KIyBFbWJlZCBhbiBpbWFnZQ0KI2Rpc3BsYXlfcG5nKGZpbGUgPSAiZXhhbXBsZS5wbmciKQ0KDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDQgKGIpIFVzZSB0aGUgZmlyc3QgdGhyZWUgVWkgdmFsdWVzIGZyb20gcGFydCAoYSkgYW5kIGdlbmVyYXRvciBbQV0gb2YgcHJldmlvdXMgcHJvYmxlbSB0byBjcmVhdGUgMyB2YWx1ZXMgZnJvbSB0aGUgcmFuZG9tIHZhcmlhYmxlIHdoZW4sICRcbGFtYmRhID0gMSQsICTwnZGYID0gNSQ8L3NwYW4+DQpgYGB7cn0NCiNBbnN3ZXINCg0KYGBgDQoNCg0KIyMjIDxzcGFuIHN0eWxlPSdjb2xvcjogZ3JleTsnPlF1ZXNpb24gNCAoYykgc2luZyBSIGdlbmVyYXRlIDEwLDAwMCB2YWx1ZXMgZnJvbSB5b3VyIGFsZ29yaXRobSB3aGVuICBcbGFtYmRhID0gMSAsIPCdkZggPSA1ICBhbmQgcGxvdCBhIGhpc3RvZ3JhbSBvZiB0aGUgZGVuc2l0eS4gRGlzY3VzcyB3aGF0IGluc2lnaHRzIHlvdSBvYnRhaW4gd2hlbiB5b3UgbG9vayBhdCB0aGUgcGxvdCBnZW5lcmF0ZWQgaGVyZSB2cyB0aGUgcGxvdCB5b3UgZ2VuZXJhdGVkIGluIHF1ZXN0aW9uIDMgKGUpIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpgYGANCg0KIyBRdWVzdGlvbiA1LiBEZXZlbG9wIGEgTW9udGUgQ2FybG8gc2ltdWxhdGlvbiBpbiBSIHRoYXQgY291bnRzIHRoZSBudW1iZXIgb2YgdW5pZm9ybSBbMCwxXSByYW5kb20gbnVtYmVycyB0aGF0IG11c3QgYmUgc3VtbWVkIHRvIGdldCBhIHN1bSBncmVhdGVyIHRoYW4gMS4gUnVuIGEgc2luZ2xlIHNpbXVsYXRpb24gd2l0aCBuID0gMTAsMDAwIHRpbWVzIGFuZCBmaW5kIHRoZSBtZWFuIG9mIHRoZSBudW1iZXIgb2YgY291bnRzLiBEbyB5b3UgdGhpbmsgdGhpcyBudW1iZXIgbG9va3Mgc29tZXdoYXQgZmFtaWxpYXIuIEV2ZXJ5IHN0dWRlbnQgbWlnaHQgZ2V0IHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBhbnkgaWRlYXMgd2h5Pw0KYGBge3J9DQojQW5zd2VyDQoNCm5fc2ltcyA8LSAxMDAwMA0KY291bnRzIDwtIG51bWVyaWMobl9zaW1zKQ0KDQojIFBlcmZvcm0gdGhlIE1vbnRlIENhcmxvIHNpbXVsYXRpb24NCmZvciAoaSBpbiAxOm5fc2ltcykgew0KICBzdW1fbnVtYmVycyA8LSAwDQogIGNvdW50IDwtIDANCiAgd2hpbGUgKHN1bV9udW1iZXJzIDw9IDEpIHsNCiAgICBzdW1fbnVtYmVycyA8LSBzdW1fbnVtYmVycyArIHJ1bmlmKDEpDQogICAgY291bnQgPC0gY291bnQgKyAxDQogIH0NCiAgY291bnRzW2ldIDwtIGNvdW50DQp9DQoNCm1lYW5fY291bnQgPC0gbWVhbihjb3VudHMpDQpjYXQoIk1lYW4gY291bnQ6IiwgbWVhbl9jb3VudCwgIlxuIikNCnByaW50KCJJJ20gdW5jbGVhciBvbiB3aHkgdGhpcyBudW1iZXIgd291bGQgYmUgZmFtaWxpYXIuIEhvd2V2ZXIsIGFzIGZvciB3aHkgZXZlcnkgc3R1ZGV0biB3b3VsZCBnZXQgYSBkaWZmcmVudCBhbnN3ZXIgdGhhdCBpcyBiZWN1YXNlIHRoZSBhbnN3ZXIgY2hhbmdlcyB3aXRoIGV2ZXJ5IHJ1biBvZiB0aGUgc2ltdWxhdGlvbiBiYXNlZCBvbiB0aGUgbnVtYmVycyBnZW5lcmF0ZWQsIGNyZWF0aW5nIGRpZmZyZW50IHJlc3VsdHMgZXZlcnkgdGltZS4iKQ0KDQpgYGANCg0KIyBRdWVzdGlvbiA2LiBGb3Igb3VyIHNwZWNpZmljIHJhbmRvbSB2YXJpYWJsZSwgd2Uga25vdyB0aGF0IGl0cyBQREYgaXMgZGVmaW5lZCBieSB0aGUgZnVuY3Rpb24gJGYoeCkgPSAxMHgoMS14KSQuIFV0aWxpemUgdGhlIGFjY2VwdC1yZWplY3QgYWxnb3JpdGhtIHRvIGRyYXcgc2FtcGxlcyBmcm9tIHRoaXMgZGlzdHJpYnV0aW9uLiBUYWtlIGEgbG9vayBhdCBMZWN0dXJlIDEwIHNsaWRlIDggYW5kIDkNCg0KYGBge3J9DQojQW5zd2VyDQoNCmBgYA0KDQoNCiMjIyA8c3BhbiBzdHlsZT0nY29sb3I6IGdyZXk7Jz5RdWVzaW9uIDEgKGIpIDwvc3Bhbj4NCmBgYHtyfQ0KI0Fuc3dlcg0KDQpgYGANCg0K