Some data (50 iid
standard normal draws)
x = c(-0.027,-0.530,-1.582,-0.431,-0.248,0.478,0.697,1.484,-0.514,1.312,-0.584,0.854,0.473,
-0.691,-0.651,-0.596,0.557,-0.950,-0.006,1.162,0.444,-1.156,-0.880,-1.073,-0.332,
0.824,0.512,0.311,-1.027,-1.069,2.307,-0.126,1.903,-0.197,-0.581,0.170,0.236,0.481,
1.246,0.341,0.664,-0.769,1.017,-0.353,-0.074,-0.515,-0.997,1.073,-0.110,2.526)
Estimation of a few
population quantities
Assuming that the above data is a random sample of size \(n=50\) from a population with mean \(\mu\) and variance \(\sigma^2\). Assuming the data is Gaussian
(normally distributed), we can show that the maximum likelihood
estimators (MLEs) of \(\mu\) and \(\sigma^2\) are, respectively \[
{\widehat \mu}_{MLE} = \bar{x}_n = \frac{1}{n} \sum_{i=1}^n x_i \ \ \
\mbox{and} \ \ \
{\widehat \sigma}_{MLE}^2 = \frac{1}{n} \sum_{i=1}^n (x_i-\bar{x}_n)^2,
\] such that \({\widehat
\sigma}_{MLE}=\sqrt{{\widehat \sigma}_{MLE}^2}\). Finally , the
mean absolute deviation is computed as \[
MAD = \frac{1}{n} \sum_{i=1}^n |x_i-\bar{x}_n|.
\]
n = length(x)
mu.mle = mean(x)
sigma2.mle = mean((x-mu.mle)^2)
sigma.mle = sqrt(sigma2.mle)
mad = mean(abs(x-mu.mle))
MLE for the population mean: 0.10006
MLE for the population variance: 0.8334424
MLE for the population standard deviation: 0.9129307
Mean absolute deviation (MAD): 0.7508248
Sampling
distributions
A few results are well known and easy to show:
\({\widehat \mu}_{MLE}|\mu,\sigma^2
\sim N(\mu,\sigma^2/n)\), so the 95% confidence interval for
\(\mu\) is given by \({\widehat \mu}_{MLE} \pm 1.95996
\sigma/\sqrt{n}\).
\({\widehat \mu}_{MLE}|\mu,{\widehat
\sigma}^2 \sim t_{n-1}(\mu,{\widehat \sigma}^2/n)\), so the 95%
confidence interval for \(\mu\) is
given by \({\widehat \mu}_{MLE} \pm
2.00958{\widehat \sigma}/\sqrt{n}\).
\({\widehat \sigma}_{MLE}^2|\sigma^2
\sim \frac{\sigma^2}{n} \chi_{n-1}^2\). Similarly, a 95%
confidence interval for \(\sigma^2\) is
given by \[
[n{\widehat \sigma}_{MLE}^2/\chi^2_{0.975,n-1};
n{\widehat \sigma}_{MLE}^2/\chi^2_{0.025,n-1}]
\]
\({\widehat \sigma}_{MLE}|\sigma \sim
\sigma \sqrt{\chi_{n-1}^2/n}\) Â Â Â (sampling distribution of
unknown format). A very rough approximation based on the Central Limit
Theorem (CLT) is such that \[
{\widehat \sigma}_{MLE}|\sigma \sim
N(\sigma((n-1)/n)^{1/2},\sigma^2/(2n)).
\]
The CLT also helps showing that \[
MAD | \sigma \overset{a}\sim
N\left[(2\sigma^2/\pi)^{1/2};\frac{\sigma^2(1-2/\pi)}{n}\right] \equiv
N\left[0.7979\sigma;0.3634\sigma^2/n\right].
\] Then, an approximate 95% confidence interval for \(\sigma\) based on the MAD is given by \[
[MAD/(0.7979-0.7122509/\sqrt{n});MAD/(0.7979+0.7122509/\sqrt{n})]
\]
Confidence
intervals
IC.mu = c(mu.mle+qt(c(0.025,0.975),n-1)*sigma.mle/sqrt(n))
IC.sigma2 = c(n*sigma2.mle/qchisq(0.025,n-1),n*sigma2.mle/qchisq(0.975,n-1))
IC.sigma = c(sigma.mle/(sqrt((n-1)/n)+1.96/sqrt(2*n)),sigma.mle/(sqrt((n-1)/n)-1.96/sqrt(2*n)))
IC.sigma1 = c(mad/(0.7979+0.7122509/sqrt(n)),mad/(0.7979-0.7122509/sqrt(n)))
tab = rbind(IC.mu,IC.sigma2,IC.sigma,IC.sigma1)
tab
## [,1] [,2]
## IC.mu -0.1593920 0.3595120
## IC.sigma2 1.3206221 0.5934305
## IC.sigma 0.7697888 1.1498599
## IC.sigma1 0.8355240 1.0769570
Monte Carlo simulation
exercises
set.seed(20102025)
alpha = 0.05 # Level of the confidence interval
mu = 0 # Normal(mu,sigma^2)
sigma = 1
R = 1000 # Replications
par(mfrow=c(3,4))
for (n in c(20,50,100)){
estimators = matrix(0,R,4)
for (r in 1:R){
x = rnorm(n,mu,sigma)
mu.mle = mean(x)
sigma2.mle = mean((x-mu.mle)^2)
sigma.mle = sqrt(sigma2.mle)
mad = mean(abs(x-mu.mle))
estimators[r,] = c(mu.mle,sigma2.mle,sigma.mle,mad)
}
hist(estimators[,1],xlab="mu",main="mu (MLE)",prob=TRUE)
abline(v=mu,col=2,lwd=2)
legend("topright",legend=paste("n = ",n,sep=""),bty="n")
hist(estimators[,2],xlab="sigma2",main="sigma2 (MLE)",prob=TRUE)
abline(v=sigma^2,col=2,lwd=2)
hist(estimators[,3],xlab="sigma",main="sigma (MLE)",prob=TRUE)
abline(v=sigma,col=2,lwd=2)
hist(estimators[,4],xlab="sigma",main="sigma (MAD)",prob=TRUE)
abline(v=sqrt(2/pi)*sigma,col=2,lwd=2)
}

