Question (a): Bootstrap
Sampling Distribution of \(\widehat{E[X]}\)
To estimate the sampling distribution of \(\widehat{E[X]}\), we apply the bootstrap
procedure. The key idea is to treat the observed sample as an
approximation of the population and repeatedly resample from it with
replacement.
# Input data (Pb concentrations)
data <- c(
0.85, 1.23, 0.92, 3.45, 2.11, 1.56, 4.89, 2.34, 1.78, 6.72, 0.95, 1.34, 8.91,
2.67, 1.89, 5.43, 1.12, 3.78, 2.45, 7.65, 1.05, 1.45, 12.34, 2.89, 2.01, 4.56,
1.23, 4.32, 2.67, 9.87, 0.99, 1.56, 15.23, 3.12, 2.34, 3.89, 1.34, 5.67, 2.89,
11.45, 1.12, 1.67, 18.90, 3.45, 2.56, 3.45, 1.45, 6.78, 3.12, 14.56, 1.23, 1.78,
22.34, 3.78, 2.78
)
# Number of bootstrap samples
B <- 5000
n <- length(data)
# Function to compute E[X] using log-normal MLE
estimate_mean_lognormal <- function(x) {
log_x <- log(x)
mu_hat <- mean(log_x)
sigma2_hat <- mean((log_x - mu_hat)^2)
# Plug-in estimator for E[X]
exp(mu_hat + sigma2_hat / 2)
}
# Store bootstrap estimates
boot_estimates <- numeric(B)
set.seed(123) # for reproducibility
# Bootstrap loop
for (b in 1:B) {
sample_b <- sample(data, size = n, replace = TRUE) # resample with replacement
boot_estimates[b] <- estimate_mean_lognormal(sample_b)
}
# Plot histogram with density scaling
hist(boot_estimates,
breaks = 30,
probability = TRUE, # ensures histogram is on density scale
main = "Bootstrap Distribution of E[X]",
xlab = "Bootstrap Estimates",
border = "black")
# Add smooth density curve on top
lines(density(boot_estimates),
lwd = 2) # thicker line for visibility

