What significance level are we considering in this experiment – 10%, 5% or 1%?
library(mosaic)
#library(forecast)
library(lmtest)
(asymp_crit=qchisq(0.95,1))
[1] 3.841459
#x = seq(1, 5, 0.01 )
library(readr)
xdata <- read_csv("F:/OneDrive/One drive/546-2017/lab/lab5/x.csv")
z = seq(1, 5 , 0.01)
plot( z, dchisq(z, 1),"l")
abline(v = asymp_crit)
eq <- bquote( critical_value == .(asymp_crit))
text(x = asymp_crit+0.6, y = 0.05, eq)

In which line of the code do we assign the null hypothesis to be true?
rho=0.0
What sample size is being considered?
n=10
Which line(s) would we alter if we wanted to consider a sample size of (say) n = 200?
n = 200
the percentage rejection rates for the case where THE NULL HYPOTHESIS IS TRUE - so these are the true sizes (significance levels) of the tests,
set.seed(654321)
nrep=2000
n=10
c1=1
c2=4
rho=0.0
#x=rnorm(n)+(1:n)/n
x = xdata$x[1:n]
#str(xdata$x)
#y = numeric(20000)
lrtv = numeric(nrep)
waldv = numeric(nrep)
power_lrt=0.0
power_wald=0.0
asymp_crit=qchisq(0.95,1)
#'============================='
for (i in 1: nrep ){
e = numeric(n)
#genr e=rho*e(-1)+@rnorm
#e = arima.sim(model=list(ar=rho),n=n)
# or
for(j in 2:n){
e[j] = rho*e[j-1] + rnorm(1)
}
#arima(e, order = c(1, 0, 0))
#acf(e, 10)
#pacf(e, 10)
y=c1+c2*x+e
#equation eq1.ls y c x
fit1 <- lm(y~ x)
#summary(fit1)
#loglr=@logl
loglr=logLik(fit1)
#http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
#equation eq2.ls(arma=ml) y c x ar(1)
fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
#summary(fit2)
#str(coeftest(fit2) )
#scalar loglu=@logl
loglu=logLik(fit2)
lrtv[i]=-2*(loglr-loglu)
#'if lrtv(!i)>asymp_crit then
if (lrtv[i]>asymp_crit){
#if (lrtv[i]>crit_lrt){
power_lrt=power_lrt+1
}
waldv[i]=coeftest(fit2)[1,3]^2
#'if waldv(!i)>asymp_crit
if (waldv[i]>asymp_crit){
#if (waldv[i]>crit_lrt){
power_wald=power_wald+1
}
}
#'============================='
(power_lrt=power_lrt/nrep*100)
[1] 7.6
(power_wald=power_wald/nrep*100)
[1] 13.3
(crit_lrt=quantile(lrtv,0.95) )
95%
4.815507
hist(lrtv)

(crit_wald=quantile(waldv,0.95))
95%
7.825018
hist(waldv)