Approximating sampling
distributions via bootstrap
x = c(-0.027,-0.530,-1.582,-0.431,-0.248,0.478,0.697,1.484,-0.514,
1.312,-0.584,0.854,0.473,-0.691,-0.651,-0.596,0.557,-0.950,
-0.006,1.162,0.444,-1.156,-0.880,-1.073,-0.332,0.824,0.512,
0.311,-1.027,-1.069,2.307,-0.126,1.903,-0.197,-0.581,0.170,
0.236,0.481,1.246,0.341,0.664,-0.769,1.017,-0.353,-0.074,
-0.515,-0.997,1.073,-0.110,2.526)
n = length(x)
mu0.mle = mean(x)
sigma20.mle = mean((x-mu0.mle)^2)
sigma0.mle = sqrt(sigma20.mle)
mad0 = mean(abs(x-mu0.mle))
set.seed(3141593)
R = 10000 # Bootstrap replications
estimators = matrix(0,R,2)
for (r in 1:R){
x1 = sample(x,size=n,replace=TRUE)
mu.mle = mean(x1)
sigma2.mle = mean((x1-mu.mle)^2)
estimators[r,] = c(mu.mle,sigma2.mle)
}
quantiles = apply(estimators,2,quantile,c(0.025,0.975))
par(mfrow=c(1,2))
hist(estimators[,1],xlab="mu",main="mu (MLE)",prob=TRUE)
abline(v=mu0.mle,col=2,lwd=4)
abline(v=mean(estimators[,1]),lwd=4)
segments(IC.mu[1],0,IC.mu[2],0,col=2,lwd=4)
segments(quantiles[1,1],0.1,quantiles[2,1],0.1,lwd=4)
legend("topright",legend=c("Exact","Bootstrap"),col=2:1,lwd=4,bty="n")
hist(estimators[,2],xlab="sigma2",main="sigma2 (MLE)",prob=TRUE)
abline(v=sigma20.mle,col=2,lwd=4)
abline(v=mean(estimators[,2]),lwd=4)
segments(IC.sigma2[1],0,IC.sigma2[2],0,col=2,lwd=4)
segments(quantiles[1,2],0.1,quantiles[2,2],0.1,lwd=4)

