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,

\[ Cs^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.

Essay:

A sampling distribution describes how a statistic such as the sample mean \(\bar{X}\) or sample variance \(S^2\) would vary across repeated samples of size \(n\) from the same population. There are two main approaches to obtaining sampling distributions: asymptotic methods and bootstrap methods.

Bootstrap Sampling Plan and Bootstrap Sampling Distribution

The bootstrap is a Monte Carlo simulation method that replaces the unknown population distribution \(F\) with the empirical distribution function \(\hat{F}_n\). The EDF assigns equal probability \(1/n\) to each observed data point and serves as a nonparametric estimate of \(F\).

The bootstrap procedure works as follows:

  1. Start with the observed i.i.d. sample \(x_1, \ldots, x_n\).
  2. Treat this sample as an approximation of the population.
  3. Draw a new sample of size \(n\) with replacement from the observed data.
  4. Compute the statistic of interest from this resample.
  5. Repeat the process \(B\) times.

The collection of replicated statistics forms the bootstrap sampling distribution. This simulated distribution can be used to estimate the standard error of a statistic, examine its variability, and support inference without relying on strong distributional assumptions.

The bootstrap requires:

  1. The original data are independent and identically distributed \(i.i.d.\).
  2. The sample reasonably represents the population.
  3. The sample size is preserved in each resample to maintain the correct level of variability.

Because the bootstrap samples from the empirical distribution rather than assuming a specific parametric form, it is considered a nonparametric method.

Asymptotic Sampling Distribution

Asymptotic sampling distributions come from large-sample theory. When the sample size increases, many statistics converge in distribution to a Normal distribution after appropriate centering and scaling. This idea is rooted in the Central Limit Theorem.

For example, if the observations are i.i.d. with finite variance, the sample mean becomes approximately Normally distributed as \(n\) grows. Similarly, under suitable moment conditions, the sample variance also has an approximate Normal distribution for large \(n\). These results allow us to use Normal approximations to perform inference.

Asymptotic methods require: 1. Independent and identically distributed observations. 2. Finite variance. 3. A sufficiently large sample size.

When to Use Each Method

Asymptotic methods are efficient when sample size is large and assumptions are satisfied. Bootstrap methods are useful when the sampling distribution is difficult to derive or when avoiding parametric assumptions.

In summary, asymptotic methods depend on theoretical convergence results, while bootstrap methods approximate the sampling distribution through repeated resampling from the empirical distribution.


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.

  1. 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.
# Coffee sales data 
x <- 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(x)
xbar <- mean(x)
s <- sd(x)

data.frame(n = n, mean = xbar, sd = s)
   n mean       sd
1 55 5250 2242.952
# Visual check on raw data distribution 

par(mfrow = c(1,2))


hist(x,
     probability = TRUE,
     breaks = 15,
     main = "Histogram of Coffee Sales",
     xlab = "Daily Sales (mL)")

lines(density(x), col = "blue", lwd = 2)


qqnorm(x, main = "Normal Q-Q Plot")
qqline(x, col = "red", lwd = 2)

par(mfrow = c(1,1))

Answer: Yes, the Central Limit Theorem can be applied here. Although the histogram shows two clusters (likely representing the two cafe locations), the CLT does not require the population to be normally distributed. It only requires that the observations are independent and have finite variance. Since the sample size is larger than 50, the sampling distribution of the sample mean can be approximated by

\[ \bar{X} \approx N\left(\mu, \frac{\sigma^2}{n}\right) \] Therefore, it is reasonable to use the asymptotic normal approximation for inference about the population mean.

  1. 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.
# Number of bootstrap replications
B <- 1000

# Store bootstrap sample means
boot.mean <- NULL

# Bootstrap loop
for(i in 1:B){
  
  # Resample WITH replacement
  boot.sample <- sample(x,size = n, replace = TRUE)
  
  # Compute mean of bootstrap sample
  boot.mean[i] <- mean(boot.sample)
}


hist(boot.mean,
     probability = TRUE,
     breaks = 20,
     main = "Bootstrap Sampling Distribution of Sample Mean",
     xlab = "Bootstrap Sample Means")

lines(density(boot.mean), col = "blue", lwd = 2)

Answer: The bootstrap sampling distribution of \(\bar{X}\) was generated by repeatedly resampling the data with replacement and computing the mean each time. The histogram and kernel density curve of the bootstrap means are approximately symmetric and bell-shaped, which supports the CLT-based conclusion in part (a) that the sampling distribution of the sample mean is reasonably approximated by a Normal distribution.

  1. Repeat the analysis in parts (a) and (b) for the sample variance.

Part a

s2 <- var(x)

mu4_hat <- mean((x - mean(x))^4)

asym.sd.var <- sqrt((mu4_hat - s2^2) / n)

data.frame(sample_variance = s2,
           asymptotic_sd = asym.sd.var)
  sample_variance asymptotic_sd
1         5030833      496426.1

Answer:Under large sample theory, when the fourth moment is finite, the sample variance has an approximate Normal distribution:

\[ s^2 \to N\left(\sigma^2, \frac{\mu_4-\sigma^4}{n} \right) \] Since the sample size is greater than 50 and the data have finite variability, the asymptotic Normal approximation can be considered. However, the accuracy may be affected by the shape of the distribution.

Part b

B <- 1000

boot.var <- NULL

for(i in 1:B){
  
  boot.sample <- sample(x,
                        size = n,
                        replace = TRUE)
  
  boot.var[i] <- var(boot.sample)
}

hist(boot.var,
     probability = TRUE,
     breaks = 20,
     main = "Bootstrap Sampling Distribution of Sample Variance",
     xlab = "Bootstrap Sample Variances")

lines(density(boot.var), col = "blue", lwd = 2)

Answer for Validation :The bootstrap distribution of the sample variance appears slightly skewed rather than perfectly symmetric. This suggests that the Normal approximation for the variance may be less accurate than for the mean. Therefore, while the asymptotic approximation can be used, the bootstrap distribution provides a more data-driven assessment of variability for the sample variance.

LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMzogRUNERiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIGFuZCBBcHBsaWNhdGlvbnMiDQphdXRob3I6ICJYaWFveWluZyBNYSAiDQpkYXRlOiAiIER1ZTogMDIvMTcvMjAyNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGtlZXBfbWQ6IHllcw0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lDQotLS0NCg0KYGBge2NzcywgZWNobyA9IEZBTFNFfQ0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtc2l6ZTogMS4yZW07DQogIGRpc3BsYXk6IGJsb2NrOw0KICBjb2xvcjogbmF2eTsNCiAgbWFyZ2luLWJvdHRvbTogMTBweDsNCn0NCg0KDQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjJweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCiMgY29kZSBjaHVuayBzcGVjaWZpZXMgd2hldGhlciB0aGUgUiBjb2RlLCB3YXJuaW5ncywgYW5kIG91dHB1dCANCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogIGxpYnJhcnkoZ2dwbG90MikNCn0NCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikNCiAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQoNCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikNCiAgbGlicmFyeShwbG90bHkpDQp9DQojIyMjDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBGQUxTRSwNCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkENCiAgICAgICAgICAgICAgICAgICAgICApICANCmBgYA0KIA0KDQpcDQoNCioqQXN5bXB0b3RpYyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIFZhcmlhbmNlKioNCg0KQXNzdW1lIHRoYXQgJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfbiBcfSBcdG8gRih4KSQgd2l0aCAkXG11ID0gRVtYXSQgYW5kICRcc2lnbWFeMiA9IFx0ZXh0e3Zhcn0oWCkkLiBEZW5vdGUgDQoNCiQkDQpzXjIgPSBcZnJhY3sxfXtuLTF9XHN1bV97aT0xfV5uICh4X2kgLSBcbXUpXjINCiQkDQoNCklmICRuJCBpcyBsYXJnZSwgDQoNCiQkDQpDc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNCg0Kd2hlcmUgJFxtdV80ID0gRVsoWF9pIC0gXG11KV40XSQgaXMgdGplIDR0aCBjZW50cmFsIG1vbWVudCB3aGljaCBjYW4gYmUgZXN0aW1hdGVkIGJ5DQoNCiQkDQpcaGF0e1xtdX1fNCA9IFxmcmFjezF9e259XHN1bV97aT0xfV5uKHhfaS1cYmFye3h9KV40Lg0KJCQNCg0KKipOb3RlKio6IFRoaXMgZGVzY3JpYmVzIHRoZSBhc3ltcHRvdGljIGNvbnZlcmdlbmNlIG9mIHRoZSBzYW1wbGUgdmFyaWFuY2UsIGZvbGxvd2luZyBmcm9tIHRoZSBjZW50cmFsIGxpbWl0IHRoZW9yZW0gKENMVCkuIFRoZSBzYW1wbGUgc2l6ZSByZXF1aXJlZCBmb3IgdGhpcyBhcHByb3hpbWF0aW9uIHRvIGhvbGQgaXMgc2l0dWF0aW9uLWRlcGVuZGVudC4NCg0KDQpcDQoNCiMjICoqUXVlc3Rpb24gMTogQXN5bXB0b3RpYyB2cyBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucyoqDQoNCldyaXRlIGFuIGVzc2F5IHN1bW1hcml6aW5nIHRoZSBjb25jZXB0cyBvZiBBc3ltcHRvdGljIGFuZCBCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9ucywgYWxvbmcgd2l0aCB0aGVpciBrZXkgYXBwbGljYXRpb25zLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkIGJlIGdyb3VuZGVkIGluIHlvdXIgcGVyc29uYWwgdW5kZXJzdGFuZGluZyBvZiB0aGUgbWF0ZXJpYWwuIEFueSBleHRlcm5hbCBzb3VyY2VzIGluY2x1ZGluZyBBSSB0b29scyBjb25zdWx0ZWQgbXVzdCBiZSBjbGVhcmx5IGNpdGVkLiANCg0KDQoqKkVzc2F5IFByb21wdCoqOiBEaXNjdXNzIHRoZSBjb25jZXB0cyBvZiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIHBsYW4sIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uLCBhbmQgdGhlIGFzeW1wdG90aWMgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGluIHRoZSBjb250ZXh0IG9mIHN0YXRpc3RpY3MgKGUuZy4sIHNhbXBsZSBtZWFuIGFuZCB2YXJpYW5jZSkgY29tcHV0ZWQgZnJvbSBhbiBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgKGkuaS5kLikgc2FtcGxlLiBZb3VyIGRpc2N1c3Npb24gc2hvdWxkOg0KDQoqIENsZWFybHkgb3V0bGluZSB0aGUga2V5IGFzc3VtcHRpb25zIHJlcXVpcmVkIGZvciBlYWNoIG1ldGhvZC4NCg0KKiBFeHBsYWluIHRoZSBwcmFjdGljYWwgYXBwbGljYXRpb24gb2YgZWFjaCBkaXN0cmlidXRpb24uDQoNCiogUHJvdmlkZSBndWlkYW5jZSBvbiB3aGVuIGFuZCB3aHkgb25lIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciB0aGUgb3RoZXIgaW4gc3RhdGlzdGljYWwgaW5mZXJlbmNlLg0KDQoqKkVzc2F5OioqDQoNCkEgKnNhbXBsaW5nIGRpc3RyaWJ1dGlvbiogZGVzY3JpYmVzIGhvdyBhIHN0YXRpc3RpYyBzdWNoIGFzIHRoZSBzYW1wbGUgbWVhbiBcKFxiYXJ7WH1cKSBvciBzYW1wbGUgdmFyaWFuY2UgXChTXjJcKSB3b3VsZCB2YXJ5IGFjcm9zcyByZXBlYXRlZCBzYW1wbGVzIG9mIHNpemUgXChuXCkgZnJvbSB0aGUgc2FtZSBwb3B1bGF0aW9uLiBUaGVyZSBhcmUgdHdvIG1haW4gYXBwcm9hY2hlcyB0byBvYnRhaW5pbmcgc2FtcGxpbmcgZGlzdHJpYnV0aW9uczogYXN5bXB0b3RpYyBtZXRob2RzIGFuZCBib290c3RyYXAgbWV0aG9kcy4NCg0KKipCb290c3RyYXAgU2FtcGxpbmcgUGxhbiBhbmQgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbioqDQoNClRoZSBib290c3RyYXAgaXMgYSBNb250ZSBDYXJsbyBzaW11bGF0aW9uIG1ldGhvZCB0aGF0IHJlcGxhY2VzIHRoZSB1bmtub3duIHBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIFwoRlwpIHdpdGggdGhlIGVtcGlyaWNhbCBkaXN0cmlidXRpb24gZnVuY3Rpb24gXChcaGF0e0Z9X25cKS4gVGhlIEVERiBhc3NpZ25zIGVxdWFsIHByb2JhYmlsaXR5IFwoMS9uXCkgdG8gZWFjaCBvYnNlcnZlZCBkYXRhIHBvaW50IGFuZCBzZXJ2ZXMgYXMgYSBub25wYXJhbWV0cmljIGVzdGltYXRlIG9mIFwoRlwpLg0KDQpUaGUgYm9vdHN0cmFwIHByb2NlZHVyZSB3b3JrcyBhcyBmb2xsb3dzOg0KDQoxLiBTdGFydCB3aXRoIHRoZSBvYnNlcnZlZCBpLmkuZC4gc2FtcGxlIFwoeF8xLCBcbGRvdHMsIHhfblwpLg0KMi4gVHJlYXQgdGhpcyBzYW1wbGUgYXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgcG9wdWxhdGlvbi4NCjMuIERyYXcgYSBuZXcgc2FtcGxlIG9mIHNpemUgXChuXCkgKip3aXRoIHJlcGxhY2VtZW50KiogZnJvbSB0aGUgb2JzZXJ2ZWQgZGF0YS4NCjQuIENvbXB1dGUgdGhlIHN0YXRpc3RpYyBvZiBpbnRlcmVzdCBmcm9tIHRoaXMgcmVzYW1wbGUuDQo1LiBSZXBlYXQgdGhlIHByb2Nlc3MgIFwoQlwpIHRpbWVzLg0KDQpUaGUgY29sbGVjdGlvbiBvZiByZXBsaWNhdGVkIHN0YXRpc3RpY3MgZm9ybXMgdGhlICoqYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbioqLiBUaGlzIHNpbXVsYXRlZCBkaXN0cmlidXRpb24gY2FuIGJlIHVzZWQgdG8gZXN0aW1hdGUgdGhlIHN0YW5kYXJkIGVycm9yIG9mIGEgc3RhdGlzdGljLCBleGFtaW5lIGl0cyB2YXJpYWJpbGl0eSwgYW5kIHN1cHBvcnQgaW5mZXJlbmNlIHdpdGhvdXQgcmVseWluZyBvbiBzdHJvbmcgZGlzdHJpYnV0aW9uYWwgYXNzdW1wdGlvbnMuDQoNClRoZSBib290c3RyYXAgcmVxdWlyZXM6DQoNCjEuIFRoZSBvcmlnaW5hbCBkYXRhIGFyZSBpbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgXChpLmkuZC5cKS4NCjIuIFRoZSBzYW1wbGUgcmVhc29uYWJseSByZXByZXNlbnRzIHRoZSBwb3B1bGF0aW9uLg0KMy4gVGhlIHNhbXBsZSBzaXplIGlzIHByZXNlcnZlZCBpbiBlYWNoIHJlc2FtcGxlIHRvIG1haW50YWluIHRoZSBjb3JyZWN0IGxldmVsIG9mIHZhcmlhYmlsaXR5Lg0KDQpCZWNhdXNlIHRoZSBib290c3RyYXAgc2FtcGxlcyBmcm9tIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIHJhdGhlciB0aGFuIGFzc3VtaW5nIGEgc3BlY2lmaWMgcGFyYW1ldHJpYyBmb3JtLCBpdCBpcyBjb25zaWRlcmVkIGEgbm9ucGFyYW1ldHJpYyBtZXRob2QuDQoNCioqQXN5bXB0b3RpYyBTYW1wbGluZyBEaXN0cmlidXRpb24qKg0KDQpBc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgY29tZSBmcm9tIGxhcmdlLXNhbXBsZSB0aGVvcnkuIFdoZW4gdGhlIHNhbXBsZSBzaXplIGluY3JlYXNlcywgbWFueSBzdGF0aXN0aWNzIGNvbnZlcmdlIGluIGRpc3RyaWJ1dGlvbiB0byBhIE5vcm1hbCBkaXN0cmlidXRpb24gYWZ0ZXIgYXBwcm9wcmlhdGUgY2VudGVyaW5nIGFuZCBzY2FsaW5nLiBUaGlzIGlkZWEgaXMgcm9vdGVkIGluIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0uDQoNCkZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2YXRpb25zIGFyZSBpLmkuZC4gd2l0aCBmaW5pdGUgdmFyaWFuY2UsIHRoZSBzYW1wbGUgbWVhbiBiZWNvbWVzIGFwcHJveGltYXRlbHkgTm9ybWFsbHkgZGlzdHJpYnV0ZWQgYXMgXChuXCkgZ3Jvd3MuIFNpbWlsYXJseSwgdW5kZXIgc3VpdGFibGUgbW9tZW50IGNvbmRpdGlvbnMsIHRoZSBzYW1wbGUgdmFyaWFuY2UgYWxzbyBoYXMgYW4gYXBwcm94aW1hdGUgTm9ybWFsIGRpc3RyaWJ1dGlvbiBmb3IgbGFyZ2UgXChuXCkuIFRoZXNlIHJlc3VsdHMgYWxsb3cgdXMgdG8gdXNlIE5vcm1hbCBhcHByb3hpbWF0aW9ucyB0byBwZXJmb3JtIGluZmVyZW5jZS4NCg0KQXN5bXB0b3RpYyBtZXRob2RzIHJlcXVpcmU6DQoxLiBJbmRlcGVuZGVudCBhbmQgaWRlbnRpY2FsbHkgZGlzdHJpYnV0ZWQgb2JzZXJ2YXRpb25zLg0KMi4gRmluaXRlIHZhcmlhbmNlLg0KMy4gQSBzdWZmaWNpZW50bHkgbGFyZ2Ugc2FtcGxlIHNpemUuDQoNCioqV2hlbiB0byBVc2UgRWFjaCBNZXRob2QqKg0KDQpBc3ltcHRvdGljIG1ldGhvZHMgYXJlIGVmZmljaWVudCB3aGVuIHNhbXBsZSBzaXplIGlzIGxhcmdlIGFuZCBhc3N1bXB0aW9ucyBhcmUgc2F0aXNmaWVkLiBCb290c3RyYXAgbWV0aG9kcyBhcmUgdXNlZnVsIHdoZW4gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBkaWZmaWN1bHQgdG8gZGVyaXZlIG9yIHdoZW4gYXZvaWRpbmcgcGFyYW1ldHJpYyBhc3N1bXB0aW9ucy4gDQoNCkluIHN1bW1hcnksIGFzeW1wdG90aWMgbWV0aG9kcyBkZXBlbmQgb24gdGhlb3JldGljYWwgY29udmVyZ2VuY2UgcmVzdWx0cywgd2hpbGUgYm9vdHN0cmFwIG1ldGhvZHMgYXBwcm94aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB0aHJvdWdoIHJlcGVhdGVkIHJlc2FtcGxpbmcgZnJvbSB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbi4NCg0KXA0KDQojIyAqKlF1ZXN0aW9uIDI6IERhaWx5IENvZmZlZSBTYWxlcyAoaW4gbUwpIGF0IFR3byBEaWZmZXJlbnQgQ2FmZSBMb2NhdGlvbnMqKg0KDQpUaGlzIGRhdGEgc2V0IHJlcHJlc2VudHMgdGhlIHZvbHVtZSBvZiByZWd1bGFyIGJyZXdlZCBjb2ZmZWUgc29sZCBwZXIgZGF5IChpbiBtaWxsaWxpdGVycykgYXQgdHdvIGRpZmZlcmVudCBjYWZlIGxvY2F0aW9ucyBvdmVyIGEgcGVyaW9kIG9mIDUwIGRheXMuIA0KDQpgYGANCjI4NTAsIDMyMDAsIDI5MDAsIDMxMDAsIDI5NTAsIDc4MDAsIDgxMDAsIDc5MDAsIDMzMDAsIDMwNTAsIDQwMDAsIDQyMDAsIDMxNTAsIDM0MDAsIDc3MDAsIDgyMDAsIA0KMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgDQo4ODAwLCAzMzUwLCA0NzAwLCAzMTAwLCA4MTAwLCAzMDUwLCA4MzAwLCA0MTAwLCAzMTAwLCA4MzAwLCA4OTAwLCA4MjAwLCA0NDAwLCA0NTAwLCAzMjUwLCA0NjAwLCANCjg0MDAsIDMzMDAsIDQyMDAsIDQ1MDAsIDQ4MDAsIDQzMDAsIDg1MDANCmBgYA0KV2UgYXJlIGludGVyZXN0ZWQgaW4gZmluZGluZyB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHNhbXBsZSBtZWFucyB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdmFyaW91cyBpbmZlcmVuY2VzIGFib3V0IHRoZSB1bmRlcmx5aW5nIHBvcHVsYXRpb24gbWVhbi4NCg0KYSkgQmFzZWQgb24gdGhlIGdpdmVuIGRhdGEsIGNhbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIGJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhc3ltcHRvdGljIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4/IEp1c3RpZnkgeW91ciBhbnN3ZXIuDQoNCmBgYHtyfQ0KIyBDb2ZmZWUgc2FsZXMgZGF0YSANCnggPC0gYygNCiAgMjg1MCwgMzIwMCwgMjkwMCwgMzEwMCwgMjk1MCwgNzgwMCwgODEwMCwgNzkwMCwgMzMwMCwgMzA1MCwgNDAwMCwgNDIwMCwNCiAgMzE1MCwgMzQwMCwgNzcwMCwgODIwMCwgMzI1MCwgNDQwMCwgMzEwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMCwNCiAgODIwMCwgODkwMCwgODcwMCwgMzI1MCwgMzAwMCwgNDYwMCwgNDEwMCwgODQwMCwgODgwMCwgMzM1MCwgNDcwMCwgMzEwMCwNCiAgODEwMCwgMzA1MCwgODMwMCwgNDEwMCwgMzEwMCwgODMwMCwgODkwMCwgODIwMCwgNDQwMCwgNDUwMCwgMzI1MCwgNDYwMCwNCiAgODQwMCwgMzMwMCwgNDIwMCwgNDUwMCwgNDgwMCwgNDMwMCwgODUwMA0KKQ0KDQpuIDwtIGxlbmd0aCh4KQ0KeGJhciA8LSBtZWFuKHgpDQpzIDwtIHNkKHgpDQoNCmRhdGEuZnJhbWUobiA9IG4sIG1lYW4gPSB4YmFyLCBzZCA9IHMpDQoNCiMgVmlzdWFsIGNoZWNrIG9uIHJhdyBkYXRhIGRpc3RyaWJ1dGlvbiANCg0KcGFyKG1mcm93ID0gYygxLDIpKQ0KDQoNCmhpc3QoeCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAxNSwNCiAgICAgbWFpbiA9ICJIaXN0b2dyYW0gb2YgQ29mZmVlIFNhbGVzIiwNCiAgICAgeGxhYiA9ICJEYWlseSBTYWxlcyAobUwpIikNCg0KbGluZXMoZGVuc2l0eSh4KSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQoNCnFxbm9ybSh4LCBtYWluID0gIk5vcm1hbCBRLVEgUGxvdCIpDQpxcWxpbmUoeCwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQoNCnBhcihtZnJvdyA9IGMoMSwxKSkNCg0KYGBgDQoqKkFuc3dlcioqOiBZZXMsIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gY2FuIGJlIGFwcGxpZWQgaGVyZS4gQWx0aG91Z2ggdGhlIGhpc3RvZ3JhbSBzaG93cyB0d28gY2x1c3RlcnMgKGxpa2VseSByZXByZXNlbnRpbmcgdGhlIHR3byBjYWZlIGxvY2F0aW9ucyksIHRoZSBDTFQgZG9lcyBub3QgcmVxdWlyZSB0aGUgcG9wdWxhdGlvbiB0byBiZSBub3JtYWxseSBkaXN0cmlidXRlZC4gSXQgb25seSByZXF1aXJlcyB0aGF0IHRoZSBvYnNlcnZhdGlvbnMgYXJlIGluZGVwZW5kZW50IGFuZCBoYXZlIGZpbml0ZSB2YXJpYW5jZS4gU2luY2UgdGhlIHNhbXBsZSBzaXplIGlzIGxhcmdlciB0aGFuIDUwLCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiBjYW4gYmUgYXBwcm94aW1hdGVkIGJ5DQoNCiQkDQpcYmFye1h9IFxhcHByb3ggTlxsZWZ0KFxtdSwgXGZyYWN7XHNpZ21hXjJ9e259XHJpZ2h0KQ0KJCQNClRoZXJlZm9yZSwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlIGFzeW1wdG90aWMgbm9ybWFsIGFwcHJveGltYXRpb24gZm9yIGluZmVyZW5jZSBhYm91dCB0aGUgcG9wdWxhdGlvbiBtZWFuLg0KDQoNCg0KYikgQXBwbHkgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gZXN0aW1hdGUgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiAob2Z0ZW4gY2FsbGVkIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uKSBvZiB0aGUgc2FtcGxlIG1lYW4uIEdlbmVyYXRlIGEga2VybmVsIGRlbnNpdHkgZXN0aW1hdGUgZnJvbSB0aGUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucyBhbmQgcGxvdCBpdC4gVGhlbiwgdXNlIHRoaXMgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiB0byB2YWxpZGF0ZSB5b3VyIGNvbmNsdXNpb24gZnJvbSBwYXJ0IChhKS4gTWFrZSBzdXJlIHlvdXIgdmlzdWFscyBhcmUgZWZmZWN0aXZlIGluIGVuaGFuY2luZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZXNlIHJlc3VsdHMuDQoNCmBgYHtyfQ0KIyBOdW1iZXIgb2YgYm9vdHN0cmFwIHJlcGxpY2F0aW9ucw0KQiA8LSAxMDAwDQoNCiMgU3RvcmUgYm9vdHN0cmFwIHNhbXBsZSBtZWFucw0KYm9vdC5tZWFuIDwtIE5VTEwNCg0KIyBCb290c3RyYXAgbG9vcA0KZm9yKGkgaW4gMTpCKXsNCiAgDQogICMgUmVzYW1wbGUgV0lUSCByZXBsYWNlbWVudA0KICBib290LnNhbXBsZSA8LSBzYW1wbGUoeCxzaXplID0gbiwgcmVwbGFjZSA9IFRSVUUpDQogIA0KICAjIENvbXB1dGUgbWVhbiBvZiBib290c3RyYXAgc2FtcGxlDQogIGJvb3QubWVhbltpXSA8LSBtZWFuKGJvb3Quc2FtcGxlKQ0KfQ0KDQoNCmhpc3QoYm9vdC5tZWFuLA0KICAgICBwcm9iYWJpbGl0eSA9IFRSVUUsDQogICAgIGJyZWFrcyA9IDIwLA0KICAgICBtYWluID0gIkJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgU2FtcGxlIE1lYW4iLA0KICAgICB4bGFiID0gIkJvb3RzdHJhcCBTYW1wbGUgTWVhbnMiKQ0KDQpsaW5lcyhkZW5zaXR5KGJvb3QubWVhbiksIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCmBgYA0KDQoqKkFuc3dlcioqOg0KVGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgXChcYmFye1h9XCkgd2FzIGdlbmVyYXRlZCBieSByZXBlYXRlZGx5IHJlc2FtcGxpbmcgdGhlIGRhdGEgd2l0aCByZXBsYWNlbWVudCBhbmQgY29tcHV0aW5nIHRoZSBtZWFuIGVhY2ggdGltZS4gVGhlIGhpc3RvZ3JhbSBhbmQga2VybmVsIGRlbnNpdHkgY3VydmUgb2YgdGhlIGJvb3RzdHJhcCBtZWFucyBhcmUgYXBwcm94aW1hdGVseSBzeW1tZXRyaWMgYW5kIGJlbGwtc2hhcGVkLCB3aGljaCBzdXBwb3J0cyB0aGUgQ0xULWJhc2VkIGNvbmNsdXNpb24gaW4gcGFydCAoYSkgdGhhdCB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBzYW1wbGUgbWVhbiBpcyByZWFzb25hYmx5IGFwcHJveGltYXRlZCBieSBhIE5vcm1hbCBkaXN0cmlidXRpb24uDQoNCg0KYykgUmVwZWF0IHRoZSBhbmFseXNpcyBpbiBwYXJ0cyAoYSkgYW5kIChiKSBmb3IgdGhlIHNhbXBsZSB2YXJpYW5jZS4NCg0KKipQYXJ0IGEqKg0KYGBge3J9DQoNCnMyIDwtIHZhcih4KQ0KDQptdTRfaGF0IDwtIG1lYW4oKHggLSBtZWFuKHgpKV40KQ0KDQphc3ltLnNkLnZhciA8LSBzcXJ0KChtdTRfaGF0IC0gczJeMikgLyBuKQ0KDQpkYXRhLmZyYW1lKHNhbXBsZV92YXJpYW5jZSA9IHMyLA0KICAgICAgICAgICBhc3ltcHRvdGljX3NkID0gYXN5bS5zZC52YXIpDQoNCmBgYA0KDQoqKkFuc3dlcioqOlVuZGVyIGxhcmdlIHNhbXBsZSB0aGVvcnksIHdoZW4gdGhlIGZvdXJ0aCBtb21lbnQgaXMgZmluaXRlLCB0aGUgc2FtcGxlIHZhcmlhbmNlIGhhcyBhbiBhcHByb3hpbWF0ZSBOb3JtYWwgZGlzdHJpYnV0aW9uOg0KDQokJA0Kc14yIFx0byBOXGxlZnQoXHNpZ21hXjIsICBcZnJhY3tcbXVfNC1cc2lnbWFeNH17bn0gXHJpZ2h0KQ0KJCQNClNpbmNlIHRoZSBzYW1wbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gNTAgYW5kIHRoZSBkYXRhIGhhdmUgZmluaXRlIHZhcmlhYmlsaXR5LCB0aGUgYXN5bXB0b3RpYyBOb3JtYWwgYXBwcm94aW1hdGlvbiBjYW4gYmUgY29uc2lkZXJlZC4gSG93ZXZlciwgdGhlIGFjY3VyYWN5IG1heSBiZSBhZmZlY3RlZCBieSB0aGUgc2hhcGUgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCg0KKipQYXJ0IGIqKg0KDQpgYGB7cn0NCg0KQiA8LSAxMDAwDQoNCmJvb3QudmFyIDwtIE5VTEwNCg0KZm9yKGkgaW4gMTpCKXsNCiAgDQogIGJvb3Quc2FtcGxlIDwtIHNhbXBsZSh4LA0KICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IG4sDQogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlID0gVFJVRSkNCiAgDQogIGJvb3QudmFyW2ldIDwtIHZhcihib290LnNhbXBsZSkNCn0NCg0KaGlzdChib290LnZhciwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAyMCwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIFNhbXBsZSBWYXJpYW5jZSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBWYXJpYW5jZXMiKQ0KDQpsaW5lcyhkZW5zaXR5KGJvb3QudmFyKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQpgYGANCg0KKipBbnN3ZXIgZm9yIFZhbGlkYXRpb24gKio6VGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gb2YgdGhlIHNhbXBsZSB2YXJpYW5jZSBhcHBlYXJzIHNsaWdodGx5IHNrZXdlZCByYXRoZXIgdGhhbiBwZXJmZWN0bHkgc3ltbWV0cmljLiBUaGlzIHN1Z2dlc3RzIHRoYXQgdGhlIE5vcm1hbCBhcHByb3hpbWF0aW9uIGZvciB0aGUgdmFyaWFuY2UgbWF5IGJlIGxlc3MgYWNjdXJhdGUgdGhhbiBmb3IgdGhlIG1lYW4uIFRoZXJlZm9yZSwgd2hpbGUgdGhlIGFzeW1wdG90aWMgYXBwcm94aW1hdGlvbiBjYW4gYmUgdXNlZCwgdGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gcHJvdmlkZXMgYSBtb3JlIGRhdGEtZHJpdmVuIGFzc2Vzc21lbnQgb2YgdmFyaWFiaWxpdHkgZm9yIHRoZSBzYW1wbGUgdmFyaWFuY2UuDQoNCg==