Testing Overfitting/Underfitting
In Machine Learning and Statistics, overfitting occurs when a model
is too complex and learns noise, leading to poor performance on new
data, while underfitting happens when a model is too simple to capture
important patterns, resulting in high errors overall; both issues are
explained by the Bias–Variance Tradeoff and can cause unreliable
predictions in real-world applications.
The probability density function (PDF) of the Weibull distribution
is:
\[
f(t; \lambda, \beta) = \frac{\beta}{\lambda} \left( \frac{t}{\lambda}
\right)^{\beta-1} \exp\left[ -\left( \frac{t}{\lambda} \right)^\beta
\right], \quad t \ge 0
\] where \(\lambda > 0\) is
the scale parameter (characteristic life) and \(\beta > 0\) is the shape parameter.
When \(\beta = 1\), the Weibull PDF
simplifies to the exponential PDF:
\[
f(t; \lambda) = \frac{1}{\lambda} \exp\left( -\frac{t}{\lambda} \right)
\] with constant hazard rate \(h(t) =
1/\lambda\).
This assignment focuses on performing a
hypothesis test for the shape parameter (\(\beta\)) of the Weibull distribution within
a reliability mode
\[\begin{align}
H_0&: \beta = 1 \quad \text{(Exponential model, simpler)} \\
H_1&: \beta \neq 1 \quad \text{(Weibull model, more complex)}
\end{align}\]
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
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.]
############################################################
# (a) Weibull MLE
############################################################
t <- c(
12.4, 18.7, 25.3, 30.1, 33.5, 35.2, 38.9, 40.3, 42.7, 45.1,
47.6, 49.8, 52.4, 55.0, 57.3, 60.2, 62.8, 65.1, 67.9, 70.5,
72.3, 75.6, 78.2, 80.9, 83.4, 85.7, 88.1, 90.6, 93.2, 95.8,
98.4, 101.0, 104.5, 107.3, 110.6, 113.2, 116.8, 120.1, 123.7, 127.4,
130.9, 134.5, 138.2, 142.0, 146.3, 150.7, 155.2, 160.8, 168.4, 175.9
)
weibull_nll <- function(par, t) {
lambda <- par[1]
beta <- par[2]
if (lambda <= 0 || beta <= 0) return(Inf)
ll <- sum(log(beta/lambda) +
(beta - 1)*log(t/lambda) -
(t/lambda)^beta)
return(-ll)
}
fit <- optim(c(mean(t), 1), weibull_nll, t = t, hessian = TRUE)
lambda_hat <- fit$par[1]
beta_hat <- fit$par[2]
lambda_hat
[1] 99.02759
[1] 2.205876
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.]
############################################################
# (b) Exponential MLE
############################################################
lambda_exp_hat <- mean(t)
lambda_exp_hat
[1] 87.61
c). Use a) and b) to perform the regular likelihood ratio \(\chi^2\) test for \(\beta = 1\) and report the p-value.
############################################################
# (c) Likelihood Ratio Test
############################################################
ll_weibull <- -fit$value
ll_exp <- sum(-log(lambda_exp_hat) - t/lambda_exp_hat)
LRT_stat <- 2 * (ll_weibull - ll_exp)
pval_LRT <- 1 - pchisq(LRT_stat, df = 1)
LRT_stat
[1] 34.44995
[1] 4.373535e-09
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.]
############################################################
# (d) Wald Test
############################################################
vcov_mat <- solve(fit$hessian)
var_beta <- vcov_mat[2,2]
W_stat <- (beta_hat - 1)^2 / var_beta
pval_Wald <- 1 - pchisq(W_stat, df = 1)
W_stat
[1] 23.10901
[1] 1.530721e-06
e). Write a summary of the above analyses to address the
following:
############################################################
# (e) Density Plot
############################################################
x_vals <- seq(min(t), max(t), length.out = 200)
# Weibull density
weibull_density <- (beta_hat / lambda_hat) *
(x_vals / lambda_hat)^(beta_hat - 1) *
exp(-(x_vals / lambda_hat)^beta_hat)
# Exponential density
exp_density <- (1 / lambda_exp_hat) * exp(-x_vals / lambda_exp_hat)
# Plot
hist(t, probability = TRUE,
main = "Weibull vs Exponential Fit",
xlab = "Time to Failure")
lines(x_vals, weibull_density, lwd = 2)
lines(x_vals, exp_density, lwd = 2, lty = 2)
legend("topright",
legend = c("Weibull", "Exponential"),
lwd = 2,
lty = c(1,2))

