Assignment Objectives
Understand the theoretical basis of Bootstrap sampling methods
for approximating sampling distributions.
Assess the performance of Bootstrap sampling distributions
against exact and asymptotic sampling distributions.
Implement Bootstrap sampling algorithm and construct sampling
distributions using R.
Use of AI Tools
Policy on AI Tool Use: Students must 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.
Asymptotic Distribution of Sample Variance
Assume that \(\{ x_1, x_2, \cdots, x_n \}
\to F(x)\) with \(\mu = E[X]\)
and \(\sigma^2 = \text{var}(X)\).
Denote
\[
s^2 = \frac{1}{n-1}\sum_{i=1}^n (x_i - \mu)^2
\]
If \(n\) is large,
\[
s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right)
\]
where \(\mu_4 = E[(X_i - \mu)^4]\)
is tje 4th central moment which can be estimated by
\[
\hat{\mu}_4 = \frac{1}{n}\sum_{i=1}^n(x_i-\bar{x})^4.
\]
Note: This describes the asymptotic convergence of
the sample variance, following from the central limit theorem (CLT). The
sample size required for this approximation to hold is
situation-dependent.
Question 1: Asymptotic vs Bootstrap Sampling
Distributions
Write an essay summarizing the concepts of Asymptotic and Bootstrap
Sampling Distributions, along with their key applications. Your
discussion should be grounded in your personal understanding of the
material. Any external sources including AI tools consulted must be
clearly cited.
Essay Prompt: Discuss the concepts of the bootstrap
sampling plan, the bootstrap sampling distribution, and the asymptotic
sampling distribution in the context of statistics (e.g., sample mean
and variance) computed from an independent and identically distributed
(i.i.d.) sample. Your discussion should:
Clearly outline the key assumptions required for each
method.
Explain the practical application of each distribution.
Provide guidance on when and why one should be preferred over the
other in statistical inference.
In statistical inference having the understanding of the
sampling distribution of an estimator such as the sample mean or sample
variance is very fundamental in the world of statistics. Two approaches
to approximating sampling distributions are the asymptotic approach and
the bootstrap approach. Although both approaches describe how an
estimator varies across repeated samples, they rely differently with
it’s principles and assumptions.
The asymptotic sampling distribution is established from the
probability theory, with most notably the Central Limit Theorem coming
into mind. Suppose we observe an independent and identically distributed
sample (X_1, X_2, , X_n) from a population with a limited mean and
variance. The CLT highlights that as the sample size (n) becomes large,
the sampling distribution of the sample mean becomes normal, regardless
of the shape of the underlying population distribution. Specifically,
the sample mean is approximately normally distributed with mean equal to
the population mean and variance equal to the population variance
divided by (n). The key assumptions for asymptotic results are
independence, identical distribution, and finite varaince. The practical
advantage of the asymptotic approach is that is simple because once the
standard error is estimated, inference can proceed using normal
approximations. These approximations rely on large sample sizes and
would perform poorly when the sample is relatively small or the data is
highly skewed.
In contrast, the bootstrap sampling distribution is a
computational method that approximates the true sampling distribution
directly from the observed data and instead of relying on theoretical
limit results, the bootstrap treats the empirical distribution of the
sample as an estimate of the whole population distribution. From the
original i.i.d. sample, many new samples of size are drawn with
replacement and the statistic of interest (sample mean or variance) is
computed for each resample. The distribution of these bootstrap
replicates forms what is known as the bootstrap sampling distribution.
The primary assumption underlying the bootstrap is that the original
sample is representative of the population and that observations are
independent and identically distributed. No assumption of normality is
required and the bootstrap is particularly useful when the sampling
distribution of a statistic is complicated, unknown, or difficult to
derive. It is perferably advantageous when using small to moderate
samples or when the population distribution is skewed.
The choice between asymptotic and bootstrap methods depends
on the context and practicality of the situation. When the sample size
is large and theoretical conditions are clear and satisfied, asymptotic
approximations are more efficent, interpretable, and simple to compute.
They are often preferred for standard statistics like the sample mean
when data behaves well. However, when sample sizes are limited,
distributions are non-normal, or the statistic is complex, the bootstrap
often provides a more accurate approximation of the sampling
distribution.
In summary, asymptotic sampling distributions rely on
theoretical large-sample results and provide formula-based inferencing
under clear assumptions. Bootstrap sampling distributions rely on
resampling from the observed data to approximate the estimator’s
variability with fewer distributional assumptions. Both approaches are
grounded in the idea of repeated sampling, but they differ on whether
such repetition is supported by analysis or by computational simulation.
Reference List: Efron, B. “Bootstrap Methods:
Another Look at the Jackknife .” Https://Www.Jstor.Org/, Institute of Mathematical
Statistics, 5 Apr. 2007,
sites.stat.washington.edu/courses/stat527/s14/readings/ann_stat1979.pdf.
Question 2: Daily Coffee Sales (in mL) at Two Different Cafe
Locations
This data set represents the volume of regular brewed coffee sold per
day (in milliliters) at two different cafe locations over a period of 50
days.
2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050, 4000, 4200, 3150, 3400, 7700, 8200,
3250, 4400, 3100, 4200, 4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600, 4100, 8400,
8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100, 3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600,
8400, 3300, 4200, 4500, 4800, 4300, 8500
We are interested in finding the sampling distribution of sample
means that will be used for various inferences about the underlying
population mean.
- Based on the given data, can the Central Limit Theorem be used to
derive the asymptotic sampling distribution of the sample mean? Justify
your answer.
# Data
coffee <- c(
2850, 3200, 2900, 3100, 2950, 7800, 8100, 7900, 3300, 3050,
4000, 4200, 3150, 3400, 7700, 8200, 3250, 4400, 3100, 4200,
4500, 4800, 4300, 8500, 8200, 8900, 8700, 3250, 3000, 4600,
4100, 8400, 8800, 3350, 4700, 3100, 8100, 3050, 8300, 4100,
3100, 8300, 8900, 8200, 4400, 4500, 3250, 4600, 8400, 3300,
4200, 4500, 4800, 4300, 8500
)
n <- length(coffee)
# Sample Mean and Standard Error
sample_mean <- mean(coffee)
sample_sd <- sd(coffee)
se_mean <- sample_sd / sqrt(n)
se_asymp <- sample_sd / sqrt(n)
sample_mean
[1] 5250
se_mean
[1] 302.4396
Yes, since there are 55 samples, n ≈ 50 the Central Limit
Theorem applies and the sampling distribution of the mean ≈
Normal.
- Apply the bootstrap method to estimate the sampling distribution
(often called the bootstrap sampling distribution) of the sample mean.
Generate a kernel density estimate from the bootstrap sample means and
plot it. Then, use this bootstrap distribution to validate your
conclusion from part (a). Make sure your visuals are effective in
enhancing the presentation of these results.
# Bootstrap Procedure
set.seed(123)
B <- 10000 # number of bootstrap samples
boot_means <- replicate(B, mean(sample(coffee, n, replace = TRUE)))
boot_se_mean <- sd(boot_means)
boot_se_mean
[1] 297.3615
# Plot Bootstrap Sampling Distribution
plot(density(boot_means),
main = "Bootstrap Sampling Distribution of the Sample Mean",
xlab = "Bootstrap Sample Means",
lwd = 2)
# Add vertical line for observed sample mean
abline(v = sample_mean, col = "red", lwd = 2, lty = 2)
# Overlay asymptotic normal approximation
curve(dnorm(x, mean = sample_mean, sd = se_asymp),
lwd = 2,
lty = 3,
add = TRUE)
legend("topright",
legend = c("Bootstrap KDE",
"Observed Sample Mean",
"Asymptotic Normal Approximation"),
lwd = c(2,2,2),
lty = c(1,2,3))