Notice that the exact confidence intervals are relatively close to
the bootstrap ones, but they do not match. The intervals are almost
identical for the estimator of \(\mu\).
For \(\sigma^2\), the exact sampling
distribution is a \(\chi^2\), which
skewed, while the bootstrap approximation resembles a Gaussian
distribution. The differences decrease when the sample size \(n\) increases and the bootstrap will
eventually converse to the sampling distribution of the estimator.
LS0tCnRpdGxlOiAiTW9udGUgQ2FybG8gTWV0aG9kcyIKYXV0aG9yOiAiSGVkaWJlcnQgRnJlaXRhcyBMb3BlcyIKZGF0ZTogIjIwLzEwLzIwMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19jb2xsYXBzZWQ6IHRydWUKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMycKc3VidGl0bGU6IE1DIHNpbXVsYXRpb24gYW5kIHRoZSBib29zdHJhcAotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyBTb21lIGRhdGEgKDUwIGlpZCBzdGFuZGFyZCBub3JtYWwgZHJhd3MpCmBgYHtyIGNvbW1lbnQ9TkF9CnggPSBjKC0wLjAyNywtMC41MzAsLTEuNTgyLC0wLjQzMSwtMC4yNDgsMC40NzgsMC42OTcsMS40ODQsLTAuNTE0LDEuMzEyLC0wLjU4NCwwLjg1NCwwLjQ3MywKICAgICAgLTAuNjkxLC0wLjY1MSwtMC41OTYsMC41NTcsLTAuOTUwLC0wLjAwNiwxLjE2MiwwLjQ0NCwtMS4xNTYsLTAuODgwLC0xLjA3MywtMC4zMzIsCiAgICAgIDAuODI0LDAuNTEyLDAuMzExLC0xLjAyNywtMS4wNjksMi4zMDcsLTAuMTI2LDEuOTAzLC0wLjE5NywtMC41ODEsMC4xNzAsMC4yMzYsMC40ODEsCiAgICAgIDEuMjQ2LDAuMzQxLDAuNjY0LC0wLjc2OSwxLjAxNywtMC4zNTMsLTAuMDc0LC0wLjUxNSwtMC45OTcsMS4wNzMsLTAuMTEwLDIuNTI2KQpgYGAKCiMjIEVzdGltYXRpb24gb2YgYSBmZXcgcG9wdWxhdGlvbiBxdWFudGl0aWVzCkFzc3VtaW5nIHRoYXQgdGhlIGFib3ZlIGRhdGEgaXMgYSByYW5kb20gc2FtcGxlIG9mIHNpemUgJG49NTAkIGZyb20gYSBwb3B1bGF0aW9uIHdpdGggbWVhbiAkXG11JCBhbmQgdmFyaWFuY2UgJFxzaWdtYV4yJC4gIEFzc3VtaW5nIHRoZSBkYXRhIGlzIEdhdXNzaWFuIChub3JtYWxseSBkaXN0cmlidXRlZCksIHdlIGNhbiBzaG93IHRoYXQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3JzIChNTEVzKSBvZiAkXG11JCBhbmQgJFxzaWdtYV4yJCBhcmUsIHJlc3BlY3RpdmVseQokJAp7XHdpZGVoYXQgXG11fV97TUxFfSA9IFxiYXJ7eH1fbiA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ebiB4X2kgXCBcIFwgXG1ib3h7YW5kfSBcIFwgXCAKe1x3aWRlaGF0IFxzaWdtYX1fe01MRX1eMiA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ebiAoeF9pLVxiYXJ7eH1fbileMiwKJCQKc3VjaCB0aGF0ICR7XHdpZGVoYXQgXHNpZ21hfV97TUxFfT1cc3FydHt7XHdpZGVoYXQgXHNpZ21hfV97TUxFfV4yfSQuICBGaW5hbGx5ICwgdGhlIG1lYW4gYWJzb2x1dGUgZGV2aWF0aW9uIGlzIGNvbXB1dGVkIGFzIAokJApNQUQgPSBcZnJhY3sxfXtufSBcc3VtX3tpPTF9Xm4gfHhfaS1cYmFye3h9X258LgokJApgYGB7cn0KbiA9IGxlbmd0aCh4KQptdS5tbGUgPSBtZWFuKHgpCnNpZ21hMi5tbGUgPSBtZWFuKCh4LW11Lm1sZSleMikKc2lnbWEubWxlID0gc3FydChzaWdtYTIubWxlKQptYWQgPSBtZWFuKGFicyh4LW11Lm1sZSkpCmBgYAoKYGBge3IgY29tbWVudD1OQSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9NH0KY2F0KAoiIE1MRSBmb3IgdGhlIHBvcHVsYXRpb24gbWVhbjoiLCBtdS5tbGUsICJcbiIsCiJNTEUgZm9yIHRoZSBwb3B1bGF0aW9uIHZhcmlhbmNlOiIsIHNpZ21hMi5tbGUsICJcbiIsCiJNTEUgZm9yIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbjoiLCBzaWdtYS5tbGUsICJcbiIsCiJNZWFuIGFic29sdXRlIGRldmlhdGlvbiAoTUFEKToiLG1hZCwgIlxuIgopCmBgYAoKCiMgU2FtcGxpbmcgZGlzdHJpYnV0aW9ucyAKQSBmZXcgcmVzdWx0cyBhcmUgd2VsbCBrbm93biBhbmQgZWFzeSB0byBzaG93OgoKKiAke1x3aWRlaGF0IFxtdX1fe01MRX18XG11LFxzaWdtYV4yIFxzaW0gTihcbXUsXHNpZ21hXjIvbikkLCBzbyB0aGUgOTVcJSBjb25maWRlbmNlIGludGVydmFsIGZvciAkXG11JCBpcyBnaXZlbiBieSAke1x3aWRlaGF0IFxtdX1fe01MRX0gXHBtIDEuOTU5OTYgXHNpZ21hL1xzcXJ0e259JC4KCiogJHtcd2lkZWhhdCBcbXV9X3tNTEV9fFxtdSx7XHdpZGVoYXQgXHNpZ21hfV4yIFxzaW0gdF97bi0xfShcbXUse1x3aWRlaGF0IFxzaWdtYX1eMi9uKSQsIHNvIHRoZSA5NVwlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICRcbXUkIGlzIGdpdmVuIGJ5ICR7XHdpZGVoYXQgXG11fV97TUxFfSBccG0gMi4wMDk1OHtcd2lkZWhhdCBcc2lnbWF9L1xzcXJ0e259JC4KCiogJHtcd2lkZWhhdCBcc2lnbWF9X3tNTEV9XjJ8XHNpZ21hXjIgXHNpbSBcZnJhY3tcc2lnbWFeMn17bn0gXGNoaV97bi0xfV4yJC4gIFNpbWlsYXJseSwgYSA5NVwlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICRcc2lnbWFeMiQgaXMgZ2l2ZW4gYnkgCiQkCltue1x3aWRlaGF0IFxzaWdtYX1fe01MRX1eMi9cY2hpXjJfezAuOTc1LG4tMX07Cm57XHdpZGVoYXQgXHNpZ21hfV97TUxFfV4yL1xjaGleMl97MC4wMjUsbi0xfV0KJCQKCiogJHtcd2lkZWhhdCBcc2lnbWF9X3tNTEV9fFxzaWdtYSBcc2ltIFxzaWdtYSBcc3FydHtcY2hpX3tuLTF9XjIvbn0kIFwgXCBcIChzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdW5rbm93biBmb3JtYXQpLiAgQSB2ZXJ5IHJvdWdoIGFwcHJveGltYXRpb24gYmFzZWQgb24gdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSAoQ0xUKSBpcyBzdWNoIHRoYXQgCiQkCntcd2lkZWhhdCBcc2lnbWF9X3tNTEV9fFxzaWdtYSBcc2ltIE4oXHNpZ21hKChuLTEpL24pXnsxLzJ9LFxzaWdtYV4yLygybikpLgokJAoKKiBUaGUgQ0xUIGFsc28gaGVscHMgc2hvd2luZyB0aGF0IAokJApNQUQgfCBcc2lnbWEgXG92ZXJzZXR7YX1cc2ltIE5cbGVmdFsoMlxzaWdtYV4yL1xwaSleezEvMn07XGZyYWN7XHNpZ21hXjIoMS0yL1xwaSl9e259XHJpZ2h0XSBcZXF1aXYgTlxsZWZ0WzAuNzk3OVxzaWdtYTswLjM2MzRcc2lnbWFeMi9uXHJpZ2h0XS4KJCQKVGhlbiwgYW4gYXBwcm94aW1hdGUgOTVcJSBjb25maWRlbmNlIGludGVydmFsIGZvciAkXHNpZ21hJCBiYXNlZCBvbiB0aGUgTUFEIGlzIGdpdmVuIGJ5CiQkCltNQUQvKDAuNzk3OS0wLjcxMjI1MDkvXHNxcnR7bn0pO01BRC8oMC43OTc5KzAuNzEyMjUwOS9cc3FydHtufSldCiQkCgojIyBDb25maWRlbmNlIGludGVydmFscwpgYGB7cn0KSUMubXUgPSBjKG11Lm1sZStxdChjKDAuMDI1LDAuOTc1KSxuLTEpKnNpZ21hLm1sZS9zcXJ0KG4pKQpJQy5zaWdtYTIgPSBjKG4qc2lnbWEyLm1sZS9xY2hpc3EoMC4wMjUsbi0xKSxuKnNpZ21hMi5tbGUvcWNoaXNxKDAuOTc1LG4tMSkpCklDLnNpZ21hID0gYyhzaWdtYS5tbGUvKHNxcnQoKG4tMSkvbikrMS45Ni9zcXJ0KDIqbikpLHNpZ21hLm1sZS8oc3FydCgobi0xKS9uKS0xLjk2L3NxcnQoMipuKSkpCklDLnNpZ21hMSA9IGMobWFkLygwLjc5NzkrMC43MTIyNTA5L3NxcnQobikpLG1hZC8oMC43OTc5LTAuNzEyMjUwOS9zcXJ0KG4pKSkKCnRhYiA9IHJiaW5kKElDLm11LElDLnNpZ21hMixJQy5zaWdtYSxJQy5zaWdtYTEpCnRhYgpgYGAKCgoKIyBNb250ZSBDYXJsbyBzaW11bGF0aW9uIGV4ZXJjaXNlcwpgYGB7ciBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xMn0Kc2V0LnNlZWQoMjAxMDIwMjUpCmFscGhhID0gMC4wNSAgICAgICMgTGV2ZWwgb2YgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWwKbXUgICAgID0gMCAgICAgICAgICAgIyBOb3JtYWwobXUsc2lnbWFeMikKc2lnbWEgPSAxClIgICAgICAgID0gMTAwMCAgICAgIyBSZXBsaWNhdGlvbnMKCnBhcihtZnJvdz1jKDMsNCkpCmZvciAobiBpbiBjKDIwLDUwLDEwMCkpewogIGVzdGltYXRvcnMgPSBtYXRyaXgoMCxSLDQpCiAgZm9yIChyIGluIDE6Uil7CiAgICB4ID0gcm5vcm0obixtdSxzaWdtYSkKICAgIG11Lm1sZSA9IG1lYW4oeCkKICAgIHNpZ21hMi5tbGUgPSBtZWFuKCh4LW11Lm1sZSleMikKICAgIHNpZ21hLm1sZSA9IHNxcnQoc2lnbWEyLm1sZSkKICAgIG1hZCA9IG1lYW4oYWJzKHgtbXUubWxlKSkKICAgIGVzdGltYXRvcnNbcixdID0gYyhtdS5tbGUsc2lnbWEyLm1sZSxzaWdtYS5tbGUsbWFkKQogIH0KICBoaXN0KGVzdGltYXRvcnNbLDFdLHhsYWI9Im11IixtYWluPSJtdSAoTUxFKSIscHJvYj1UUlVFKQogIGFibGluZSh2PW11LGNvbD0yLGx3ZD0yKQogIGxlZ2VuZCgidG9wcmlnaHQiLGxlZ2VuZD1wYXN0ZSgibiA9ICIsbixzZXA9IiIpLGJ0eT0ibiIpCiAgaGlzdChlc3RpbWF0b3JzWywyXSx4bGFiPSJzaWdtYTIiLG1haW49InNpZ21hMiAoTUxFKSIscHJvYj1UUlVFKQogIGFibGluZSh2PXNpZ21hXjIsY29sPTIsbHdkPTIpCiAgaGlzdChlc3RpbWF0b3JzWywzXSx4bGFiPSJzaWdtYSIsbWFpbj0ic2lnbWEgKE1MRSkiLHByb2I9VFJVRSkKICBhYmxpbmUodj1zaWdtYSxjb2w9Mixsd2Q9MikKICBoaXN0KGVzdGltYXRvcnNbLDRdLHhsYWI9InNpZ21hIixtYWluPSJzaWdtYSAoTUFEKSIscHJvYj1UUlVFKQogIGFibGluZSh2PXNxcnQoMi9waSkqc2lnbWEsY29sPTIsbHdkPTIpCn0KYGBgCgoKCiMgQXBwcm94aW1hdGluZyBzYW1wbGluZyBkaXN0cmlidXRpb25zIHZpYSBib290c3RyYXAKYGBge3IgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9NX0KeCA9IGMoLTAuMDI3LC0wLjUzMCwtMS41ODIsLTAuNDMxLC0wLjI0OCwwLjQ3OCwwLjY5NywxLjQ4NCwtMC41MTQsCiAgICAgICAgICAxLjMxMiwtMC41ODQsMC44NTQsMC40NzMsLTAuNjkxLC0wLjY1MSwtMC41OTYsMC41NTcsLTAuOTUwLAogICAgICAgICAgLTAuMDA2LDEuMTYyLDAuNDQ0LC0xLjE1NiwtMC44ODAsLTEuMDczLC0wLjMzMiwwLjgyNCwwLjUxMiwKICAgICAgICAgIDAuMzExLC0xLjAyNywtMS4wNjksMi4zMDcsLTAuMTI2LDEuOTAzLC0wLjE5NywtMC41ODEsMC4xNzAsCiAgICAgICAgICAwLjIzNiwwLjQ4MSwxLjI0NiwwLjM0MSwwLjY2NCwtMC43NjksMS4wMTcsLTAuMzUzLC0wLjA3NCwKICAgICAgICAgIC0wLjUxNSwtMC45OTcsMS4wNzMsLTAuMTEwLDIuNTI2KQpuID0gbGVuZ3RoKHgpCm11MC5tbGUgPSBtZWFuKHgpCnNpZ21hMjAubWxlID0gbWVhbigoeC1tdTAubWxlKV4yKQpzaWdtYTAubWxlID0gc3FydChzaWdtYTIwLm1sZSkKbWFkMCA9IG1lYW4oYWJzKHgtbXUwLm1sZSkpCgpzZXQuc2VlZCgzMTQxNTkzKQpSID0gMTAwMDAgICMgQm9vdHN0cmFwIHJlcGxpY2F0aW9ucwplc3RpbWF0b3JzID0gbWF0cml4KDAsUiwyKQpmb3IgKHIgaW4gMTpSKXsKICB4MSA9IHNhbXBsZSh4LHNpemU9bixyZXBsYWNlPVRSVUUpCiAgbXUubWxlID0gbWVhbih4MSkKICBzaWdtYTIubWxlID0gbWVhbigoeDEtbXUubWxlKV4yKQogIGVzdGltYXRvcnNbcixdID0gYyhtdS5tbGUsc2lnbWEyLm1sZSkKfQoKcXVhbnRpbGVzID0gYXBwbHkoZXN0aW1hdG9ycywyLHF1YW50aWxlLGMoMC4wMjUsMC45NzUpKQoKcGFyKG1mcm93PWMoMSwyKSkKaGlzdChlc3RpbWF0b3JzWywxXSx4bGFiPSJtdSIsbWFpbj0ibXUgKE1MRSkiLHByb2I9VFJVRSkKYWJsaW5lKHY9bXUwLm1sZSxjb2w9Mixsd2Q9NCkKYWJsaW5lKHY9bWVhbihlc3RpbWF0b3JzWywxXSksbHdkPTQpCnNlZ21lbnRzKElDLm11WzFdLDAsSUMubXVbMl0sMCxjb2w9Mixsd2Q9NCkKc2VnbWVudHMocXVhbnRpbGVzWzEsMV0sMC4xLHF1YW50aWxlc1syLDFdLDAuMSxsd2Q9NCkKbGVnZW5kKCJ0b3ByaWdodCIsbGVnZW5kPWMoIkV4YWN0IiwiQm9vdHN0cmFwIiksY29sPTI6MSxsd2Q9NCxidHk9Im4iKQoKaGlzdChlc3RpbWF0b3JzWywyXSx4bGFiPSJzaWdtYTIiLG1haW49InNpZ21hMiAoTUxFKSIscHJvYj1UUlVFKQphYmxpbmUodj1zaWdtYTIwLm1sZSxjb2w9Mixsd2Q9NCkKYWJsaW5lKHY9bWVhbihlc3RpbWF0b3JzWywyXSksbHdkPTQpCnNlZ21lbnRzKElDLnNpZ21hMlsxXSwwLElDLnNpZ21hMlsyXSwwLGNvbD0yLGx3ZD00KQpzZWdtZW50cyhxdWFudGlsZXNbMSwyXSwwLjEscXVhbnRpbGVzWzIsMl0sMC4xLGx3ZD00KQpgYGAKCk5vdGljZSB0aGF0IHRoZSBleGFjdCBjb25maWRlbmNlIGludGVydmFscyBhcmUgcmVsYXRpdmVseSBjbG9zZSB0byB0aGUgYm9vdHN0cmFwIG9uZXMsIGJ1dCB0aGV5IGRvIG5vdCBtYXRjaC4gIFRoZSBpbnRlcnZhbHMgYXJlIGFsbW9zdCBpZGVudGljYWwgZm9yIHRoZSBlc3RpbWF0b3Igb2YgJFxtdSQuICBGb3IgJFxzaWdtYV4yJCwgdGhlIGV4YWN0IHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBhICRcY2hpXjIkLCB3aGljaCBza2V3ZWQsIHdoaWxlIHRoZSBib290c3RyYXAgYXBwcm94aW1hdGlvbiByZXNlbWJsZXMgYSBHYXVzc2lhbiBkaXN0cmlidXRpb24uICBUaGUgZGlmZmVyZW5jZXMgZGVjcmVhc2Ugd2hlbiB0aGUgc2FtcGxlIHNpemUgJG4kIGluY3JlYXNlcyBhbmQgdGhlIGJvb3RzdHJhcCB3aWxsIGV2ZW50dWFsbHkgY29udmVyc2UgdG8gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZXN0aW1hdG9yLgo=