Policies of Using AI Tools
Policy on AI Tool Use: Please adhere to the AI tool
policy specified in the course syllabus. The direct copying of
AI-generated content is strictly prohibited. All submitted work must
reflect your own understanding; where external tools are consulted,
content must be thoroughly rephrased and synthesized in your own words.
Code Inclusion Requirement: Any code included in your
essay must be properly commented to explain the purpose and/or expected
output of key code lines. Submitting AI-generated code without
meaningful, student-added comments will not be accepted.
Log-normal Distribution Revisited
If \(Y = \ln(X) \sim N(\mu,
\sigma^2)\), then \(X\) follows
a lognormal distribution \(X \sim
\text{Lognormal}(\mu, \sigma^2)\). The probability density is
given by
\[
f(x|\mu,\sigma) = \frac{1}{x\sigma\sqrt{2\pi}} \exp\left(-\frac{(\ln x -
\mu)^2}{2\sigma^2}\right), \quad x > 0
\]
After some algebra, we can express the mean and variance of the above
lognormal distribution in the following
\[\begin{align}
\mathbb{E}[X] &= \exp\left(\mu + \frac{\sigma^2}{2}\right) \\
\text{Var}(X) &= [\exp(\sigma^2) - 1] \exp(2\mu + \sigma^2)
\end{align}\]
Using the relationship between normal and log-normal distribution and
a sample \(\{x_1, x_2, \dots, x_n\}\),
the MLE estimators of \(\mu\) and \(\sigma^2\) are given by
\[\begin{align}
\hat{\mu} &= \frac{1}{n}\sum_{i=1}^n \ln(x_i) \\
\hat{\sigma}^2 &= \frac{1}{n}\sum_{i=1}^n (\ln(x_i) - \hat{\mu})^2
\end{align}\]
Using the plug-in principle of MLE, we have the MLE of \(\mathbb{E}[X]\) and \(\text{Var}(X)\) in the following
\[
\boxed{\widehat{\mathbb{E}[X]} = \exp\left(\hat{\mu} +
\frac{\hat{\sigma}^2}{2}\right)}
\]
This assignment focuses on constructing
various bootstrap confidence intervals of the lognormal population mean
\(\mathbb{E}[X]\)
Question: Trace Metal Concentrations in Soil
Soil lead (Pb) concentrations (mg/kg) from 55 urban garden sites.
Trace metals in environmental media typically follow lognormal
distributions due to:
Multiplicative processes controlling accumulation
Positive constraints (concentrations cannot be negative)
Right-skewed nature of contamination patterns
0.85, 1.23, 0.92, 3.45, 2.11, 1.56, 4.89, 2.34, 1.78, 6.72, 0.95, 1.34, 8.91,
2.67, 1.89, 5.43, 1.12, 3.78, 2.45, 7.65, 1.05, 1.45, 12.34, 2.89, 2.01, 4.56,
1.23, 4.32, 2.67, 9.87, 0.99, 1.56, 15.23, 3.12, 2.34, 3.89, 1.34, 5.67, 2.89,
11.45, 1.12, 1.67, 18.90, 3.45, 2.56, 3.45, 1.45, 6.78, 3.12, 14.56, 1.23, 1.78,
22.34, 3.78, 2.78
\[\boxed{\text{Instructions:}}\]
Assume the data follow a log-normal distribution. For each question
in parts (b)–(d), begin by clearly explaining the reasoning behind your
analytical approach. Then, develop your own R functions to implement
three types of confidence intervals: the asymptotic interval, the
percentile bootstrap interval, and the bias-corrected and accelerated
(BCa) bootstrap interval. Use these functions to construct the required
confidence intervals, and verify your results using the appropriate
functions from the boot package.
You are encouraged to design a wrapper function that integrates all
confidence interval methods, allowing users to select the desired method
through an input argument.
\[\boxed{\text{Individual
Questions:}}\]
a). Perform 5000 bootstrap samples to estimate the bootstrap sampling
distribution of \(\boxed{\widehat{\mathbb{E}[X]}}\). Display
the distribution using either a histogram or a kernel density plot.
Comment on the shape, variability, and any notable patterns observed in
the bootstrap sampling distribution.
set.seed(123)
x <- c(0.85, 1.23, 0.92, 3.45, 2.11, 1.56, 4.89, 2.34, 1.78, 6.72, 0.95,
1.34, 8.91, 2.67, 1.89, 5.43, 1.12, 3.78, 2.45, 7.65, 1.05, 1.45,
12.34, 2.89, 2.01, 4.56, 1.23, 4.32, 2.67, 9.87, 0.99, 1.56, 15.23,
3.12, 2.34, 3.89, 1.34, 5.67, 2.89, 11.45, 1.12, 1.67, 18.90, 3.45,
2.56, 3.45, 1.45, 6.78, 3.12, 14.56, 1.23, 1.78, 22.34, 3.78, 2.78)
mean_ln <- function(x) {
y <- log(x)
exp(mean(y) + var(y)/2)
}
B <- 5000
boot_est <- replicate(B, mean_ln(sample(x, replace = TRUE)))
hist(boot_est, probability = TRUE, breaks = 40,
main = "Bootstrap Distribution of E[X]",
xlab = "E[X]")
lines(density(boot_est), col = "blue", lwd = 2)

