1 Description of the Variable

In this assignment, I study the variable AnimalProducts, which represents the percentage of protein intake obtained from animal-based food sources for each country in the dataset.

The goal is to estimate the population mean of this variable and construct confidence intervals using:

  1. A classical t-based confidence interval learned in prior statistics courses, and
  2. A bootstrap confidence interval constructed using resampling methods introduced this week.

2 Data Import and Exploration

data_path <- "C:\\Users\\rg03\\Downloads\\w02-Protein_Supply_Quantity_Data.csv"
data <- read.csv(data_path)

x <- data$AnimalProducts
x <- na.omit(x)

length(x)
## [1] 170
summary(x)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   4.456  14.461  21.853  21.232  28.299  35.786

Interpretation (numeric).
After removing missing values, the sample contains n = 170 countries. The sample mean of AnimalProducts is 21.232%, and the median is 21.853%, which are close and suggest the distribution is roughly symmetric. The variability across countries is large: values range from 4.456% to 35.786%. The middle 50% of countries fall between 14.461% (1st quartile) and 28.299% (3rd quartile). This substantial spread motivates constructing confidence intervals to quantify uncertainty in the population mean.

3 Classical Confidence Interval for the Mean

3.1 Rationale

To estimate the population mean \(\mu\) of AnimalProducts, we construct a 95% confidence interval using a t-based interval:

\[ \bar{x} \pm t_{\alpha/2,\,n-1}\frac{s}{\sqrt{n}} \]

n <- length(x)
xbar <- mean(x)
s <- sd(x)

alpha <- 0.05
t_crit <- qt(1 - alpha/2, df = n - 1)

ci_lower <- xbar - t_crit * s / sqrt(n)
ci_upper <- xbar + t_crit * s / sqrt(n)

c(n = n, xbar = xbar, s = s)
##          n       xbar          s 
## 170.000000  21.232152   7.921757
c(Lower = ci_lower, Upper = ci_upper)
##    Lower    Upper 
## 20.03275 22.43156

Interpretation
The sample mean is \(\bar{x} = 21.232\%\). The 95% classical t-based confidence interval for the population mean is:

\[ (20.033\%,\; 22.432\%). \]

This means the true population mean percentage of protein intake from animal products is plausibly between about 20.0% and 22.4%. The interval width is about 2.40 percentage points, which is fairly narrow due to the large sample size (n = 170). Under repeated sampling, about 95% of intervals constructed using this method would contain the true mean.

4 Bootstrap Confidence Interval for the Mean

4.1 Rationale

The bootstrap method estimates the sampling distribution of the sample mean by repeatedly resampling the observed data with replacement. Each bootstrap resample has the same sample size n, and a sample mean is computed for each resample. This provides an empirical approximation to the sampling distribution of \(\bar{x}\) without relying strongly on normality assumptions.

B <- 10000
boot_means <- numeric(B)

for (b in 1:B) {
  boot_sample <- sample(x, size = n, replace = TRUE)
  boot_means[b] <- mean(boot_sample)
}

Interpretation
We generated B = 10,000 bootstrap resamples, each consisting of n = 170 observations drawn with replacement from the original sample. For each resample we computed the sample mean. The resulting set of 10,000 bootstrap means forms an empirical sampling distribution for the mean.

4.2 Bootstrap Sampling Distribution of the Sample Mean

hist(
  boot_means,
  breaks = 40,
  main = "Bootstrap Sampling Distribution of the Sample Mean",
  xlab = "Bootstrap Sample Means",
  col = "lightblue",
  border = "white"
)

abline(v = xbar, col = "red", lwd = 2)

Interpretation
The bootstrap sampling distribution is centered near the observed sample mean (21.232%), shown by the red vertical line. The distribution is approximately symmetric and bell-shaped, suggesting the sampling distribution of the mean is close to normal. This supports the idea that the classical t-based confidence interval is reasonable here while still allowing the bootstrap method to confirm inference without heavy parametric assumptions.

4.3 Bootstrap Percentile Confidence Interval

We construct a 95% bootstrap percentile confidence interval using the 2.5th and 97.5th percentiles of the bootstrap means.

boot_ci <- quantile(boot_means, probs = c(0.025, 0.975))
boot_ci
##     2.5%    97.5% 
## 20.05465 22.39994

