Question: Reliability Application
A wind energy company monitors the reliability of gearboxes in 75
identical wind turbines located in a coastal wind farm. The gearbox is a
critical component; its failure often leads to costly downtime and
repairs. Previous studies suggest that the hazard rate (failure risk)
may increase over time due to mechanical wear (fatigue, pitting, bearing
degradation). Engineers want to test whether the failure time
distribution follows an exponential model (constant hazard, random
failures) or a Weibull model with shape parameter \(k>1\) (increasing hazard, indicative of
aging/degradation). The failure times (in months) are:
5.2, 7.8, 9.1, 11.3, 12.5, 13.0, 14.2, 15.1, 15.9, 16.7, 17.2, 17.8, 18.4, 18.9,
19.3, 19.7, 20.2, 20.6, 21.0, 21.5, 21.9, 22.3, 22.7, 23.1, 23.5, 23.9, 24.3, 24.7,
25.1, 25.5, 25.9, 26.3, 26.7, 27.1, 27.5, 27.9, 28.3, 28.7, 29.1, 29.5, 29.9, 30.3,
30.7, 31.1, 31.5, 31.9, 32.3, 32.7, 33.1, 33.5, 33.9, 34.3, 34.7, 35.1, 35.5, 35.9,
36.3, 36.7, 37.1, 37.5, 37.9, 38.3, 38.7, 39.1, 39.5, 39.9, 40.3, 40.7, 41.1, 41.5,
41.9, 42.3, 42.7, 43.1, 43.5
# Store the 75 failure times as a numeric vector for analysis
failure_times <- c(
5.2, 7.8, 9.1, 11.3, 12.5, 13.0, 14.2, 15.1, 15.9, 16.7,
17.2, 17.8, 18.4, 18.9, 19.3, 19.7, 20.2, 20.6, 21.0, 21.5,
21.9, 22.3, 22.7, 23.1, 23.5, 23.9, 24.3, 24.7, 25.1, 25.5,
25.9, 26.3, 26.7, 27.1, 27.5, 27.9, 28.3, 28.7, 29.1, 29.5,
29.9, 30.3, 30.7, 31.1, 31.5, 31.9, 32.3, 32.7, 33.1, 33.5,
33.9, 34.3, 34.7, 35.1, 35.5, 35.9, 36.3, 36.7, 37.1, 37.5,
37.9, 38.3, 38.7, 39.1, 39.5, 39.9, 40.3, 40.7, 41.1, 41.5,
41.9, 42.3, 42.7, 43.1, 43.5
)
This assignment focuses on hypothesis \(H_0: \beta = 1\) (exponential) against
\(H_1: \beta \neq 1\) (Weibull). This
framework detects overfitting (fitting a Weibull when exponential is
true) and underfitting (fitting exponential when Weibull with \(\beta \neq 1\) is true).
a). Find the MLE of the Weibull parameters \(\lambda\) (scale) and \(\beta\) (shape), denoted by \(\hat{\lambda}\) and \(\hat{\beta}\), respectively, using the
optim() procedure. [Hint: You should provide explicit
expressions for the log-likelihood and gradient functions of the Weibull
distribution parameters.]
# Number of observations in the dataset
n <- length(failure_times)
# Define the Weibull log-likelihood function
weibull_loglik <- function(par, data) {
lambda <- par[1]
beta <- par[2]
n <- length(data)
if (lambda <= 0 || beta <= 0) return(-Inf)
ll <- n * log(beta) -
n * beta * log(lambda) +
(beta - 1) * sum(log(data)) -
sum((data / lambda)^beta)
return(ll)
}
# Define negative log-likelihood for minimization
weibull_nll <- function(par, data) {
-weibull_loglik(par, data)
}
# Define gradient of the negative log-likelihood
weibull_grad_nll <- function(par, data) {
lambda <- par[1]
beta <- par[2]
n <- length(data)
term <- (data / lambda)^beta
d_ll_d_lambda <- (beta / lambda) * (sum(term) - n)
d_ll_d_beta <- n / beta -
n * log(lambda) +
sum(log(data)) -
sum(term * log(data / lambda))
-c(d_ll_d_lambda, d_ll_d_beta)
}
# Choose reasonable starting values
start_vals <- c(mean(failure_times), 1)
# Run optim() to estimate Weibull parameters
fit_weibull <- optim(
par = start_vals,
fn = weibull_nll,
gr = weibull_grad_nll,
data = failure_times,
method = "L-BFGS-B",
lower = c(1e-8, 1e-8)
)
# Extract estimated parameter values
lambda_hat_weibull <- fit_weibull$par[1]
beta_hat_weibull <- fit_weibull$par[2]
lambda_hat_weibull
[1] 31.4182
[1] 3.370781
Using the optim() procedure, the MLE of the Weibull parameters are
\(\hat{\lambda} = 31.4182\) and \(\hat{\beta} = 3.370781\).
b). Find the MLE of the exponential parameter \(\lambda\) (scale), denoted by \(\hat{\lambda}\), using any procedure.
[Hint: You should provide explicit expressions for the
log-likelihood and gradient functions of the exponential distribution
parameters.]
# Exponential log-likelihood function
exp_loglik <- function(lambda, data) {
n <- length(data)
if (lambda <= 0) return(-Inf)
ll <- -n * log(lambda) - sum(data) / lambda
return(ll)
}
# Gradient of the exponential log-likelihood
exp_grad <- function(lambda, data) {
n <- length(data)
grad <- -n / lambda + sum(data) / (lambda^2)
return(grad)
}
# Compute the exponential MLE
lambda_hat_exp <- mean(failure_times)
lambda_hat_exp
[1] 28.18533
Using the exponential log-likelihood and gradient function, the MLE
of the exponential scale parameter is \(\hat{\lambda} = 28.18533\).
c). Use a) and b) to perform the regular likelihood ratio \(\chi^2\) test for \(\beta = 1\) and report the p-value.
# Weibull log-likelihood at the MLEs
loglik_weibull <- weibull_loglik(c(lambda_hat_weibull, beta_hat_weibull), failure_times)
# Exponential log-likelihood under beta = 1
loglik_exp <- exp_loglik(lambda_hat_exp, failure_times)
# Likelihood ratio test statistic
lrt_stat <- 2 * (loglik_weibull - loglik_exp)
# Chi-square p-value with 1 degree of freedom
p_value_lrt <- 1 - pchisq(lrt_stat, df = 1)
lrt_stat
[1] 100.6144
[1] 0
Using the likelihood ratio test, the test statistic is \(-2\log\Lambda = 100.6144\) and the p-value
is approximately \(0\), which is
statistically significant at the \(\alpha =
0.05\) level. Therefore, I reject \(H_0:\beta=1\).
d). Use the BLRT algorithm to perform a bootstrap likelihood ratio
test and report the bootstrap p-value. Note that you are expected to
translate the BLRT algorithm into R code to perform the BLRT. [Hint:
The chi-square distribution should not be used in this part of the
analysis.]
# Set a seed for reproducibility
set.seed(123)
# Number of bootstrap samples
B <- 999
# Store bootstrap test statistics
lrt_boot <- numeric(B)
# Generate bootstrap samples under the null model
for (b in 1:B) {
bs_sample <- rexp(length(failure_times), rate = 1 / lambda_hat_exp)
weibull_fit_bs <- optim(
par = c(mean(bs_sample), 1),
fn = weibull_nll,
gr = weibull_grad_nll,
data = bs_sample,
method = "L-BFGS-B",
lower = c(1e-8, 1e-8)
)
lambda_hat_bs <- weibull_fit_bs$par[1]
beta_hat_bs <- weibull_fit_bs$par[2]
lambda_hat_exp_bs <- mean(bs_sample)
loglik_weibull_bs <- weibull_loglik(c(lambda_hat_bs, beta_hat_bs), bs_sample)
loglik_exp_bs <- exp_loglik(lambda_hat_exp_bs, bs_sample)
lrt_boot[b] <- 2 * (loglik_weibull_bs - loglik_exp_bs)
}
# Bootstrap p-value
p_value_blrt <- (sum(lrt_boot >= lrt_stat) + 1) / (B + 1)
p_value_blrt
[1] 0.001
Using the BLRT algorithm, the bootstrap p-value is \(0.001\), which is statistically significant
at the \(\alpha = 0.05\) level.
Therefore, I reject \(H_0:\beta=1\).
e). Write a summary of the above analyses to address the
following:
Both the regular likelihood ratio \(\chi^2\) test and the bootstrap likelihood
ratio test (BLRT) gave the same result. In both cases, the p-values were
extremely small, so the results are statistically significant at the
\(\alpha = 0.05\) level and we reject
\(H_0:\beta=1\). This matches what we
saw in lecture, where the BLRT is used to confirm the \(\chi^2\) approximation, and in this case
they agree.
Since the exponential model corresponds to \(\beta = 1\), rejecting \(H_0\) suggests that the exponential model
does not fit the data well. The Weibull model allows \(\beta \ne 1\) and is more flexible, so it
provides a better fit for the data. Therefore, the Weibull model is
recommended.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCAxMDogQm9vdHN0cmFwIEh5cG90aGVzaXMgVGVzdGluZyIKYXV0aG9yOiAiS2F5bGEgRHllciIKZGF0ZTogIiBEdWU6IEFwcmlsIDIxLCAyMDI2IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUKICAgIHRoZW1lOiBzcGFjZWxhYgogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgcGRmX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfd2lkdGg6IDMKICAgIGZpZ19oZWlnaHQ6IDMKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CiNUT0M6OmJlZm9yZSB7CiAgY29udGVudDogIlRhYmxlIG9mIENvbnRlbnRzIjsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDEuMmVtOwogIGRpc3BsYXk6IGJsb2NrOwogIGNvbG9yOiBuYXZ5OwogIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCgpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOwogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOwogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsKICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsKfQoKaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8KICBmb250LXNpemU6IDIycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKfQoKaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDE1cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsKICBjb2xvcjogbmF2eTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogIGZvbnQtc2l6ZTogMThweDsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLwouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7CiAgY29udGVudDogIi4iOwoKYm9keSB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICAgICAgY29sb3I6ICMwMDAwMDA7CiAgICAgIGZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKICAgICAgZm9udC1zaXplOiAxcmVtOwogICAgICBsaW5lLWhlaWdodDogMS42OwogICAgICB9CgouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQoKcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCn0KYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IAojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikKICAgbGlicmFyeShrbml0cikKfQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoInBhbmRlciIpCiAgIGxpYnJhcnkocGFuZGVyKQp9CmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpCiAgbGlicmFyeShnZ3Bsb3QyKQp9CmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQogIGxpYnJhcnkodGlkeXZlcnNlKQp9CgppZiAoIXJlcXVpcmUoInBsb3RseSIpKSB7CiAgaW5zdGFsbC5wYWNrYWdlcygicGxvdGx5IikKICBsaWJyYXJ5KHBsb3RseSkKfQoKaWYgKCFyZXF1aXJlKCJWR0FNIikpIHsKICBpbnN0YWxsLnBhY2thZ2VzKCJWR0FNIikKICBsaWJyYXJ5KFZHQU0pCn0KIyMjIyBWR0FNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLgogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BCiAgICAgICAgICAgICAgICAgICAgICApICAKYGBgCiAKIFwKIAojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIAoKPHA+CiogRW5oYW5jZSB1bmRlcnN0YW5kaW5nIHRoZSBwcm9jZWR1cmUgb2YgQm9vdHN0cmFwIGh5cG90aGVzaXMgdGVzdGluZy4KCiogSW1wbGVtZW50IHRoZSBwcm9jZWR1cmVzIGZvciBkZXRlY3Rpbmcgb3ZlcmZpdHRpbmcvdW5kZXJmaXR0aW5nIGlzc3VlcyBpbiBwcmFjdGljYWwgYXBwbGljYXRpb25zIHVzaW5nIGJvb3RzdHJhcCBsaWtlbGlob29kIHJhdGlvIHRlc3QuCjwvcD4KCgojIyAqKlBvbGljaWVzIG9mIFVzaW5nIEFJIFRvb2xzKioKCjxwPgoqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBQbGVhc2UgYWRoZXJlIHRvIHRoZSBBSSB0b29sIHBvbGljeSBzcGVjaWZpZWQgaW4gdGhlIGNvdXJzZSBzeWxsYWJ1cy4gVGhlIGRpcmVjdCBjb3B5aW5nIG9mIEFJLWdlbmVyYXRlZCBjb250ZW50IGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIEFsbCBzdWJtaXR0ZWQgd29yayBtdXN0IHJlZmxlY3QgeW91ciBvd24gdW5kZXJzdGFuZGluZzsgd2hlcmUgZXh0ZXJuYWwgdG9vbHMgYXJlIGNvbnN1bHRlZCwgY29udGVudCBtdXN0IGJlIHRob3JvdWdobHkgcmVwaHJhc2VkIGFuZCBzeW50aGVzaXplZCBpbiB5b3VyIG93biB3b3Jkcy4KPC9wPgoKPHA+CioqQ29kZSBJbmNsdXNpb24gUmVxdWlyZW1lbnQqKjogQW55IGNvZGUgaW5jbHVkZWQgaW4geW91ciBlc3NheSBtdXN0IGJlIHByb3Blcmx5IGNvbW1lbnRlZCB0byBleHBsYWluIHRoZSBwdXJwb3NlIGFuZC9vciBleHBlY3RlZCBvdXRwdXQgb2Yga2V5IGNvZGUgbGluZXMuIFN1Ym1pdHRpbmcgQUktZ2VuZXJhdGVkIGNvZGUgd2l0aG91dCBtZWFuaW5nZnVsLCBzdHVkZW50LWFkZGVkIGNvbW1lbnRzIHdpbGwgbm90IGJlIGFjY2VwdGVkLgo8L3A+CgoKCgojIyBUZXN0aW5nIE92ZXJmaXR0aW5nL1VuZGVyZml0dGluZwoKSW4gTWFjaGluZSBMZWFybmluZyBhbmQgU3RhdGlzdGljcywgb3ZlcmZpdHRpbmcgb2NjdXJzIHdoZW4gYSBtb2RlbCBpcyB0b28gY29tcGxleCBhbmQgbGVhcm5zIG5vaXNlLCBsZWFkaW5nIHRvIHBvb3IgcGVyZm9ybWFuY2Ugb24gbmV3IGRhdGEsIHdoaWxlIHVuZGVyZml0dGluZyBoYXBwZW5zIHdoZW4gYSBtb2RlbCBpcyB0b28gc2ltcGxlIHRvIGNhcHR1cmUgaW1wb3J0YW50IHBhdHRlcm5zLCByZXN1bHRpbmcgaW4gaGlnaCBlcnJvcnMgb3ZlcmFsbDsgYm90aCBpc3N1ZXMgYXJlIGV4cGxhaW5lZCBieSB0aGUgQmlhc+KAk1ZhcmlhbmNlIFRyYWRlb2ZmIGFuZCBjYW4gY2F1c2UgdW5yZWxpYWJsZSBwcmVkaWN0aW9ucyBpbiByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucy4KCgpUaGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiAoUERGKSBvZiB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gaXM6CgokJApmKHQ7IFxsYW1iZGEsIFxiZXRhKSA9IFxmcmFje1xiZXRhfXtcbGFtYmRhfSBcbGVmdCggXGZyYWN7dH17XGxhbWJkYX0gXHJpZ2h0KV57XGJldGEtMX0gXGV4cFxsZWZ0WyAtXGxlZnQoIFxmcmFje3R9e1xsYW1iZGF9IFxyaWdodCleXGJldGEgXHJpZ2h0XSwgXHF1YWQgdCBcZ2UgMAokJAp3aGVyZSAkXGxhbWJkYSA+IDAkIGlzIHRoZSBzY2FsZSBwYXJhbWV0ZXIgKGNoYXJhY3RlcmlzdGljIGxpZmUpIGFuZCAkXGJldGEgPiAwJCBpcyB0aGUgc2hhcGUgcGFyYW1ldGVyLgoKV2hlbiAkXGJldGEgPSAxJCwgdGhlIFdlaWJ1bGwgUERGIHNpbXBsaWZpZXMgdG8gdGhlIGV4cG9uZW50aWFsIFBERjoKCiQkCmYodDsgXGxhbWJkYSkgPSBcZnJhY3sxfXtcbGFtYmRhfSBcZXhwXGxlZnQoIC1cZnJhY3t0fXtcbGFtYmRhfSBccmlnaHQpCiQkCndpdGggY29uc3RhbnQgaGF6YXJkIHJhdGUgJGgodCkgPSAxL1xsYW1iZGEkLgoKCjxwPjxmb250IGNvbG9yID0gImRhcmtyZWQiPioqVGhpcyBhc3NpZ25tZW50IGZvY3VzZXMgb24gcGVyZm9ybWluZyBhIGh5cG90aGVzaXMgdGVzdCBmb3IgdGhlIHNoYXBlIHBhcmFtZXRlciAoJFxiZXRhJCkgb2YgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIHdpdGhpbiBhIHJlbGlhYmlsaXR5IG1vZGUqKjwvZm9udD48L3A+CgoKXGJlZ2lue2FsaWdufQpIXzAmOiBcYmV0YSA9IDEgXHF1YWQgXHRleHR7KEV4cG9uZW50aWFsIG1vZGVsLCBzaW1wbGVyKX0gXFwKSF8xJjogXGJldGEgXG5lcSAxIFxxdWFkIFx0ZXh0eyhXZWlidWxsIG1vZGVsLCBtb3JlIGNvbXBsZXgpfQpcZW5ke2FsaWdufQoKCgojIyBTdGVwcyBvZiB0aGUgQkxSVAoKCiogRml0IG1vZGVscyB1bmRlciAkSF8wJCBhbmQgJEhfMSR9IHRvIHRoZSBvcmlnaW5hbCBkYXRhLCBjb21wdXRlICRcTGFtYmRhX3tcdGV4dHtvYnN9fSQuCgoqIEdlbmVyYXRlIGJvb3RzdHJhcCBzYW1wbGVzIHVuZGVyICRIXzAkfTogCiAgKyBFc3RpbWF0ZSBwYXJhbWV0ZXJzIHVuZGVyICRIXzAkIGZyb20gdGhlIG9yaWdpbmFsIGRhdGEuCiAgKyBHZW5lcmF0ZSAkQiQgZGF0YXNldHMgYnkgc2FtcGxpbmcgZnJvbSB0aGUgbW9kZWwgdW5kZXIgJEhfMCQgKHBhcmFtZXRyaWMgYm9vdHN0cmFwKSBvciBieSByZXNhbXBsaW5nIHJlc2lkdWFscy9jYXNlcyAobm9ucGFyYW1ldHJpYyBib290c3RyYXA7IHBhcmFtZXRyaWMgaXMgY29tbW9uIGZvciBCTFJUKS4KCiogRm9yIGVhY2ggYm9vdHN0cmFwIHNhbXBsZSAkYiA9IDEsXGRvdHMsQiQ6CiAgKyBGaXQgJEhfMCQgYW5kICRIXzEkIG1vZGVscy4KICArIENvbXB1dGUgJFxMYW1iZGFfYiA9IC0yW1xlbGxfezAsYn0gLSBcZWxsX3sxLGJ9XSQuCgoqIEFwcHJveGltYXRlIHAtdmFsdWU6CgokJAogIHAgPSBcZnJhY3sxfXtCfSBcc3VtX3tiPTF9XkIgSShcTGFtYmRhX2IgXGdlIFxMYW1iZGFfe1x0ZXh0e29ic319KQokJAooT2Z0ZW4gYSBzbWFsbCBhZGp1c3RtZW50IGlzIG1hZGUgZm9yIHN0YWJpbGl0eTogJCgxICsgXCNce1xMYW1iZGFfYiBcZ2UgXExhbWJkYV97XHRleHR7b2JzfX1cfSkvKEIrMSkkKS4KCgoKXAoKIyMgKipRdWVzdGlvbjogUmVsaWFiaWxpdHkgQXBwbGljYXRpb24qKgoKPHA+CkEgd2luZCBlbmVyZ3kgY29tcGFueSBtb25pdG9ycyB0aGUgcmVsaWFiaWxpdHkgb2YgZ2VhcmJveGVzIGluIDc1IGlkZW50aWNhbCB3aW5kIHR1cmJpbmVzIGxvY2F0ZWQgaW4gYSBjb2FzdGFsIHdpbmQgZmFybS4gVGhlIGdlYXJib3ggaXMgYSBjcml0aWNhbCBjb21wb25lbnQ7IGl0cyBmYWlsdXJlIG9mdGVuIGxlYWRzIHRvIGNvc3RseSBkb3dudGltZSBhbmQgcmVwYWlycy4gUHJldmlvdXMgc3R1ZGllcyBzdWdnZXN0IHRoYXQgdGhlIGhhemFyZCByYXRlIChmYWlsdXJlIHJpc2spIG1heSBpbmNyZWFzZSBvdmVyIHRpbWUgZHVlIHRvIG1lY2hhbmljYWwgd2VhciAoZmF0aWd1ZSwgcGl0dGluZywgYmVhcmluZyBkZWdyYWRhdGlvbikuIEVuZ2luZWVycyB3YW50IHRvIHRlc3Qgd2hldGhlciB0aGUgZmFpbHVyZSB0aW1lIGRpc3RyaWJ1dGlvbiBmb2xsb3dzIGFuIGV4cG9uZW50aWFsIG1vZGVsIChjb25zdGFudCBoYXphcmQsIHJhbmRvbSBmYWlsdXJlcykgb3IgYSBXZWlidWxsIG1vZGVsIHdpdGggc2hhcGUgcGFyYW1ldGVyICRrPjEkIChpbmNyZWFzaW5nIGhhemFyZCwgaW5kaWNhdGl2ZSBvZiBhZ2luZy9kZWdyYWRhdGlvbikuIFRoZSBmYWlsdXJlIHRpbWVzIChpbiBtb250aHMpIGFyZToKCmBgYAogICA1LjIsICA3LjgsICA5LjEsIDExLjMsIDEyLjUsIDEzLjAsIDE0LjIsIDE1LjEsIDE1LjksIDE2LjcsIDE3LjIsIDE3LjgsIDE4LjQsIDE4LjksIAogIDE5LjMsIDE5LjcsIDIwLjIsIDIwLjYsIDIxLjAsIDIxLjUsIDIxLjksIDIyLjMsIDIyLjcsIDIzLjEsIDIzLjUsIDIzLjksIDI0LjMsIDI0LjcsIAogIDI1LjEsIDI1LjUsIDI1LjksIDI2LjMsIDI2LjcsIDI3LjEsIDI3LjUsIDI3LjksIDI4LjMsIDI4LjcsIDI5LjEsIDI5LjUsIDI5LjksIDMwLjMsIAogIDMwLjcsIDMxLjEsIDMxLjUsIDMxLjksIDMyLjMsIDMyLjcsIDMzLjEsIDMzLjUsIDMzLjksIDM0LjMsIDM0LjcsIDM1LjEsIDM1LjUsIDM1LjksIAogIDM2LjMsIDM2LjcsIDM3LjEsIDM3LjUsIDM3LjksIDM4LjMsIDM4LjcsIDM5LjEsIDM5LjUsIDM5LjksIDQwLjMsIDQwLjcsIDQxLjEsIDQxLjUsCiAgNDEuOSwgNDIuMywgNDIuNywgNDMuMSwgNDMuNQpgYGAKCmBgYHtyfQojIFN0b3JlIHRoZSA3NSBmYWlsdXJlIHRpbWVzIGFzIGEgbnVtZXJpYyB2ZWN0b3IgZm9yIGFuYWx5c2lzCmZhaWx1cmVfdGltZXMgPC0gYygKICA1LjIsIDcuOCwgOS4xLCAxMS4zLCAxMi41LCAxMy4wLCAxNC4yLCAxNS4xLCAxNS45LCAxNi43LAogIDE3LjIsIDE3LjgsIDE4LjQsIDE4LjksIDE5LjMsIDE5LjcsIDIwLjIsIDIwLjYsIDIxLjAsIDIxLjUsCiAgMjEuOSwgMjIuMywgMjIuNywgMjMuMSwgMjMuNSwgMjMuOSwgMjQuMywgMjQuNywgMjUuMSwgMjUuNSwKICAyNS45LCAyNi4zLCAyNi43LCAyNy4xLCAyNy41LCAyNy45LCAyOC4zLCAyOC43LCAyOS4xLCAyOS41LAogIDI5LjksIDMwLjMsIDMwLjcsIDMxLjEsIDMxLjUsIDMxLjksIDMyLjMsIDMyLjcsIDMzLjEsIDMzLjUsCiAgMzMuOSwgMzQuMywgMzQuNywgMzUuMSwgMzUuNSwgMzUuOSwgMzYuMywgMzYuNywgMzcuMSwgMzcuNSwKICAzNy45LCAzOC4zLCAzOC43LCAzOS4xLCAzOS41LCAzOS45LCA0MC4zLCA0MC43LCA0MS4xLCA0MS41LAogIDQxLjksIDQyLjMsIDQyLjcsIDQzLjEsIDQzLjUKKQpgYGAKCjwvcD4KClRoaXMgYXNzaWdubWVudCBmb2N1c2VzIG9uIGh5cG90aGVzaXMgJEhfMDogXGJldGEgPSAxJCAoZXhwb25lbnRpYWwpIGFnYWluc3QgJEhfMTogXGJldGEgXG5lcSAxJCAoV2VpYnVsbCkuIFRoaXMgZnJhbWV3b3JrIGRldGVjdHMgb3ZlcmZpdHRpbmcgKGZpdHRpbmcgYSBXZWlidWxsIHdoZW4gZXhwb25lbnRpYWwgaXMgdHJ1ZSkgYW5kIHVuZGVyZml0dGluZyAoZml0dGluZyBleHBvbmVudGlhbCB3aGVuIFdlaWJ1bGwgd2l0aCAkXGJldGEgXG5lcSAxJCBpcyB0cnVlKS4gCgoKPHA+CmEpLiBGaW5kIHRoZSBNTEUgb2YgdGhlIFdlaWJ1bGwgcGFyYW1ldGVycyAkXGxhbWJkYSQgKHNjYWxlKSBhbmQgJFxiZXRhJCAoc2hhcGUpLCBkZW5vdGVkIGJ5ICRcaGF0e1xsYW1iZGF9JCBhbmQgJFxoYXR7XGJldGF9JCwgcmVzcGVjdGl2ZWx5LCB1c2luZyB0aGUgYG9wdGltKClgIHByb2NlZHVyZS4gWypIaW50OiBZb3Ugc2hvdWxkIHByb3ZpZGUgZXhwbGljaXQgZXhwcmVzc2lvbnMgZm9yIHRoZSBsb2ctbGlrZWxpaG9vZCBhbmQgZ3JhZGllbnQgZnVuY3Rpb25zIG9mIHRoZSBXZWlidWxsIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJzLipdCgpgYGB7cn0KIyBOdW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGluIHRoZSBkYXRhc2V0Cm4gPC0gbGVuZ3RoKGZhaWx1cmVfdGltZXMpCgojIERlZmluZSB0aGUgV2VpYnVsbCBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbgp3ZWlidWxsX2xvZ2xpayA8LSBmdW5jdGlvbihwYXIsIGRhdGEpIHsKICBsYW1iZGEgPC0gcGFyWzFdCiAgYmV0YSAgIDwtIHBhclsyXQogIG4gPC0gbGVuZ3RoKGRhdGEpCiAgCiAgaWYgKGxhbWJkYSA8PSAwIHx8IGJldGEgPD0gMCkgcmV0dXJuKC1JbmYpCiAgCiAgbGwgPC0gbiAqIGxvZyhiZXRhKSAtCiAgICAgICAgbiAqIGJldGEgKiBsb2cobGFtYmRhKSArCiAgICAgICAgKGJldGEgLSAxKSAqIHN1bShsb2coZGF0YSkpIC0KICAgICAgICBzdW0oKGRhdGEgLyBsYW1iZGEpXmJldGEpCiAgCiAgcmV0dXJuKGxsKQp9CgojIERlZmluZSBuZWdhdGl2ZSBsb2ctbGlrZWxpaG9vZCBmb3IgbWluaW1pemF0aW9uCndlaWJ1bGxfbmxsIDwtIGZ1bmN0aW9uKHBhciwgZGF0YSkgewogIC13ZWlidWxsX2xvZ2xpayhwYXIsIGRhdGEpCn0KCiMgRGVmaW5lIGdyYWRpZW50IG9mIHRoZSBuZWdhdGl2ZSBsb2ctbGlrZWxpaG9vZAp3ZWlidWxsX2dyYWRfbmxsIDwtIGZ1bmN0aW9uKHBhciwgZGF0YSkgewogIGxhbWJkYSA8LSBwYXJbMV0KICBiZXRhICAgPC0gcGFyWzJdCiAgbiA8LSBsZW5ndGgoZGF0YSkKICAKICB0ZXJtIDwtIChkYXRhIC8gbGFtYmRhKV5iZXRhCiAgCiAgZF9sbF9kX2xhbWJkYSA8LSAoYmV0YSAvIGxhbWJkYSkgKiAoc3VtKHRlcm0pIC0gbikKICAKICBkX2xsX2RfYmV0YSA8LSBuIC8gYmV0YSAtCiAgICAgICAgICAgICAgICAgbiAqIGxvZyhsYW1iZGEpICsKICAgICAgICAgICAgICAgICBzdW0obG9nKGRhdGEpKSAtCiAgICAgICAgICAgICAgICAgc3VtKHRlcm0gKiBsb2coZGF0YSAvIGxhbWJkYSkpCiAgCiAgLWMoZF9sbF9kX2xhbWJkYSwgZF9sbF9kX2JldGEpCn0KYGBgCgpgYGB7cn0KIyBDaG9vc2UgcmVhc29uYWJsZSBzdGFydGluZyB2YWx1ZXMKc3RhcnRfdmFscyA8LSBjKG1lYW4oZmFpbHVyZV90aW1lcyksIDEpCgojIFJ1biBvcHRpbSgpIHRvIGVzdGltYXRlIFdlaWJ1bGwgcGFyYW1ldGVycwpmaXRfd2VpYnVsbCA8LSBvcHRpbSgKICBwYXIgPSBzdGFydF92YWxzLAogIGZuID0gd2VpYnVsbF9ubGwsCiAgZ3IgPSB3ZWlidWxsX2dyYWRfbmxsLAogIGRhdGEgPSBmYWlsdXJlX3RpbWVzLAogIG1ldGhvZCA9ICJMLUJGR1MtQiIsCiAgbG93ZXIgPSBjKDFlLTgsIDFlLTgpCikKYGBgCgpgYGB7cn0KIyBFeHRyYWN0IGVzdGltYXRlZCBwYXJhbWV0ZXIgdmFsdWVzCmxhbWJkYV9oYXRfd2VpYnVsbCA8LSBmaXRfd2VpYnVsbCRwYXJbMV0KYmV0YV9oYXRfd2VpYnVsbCAgIDwtIGZpdF93ZWlidWxsJHBhclsyXQoKbGFtYmRhX2hhdF93ZWlidWxsCmJldGFfaGF0X3dlaWJ1bGwKYGBgCgpVc2luZyB0aGUgb3B0aW0oKSBwcm9jZWR1cmUsIHRoZSBNTEUgb2YgdGhlIFdlaWJ1bGwgcGFyYW1ldGVycyBhcmUgJFxoYXR7XGxhbWJkYX0gPSAzMS40MTgyJCBhbmQgJFxoYXR7XGJldGF9ID0gMy4zNzA3ODEkLgoKYikuIEZpbmQgdGhlIE1MRSBvZiB0aGUgZXhwb25lbnRpYWwgcGFyYW1ldGVyICRcbGFtYmRhJCAoc2NhbGUpLCBkZW5vdGVkIGJ5ICRcaGF0e1xsYW1iZGF9JCwgdXNpbmcgYW55IHByb2NlZHVyZS4gWypIaW50OiBZb3Ugc2hvdWxkIHByb3ZpZGUgZXhwbGljaXQgZXhwcmVzc2lvbnMgZm9yIHRoZSBsb2ctbGlrZWxpaG9vZCBhbmQgZ3JhZGllbnQgZnVuY3Rpb25zIG9mIHRoZSBleHBvbmVudGlhbCBkaXN0cmlidXRpb24gcGFyYW1ldGVycy4qXQoKYGBge3J9CiMgRXhwb25lbnRpYWwgbG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24KZXhwX2xvZ2xpayA8LSBmdW5jdGlvbihsYW1iZGEsIGRhdGEpIHsKICBuIDwtIGxlbmd0aChkYXRhKQogIAogIGlmIChsYW1iZGEgPD0gMCkgcmV0dXJuKC1JbmYpCiAgCiAgbGwgPC0gLW4gKiBsb2cobGFtYmRhKSAtIHN1bShkYXRhKSAvIGxhbWJkYQogIAogIHJldHVybihsbCkKfQoKIyBHcmFkaWVudCBvZiB0aGUgZXhwb25lbnRpYWwgbG9nLWxpa2VsaWhvb2QKZXhwX2dyYWQgPC0gZnVuY3Rpb24obGFtYmRhLCBkYXRhKSB7CiAgbiA8LSBsZW5ndGgoZGF0YSkKICAKICBncmFkIDwtIC1uIC8gbGFtYmRhICsgc3VtKGRhdGEpIC8gKGxhbWJkYV4yKQogIAogIHJldHVybihncmFkKQp9CmBgYAoKYGBge3J9CiMgQ29tcHV0ZSB0aGUgZXhwb25lbnRpYWwgTUxFCmxhbWJkYV9oYXRfZXhwIDwtIG1lYW4oZmFpbHVyZV90aW1lcykKCmxhbWJkYV9oYXRfZXhwCmBgYAoKVXNpbmcgdGhlIGV4cG9uZW50aWFsIGxvZy1saWtlbGlob29kIGFuZCBncmFkaWVudCBmdW5jdGlvbiwgdGhlIE1MRSBvZiB0aGUgZXhwb25lbnRpYWwgc2NhbGUgcGFyYW1ldGVyIGlzICRcaGF0e1xsYW1iZGF9ID0gMjguMTg1MzMkLgoKYykuIFVzZSBhKSBhbmQgYikgdG8gcGVyZm9ybSB0aGUgcmVndWxhciBsaWtlbGlob29kIHJhdGlvICRcY2hpXjIkIHRlc3QgZm9yICRcYmV0YSA9IDEkIGFuZCByZXBvcnQgdGhlIHAtdmFsdWUuCgpgYGB7cn0KIyBXZWlidWxsIGxvZy1saWtlbGlob29kIGF0IHRoZSBNTEVzCmxvZ2xpa193ZWlidWxsIDwtIHdlaWJ1bGxfbG9nbGlrKGMobGFtYmRhX2hhdF93ZWlidWxsLCBiZXRhX2hhdF93ZWlidWxsKSwgZmFpbHVyZV90aW1lcykKCiMgRXhwb25lbnRpYWwgbG9nLWxpa2VsaWhvb2QgdW5kZXIgYmV0YSA9IDEKbG9nbGlrX2V4cCA8LSBleHBfbG9nbGlrKGxhbWJkYV9oYXRfZXhwLCBmYWlsdXJlX3RpbWVzKQoKIyBMaWtlbGlob29kIHJhdGlvIHRlc3Qgc3RhdGlzdGljCmxydF9zdGF0IDwtIDIgKiAobG9nbGlrX3dlaWJ1bGwgLSBsb2dsaWtfZXhwKQoKIyBDaGktc3F1YXJlIHAtdmFsdWUgd2l0aCAxIGRlZ3JlZSBvZiBmcmVlZG9tCnBfdmFsdWVfbHJ0IDwtIDEgLSBwY2hpc3EobHJ0X3N0YXQsIGRmID0gMSkKCmxydF9zdGF0CnBfdmFsdWVfbHJ0CmBgYAoKVXNpbmcgdGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCwgdGhlIHRlc3Qgc3RhdGlzdGljIGlzICQtMlxsb2dcTGFtYmRhID0gMTAwLjYxNDQkIGFuZCB0aGUgcC12YWx1ZSBpcyBhcHByb3hpbWF0ZWx5ICQwJCwgd2hpY2ggaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIGxldmVsLiBUaGVyZWZvcmUsIEkgcmVqZWN0ICRIXzA6XGJldGE9MSQuCgpkKS4gVXNlIHRoZSBCTFJUIGFsZ29yaXRobSB0byBwZXJmb3JtIGEgYm9vdHN0cmFwIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBhbmQgcmVwb3J0IHRoZSBib290c3RyYXAgcC12YWx1ZS4gTm90ZSB0aGF0IHlvdSBhcmUgZXhwZWN0ZWQgdG8gdHJhbnNsYXRlIHRoZSBCTFJUIGFsZ29yaXRobSBpbnRvIFIgY29kZSB0byBwZXJmb3JtIHRoZSBCTFJULiBbKkhpbnQ6IFRoZSBjaGktc3F1YXJlIGRpc3RyaWJ1dGlvbiBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhpcyBwYXJ0IG9mIHRoZSBhbmFseXNpcy4qXQoKYGBge3J9CiMgU2V0IGEgc2VlZCBmb3IgcmVwcm9kdWNpYmlsaXR5CnNldC5zZWVkKDEyMykKCiMgTnVtYmVyIG9mIGJvb3RzdHJhcCBzYW1wbGVzCkIgPC0gOTk5CgojIFN0b3JlIGJvb3RzdHJhcCB0ZXN0IHN0YXRpc3RpY3MKbHJ0X2Jvb3QgPC0gbnVtZXJpYyhCKQoKIyBHZW5lcmF0ZSBib290c3RyYXAgc2FtcGxlcyB1bmRlciB0aGUgbnVsbCBtb2RlbApmb3IgKGIgaW4gMTpCKSB7CiAgYnNfc2FtcGxlIDwtIHJleHAobGVuZ3RoKGZhaWx1cmVfdGltZXMpLCByYXRlID0gMSAvIGxhbWJkYV9oYXRfZXhwKQogIAogIHdlaWJ1bGxfZml0X2JzIDwtIG9wdGltKAogICAgcGFyID0gYyhtZWFuKGJzX3NhbXBsZSksIDEpLAogICAgZm4gPSB3ZWlidWxsX25sbCwKICAgIGdyID0gd2VpYnVsbF9ncmFkX25sbCwKICAgIGRhdGEgPSBic19zYW1wbGUsCiAgICBtZXRob2QgPSAiTC1CRkdTLUIiLAogICAgbG93ZXIgPSBjKDFlLTgsIDFlLTgpCiAgKQogIAogIGxhbWJkYV9oYXRfYnMgPC0gd2VpYnVsbF9maXRfYnMkcGFyWzFdCiAgYmV0YV9oYXRfYnMgICA8LSB3ZWlidWxsX2ZpdF9icyRwYXJbMl0KICAKICBsYW1iZGFfaGF0X2V4cF9icyA8LSBtZWFuKGJzX3NhbXBsZSkKICAKICBsb2dsaWtfd2VpYnVsbF9icyA8LSB3ZWlidWxsX2xvZ2xpayhjKGxhbWJkYV9oYXRfYnMsIGJldGFfaGF0X2JzKSwgYnNfc2FtcGxlKQogIGxvZ2xpa19leHBfYnMgPC0gZXhwX2xvZ2xpayhsYW1iZGFfaGF0X2V4cF9icywgYnNfc2FtcGxlKQogIAogIGxydF9ib290W2JdIDwtIDIgKiAobG9nbGlrX3dlaWJ1bGxfYnMgLSBsb2dsaWtfZXhwX2JzKQp9CgojIEJvb3RzdHJhcCBwLXZhbHVlCnBfdmFsdWVfYmxydCA8LSAoc3VtKGxydF9ib290ID49IGxydF9zdGF0KSArIDEpIC8gKEIgKyAxKQoKcF92YWx1ZV9ibHJ0CmBgYAoKVXNpbmcgdGhlIEJMUlQgYWxnb3JpdGhtLCB0aGUgYm9vdHN0cmFwIHAtdmFsdWUgaXMgJDAuMDAxJCwgd2hpY2ggaXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIGxldmVsLiBUaGVyZWZvcmUsIEkgcmVqZWN0ICRIXzA6XGJldGE9MSQuCgplKS4gV3JpdGUgYSBzdW1tYXJ5IG9mIHRoZSBhYm92ZSBhbmFseXNlcyB0byBhZGRyZXNzIHRoZSBmb2xsb3dpbmc6CgoqIFdoZXRoZXIgdGhlIHR3byB0ZXN0cyBnZW5lcmF0ZWQgdGhlIHNhbWUgcmVzdWx0cy4KCiogV2hpY2ggbW9kZWwgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBkYXRhLgoKQm90aCB0aGUgcmVndWxhciBsaWtlbGlob29kIHJhdGlvICRcY2hpXjIkIHRlc3QgYW5kIHRoZSBib290c3RyYXAgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IChCTFJUKSBnYXZlIHRoZSBzYW1lIHJlc3VsdC4gSW4gYm90aCBjYXNlcywgdGhlIHAtdmFsdWVzIHdlcmUgZXh0cmVtZWx5IHNtYWxsLCBzbyB0aGUgcmVzdWx0cyBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhdCB0aGUgJFxhbHBoYSA9IDAuMDUkIGxldmVsIGFuZCB3ZSByZWplY3QgJEhfMDpcYmV0YT0xJC4gVGhpcyBtYXRjaGVzIHdoYXQgd2Ugc2F3IGluIGxlY3R1cmUsIHdoZXJlIHRoZSBCTFJUIGlzIHVzZWQgdG8gY29uZmlybSB0aGUgJFxjaGleMiQgYXBwcm94aW1hdGlvbiwgYW5kIGluIHRoaXMgY2FzZSB0aGV5IGFncmVlLgoKU2luY2UgdGhlIGV4cG9uZW50aWFsIG1vZGVsIGNvcnJlc3BvbmRzIHRvICRcYmV0YSA9IDEkLCByZWplY3RpbmcgJEhfMCQgc3VnZ2VzdHMgdGhhdCB0aGUgZXhwb25lbnRpYWwgbW9kZWwgZG9lcyBub3QgZml0IHRoZSBkYXRhIHdlbGwuIFRoZSBXZWlidWxsIG1vZGVsIGFsbG93cyAkXGJldGEgXG5lIDEkIGFuZCBpcyBtb3JlIGZsZXhpYmxlLCBzbyBpdCBwcm92aWRlcyBhIGJldHRlciBmaXQgZm9yIHRoZSBkYXRhLiBUaGVyZWZvcmUsIHRoZSBXZWlidWxsIG1vZGVsIGlzIHJlY29tbWVuZGVkLgoKPC9wPgoKCgo=