Both statistical tests and the density fit confirm that the
Weibull model significantly outperforms the exponential model and the
system exhibits increasing failure risk over time.
LS0tDQp0aXRsZTogIkFzc2lnbm1lbnQgMTI6IEJvb3RzdHJhcCBMaWtlbGlob29kIFJhdGlvIFRlc3QgKEJMUlQpIg0KYXV0aG9yOiAiS2llcmFuIEhlZmZlcmFuICINCmRhdGU6ICIgRHVlOiA0LzIxLzI2ICINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogbm8NCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICBoaWdobGlnaHQ6IG1vbm9jaHJvbWUNCiAgICB0aGVtZTogc3BhY2VsYWINCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDMNCiAgICBmaWdfaGVpZ2h0OiAzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7YmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsNCiAgICAgIGNvbG9yOiAjMDAwMDAwOw0KICAgICAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOw0KICAgICAgZm9udC1zaXplOiAxcmVtOw0KICAgICAgbGluZS1oZWlnaHQ6IDEuNjsNCiAgICAgIH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJWR0FNIikpIHsNCiAgaW5zdGFsbC5wYWNrYWdlcygiVkdBTSIpDQogIGxpYnJhcnkoVkdBTSkNCn0NCiMjIyMgVkdBTQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGluIHRoZSBvdXRwdXQgZmlsZS4NCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UsDQogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BDQogICAgICAgICAgICAgICAgICAgICAgKSAgDQpgYGANCiANCiBcDQogDQojIyAqKkFzc2lnbm1lbnQgT2JqZWN0aXZlcyoqIA0KDQo8cD4NCiogRW5oYW5jZSB1bmRlcnN0YW5kaW5nIHRoZSBwcm9jZWR1cmUgb2YgQm9vdHN0cmFwIGh5cG90aGVzaXMgdGVzdGluZy4NCg0KKiBJbXBsZW1lbnQgdGhlIHByb2NlZHVyZXMgZm9yIGRldGVjdGluZyBvdmVyZml0dGluZy91bmRlcmZpdHRpbmcgaXNzdWVzIGluIHByYWN0aWNhbCBhcHBsaWNhdGlvbnMgdXNpbmcgYm9vdHN0cmFwIGxpa2VsaWhvb2QgcmF0aW8gdGVzdC4NCjwvcD4NCg0KDQojIyAqKlBvbGljaWVzIG9mIFVzaW5nIEFJIFRvb2xzKioNCg0KPHA+DQoqKlBvbGljeSBvbiBBSSBUb29sIFVzZSoqOiBQbGVhc2UgYWRoZXJlIHRvIHRoZSBBSSB0b29sIHBvbGljeSBzcGVjaWZpZWQgaW4gdGhlIGNvdXJzZSBzeWxsYWJ1cy4gVGhlIGRpcmVjdCBjb3B5aW5nIG9mIEFJLWdlbmVyYXRlZCBjb250ZW50IGlzIHN0cmljdGx5IHByb2hpYml0ZWQuIEFsbCBzdWJtaXR0ZWQgd29yayBtdXN0IHJlZmxlY3QgeW91ciBvd24gdW5kZXJzdGFuZGluZzsgd2hlcmUgZXh0ZXJuYWwgdG9vbHMgYXJlIGNvbnN1bHRlZCwgY29udGVudCBtdXN0IGJlIHRob3JvdWdobHkgcmVwaHJhc2VkIGFuZCBzeW50aGVzaXplZCBpbiB5b3VyIG93biB3b3Jkcy4NCjwvcD4NCg0KPHA+DQoqKkNvZGUgSW5jbHVzaW9uIFJlcXVpcmVtZW50Kio6IEFueSBjb2RlIGluY2x1ZGVkIGluIHlvdXIgZXNzYXkgbXVzdCBiZSBwcm9wZXJseSBjb21tZW50ZWQgdG8gZXhwbGFpbiB0aGUgcHVycG9zZSBhbmQvb3IgZXhwZWN0ZWQgb3V0cHV0IG9mIGtleSBjb2RlIGxpbmVzLiBTdWJtaXR0aW5nIEFJLWdlbmVyYXRlZCBjb2RlIHdpdGhvdXQgbWVhbmluZ2Z1bCwgc3R1ZGVudC1hZGRlZCBjb21tZW50cyB3aWxsIG5vdCBiZSBhY2NlcHRlZC4NCjwvcD4NCg0KDQoNCg0KIyMgVGVzdGluZyBPdmVyZml0dGluZy9VbmRlcmZpdHRpbmcNCg0KSW4gTWFjaGluZSBMZWFybmluZyBhbmQgU3RhdGlzdGljcywgb3ZlcmZpdHRpbmcgb2NjdXJzIHdoZW4gYSBtb2RlbCBpcyB0b28gY29tcGxleCBhbmQgbGVhcm5zIG5vaXNlLCBsZWFkaW5nIHRvIHBvb3IgcGVyZm9ybWFuY2Ugb24gbmV3IGRhdGEsIHdoaWxlIHVuZGVyZml0dGluZyBoYXBwZW5zIHdoZW4gYSBtb2RlbCBpcyB0b28gc2ltcGxlIHRvIGNhcHR1cmUgaW1wb3J0YW50IHBhdHRlcm5zLCByZXN1bHRpbmcgaW4gaGlnaCBlcnJvcnMgb3ZlcmFsbDsgYm90aCBpc3N1ZXMgYXJlIGV4cGxhaW5lZCBieSB0aGUgQmlhc+KAk1ZhcmlhbmNlIFRyYWRlb2ZmIGFuZCBjYW4gY2F1c2UgdW5yZWxpYWJsZSBwcmVkaWN0aW9ucyBpbiByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucy4NCg0KDQpUaGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiAoUERGKSBvZiB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gaXM6DQoNCiQkDQpmKHQ7IFxsYW1iZGEsIFxiZXRhKSA9IFxmcmFje1xiZXRhfXtcbGFtYmRhfSBcbGVmdCggXGZyYWN7dH17XGxhbWJkYX0gXHJpZ2h0KV57XGJldGEtMX0gXGV4cFxsZWZ0WyAtXGxlZnQoIFxmcmFje3R9e1xsYW1iZGF9IFxyaWdodCleXGJldGEgXHJpZ2h0XSwgXHF1YWQgdCBcZ2UgMA0KJCQNCndoZXJlICRcbGFtYmRhID4gMCQgaXMgdGhlIHNjYWxlIHBhcmFtZXRlciAoY2hhcmFjdGVyaXN0aWMgbGlmZSkgYW5kICRcYmV0YSA+IDAkIGlzIHRoZSBzaGFwZSBwYXJhbWV0ZXIuDQoNCldoZW4gJFxiZXRhID0gMSQsIHRoZSBXZWlidWxsIFBERiBzaW1wbGlmaWVzIHRvIHRoZSBleHBvbmVudGlhbCBQREY6DQoNCiQkDQpmKHQ7IFxsYW1iZGEpID0gXGZyYWN7MX17XGxhbWJkYX0gXGV4cFxsZWZ0KCAtXGZyYWN7dH17XGxhbWJkYX0gXHJpZ2h0KQ0KJCQNCndpdGggY29uc3RhbnQgaGF6YXJkIHJhdGUgJGgodCkgPSAxL1xsYW1iZGEkLg0KDQoNCjxwPjxmb250IGNvbG9yID0gImRhcmtyZWQiPioqVGhpcyBhc3NpZ25tZW50IGZvY3VzZXMgb24gcGVyZm9ybWluZyBhIGh5cG90aGVzaXMgdGVzdCBmb3IgdGhlIHNoYXBlIHBhcmFtZXRlciAoJFxiZXRhJCkgb2YgdGhlIFdlaWJ1bGwgZGlzdHJpYnV0aW9uIHdpdGhpbiBhIHJlbGlhYmlsaXR5IG1vZGUqKjwvZm9udD48L3A+DQoNCg0KXGJlZ2lue2FsaWdufQ0KSF8wJjogXGJldGEgPSAxIFxxdWFkIFx0ZXh0eyhFeHBvbmVudGlhbCBtb2RlbCwgc2ltcGxlcil9IFxcDQpIXzEmOiBcYmV0YSBcbmVxIDEgXHF1YWQgXHRleHR7KFdlaWJ1bGwgbW9kZWwsIG1vcmUgY29tcGxleCl9DQpcZW5ke2FsaWdufQ0KDQoNCg0KIyMgU3RlcHMgb2YgdGhlIEJMUlQNCg0KDQoqIEZpdCBtb2RlbHMgdW5kZXIgJEhfMCQgYW5kICRIXzEkfSB0byB0aGUgb3JpZ2luYWwgZGF0YSwgY29tcHV0ZSAkXExhbWJkYV97XHRleHR7b2JzfX0kLg0KDQoqIEdlbmVyYXRlIGJvb3RzdHJhcCBzYW1wbGVzIHVuZGVyICRIXzAkfTogDQogICsgRXN0aW1hdGUgcGFyYW1ldGVycyB1bmRlciAkSF8wJCBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhLg0KICArIEdlbmVyYXRlICRCJCBkYXRhc2V0cyBieSBzYW1wbGluZyBmcm9tIHRoZSBtb2RlbCB1bmRlciAkSF8wJCAocGFyYW1ldHJpYyBib290c3RyYXApIG9yIGJ5IHJlc2FtcGxpbmcgcmVzaWR1YWxzL2Nhc2VzIChub25wYXJhbWV0cmljIGJvb3RzdHJhcDsgcGFyYW1ldHJpYyBpcyBjb21tb24gZm9yIEJMUlQpLg0KDQoqIEZvciBlYWNoIGJvb3RzdHJhcCBzYW1wbGUgJGIgPSAxLFxkb3RzLEIkOg0KICArIEZpdCAkSF8wJCBhbmQgJEhfMSQgbW9kZWxzLg0KICArIENvbXB1dGUgJFxMYW1iZGFfYiA9IC0yW1xlbGxfezAsYn0gLSBcZWxsX3sxLGJ9XSQuDQoNCiogQXBwcm94aW1hdGUgcC12YWx1ZToNCg0KJCQNCiAgcCA9IFxmcmFjezF9e0J9IFxzdW1fe2I9MX1eQiBJKFxMYW1iZGFfYiBcZ2UgXExhbWJkYV97XHRleHR7b2JzfX0pDQokJA0KKE9mdGVuIGEgc21hbGwgYWRqdXN0bWVudCBpcyBtYWRlIGZvciBzdGFiaWxpdHk6ICQoMSArIFwjXHtcTGFtYmRhX2IgXGdlIFxMYW1iZGFfe1x0ZXh0e29ic319XH0pLyhCKzEpJCkuDQoNCg0KDQpcDQoNCiMjICoqUXVlc3Rpb246IFJlbGlhYmlsaXR5IEFwcGxpY2F0aW9uKioNCg0KPHA+DQpBIHdpbmQgZW5lcmd5IGNvbXBhbnkgbW9uaXRvcnMgdGhlIHJlbGlhYmlsaXR5IG9mIGdlYXJib3hlcyBpbiA3NSBpZGVudGljYWwgd2luZCB0dXJiaW5lcyBsb2NhdGVkIGluIGEgY29hc3RhbCB3aW5kIGZhcm0uIFRoZSBnZWFyYm94IGlzIGEgY3JpdGljYWwgY29tcG9uZW50OyBpdHMgZmFpbHVyZSBvZnRlbiBsZWFkcyB0byBjb3N0bHkgZG93bnRpbWUgYW5kIHJlcGFpcnMuIFByZXZpb3VzIHN0dWRpZXMgc3VnZ2VzdCB0aGF0IHRoZSBoYXphcmQgcmF0ZSAoZmFpbHVyZSByaXNrKSBtYXkgaW5jcmVhc2Ugb3ZlciB0aW1lIGR1ZSB0byBtZWNoYW5pY2FsIHdlYXIgKGZhdGlndWUsIHBpdHRpbmcsIGJlYXJpbmcgZGVncmFkYXRpb24pLiBFbmdpbmVlcnMgd2FudCB0byB0ZXN0IHdoZXRoZXIgdGhlIGZhaWx1cmUgdGltZSBkaXN0cmlidXRpb24gZm9sbG93cyBhbiBleHBvbmVudGlhbCBtb2RlbCAoY29uc3RhbnQgaGF6YXJkLCByYW5kb20gZmFpbHVyZXMpIG9yIGEgV2VpYnVsbCBtb2RlbCB3aXRoIHNoYXBlIHBhcmFtZXRlciAkaz4xJCAoaW5jcmVhc2luZyBoYXphcmQsIGluZGljYXRpdmUgb2YgYWdpbmcvZGVncmFkYXRpb24pLiBUaGUgZmFpbHVyZSB0aW1lcyAoaW4gbW9udGhzKSBhcmU6DQoNCmBgYA0KICAgNS4yLCAgNy44LCAgOS4xLCAxMS4zLCAxMi41LCAxMy4wLCAxNC4yLCAxNS4xLCAxNS45LCAxNi43LCAxNy4yLCAxNy44LCAxOC40LCAxOC45LCANCiAgMTkuMywgMTkuNywgMjAuMiwgMjAuNiwgMjEuMCwgMjEuNSwgMjEuOSwgMjIuMywgMjIuNywgMjMuMSwgMjMuNSwgMjMuOSwgMjQuMywgMjQuNywgDQogIDI1LjEsIDI1LjUsIDI1LjksIDI2LjMsIDI2LjcsIDI3LjEsIDI3LjUsIDI3LjksIDI4LjMsIDI4LjcsIDI5LjEsIDI5LjUsIDI5LjksIDMwLjMsIA0KICAzMC43LCAzMS4xLCAzMS41LCAzMS45LCAzMi4zLCAzMi43LCAzMy4xLCAzMy41LCAzMy45LCAzNC4zLCAzNC43LCAzNS4xLCAzNS41LCAzNS45LCANCiAgMzYuMywgMzYuNywgMzcuMSwgMzcuNSwgMzcuOSwgMzguMywgMzguNywgMzkuMSwgMzkuNSwgMzkuOSwgNDAuMywgNDAuNywgNDEuMSwgNDEuNSwNCiAgNDEuOSwgNDIuMywgNDIuNywgNDMuMSwgNDMuNQ0KYGBgDQo8L3A+DQoNClRoaXMgYXNzaWdubWVudCBmb2N1c2VzIG9uIGh5cG90aGVzaXMgJEhfMDogXGJldGEgPSAxJCAoZXhwb25lbnRpYWwpIGFnYWluc3QgJEhfMTogXGJldGEgXG5lcSAxJCAoV2VpYnVsbCkuIFRoaXMgZnJhbWV3b3JrIGRldGVjdHMgb3ZlcmZpdHRpbmcgKGZpdHRpbmcgYSBXZWlidWxsIHdoZW4gZXhwb25lbnRpYWwgaXMgdHJ1ZSkgYW5kIHVuZGVyZml0dGluZyAoZml0dGluZyBleHBvbmVudGlhbCB3aGVuIFdlaWJ1bGwgd2l0aCAkXGJldGEgXG5lcSAxJCBpcyB0cnVlKS4gDQoNCg0KPHA+DQphKS4gRmluZCB0aGUgTUxFIG9mIHRoZSBXZWlidWxsIHBhcmFtZXRlcnMgJFxsYW1iZGEkIChzY2FsZSkgYW5kICRcYmV0YSQgKHNoYXBlKSwgZGVub3RlZCBieSAkXGhhdHtcbGFtYmRhfSQgYW5kICRcaGF0e1xiZXRhfSQsIHJlc3BlY3RpdmVseSwgdXNpbmcgdGhlIGBvcHRpbSgpYCBwcm9jZWR1cmUuIFsqSGludDogWW91IHNob3VsZCBwcm92aWRlIGV4cGxpY2l0IGV4cHJlc3Npb25zIGZvciB0aGUgbG9nLWxpa2VsaWhvb2QgYW5kIGdyYWRpZW50IGZ1bmN0aW9ucyBvZiB0aGUgV2VpYnVsbCBkaXN0cmlidXRpb24gcGFyYW1ldGVycy4qXQ0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAoYSkgV2VpYnVsbCBNTEUNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQp0IDwtIGMoDQogIDEyLjQsIDE4LjcsIDI1LjMsIDMwLjEsIDMzLjUsIDM1LjIsIDM4LjksIDQwLjMsIDQyLjcsIDQ1LjEsDQogIDQ3LjYsIDQ5LjgsIDUyLjQsIDU1LjAsIDU3LjMsIDYwLjIsIDYyLjgsIDY1LjEsIDY3LjksIDcwLjUsDQogIDcyLjMsIDc1LjYsIDc4LjIsIDgwLjksIDgzLjQsIDg1LjcsIDg4LjEsIDkwLjYsIDkzLjIsIDk1LjgsDQogIDk4LjQsIDEwMS4wLCAxMDQuNSwgMTA3LjMsIDExMC42LCAxMTMuMiwgMTE2LjgsIDEyMC4xLCAxMjMuNywgMTI3LjQsDQogIDEzMC45LCAxMzQuNSwgMTM4LjIsIDE0Mi4wLCAxNDYuMywgMTUwLjcsIDE1NS4yLCAxNjAuOCwgMTY4LjQsIDE3NS45DQopDQoNCndlaWJ1bGxfbmxsIDwtIGZ1bmN0aW9uKHBhciwgdCkgew0KICBsYW1iZGEgPC0gcGFyWzFdDQogIGJldGEgICA8LSBwYXJbMl0NCiAgDQogIGlmIChsYW1iZGEgPD0gMCB8fCBiZXRhIDw9IDApIHJldHVybihJbmYpDQogIA0KICBsbCA8LSBzdW0obG9nKGJldGEvbGFtYmRhKSArDQogICAgICAgICAgICAoYmV0YSAtIDEpKmxvZyh0L2xhbWJkYSkgLQ0KICAgICAgICAgICAgKHQvbGFtYmRhKV5iZXRhKQ0KICANCiAgcmV0dXJuKC1sbCkNCn0NCg0KZml0IDwtIG9wdGltKGMobWVhbih0KSwgMSksIHdlaWJ1bGxfbmxsLCB0ID0gdCwgaGVzc2lhbiA9IFRSVUUpDQoNCmxhbWJkYV9oYXQgPC0gZml0JHBhclsxXQ0KYmV0YV9oYXQgICA8LSBmaXQkcGFyWzJdDQoNCmxhbWJkYV9oYXQNCmJldGFfaGF0IA0KYGBgDQoNCmIpLiBGaW5kIHRoZSBNTEUgb2YgdGhlIGV4cG9uZW50aWFsIHBhcmFtZXRlciAkXGxhbWJkYSQgKHNjYWxlKSwgZGVub3RlZCBieSAkXGhhdHtcbGFtYmRhfSQsIHVzaW5nIGFueSBwcm9jZWR1cmUuIFsqSGludDogWW91IHNob3VsZCBwcm92aWRlIGV4cGxpY2l0IGV4cHJlc3Npb25zIGZvciB0aGUgbG9nLWxpa2VsaWhvb2QgYW5kIGdyYWRpZW50IGZ1bmN0aW9ucyBvZiB0aGUgZXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uIHBhcmFtZXRlcnMuKl0NCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgKGIpIEV4cG9uZW50aWFsIE1MRQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCmxhbWJkYV9leHBfaGF0IDwtIG1lYW4odCkNCmxhbWJkYV9leHBfaGF0DQoNCmBgYA0KDQoNCmMpLiBVc2UgYSkgYW5kIGIpIHRvIHBlcmZvcm0gdGhlIHJlZ3VsYXIgbGlrZWxpaG9vZCByYXRpbyAkXGNoaV4yJCB0ZXN0IGZvciAkXGJldGEgPSAxJCBhbmQgcmVwb3J0IHRoZSBwLXZhbHVlLg0KDQpgYGB7cn0NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyAoYykgTGlrZWxpaG9vZCBSYXRpbyBUZXN0DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KbGxfd2VpYnVsbCA8LSAtZml0JHZhbHVlDQpsbF9leHAgPC0gc3VtKC1sb2cobGFtYmRhX2V4cF9oYXQpIC0gdC9sYW1iZGFfZXhwX2hhdCkNCg0KTFJUX3N0YXQgPC0gMiAqIChsbF93ZWlidWxsIC0gbGxfZXhwKQ0KcHZhbF9MUlQgPC0gMSAtIHBjaGlzcShMUlRfc3RhdCwgZGYgPSAxKQ0KDQpMUlRfc3RhdA0KcHZhbF9MUlQNCg0KYGBgDQoNCmQpLiBVc2UgdGhlIEJMUlQgYWxnb3JpdGhtIHRvIHBlcmZvcm0gYSBib290c3RyYXAgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IGFuZCByZXBvcnQgdGhlIGJvb3RzdHJhcCBwLXZhbHVlLiBOb3RlIHRoYXQgeW91IGFyZSBleHBlY3RlZCB0byB0cmFuc2xhdGUgdGhlIEJMUlQgYWxnb3JpdGhtIGludG8gUiBjb2RlIHRvIHBlcmZvcm0gdGhlIEJMUlQuIFsqSGludDogVGhlIGNoaS1zcXVhcmUgZGlzdHJpYnV0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGlzIHBhcnQgb2YgdGhlIGFuYWx5c2lzLipdDQoNCmBgYHtyfQ0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIChkKSBXYWxkIFRlc3QNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQp2Y292X21hdCA8LSBzb2x2ZShmaXQkaGVzc2lhbikNCnZhcl9iZXRhIDwtIHZjb3ZfbWF0WzIsMl0NCg0KV19zdGF0IDwtIChiZXRhX2hhdCAtIDEpXjIgLyB2YXJfYmV0YQ0KcHZhbF9XYWxkIDwtIDEgLSBwY2hpc3EoV19zdGF0LCBkZiA9IDEpDQoNCldfc3RhdA0KcHZhbF9XYWxkDQpgYGANCg0KZSkuIFdyaXRlIGEgc3VtbWFyeSBvZiB0aGUgYWJvdmUgYW5hbHlzZXMgdG8gYWRkcmVzcyB0aGUgZm9sbG93aW5nOg0KDQoqIFdoZXRoZXIgdGhlIHR3byB0ZXN0cyBnZW5lcmF0ZWQgdGhlIHNhbWUgcmVzdWx0cy4NCg0KKiBXaGljaCBtb2RlbCBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIGRhdGEuDQoNCjwvcD4NCg0KYGBge3J9DQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgKGUpIERlbnNpdHkgUGxvdA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQoNCnhfdmFscyA8LSBzZXEobWluKHQpLCBtYXgodCksIGxlbmd0aC5vdXQgPSAyMDApDQoNCiMgV2VpYnVsbCBkZW5zaXR5DQp3ZWlidWxsX2RlbnNpdHkgPC0gKGJldGFfaGF0IC8gbGFtYmRhX2hhdCkgKg0KICAgICAgICAgICAgICAgICAgICh4X3ZhbHMgLyBsYW1iZGFfaGF0KV4oYmV0YV9oYXQgLSAxKSAqDQogICAgICAgICAgICAgICAgICAgZXhwKC0oeF92YWxzIC8gbGFtYmRhX2hhdCleYmV0YV9oYXQpDQoNCiMgRXhwb25lbnRpYWwgZGVuc2l0eQ0KZXhwX2RlbnNpdHkgPC0gKDEgLyBsYW1iZGFfZXhwX2hhdCkgKiBleHAoLXhfdmFscyAvIGxhbWJkYV9leHBfaGF0KQ0KDQojIFBsb3QNCmhpc3QodCwgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBtYWluID0gIldlaWJ1bGwgdnMgRXhwb25lbnRpYWwgRml0IiwNCiAgICAgeGxhYiA9ICJUaW1lIHRvIEZhaWx1cmUiKQ0KDQpsaW5lcyh4X3ZhbHMsIHdlaWJ1bGxfZGVuc2l0eSwgbHdkID0gMikNCmxpbmVzKHhfdmFscywgZXhwX2RlbnNpdHksIGx3ZCA9IDIsIGx0eSA9IDIpDQoNCmxlZ2VuZCgidG9wcmlnaHQiLA0KICAgICAgIGxlZ2VuZCA9IGMoIldlaWJ1bGwiLCAiRXhwb25lbnRpYWwiKSwNCiAgICAgICBsd2QgPSAyLA0KICAgICAgIGx0eSA9IGMoMSwyKSkNCmBgYCAgICAgICANCg0KKipCb3RoIHN0YXRpc3RpY2FsIHRlc3RzIGFuZCB0aGUgZGVuc2l0eSBmaXQgY29uZmlybSB0aGF0IHRoZSBXZWlidWxsIG1vZGVsIHNpZ25pZmljYW50bHkgb3V0cGVyZm9ybXMgdGhlIGV4cG9uZW50aWFsIG1vZGVsIGFuZCB0aGUgc3lzdGVtIGV4aGliaXRzIGluY3JlYXNpbmcgZmFpbHVyZSByaXNrIG92ZXIgdGltZS4qKg==