Interpretation: The distribution is right-skewed
reflecting the lognormal nature of the data. There is moderate
variability driven by larger values. The distribution is not
symmetric, indicating that normal-based inference may be
unreliable.
b). Construct a 95% bootstrap percentile confidence interval for
\(\mu_{LN} = \mathbb{E}[X]\).
ci_percentile <- function(boot_est) {
quantile(boot_est, c(0.025, 0.975))
}
ci_percentile(boot_est)
2.5% 97.5%
3.110817 5.683647
The percentile method is simple and preserves skewness, but
does not correct for bias.
c). Construct a 95% bootstrap BCa confidence interval for \(\mu_{LN} = \mathbb{E}[X]\).
library(boot)
boot_fn <- function(data, indices) {
mean_ln(data[indices])
}
boot_obj <- boot(x, boot_fn, R = 5000)
boot.ci(boot_obj, type = "bca")
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 5000 bootstrap replicates
CALL :
boot.ci(boot.out = boot_obj, type = "bca")
Intervals :
Level BCa
95% ( 3.241, 5.848 )
Calculations and Intervals on Original Scale
The BCa method adjusts for bias and skewness, making it
well-suited for lognormal data.
d). Use the Central Limit Theorem to construct a 95% asymptotic
confidence interval for \(\mu_{LN} =
\mathbb{E}[X]\).
theta_hat <- mean_ln(x)
se_hat <- sd(boot_est)
ci_asymptotic <- c(
theta_hat - 1.96 * se_hat,
theta_hat + 1.96 * se_hat
)
ci_asymptotic
[1] 2.971933 5.519076
f). Assuming the confidence intervals constructed in the previous parts
are valid, evaluate their performance by comparing their widths,
symmetry, stability, and sensitivity to distributional skewness. Then,
provide a well‑reasoned recommendation regarding which method is most
suitable for this analysis.
| Width |
Moderate |
Often wider |
Often narrow |
| Symmetry |
Skewed |
Skewed |
Symmetric |
| Bias correction |
No |
Yes |
No |
| Skew sensitivity |
Partial |
Strong |
Poor |
| Stability |
Good |
Best |
Moderate |
The BCa bootstrap confidence interval is the most appropriate
method for this analysis as the soil lead concentrations exhibit strong
right-skewness consistent with a lognormal distribution and the BCa
method explicitly adjusts for both bias and skewness in the sampling
distribution, therefore, the BCa interval provides the most accurate and
reliable inference for E[X].
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgODogQm9vdHN0cmFwIE1ldGhvZHMgYW5kIEFwcGxpY2F0aW9ucyINCmF1dGhvcjogIktpZXJhbiBIZWZmZXJhbiAiDQpkYXRlOiAiIER1ZTogMy8zMS8yNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkge2JhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7DQogICAgICBjb2xvcjogIzAwMDAwMDsNCiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsNCiAgICAgIGZvbnQtc2l6ZTogMXJlbTsNCiAgICAgIGxpbmUtaGVpZ2h0OiAxLjY7DQogICAgICB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQoNCmlmICghcmVxdWlyZSgiVkdBTSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoIlZHQU0iKQ0KICBsaWJyYXJ5KFZHQU0pDQp9DQojIyMjIFZHQU0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQogXA0KIA0KIyMgKipBc3NpZ25tZW50IE9iamVjdGl2ZXMqKiANCg0KPHA+DQoqIFJlaW5mb3JjZSB0aGUgdW5kZXJzdGFuZGluZyBvZiBCb290c3RyYXAgc2FtcGxpbmcgLg0KDQoqIFVuZGVyc3RhbmQgdGhlIGJvb3RzdHJhcCBlc3RpbWF0aW9uOiBjb25maWRlbmNlIGludGVydmFsIGFuZCBzYW1wbGluZyBkaXN0cmlidXRpb24uDQo8L3A+DQoNCg0KIyMgKipQb2xpY2llcyBvZiBVc2luZyBBSSBUb29scyoqDQoNCjxwPg0KKipQb2xpY3kgb24gQUkgVG9vbCBVc2UqKjogUGxlYXNlIGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQo8L3A+DQoNCjxwPg0KKipDb2RlIEluY2x1c2lvbiBSZXF1aXJlbWVudCoqOiBBbnkgY29kZSBpbmNsdWRlZCBpbiB5b3VyIGVzc2F5IG11c3QgYmUgcHJvcGVybHkgY29tbWVudGVkIHRvIGV4cGxhaW4gdGhlIHB1cnBvc2UgYW5kL29yIGV4cGVjdGVkIG91dHB1dCBvZiBrZXkgY29kZSBsaW5lcy4gU3VibWl0dGluZyBBSS1nZW5lcmF0ZWQgY29kZSB3aXRob3V0IG1lYW5pbmdmdWwsIHN0dWRlbnQtYWRkZWQgY29tbWVudHMgd2lsbCBub3QgYmUgYWNjZXB0ZWQuDQo8L3A+DQoNCg0KPHA+KipMb2ctbm9ybWFsIERpc3RyaWJ1dGlvbiBSZXZpc2l0ZWQqKjwvcD4NCg0KPHA+DQpJZiAkWSA9IFxsbihYKSBcc2ltIE4oXG11LCBcc2lnbWFeMikkLCB0aGVuICRYJCBmb2xsb3dzIGEgbG9nbm9ybWFsIGRpc3RyaWJ1dGlvbiAkWCBcc2ltIFx0ZXh0e0xvZ25vcm1hbH0oXG11LCBcc2lnbWFeMikkLiBUaGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBpcyBnaXZlbiBieQ0KDQokJA0KZih4fFxtdSxcc2lnbWEpID0gXGZyYWN7MX17eFxzaWdtYVxzcXJ0ezJccGl9fSBcZXhwXGxlZnQoLVxmcmFjeyhcbG4geCAtIFxtdSleMn17MlxzaWdtYV4yfVxyaWdodCksIFxxdWFkIHggPiAwDQokJA0KDQpBZnRlciBzb21lIGFsZ2VicmEsIHdlIGNhbiBleHByZXNzIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiB0aGUgYWJvdmUgbG9nbm9ybWFsIGRpc3RyaWJ1dGlvbiBpbiB0aGUgZm9sbG93aW5nDQoNCg0KXGJlZ2lue2FsaWdufQ0KXG1hdGhiYntFfVtYXSAmPSBcZXhwXGxlZnQoXG11ICsgXGZyYWN7XHNpZ21hXjJ9ezJ9XHJpZ2h0KSBcXA0KXHRleHR7VmFyfShYKSAmPSBbXGV4cChcc2lnbWFeMikgLSAxXSBcZXhwKDJcbXUgKyBcc2lnbWFeMikNClxlbmR7YWxpZ259DQoNCg0KVXNpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIG5vcm1hbCBhbmQgbG9nLW5vcm1hbCBkaXN0cmlidXRpb24gYW5kIGEgc2FtcGxlICRce3hfMSwgeF8yLCBcZG90cywgeF9uXH0kLCB0aGUgTUxFIGVzdGltYXRvcnMgb2YgJFxtdSQgYW5kICRcc2lnbWFeMiQgYXJlIGdpdmVuIGJ5DQoNCg0KXGJlZ2lue2FsaWdufQ0KXGhhdHtcbXV9ICY9IFxmcmFjezF9e259XHN1bV97aT0xfV5uIFxsbih4X2kpIFxcDQpcaGF0e1xzaWdtYX1eMiAmPSBcZnJhY3sxfXtufVxzdW1fe2k9MX1ebiAoXGxuKHhfaSkgLSBcaGF0e1xtdX0pXjINClxlbmR7YWxpZ259DQoNCg0KVXNpbmcgdGhlIHBsdWctaW4gcHJpbmNpcGxlIG9mIE1MRSwgd2UgaGF2ZSB0aGUgTUxFIG9mICRcbWF0aGJie0V9W1hdJCBhbmQgJFx0ZXh0e1Zhcn0oWCkkIGluIHRoZSBmb2xsb3dpbmcNCg0KJCQNClxib3hlZHtcd2lkZWhhdHtcbWF0aGJie0V9W1hdfSA9IFxleHBcbGVmdChcaGF0e1xtdX0gKyBcZnJhY3tcaGF0e1xzaWdtYX1eMn17Mn1ccmlnaHQpfQ0KJCQNCg0KPC9QPg0KDQoNCg0KPHA+PGZvbnQgY29sb3IgPSAiYmx1ZSI+KipUaGlzIGFzc2lnbm1lbnQgZm9jdXNlcyBvbiBjb25zdHJ1Y3RpbmcgdmFyaW91cyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgb2YgdGhlIGxvZ25vcm1hbCBwb3B1bGF0aW9uIG1lYW4gJFxtYXRoYmJ7RX1bWF0kKio8L2ZvbnQ+PC9wPg0KDQoNClwNCg0KIyMgKipRdWVzdGlvbjogVHJhY2UgTWV0YWwgQ29uY2VudHJhdGlvbnMgaW4gU29pbCoqDQoNCjxwPg0KU29pbCBsZWFkIChQYikgY29uY2VudHJhdGlvbnMgKG1nL2tnKSBmcm9tIDU1IHVyYmFuIGdhcmRlbiBzaXRlcy4gVHJhY2UgbWV0YWxzIGluIGVudmlyb25tZW50YWwgbWVkaWEgdHlwaWNhbGx5IGZvbGxvdyBsb2dub3JtYWwgZGlzdHJpYnV0aW9ucyBkdWUgdG86DQoNCiogTXVsdGlwbGljYXRpdmUgcHJvY2Vzc2VzIGNvbnRyb2xsaW5nIGFjY3VtdWxhdGlvbg0KDQoqIFBvc2l0aXZlIGNvbnN0cmFpbnRzIChjb25jZW50cmF0aW9ucyBjYW5ub3QgYmUgbmVnYXRpdmUpDQoNCiogUmlnaHQtc2tld2VkIG5hdHVyZSBvZiBjb250YW1pbmF0aW9uIHBhdHRlcm5zDQo8L3A+DQoNCg0KDQo8cD4NCmBgYA0KMC44NSwgMS4yMywgMC45MiwgMy40NSwgMi4xMSwgMS41NiwgNC44OSwgMi4zNCwgMS43OCwgNi43MiwgMC45NSwgMS4zNCwgOC45MSwgDQoyLjY3LCAxLjg5LCA1LjQzLCAxLjEyLCAzLjc4LCAyLjQ1LCA3LjY1LCAxLjA1LCAxLjQ1LCAxMi4zNCwgMi44OSwgMi4wMSwgNC41NiwgDQoxLjIzLCA0LjMyLCAyLjY3LCA5Ljg3LCAwLjk5LCAxLjU2LCAxNS4yMywgMy4xMiwgMi4zNCwgMy44OSwgMS4zNCwgNS42NywgMi44OSwgDQoxMS40NSwgMS4xMiwgMS42NywgMTguOTAsIDMuNDUsIDIuNTYsIDMuNDUsIDEuNDUsIDYuNzgsIDMuMTIsIDE0LjU2LCAxLjIzLCAxLjc4LCANCjIyLjM0LCAzLjc4LCAyLjc4DQpgYGANCjwvcD4NCg0KPHA+DQoNCiQkXGJveGVke1x0ZXh0e0luc3RydWN0aW9uczp9fSQkDQoNCkFzc3VtZSB0aGUgZGF0YSBmb2xsb3cgYSBsb2ctbm9ybWFsIGRpc3RyaWJ1dGlvbi4gRm9yIGVhY2ggcXVlc3Rpb24gaW4gcGFydHMgKGIp4oCTKGQpLCBiZWdpbiBieSBjbGVhcmx5IGV4cGxhaW5pbmcgdGhlIHJlYXNvbmluZyBiZWhpbmQgeW91ciBhbmFseXRpY2FsIGFwcHJvYWNoLiBUaGVuLCBkZXZlbG9wIHlvdXIgb3duIFIgZnVuY3Rpb25zIHRvIGltcGxlbWVudCB0aHJlZSB0eXBlcyBvZiBjb25maWRlbmNlIGludGVydmFsczogdGhlIGFzeW1wdG90aWMgaW50ZXJ2YWwsIHRoZSBwZXJjZW50aWxlIGJvb3RzdHJhcCBpbnRlcnZhbCwgYW5kIHRoZSBiaWFzLWNvcnJlY3RlZCBhbmQgYWNjZWxlcmF0ZWQgKEJDYSkgYm9vdHN0cmFwIGludGVydmFsLiBVc2UgdGhlc2UgZnVuY3Rpb25zIHRvIGNvbnN0cnVjdCB0aGUgcmVxdWlyZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMsIGFuZCB2ZXJpZnkgeW91ciByZXN1bHRzIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbnMgZnJvbSB0aGUgYGJvb3RgIHBhY2thZ2UuDQoNCllvdSBhcmUgZW5jb3VyYWdlZCB0byBkZXNpZ24gYSB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgaW50ZWdyYXRlcyBhbGwgY29uZmlkZW5jZSBpbnRlcnZhbCBtZXRob2RzLCBhbGxvd2luZyB1c2VycyB0byBzZWxlY3QgdGhlIGRlc2lyZWQgbWV0aG9kIHRocm91Z2ggYW4gaW5wdXQgYXJndW1lbnQuDQo8L1A+DQoNCjxwPg0KDQokJFxib3hlZHtcdGV4dHtJbmRpdmlkdWFsIFF1ZXN0aW9uczp9fSQkDQoNCmEpLiBQZXJmb3JtIDUwMDAgYm9vdHN0cmFwIHNhbXBsZXMgdG8gZXN0aW1hdGUgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgJFxib3hlZHtcd2lkZWhhdHtcbWF0aGJie0V9W1hdfX0kLiBEaXNwbGF5IHRoZSBkaXN0cmlidXRpb24gdXNpbmcgZWl0aGVyIGEgaGlzdG9ncmFtIG9yIGEga2VybmVsIGRlbnNpdHkgcGxvdC4gQ29tbWVudCBvbiB0aGUgc2hhcGUsIHZhcmlhYmlsaXR5LCBhbmQgYW55IG5vdGFibGUgcGF0dGVybnMgb2JzZXJ2ZWQgaW4gdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uDQpgYGB7cn0NCnNldC5zZWVkKDEyMykNCg0KeCA8LSBjKDAuODUsIDEuMjMsIDAuOTIsIDMuNDUsIDIuMTEsIDEuNTYsIDQuODksIDIuMzQsIDEuNzgsIDYuNzIsIDAuOTUsDQogICAgICAgMS4zNCwgOC45MSwgMi42NywgMS44OSwgNS40MywgMS4xMiwgMy43OCwgMi40NSwgNy42NSwgMS4wNSwgMS40NSwNCiAgICAgICAxMi4zNCwgMi44OSwgMi4wMSwgNC41NiwgMS4yMywgNC4zMiwgMi42NywgOS44NywgMC45OSwgMS41NiwgMTUuMjMsDQogICAgICAgMy4xMiwgMi4zNCwgMy44OSwgMS4zNCwgNS42NywgMi44OSwgMTEuNDUsIDEuMTIsIDEuNjcsIDE4LjkwLCAzLjQ1LA0KICAgICAgIDIuNTYsIDMuNDUsIDEuNDUsIDYuNzgsIDMuMTIsIDE0LjU2LCAxLjIzLCAxLjc4LCAyMi4zNCwgMy43OCwgMi43OCkNCg0KbWVhbl9sbiA8LSBmdW5jdGlvbih4KSB7DQogIHkgPC0gbG9nKHgpDQogIGV4cChtZWFuKHkpICsgdmFyKHkpLzIpDQp9DQoNCkIgPC0gNTAwMA0KYm9vdF9lc3QgPC0gcmVwbGljYXRlKEIsIG1lYW5fbG4oc2FtcGxlKHgsIHJlcGxhY2UgPSBUUlVFKSkpDQoNCmhpc3QoYm9vdF9lc3QsIHByb2JhYmlsaXR5ID0gVFJVRSwgYnJlYWtzID0gNDAsDQogICAgIG1haW4gPSAiQm9vdHN0cmFwIERpc3RyaWJ1dGlvbiBvZiBFW1hdIiwNCiAgICAgeGxhYiA9ICJFW1hdIikNCmxpbmVzKGRlbnNpdHkoYm9vdF9lc3QpLCBjb2wgPSAiYmx1ZSIsIGx3ZCA9IDIpIA0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb246KioNCipUaGUgZGlzdHJpYnV0aW9uIGlzIHJpZ2h0LXNrZXdlZCByZWZsZWN0aW5nIHRoZSBsb2dub3JtYWwgbmF0dXJlIG9mIHRoZSBkYXRhLioNCipUaGVyZSBpcyBtb2RlcmF0ZSB2YXJpYWJpbGl0eSBkcml2ZW4gYnkgbGFyZ2VyIHZhbHVlcy4qDQoqVGhlIGRpc3RyaWJ1dGlvbiBpcyBub3Qgc3ltbWV0cmljLCBpbmRpY2F0aW5nIHRoYXQgbm9ybWFsLWJhc2VkIGluZmVyZW5jZSBtYXkgYmUgdW5yZWxpYWJsZS4qDQoNCmIpLiBDb25zdHJ1Y3QgYSA5NSUgYm9vdHN0cmFwIHBlcmNlbnRpbGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJFxtdV97TE59ID0gXG1hdGhiYntFfVtYXSQuDQpgYGB7cn0NCmNpX3BlcmNlbnRpbGUgPC0gZnVuY3Rpb24oYm9vdF9lc3QpIHsNCiAgcXVhbnRpbGUoYm9vdF9lc3QsIGMoMC4wMjUsIDAuOTc1KSkNCn0NCg0KY2lfcGVyY2VudGlsZShib290X2VzdCkgDQpgYGANCioqVGhlIHBlcmNlbnRpbGUgbWV0aG9kIGlzIHNpbXBsZSBhbmQgcHJlc2VydmVzIHNrZXduZXNzLCBidXQgZG9lcyBub3QgY29ycmVjdCBmb3IgYmlhcy4qKg0KDQpjKS4gQ29uc3RydWN0IGEgOTUlIGJvb3RzdHJhcCBCQ2EgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJFxtdV97TE59ID0gXG1hdGhiYntFfVtYXSQuDQpgYGB7cn0NCmxpYnJhcnkoYm9vdCkNCg0KYm9vdF9mbiA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7DQogIG1lYW5fbG4oZGF0YVtpbmRpY2VzXSkNCn0NCg0KYm9vdF9vYmogPC0gYm9vdCh4LCBib290X2ZuLCBSID0gNTAwMCkNCg0KYm9vdC5jaShib290X29iaiwgdHlwZSA9ICJiY2EiKQ0KYGBgDQoqKlRoZSBCQ2EgbWV0aG9kIGFkanVzdHMgZm9yIGJpYXMgYW5kIHNrZXduZXNzLCBtYWtpbmcgaXQgd2VsbC1zdWl0ZWQgZm9yIGxvZ25vcm1hbCBkYXRhLioqDQoNCmQpLiBVc2UgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSB0byBjb25zdHJ1Y3QgYSA5NSUgYXN5bXB0b3RpYyBjb25maWRlbmNlIGludGVydmFsIGZvciAkXG11X3tMTn0gPSBcbWF0aGJie0V9W1hdJC4NCmBgYHtyfQ0KdGhldGFfaGF0IDwtIG1lYW5fbG4oeCkNCnNlX2hhdCA8LSBzZChib290X2VzdCkNCg0KY2lfYXN5bXB0b3RpYyA8LSBjKA0KICB0aGV0YV9oYXQgLSAxLjk2ICogc2VfaGF0LA0KICB0aGV0YV9oYXQgKyAxLjk2ICogc2VfaGF0DQopDQoNCmNpX2FzeW1wdG90aWMgDQpgYGANCg0KZikuIEFzc3VtaW5nIHRoZSBjb25maWRlbmNlIGludGVydmFscyBjb25zdHJ1Y3RlZCBpbiB0aGUgcHJldmlvdXMgcGFydHMgYXJlIHZhbGlkLCBldmFsdWF0ZSB0aGVpciBwZXJmb3JtYW5jZSBieSBjb21wYXJpbmcgdGhlaXIgd2lkdGhzLCBzeW1tZXRyeSwgc3RhYmlsaXR5LCBhbmQgc2Vuc2l0aXZpdHkgdG8gZGlzdHJpYnV0aW9uYWwgc2tld25lc3MuIFRoZW4sIHByb3ZpZGUgYSB3ZWxs4oCRcmVhc29uZWQgcmVjb21tZW5kYXRpb24gcmVnYXJkaW5nIHdoaWNoIG1ldGhvZCBpcyBtb3N0IHN1aXRhYmxlIGZvciB0aGlzIGFuYWx5c2lzLg0KPC9wPg0KDQoNCnwgQ3JpdGVyaWEgICAgICAgIHwgUGVyY2VudGlsZSB8IEJDYSAgICAgICAgIHwgQXN5bXB0b3RpYyAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tIHwNCnwgV2lkdGggICAgICAgICAgIHwgTW9kZXJhdGUgICB8IE9mdGVuIHdpZGVyIHwgT2Z0ZW4gbmFycm93IHwNCnwgU3ltbWV0cnkgICAgICAgIHwgU2tld2VkICAgICB8IFNrZXdlZCAgICAgIHwgU3ltbWV0cmljICAgIHwNCnwgQmlhcyBjb3JyZWN0aW9uIHwgTm8gICAgICAgICB8IFllcyAgICAgICAgIHwgTm8gICAgICAgICAgIHwNCnwgU2tldyBzZW5zaXRpdml0eXwgUGFydGlhbCAgICB8IFN0cm9uZyAgICAgIHwgUG9vciAgICAgICAgIHwNCnwgU3RhYmlsaXR5ICAgICAgIHwgR29vZCAgICAgICB8IEJlc3QgICAgICAgIHwgTW9kZXJhdGUgICAgIHwNCg0KKipUaGUgQkNhIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIGlzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG1ldGhvZCBmb3IgdGhpcyBhbmFseXNpcyBhcyB0aGUgc29pbCBsZWFkIGNvbmNlbnRyYXRpb25zIGV4aGliaXQgc3Ryb25nIHJpZ2h0LXNrZXduZXNzIGNvbnNpc3RlbnQgd2l0aCBhIGxvZ25vcm1hbCBkaXN0cmlidXRpb24gYW5kIHRoZSBCQ2EgbWV0aG9kIGV4cGxpY2l0bHkgYWRqdXN0cyBmb3IgYm90aCBiaWFzIGFuZCBza2V3bmVzcyBpbiB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCB0aGVyZWZvcmUsIHRoZSBCQ2EgaW50ZXJ2YWwgcHJvdmlkZXMgdGhlIG1vc3QgYWNjdXJhdGUgYW5kIHJlbGlhYmxlIGluZmVyZW5jZSBmb3IgRVtYXS4qKg0K