The resulting bootstrap distribution appears approximately unimodal
and roughly symmetric, with a slight right skew. The peak of the
distribution is centered around values between 4 and 5, indicating that
most bootstrap estimates of \(\widehat{E[X]}\) fall within this
range.
In terms of variability, the distribution shows moderate spread,
suggesting a reasonable level of uncertainty in estimating \(E[X]\). While there is a mild right tail
extending toward larger values, extreme values are relatively
infrequent, indicating that the estimator is fairly stable across
resamples.
Overall, the bootstrap sampling distribution is well-behaved, with no
severe skewness or irregular patterns, supporting the reliability of the
bootstrap procedure in this setting.
Question (b) 95%
Percentile Bootstrap Confidence Interval for \(\mu_{LN} = E[X]\)
The percentile bootstrap confidence interval is constructed directly
from the empirical distribution of the bootstrap estimates. This method
does not impose any assumptions about symmetry or normality and instead
uses the observed distribution of \(\widehat{E[X]}\).
After generating \(B = 5000\)
bootstrap estimates, we sort these values in ascending order. The 95%
confidence interval is then obtained by selecting the empirical
quantiles corresponding to the lower and upper tails of the
distribution.
Specifically, for a \((1 - \alpha) =
0.95\) confidence level, we take:
- the \(2.5%\) percentile as the
lower bound
- the \(97.5%\) percentile as the
upper bound
This yields the interval: [ ]
Conceptually, this interval represents the central 95% of the
bootstrap distribution, meaning that 95% of the resampled estimates fall
within this range. Since this method relies entirely on the empirical
distribution, it naturally adapts to any skewness or asymmetry present
in the data.
Thus, the percentile bootstrap confidence interval provides a simple
and intuitive estimate of uncertainty for \(\mu_{LN} = E[X]\) based on the observed
data.
# --- Manual Percentile CI ---
alpha <- 0.05
lower_perc <- quantile(boot_estimates, probs = alpha / 2)
upper_perc <- quantile(boot_estimates, probs = 1 - alpha / 2)
ci_percentile <- c(lower = lower_perc, upper = upper_perc)
ci_percentile
lower.2.5% upper.97.5%
3.093880 5.643249
# --- Using boot package for verification ---
library(boot)
# Define statistic function for boot()
boot_stat <- function(data, indices) {
sample_data <- data[indices]
log_x <- log(sample_data)
mu_hat <- mean(log_x)
sigma2_hat <- mean((log_x - mu_hat)^2)
# Return E[X] estimator
exp(mu_hat + sigma2_hat / 2)
}
set.seed(123)
boot_result <- boot(data, statistic = boot_stat, R = 5000)
# Percentile CI using boot package
boot_ci <- boot.ci(boot_result, type = "perc")
boot_ci
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 5000 bootstrap replicates
CALL :
boot.ci(boot.out = boot_result, type = "perc")
Intervals :
Level Percentile
95% ( 3.097, 5.598 )
Calculations and Intervals on Original Scale
Question (c) 95% BCa
Bootstrap Confidence Interval for \(\mu_{LN} =
E[X]\)
The bias-corrected and accelerated (BCa) bootstrap confidence
interval improves upon the percentile method by adjusting for both bias
and skewness in the bootstrap distribution.
Conceptually, the BCa method modifies the percentile cutoffs based on
two factors:
- A bias correction term, which accounts for whether the bootstrap
distribution is centered around the original estimate
- An acceleration term, which adjusts for skewness by measuring how
sensitive the estimator is to individual observations
These adjustments lead to modified percentile levels, which are then
used to determine the confidence interval from the bootstrap
distribution.
Compared to the percentile interval, the BCa interval may exhibit
slight asymmetry, reflecting adjustments for bias and skewness in the
bootstrap distribution. This makes the BCa method more reliable,
particularly when the distribution is not perfectly symmetric.
# --- Manual BCa CI ---
alpha <- 0.05
B <- length(boot_estimates)
# Original estimate
theta_hat <- estimate_mean_lognormal(data)
# ---- Bias correction (z0) ----
prop_less <- mean(boot_estimates < theta_hat)
z0 <- qnorm(prop_less)
# ---- Jackknife for acceleration ----
n <- length(data)
jack_vals <- numeric(n)
for (i in 1:n) {
jack_sample <- data[-i] # leave-one-out
jack_vals[i] <- estimate_mean_lognormal(jack_sample)
}
theta_jack_mean <- mean(jack_vals)
numerator <- sum((theta_jack_mean - jack_vals)^3)
denominator <- sum((theta_jack_mean - jack_vals)^2)
a_hat <- numerator / (6 * denominator^(3/2))
# ---- Adjusted percentiles ----
z_alpha <- qnorm(alpha / 2)
z_1_alpha <- qnorm(1 - alpha / 2)
alpha1 <- pnorm(z0 + (z0 + z_alpha) / (1 - a_hat * (z0 + z_alpha)))
alpha2 <- pnorm(z0 + (z0 + z_1_alpha) / (1 - a_hat * (z0 + z_1_alpha)))
# ---- BCa interval ----
lower_bca <- quantile(boot_estimates, probs = alpha1)
upper_bca <- quantile(boot_estimates, probs = alpha2)
ci_bca <- c(lower = lower_bca, upper = upper_bca)
ci_bca
lower.4.130304% upper.98.67843%
3.222668 5.850080
# BCa CI using boot package
boot_ci_bca <- boot.ci(boot_result, type = "bca")
boot_ci_bca
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 5000 bootstrap replicates
CALL :
boot.ci(boot.out = boot_result, type = "bca")
Intervals :
Level BCa
95% ( 3.225, 5.865 )
Calculations and Intervals on Original Scale
Question (d) Asymptotic
(CLT-Based) Confidence Interval for \(\mu_{LN}
= E[X]\)
An alternative to bootstrap-based confidence intervals is the
asymptotic confidence interval based on the Central Limit Theorem (CLT).
This approach assumes that the estimator \(\widehat{E[X]}\) is approximately normally
distributed for sufficiently large sample sizes.
Under this assumption, a 95% confidence interval is constructed as: [
\(\widehat{E[X]} ;\pm\); z_{0.975}
\(\cdot
\widehat{\mathrm{SE}}(\widehat{E[X]})\),] where \(z_{0.975}\) is the standard normal critical
value and \(\widehat{\mathrm{SE}}(\widehat{E[X]})\) is
the estimated standard error of the estimator.
In this problem, the standard error is approximated using the
bootstrap distribution. Specifically, the standard deviation of the
bootstrap estimates is used as an estimate of \(\widehat{\mathrm{SE}}(\widehat{E[X]})\).
Conceptually, this method constructs a symmetric interval around the
estimate, unlike the percentile and BCa methods which adapt to the shape
of the bootstrap distribution. As a result, if the bootstrap
distribution exhibits slight skewness, the CLT-based interval may not
fully capture that asymmetry.
Unlike parts (b) and (c), there is no direct implementation of the
CLT-based interval in the \(\texttt{boot}\) package. Instead, the
bootstrap is used here only to estimate the standard error, and the
interval is constructed using the normal approximation.
# --- CLT / Normal-based CI ---
# Original estimate
theta_hat <- estimate_mean_lognormal(data)
# Bootstrap standard error (std dev of bootstrap estimates)
se_boot <- sd(boot_estimates)
# Critical value for 95% CI
z <- qnorm(0.975)
# Construct CI
lower_clt <- theta_hat - z * se_boot
upper_clt <- theta_hat + z * se_boot
ci_clt <- c(lower = lower_clt, upper = upper_clt)
ci_clt
lower upper
2.959686 5.476512
Question (e) Comparison
of Confidence Intervals
We compare the three confidence intervals constructed for \(\mu_{LN} = E[X]\): the percentile bootstrap
interval, the BCa bootstrap interval, and the asymptotic (CLT-based)
interval.
The percentile bootstrap interval is: [3.094, 5.643], while the BCa
interval is: [3.223, 5.850]. These two intervals are similar in width,
but the BCa interval is slightly shifted upward and extends further on
the upper end. This reflects the bias and skewness corrections applied
by the BCa method.
The CLT-based interval is: [2.960, 5.477], which is symmetric around
\(\widehat{E[X]}\). Compared to the
bootstrap intervals, it has a lower lower-bound and a slightly smaller
upper-bound, indicating that it does not fully capture the asymmetry
present in the bootstrap distribution.
In terms of performance:
- The percentile and BCa intervals are data-driven and reflect the
empirical distribution.
- The BCa interval provides additional correction for bias and
skewness, making it more robust.
- The CLT interval relies on a normality assumption and may be less
accurate when the distribution is not perfectly symmetric.
Overall, the BCa interval is the most appropriate choice in this
setting due to its ability to account for both bias and skewness. The
percentile interval provides a reasonable approximation, while the CLT
interval serves as a useful but more assumption-dependent benchmark.
LS0tDQp0aXRsZTogJ1NUQSA1MDYgSE9NRVdPUksgNycNCmF1dGhvcjogJ0dlcmFyZCBJa2UnDQpkYXRlOiAiMjAyNi0wMy0yNCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogICAgICAgICAgICAgICMgb3V0cHV0IGRvY3VtZW50IGZvcm1hdA0KICAgIHRvYzogeWVzICAgICAgICAgICAgICAgICAgIyBhZGQgdGFibGUgY29udGVudHMNCiAgICB0b2NfZmxvYXQ6IHllcyAgICAgICAgICAgICMgdG9jX3Byb3BlcnR5OiBmbG9hdGluZw0KICAgIHRvY19kZXB0aDogNCAgICAgICAgICAgICAgIyBkZXB0aCBvZiBUT0MgaGVhZGluZ3MNCiAgICBmaWdfd2lkdGg6IDYgICAgICAgICAgICAgICMgZ2xvYmFsIGZpZ3VyZSB3aWR0aA0KICAgIGZpZ19oZWlnaHQ6IDQgICAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIGhlaWdodA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMgICAgICAgICAgIyBhZGQgZmlndXJlIGNhcHRpb24NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcyAgICAgICMgbnVtYmVyaW5nIHNlY3Rpb24gaGVhZGluZ3MNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMgICAgICAgICMgVE9DIHN1YmhlYWRpbmcgY2xhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMgICAgICAgICMgYWxsb3cgdG8gZG93bmxvYWQgY29tcGxldGUgUk1hcmtkb3duIHNvdXJjZSBjb2RlDQogICAgc21vb3RoX3Njcm9sbDogeWVzICAgICAgICAjIHNjcm9sbGluZyB0ZXh0IG9mIHRoZSBkb2N1bWVudA0KICAgIHRoZW1lOiBsdW1lbiAgICAgICAgICAgICAgIyB2aXN1YWwgdGhlbWUgZm9yIEhUTUwgZG9jdW1lbnQgb25seQ0KICAgIGhpZ2hsaWdodDogdGFuZ28gICAgICAgICAgIyBjb2RlIHN5bnRheCBoaWdobGlnaHRpbmcgc3R5bGVzDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiAnNCcNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQoNCmlmICghcmVxdWlyZSgia25pdHIiKSkgeyAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgdG8gZGV0ZWN0DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpICAgICAgICAgICAgICAgICAgIyB3aGV0aGVyIGEgcGFja2FnZSB3YXMgaW5zdGFsbGVkIGluDQogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQNCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGxvYWQgaXQgdG8gdGhlIHdvcmtpbmcgZGlyZWN0b3J5Lg0KIw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAgICAgICMgaW5jbHVkZSBjb2RlIGNodW5rIGluIHRoZSBvdXRwdXQgZmlsZQ0KICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgICAgICAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIG91dHB1dCBmaWxlLiANCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAgICAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsICAgICAgICAjIHN1cHByZXNzIG1lc3NhZ2VzIA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSAgICAgICAgICAgICMgcmVtb3ZlIHRoZSBkZWZhdWx0IGxlYWRpbmcgaGFzaCB0YWdzIGluIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICApICAgDQpgYGANCg0KIyBRdWVzdGlvbiAoYSk6IEJvb3RzdHJhcCBTYW1wbGluZyBEaXN0cmlidXRpb24gb2YgJFx3aWRlaGF0e0VbWF19JA0KDQpUbyBlc3RpbWF0ZSB0aGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mICRcd2lkZWhhdHtFW1hdfSQsIHdlIGFwcGx5IHRoZSBib290c3RyYXAgcHJvY2VkdXJlLiBUaGUga2V5IGlkZWEgaXMgdG8gdHJlYXQgdGhlIG9ic2VydmVkIHNhbXBsZSBhcyBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIGFuZCByZXBlYXRlZGx5IHJlc2FtcGxlIGZyb20gaXQgd2l0aCByZXBsYWNlbWVudC4NCg0KDQpgYGB7cn0NCiMgSW5wdXQgZGF0YSAoUGIgY29uY2VudHJhdGlvbnMpDQpkYXRhIDwtIGMoDQogIDAuODUsIDEuMjMsIDAuOTIsIDMuNDUsIDIuMTEsIDEuNTYsIDQuODksIDIuMzQsIDEuNzgsIDYuNzIsIDAuOTUsIDEuMzQsIDguOTEsDQogIDIuNjcsIDEuODksIDUuNDMsIDEuMTIsIDMuNzgsIDIuNDUsIDcuNjUsIDEuMDUsIDEuNDUsIDEyLjM0LCAyLjg5LCAyLjAxLCA0LjU2LA0KICAxLjIzLCA0LjMyLCAyLjY3LCA5Ljg3LCAwLjk5LCAxLjU2LCAxNS4yMywgMy4xMiwgMi4zNCwgMy44OSwgMS4zNCwgNS42NywgMi44OSwNCiAgMTEuNDUsIDEuMTIsIDEuNjcsIDE4LjkwLCAzLjQ1LCAyLjU2LCAzLjQ1LCAxLjQ1LCA2Ljc4LCAzLjEyLCAxNC41NiwgMS4yMywgMS43OCwNCiAgMjIuMzQsIDMuNzgsIDIuNzgNCikNCg0KIyBOdW1iZXIgb2YgYm9vdHN0cmFwIHNhbXBsZXMNCkIgPC0gNTAwMA0KbiA8LSBsZW5ndGgoZGF0YSkNCg0KIyBGdW5jdGlvbiB0byBjb21wdXRlIEVbWF0gdXNpbmcgbG9nLW5vcm1hbCBNTEUNCmVzdGltYXRlX21lYW5fbG9nbm9ybWFsIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbG9nX3ggPC0gbG9nKHgpDQogIG11X2hhdCA8LSBtZWFuKGxvZ194KQ0KICBzaWdtYTJfaGF0IDwtIG1lYW4oKGxvZ194IC0gbXVfaGF0KV4yKQ0KICANCiAgIyBQbHVnLWluIGVzdGltYXRvciBmb3IgRVtYXQ0KICBleHAobXVfaGF0ICsgc2lnbWEyX2hhdCAvIDIpDQp9DQoNCiMgU3RvcmUgYm9vdHN0cmFwIGVzdGltYXRlcw0KYm9vdF9lc3RpbWF0ZXMgPC0gbnVtZXJpYyhCKQ0KDQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCg0KIyBCb290c3RyYXAgbG9vcA0KZm9yIChiIGluIDE6Qikgew0KICBzYW1wbGVfYiA8LSBzYW1wbGUoZGF0YSwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKSAgIyByZXNhbXBsZSB3aXRoIHJlcGxhY2VtZW50DQogIGJvb3RfZXN0aW1hdGVzW2JdIDwtIGVzdGltYXRlX21lYW5fbG9nbm9ybWFsKHNhbXBsZV9iKQ0KfQ0KDQojIFBsb3QgaGlzdG9ncmFtIHdpdGggZGVuc2l0eSBzY2FsaW5nDQpoaXN0KGJvb3RfZXN0aW1hdGVzLA0KICAgICBicmVha3MgPSAzMCwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLCAgICMgZW5zdXJlcyBoaXN0b2dyYW0gaXMgb24gZGVuc2l0eSBzY2FsZQ0KICAgICBtYWluID0gIkJvb3RzdHJhcCBEaXN0cmlidXRpb24gb2YgRVtYXSIsDQogICAgIHhsYWIgPSAiQm9vdHN0cmFwIEVzdGltYXRlcyIsDQogICAgIGJvcmRlciA9ICJibGFjayIpDQoNCiMgQWRkIHNtb290aCBkZW5zaXR5IGN1cnZlIG9uIHRvcA0KbGluZXMoZGVuc2l0eShib290X2VzdGltYXRlcyksDQogICAgICBsd2QgPSAyKSAgIyB0aGlja2VyIGxpbmUgZm9yIHZpc2liaWxpdHkNCmBgYA0KDQoNClRoZSByZXN1bHRpbmcgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBhcHBlYXJzIGFwcHJveGltYXRlbHkgdW5pbW9kYWwgYW5kIHJvdWdobHkgc3ltbWV0cmljLCB3aXRoIGEgc2xpZ2h0IHJpZ2h0IHNrZXcuIFRoZSBwZWFrIG9mIHRoZSBkaXN0cmlidXRpb24gaXMgY2VudGVyZWQgYXJvdW5kIHZhbHVlcyBiZXR3ZWVuIDQgYW5kIDUsIGluZGljYXRpbmcgdGhhdCBtb3N0IGJvb3RzdHJhcCBlc3RpbWF0ZXMgb2YgJFx3aWRlaGF0e0VbWF19JCBmYWxsIHdpdGhpbiB0aGlzIHJhbmdlLg0KDQpJbiB0ZXJtcyBvZiB2YXJpYWJpbGl0eSwgdGhlIGRpc3RyaWJ1dGlvbiBzaG93cyBtb2RlcmF0ZSBzcHJlYWQsIHN1Z2dlc3RpbmcgYSByZWFzb25hYmxlIGxldmVsIG9mIHVuY2VydGFpbnR5IGluIGVzdGltYXRpbmcgJEVbWF0kLiBXaGlsZSB0aGVyZSBpcyBhIG1pbGQgcmlnaHQgdGFpbCBleHRlbmRpbmcgdG93YXJkIGxhcmdlciB2YWx1ZXMsIGV4dHJlbWUgdmFsdWVzIGFyZSByZWxhdGl2ZWx5IGluZnJlcXVlbnQsIGluZGljYXRpbmcgdGhhdCB0aGUgZXN0aW1hdG9yIGlzIGZhaXJseSBzdGFibGUgYWNyb3NzIHJlc2FtcGxlcy4NCg0KT3ZlcmFsbCwgdGhlIGJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb24gaXMgd2VsbC1iZWhhdmVkLCB3aXRoIG5vIHNldmVyZSBza2V3bmVzcyBvciBpcnJlZ3VsYXIgcGF0dGVybnMsIHN1cHBvcnRpbmcgdGhlIHJlbGlhYmlsaXR5IG9mIHRoZSBib290c3RyYXAgcHJvY2VkdXJlIGluIHRoaXMgc2V0dGluZy4NCg0KDQojIFF1ZXN0aW9uIChiKSA5NSUgUGVyY2VudGlsZSBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbCBmb3IgJFxtdV97TE59ID0gRVtYXSQNCg0KVGhlIHBlcmNlbnRpbGUgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgY29uc3RydWN0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgYm9vdHN0cmFwIGVzdGltYXRlcy4gVGhpcyBtZXRob2QgZG9lcyBub3QgaW1wb3NlIGFueSBhc3N1bXB0aW9ucyBhYm91dCBzeW1tZXRyeSBvciBub3JtYWxpdHkgYW5kIGluc3RlYWQgdXNlcyB0aGUgb2JzZXJ2ZWQgZGlzdHJpYnV0aW9uIG9mICRcd2lkZWhhdHtFW1hdfSQuDQoNCkFmdGVyIGdlbmVyYXRpbmcgJEIgPSA1MDAwJCBib290c3RyYXAgZXN0aW1hdGVzLCB3ZSBzb3J0IHRoZXNlIHZhbHVlcyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyB0aGVuIG9idGFpbmVkIGJ5IHNlbGVjdGluZyB0aGUgZW1waXJpY2FsIHF1YW50aWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb3dlciBhbmQgdXBwZXIgdGFpbHMgb2YgdGhlIGRpc3RyaWJ1dGlvbi4NCg0KU3BlY2lmaWNhbGx5LCBmb3IgYSAkKDEgLSBcYWxwaGEpID0gMC45NSQgY29uZmlkZW5jZSBsZXZlbCwgd2UgdGFrZToNCg0KKiB0aGUgJDIuNSUkIHBlcmNlbnRpbGUgYXMgdGhlIGxvd2VyIGJvdW5kDQoqIHRoZSAkOTcuNSUkIHBlcmNlbnRpbGUgYXMgdGhlIHVwcGVyIGJvdW5kDQoNClRoaXMgeWllbGRzIHRoZSBpbnRlcnZhbDoNClsNClxsZWZ0WyBcd2lkZWhhdHtFW1hdfSp7KDAuMDI1KX0sIDsgXHdpZGVoYXR7RVtYXX0qeygwLjk3NSl9IFxyaWdodF0NCl0NCg0KQ29uY2VwdHVhbGx5LCB0aGlzIGludGVydmFsIHJlcHJlc2VudHMgdGhlIGNlbnRyYWwgOTUlIG9mIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLCBtZWFuaW5nIHRoYXQgOTUlIG9mIHRoZSByZXNhbXBsZWQgZXN0aW1hdGVzIGZhbGwgd2l0aGluIHRoaXMgcmFuZ2UuIFNpbmNlIHRoaXMgbWV0aG9kIHJlbGllcyBlbnRpcmVseSBvbiB0aGUgZW1waXJpY2FsIGRpc3RyaWJ1dGlvbiwgaXQgbmF0dXJhbGx5IGFkYXB0cyB0byBhbnkgc2tld25lc3Mgb3IgYXN5bW1ldHJ5IHByZXNlbnQgaW4gdGhlIGRhdGEuDQoNClRodXMsIHRoZSBwZXJjZW50aWxlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFsIHByb3ZpZGVzIGEgc2ltcGxlIGFuZCBpbnR1aXRpdmUgZXN0aW1hdGUgb2YgdW5jZXJ0YWludHkgZm9yICRcbXVfe0xOfSA9IEVbWF0kIGJhc2VkIG9uIHRoZSBvYnNlcnZlZCBkYXRhLg0KDQpgYGB7cn0NCiMgLS0tIE1hbnVhbCBQZXJjZW50aWxlIENJIC0tLQ0KYWxwaGEgPC0gMC4wNQ0KDQpsb3dlcl9wZXJjIDwtIHF1YW50aWxlKGJvb3RfZXN0aW1hdGVzLCBwcm9icyA9IGFscGhhIC8gMikNCnVwcGVyX3BlcmMgPC0gcXVhbnRpbGUoYm9vdF9lc3RpbWF0ZXMsIHByb2JzID0gMSAtIGFscGhhIC8gMikNCg0KY2lfcGVyY2VudGlsZSA8LSBjKGxvd2VyID0gbG93ZXJfcGVyYywgdXBwZXIgPSB1cHBlcl9wZXJjKQ0KY2lfcGVyY2VudGlsZQ0KDQoNCiMgLS0tIFVzaW5nIGJvb3QgcGFja2FnZSBmb3IgdmVyaWZpY2F0aW9uIC0tLQ0KbGlicmFyeShib290KQ0KDQojIERlZmluZSBzdGF0aXN0aWMgZnVuY3Rpb24gZm9yIGJvb3QoKQ0KYm9vdF9zdGF0IDwtIGZ1bmN0aW9uKGRhdGEsIGluZGljZXMpIHsNCiAgc2FtcGxlX2RhdGEgPC0gZGF0YVtpbmRpY2VzXQ0KICANCiAgbG9nX3ggPC0gbG9nKHNhbXBsZV9kYXRhKQ0KICBtdV9oYXQgPC0gbWVhbihsb2dfeCkNCiAgc2lnbWEyX2hhdCA8LSBtZWFuKChsb2dfeCAtIG11X2hhdCleMikNCiAgDQogICMgUmV0dXJuIEVbWF0gZXN0aW1hdG9yDQogIGV4cChtdV9oYXQgKyBzaWdtYTJfaGF0IC8gMikNCn0NCg0Kc2V0LnNlZWQoMTIzKQ0KDQpib290X3Jlc3VsdCA8LSBib290KGRhdGEsIHN0YXRpc3RpYyA9IGJvb3Rfc3RhdCwgUiA9IDUwMDApDQoNCiMgUGVyY2VudGlsZSBDSSB1c2luZyBib290IHBhY2thZ2UNCmJvb3RfY2kgPC0gYm9vdC5jaShib290X3Jlc3VsdCwgdHlwZSA9ICJwZXJjIikNCg0KYm9vdF9jaQ0KYGBgDQoNCiMgUXVlc3Rpb24gKGMpIDk1JSBCQ2EgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWwgZm9yICRcbXVfe0xOfSA9IEVbWF0kDQoNClRoZSBiaWFzLWNvcnJlY3RlZCBhbmQgYWNjZWxlcmF0ZWQgKEJDYSkgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaW1wcm92ZXMgdXBvbiB0aGUgcGVyY2VudGlsZSBtZXRob2QgYnkgYWRqdXN0aW5nIGZvciBib3RoIGJpYXMgYW5kIHNrZXduZXNzIGluIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLg0KDQpDb25jZXB0dWFsbHksIHRoZSBCQ2EgbWV0aG9kIG1vZGlmaWVzIHRoZSBwZXJjZW50aWxlIGN1dG9mZnMgYmFzZWQgb24gdHdvIGZhY3RvcnM6DQoNCiogQSBiaWFzIGNvcnJlY3Rpb24gdGVybSwgd2hpY2ggYWNjb3VudHMgZm9yIHdoZXRoZXIgdGhlIGJvb3RzdHJhcCBkaXN0cmlidXRpb24gaXMgY2VudGVyZWQgYXJvdW5kIHRoZSBvcmlnaW5hbCBlc3RpbWF0ZQ0KKiBBbiBhY2NlbGVyYXRpb24gdGVybSwgd2hpY2ggYWRqdXN0cyBmb3Igc2tld25lc3MgYnkgbWVhc3VyaW5nIGhvdyBzZW5zaXRpdmUgdGhlIGVzdGltYXRvciBpcyB0byBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucw0KDQpUaGVzZSBhZGp1c3RtZW50cyBsZWFkIHRvIG1vZGlmaWVkIHBlcmNlbnRpbGUgbGV2ZWxzLCB3aGljaCBhcmUgdGhlbiB1c2VkIHRvIGRldGVybWluZSB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBmcm9tIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLg0KDQpDb21wYXJlZCB0byB0aGUgcGVyY2VudGlsZSBpbnRlcnZhbCwgdGhlIEJDYSBpbnRlcnZhbCBtYXkgZXhoaWJpdCBzbGlnaHQgYXN5bW1ldHJ5LCByZWZsZWN0aW5nIGFkanVzdG1lbnRzIGZvciBiaWFzIGFuZCBza2V3bmVzcyBpbiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4gVGhpcyBtYWtlcyB0aGUgQkNhIG1ldGhvZCBtb3JlIHJlbGlhYmxlLCBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vdCBwZXJmZWN0bHkgc3ltbWV0cmljLg0KDQpgYGB7cn0NCiMgLS0tIE1hbnVhbCBCQ2EgQ0kgLS0tDQoNCmFscGhhIDwtIDAuMDUNCkIgPC0gbGVuZ3RoKGJvb3RfZXN0aW1hdGVzKQ0KDQojIE9yaWdpbmFsIGVzdGltYXRlDQp0aGV0YV9oYXQgPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoZGF0YSkNCg0KIyAtLS0tIEJpYXMgY29ycmVjdGlvbiAoejApIC0tLS0NCnByb3BfbGVzcyA8LSBtZWFuKGJvb3RfZXN0aW1hdGVzIDwgdGhldGFfaGF0KQ0KejAgPC0gcW5vcm0ocHJvcF9sZXNzKQ0KDQojIC0tLS0gSmFja2tuaWZlIGZvciBhY2NlbGVyYXRpb24gLS0tLQ0KbiA8LSBsZW5ndGgoZGF0YSkNCmphY2tfdmFscyA8LSBudW1lcmljKG4pDQoNCmZvciAoaSBpbiAxOm4pIHsNCiAgamFja19zYW1wbGUgPC0gZGF0YVstaV0gICMgbGVhdmUtb25lLW91dA0KICBqYWNrX3ZhbHNbaV0gPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoamFja19zYW1wbGUpDQp9DQoNCnRoZXRhX2phY2tfbWVhbiA8LSBtZWFuKGphY2tfdmFscykNCg0KbnVtZXJhdG9yIDwtIHN1bSgodGhldGFfamFja19tZWFuIC0gamFja192YWxzKV4zKQ0KZGVub21pbmF0b3IgPC0gc3VtKCh0aGV0YV9qYWNrX21lYW4gLSBqYWNrX3ZhbHMpXjIpDQoNCmFfaGF0IDwtIG51bWVyYXRvciAvICg2ICogZGVub21pbmF0b3JeKDMvMikpDQoNCiMgLS0tLSBBZGp1c3RlZCBwZXJjZW50aWxlcyAtLS0tDQp6X2FscGhhIDwtIHFub3JtKGFscGhhIC8gMikNCnpfMV9hbHBoYSA8LSBxbm9ybSgxIC0gYWxwaGEgLyAyKQ0KDQphbHBoYTEgPC0gcG5vcm0oejAgKyAoejAgKyB6X2FscGhhKSAvICgxIC0gYV9oYXQgKiAoejAgKyB6X2FscGhhKSkpDQphbHBoYTIgPC0gcG5vcm0oejAgKyAoejAgKyB6XzFfYWxwaGEpIC8gKDEgLSBhX2hhdCAqICh6MCArIHpfMV9hbHBoYSkpKQ0KDQojIC0tLS0gQkNhIGludGVydmFsIC0tLS0NCmxvd2VyX2JjYSA8LSBxdWFudGlsZShib290X2VzdGltYXRlcywgcHJvYnMgPSBhbHBoYTEpDQp1cHBlcl9iY2EgPC0gcXVhbnRpbGUoYm9vdF9lc3RpbWF0ZXMsIHByb2JzID0gYWxwaGEyKQ0KDQpjaV9iY2EgPC0gYyhsb3dlciA9IGxvd2VyX2JjYSwgdXBwZXIgPSB1cHBlcl9iY2EpDQpjaV9iY2ENCmBgYA0KDQpgYGB7cn0NCiMgQkNhIENJIHVzaW5nIGJvb3QgcGFja2FnZQ0KYm9vdF9jaV9iY2EgPC0gYm9vdC5jaShib290X3Jlc3VsdCwgdHlwZSA9ICJiY2EiKQ0KDQpib290X2NpX2JjYQ0KYGBgDQoNCg0KIyBRdWVzdGlvbiAoZCkgQXN5bXB0b3RpYyAoQ0xULUJhc2VkKSBDb25maWRlbmNlIEludGVydmFsIGZvciAkXG11X3tMTn0gPSBFW1hdJA0KDQpBbiBhbHRlcm5hdGl2ZSB0byBib290c3RyYXAtYmFzZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgaXMgdGhlIGFzeW1wdG90aWMgY29uZmlkZW5jZSBpbnRlcnZhbCBiYXNlZCBvbiB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtIChDTFQpLiBUaGlzIGFwcHJvYWNoIGFzc3VtZXMgdGhhdCB0aGUgZXN0aW1hdG9yICRcd2lkZWhhdHtFW1hdfSQgaXMgYXBwcm94aW1hdGVseSBub3JtYWxseSBkaXN0cmlidXRlZCBmb3Igc3VmZmljaWVudGx5IGxhcmdlIHNhbXBsZSBzaXplcy4NCg0KVW5kZXIgdGhpcyBhc3N1bXB0aW9uLCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIGlzIGNvbnN0cnVjdGVkIGFzOg0KWw0KJFx3aWRlaGF0e0VbWF19IDtccG0kOyB6X3swLjk3NX0gJFxjZG90IFx3aWRlaGF0e1xtYXRocm17U0V9fShcd2lkZWhhdHtFW1hdfSkkLA0KXQ0Kd2hlcmUgJHpfezAuOTc1fSQgaXMgdGhlIHN0YW5kYXJkIG5vcm1hbCBjcml0aWNhbCB2YWx1ZSBhbmQgJFx3aWRlaGF0e1xtYXRocm17U0V9fShcd2lkZWhhdHtFW1hdfSkkIGlzIHRoZSBlc3RpbWF0ZWQgc3RhbmRhcmQgZXJyb3Igb2YgdGhlIGVzdGltYXRvci4NCg0KSW4gdGhpcyBwcm9ibGVtLCB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgYXBwcm94aW1hdGVkIHVzaW5nIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uLiBTcGVjaWZpY2FsbHksIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGJvb3RzdHJhcCBlc3RpbWF0ZXMgaXMgdXNlZCBhcyBhbiBlc3RpbWF0ZSBvZiAkXHdpZGVoYXR7XG1hdGhybXtTRX19KFx3aWRlaGF0e0VbWF19KSQuDQoNCkNvbmNlcHR1YWxseSwgdGhpcyBtZXRob2QgY29uc3RydWN0cyBhIHN5bW1ldHJpYyBpbnRlcnZhbCBhcm91bmQgdGhlIGVzdGltYXRlLCB1bmxpa2UgdGhlIHBlcmNlbnRpbGUgYW5kIEJDYSBtZXRob2RzIHdoaWNoIGFkYXB0IHRvIHRoZSBzaGFwZSBvZiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4gQXMgYSByZXN1bHQsIGlmIHRoZSBib290c3RyYXAgZGlzdHJpYnV0aW9uIGV4aGliaXRzIHNsaWdodCBza2V3bmVzcywgdGhlIENMVC1iYXNlZCBpbnRlcnZhbCBtYXkgbm90IGZ1bGx5IGNhcHR1cmUgdGhhdCBhc3ltbWV0cnkuDQoNClVubGlrZSBwYXJ0cyAoYikgYW5kIChjKSwgdGhlcmUgaXMgbm8gZGlyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTFQtYmFzZWQgaW50ZXJ2YWwgaW4gdGhlICRcdGV4dHR0e2Jvb3R9JCBwYWNrYWdlLiBJbnN0ZWFkLCB0aGUgYm9vdHN0cmFwIGlzIHVzZWQgaGVyZSBvbmx5IHRvIGVzdGltYXRlIHRoZSBzdGFuZGFyZCBlcnJvciwgYW5kIHRoZSBpbnRlcnZhbCBpcyBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgbm9ybWFsIGFwcHJveGltYXRpb24uDQoNCmBgYHtyfQ0KIyAtLS0gQ0xUIC8gTm9ybWFsLWJhc2VkIENJIC0tLQ0KDQojIE9yaWdpbmFsIGVzdGltYXRlDQp0aGV0YV9oYXQgPC0gZXN0aW1hdGVfbWVhbl9sb2dub3JtYWwoZGF0YSkNCg0KIyBCb290c3RyYXAgc3RhbmRhcmQgZXJyb3IgKHN0ZCBkZXYgb2YgYm9vdHN0cmFwIGVzdGltYXRlcykNCnNlX2Jvb3QgPC0gc2QoYm9vdF9lc3RpbWF0ZXMpDQoNCiMgQ3JpdGljYWwgdmFsdWUgZm9yIDk1JSBDSQ0KeiA8LSBxbm9ybSgwLjk3NSkNCg0KIyBDb25zdHJ1Y3QgQ0kNCmxvd2VyX2NsdCA8LSB0aGV0YV9oYXQgLSB6ICogc2VfYm9vdA0KdXBwZXJfY2x0IDwtIHRoZXRhX2hhdCArIHogKiBzZV9ib290DQoNCmNpX2NsdCA8LSBjKGxvd2VyID0gbG93ZXJfY2x0LCB1cHBlciA9IHVwcGVyX2NsdCkNCmNpX2NsdA0KYGBgDQoNCg0KIyBRdWVzdGlvbiAoZSkgQ29tcGFyaXNvbiBvZiBDb25maWRlbmNlIEludGVydmFscw0KDQpXZSBjb21wYXJlIHRoZSB0aHJlZSBjb25maWRlbmNlIGludGVydmFscyBjb25zdHJ1Y3RlZCBmb3IgJFxtdV97TE59ID0gRVtYXSQ6IHRoZSBwZXJjZW50aWxlIGJvb3RzdHJhcCBpbnRlcnZhbCwgdGhlIEJDYSBib290c3RyYXAgaW50ZXJ2YWwsIGFuZCB0aGUgYXN5bXB0b3RpYyAoQ0xULWJhc2VkKSBpbnRlcnZhbC4NCg0KVGhlIHBlcmNlbnRpbGUgYm9vdHN0cmFwIGludGVydmFsIGlzOg0KWzMuMDk0LCA1LjY0M10sDQp3aGlsZSB0aGUgQkNhIGludGVydmFsIGlzOg0KWzMuMjIzLCA1Ljg1MF0uDQpUaGVzZSB0d28gaW50ZXJ2YWxzIGFyZSBzaW1pbGFyIGluIHdpZHRoLCBidXQgdGhlIEJDYSBpbnRlcnZhbCBpcyBzbGlnaHRseSBzaGlmdGVkIHVwd2FyZCBhbmQgZXh0ZW5kcyBmdXJ0aGVyIG9uIHRoZSB1cHBlciBlbmQuIFRoaXMgcmVmbGVjdHMgdGhlIGJpYXMgYW5kIHNrZXduZXNzIGNvcnJlY3Rpb25zIGFwcGxpZWQgYnkgdGhlIEJDYSBtZXRob2QuDQoNClRoZSBDTFQtYmFzZWQgaW50ZXJ2YWwgaXM6DQpbMi45NjAsIDUuNDc3XSwNCndoaWNoIGlzIHN5bW1ldHJpYyBhcm91bmQgJFx3aWRlaGF0e0VbWF19JC4gQ29tcGFyZWQgdG8gdGhlIGJvb3RzdHJhcCBpbnRlcnZhbHMsIGl0IGhhcyBhIGxvd2VyIGxvd2VyLWJvdW5kIGFuZCBhIHNsaWdodGx5IHNtYWxsZXIgdXBwZXItYm91bmQsIGluZGljYXRpbmcgdGhhdCBpdCBkb2VzIG5vdCBmdWxseSBjYXB0dXJlIHRoZSBhc3ltbWV0cnkgcHJlc2VudCBpbiB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbi4NCg0KSW4gdGVybXMgb2YgcGVyZm9ybWFuY2U6DQoNCiogVGhlIHBlcmNlbnRpbGUgYW5kIEJDYSBpbnRlcnZhbHMgYXJlIGRhdGEtZHJpdmVuIGFuZCByZWZsZWN0IHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uLg0KKiBUaGUgQkNhIGludGVydmFsIHByb3ZpZGVzIGFkZGl0aW9uYWwgY29ycmVjdGlvbiBmb3IgYmlhcyBhbmQgc2tld25lc3MsIG1ha2luZyBpdCBtb3JlIHJvYnVzdC4NCiogVGhlIENMVCBpbnRlcnZhbCByZWxpZXMgb24gYSBub3JtYWxpdHkgYXNzdW1wdGlvbiBhbmQgbWF5IGJlIGxlc3MgYWNjdXJhdGUgd2hlbiB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vdCBwZXJmZWN0bHkgc3ltbWV0cmljLg0KDQpPdmVyYWxsLCB0aGUgQkNhIGludGVydmFsIGlzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGNob2ljZSBpbiB0aGlzIHNldHRpbmcgZHVlIHRvIGl0cyBhYmlsaXR5IHRvIGFjY291bnQgZm9yIGJvdGggYmlhcyBhbmQgc2tld25lc3MuIFRoZSBwZXJjZW50aWxlIGludGVydmFsIHByb3ZpZGVzIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uLCB3aGlsZSB0aGUgQ0xUIGludGVydmFsIHNlcnZlcyBhcyBhIHVzZWZ1bCBidXQgbW9yZSBhc3N1bXB0aW9uLWRlcGVuZGVudCBiZW5jaG1hcmsuDQoNCg==