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.
The statistical sampling process is done to understand the population
of interest in question. Due to the total population distribution often
being unknown, a sampling distribution can be used to make assumptions
and gain a better understanding of how the data is distributed. This can
be used to make predictions and estimations, based upon sample
statistics and the sampling distribution. There are a few approaches to
estimating the sampling distribution and two of these include the
asymptotic sampling distribution and the bootstrap sampling
distribution. Both of these methods are useful in approximating the
sampling distribution and gaining a better understanding of the data in
question.
The asymptotic sampling distribution is one way to create a sampling
distribution that can be used to make assumptions and inferences about
the overall population distribution of a particular data set of
interest. The asymptotic sampling distribution describes the
distribution as the sample size n grows infinitely large. As n grows
large \(s^2 \to
N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right)\). This serves
as the sample variance for that of an asymptotic sampling distribution.
This means that the asymptotic sampling distribution is useful for
calculating sample statistics that can be used to make inferences about
the population, as the population parameters often are unknown in the
random sampling process.
The key assumptions of the asymptotic sampling distribution are that
the observations must be independent and identically distributed, the
sample size must be sufficiently large, and the population must have
finite mean and variance. An important outcome of the asymptotic
distribution is that it will result in a normal distribution as long as
the assumptions are followed. This is due in part to the Central Limit
Theorem which states that as the sample size grows sufficiently large,
the sampling distribution will reach an approximately normal
distribution, regardless of the population distribution.
The bootstrap sampling distribution method is another valuable choice
in approximating a sampling distribution. This bootstrap method involves
repeatedly drawing samples from the observed data’s empirical
distribution, with replacement. This sampling process serves as a
stand-in for the unknown population distribution, and allows for
conclusions to be made regarding the distribution of the data. As the
sample size grows larger and larger, the sampling distribution will get
closer to that of the population distribution. The bootstrap method uses
the empirical distribution, \(\hat{F}_n\) as an approximation to the true
\({F}_n\) of the population. Then the
bootstrap sampling process draws many samples of size n with
replacement, to simulate what repeated data collection as an experiment
would do.
The key assumption of the bootstrap sampling method are that the data
are independently and identically distributed, and that the original
sample is representative of the overall population. The bootstrap method
is a nonparametric sampling method, so no assumption of a normal
distribution is required.
A bootstrap method can be used the created bootstrap confidence
intervals which can be interpreted as standard statistical confidence
intervals. For example, a bootstrap confidence interval would tell how
confident one can be that the true value is between the lower and upper
bound of the confidence interval. Additionally, the bootstrap method
could be used to estimate the standard error and create approximate
sampling distributions which can be used to make assumptions about the
overall population distribution.
While both the asymptotic and bootstrap sampling distributions are
great ways to visualize sampling distributions in order to see how they
are distributed and calculate useful sample statistics, there are cases
where one would be ideal to use over the other. The asymptotic sampling
distribution is ideal for large samples, however, if a sample size is
not sufficiently large, the assumptions for the asymptotic sampling
distribution would not be met. So, in the case of a small sample size,
the bootstrap method would be the better choice. However, if the sample
size is sufficiently large, then the asymptotic sampling distribution
would be the ideal choice, as long as all other assumptions of the
asymptotic distribution are indeed met. Overall, both sampling methods
provide for useful statistical analysis and learning more about how a
particular sample of data is distributed, which can be used to further
understand the likely trends of the overall population.
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.
Before doing anything else, I will create a data set called ‘coffee’
with the given values above. An create a histogram of these values.
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)
hist(coffee)

The histogram shows that the distribution of the coffee observations
appear to be bimodal. The asymptotic sampling distribution does not
require normality, only finite mean and variance and that the sample
size is sufficiently large. The sample size is sufficiently large, so
the Central Limit Theorem be used to derive the asymptotic sampling
distribution in this case. However, it is still worth noting that the
data does not follow a normal distribution, but the Central Limit
Theorem can still be used.
- 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.
B <- 10000
boot_means <- replicate(B, mean(sample(coffee, replace = TRUE)))
# Kernel Density Plot
plot(density(boot_means),
main="Bootstrap Sampling Distribution of Sample Mean",
xlab="Sample Mean")
abline(v=mean(coffee), col="red", lwd=2)