Interpretation
The 95% bootstrap percentile confidence interval is:

\[ (20.055\%,\; 22.400\%). \]

This interval contains the middle 95% of the bootstrap sampling distribution of the mean. Its width is approximately 2.35 percentage points, which is extremely close to the classical interval width.

5 Comparison of the Two Confidence Intervals

ci_table <- rbind(
  Classical_CI = c(ci_lower, ci_upper),
  Bootstrap_CI = as.numeric(boot_ci)
)
colnames(ci_table) <- c("Lower", "Upper")
ci_table
##                 Lower    Upper
## Classical_CI 20.03275 22.43156
## Bootstrap_CI 20.05465 22.39994

Interpretation
The two confidence intervals are nearly identical:

  • Classical 95% CI: \((20.033\%, 22.432\%)\)
  • Bootstrap 95% CI: \((20.055\%, 22.400\%)\)

Both intervals are centered around the same mean (about 21.23%) and have almost the same width. This close agreement suggests that the t-based method performs well for this dataset and that the bootstrap procedure confirms the stability of the mean estimate and its uncertainty.

6 Conclusion

Using AnimalProducts from n = 170 countries, the estimated mean percentage of protein intake from animal-based food sources is 21.232%.

  • The classical 95% t-based confidence interval is \((20.033\%, 22.432\%)\).
  • The bootstrap 95% percentile confidence interval is \((20.055\%, 22.400\%)\).

Because these two intervals are extremely similar, they lead to the same substantive conclusion: the population mean percentage of protein intake from animal products across countries is likely between about 20% and 22.5%, and the estimate is stable under both classical and bootstrap inference methods.