- Repeat the analysis in parts (a) and (b) for the sample
variance.
# Sample Variance
sample_var <- var(coffee)
sample_var
[1] 5030833
# Bootstrap for Variance
boot_vars <- replicate(B, var(sample(coffee, n, replace = TRUE)))
boot_se_var <- sd(boot_vars)
boot_se_var
[1] 529733.8
plot(density(boot_vars),
main = "Bootstrap Sampling Distribution of the Variance",
xlab = "Bootstrap Sample Variances",
lwd = 2)
abline(v = sample_var, col = "red", lwd = 2)
# Asymptotic normal approximation (normal case approximation)
asymp_sd_var <- sqrt(2 * sample_var^2 / (n - 1))
curve(dnorm(x, mean = sample_var, sd = asymp_sd_var),
lwd = 2,
lty = 3,
add = TRUE)
legend("topright",
legend = c("Bootstrap KDE",
"Observed Sample Variance",
"Asymptotic Normal"),
lwd = c(2,2,2),
lty = c(1,2,3))

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJLaWVyYW4gSGVmZmVyYW4gIg0KZGF0ZTogIiBEdWU6IDIvMTcvMjYgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMTVweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBuYXZ5Ow0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQp9DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgicGFuZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpDQogICBsaWJyYXJ5KHBhbmRlcikNCn0NCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQ0KICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogIGxpYnJhcnkodGlkeXZlcnNlKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogIGxpYnJhcnkocGxvdGx5KQ0KfQ0KIyMjIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQoqIFVuZGVyc3RhbmQgdGhlIHRoZW9yZXRpY2FsIGJhc2lzIG9mIEJvb3RzdHJhcCBzYW1wbGluZyBtZXRob2RzIGZvciBhcHByb3hpbWF0aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMuDQoNCiogQXNzZXNzIHRoZSBwZXJmb3JtYW5jZSBvZiBCb290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBhZ2FpbnN0IGV4YWN0IGFuZCBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMuDQoNCiogSW1wbGVtZW50IEJvb3RzdHJhcCBzYW1wbGluZyBhbGdvcml0aG0gYW5kIGNvbnN0cnVjdCBzYW1wbGluZyBkaXN0cmlidXRpb25zIHVzaW5nIFIuDQoNClwNCg0KKipVc2Ugb2YgQUkgVG9vbHMqKg0KDQoqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBTdHVkZW50cyBtdXN0IGFkaGVyZSB0byB0aGUgQUkgdG9vbCBwb2xpY3kgc3BlY2lmaWVkIGluIHRoZSBjb3Vyc2Ugc3lsbGFidXMuIFRoZSBkaXJlY3QgY29weWluZyBvZiBBSS1nZW5lcmF0ZWQgY29udGVudCBpcyBzdHJpY3RseSBwcm9oaWJpdGVkLiBBbGwgc3VibWl0dGVkIHdvcmsgbXVzdCByZWZsZWN0IHlvdXIgb3duIHVuZGVyc3RhbmRpbmc7IHdoZXJlIGV4dGVybmFsIHRvb2xzIGFyZSBjb25zdWx0ZWQsIGNvbnRlbnQgbXVzdCBiZSB0aG9yb3VnaGx5IHJlcGhyYXNlZCBhbmQgc3ludGhlc2l6ZWQgaW4geW91ciBvd24gd29yZHMuDQoNCioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLg0KDQpcDQoNCioqQXN5bXB0b3RpYyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlKioNCg0KQXNzdW1lIHRoYXQgJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSBcdG8gRih4KSQgd2l0aCAkXG11ID0gRVtYXSQgYW5kICRcc2lnbWFeMiA9IFx0ZXh0e3Zhcn0oWCkkLiBEZW5vdGUgDQoNCiQkDQpzXjIgPSBcZnJhY3sxfXtuLTF9XHN1bV97aT0xfV5uICh4X2kgLSBcbXUpXjINCiQkDQoNCklmICRuJCBpcyBsYXJnZSwgDQoNCiQkDQpzXjIgXHRvIE5cbGVmdChcc2lnbWFeMiwgIFxmcmFje1xtdV80LVxzaWdtYV40fXtufSBccmlnaHQpDQokJA0KDQp3aGVyZSAkXG11XzQgPSBFWyhYX2kgLSBcbXUpXjRdJCBpcyB0amUgNHRoIGNlbnRyYWwgbW9tZW50IHdoaWNoIGNhbiBiZSBlc3RpbWF0ZWQgYnkNCg0KJCQNClxoYXR7XG11fV80ID0gXGZyYWN7MX17bn1cc3VtX3tpPTF9Xm4oeF9pLVxiYXJ7eH0pXjQuDQokJA0KDQoqKk5vdGUqKjogVGhpcyBkZXNjcmliZXMgdGhlIGFzeW1wdG90aWMgY29udmVyZ2VuY2Ugb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSwgZm9sbG93aW5nIGZyb20gdGhlIGNlbnRyYWwgbGltaXQgdGhlb3JlbSAoQ0xUKS4gVGhlIHNhbXBsZSBzaXplIHJlcXVpcmVkIGZvciB0aGlzIGFwcHJveGltYXRpb24gdG8gaG9sZCBpcyBzaXR1YXRpb24tZGVwZW5kZW50Lg0KDQoNClwNCg0KIyMgKipRdWVzdGlvbiAxOiBBc3ltcHRvdGljIHZzIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zKioNCg0KV3JpdGUgYW4gZXNzYXkgc3VtbWFyaXppbmcgdGhlIGNvbmNlcHRzIG9mIEFzeW1wdG90aWMgYW5kIEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb25zLCBhbG9uZyB3aXRoIHRoZWlyIGtleSBhcHBsaWNhdGlvbnMuIFlvdXIgZGlzY3Vzc2lvbiBzaG91bGQgYmUgZ3JvdW5kZWQgaW4geW91ciBwZXJzb25hbCB1bmRlcnN0YW5kaW5nIG9mIHRoZSBtYXRlcmlhbC4gQW55IGV4dGVybmFsIHNvdXJjZXMgaW5jbHVkaW5nIEFJIHRvb2xzIGNvbnN1bHRlZCBtdXN0IGJlIGNsZWFybHkgY2l0ZWQuIA0KDQoNCioqRXNzYXkgUHJvbXB0Kio6IERpc2N1c3MgdGhlIGNvbmNlcHRzIG9mIHRoZSBib290c3RyYXAgc2FtcGxpbmcgcGxhbiwgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24sIGFuZCB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaW4gdGhlIGNvbnRleHQgb2Ygc3RhdGlzdGljcyAoZS5nLiwgc2FtcGxlIG1lYW4gYW5kIHZhcmlhbmNlKSBjb21wdXRlZCBmcm9tIGFuIGluZGVwZW5kZW50IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZCAoaS5pLmQuKSBzYW1wbGUuIFlvdXIgZGlzY3Vzc2lvbiBzaG91bGQ6DQoNCiogQ2xlYXJseSBvdXRsaW5lIHRoZSBrZXkgYXNzdW1wdGlvbnMgcmVxdWlyZWQgZm9yIGVhY2ggbWV0aG9kLg0KDQoqIEV4cGxhaW4gdGhlIHByYWN0aWNhbCBhcHBsaWNhdGlvbiBvZiBlYWNoIGRpc3RyaWJ1dGlvbi4NCg0KKiBQcm92aWRlIGd1aWRhbmNlIG9uIHdoZW4gYW5kIHdoeSBvbmUgc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIHRoZSBvdGhlciBpbiBzdGF0aXN0aWNhbCBpbmZlcmVuY2UuDQoNCg0KKipJbiBzdGF0aXN0aWNhbCBpbmZlcmVuY2UgaGF2aW5nIHRoZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgYW4gZXN0aW1hdG9yIHN1Y2ggYXMgdGhlIHNhbXBsZSBtZWFuIG9yIHNhbXBsZSB2YXJpYW5jZSBpcyB2ZXJ5IGZ1bmRhbWVudGFsIGluIHRoZSB3b3JsZCBvZiBzdGF0aXN0aWNzLiBUd28gYXBwcm9hY2hlcyB0byBhcHByb3hpbWF0aW5nIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgYXJlIHRoZSBhc3ltcHRvdGljIGFwcHJvYWNoIGFuZCB0aGUgYm9vdHN0cmFwIGFwcHJvYWNoLiBBbHRob3VnaCBib3RoIGFwcHJvYWNoZXMgZGVzY3JpYmUgaG93IGFuIGVzdGltYXRvciB2YXJpZXMgYWNyb3NzIHJlcGVhdGVkIHNhbXBsZXMsIHRoZXkgcmVseSBkaWZmZXJlbnRseSB3aXRoIGl0J3MgcHJpbmNpcGxlcyBhbmQgYXNzdW1wdGlvbnMuKioNCg0KKipUaGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgZXN0YWJsaXNoZWQgZnJvbSB0aGUgcHJvYmFiaWxpdHkgdGhlb3J5LCB3aXRoIG1vc3Qgbm90YWJseSB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGNvbWluZyBpbnRvIG1pbmQuIFN1cHBvc2Ugd2Ugb2JzZXJ2ZSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgc2FtcGxlIChYXzEsIFhfMiwgXGRvdHMsIFhfbikgZnJvbSBhIHBvcHVsYXRpb24gd2l0aCBhIGxpbWl0ZWQgbWVhbiBhbmQgdmFyaWFuY2UuIFRoZSBDTFQgaGlnaGxpZ2h0cyB0aGF0IGFzIHRoZSBzYW1wbGUgc2l6ZSAobikgYmVjb21lcyBsYXJnZSwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gYmVjb21lcyBub3JtYWwsIHJlZ2FyZGxlc3Mgb2YgdGhlIHNoYXBlIG9mIHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uLiBTcGVjaWZpY2FsbHksIHRoZSBzYW1wbGUgbWVhbiBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggbWVhbiBlcXVhbCB0byB0aGUgcG9wdWxhdGlvbiBtZWFuIGFuZCB2YXJpYW5jZSBlcXVhbCB0byB0aGUgcG9wdWxhdGlvbiB2YXJpYW5jZSBkaXZpZGVkIGJ5IChuKS4gVGhlIGtleSBhc3N1bXB0aW9ucyBmb3IgYXN5bXB0b3RpYyByZXN1bHRzIGFyZSBpbmRlcGVuZGVuY2UsIGlkZW50aWNhbCBkaXN0cmlidXRpb24sIGFuZCBmaW5pdGUgdmFyYWluY2UuIFRoZSBwcmFjdGljYWwgYWR2YW50YWdlIG9mIHRoZSBhc3ltcHRvdGljIGFwcHJvYWNoIGlzIHRoYXQgaXMgc2ltcGxlIGJlY2F1c2Ugb25jZSB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgZXN0aW1hdGVkLCBpbmZlcmVuY2UgY2FuIHByb2NlZWQgdXNpbmcgbm9ybWFsIGFwcHJveGltYXRpb25zLiBUaGVzZSBhcHByb3hpbWF0aW9ucyByZWx5IG9uIGxhcmdlIHNhbXBsZSBzaXplcyBhbmQgd291bGQgcGVyZm9ybSBwb29ybHkgd2hlbiB0aGUgc2FtcGxlIGlzIHJlbGF0aXZlbHkgc21hbGwgb3IgdGhlIGRhdGEgaXMgaGlnaGx5IHNrZXdlZC4qKg0KDQoqKkluIGNvbnRyYXN0LCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBhIGNvbXB1dGF0aW9uYWwgbWV0aG9kIHRoYXQgYXBwcm94aW1hdGVzIHRoZSB0cnVlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkaXJlY3RseSBmcm9tIHRoZSBvYnNlcnZlZCBkYXRhIGFuZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlb3JldGljYWwgbGltaXQgcmVzdWx0cywgdGhlIGJvb3RzdHJhcCB0cmVhdHMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSBhcyBhbiBlc3RpbWF0ZSBvZiB0aGUgd2hvbGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIEZyb20gdGhlIG9yaWdpbmFsIGkuaS5kLiBzYW1wbGUsIG1hbnkgbmV3IHNhbXBsZXMgb2Ygc2l6ZSBhcmUgZHJhd24gd2l0aCByZXBsYWNlbWVudCBhbmQgdGhlIHN0YXRpc3RpYyBvZiBpbnRlcmVzdCAoc2FtcGxlIG1lYW4gb3IgdmFyaWFuY2UpIGlzIGNvbXB1dGVkIGZvciBlYWNoIHJlc2FtcGxlLiBUaGUgZGlzdHJpYnV0aW9uIG9mIHRoZXNlIGJvb3RzdHJhcCByZXBsaWNhdGVzIGZvcm1zIHdoYXQgaXMga25vd24gYXMgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIFRoZSBwcmltYXJ5IGFzc3VtcHRpb24gdW5kZXJseWluZyB0aGUgYm9vdHN0cmFwIGlzIHRoYXQgdGhlIG9yaWdpbmFsIHNhbXBsZSBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgcG9wdWxhdGlvbiBhbmQgdGhhdCBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZC4gTm8gYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgcmVxdWlyZWQgYW5kIHRoZSBib290c3RyYXAgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgYSBzdGF0aXN0aWMgaXMgY29tcGxpY2F0ZWQsIHVua25vd24sIG9yIGRpZmZpY3VsdCB0byBkZXJpdmUuIEl0IGlzIHBlcmZlcmFibHkgYWR2YW50YWdlb3VzIHdoZW4gdXNpbmcgc21hbGwgdG8gbW9kZXJhdGUgc2FtcGxlcyBvciB3aGVuIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBpcyBza2V3ZWQuKioNCg0KKipUaGUgY2hvaWNlIGJldHdlZW4gYXN5bXB0b3RpYyBhbmQgYm9vdHN0cmFwIG1ldGhvZHMgZGVwZW5kcyBvbiB0aGUgY29udGV4dCBhbmQgcHJhY3RpY2FsaXR5IG9mIHRoZSBzaXR1YXRpb24uIFdoZW4gdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlIGFuZCB0aGVvcmV0aWNhbCBjb25kaXRpb25zIGFyZSBjbGVhciBhbmQgc2F0aXNmaWVkLCBhc3ltcHRvdGljIGFwcHJveGltYXRpb25zIGFyZSBtb3JlIGVmZmljZW50LCBpbnRlcnByZXRhYmxlLCBhbmQgc2ltcGxlIHRvIGNvbXB1dGUuIFRoZXkgYXJlIG9mdGVuIHByZWZlcnJlZCBmb3Igc3RhbmRhcmQgc3RhdGlzdGljcyBsaWtlIHRoZSBzYW1wbGUgbWVhbiB3aGVuIGRhdGEgYmVoYXZlcyB3ZWxsLiBIb3dldmVyLCB3aGVuIHNhbXBsZSBzaXplcyBhcmUgbGltaXRlZCwgZGlzdHJpYnV0aW9ucyBhcmUgbm9uLW5vcm1hbCwgb3IgdGhlIHN0YXRpc3RpYyBpcyBjb21wbGV4LCB0aGUgYm9vdHN0cmFwIG9mdGVuIHByb3ZpZGVzIGEgbW9yZSBhY2N1cmF0ZSBhcHByb3hpbWF0aW9uIG9mIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24uKioNCg0KKipJbiBzdW1tYXJ5LCBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgcmVseSBvbiB0aGVvcmV0aWNhbCBsYXJnZS1zYW1wbGUgcmVzdWx0cyBhbmQgcHJvdmlkZSBmb3JtdWxhLWJhc2VkIGluZmVyZW5jaW5nIHVuZGVyIGNsZWFyIGFzc3VtcHRpb25zLiBCb290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyByZWx5IG9uIHJlc2FtcGxpbmcgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YSB0byBhcHByb3hpbWF0ZSB0aGUgZXN0aW1hdG9y4oCZcyB2YXJpYWJpbGl0eSB3aXRoIGZld2VyIGRpc3RyaWJ1dGlvbmFsIGFzc3VtcHRpb25zLiBCb3RoIGFwcHJvYWNoZXMgYXJlIGdyb3VuZGVkIGluIHRoZSBpZGVhIG9mIHJlcGVhdGVkIHNhbXBsaW5nLCBidXQgdGhleSBkaWZmZXIgb24gd2hldGhlciBzdWNoIHJlcGV0aXRpb24gaXMgc3VwcG9ydGVkIGJ5IGFuYWx5c2lzIG9yIGJ5IGNvbXB1dGF0aW9uYWwgc2ltdWxhdGlvbi4gKioNCg0KKipSZWZlcmVuY2UgTGlzdDoqKg0KRWZyb24sIEIuIOKAnEJvb3RzdHJhcCBNZXRob2RzOiBBbm90aGVyIExvb2sgYXQgdGhlIEphY2trbmlmZSAu4oCdIEh0dHBzOi8vV3d3LkpzdG9yLk9yZy8sIEluc3RpdHV0ZSBvZiBNYXRoZW1hdGljYWwgU3RhdGlzdGljcywgNSBBcHIuIDIwMDcsIHNpdGVzLnN0YXQud2FzaGluZ3Rvbi5lZHUvY291cnNlcy9zdGF0NTI3L3MxNC9yZWFkaW5ncy9hbm5fc3RhdDE5NzkucGRmLiANCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuDQoNCmBgYA0KMjg1MCwgMzIwMCwgMjkwMCwgMzEwMCwgMjk1MCwgNzgwMCwgODEwMCwgNzkwMCwgMzMwMCwgMzA1MCwgNDAwMCwgNDIwMCwgMzE1MCwgMzQwMCwgNzcwMCwgODIwMCwgDQozMjUwLCA0NDAwLCAzMTAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLCA0MTAwLCA4NDAwLCANCjg4MDAsIDMzNTAsIDQ3MDAsIDMxMDAsIDgxMDAsIDMwNTAsIDgzMDAsIDQxMDAsIDMxMDAsIDgzMDAsIDg5MDAsIDgyMDAsIDQ0MDAsIDQ1MDAsIDMyNTAsIDQ2MDAsIA0KODQwMCwgMzMwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMA0KYGBgDQpXZSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2Ygc2FtcGxlIG1lYW5zIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB2YXJpb3VzIGluZmVyZW5jZXMgYWJvdXQgdGhlIHVuZGVybHlpbmcgcG9wdWxhdGlvbiBtZWFuLg0KDQphKSBCYXNlZCBvbiB0aGUgZ2l2ZW4gZGF0YSwgY2FuIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gYmUgdXNlZCB0byBkZXJpdmUgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbj8gSnVzdGlmeSB5b3VyIGFuc3dlci4NCg0KYGBge3J9DQojIERhdGENCmNvZmZlZSA8LSBjKA0KICAyODUwLCAzMjAwLCAyOTAwLCAzMTAwLCAyOTUwLCA3ODAwLCA4MTAwLCA3OTAwLCAzMzAwLCAzMDUwLA0KICA0MDAwLCA0MjAwLCAzMTUwLCAzNDAwLCA3NzAwLCA4MjAwLCAzMjUwLCA0NDAwLCAzMTAwLCA0MjAwLA0KICA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLA0KICA0MTAwLCA4NDAwLCA4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLA0KICAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCA4NDAwLCAzMzAwLA0KICA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwDQopDQoNCm4gPC0gbGVuZ3RoKGNvZmZlZSkNCg0KIyBTYW1wbGUgTWVhbiBhbmQgU3RhbmRhcmQgRXJyb3INCnNhbXBsZV9tZWFuIDwtIG1lYW4oY29mZmVlKQ0Kc2FtcGxlX3NkICAgPC0gc2QoY29mZmVlKQ0Kc2VfbWVhbiAgICAgPC0gc2FtcGxlX3NkIC8gc3FydChuKQ0Kc2VfYXN5bXAgPC0gc2FtcGxlX3NkIC8gc3FydChuKQ0KDQpzYW1wbGVfbWVhbg0Kc2VfbWVhbg0KYGBgDQoqKlllcywgc2luY2UgdGhlcmUgYXJlIDU1IHNhbXBsZXMsIG4g4omIIDUwIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gYXBwbGllcyBhbmQgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiDiiYggTm9ybWFsLioqDQoNCmIpIEFwcGx5IHRoZSBib290c3RyYXAgbWV0aG9kIHRvIGVzdGltYXRlIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gKG9mdGVuIGNhbGxlZCB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbikgb2YgdGhlIHNhbXBsZSBtZWFuLiBHZW5lcmF0ZSBhIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRlIGZyb20gdGhlIGJvb3RzdHJhcCBzYW1wbGUgbWVhbnMgYW5kIHBsb3QgaXQuIFRoZW4sIHVzZSB0aGlzIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gdG8gdmFsaWRhdGUgeW91ciBjb25jbHVzaW9uIGZyb20gcGFydCAoYSkuIE1ha2Ugc3VyZSB5b3VyIHZpc3VhbHMgYXJlIGVmZmVjdGl2ZSBpbiBlbmhhbmNpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGVzZSByZXN1bHRzLg0KDQpgYGB7cn0NCg0KIyBCb290c3RyYXAgUHJvY2VkdXJlDQoNCg0Kc2V0LnNlZWQoMTIzKQ0KQiA8LSAxMDAwMCAgICMgbnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzDQoNCmJvb3RfbWVhbnMgPC0gcmVwbGljYXRlKEIsIG1lYW4oc2FtcGxlKGNvZmZlZSwgbiwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KYm9vdF9zZV9tZWFuIDwtIHNkKGJvb3RfbWVhbnMpDQpib290X3NlX21lYW4NCg0KDQojIFBsb3QgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbg0KDQoNCnBsb3QoZGVuc2l0eShib290X21lYW5zKSwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBTYW1wbGUgTWVhbiIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBNZWFucyIsDQogICAgIGx3ZCA9IDIpDQoNCiMgQWRkIHZlcnRpY2FsIGxpbmUgZm9yIG9ic2VydmVkIHNhbXBsZSBtZWFuDQphYmxpbmUodiA9IHNhbXBsZV9tZWFuLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikNCg0KIyBPdmVybGF5IGFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24NCmN1cnZlKGRub3JtKHgsIG1lYW4gPSBzYW1wbGVfbWVhbiwgc2QgPSBzZV9hc3ltcCksDQogICAgICBsd2QgPSAyLA0KICAgICAgbHR5ID0gMywNCiAgICAgIGFkZCA9IFRSVUUpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IGMoIkJvb3RzdHJhcCBLREUiLA0KICAgICAgICAgICAgICAgICAgIk9ic2VydmVkIFNhbXBsZSBNZWFuIiwNCiAgICAgICAgICAgICAgICAgICJBc3ltcHRvdGljIE5vcm1hbCBBcHByb3hpbWF0aW9uIiksDQogICAgICAgbHdkID0gYygyLDIsMiksDQogICAgICAgbHR5ID0gYygxLDIsMykpDQoNCmBgYA0KDQpjKSBSZXBlYXQgdGhlIGFuYWx5c2lzIGluIHBhcnRzIChhKSBhbmQgKGIpIGZvciB0aGUgc2FtcGxlIHZhcmlhbmNlLg0KDQpgYGB7cn0NCg0KIyBTYW1wbGUgVmFyaWFuY2UNCg0KDQpzYW1wbGVfdmFyIDwtIHZhcihjb2ZmZWUpDQpzYW1wbGVfdmFyDQoNCg0KIyBCb290c3RyYXAgZm9yIFZhcmlhbmNlDQoNCg0KYm9vdF92YXJzIDwtIHJlcGxpY2F0ZShCLCB2YXIoc2FtcGxlKGNvZmZlZSwgbiwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KYm9vdF9zZV92YXIgPC0gc2QoYm9vdF92YXJzKQ0KYm9vdF9zZV92YXINCg0KDQpwbG90KGRlbnNpdHkoYm9vdF92YXJzKSwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBWYXJpYW5jZSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBWYXJpYW5jZXMiLA0KICAgICBsd2QgPSAyKQ0KDQphYmxpbmUodiA9IHNhbXBsZV92YXIsIGNvbCA9ICJyZWQiLCBsd2QgPSAyKQ0KDQojIEFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24gKG5vcm1hbCBjYXNlIGFwcHJveGltYXRpb24pDQphc3ltcF9zZF92YXIgPC0gc3FydCgyICogc2FtcGxlX3Zhcl4yIC8gKG4gLSAxKSkNCg0KY3VydmUoZG5vcm0oeCwgbWVhbiA9IHNhbXBsZV92YXIsIHNkID0gYXN5bXBfc2RfdmFyKSwNCiAgICAgIGx3ZCA9IDIsDQogICAgICBsdHkgPSAzLA0KICAgICAgYWRkID0gVFJVRSkNCg0KbGVnZW5kKCJ0b3ByaWdodCIsDQogICAgICAgbGVnZW5kID0gYygiQm9vdHN0cmFwIEtERSIsDQogICAgICAgICAgICAgICAgICAiT2JzZXJ2ZWQgU2FtcGxlIFZhcmlhbmNlIiwNCiAgICAgICAgICAgICAgICAgICJBc3ltcHRvdGljIE5vcm1hbCIpLA0KICAgICAgIGx3ZCA9IGMoMiwyLDIpLA0KICAgICAgIGx0eSA9IGMoMSwyLDMpKQ0KDQpgYGANCg==