The bootstrap approach shows that the distribution of the sample
follows an approximately normal distribution. The above graph shows the
kernel density estimate. This validates the conclusion made in part a
that it is alright to apply the Central Limit Theorem, and that because
the sample size is sufficiently large following the random sampling
approach will result in a distribution that is approximately normal even
if the original distribution was not. The bootstrap method works well in
this case for providing a distribution of the sampling mean.
- Repeat the analysis in parts (a) and (b) for the sample
variance.
boot_vars <- replicate(B, var(sample(coffee, replace = TRUE)))
plot(density(boot_vars),
main="Bootstrap Sampling Distribution of Sample Variance",
xlab="Sample Variance")
abline(v=var(coffee), col="red", lwd=2)

The distribution of the sample variance shows some noticeable skew to
the left, however, this skew is not too incredibly severe. It is worth
noting that variance measurements tend to be more sensitive to skewness
than that of the mean. So, this is not surprising that the sample
variance is not as close to that of a true normal distribution compared
to the sample mean. In this case, the bootstrap method would be a good
choice for approximating the sample variance distribution due to it
being a nonparametric approach so that the assumption of normality is
not required. This means that despite the sample variance distribution
showing some slight skewness to the left, the bootstrap method is still
a good choice for a sampling distribution.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJKb3NpZSBHYWxsb3AiDQpkYXRlOiAiIER1ZTogMDItMTctMjAyNiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMjIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQogXA0KIA0KIyMgKipBc3NpZ25tZW50IE9iamVjdGl2ZXMqKiANCg0KKiBVbmRlcnN0YW5kIHRoZSB0aGVvcmV0aWNhbCBiYXNpcyBvZiBCb290c3RyYXAgc2FtcGxpbmcgbWV0aG9kcyBmb3IgYXBwcm94aW1hdGluZyBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQoqIEFzc2VzcyB0aGUgcGVyZm9ybWFuY2Ugb2YgQm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgYWdhaW5zdCBleGFjdCBhbmQgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb25zLg0KDQoqIEltcGxlbWVudCBCb290c3RyYXAgc2FtcGxpbmcgYWxnb3JpdGhtIGFuZCBjb25zdHJ1Y3Qgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyB1c2luZyBSLg0KDQpcDQoNCioqVXNlIG9mIEFJIFRvb2xzKioNCg0KKipQb2xpY3kgb24gQUkgVG9vbCBVc2UqKjogU3R1ZGVudHMgbXVzdCBhZGhlcmUgdG8gdGhlIEFJIHRvb2wgcG9saWN5IHNwZWNpZmllZCBpbiB0aGUgY291cnNlIHN5bGxhYnVzLiBUaGUgZGlyZWN0IGNvcHlpbmcgb2YgQUktZ2VuZXJhdGVkIGNvbnRlbnQgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gQWxsIHN1Ym1pdHRlZCB3b3JrIG11c3QgcmVmbGVjdCB5b3VyIG93biB1bmRlcnN0YW5kaW5nOyB3aGVyZSBleHRlcm5hbCB0b29scyBhcmUgY29uc3VsdGVkLCBjb250ZW50IG11c3QgYmUgdGhvcm91Z2hseSByZXBocmFzZWQgYW5kIHN5bnRoZXNpemVkIGluIHlvdXIgb3duIHdvcmRzLg0KDQoqKkNvZGUgSW5jbHVzaW9uIFJlcXVpcmVtZW50Kio6IEFueSBjb2RlIGluY2x1ZGVkIGluIHlvdXIgZXNzYXkgbXVzdCBiZSBwcm9wZXJseSBjb21tZW50ZWQgdG8gZXhwbGFpbiB0aGUgcHVycG9zZSBhbmQvb3IgZXhwZWN0ZWQgb3V0cHV0IG9mIGtleSBjb2RlIGxpbmVzLiBTdWJtaXR0aW5nIEFJLWdlbmVyYXRlZCBjb2RlIHdpdGhvdXQgbWVhbmluZ2Z1bCwgc3R1ZGVudC1hZGRlZCBjb21tZW50cyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4NCg0KXA0KDQoqKkFzeW1wdG90aWMgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBWYXJpYW5jZSoqDQoNCkFzc3VtZSB0aGF0ICRceyB4XzEsIHhfMiwgXGNkb3RzLCB4X24gXH0gXHRvIEYoeCkkIHdpdGggJFxtdSA9IEVbWF0kIGFuZCAkXHNpZ21hXjIgPSBcdGV4dHt2YXJ9KFgpJC4gRGVub3RlIA0KDQokJA0Kc14yID0gXGZyYWN7MX17bi0xfVxzdW1fe2k9MX1ebiAoeF9pIC0gXG11KV4yDQokJA0KDQpJZiAkbiQgaXMgbGFyZ2UsIA0KDQokJA0Kc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNCg0Kd2hlcmUgJFxtdV80ID0gRVsoWF9pIC0gXG11KV40XSQgaXMgdGplIDR0aCBjZW50cmFsIG1vbWVudCB3aGljaCBjYW4gYmUgZXN0aW1hdGVkIGJ5DQoNCiQkDQpcaGF0e1xtdX1fNCA9IFxmcmFjezF9e259XHN1bV97aT0xfV5uKHhfaS1cYmFye3h9KV40Lg0KJCQNCg0KKipOb3RlKio6IFRoaXMgZGVzY3JpYmVzIHRoZSBhc3ltcHRvdGljIGNvbnZlcmdlbmNlIG9mIHRoZSBzYW1wbGUgdmFyaWFuY2UsIGZvbGxvd2luZyBmcm9tIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gKENMVCkuIFRoZSBzYW1wbGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhpcyBhcHByb3hpbWF0aW9uIHRvIGhvbGQgaXMgc2l0dWF0aW9uLWRlcGVuZGVudC4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb24gMTogQXN5bXB0b3RpYyB2cyBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyoqDQoNCldyaXRlIGFuIGVzc2F5IHN1bW1hcml6aW5nIHRoZSBjb25jZXB0cyBvZiBBc3ltcHRvdGljIGFuZCBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucywgYWxvbmcgd2l0aCB0aGVpciBrZXkgYXBwbGljYXRpb25zLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkIGJlIGdyb3VuZGVkIGluIHlvdXIgcGVyc29uYWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgbWF0ZXJpYWwuIEFueSBleHRlcm5hbCBzb3VyY2VzIGluY2x1ZGluZyBBSSB0b29scyBjb25zdWx0ZWQgbXVzdCBiZSBjbGVhcmx5IGNpdGVkLiANCg0KDQoqKkVzc2F5IFByb21wdCoqOiBEaXNjdXNzIHRoZSBjb25jZXB0cyBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHBsYW4sIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGluIHRoZSBjb250ZXh0IG9mIHN0YXRpc3RpY3MgKGUuZy4sIHNhbXBsZSBtZWFuIGFuZCB2YXJpYW5jZSkgY29tcHV0ZWQgZnJvbSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgKGkuaS5kLikgc2FtcGxlLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkOg0KDQoqIENsZWFybHkgb3V0bGluZSB0aGUga2V5IGFzc3VtcHRpb25zIHJlcXVpcmVkIGZvciBlYWNoIG1ldGhvZC4NCg0KKiBFeHBsYWluIHRoZSBwcmFjdGljYWwgYXBwbGljYXRpb24gb2YgZWFjaCBkaXN0cmlidXRpb24uDQoNCiogUHJvdmlkZSBndWlkYW5jZSBvbiB3aGVuIGFuZCB3aHkgb25lIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgb3RoZXIgaW4gc3RhdGlzdGljYWwgaW5mZXJlbmNlLg0KDQoNClRoZSBzdGF0aXN0aWNhbCBzYW1wbGluZyBwcm9jZXNzIGlzIGRvbmUgdG8gdW5kZXJzdGFuZCB0aGUgcG9wdWxhdGlvbiBvZiBpbnRlcmVzdCBpbiBxdWVzdGlvbi4gRHVlIHRvIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZnRlbiBiZWluZyB1bmtub3duLCBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBjYW4gYmUgdXNlZCB0byBtYWtlIGFzc3VtcHRpb25zIGFuZCBnYWluIGEgYmV0dGVyIHVuZGVyc3RhbmRpbmcgb2YgaG93IHRoZSBkYXRhIGlzIGRpc3RyaWJ1dGVkLiBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgcHJlZGljdGlvbnMgYW5kIGVzdGltYXRpb25zLCBiYXNlZCB1cG9uIHNhbXBsZSBzdGF0aXN0aWNzIGFuZCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBUaGVyZSBhcmUgYSBmZXcgYXBwcm9hY2hlcyB0byBlc3RpbWF0aW5nIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gYW5kIHR3byBvZiB0aGVzZSBpbmNsdWRlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24uIEJvdGggb2YgdGhlc2UgbWV0aG9kcyBhcmUgdXNlZnVsIGluIGFwcHJveGltYXRpbmcgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBhbmQgZ2FpbmluZyBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHRoZSBkYXRhIGluIHF1ZXN0aW9uLiANCg0KVGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIG9uZSB3YXkgdG8gY3JlYXRlIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSBhc3N1bXB0aW9ucyBhbmQgaW5mZXJlbmNlcyBhYm91dCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbiBvZiBhIHBhcnRpY3VsYXIgZGF0YSBzZXQgb2YgaW50ZXJlc3QuIFRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkZXNjcmliZXMgdGhlIGRpc3RyaWJ1dGlvbiBhcyB0aGUgc2FtcGxlIHNpemUgbiBncm93cyBpbmZpbml0ZWx5IGxhcmdlLiBBcyBuIGdyb3dzIGxhcmdlICRzXjIgXHRvIE5cbGVmdChcc2lnbWFeMiwgIFxmcmFje1xtdV80LVxzaWdtYV40fXtufSBccmlnaHQpJC4gVGhpcyBzZXJ2ZXMgYXMgdGhlIHNhbXBsZSB2YXJpYW5jZSBmb3IgdGhhdCBvZiBhbiBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyB1c2VmdWwgZm9yIGNhbGN1bGF0aW5nIHNhbXBsZSBzdGF0aXN0aWNzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFrZSBpbmZlcmVuY2VzIGFib3V0IHRoZSBwb3B1bGF0aW9uLCBhcyB0aGUgcG9wdWxhdGlvbiBwYXJhbWV0ZXJzIG9mdGVuIGFyZSB1bmtub3duIGluIHRoZSByYW5kb20gc2FtcGxpbmcgcHJvY2Vzcy4gDQoNClRoZSBrZXkgYXNzdW1wdGlvbnMgb2YgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGFyZSB0aGF0IHRoZSBvYnNlcnZhdGlvbnMgbXVzdCBiZSBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQsIHRoZSBzYW1wbGUgc2l6ZSBtdXN0IGJlIHN1ZmZpY2llbnRseSBsYXJnZSwgYW5kIHRoZSBwb3B1bGF0aW9uIG11c3QgaGF2ZSBmaW5pdGUgbWVhbiBhbmQgdmFyaWFuY2UuIEFuIGltcG9ydGFudCBvdXRjb21lIG9mIHRoZSBhc3ltcHRvdGljIGRpc3RyaWJ1dGlvbiBpcyB0aGF0IGl0IHdpbGwgcmVzdWx0IGluIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBhcyBsb25nIGFzIHRoZSBhc3N1bXB0aW9ucyBhcmUgZm9sbG93ZWQuIFRoaXMgaXMgZHVlIGluIHBhcnQgdG8gdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSB3aGljaCBzdGF0ZXMgdGhhdCBhcyB0aGUgc2FtcGxlIHNpemUgZ3Jvd3Mgc3VmZmljaWVudGx5IGxhcmdlLCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIHdpbGwgcmVhY2ggYW4gYXBwcm94aW1hdGVseSBub3JtYWwgZGlzdHJpYnV0aW9uLCByZWdhcmRsZXNzIG9mIHRoZSBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gDQoNClRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG1ldGhvZCBpcyBhbm90aGVyIHZhbHVhYmxlIGNob2ljZSBpbiBhcHByb3hpbWF0aW5nIGEgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLiBUaGlzIGJvb3RzdHJhcCBtZXRob2QgaW52b2x2ZXMgcmVwZWF0ZWRseSBkcmF3aW5nIHNhbXBsZXMgZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YSdzIGVtcGlyaWNhbCBkaXN0cmlidXRpb24sIHdpdGggcmVwbGFjZW1lbnQuIFRoaXMgc2FtcGxpbmcgcHJvY2VzcyBzZXJ2ZXMgYXMgYSBzdGFuZC1pbiBmb3IgdGhlIHVua25vd24gcG9wdWxhdGlvbiBkaXN0cmlidXRpb24sIGFuZCBhbGxvd3MgZm9yIGNvbmNsdXNpb25zIHRvIGJlIG1hZGUgcmVnYXJkaW5nIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEuIEFzIHRoZSBzYW1wbGUgc2l6ZSBncm93cyBsYXJnZXIgYW5kIGxhcmdlciwgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3aWxsIGdldCBjbG9zZXIgdG8gdGhhdCBvZiB0aGUgcG9wdWxhdGlvbiBkaXN0cmlidXRpb24uIFRoZSBib290c3RyYXAgbWV0aG9kIHVzZXMgdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24sICRcaGF0e0Z9X24kIGFzIGFuIGFwcHJveGltYXRpb24gdG8gdGhlIHRydWUgJHtGfV9uJCBvZiB0aGUgcG9wdWxhdGlvbi4gVGhlbiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHByb2Nlc3MgZHJhd3MgbWFueSBzYW1wbGVzIG9mIHNpemUgbiB3aXRoIHJlcGxhY2VtZW50LCB0byBzaW11bGF0ZSB3aGF0IHJlcGVhdGVkIGRhdGEgY29sbGVjdGlvbiBhcyBhbiBleHBlcmltZW50IHdvdWxkIGRvLiANCg0KVGhlIGtleSBhc3N1bXB0aW9uIG9mIHRoZSBib290c3RyYXAgc2FtcGxpbmcgbWV0aG9kIGFyZSB0aGF0IHRoZSBkYXRhIGFyZSBpbmRlcGVuZGVudGx5IGFuZCBpZGVudGljYWxseSBkaXN0cmlidXRlZCwgYW5kIHRoYXQgdGhlIG9yaWdpbmFsIHNhbXBsZSBpcyByZXByZXNlbnRhdGl2ZSBvZiB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uLiBUaGUgYm9vdHN0cmFwIG1ldGhvZCBpcyBhIG5vbnBhcmFtZXRyaWMgc2FtcGxpbmcgbWV0aG9kLCBzbyBubyBhc3N1bXB0aW9uIG9mIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBpcyByZXF1aXJlZC4gDQoNCkEgYm9vdHN0cmFwIG1ldGhvZCBjYW4gYmUgdXNlZCB0aGUgY3JlYXRlZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2hpY2ggY2FuIGJlIGludGVycHJldGVkIGFzIHN0YW5kYXJkIHN0YXRpc3RpY2FsIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiBGb3IgZXhhbXBsZSwgYSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCB3b3VsZCB0ZWxsIGhvdyBjb25maWRlbnQgb25lIGNhbiBiZSB0aGF0IHRoZSB0cnVlIHZhbHVlIGlzIGJldHdlZW4gdGhlIGxvd2VyIGFuZCB1cHBlciBib3VuZCBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbC4gQWRkaXRpb25hbGx5LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb3VsZCBiZSB1c2VkIHRvIGVzdGltYXRlIHRoZSBzdGFuZGFyZCBlcnJvciBhbmQgY3JlYXRlIGFwcHJveGltYXRlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gbWFrZSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGRpc3RyaWJ1dGlvbi4gDQoNCldoaWxlIGJvdGggdGhlIGFzeW1wdG90aWMgYW5kIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIGFyZSBncmVhdCB3YXlzIHRvIHZpc3VhbGl6ZSBzYW1wbGluZyBkaXN0cmlidXRpb25zIGluIG9yZGVyIHRvIHNlZSBob3cgdGhleSBhcmUgZGlzdHJpYnV0ZWQgYW5kIGNhbGN1bGF0ZSB1c2VmdWwgc2FtcGxlIHN0YXRpc3RpY3MsIHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBvbmUgd291bGQgYmUgaWRlYWwgdG8gdXNlIG92ZXIgdGhlIG90aGVyLiBUaGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgaWRlYWwgZm9yIGxhcmdlIHNhbXBsZXMsIGhvd2V2ZXIsIGlmIGEgc2FtcGxlIHNpemUgaXMgbm90IHN1ZmZpY2llbnRseSBsYXJnZSwgdGhlIGFzc3VtcHRpb25zIGZvciB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gd291bGQgbm90IGJlIG1ldC4gU28sIGluIHRoZSBjYXNlIG9mIGEgc21hbGwgc2FtcGxlIHNpemUsIHRoZSBib290c3RyYXAgbWV0aG9kIHdvdWxkIGJlIHRoZSBiZXR0ZXIgY2hvaWNlLiBIb3dldmVyLCBpZiB0aGUgc2FtcGxlIHNpemUgaXMgc3VmZmljaWVudGx5IGxhcmdlLCB0aGVuIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3b3VsZCBiZSB0aGUgaWRlYWwgY2hvaWNlLCBhcyBsb25nIGFzIGFsbCBvdGhlciBhc3N1bXB0aW9ucyBvZiB0aGUgYXN5bXB0b3RpYyBkaXN0cmlidXRpb24gYXJlIGluZGVlZCBtZXQuIE92ZXJhbGwsIGJvdGggc2FtcGxpbmcgbWV0aG9kcyBwcm92aWRlIGZvciB1c2VmdWwgc3RhdGlzdGljYWwgYW5hbHlzaXMgYW5kIGxlYXJuaW5nIG1vcmUgYWJvdXQgaG93IGEgcGFydGljdWxhciBzYW1wbGUgb2YgZGF0YSBpcyBkaXN0cmlidXRlZCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZnVydGhlciB1bmRlcnN0YW5kIHRoZSBsaWtlbHkgdHJlbmRzIG9mIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24uDQoNCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuIA0KDQpgYGANCjI4NTAsIDMyMDAsIDI5MDAsIDMxMDAsIDI5NTAsIDc4MDAsIDgxMDAsIDc5MDAsIDMzMDAsIDMwNTAsIDQwMDAsIDQyMDAsIDMxNTAsIDM0MDAsIDc3MDAsIDgyMDAsIA0KMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgDQo4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCANCjg0MDAsIDMzMDAsIDQyMDAsIDQ1MDAsIDQ4MDAsIDQzMDAsIDg1MDANCmBgYA0KV2UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBtZWFucyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdmFyaW91cyBpbmZlcmVuY2VzIGFib3V0IHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gbWVhbi4NCg0KYSkgQmFzZWQgb24gdGhlIGdpdmVuIGRhdGEsIGNhbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4/IEp1c3RpZnkgeW91ciBhbnN3ZXIuDQoNCkJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLCBJIHdpbGwgY3JlYXRlIGEgZGF0YSBzZXQgY2FsbGVkICdjb2ZmZWUnIHdpdGggdGhlIGdpdmVuIHZhbHVlcyBhYm92ZS4gQW4gY3JlYXRlIGEgaGlzdG9ncmFtIG9mIHRoZXNlIHZhbHVlcy4NCg0KYGBge3J9DQpjb2ZmZWUgPC0gYygyODUwLCAzMjAwLCAyOTAwLCAzMTAwLCAyOTUwLCA3ODAwLCA4MTAwLCA3OTAwLCAzMzAwLCAzMDUwLCA0MDAwLCA0MjAwLCAzMTUwLCAzNDAwLCA3NzAwLCA4MjAwLCAzMjUwLCA0NDAwLCAzMTAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwLCA4MjAwLCA4OTAwLCA4NzAwLCAzMjUwLCAzMDAwLCA0NjAwLCA0MTAwLCA4NDAwLCA4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCA4NDAwLCAzMzAwLCA0MjAwLCA0NTAwLCA0ODAwLCA0MzAwLCA4NTAwKQ0KaGlzdChjb2ZmZWUpDQpgYGANCg0KVGhlIGhpc3RvZ3JhbSBzaG93cyB0aGF0IHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGNvZmZlZSBvYnNlcnZhdGlvbnMgYXBwZWFyIHRvIGJlIGJpbW9kYWwuIFRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBkb2VzIG5vdCByZXF1aXJlIG5vcm1hbGl0eSwgb25seSBmaW5pdGUgbWVhbiBhbmQgdmFyaWFuY2UgYW5kIHRoYXQgdGhlIHNhbXBsZSBzaXplIGlzIHN1ZmZpY2llbnRseSBsYXJnZS4gVGhlIHNhbXBsZSBzaXplIGlzIHN1ZmZpY2llbnRseSBsYXJnZSwgc28gdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBiZSB1c2VkIHRvIGRlcml2ZSB0aGUgYXN5bXB0b3RpYyBzYW1wbGluZyBkaXN0cmlidXRpb24gaW4gdGhpcyBjYXNlLiBIb3dldmVyLCBpdCBpcyBzdGlsbCB3b3J0aCBub3RpbmcgdGhhdCB0aGUgZGF0YSBkb2VzIG5vdCBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uLCBidXQgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBjYW4gc3RpbGwgYmUgdXNlZC4gDQoNCg0KYikgQXBwbHkgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZXN0aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiAob2Z0ZW4gY2FsbGVkIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uKSBvZiB0aGUgc2FtcGxlIG1lYW4uIEdlbmVyYXRlIGEga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUgZnJvbSB0aGUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucyBhbmQgcGxvdCBpdC4gVGhlbiwgdXNlIHRoaXMgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiB0byB2YWxpZGF0ZSB5b3VyIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChhKS4gTWFrZSBzdXJlIHlvdXIgdmlzdWFscyBhcmUgZWZmZWN0aXZlIGluIGVuaGFuY2luZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZXNlIHJlc3VsdHMuDQoNCmBgYHtyfQ0KQiA8LSAxMDAwMA0KYm9vdF9tZWFucyA8LSByZXBsaWNhdGUoQiwgbWVhbihzYW1wbGUoY29mZmVlLCByZXBsYWNlID0gVFJVRSkpKQ0KDQojIEtlcm5lbCBEZW5zaXR5IFBsb3QNCnBsb3QoZGVuc2l0eShib290X21lYW5zKSwNCiAgICAgbWFpbj0iQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiBTYW1wbGUgTWVhbiIsDQogICAgIHhsYWI9IlNhbXBsZSBNZWFuIikNCg0KYWJsaW5lKHY9bWVhbihjb2ZmZWUpLCBjb2w9InJlZCIsIGx3ZD0yKQ0KYGBgDQoNClRoZSBib290c3RyYXAgYXBwcm9hY2ggc2hvd3MgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgZm9sbG93cyBhbiBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZSBhYm92ZSBncmFwaCBzaG93cyB0aGUga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUuIFRoaXMgdmFsaWRhdGVzIHRoZSBjb25jbHVzaW9uIG1hZGUgaW4gcGFydCBhIHRoYXQgaXQgaXMgYWxyaWdodCB0byBhcHBseSB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtLCBhbmQgdGhhdCBiZWNhdXNlIHRoZSBzYW1wbGUgc2l6ZSBpcyBzdWZmaWNpZW50bHkgbGFyZ2UgZm9sbG93aW5nIHRoZSByYW5kb20gc2FtcGxpbmcgYXBwcm9hY2ggd2lsbCByZXN1bHQgaW4gYSBkaXN0cmlidXRpb24gdGhhdCBpcyBhcHByb3hpbWF0ZWx5IG5vcm1hbCBldmVuIGlmIHRoZSBvcmlnaW5hbCBkaXN0cmlidXRpb24gd2FzIG5vdC4gVGhlIGJvb3RzdHJhcCBtZXRob2Qgd29ya3Mgd2VsbCBpbiB0aGlzIGNhc2UgZm9yIHByb3ZpZGluZyBhIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxpbmcgbWVhbi4gDQoNCg0KYykgUmVwZWF0IHRoZSBhbmFseXNpcyBpbiBwYXJ0cyAoYSkgYW5kIChiKSBmb3IgdGhlIHNhbXBsZSB2YXJpYW5jZS4NCg0KDQoNCmBgYHtyfQ0KYm9vdF92YXJzIDwtIHJlcGxpY2F0ZShCLCB2YXIoc2FtcGxlKGNvZmZlZSwgcmVwbGFjZSA9IFRSVUUpKSkNCg0KcGxvdChkZW5zaXR5KGJvb3RfdmFycyksDQogICAgIG1haW49IkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlIiwNCiAgICAgeGxhYj0iU2FtcGxlIFZhcmlhbmNlIikNCg0KYWJsaW5lKHY9dmFyKGNvZmZlZSksIGNvbD0icmVkIiwgbHdkPTIpDQoNCmBgYA0KDQoNClRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSBzaG93cyBzb21lIG5vdGljZWFibGUgc2tldyB0byB0aGUgbGVmdCwgaG93ZXZlciwgdGhpcyBza2V3IGlzIG5vdCB0b28gaW5jcmVkaWJseSBzZXZlcmUuIEl0IGlzIHdvcnRoIG5vdGluZyB0aGF0IHZhcmlhbmNlIG1lYXN1cmVtZW50cyB0ZW5kIHRvIGJlIG1vcmUgc2Vuc2l0aXZlIHRvIHNrZXduZXNzIHRoYW4gdGhhdCBvZiB0aGUgbWVhbi4gU28sIHRoaXMgaXMgbm90IHN1cnByaXNpbmcgdGhhdCB0aGUgc2FtcGxlIHZhcmlhbmNlIGlzIG5vdCBhcyBjbG9zZSB0byB0aGF0IG9mIGEgdHJ1ZSBub3JtYWwgZGlzdHJpYnV0aW9uIGNvbXBhcmVkIHRvIHRoZSBzYW1wbGUgbWVhbi4gSW4gdGhpcyBjYXNlLCB0aGUgYm9vdHN0cmFwIG1ldGhvZCB3b3VsZCBiZSBhIGdvb2QgY2hvaWNlIGZvciBhcHByb3hpbWF0aW5nIHRoZSBzYW1wbGUgdmFyaWFuY2UgZGlzdHJpYnV0aW9uIGR1ZSB0byBpdCBiZWluZyBhIG5vbnBhcmFtZXRyaWMgYXBwcm9hY2ggc28gdGhhdCB0aGUgYXNzdW1wdGlvbiBvZiBub3JtYWxpdHkgaXMgbm90IHJlcXVpcmVkLiBUaGlzIG1lYW5zIHRoYXQgZGVzcGl0ZSB0aGUgc2FtcGxlIHZhcmlhbmNlIGRpc3RyaWJ1dGlvbiBzaG93aW5nIHNvbWUgc2xpZ2h0IHNrZXduZXNzIHRvIHRoZSBsZWZ0LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBpcyBzdGlsbCBhIGdvb2QgY2hvaWNlIGZvciBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbi4gDQoNCg0KDQo=