LS0tDQp0aXRsZTogIkFuYWx5emluZyBBbmltYWwgUHJvZHVjdHMgd2l0aCBCb290c3RyYXBwaW5nIg0KYXV0aG9yOiAiUnlhbiBHb3JtYW4iDQpkYXRlOiAiMjAyNS0wOS0wMiINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPg0KaDEudGl0bGUgeyBmb250LXNpemU6IDI0cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogRGFya1JlZDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7IH0NCmg0LmF1dGhvciB7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBEYXJrUmVkOyB0ZXh0LWFsaWduOiBjZW50ZXI7IH0NCmg0LmRhdGUgeyBmb250LXNpemU6IDE4cHg7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogRGFya0JsdWU7IHRleHQtYWxpZ246IGNlbnRlcjsgfQ0KDQpoMSB7IGZvbnQtc2l6ZTogMjJweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoMiB7IGZvbnQtc2l6ZTogMjBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoMyB7IGZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBuYXZ5OyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQpoNCB7IGZvbnQtc2l6ZTogMThweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiBkYXJrcmVkOyB0ZXh0LWFsaWduOiBsZWZ0OyB9DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCjwvc3R5bGU+DQpgYGANCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQoNCm5lZWRlZCA8LSBjKCJrbml0ciIpDQoNCmZvciAocCBpbiBuZWVkZWQpIHsNCiAgaWYgKCFyZXF1aXJlKHAsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKHAsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQogICAgbGlicmFyeShwLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQogIH0NCn0NCg0Kc2V0LnNlZWQoMzIxKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGVjaG8gICAgPSBUUlVFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIG1lc3NhZ2UgPSBGQUxTRSwNCiAgZmlnLmFsaWduID0gImNlbnRlciIsDQogIGZpZy5wb3MgID0gImh0Ig0KKQ0KYGBgDQoNCiMgIERlc2NyaXB0aW9uIG9mIHRoZSBWYXJpYWJsZQ0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIEkgc3R1ZHkgdGhlIHZhcmlhYmxlICoqQW5pbWFsUHJvZHVjdHMqKiwgd2hpY2ggcmVwcmVzZW50cyB0aGUgKipwZXJjZW50YWdlIG9mIHByb3RlaW4gaW50YWtlIG9idGFpbmVkIGZyb20gYW5pbWFsLWJhc2VkIGZvb2Qgc291cmNlcyoqIGZvciBlYWNoIGNvdW50cnkgaW4gdGhlIGRhdGFzZXQuDQoNClRoZSBnb2FsIGlzIHRvIGVzdGltYXRlIHRoZSAqKnBvcHVsYXRpb24gbWVhbioqIG9mIHRoaXMgdmFyaWFibGUgYW5kIGNvbnN0cnVjdCBjb25maWRlbmNlIGludGVydmFscyB1c2luZzoNCg0KMS4gQSBjbGFzc2ljYWwgdC1iYXNlZCBjb25maWRlbmNlIGludGVydmFsIGxlYXJuZWQgaW4gcHJpb3Igc3RhdGlzdGljcyBjb3Vyc2VzLCBhbmQgIA0KMi4gQSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBjb25zdHJ1Y3RlZCB1c2luZyByZXNhbXBsaW5nIG1ldGhvZHMgaW50cm9kdWNlZCB0aGlzIHdlZWsuDQoNCiMgIERhdGEgSW1wb3J0IGFuZCBFeHBsb3JhdGlvbg0KDQpgYGB7ciBkYXRhLWltcG9ydH0NCmRhdGFfcGF0aCA8LSAiQzpcXFVzZXJzXFxyZzAzXFxEb3dubG9hZHNcXHcwMi1Qcm90ZWluX1N1cHBseV9RdWFudGl0eV9EYXRhLmNzdiINCmRhdGEgPC0gcmVhZC5jc3YoZGF0YV9wYXRoKQ0KDQp4IDwtIGRhdGEkQW5pbWFsUHJvZHVjdHMNCnggPC0gbmEub21pdCh4KQ0KDQpsZW5ndGgoeCkNCnN1bW1hcnkoeCkNCmBgYA0KDQoqKkludGVycHJldGF0aW9uIChudW1lcmljKS4qKiAgDQpBZnRlciByZW1vdmluZyBtaXNzaW5nIHZhbHVlcywgdGhlIHNhbXBsZSBjb250YWlucyAqKm4gPSAxNzAgY291bnRyaWVzKiouIFRoZSBzYW1wbGUgbWVhbiBvZiBgQW5pbWFsUHJvZHVjdHNgIGlzICoqMjEuMjMyJSoqLCBhbmQgdGhlIG1lZGlhbiBpcyAqKjIxLjg1MyUqKiwgd2hpY2ggYXJlIGNsb3NlIGFuZCBzdWdnZXN0IHRoZSBkaXN0cmlidXRpb24gaXMgcm91Z2hseSBzeW1tZXRyaWMuIFRoZSB2YXJpYWJpbGl0eSBhY3Jvc3MgY291bnRyaWVzIGlzIGxhcmdlOiB2YWx1ZXMgcmFuZ2UgZnJvbSAqKjQuNDU2JSoqIHRvICoqMzUuNzg2JSoqLiBUaGUgbWlkZGxlIDUwJSBvZiBjb3VudHJpZXMgZmFsbCBiZXR3ZWVuICoqMTQuNDYxJSoqICgxc3QgcXVhcnRpbGUpIGFuZCAqKjI4LjI5OSUqKiAoM3JkIHF1YXJ0aWxlKS4gVGhpcyBzdWJzdGFudGlhbCBzcHJlYWQgbW90aXZhdGVzIGNvbnN0cnVjdGluZyBjb25maWRlbmNlIGludGVydmFscyB0byBxdWFudGlmeSB1bmNlcnRhaW50eSBpbiB0aGUgcG9wdWxhdGlvbiBtZWFuLg0KDQojICBDbGFzc2ljYWwgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgdGhlIE1lYW4NCg0KIyMgIFJhdGlvbmFsZQ0KDQpUbyBlc3RpbWF0ZSB0aGUgcG9wdWxhdGlvbiBtZWFuIFwoXG11XCkgb2YgYEFuaW1hbFByb2R1Y3RzYCwgd2UgY29uc3RydWN0IGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgdXNpbmcgYSAqKnQtYmFzZWQgaW50ZXJ2YWwqKjoNCg0KXFsNClxiYXJ7eH0gXHBtIHRfe1xhbHBoYS8yLFwsbi0xfVxmcmFje3N9e1xzcXJ0e259fQ0KXF0NCg0KYGBge3IgY2xhc3NpY2FsLWNpfQ0KbiA8LSBsZW5ndGgoeCkNCnhiYXIgPC0gbWVhbih4KQ0KcyA8LSBzZCh4KQ0KDQphbHBoYSA8LSAwLjA1DQp0X2NyaXQgPC0gcXQoMSAtIGFscGhhLzIsIGRmID0gbiAtIDEpDQoNCmNpX2xvd2VyIDwtIHhiYXIgLSB0X2NyaXQgKiBzIC8gc3FydChuKQ0KY2lfdXBwZXIgPC0geGJhciArIHRfY3JpdCAqIHMgLyBzcXJ0KG4pDQoNCmMobiA9IG4sIHhiYXIgPSB4YmFyLCBzID0gcykNCmMoTG93ZXIgPSBjaV9sb3dlciwgVXBwZXIgPSBjaV91cHBlcikNCmBgYA0KDQoqKkludGVycHJldGF0aW9uKiogIA0KVGhlIHNhbXBsZSBtZWFuIGlzICoqXChcYmFye3h9ID0gMjEuMjMyXCVcKSoqLiBUaGUgKio5NSUgY2xhc3NpY2FsIHQtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGZvciB0aGUgcG9wdWxhdGlvbiBtZWFuIGlzOg0KDQpcWw0KKDIwLjAzM1wlLFw7IDIyLjQzMlwlKS4NClxdDQoNClRoaXMgbWVhbnMgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIHBlcmNlbnRhZ2Ugb2YgcHJvdGVpbiBpbnRha2UgZnJvbSBhbmltYWwgcHJvZHVjdHMgaXMgcGxhdXNpYmx5IGJldHdlZW4gYWJvdXQgKioyMC4wJSBhbmQgMjIuNCUqKi4gVGhlIGludGVydmFsIHdpZHRoIGlzIGFib3V0ICoqMi40MCBwZXJjZW50YWdlIHBvaW50cyoqLCB3aGljaCBpcyBmYWlybHkgbmFycm93IGR1ZSB0byB0aGUgbGFyZ2Ugc2FtcGxlIHNpemUgKCoqbiA9IDE3MCoqKS4gVW5kZXIgcmVwZWF0ZWQgc2FtcGxpbmcsIGFib3V0IDk1JSBvZiBpbnRlcnZhbHMgY29uc3RydWN0ZWQgdXNpbmcgdGhpcyBtZXRob2Qgd291bGQgY29udGFpbiB0aGUgdHJ1ZSBtZWFuLg0KDQojICBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgdGhlIE1lYW4NCg0KIyMgIFJhdGlvbmFsZQ0KDQpUaGUgYm9vdHN0cmFwIG1ldGhvZCBlc3RpbWF0ZXMgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc2FtcGxlIG1lYW4gYnkgcmVwZWF0ZWRseSByZXNhbXBsaW5nIHRoZSBvYnNlcnZlZCBkYXRhICoqd2l0aCByZXBsYWNlbWVudCoqLiBFYWNoIGJvb3RzdHJhcCByZXNhbXBsZSBoYXMgdGhlICoqc2FtZSBzYW1wbGUgc2l6ZSBuKiosIGFuZCBhIHNhbXBsZSBtZWFuIGlzIGNvbXB1dGVkIGZvciBlYWNoIHJlc2FtcGxlLiBUaGlzIHByb3ZpZGVzIGFuIGVtcGlyaWNhbCBhcHByb3hpbWF0aW9uIHRvIHRoZSBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgXChcYmFye3h9XCkgd2l0aG91dCByZWx5aW5nIHN0cm9uZ2x5IG9uIG5vcm1hbGl0eSBhc3N1bXB0aW9ucy4NCg0KYGBge3IgYm9vdHN0cmFwfQ0KQiA8LSAxMDAwMA0KYm9vdF9tZWFucyA8LSBudW1lcmljKEIpDQoNCmZvciAoYiBpbiAxOkIpIHsNCiAgYm9vdF9zYW1wbGUgPC0gc2FtcGxlKHgsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgYm9vdF9tZWFuc1tiXSA8LSBtZWFuKGJvb3Rfc2FtcGxlKQ0KfQ0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKiAgDQpXZSBnZW5lcmF0ZWQgKipCID0gMTAsMDAwIGJvb3RzdHJhcCByZXNhbXBsZXMqKiwgZWFjaCBjb25zaXN0aW5nIG9mICoqbiA9IDE3MCoqIG9ic2VydmF0aW9ucyBkcmF3biB3aXRoIHJlcGxhY2VtZW50IGZyb20gdGhlIG9yaWdpbmFsIHNhbXBsZS4gRm9yIGVhY2ggcmVzYW1wbGUgd2UgY29tcHV0ZWQgdGhlIHNhbXBsZSBtZWFuLiBUaGUgcmVzdWx0aW5nIHNldCBvZiAxMCwwMDAgYm9vdHN0cmFwIG1lYW5zIGZvcm1zIGFuIGVtcGlyaWNhbCBzYW1wbGluZyBkaXN0cmlidXRpb24gZm9yIHRoZSBtZWFuLg0KDQojIyAgQm9vdHN0cmFwIFNhbXBsaW5nIERpc3RyaWJ1dGlvbiBvZiB0aGUgU2FtcGxlIE1lYW4NCg0KYGBge3IgYm9vdHN0cmFwLXBsb3R9DQpoaXN0KA0KICBib290X21lYW5zLA0KICBicmVha3MgPSA0MCwNCiAgbWFpbiA9ICJCb290c3RyYXAgU2FtcGxpbmcgRGlzdHJpYnV0aW9uIG9mIHRoZSBTYW1wbGUgTWVhbiIsDQogIHhsYWIgPSAiQm9vdHN0cmFwIFNhbXBsZSBNZWFucyIsDQogIGNvbCA9ICJsaWdodGJsdWUiLA0KICBib3JkZXIgPSAid2hpdGUiDQopDQoNCmFibGluZSh2ID0geGJhciwgY29sID0gInJlZCIsIGx3ZCA9IDIpDQpgYGANCg0KKipJbnRlcnByZXRhdGlvbioqICANClRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGlzIGNlbnRlcmVkIG5lYXIgdGhlIG9ic2VydmVkIHNhbXBsZSBtZWFuICgqKjIxLjIzMiUqKiksIHNob3duIGJ5IHRoZSByZWQgdmVydGljYWwgbGluZS4gVGhlIGRpc3RyaWJ1dGlvbiBpcyBhcHByb3hpbWF0ZWx5IHN5bW1ldHJpYyBhbmQgYmVsbC1zaGFwZWQsIHN1Z2dlc3RpbmcgdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbWVhbiBpcyBjbG9zZSB0byBub3JtYWwuIFRoaXMgc3VwcG9ydHMgdGhlIGlkZWEgdGhhdCB0aGUgY2xhc3NpY2FsIHQtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyByZWFzb25hYmxlIGhlcmUgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGJvb3RzdHJhcCBtZXRob2QgdG8gY29uZmlybSBpbmZlcmVuY2Ugd2l0aG91dCBoZWF2eSBwYXJhbWV0cmljIGFzc3VtcHRpb25zLg0KDQojIyAgQm9vdHN0cmFwIFBlcmNlbnRpbGUgQ29uZmlkZW5jZSBJbnRlcnZhbA0KDQpXZSBjb25zdHJ1Y3QgYSA5NSUgYm9vdHN0cmFwIHBlcmNlbnRpbGUgY29uZmlkZW5jZSBpbnRlcnZhbCB1c2luZyB0aGUgMi41dGggYW5kIDk3LjV0aCBwZXJjZW50aWxlcyBvZiB0aGUgYm9vdHN0cmFwIG1lYW5zLg0KDQpgYGB7ciBib290c3RyYXAtY2l9DQpib290X2NpIDwtIHF1YW50aWxlKGJvb3RfbWVhbnMsIHByb2JzID0gYygwLjAyNSwgMC45NzUpKQ0KYm9vdF9jaQ0KYGBgDQoNCioqSW50ZXJwcmV0YXRpb24qKiAgDQpUaGUgKio5NSUgYm9vdHN0cmFwIHBlcmNlbnRpbGUgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGlzOg0KDQpcWw0KKDIwLjA1NVwlLFw7IDIyLjQwMFwlKS4NClxdDQoNClRoaXMgaW50ZXJ2YWwgY29udGFpbnMgdGhlIG1pZGRsZSA5NSUgb2YgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gb2YgdGhlIG1lYW4uIEl0cyB3aWR0aCBpcyBhcHByb3hpbWF0ZWx5ICoqMi4zNSBwZXJjZW50YWdlIHBvaW50cyoqLCB3aGljaCBpcyBleHRyZW1lbHkgY2xvc2UgdG8gdGhlIGNsYXNzaWNhbCBpbnRlcnZhbCB3aWR0aC4NCg0KIyAgQ29tcGFyaXNvbiBvZiB0aGUgVHdvIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCmBgYHtyIGNvbXBhcmV9DQpjaV90YWJsZSA8LSByYmluZCgNCiAgQ2xhc3NpY2FsX0NJID0gYyhjaV9sb3dlciwgY2lfdXBwZXIpLA0KICBCb290c3RyYXBfQ0kgPSBhcy5udW1lcmljKGJvb3RfY2kpDQopDQpjb2xuYW1lcyhjaV90YWJsZSkgPC0gYygiTG93ZXIiLCAiVXBwZXIiKQ0KY2lfdGFibGUNCmBgYA0KDQoqKkludGVycHJldGF0aW9uKiogIA0KVGhlIHR3byBjb25maWRlbmNlIGludGVydmFscyBhcmUgbmVhcmx5IGlkZW50aWNhbDoNCg0KLSAqKkNsYXNzaWNhbCA5NSUgQ0k6KiogXCgoMjAuMDMzXCUsIDIyLjQzMlwlKVwpICANCi0gKipCb290c3RyYXAgOTUlIENJOioqIFwoKDIwLjA1NVwlLCAyMi40MDBcJSlcKQ0KDQpCb3RoIGludGVydmFscyBhcmUgY2VudGVyZWQgYXJvdW5kIHRoZSBzYW1lIG1lYW4gKGFib3V0ICoqMjEuMjMlKiopIGFuZCBoYXZlIGFsbW9zdCB0aGUgc2FtZSB3aWR0aC4gVGhpcyBjbG9zZSBhZ3JlZW1lbnQgc3VnZ2VzdHMgdGhhdCB0aGUgdC1iYXNlZCBtZXRob2QgcGVyZm9ybXMgd2VsbCBmb3IgdGhpcyBkYXRhc2V0IGFuZCB0aGF0IHRoZSBib290c3RyYXAgcHJvY2VkdXJlIGNvbmZpcm1zIHRoZSBzdGFiaWxpdHkgb2YgdGhlIG1lYW4gZXN0aW1hdGUgYW5kIGl0cyB1bmNlcnRhaW50eS4NCg0KIyAgQ29uY2x1c2lvbg0KDQpVc2luZyBgQW5pbWFsUHJvZHVjdHNgIGZyb20gKipuID0gMTcwIGNvdW50cmllcyoqLCB0aGUgZXN0aW1hdGVkIG1lYW4gcGVyY2VudGFnZSBvZiBwcm90ZWluIGludGFrZSBmcm9tIGFuaW1hbC1iYXNlZCBmb29kIHNvdXJjZXMgaXMgKioyMS4yMzIlKiouDQoNCi0gVGhlICoqY2xhc3NpY2FsIDk1JSB0LWJhc2VkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBpcyBcKCgyMC4wMzNcJSwgMjIuNDMyXCUpXCkuICANCi0gVGhlICoqYm9vdHN0cmFwIDk1JSBwZXJjZW50aWxlIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBpcyBcKCgyMC4wNTVcJSwgMjIuNDAwXCUpXCkuDQoNCkJlY2F1c2UgdGhlc2UgdHdvIGludGVydmFscyBhcmUgZXh0cmVtZWx5IHNpbWlsYXIsIHRoZXkgbGVhZCB0byB0aGUgc2FtZSBzdWJzdGFudGl2ZSBjb25jbHVzaW9uOiB0aGUgcG9wdWxhdGlvbiBtZWFuIHBlcmNlbnRhZ2Ugb2YgcHJvdGVpbiBpbnRha2UgZnJvbSBhbmltYWwgcHJvZHVjdHMgYWNyb3NzIGNvdW50cmllcyBpcyBsaWtlbHkgYmV0d2VlbiBhYm91dCAqKjIwJSBhbmQgMjIuNSUqKiwgYW5kIHRoZSBlc3RpbWF0ZSBpcyBzdGFibGUgdW5kZXIgYm90aCBjbGFzc2ljYWwgYW5kIGJvb3RzdHJhcCBpbmZlcmVuY2UgbWV0aG9kcy4NCg0KDQo=