1. Let’s say a random varible \(X\)
follows a normal distribution of \(N(0,
1)\).
(a) Draw 5 samples of \(X\) and use
\(\bar{x}\) to infer the true
population mean using a confidence interval estimate with confidence
level of 95%. Do a simulation of 10,000 times and find the probability
of the estimated interval actually contains \(\mu = 0\).
# CI for normal mean
ci_mean <- function(x, conf = 0.95) {
n <- length(x)
m <- mean(x)
s <- sd(x)
error <- qt(1 - (1 - conf)/2, df = n - 1) * s / sqrt(n)
c(lower = m - error, upper = m + error)
}
n_sim <- 10000
n_samp <- 5
mu <- 0
ci_contains_mu <- replicate(n_sim, {
x <- rnorm(n_samp, mean = mu, sd = 1)
ci <- ci_mean(x, conf = 0.95)
mu >= ci[1] && mu <= ci[2]
})
prob_ci_contains_mu <- mean(ci_contains_mu)
cat("Probability CI contains mu:", prob_ci_contains_mu, "\n")
Probability CI contains mu: 0.9516
(b) Do a hypothesis test for \(X\)
with \(H_0: \mu = 0\) and \(H_a: \mu \neq 0\) with 10,000 simulations
and \(\alpha = 0.05\). Find the
probability of rejecting \(H_0\) by
comparing the p-value and \(\alpha\).
reject_H0_twosided <- replicate(n_sim, {
x <- rnorm(n_samp, mean = mu, sd = 1)
t.test(x, mu = mu, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided <- mean(reject_H0_twosided)
cat("Probability of rejecting H0 (two-sided):", prob_reject_H0_twosided, "\n")
Probability of rejecting H0 (two-sided): 0.0509
(c) Redo (b) with \(H_a: \mu >
0\).
reject_H0_greater <- replicate(n_sim, {
x <- rnorm(n_samp, mean = mu, sd = 1)
t.test(x, mu = mu, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater <- mean(reject_H0_greater)
cat("Probability of rejecting H0 (greater):", prob_reject_H0_greater, "\n")
Probability of rejecting H0 (greater): 0.0494
(d) Increase the number of samples to 100 and repeat (a)-(c).
n_samp_large <- 100
ci_contains_mu_large <- replicate(n_sim, {
x <- rnorm(n_samp_large, mean = mu, sd = 1)
ci <- ci_mean(x, conf = 0.95)
mu >= ci[1] && mu <= ci[2]
})
prob_ci_contains_mu_large <- mean(ci_contains_mu_large)
cat("Probability CI contains mu (n=100):", prob_ci_contains_mu_large, "\n")
Probability CI contains mu (n=100): 0.952
reject_H0_twosided_large <- replicate(n_sim, {
x <- rnorm(n_samp_large, mean = mu, sd = 1)
t.test(x, mu = mu, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided_large <- mean(reject_H0_twosided_large)
cat("Probability of rejecting H0 (two-sided, n=100):", prob_reject_H0_twosided_large, "\n")
Probability of rejecting H0 (two-sided, n=100): 0.0532
reject_H0_greater_large <- replicate(n_sim, {
x <- rnorm(n_samp_large, mean = mu, sd = 1)
t.test(x, mu = mu, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater_large <- mean(reject_H0_greater_large)
cat("Probability of rejecting H0 (greater, n=100):", prob_reject_H0_greater_large, "\n")
Probability of rejecting H0 (greater, n=100): 0.0489
(e) How does this experiment verify the theory that we learn?
Summarize your findings properly.
Answer: - For a 95% confidence interval, the
empirical coverage is close to 0.95, confirming the theoretical
expectation. - The probability of rejecting \(H_0\) is approximately 0.05, matching the
significance level (\(\alpha = 0.05\)).
- Increasing the sample size improves the accuracy of the confidence
interval coverage, as predicted by the Central Limit Theorem.
2. Repeat all steps in problem 1 with \(X\) follows a uniform distribution \(\text{Unif}(0,1)\). How does the
distribution of \(X\) affect the
results?
# For Unif(0,1), true mean is 0.5
mu_unif <- 0.5
ci_contains_mu_unif <- replicate(n_sim, {
x <- runif(n_samp, min = 0, max = 1)
ci <- ci_mean(x, conf = 0.95)
mu_unif >= ci[1] && mu_unif <= ci[2]
})
prob_ci_contains_mu_unif <- mean(ci_contains_mu_unif)
cat("Uniform: Probability CI contains mu:", prob_ci_contains_mu_unif, "\n")
Uniform: Probability CI contains mu: 0.9347
reject_H0_twosided_unif <- replicate(n_sim, {
x <- runif(n_samp, min = 0, max = 1)
t.test(x, mu = mu_unif, alternative = "two.sided")$p.value < 0.05
})
prob_reject_H0_twosided_unif <- mean(reject_H0_twosided_unif)
cat("Uniform: Probability of rejecting H0 (two-sided):", prob_reject_H0_twosided_unif, "\n")
Uniform: Probability of rejecting H0 (two-sided): 0.0672
reject_H0_greater_unif <- replicate(n_sim, {
x <- runif(n_samp, min = 0, max = 1)
t.test(x, mu = mu_unif, alternative = "greater")$p.value < 0.05
})
prob_reject_H0_greater_unif <- mean(reject_H0_greater_unif)
cat("Uniform: Probability of rejecting H0 (greater):", prob_reject_H0_greater_unif, "\n")
Uniform: Probability of rejecting H0 (greater): 0.0535
Conclusion: The distribution of \(X\) affects the accuracy of statistical
inference procedures. When \(X\) is
normal, coverage and error rates match theoretical expectations. When
\(X\) is non-normal, these procedures
may be less reliable, especially with moderate sample sizes.
3. Now let’s simulate with \(X\)
following a normal distribution of \(N(1,4)\) (variance of 4 and standard
devivation of 2).
(a) With a sample size of 10, do a hypothesis test for \(X\) with \(H_0:
\mu = 0\) and \(H_a: \mu >
0\) with 10,000 simulations and \(\alpha = 0.05\). Find the \(\beta\) from your simulation. What is the
estimated power of the test?
mu_alt <- 1
sd_alt <- 2
n_samp_alt <- 10
reject_H0_alt <- replicate(n_sim, {
x <- rnorm(n_samp_alt, mean = mu_alt, sd = sd_alt)
t.test(x, mu = 0, alternative = "greater")$p.value < 0.05
})
power_est <- mean(reject_H0_alt)
beta_est <- 1 - power_est
cat("Power (n=10, alpha=0.05):", power_est, "Beta:", beta_est, "\n")
Power (n=10, alpha=0.05): 0.4263 Beta: 0.5737
(b) Change \(\alpha\) to 0.01 in
(a) and find \(\beta\) and the power of
test again.
reject_H0_alt_01 <- replicate(n_sim, {
x <- rnorm(n_samp_alt, mean = mu_alt, sd = sd_alt)
t.test(x, mu = 0, alternative = "greater")$p.value < 0.01
})
power_est_01 <- mean(reject_H0_alt_01)
beta_est_01 <- 1 - power_est_01
cat("Power (n=10, alpha=0.01):", power_est_01, "Beta:", beta_est_01, "\n")
Power (n=10, alpha=0.01): 0.1618 Beta: 0.8382
(c) Change the sample size to 1000 and redo (a) and (b) again.
n_samp_alt_large <- 1000
reject_H0_alt_large <- replicate(n_sim, {
x <- rnorm(n_samp_alt_large, mean = mu_alt, sd = sd_alt)
t.test(x, mu = 0, alternative = "greater")$p.value < 0.05
})
power_est_large <- mean(reject_H0_alt_large)
beta_est_large <- 1 - power_est_large
cat("Power (n=1000, alpha=0.05):", power_est_large, "Beta:", beta_est_large, "\n")
Power (n=1000, alpha=0.05): 1 Beta: 0
reject_H0_alt_large_01 <- replicate(n_sim, {
x <- rnorm(n_samp_alt_large, mean = mu_alt, sd = sd_alt)
t.test(x, mu = 0, alternative = "greater")$p.value < 0.01
})
power_est_large_01 <- mean(reject_H0_alt_large_01)
beta_est_large_01 <- 1 - power_est_large_01
cat("Power (n=1000, alpha=0.01):", power_est_large_01, "Beta:", beta_est_large_01, "\n")
Power (n=1000, alpha=0.01): 1 Beta: 0
(d) How does this experiment verify the theory that we learn?
Summarize your findings properly.
Power increases with larger samples and higher significance levels,
while Type II error decreases under the same conditions. This
demonstrates the importance of adequate sample size and appropriate
choice of \(\alpha\) in hypothesis
testing.
LS0tCnRpdGxlOiAiTGFiIEhvbWV3b3JrIDUgLSBDb25maWRlbmNlIEludGVydmFsIGFuZCBIeXBvdGhlc2lzIFRlc3RzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyMjIDEuIExldCdzIHNheSBhIHJhbmRvbSB2YXJpYmxlICRYJCBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiAkTigwLCAxKSQuCgojIyMjIChhKSBEcmF3IDUgc2FtcGxlcyBvZiAkWCQgYW5kIHVzZSAkXGJhcnt4fSQgdG8gaW5mZXIgdGhlIHRydWUgcG9wdWxhdGlvbiBtZWFuIHVzaW5nIGEgY29uZmlkZW5jZSBpbnRlcnZhbCBlc3RpbWF0ZSB3aXRoIGNvbmZpZGVuY2UgbGV2ZWwgb2YgOTVcJS4gRG8gYSBzaW11bGF0aW9uIG9mIDEwLDAwMCB0aW1lcyBhbmQgZmluZCB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIGVzdGltYXRlZCBpbnRlcnZhbCBhY3R1YWxseSBjb250YWlucyAkXG11ID0gMCQuCgpgYGB7cn0KIyBDSSBmb3Igbm9ybWFsIG1lYW4KY2lfbWVhbiA8LSBmdW5jdGlvbih4LCBjb25mID0gMC45NSkgewogIG4gPC0gbGVuZ3RoKHgpCiAgbSA8LSBtZWFuKHgpCiAgcyA8LSBzZCh4KQogIGVycm9yIDwtIHF0KDEgLSAoMSAtIGNvbmYpLzIsIGRmID0gbiAtIDEpICogcyAvIHNxcnQobikKICBjKGxvd2VyID0gbSAtIGVycm9yLCB1cHBlciA9IG0gKyBlcnJvcikKfQoKbl9zaW0gPC0gMTAwMDAKbl9zYW1wIDwtIDUKbXUgPC0gMAoKY2lfY29udGFpbnNfbXUgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXAsIG1lYW4gPSBtdSwgc2QgPSAxKQogIGNpIDwtIGNpX21lYW4oeCwgY29uZiA9IDAuOTUpCiAgbXUgPj0gY2lbMV0gJiYgbXUgPD0gY2lbMl0KfSkKcHJvYl9jaV9jb250YWluc19tdSA8LSBtZWFuKGNpX2NvbnRhaW5zX211KQpjYXQoIlByb2JhYmlsaXR5IENJIGNvbnRhaW5zIG11OiIsIHByb2JfY2lfY29udGFpbnNfbXUsICJcbiIpCmBgYAoKIyMjIyAoYikgRG8gYSBoeXBvdGhlc2lzIHRlc3QgZm9yICRYJCB3aXRoICRIXzA6IFxtdSA9IDAkIGFuZCAkSF9hOiBcbXUgXG5lcSAwJCB3aXRoIDEwLDAwMCBzaW11bGF0aW9ucyBhbmQgJFxhbHBoYSA9IDAuMDUkLiBGaW5kIHRoZSBwcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgJEhfMCQgYnkgY29tcGFyaW5nIHRoZSBwLXZhbHVlIGFuZCAkXGFscGhhJC4KCmBgYHtyfQpyZWplY3RfSDBfdHdvc2lkZWQgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXAsIG1lYW4gPSBtdSwgc2QgPSAxKQogIHQudGVzdCh4LCBtdSA9IG11LCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF90d29zaWRlZCA8LSBtZWFuKHJlamVjdF9IMF90d29zaWRlZCkKY2F0KCJQcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgSDAgKHR3by1zaWRlZCk6IiwgcHJvYl9yZWplY3RfSDBfdHdvc2lkZWQsICJcbiIpCmBgYAoKIyMjIyAoYykgUmVkbyAoYikgd2l0aCAkSF9hOiBcbXUgPiAwJC4KCmBgYHtyfQpyZWplY3RfSDBfZ3JlYXRlciA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJub3JtKG5fc2FtcCwgbWVhbiA9IG11LCBzZCA9IDEpCiAgdC50ZXN0KHgsIG11ID0gbXUsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF9ncmVhdGVyIDwtIG1lYW4ocmVqZWN0X0gwX2dyZWF0ZXIpCmNhdCgiUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwIChncmVhdGVyKToiLCBwcm9iX3JlamVjdF9IMF9ncmVhdGVyLCAiXG4iKQpgYGAKCiMjIyMgKGQpIEluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byAxMDAgYW5kIHJlcGVhdCAoYSktKGMpLgoKYGBge3J9Cm5fc2FtcF9sYXJnZSA8LSAxMDAKCmNpX2NvbnRhaW5zX211X2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICBjaSA8LSBjaV9tZWFuKHgsIGNvbmYgPSAwLjk1KQogIG11ID49IGNpWzFdICYmIG11IDw9IGNpWzJdCn0pCgpwcm9iX2NpX2NvbnRhaW5zX211X2xhcmdlIDwtIG1lYW4oY2lfY29udGFpbnNfbXVfbGFyZ2UpCmNhdCgiUHJvYmFiaWxpdHkgQ0kgY29udGFpbnMgbXUgKG49MTAwKToiLCBwcm9iX2NpX2NvbnRhaW5zX211X2xhcmdlLCAiXG4iKQoKcmVqZWN0X0gwX3R3b3NpZGVkX2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikkcC52YWx1ZSA8IDAuMDUKfSkKcHJvYl9yZWplY3RfSDBfdHdvc2lkZWRfbGFyZ2UgPC0gbWVhbihyZWplY3RfSDBfdHdvc2lkZWRfbGFyZ2UpCmNhdCgiUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwICh0d28tc2lkZWQsIG49MTAwKToiLCBwcm9iX3JlamVjdF9IMF90d29zaWRlZF9sYXJnZSwgIlxuIikKCnJlamVjdF9IMF9ncmVhdGVyX2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2xhcmdlLCBtZWFuID0gbXUsIHNkID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdSwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjA1Cn0pCnByb2JfcmVqZWN0X0gwX2dyZWF0ZXJfbGFyZ2UgPC0gbWVhbihyZWplY3RfSDBfZ3JlYXRlcl9sYXJnZSkKY2F0KCJQcm9iYWJpbGl0eSBvZiByZWplY3RpbmcgSDAgKGdyZWF0ZXIsIG49MTAwKToiLCBwcm9iX3JlamVjdF9IMF9ncmVhdGVyX2xhcmdlLCAiXG4iKQpgYGAKCiMjIyMgKGUpIEhvdyBkb2VzIHRoaXMgZXhwZXJpbWVudCB2ZXJpZnkgdGhlIHRoZW9yeSB0aGF0IHdlIGxlYXJuPyBTdW1tYXJpemUgeW91ciBmaW5kaW5ncyBwcm9wZXJseS4KKipBbnN3ZXI6KioKLSBGb3IgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCwgdGhlIGVtcGlyaWNhbCBjb3ZlcmFnZSBpcyBjbG9zZSB0byAwLjk1LCBjb25maXJtaW5nIHRoZSB0aGVvcmV0aWNhbCBleHBlY3RhdGlvbi4KLSBUaGUgcHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIFwoIEhfMCBcKSBpcyBhcHByb3hpbWF0ZWx5IDAuMDUsIG1hdGNoaW5nIHRoZSBzaWduaWZpY2FuY2UgbGV2ZWwgKFwoIFxhbHBoYSA9IDAuMDUgXCkpLgotIEluY3JlYXNpbmcgdGhlIHNhbXBsZSBzaXplIGltcHJvdmVzIHRoZSBhY2N1cmFjeSBvZiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCBjb3ZlcmFnZSwgYXMgcHJlZGljdGVkIGJ5IHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0uCgojIyMjIDIuIFJlcGVhdCBhbGwgc3RlcHMgaW4gcHJvYmxlbSAxIHdpdGggJFgkIGZvbGxvd3MgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiAkXHRleHR7VW5pZn0oMCwxKSQuIEhvdyBkb2VzIHRoZSBkaXN0cmlidXRpb24gb2YgJFgkIGFmZmVjdCB0aGUgcmVzdWx0cz8KCmBgYHtyfQojIEZvciBVbmlmKDAsMSksIHRydWUgbWVhbiBpcyAwLjUKbXVfdW5pZiA8LSAwLjUKCmNpX2NvbnRhaW5zX211X3VuaWYgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBydW5pZihuX3NhbXAsIG1pbiA9IDAsIG1heCA9IDEpCiAgY2kgPC0gY2lfbWVhbih4LCBjb25mID0gMC45NSkKICBtdV91bmlmID49IGNpWzFdICYmIG11X3VuaWYgPD0gY2lbMl0KfSkKcHJvYl9jaV9jb250YWluc19tdV91bmlmIDwtIG1lYW4oY2lfY29udGFpbnNfbXVfdW5pZikKY2F0KCJVbmlmb3JtOiBQcm9iYWJpbGl0eSBDSSBjb250YWlucyBtdToiLCBwcm9iX2NpX2NvbnRhaW5zX211X3VuaWYsICJcbiIpCgpyZWplY3RfSDBfdHdvc2lkZWRfdW5pZiA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJ1bmlmKG5fc2FtcCwgbWluID0gMCwgbWF4ID0gMSkKICB0LnRlc3QoeCwgbXUgPSBtdV91bmlmLCBhbHRlcm5hdGl2ZSA9ICJ0d28uc2lkZWQiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF90d29zaWRlZF91bmlmIDwtIG1lYW4ocmVqZWN0X0gwX3R3b3NpZGVkX3VuaWYpCmNhdCgiVW5pZm9ybTogUHJvYmFiaWxpdHkgb2YgcmVqZWN0aW5nIEgwICh0d28tc2lkZWQpOiIsIHByb2JfcmVqZWN0X0gwX3R3b3NpZGVkX3VuaWYsICJcbiIpCgpyZWplY3RfSDBfZ3JlYXRlcl91bmlmIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcnVuaWYobl9zYW1wLCBtaW4gPSAwLCBtYXggPSAxKQogIHQudGVzdCh4LCBtdSA9IG11X3VuaWYsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wNQp9KQpwcm9iX3JlamVjdF9IMF9ncmVhdGVyX3VuaWYgPC0gbWVhbihyZWplY3RfSDBfZ3JlYXRlcl91bmlmKQpjYXQoIlVuaWZvcm06IFByb2JhYmlsaXR5IG9mIHJlamVjdGluZyBIMCAoZ3JlYXRlcik6IiwgcHJvYl9yZWplY3RfSDBfZ3JlYXRlcl91bmlmLCAiXG4iKQoKYGBgCgoqKkNvbmNsdXNpb246KioKVGhlIGRpc3RyaWJ1dGlvbiBvZiBcKCBYIFwpIGFmZmVjdHMgdGhlIGFjY3VyYWN5IG9mIHN0YXRpc3RpY2FsIGluZmVyZW5jZSBwcm9jZWR1cmVzLiBXaGVuIFwoIFggXCkgaXMgbm9ybWFsLCBjb3ZlcmFnZSBhbmQgZXJyb3IgcmF0ZXMgbWF0Y2ggdGhlb3JldGljYWwgZXhwZWN0YXRpb25zLiBXaGVuIFwoIFggXCkgaXMgbm9uLW5vcm1hbCwgdGhlc2UgcHJvY2VkdXJlcyBtYXkgYmUgbGVzcyByZWxpYWJsZSwgZXNwZWNpYWxseSB3aXRoIG1vZGVyYXRlIHNhbXBsZSBzaXplcy4KCiMjIyMgMy4gTm93IGxldCdzIHNpbXVsYXRlIHdpdGggJFgkIGZvbGxvd2luZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgJE4oMSw0KSQgKHZhcmlhbmNlIG9mIDQgYW5kIHN0YW5kYXJkIGRldml2YXRpb24gb2YgMikuCgojIyMjIChhKSBXaXRoIGEgc2FtcGxlIHNpemUgb2YgMTAsIGRvIGEgaHlwb3RoZXNpcyB0ZXN0IGZvciAkWCQgd2l0aCAkSF8wOiBcbXUgPSAwJCBhbmQgJEhfYTogXG11ID4gMCQgd2l0aCAxMCwwMDAgc2ltdWxhdGlvbnMgYW5kICRcYWxwaGEgPSAwLjA1JC4gRmluZCB0aGUgJFxiZXRhJCBmcm9tIHlvdXIgc2ltdWxhdGlvbi4gV2hhdCBpcyB0aGUgZXN0aW1hdGVkIHBvd2VyIG9mIHRoZSB0ZXN0PwoKYGBge3J9Cm11X2FsdCA8LSAxCnNkX2FsdCA8LSAyCm5fc2FtcF9hbHQgPC0gMTAKCnJlamVjdF9IMF9hbHQgPC0gcmVwbGljYXRlKG5fc2ltLCB7CiAgeCA8LSBybm9ybShuX3NhbXBfYWx0LCBtZWFuID0gbXVfYWx0LCBzZCA9IHNkX2FsdCkKICB0LnRlc3QoeCwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikkcC52YWx1ZSA8IDAuMDUKfSkKcG93ZXJfZXN0IDwtIG1lYW4ocmVqZWN0X0gwX2FsdCkKYmV0YV9lc3QgPC0gMSAtIHBvd2VyX2VzdApjYXQoIlBvd2VyIChuPTEwLCBhbHBoYT0wLjA1KToiLCBwb3dlcl9lc3QsICJCZXRhOiIsIGJldGFfZXN0LCAiXG4iKQpgYGAKCiMjIyMgKGIpIENoYW5nZSAkXGFscGhhJCB0byAwLjAxIGluIChhKSBhbmQgZmluZCAkXGJldGEkIGFuZCB0aGUgcG93ZXIgb2YgdGVzdCBhZ2Fpbi4KCmBgYHtyfQpyZWplY3RfSDBfYWx0XzAxIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2FsdCwgbWVhbiA9IG11X2FsdCwgc2QgPSBzZF9hbHQpCiAgdC50ZXN0KHgsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjAxCn0pCnBvd2VyX2VzdF8wMSA8LSBtZWFuKHJlamVjdF9IMF9hbHRfMDEpCmJldGFfZXN0XzAxIDwtIDEgLSBwb3dlcl9lc3RfMDEKY2F0KCJQb3dlciAobj0xMCwgYWxwaGE9MC4wMSk6IiwgcG93ZXJfZXN0XzAxLCAiQmV0YToiLCBiZXRhX2VzdF8wMSwgIlxuIikKYGBgCgojIyMjIChjKSBDaGFuZ2UgdGhlIHNhbXBsZSBzaXplIHRvIDEwMDAgYW5kIHJlZG8gKGEpIGFuZCAoYikgYWdhaW4uCgpgYGB7cn0Kbl9zYW1wX2FsdF9sYXJnZSA8LSAxMDAwCgpyZWplY3RfSDBfYWx0X2xhcmdlIDwtIHJlcGxpY2F0ZShuX3NpbSwgewogIHggPC0gcm5vcm0obl9zYW1wX2FsdF9sYXJnZSwgbWVhbiA9IG11X2FsdCwgc2QgPSBzZF9hbHQpCiAgdC50ZXN0KHgsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpJHAudmFsdWUgPCAwLjA1Cn0pCnBvd2VyX2VzdF9sYXJnZSA8LSBtZWFuKHJlamVjdF9IMF9hbHRfbGFyZ2UpCmJldGFfZXN0X2xhcmdlIDwtIDEgLSBwb3dlcl9lc3RfbGFyZ2UKY2F0KCJQb3dlciAobj0xMDAwLCBhbHBoYT0wLjA1KToiLCBwb3dlcl9lc3RfbGFyZ2UsICJCZXRhOiIsIGJldGFfZXN0X2xhcmdlLCAiXG4iKQoKcmVqZWN0X0gwX2FsdF9sYXJnZV8wMSA8LSByZXBsaWNhdGUobl9zaW0sIHsKICB4IDwtIHJub3JtKG5fc2FtcF9hbHRfbGFyZ2UsIG1lYW4gPSBtdV9hbHQsIHNkID0gc2RfYWx0KQogIHQudGVzdCh4LCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSRwLnZhbHVlIDwgMC4wMQp9KQpwb3dlcl9lc3RfbGFyZ2VfMDEgPC0gbWVhbihyZWplY3RfSDBfYWx0X2xhcmdlXzAxKQpiZXRhX2VzdF9sYXJnZV8wMSA8LSAxIC0gcG93ZXJfZXN0X2xhcmdlXzAxCmNhdCgiUG93ZXIgKG49MTAwMCwgYWxwaGE9MC4wMSk6IiwgcG93ZXJfZXN0X2xhcmdlXzAxLCAiQmV0YToiLCBiZXRhX2VzdF9sYXJnZV8wMSwgIlxuIikKYGBgCgojIyMjIChkKSBIb3cgZG9lcyB0aGlzIGV4cGVyaW1lbnQgdmVyaWZ5IHRoZSB0aGVvcnkgdGhhdCB3ZSBsZWFybj8gU3VtbWFyaXplIHlvdXIgZmluZGluZ3MgcHJvcGVybHkuCgpQb3dlciBpbmNyZWFzZXMgd2l0aCBsYXJnZXIgc2FtcGxlcyBhbmQgaGlnaGVyIHNpZ25pZmljYW5jZSBsZXZlbHMsIHdoaWxlIFR5cGUgSUkgZXJyb3IgZGVjcmVhc2VzIHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMuIFRoaXMgZGVtb25zdHJhdGVzIHRoZSBpbXBvcnRhbmNlIG9mIGFkZXF1YXRlIHNhbXBsZSBzaXplIGFuZCBhcHByb3ByaWF0ZSBjaG9pY2Ugb2YgXChcYWxwaGFcKSBpbiBoeXBvdGhlc2lzIHRlc3RpbmcuCgo=