Introduction
For this assignment, we will be estimating the scale parameter of the
Lindley distribution, \(\theta\), by
using confidence intervals. Specifically, we will build a 95% asymptotic
confidence interval and a 95% likelihood ratio confidence interval to
estimate \(\theta\).
In order to build the confidence intervals, we will be using a data
set consisting of customer service call times (in minutes) from a major
telecommunications provider in North America.
calls <- c(3.2, 5.8, 7.1, 4.5, 10.3, 6.2, 8.7, 5.1, 12.5, 6.9,
9.4, 5.7, 11.8, 4.9, 9.1, 6.5, 13.2, 7.8, 10.6, 6.1,
8.9, 5.4, 12.1, 7.3, 9.8, 5.9, 11.4, 6.8, 10.9, 7.5,
4.2, 8.3, 6.4, 14.1, 5.6, 9.7, 7.9, 11.1, 6.7, 10.2,
5.3, 8.6, 7.2, 12.9, 6.3, 9.3, 8.1, 13.7, 7.6, 10.8)
Asymptotic Confidence
Interval
We will first build the asymptotic confidence interval. In order to
build an asymptotic confidence interval, we will need to check if we can
use the central limit theorem. According to the central limit theorem,
the distribution of a sample mean will approach a normal distribution as
the sample size increases, regardless of what the initial distribution
looked like. In particular, the central limit theorem can be used if the
sample size is greater than or equal to 30.
n <- length(calls) # Sample Size
print(paste("Sample Size:", n))
[1] "Sample Size: 50"
As we can see, our data set has 50 observations, so the central limit
can apply. So we can approximate \(\theta\) and construct our asymptotic
confidence interval using the normal distribution.
To start, we can find a point estimate for \(\theta\) using the maximum likelihood
method. The maximum likelhood estimator for the lindley distribution
is:
\[
\hat{\theta} = \frac{1 - \bar{x} + \sqrt{\bar{x}^2 + 6\bar{x} +
1}}{2\bar{x}}
\]
Using this formula, we obtain a maximum likelihood estimate of
0.2191.
mean.calls <- mean(calls) # Sample Mean
theta.mle <- (1 - mean.calls + sqrt((mean.calls^2) + 6*mean.calls + 1))/(2*mean.calls) # Maximum Likelihood Estimate for Theta
theta.mle
[1] 0.2190994
Next, we need the margin of error. The margin of error consists of
two parts: a critical value and the standard error. The critical value
can be obtained via the qnorm function.
# Calculating critical value using alpha = 0.05/2 due to symmetry
critvalue.95 <- qnorm(1 - 0.05/2, mean = 0, sd = 1, lower.tail = TRUE)
critvalue.95
[1] 1.959964
The standard error in this case will be the sqrt of the inverse of
the fisher information. The fisher information of the lindley
distribution is: \[
I(\theta) = \frac{2}{\theta^2} - \frac{1}{(1+\theta)^2}
\]
Using this formula, we obtain a fisher information of 7.4884.
# Formula for Fisher Information of Lindley Distribution
fish.info <- (2/(theta.mle^2)) - (1/(1 + (theta.mle^2)))
fish.info
[1] 40.70853
Finally, multiplying the critical value and the standard error will
give us the margin of error.
var.mle <- 1/n*fish.info
se.mle <- sqrt(var.mle)
se.mle
[1] 0.9023141
moe <- critvalue.95*se.mle
moe
[1] 1.768503
ci.lowlim.asymp <- theta.mle - moe # Lower Limit of Confidence Interval
ci.uplim.asymp <- theta.mle + moe # Upper Limit of Confidence Interval
con.int.asymp = c(ci.lowlim.asymp, ci.uplim.asymp) # Combined Confidence Interval
con.int.asymp
[1] -1.549404 1.987602
Likelihood Ratio
Confidence Interval
Next, we will build the likelihood ratio confidence interval. The
likelihood ratio confidence interval are more versatile and more
accurate ways of constructing confidence intervals, especially if the
sample size is not sufficiently large.
Our likelihood confidence interval is the range of values that
satisfies Wilks’ theorem.
Wilks’ Theorem: Assume that \(\theta\) is the true unknown population
parameter If sample size \(n\) is
large, we have
\[
LR(\theta)=-2\log\Lambda(\theta) = 2\left[ \log L(\hat{\theta}_{MLE}; x)
-\log L(\theta; x)\right]\xrightarrow{d} \chi^2_1
\]
For simplicity of calculations, instead of using the standard
likelihood function, we will use the log-likelihood function.
\[
L(\theta) = \prod_{i=1}^n f(x_i;\theta) = \prod_{i=1}^n \left[
\frac{\theta^2}{1+\theta} (1 + x_i) e^{-\theta x_i} \right].
\]
Let \(S = \sum_{i=1}^n x_i\), \(\bar{x} = S/n\), and \(C = \sum_{i=1}^n \ln(1 + x_i)\) (constant
with respect to \(\theta\)):
\[
\ell(\theta) = \ln L(\theta) = n \ln\left( \frac{\theta^2}{1+\theta}
\right) + C - \theta S.
\]
To start, we need a point estimate for theta. Since this is a
likelihood ratio confidence interval, we will need the maximum
likelihood estimator. We already established when constructing the
asymptotic interval that our mle is \(\hat{theta}\) = 0.2191.
theta.mle # Our Maximum Likelihood Estimate from Before
[1] 0.2190994
Next, we can obtain our critical value via the qchisq() function.
# Critical Chi-Square Value for Confidence Interval
crit.chisqr <- qchisq(0.95, df = 1, lower.tail = TRUE)
crit.chisqr
[1] 3.841459
Next we can obtain our maximum log-likelihood estimate:
# Defining Log-Likelihood Function
log.lik <- function(theta, data){
n = length(data)
c = sum(log(1 + data))
s = sum(data)
return(n*log(theta^2/(1+theta)) + c - (theta * s))
# Returns log likelihood estimate
}
log.mle <- log.lik(theta.mle, calls) # function evaulated at MLE
log.mle
[1] -143.3101
We can now utitlize Wilks’ Theorem to find our bounds for our
confidence interval:
# Utilizing Wilks' Theorem
Wilks <- function(theta, data){
2*(log.mle - log.lik(theta, data))
}
roots <- function(theta, data, theta.mle){
log.mle - crit.chisqr
}
LS0tDQp0aXRsZTogIlNUQSA1MDYgSG9tZXdvcmsgNjogQ29uY2VwdHMgYW5kIENvbnN0cnVjdGlvbiBvZiBDb25maWRlbmNlIEludGVydmFscyINCmF1dGhvcjogIklhbiBWYW5XcmlnaHQiDQpkYXRlOiAiMDMvMjMvMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQppZiAoIXJlcXVpcmUoImZpdGRpc3RycGx1cyIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImZpdGRpc3RycGx1cyIpDQogIGxpYnJhcnkoZml0ZGlzdHJwbHVzKQ0KfQ0KIyMgDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KDQpcDQoNCiMgSW50cm9kdWN0aW9uDQpGb3IgdGhpcyBhc3NpZ25tZW50LCB3ZSB3aWxsIGJlIGVzdGltYXRpbmcgdGhlIHNjYWxlIHBhcmFtZXRlciBvZiB0aGUgTGluZGxleSBkaXN0cmlidXRpb24sICRcdGhldGEkLCBieSB1c2luZyBjb25maWRlbmNlIGludGVydmFscy4gU3BlY2lmaWNhbGx5LCB3ZSB3aWxsIGJ1aWxkIGEgOTUlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbCBhbmQgYSA5NSUgbGlrZWxpaG9vZCByYXRpbyBjb25maWRlbmNlIGludGVydmFsIHRvIGVzdGltYXRlICRcdGhldGEkLg0KDQpJbiBvcmRlciB0byBidWlsZCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMsIHdlIHdpbGwgYmUgdXNpbmcgYSBkYXRhIHNldCBjb25zaXN0aW5nIG9mIGN1c3RvbWVyIHNlcnZpY2UgY2FsbCB0aW1lcyAoaW4gbWludXRlcykgZnJvbSBhIG1ham9yIHRlbGVjb21tdW5pY2F0aW9ucyBwcm92aWRlciBpbiBOb3J0aCBBbWVyaWNhLg0KDQpgYGB7cn0NCmNhbGxzIDwtIGMoMy4yLCA1LjgsIDcuMSwgNC41LCAxMC4zLCA2LjIsIDguNywgNS4xLCAxMi41LCA2LjksDQo5LjQsIDUuNywgMTEuOCwgNC45LCA5LjEsIDYuNSwgMTMuMiwgNy44LCAxMC42LCA2LjEsDQo4LjksIDUuNCwgMTIuMSwgNy4zLCA5LjgsIDUuOSwgMTEuNCwgNi44LCAxMC45LCA3LjUsDQo0LjIsIDguMywgNi40LCAxNC4xLCA1LjYsIDkuNywgNy45LCAxMS4xLCA2LjcsIDEwLjIsDQo1LjMsIDguNiwgNy4yLCAxMi45LCA2LjMsIDkuMywgOC4xLCAxMy43LCA3LjYsIDEwLjgpDQpgYGANCg0KIyBBc3ltcHRvdGljIENvbmZpZGVuY2UgSW50ZXJ2YWwNCldlIHdpbGwgZmlyc3QgYnVpbGQgdGhlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbC4gSW4gb3JkZXIgdG8gYnVpbGQgYW4gYXN5bXB0b3RpYyBjb25maWRlbmNlIGludGVydmFsLCB3ZSB3aWxsIG5lZWQgdG8gY2hlY2sgaWYgd2UgY2FuIHVzZSB0aGUgY2VudHJhbCBsaW1pdCB0aGVvcmVtLiANCkFjY29yZGluZyB0byB0aGUgY2VudHJhbCBsaW1pdCB0aGVvcmVtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIGEgc2FtcGxlIG1lYW4gd2lsbCBhcHByb2FjaCBhIG5vcm1hbCBkaXN0cmlidXRpb24gYXMgdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSBpbml0aWFsIGRpc3RyaWJ1dGlvbiBsb29rZWQgbGlrZS4gSW4gcGFydGljdWxhciwgdGhlIGNlbnRyYWwgbGltaXQgdGhlb3JlbSBjYW4gYmUgdXNlZCBpZiB0aGUgc2FtcGxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDMwLiANCmBgYHtyfQ0KbiA8LSBsZW5ndGgoY2FsbHMpICMgU2FtcGxlIFNpemUNCnByaW50KHBhc3RlKCJTYW1wbGUgU2l6ZToiLCBuKSkNCmBgYA0KDQpBcyB3ZSBjYW4gc2VlLCBvdXIgZGF0YSBzZXQgaGFzIDUwIG9ic2VydmF0aW9ucywgc28gdGhlIGNlbnRyYWwgbGltaXQgY2FuIGFwcGx5LiBTbyB3ZSBjYW4gYXBwcm94aW1hdGUgJFx0aGV0YSQgYW5kIGNvbnN0cnVjdCBvdXIgYXN5bXB0b3RpYyBjb25maWRlbmNlIGludGVydmFsIHVzaW5nIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLiANCg0KVG8gc3RhcnQsIHdlIGNhbiBmaW5kIGEgcG9pbnQgZXN0aW1hdGUgZm9yICRcdGhldGEkIHVzaW5nIHRoZSBtYXhpbXVtIGxpa2VsaWhvb2QgbWV0aG9kLiBUaGUgbWF4aW11bSBsaWtlbGhvb2QgZXN0aW1hdG9yIGZvciB0aGUgbGluZGxleSBkaXN0cmlidXRpb24gaXM6DQoNCiQkDQpcaGF0e1x0aGV0YX0gPSBcZnJhY3sxIC0gXGJhcnt4fSArIFxzcXJ0e1xiYXJ7eH1eMiArIDZcYmFye3h9ICsgMX19ezJcYmFye3h9fQ0KJCQNCg0KVXNpbmcgdGhpcyBmb3JtdWxhLCB3ZSBvYnRhaW4gYSBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGUgb2YgMC4yMTkxLg0KYGBge3J9DQptZWFuLmNhbGxzIDwtIG1lYW4oY2FsbHMpICMgU2FtcGxlIE1lYW4NCg0KdGhldGEubWxlIDwtICgxIC0gbWVhbi5jYWxscyArIHNxcnQoKG1lYW4uY2FsbHNeMikgKyA2Km1lYW4uY2FsbHMgKyAxKSkvKDIqbWVhbi5jYWxscykgIyBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGUgZm9yIFRoZXRhDQp0aGV0YS5tbGUNCmBgYA0KDQpOZXh0LCB3ZSBuZWVkIHRoZSBtYXJnaW4gb2YgZXJyb3IuIFRoZSBtYXJnaW4gb2YgZXJyb3IgY29uc2lzdHMgb2YgdHdvIHBhcnRzOiBhIGNyaXRpY2FsIHZhbHVlIGFuZCB0aGUgc3RhbmRhcmQgZXJyb3IuIFRoZSBjcml0aWNhbCB2YWx1ZSBjYW4gYmUgb2J0YWluZWQgdmlhIHRoZSBxbm9ybSBmdW5jdGlvbi4gDQpgYGB7cn0NCiMgQ2FsY3VsYXRpbmcgY3JpdGljYWwgdmFsdWUgdXNpbmcgYWxwaGEgPSAwLjA1LzIgZHVlIHRvIHN5bW1ldHJ5DQpjcml0dmFsdWUuOTUgPC0gcW5vcm0oMSAtIDAuMDUvMiwgbWVhbiA9IDAsIHNkID0gMSwgbG93ZXIudGFpbCA9IFRSVUUpIA0KY3JpdHZhbHVlLjk1DQpgYGANCg0KVGhlIHN0YW5kYXJkIGVycm9yIGluIHRoaXMgY2FzZSB3aWxsIGJlIHRoZSBzcXJ0IG9mIHRoZSBpbnZlcnNlIG9mIHRoZSBmaXNoZXIgaW5mb3JtYXRpb24uIFRoZSBmaXNoZXIgaW5mb3JtYXRpb24gb2YgdGhlIGxpbmRsZXkgZGlzdHJpYnV0aW9uIGlzOiANCiQkDQpJKFx0aGV0YSkgPSBcZnJhY3syfXtcdGhldGFeMn0gLSBcZnJhY3sxfXsoMStcdGhldGEpXjJ9DQokJA0KDQpVc2luZyB0aGlzIGZvcm11bGEsIHdlIG9idGFpbiBhIGZpc2hlciBpbmZvcm1hdGlvbiBvZiA3LjQ4ODQuDQpgYGB7cn0NCiMgRm9ybXVsYSBmb3IgRmlzaGVyIEluZm9ybWF0aW9uIG9mIExpbmRsZXkgRGlzdHJpYnV0aW9uDQpmaXNoLmluZm8gPC0gKDIvKHRoZXRhLm1sZV4yKSkgLSAoMS8oMSArICh0aGV0YS5tbGVeMikpKQ0KDQpmaXNoLmluZm8NCmBgYA0KDQpGaW5hbGx5LCBtdWx0aXBseWluZyB0aGUgY3JpdGljYWwgdmFsdWUgYW5kIHRoZSBzdGFuZGFyZCBlcnJvciB3aWxsIGdpdmUgdXMgdGhlIG1hcmdpbiBvZiBlcnJvci4NCg0KYGBge3J9DQp2YXIubWxlIDwtIDEvbipmaXNoLmluZm8NCg0Kc2UubWxlIDwtIHNxcnQodmFyLm1sZSkNCnNlLm1sZQ0KDQptb2UgPC0gY3JpdHZhbHVlLjk1KnNlLm1sZQ0KbW9lDQpgYGANCmBgYHtyfQ0KY2kubG93bGltLmFzeW1wIDwtIHRoZXRhLm1sZSAtIG1vZSAjIExvd2VyIExpbWl0IG9mIENvbmZpZGVuY2UgSW50ZXJ2YWwNCmNpLnVwbGltLmFzeW1wIDwtIHRoZXRhLm1sZSArIG1vZSAjIFVwcGVyIExpbWl0IG9mIENvbmZpZGVuY2UgSW50ZXJ2YWwNCmNvbi5pbnQuYXN5bXAgPSBjKGNpLmxvd2xpbS5hc3ltcCwgY2kudXBsaW0uYXN5bXApICMgQ29tYmluZWQgQ29uZmlkZW5jZSBJbnRlcnZhbA0KY29uLmludC5hc3ltcA0KYGBgDQoNCiMgTGlrZWxpaG9vZCBSYXRpbyBDb25maWRlbmNlIEludGVydmFsDQpOZXh0LCB3ZSB3aWxsIGJ1aWxkIHRoZSBsaWtlbGlob29kIHJhdGlvIGNvbmZpZGVuY2UgaW50ZXJ2YWwuIFRoZSBsaWtlbGlob29kIHJhdGlvIGNvbmZpZGVuY2UgaW50ZXJ2YWwgYXJlIG1vcmUgdmVyc2F0aWxlIGFuZCBtb3JlIGFjY3VyYXRlIHdheXMgb2YgY29uc3RydWN0aW5nIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLCBlc3BlY2lhbGx5IGlmIHRoZSBzYW1wbGUgc2l6ZSBpcyBub3Qgc3VmZmljaWVudGx5IGxhcmdlLg0KDQpPdXIgbGlrZWxpaG9vZCBjb25maWRlbmNlIGludGVydmFsIGlzIHRoZSByYW5nZSBvZiB2YWx1ZXMgdGhhdCBzYXRpc2ZpZXMgV2lsa3MnIHRoZW9yZW0uIA0KDQoqKldpbGtzJyBUaGVvcmVtKio6IEFzc3VtZSB0aGF0ICRcdGhldGEkIGlzIHRoZSB0cnVlIHVua25vd24gcG9wdWxhdGlvbiBwYXJhbWV0ZXIgSWYgc2FtcGxlIHNpemUgJG4kIGlzIGxhcmdlLCB3ZSBoYXZlICANCg0KJCQNCkxSKFx0aGV0YSk9LTJcbG9nXExhbWJkYShcdGhldGEpID0gMlxsZWZ0WyBcbG9nIEwoXGhhdHtcdGhldGF9X3tNTEV9OyB4KSAtXGxvZyBMKFx0aGV0YTsgeClccmlnaHRdXHhyaWdodGFycm93e2R9IFxjaGleMl8xDQokJA0KDQpGb3Igc2ltcGxpY2l0eSBvZiBjYWxjdWxhdGlvbnMsIGluc3RlYWQgb2YgdXNpbmcgdGhlIHN0YW5kYXJkIGxpa2VsaWhvb2QgZnVuY3Rpb24sIHdlIHdpbGwgdXNlIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbi4NCg0KJCQNCkwoXHRoZXRhKSA9IFxwcm9kX3tpPTF9Xm4gZih4X2k7XHRoZXRhKSA9IFxwcm9kX3tpPTF9Xm4gXGxlZnRbIFxmcmFje1x0aGV0YV4yfXsxK1x0aGV0YX0gKDEgKyB4X2kpIGVeey1cdGhldGEgeF9pfSBccmlnaHRdLg0KJCQNCg0KTGV0ICRTID0gXHN1bV97aT0xfV5uIHhfaSQsICRcYmFye3h9ID0gUy9uJCwgIGFuZCAkQyA9IFxzdW1fe2k9MX1ebiBcbG4oMSArIHhfaSkkIChjb25zdGFudCB3aXRoIHJlc3BlY3QgdG8gJFx0aGV0YSQpOg0KDQokJA0KXGVsbChcdGhldGEpID0gXGxuIEwoXHRoZXRhKSA9IG4gXGxuXGxlZnQoIFxmcmFje1x0aGV0YV4yfXsxK1x0aGV0YX0gXHJpZ2h0KSArIEMgLSBcdGhldGEgUy4NCiQkDQoNClRvIHN0YXJ0LCB3ZSBuZWVkIGEgcG9pbnQgZXN0aW1hdGUgZm9yIHRoZXRhLiBTaW5jZSB0aGlzIGlzIGEgbGlrZWxpaG9vZCByYXRpbyBjb25maWRlbmNlIGludGVydmFsLCB3ZSB3aWxsIG5lZWQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3IuIFdlIGFscmVhZHkgZXN0YWJsaXNoZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGFzeW1wdG90aWMgaW50ZXJ2YWwgdGhhdCBvdXIgbWxlIGlzICRcaGF0e3RoZXRhfSQgPSAwLjIxOTEuIA0KYGBge3J9DQp0aGV0YS5tbGUgIyBPdXIgTWF4aW11bSBMaWtlbGlob29kIEVzdGltYXRlIGZyb20gQmVmb3JlDQpgYGANCg0KTmV4dCwgd2UgY2FuIG9idGFpbiBvdXIgY3JpdGljYWwgdmFsdWUgdmlhIHRoZSBxY2hpc3EoKSBmdW5jdGlvbi4NCmBgYHtyfQ0KIyBDcml0aWNhbCBDaGktU3F1YXJlIFZhbHVlIGZvciBDb25maWRlbmNlIEludGVydmFsDQpjcml0LmNoaXNxciA8LSBxY2hpc3EoMC45NSwgZGYgPSAxLCBsb3dlci50YWlsID0gVFJVRSkgDQpjcml0LmNoaXNxcg0KYGBgDQpOZXh0IHdlIGNhbiBvYnRhaW4gb3VyIG1heGltdW0gbG9nLWxpa2VsaWhvb2QgZXN0aW1hdGU6DQpgYGB7cn0NCiMgRGVmaW5pbmcgTG9nLUxpa2VsaWhvb2QgRnVuY3Rpb24NCmxvZy5saWsgPC0gZnVuY3Rpb24odGhldGEsIGRhdGEpew0KbiA9IGxlbmd0aChkYXRhKQ0KYyA9IHN1bShsb2coMSArIGRhdGEpKQ0KcyA9IHN1bShkYXRhKQ0KICANCiAgcmV0dXJuKG4qbG9nKHRoZXRhXjIvKDErdGhldGEpKSArIGMgLSAodGhldGEgKiBzKSkgDQogICMgUmV0dXJucyBsb2cgbGlrZWxpaG9vZCBlc3RpbWF0ZQ0KfQ0KDQpsb2cubWxlIDwtIGxvZy5saWsodGhldGEubWxlLCBjYWxscykgIyBmdW5jdGlvbiBldmF1bGF0ZWQgYXQgTUxFDQpsb2cubWxlDQpgYGANCg0KV2UgY2FuIG5vdyB1dGl0bGl6ZSBXaWxrcycgVGhlb3JlbSB0byBmaW5kIG91ciBib3VuZHMgZm9yIG91ciBjb25maWRlbmNlIGludGVydmFsOg0KYGBge3J9DQojIFV0aWxpemluZyBXaWxrcycgVGhlb3JlbQ0KV2lsa3MgPC0gIGZ1bmN0aW9uKHRoZXRhLCBkYXRhKXsNCiAgMioobG9nLm1sZSAtIGxvZy5saWsodGhldGEsIGRhdGEpKQ0KfQ0KDQpyb290cyA8LSBmdW5jdGlvbih0aGV0YSwgZGF0YSwgdGhldGEubWxlKXsNCiAgbG9nLm1sZSAtIGNyaXQuY2hpc3FyDQp9DQpgYGANCg0KDQo=