Make a function
sizeAdjust = function( nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05){
set.seed(nseed)
#nrep=nrep
#n=10
c1=1
c2=4
#rho=0.0
#x=rnorm(n)+(1:n)/n
x = xdata$x[1:n]
#y = numeric(20000)
lrtv = numeric(nrep)
waldv = numeric(nrep)
power_lrt=0.0
power_wald=0.0
asymp_crit=qchisq(1-alpha,1)
#'============================='
for (i in 1: nrep ){
e = numeric(n)
#genr e=rho*e(-1)+@rnorm
#e = arima.sim(model=list(ar=rho),n=n)
# or
for(j in 2:n){
e[j] = rho*e[j-1] + rnorm(1)
}
#arima(e, order = c(1, 0, 0))
#acf(e, 10)
#pacf(e, 10)
y=c1+c2*x+e
#equation eq1.ls y c x
fit1 <- lm(y~ x)
#summary(fit1)
#loglr=@logl
loglr=logLik(fit1)
#http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
#equation eq2.ls(arma=ml) y c x ar(1)
fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
#summary(fit2)
#str(coeftest(fit2) )
#scalar loglu=@logl
loglu=logLik(fit2)
lrtv[i]=-2*(loglr-loglu)
#'if lrtv(!i)>asymp_crit then
if (lrtv[i]>asymp_crit){
#if (lrtv[i]>crit_lrt){
power_lrt=power_lrt+1
}
waldv[i]=coeftest(fit2)[1,3]^2
#'if waldv(!i)>asymp_crit
if (waldv[i]>asymp_crit){
#if (waldv[i]>crit_lrt){
power_wald=power_wald+1
}
}
#'============================='
power_lrt=power_lrt/nrep*100
power_wald=power_wald/nrep*100
crit_lrt=quantile(lrtv,0.95)
crit_wald=quantile(waldv,0.95)
return(c(power_lrt, power_wald,crit_lrt,crit_wald ))
}
Computer power
computePower =function( nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05, crit_lrt = 4.815507, crit_wald = 7.825018){
set.seed(nseed)
#nrep=nrep
#n=10
c1=1
c2=4
#rho=0.0
#x=rnorm(n)+(1:n)/n
x = xdata$x[1:n]
#y = numeric(20000)
lrtv = numeric(nrep)
waldv = numeric(nrep)
power_lrt=0.0
power_wald=0.0
asymp_crit=qchisq(1-alpha,1)
#'============================='
for (i in 1: nrep ){
e = numeric(n)
#genr e=rho*e(-1)+@rnorm
#e = arima.sim(model=list(ar=rho),n=n)
# or
for(j in 2:n){
e[j] = rho*e[j-1] + rnorm(1)
}
#arima(e, order = c(1, 0, 0))
#acf(e, 10)
#pacf(e, 10)
y=c1+c2*x+e
#equation eq1.ls y c x
fit1 <- lm(y~ x)
#summary(fit1)
#loglr=@logl
loglr=logLik(fit1)
#http://stackoverflow.com/questions/7233288/non-stationary-seasonal-ar-part-from-css-error-in-r
#equation eq2.ls(arma=ml) y c x ar(1)
fit2 <- arima(y, xreg=x, order=c(1,0,0),method="ML")
#summary(fit2)
#str(coeftest(fit2) )
#scalar loglu=@logl
loglu=logLik(fit2)
lrtv[i]=-2*(loglr-loglu)
#'if lrtv(!i)>asymp_crit then
if (lrtv[i]>crit_lrt){
#if (lrtv[i]>crit_lrt){
power_lrt=power_lrt+1
}
waldv[i]=coeftest(fit2)[1,3]^2
#'if waldv(!i)>asymp_crit
if (waldv[i]>asymp_crit){
#if (waldv[i]>crit_lrt){
power_wald=power_wald+1
}
}
#'============================='
power_lrt=power_lrt/nrep*100
power_wald=power_wald/nrep*100
#crit_lrt=quantile(lrtv,0.95)
#crit_wald=quantile(waldv,0.95)
return(c(power_lrt, power_wald))
}
Plot power curve
sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 10, alpha = 0.05)
95% 95%
7.600000 13.300000 4.815507 7.825018
Change parameters
sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 200, alpha = 0.05)
95% 95%
5.650000 5.700000 4.034827 4.077705
Change parameters
sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 500, alpha = 0.05)
95% 95%
5.350000 5.400000 3.913753 3.930252
Change parameters
sizeAdjust(nseed=654321, rho=0.0, nrep = 2000, n = 1000, alpha = 0.05)
95% 95%
4.550000 4.550000 3.635447 3.641662
Change parameters
computePower(nseed=654321, rho=-0.1, nrep = 2000, n = 10, alpha = 0.05)
[1] 7.05 16.40
Change parameters
computePower(nseed=654321, rho=-0.3, nrep = 2000, n = 10, alpha = 0.05)
[1] 15.05 28.75
Change parameters
computePower(nseed=654321, rho=-0.5, nrep = 2000, n = 10, alpha = 0.05)
[1] 31.75 49.20
Change parameters
computePower(nseed=654321, rho=-0.7, nrep = 2000, n = 10, alpha = 0.05)
[1] 53.60 69.55
Change parameters
computePower(nseed=654321, rho=0.1, nrep = 2000, n = 10, alpha = 0.05)
[1] 3.7 11.4
Change parameters
computePower(nseed=654321, rho=0.3, nrep = 2000, n = 10, alpha = 0.05)
[1] 3.85 12.35
Change parameters
computePower(nseed=654321, rho=0.5, nrep = 2000, n = 10, alpha = 0.05)
[1] 6.4 18.8
Change parameters
computePower(nseed=654321, rho=0.7, nrep = 2000, n = 10, alpha = 0.05)
[1] 11.75 29.55
LS0tDQp0aXRsZTogIkVDT041NDYgTEFCNSBTSU1VTEFUSU9OIEZPUiBMUlQgQU5EIFdBTEQgVEVTVCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KDQpXaGF0IHNpZ25pZmljYW5jZSBsZXZlbCBhcmUgd2UgY29uc2lkZXJpbmcgaW4gdGhpcyBleHBlcmltZW50IOKAkyAxMCUsIDUlIG9yIDElPw0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KG1vc2FpYykNCiNsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShsbXRlc3QpDQooYXN5bXBfY3JpdD1xY2hpc3EoMC45NSwxKSkNCg0KDQojeCA9IHNlcSgxLCA1LCAwLjAxICkNCg0KbGlicmFyeShyZWFkcikNCnhkYXRhIDwtIHJlYWRfY3N2KCJGOi9PbmVEcml2ZS9PbmUgZHJpdmUvNTQ2LTIwMTcvbGFiL2xhYjUveC5jc3YiKQ0KDQp6ID0gc2VxKDEsIDUgLCAwLjAxKQ0KcGxvdCggeiwgZGNoaXNxKHosIDEpLCJsIikNCmFibGluZSh2ID0gYXN5bXBfY3JpdCkNCmVxIDwtIGJxdW90ZSggY3JpdGljYWxfdmFsdWUgPT0gLihhc3ltcF9jcml0KSkNCnRleHQoeCA9IGFzeW1wX2NyaXQrMC42LCB5ID0gMC4wNSwgZXEpDQoNCmBgYA0KDQpJbiB3aGljaCBsaW5lIG9mIHRoZSBjb2RlIGRvIHdlIGFzc2lnbiB0aGUgbnVsbCBoeXBvdGhlc2lzIHRvIGJlIHRydWU/DQoNCmBgYHtyfQ0KcmhvPTAuMA0KYGBgDQoNCg0KV2hhdCBzYW1wbGUgc2l6ZSBpcyBiZWluZyBjb25zaWRlcmVkPw0KDQoNCmBgYHtyfQ0Kbj0xMA0KYGBgDQoNCg0KV2hpY2ggbGluZShzKSB3b3VsZCB3ZSBhbHRlciBpZiB3ZSB3YW50ZWQgdG8gY29uc2lkZXIgYSBzYW1wbGUgc2l6ZSBvZiAoc2F5KSBuID0gMjAwPw0KDQoNCmBgYHtyfQ0KbiA9IDIwMA0KYGBgDQoNCnRoZSBwZXJjZW50YWdlIHJlamVjdGlvbiByYXRlcyBmb3IgdGhlIGNhc2Ugd2hlcmUgVEhFIE5VTEwgSFlQT1RIRVNJUyBJUyBUUlVFIC0gc28gdGhlc2UgYXJlIHRoZSB0cnVlIHNpemVzIChzaWduaWZpY2FuY2UgbGV2ZWxzKSBvZiB0aGUgdGVzdHMsDQoNCg0KDQpgYGB7cn0NCnNldC5zZWVkKDY1NDMyMSkNCg0KbnJlcD0yMDAwDQpuPTEwDQoNCmMxPTEgDQpjMj00DQpyaG89MC4wDQojeD1ybm9ybShuKSsoMTpuKS9uDQoNCnggPSB4ZGF0YSR4WzE6bl0NCg0KI3N0cih4ZGF0YSR4KQ0KI3kgPSBudW1lcmljKDIwMDAwKSANCiANCmxydHYgPSBudW1lcmljKG5yZXApDQp3YWxkdiA9IG51bWVyaWMobnJlcCkNCg0KcG93ZXJfbHJ0PTAuMCANCg0KcG93ZXJfd2FsZD0wLjAgDQphc3ltcF9jcml0PXFjaGlzcSgwLjk1LDEpDQoNCiMnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nDQoNCg0KDQpmb3IgKGkgaW4gMTogbnJlcCApew0KDQogICAgDQogIGUgPSBudW1lcmljKG4pICAgIA0KICAjZ2VuciBlPXJobyplKC0xKStAcm5vcm0gDQogICNlID0gYXJpbWEuc2ltKG1vZGVsPWxpc3QoYXI9cmhvKSxuPW4pIA0KICANCiAgIyBvcg0KICANCiAgZm9yKGogaW4gMjpuKXsNCiAgICBlW2pdID0gcmhvKmVbai0xXSArIHJub3JtKDEpIA0KICB9DQogICNhcmltYShlLCBvcmRlciA9IGMoMSwgMCwgMCkpIA0KICAjYWNmKGUsIDEwKQ0KICAjcGFjZihlLCAxMCkNCiAgeT1jMStjMip4K2UgDQogIA0KICANCiAgI2VxdWF0aW9uIGVxMS5scyB5IGMgeCANCiAgZml0MSA8LSBsbSh5fiB4KQ0KICAjc3VtbWFyeShmaXQxKSAgDQogIA0KICAjbG9nbHI9QGxvZ2wgDQogIA0KICBsb2dscj1sb2dMaWsoZml0MSkgIA0KICANCiAgI2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIzMzI4OC9ub24tc3RhdGlvbmFyeS1zZWFzb25hbC1hci1wYXJ0LWZyb20tY3NzLWVycm9yLWluLXINCiAgI2VxdWF0aW9uIGVxMi5scyhhcm1hPW1sKSB5IGMgeCBhcigxKSANCiAgZml0MiA8LSBhcmltYSh5LCB4cmVnPXgsIG9yZGVyPWMoMSwwLDApLG1ldGhvZD0iTUwiKQ0KICAjc3VtbWFyeShmaXQyKQ0KICAjc3RyKGNvZWZ0ZXN0KGZpdDIpICkNCiAgDQogICNzY2FsYXIgbG9nbHU9QGxvZ2wgDQogIA0KICBsb2dsdT1sb2dMaWsoZml0MikNCiAgDQogIGxydHZbaV09LTIqKGxvZ2xyLWxvZ2x1KQ0KICANCiAgDQogICMnaWYgbHJ0dighaSk+YXN5bXBfY3JpdCB0aGVuDQogIGlmIChscnR2W2ldPmFzeW1wX2NyaXQpew0KICANCiAgDQogICNpZiAobHJ0dltpXT5jcml0X2xydCl7DQogICAgcG93ZXJfbHJ0PXBvd2VyX2xydCsxIA0KICAgIA0KICB9IA0KICAgDQogIA0KICANCiAgd2FsZHZbaV09Y29lZnRlc3QoZml0MilbMSwzXV4yIA0KICANCiAgDQogICMnaWYgd2FsZHYoIWkpPmFzeW1wX2NyaXQNCiAgDQogIGlmICh3YWxkdltpXT5hc3ltcF9jcml0KXsNCiANCiAgDQogICNpZiAod2FsZHZbaV0+Y3JpdF9scnQpew0KICAgIA0KICAgIHBvd2VyX3dhbGQ9cG93ZXJfd2FsZCsxDQogICAgDQogICAgfSANCg0KfQ0KIyc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PScNCg0KKHBvd2VyX2xydD1wb3dlcl9scnQvbnJlcCoxMDApDQoNCg0KKHBvd2VyX3dhbGQ9cG93ZXJfd2FsZC9ucmVwKjEwMCkNCg0KKGNyaXRfbHJ0PXF1YW50aWxlKGxydHYsMC45NSkgKQ0KDQpoaXN0KGxydHYpDQoNCihjcml0X3dhbGQ9cXVhbnRpbGUod2FsZHYsMC45NSkpDQpoaXN0KHdhbGR2KQ0KDQoNCg0KYGBgDQoNCg0KDQoNCiMjIE1ha2UgYSBmdW5jdGlvbiANCg0KDQpgYGB7cn0NCnNpemVBZGp1c3QgPSBmdW5jdGlvbiggIG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KXsNCiAgDQogICAgc2V0LnNlZWQobnNlZWQpDQogICAgDQogICAgI25yZXA9bnJlcA0KICAgICNuPTEwDQogICAgDQogICAgYzE9MSANCiAgICBjMj00DQogICAgI3Jobz0wLjANCiAgICAjeD1ybm9ybShuKSsoMTpuKS9uDQoNCiAgICB4ID0geGRhdGEkeFsxOm5dDQoNCiAgICANCiAgICAjeSA9IG51bWVyaWMoMjAwMDApIA0KICAgICANCiAgICBscnR2ID0gbnVtZXJpYyhucmVwKQ0KICAgIHdhbGR2ID0gbnVtZXJpYyhucmVwKQ0KICAgIA0KICAgIHBvd2VyX2xydD0wLjAgDQogICAgDQogICAgcG93ZXJfd2FsZD0wLjAgDQogICAgYXN5bXBfY3JpdD1xY2hpc3EoMS1hbHBoYSwxKQ0KICAgIA0KICAgICMnPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0nDQogICAgDQogICAgDQogICAgDQogICAgZm9yIChpIGluIDE6IG5yZXAgKXsNCiAgICANCiAgICAgICAgDQogICAgICBlID0gbnVtZXJpYyhuKSAgICANCiAgICAgICNnZW5yIGU9cmhvKmUoLTEpK0Bybm9ybSANCiAgICAgICNlID0gYXJpbWEuc2ltKG1vZGVsPWxpc3QoYXI9cmhvKSxuPW4pIA0KICAgICAgDQogICAgICAjIG9yDQogICAgICANCiAgICAgIGZvcihqIGluIDI6bil7DQogICAgICAgIGVbal0gPSByaG8qZVtqLTFdICsgcm5vcm0oMSkgDQogICAgICB9DQogICAgICAjYXJpbWEoZSwgb3JkZXIgPSBjKDEsIDAsIDApKSANCiAgICAgICNhY2YoZSwgMTApDQogICAgICAjcGFjZihlLCAxMCkNCiAgICAgIHk9YzErYzIqeCtlIA0KICAgICAgDQogICAgICANCiAgICAgICNlcXVhdGlvbiBlcTEubHMgeSBjIHggDQogICAgICBmaXQxIDwtIGxtKHl+IHgpDQogICAgICAjc3VtbWFyeShmaXQxKSAgDQogICAgICANCiAgICAgICNsb2dscj1AbG9nbCANCiAgICAgIA0KICAgICAgbG9nbHI9bG9nTGlrKGZpdDEpICANCiAgICAgIA0KICAgICAgI2h0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzIzMzI4OC9ub24tc3RhdGlvbmFyeS1zZWFzb25hbC1hci1wYXJ0LWZyb20tY3NzLWVycm9yLWluLXINCiAgICAgICNlcXVhdGlvbiBlcTIubHMoYXJtYT1tbCkgeSBjIHggYXIoMSkgDQogICAgICBmaXQyIDwtIGFyaW1hKHksIHhyZWc9eCwgb3JkZXI9YygxLDAsMCksbWV0aG9kPSJNTCIpDQogICAgICAjc3VtbWFyeShmaXQyKQ0KICAgICAgI3N0cihjb2VmdGVzdChmaXQyKSApDQogICAgICANCiAgICAgICNzY2FsYXIgbG9nbHU9QGxvZ2wgDQogICAgICANCiAgICAgIGxvZ2x1PWxvZ0xpayhmaXQyKQ0KICAgICAgDQogICAgICBscnR2W2ldPS0yKihsb2dsci1sb2dsdSkNCiAgICAgIA0KICAgICAgDQogICAgICAjJ2lmIGxydHYoIWkpPmFzeW1wX2NyaXQgdGhlbg0KICAgICAgaWYgKGxydHZbaV0+YXN5bXBfY3JpdCl7DQogICAgICANCiAgICAgIA0KICAgICAgI2lmIChscnR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgICAgcG93ZXJfbHJ0PXBvd2VyX2xydCsxIA0KICAgICAgICANCiAgICAgIH0gDQogICAgICAgDQogICAgICANCiAgICAgIA0KICAgICAgd2FsZHZbaV09Y29lZnRlc3QoZml0MilbMSwzXV4yIA0KICAgICAgDQogICAgICANCiAgICAgICMnaWYgd2FsZHYoIWkpPmFzeW1wX2NyaXQNCiAgICAgIA0KICAgICAgaWYgKHdhbGR2W2ldPmFzeW1wX2NyaXQpew0KICAgICANCiAgICAgIA0KICAgICAgI2lmICh3YWxkdltpXT5jcml0X2xydCl7DQogICAgICAgIA0KICAgICAgICBwb3dlcl93YWxkPXBvd2VyX3dhbGQrMQ0KICAgICAgICANCiAgICAgICAgfSANCiAgICANCiAgICB9DQogICAgICAgIyc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PScNCiAgICANCiAgICBwb3dlcl9scnQ9cG93ZXJfbHJ0L25yZXAqMTAwDQogICAgDQogICAgDQogICAgcG93ZXJfd2FsZD1wb3dlcl93YWxkL25yZXAqMTAwDQogICAgDQogICAgY3JpdF9scnQ9cXVhbnRpbGUobHJ0diwwLjk1KSANCg0KICAgIGNyaXRfd2FsZD1xdWFudGlsZSh3YWxkdiwwLjk1KQ0KICAgIA0KICAgIA0KICAgIHJldHVybihjKHBvd2VyX2xydCwgcG93ZXJfd2FsZCxjcml0X2xydCxjcml0X3dhbGQgKSkNCg0KfQ0KDQpgYGANCg0KDQoNCg0KDQoNCiMjIENvbXB1dGVyIHBvd2VyDQoNCg0KYGBge3J9DQoNCg0KY29tcHV0ZVBvd2VyID1mdW5jdGlvbiggbnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDXvvIwgY3JpdF9scnQgPSA0LjgxNTUwN++8jCBjcml0X3dhbGQgPSA3LjgyNTAxOCl7DQogIA0KICAgIHNldC5zZWVkKG5zZWVkKQ0KICAgIA0KICAgICNucmVwPW5yZXANCiAgICAjbj0xMA0KICAgIA0KICAgIGMxPTEgDQogICAgYzI9NA0KICAgICNyaG89MC4wDQogICAgI3g9cm5vcm0obikrKDE6bikvbg0KDQogICAgeCA9IHhkYXRhJHhbMTpuXQ0KDQogICAgDQogICAgI3kgPSBudW1lcmljKDIwMDAwKSANCiAgICAgDQogICAgbHJ0diA9IG51bWVyaWMobnJlcCkNCiAgICB3YWxkdiA9IG51bWVyaWMobnJlcCkNCiAgICANCiAgICBwb3dlcl9scnQ9MC4wIA0KICAgIA0KICAgIHBvd2VyX3dhbGQ9MC4wIA0KICAgIGFzeW1wX2NyaXQ9cWNoaXNxKDEtYWxwaGEsMSkNCiAgICANCiAgICAjJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jw0KICAgIA0KICAgIA0KICAgIA0KICAgIGZvciAoaSBpbiAxOiBucmVwICl7DQogICAgDQogICAgICAgIA0KICAgICAgZSA9IG51bWVyaWMobikgICAgDQogICAgICAjZ2VuciBlPXJobyplKC0xKStAcm5vcm0gDQogICAgICAjZSA9IGFyaW1hLnNpbShtb2RlbD1saXN0KGFyPXJobyksbj1uKSANCiAgICAgIA0KICAgICAgIyBvcg0KICAgICAgDQogICAgICBmb3IoaiBpbiAyOm4pew0KICAgICAgICBlW2pdID0gcmhvKmVbai0xXSArIHJub3JtKDEpIA0KICAgICAgfQ0KICAgICAgI2FyaW1hKGUsIG9yZGVyID0gYygxLCAwLCAwKSkgDQogICAgICAjYWNmKGUsIDEwKQ0KICAgICAgI3BhY2YoZSwgMTApDQogICAgICB5PWMxK2MyKngrZSANCiAgICAgIA0KICAgICAgDQogICAgICAjZXF1YXRpb24gZXExLmxzIHkgYyB4IA0KICAgICAgZml0MSA8LSBsbSh5fiB4KQ0KICAgICAgI3N1bW1hcnkoZml0MSkgIA0KICAgICAgDQogICAgICAjbG9nbHI9QGxvZ2wgDQogICAgICANCiAgICAgIGxvZ2xyPWxvZ0xpayhmaXQxKSAgDQogICAgICANCiAgICAgICNodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzcyMzMyODgvbm9uLXN0YXRpb25hcnktc2Vhc29uYWwtYXItcGFydC1mcm9tLWNzcy1lcnJvci1pbi1yDQogICAgICAjZXF1YXRpb24gZXEyLmxzKGFybWE9bWwpIHkgYyB4IGFyKDEpIA0KICAgICAgZml0MiA8LSBhcmltYSh5LCB4cmVnPXgsIG9yZGVyPWMoMSwwLDApLG1ldGhvZD0iTUwiKQ0KICAgICAgI3N1bW1hcnkoZml0MikNCiAgICAgICNzdHIoY29lZnRlc3QoZml0MikgKQ0KICAgICAgDQogICAgICAjc2NhbGFyIGxvZ2x1PUBsb2dsIA0KICAgICAgDQogICAgICBsb2dsdT1sb2dMaWsoZml0MikNCiAgICAgIA0KICAgICAgbHJ0dltpXT0tMioobG9nbHItbG9nbHUpDQogICAgICANCiAgICAgIA0KICAgICAgIydpZiBscnR2KCFpKT5hc3ltcF9jcml0IHRoZW4NCiAgICAgIGlmIChscnR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgIA0KICAgICAgDQogICAgICAjaWYgKGxydHZbaV0+Y3JpdF9scnQpew0KICAgICAgICBwb3dlcl9scnQ9cG93ZXJfbHJ0KzEgDQogICAgICAgIA0KICAgICAgfSANCiAgICAgICANCiAgICAgIA0KICAgICAgDQogICAgICB3YWxkdltpXT1jb2VmdGVzdChmaXQyKVsxLDNdXjIgDQogICAgICANCiAgICAgIA0KICAgICAgIydpZiB3YWxkdighaSk+YXN5bXBfY3JpdA0KICAgICAgDQogICAgICBpZiAod2FsZHZbaV0+YXN5bXBfY3JpdCl7DQogICAgIA0KICAgICAgDQogICAgICAjaWYgKHdhbGR2W2ldPmNyaXRfbHJ0KXsNCiAgICAgICAgDQogICAgICAgIHBvd2VyX3dhbGQ9cG93ZXJfd2FsZCsxDQogICAgICAgIA0KICAgICAgICB9IA0KICAgIA0KICAgIH0NCiAgICAgICAjJz09PT09PT09PT09PT09PT09PT09PT09PT09PT09Jw0KICAgIA0KICAgIHBvd2VyX2xydD1wb3dlcl9scnQvbnJlcCoxMDANCiAgICANCiAgICANCiAgICBwb3dlcl93YWxkPXBvd2VyX3dhbGQvbnJlcCoxMDANCiAgICANCiAgICAjY3JpdF9scnQ9cXVhbnRpbGUobHJ0diwwLjk1KSANCg0KICAgICNjcml0X3dhbGQ9cXVhbnRpbGUod2FsZHYsMC45NSkNCiAgICANCiAgICANCiAgICByZXR1cm4oYyhwb3dlcl9scnQsIHBvd2VyX3dhbGQpKQ0KDQp9DQoNCg0KDQpgYGANCg0KIyMgUGxvdCBwb3dlciBjdXJ2ZQ0KDQoNCg0KYGBge3J9DQpzaXplQWRqdXN0KG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpzaXplQWRqdXN0KG5zZWVkPTY1NDMyMSwgcmhvPTAuMCwgbnJlcCA9IDIwMDAsIG4gPSAyMDAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCnNpemVBZGp1c3QobnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDUwMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCnNpemVBZGp1c3QobnNlZWQ9NjU0MzIxLCByaG89MC4wLCBucmVwID0gMjAwMCwgbiA9IDEwMDAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KIyMjIENoYW5nZSBwYXJhbWV0ZXJzDQoNCmBgYHtyfQ0KY29tcHV0ZVBvd2VyKG5zZWVkPTY1NDMyMSwgcmhvPS0wLjEsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0tMC4zLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0tMC41LCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89LTAuNywgIG5yZXAgPSAyMDAwLCBuID0gMTAsIGFscGhhID0gMC4wNSkNCg0KYGBgDQoNCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89MC4xLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQojIyMgQ2hhbmdlIHBhcmFtZXRlcnMNCg0KYGBge3J9DQpjb21wdXRlUG93ZXIobnNlZWQ9NjU0MzIxLCByaG89MC4zLCAgbnJlcCA9IDIwMDAsIG4gPSAxMCwgYWxwaGEgPSAwLjA1KQ0KDQpgYGANCg0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0wLjUsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA0KDQoNCiMjIyBDaGFuZ2UgcGFyYW1ldGVycw0KDQpgYGB7cn0NCmNvbXB1dGVQb3dlcihuc2VlZD02NTQzMjEsIHJobz0wLjcsICBucmVwID0gMjAwMCwgbiA9IDEwLCBhbHBoYSA9IDAuMDUpDQoNCmBgYA==