DOE<-expand.grid(x1=c(3,5),
x2=c(3,5),
x3=c(2,4))
DOE
DOE<-rbind(DOE,DOE)
DOE
DOE$Bloco<- as.factor(c(rep(1,8),rep(2,8)))
DOE
DOE$y<-c(1.71, 1.83,3.96, 3.54,4.22, 4.42, 5.80, 5.60,
1.72, 1.87,3.83, 3.57,4.18, 4.40, 5.90, 5.90 )
funcao<-lm(y~x1*x2*x3+Bloco,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ x1 * x2 * x3 + Bloco, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.13187 -0.02906 0.00000 0.02906 0.13187
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.38312 1.19684 -5.333 0.001084 **
x1 0.51000 0.29023 1.757 0.122293
x2 1.83500 0.29023 6.323 0.000395 ***
x3 1.76937 0.37841 4.676 0.002272 **
Bloco2 0.03625 0.04452 0.814 0.442309
x1:x2 -0.16000 0.07039 -2.273 0.057220 .
x1:x3 -0.04312 0.09178 -0.470 0.652724
x2:x3 -0.19437 0.09178 -2.118 0.071946 .
x1:x2:x3 0.02062 0.02226 0.927 0.384980
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.08904 on 7 degrees of freedom
Multiple R-squared: 0.9983, Adjusted R-squared: 0.9964
F-statistic: 525.8 on 8 and 7 DF, p-value: 4.992e-09
summary(aov(funcao))
Df Sum Sq Mean Sq F value Pr(>F)
x1 1 0.002 0.002 0.285 0.61021
x2 1 11.816 11.816 1490.525 2.04e-09 ***
x3 1 21.137 21.137 2666.229 2.68e-10 ***
Bloco 1 0.005 0.005 0.663 0.44231
x1:x2 1 0.154 0.154 19.433 0.00313 **
x1:x3 1 0.025 0.025 3.129 0.12023
x2:x3 1 0.200 0.200 25.260 0.00152 **
x1:x2:x3 1 0.007 0.007 0.859 0.38498
Residuals 7 0.055 0.008
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
funcao<-lm(y~ -1+x1*x2*x3,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ -1 + x1 * x2 * x3, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.22524 -0.09830 -0.03607 0.11664 0.19714
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x1 -0.98765 0.14069 -7.020 6.19e-05 ***
x2 0.33735 0.14069 2.398 0.040043 *
x3 -0.14013 0.23918 -0.586 0.572368
x1:x2 0.19239 0.04754 4.047 0.002900 **
x1:x3 0.40617 0.07174 5.662 0.000309 ***
x2:x3 0.25492 0.07174 3.553 0.006183 **
x1:x2:x3 -0.08509 0.02003 -4.247 0.002151 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.178 on 9 degrees of freedom
Multiple R-squared: 0.999, Adjusted R-squared: 0.9982
F-statistic: 1249 on 7 and 9 DF, p-value: 1.037e-12
summary(aov(funcao))
Df Sum Sq Mean Sq F value Pr(>F)
x1 1 229.06 229.06 7232.437 2.18e-14 ***
x2 1 26.38 26.38 832.862 3.51e-10 ***
x3 1 17.98 17.98 567.797 1.93e-09 ***
x1:x2 1 2.35 2.35 74.073 1.23e-05 ***
x1:x3 1 0.53 0.53 16.603 0.00278 **
x2:x3 1 0.00 0.00 0.002 0.96373
x1:x2:x3 1 0.57 0.57 18.039 0.00215 **
Residuals 9 0.29 0.03
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Resíduos
# Análise da normalidade dos resíduos
curve(dnorm(x,mean(funcao$residuals),sd(funcao$residuals)),
from = min(funcao$residuals),to=max(funcao$residuals),
lwd=3,col="violet",main="Curva Normal dos Resíduos",
xlab="Observações",ylab = "Densidade")

shapiro.test(funcao$residuals)
Shapiro-Wilk normality test
data: funcao$residuals
W = 0.9352, p-value = 0.2943
# Testes de homocedasticidade e autocorrelação residual
library(lmtest)
library(car)
residualPlot(funcao)

bptest(funcao)
studentized Breusch-Pagan test
data: funcao
BP = 10.47, df = 6, p-value = 0.1062
durbinWatsonTest(funcao)
lag Autocorrelation D-W Statistic p-value
1 -0.1387733 1.973388 0.95
Alternative hypothesis: rho != 0
dwtest(funcao)
Durbin-Watson test
data: funcao
DW = 1.9734, p-value = 0.5154
alternative hypothesis: true autocorrelation is greater than 0
dwt(funcao)
lag Autocorrelation D-W Statistic p-value
1 -0.1387733 1.973388 0.978
Alternative hypothesis: rho != 0
#Análise das médias dos efeitos
library(FrF2)
funcao<-lm(y~ -1+x1*x2*x3,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ -1 + x1 * x2 * x3, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.22524 -0.09830 -0.03607 0.11664 0.19714
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x1 -0.98765 0.14069 -7.020 6.19e-05 ***
x2 0.33735 0.14069 2.398 0.040043 *
x3 -0.14013 0.23918 -0.586 0.572368
x1:x2 0.19239 0.04754 4.047 0.002900 **
x1:x3 0.40617 0.07174 5.662 0.000309 ***
x2:x3 0.25492 0.07174 3.553 0.006183 **
x1:x2:x3 -0.08509 0.02003 -4.247 0.002151 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.178 on 9 degrees of freedom
Multiple R-squared: 0.999, Adjusted R-squared: 0.9982
F-statistic: 1249 on 7 and 9 DF, p-value: 1.037e-12
MEPlot(funcao)

# Percebe-se por meio destas análises, quais são os níveis de ajustes dos fatores, visando o aumento da distância em [M]
# Otimização
library(rsm)
obj=function(x){a<- predict(funcao,newdata = data.frame(x1=x[1],
x2=x[2],
x3=x[3]))
return(-a)}
x0<-c(0,0,0)
optim(par =x0, fn=obj, lower = c(3,3,2),upper = c(5,5,4),
method = c("L-BFGS-B"))
$par
[1] 3 5 4
$value
[1] -5.916073
$counts
function gradient
4 4
$convergence
[1] 0
$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
library(NlcOptim)
solnl(X=x0,objfun = obj, lb = c(3,3,2),ub=c(5,5,4))
$par
[,1]
[1,] 3
[2,] 5
[3,] 4
$fn
1
-5.916073
$counts
nfval ngval
[1,] 33 6
$lambda
$lambda$lower
[,1]
[1,] 0.1028581
[2,] 0.0000000
[3,] 0.0000000
$lambda$upper
[,1]
[1,] 0.0000000
[2,] 0.9130969
[3,] 1.0766090
$grad
[,1]
[1,] 0.1028581
[2,] -0.9130969
[3,] -1.0766090
$hessian
[,1] [,2] [,3]
[1,] 5.969496e-05 0.1480236 0.01930137
[2,] 1.480236e-01 367.0501881 47.86097263
[3,] 1.930137e-02 47.8609726 6.24159627
library(rsm)
persp(funcao,~x1+x2,zlab = "comprimento",col="blue",
contours = "colors",theta = 30,phi = 30)

persp(funcao,~x1+x3,zlab = "comprimento",col="blue",
contours = "colors",theta = 30,phi = 30)

persp(funcao,~x2+x3,zlab = "comprimento",col="blue",
contours = "colors",theta = 30,phi = 30)

contour(funcao,~x1+x2, image = T )
points(3,5,col="blue",lwd=4) # ponto de ótimo

contour(funcao,~x1+x3, col="purple" )
points(3,4,col="blue",lwd=4) # ponto de ótimo

contour(funcao,~x1+x2, col=rainbow(10) )
points(5,4,col="blue",lwd=4) # ponto de ótimo

#Validação Estatística
DOE
predict(funcao,newdata = data.frame(x1=3,x2=5,x3=4),
se.fit = T,interval = "pred")
$fit
fit lwr upr
1 5.916073 5.426218 6.405928
$se.fit
[1] 0.1233668
$df
[1] 9
$residual.scale
[1] 0.1779652
predict(funcao,newdata = data.frame(x1=3,x2=5,x3=4),
se.fit = T,interval = "conf")
$fit
fit lwr upr
1 5.916073 5.636998 6.195148
$se.fit
[1] 0.1233668
$df
[1] 9
$residual.scale
[1] 0.1779652
# Com aleatorização ou randomização
DOE<-expand.grid(x1=c(3,5),
x2=c(3,5),
x3=c(2,4))
DOE
DOE<-rbind(DOE,DOE)
DOE
DOE$Bloco<- as.factor(c(rep(1,8),rep(2,8)))
DOE
set.seed(30);DOE<- DOE[sample(nrow(DOE)),] # Aleatorização
DOE
DOE$y<-(c( 1.83,4.40, 1.83,5.50, 3.66,5.85,3.66,3.63,
3.44,1.72, 1.94,4.40,5.78,4.20,5.95,3.74))
funcao<-lm(y~x1*x2*x3+Bloco,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ x1 * x2 * x3 + Bloco, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.27063 -0.05281 0.00000 0.05281 0.27063
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -6.00938 2.66159 -2.258 0.0585 .
x1 0.62500 0.64542 0.968 0.3651
x2 1.65500 0.64542 2.564 0.0373 *
x3 2.42188 0.84152 2.878 0.0237 *
Bloco2 0.11875 0.09900 1.199 0.2694
x1:x2 -0.17000 0.15654 -1.086 0.3135
x1:x3 -0.27688 0.20410 -1.357 0.2170
x2:x3 -0.33813 0.20410 -1.657 0.1416
x1:x2:x3 0.07313 0.04950 1.477 0.1831
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.198 on 7 degrees of freedom
Multiple R-squared: 0.9915, Adjusted R-squared: 0.9818
F-statistic: 101.9 on 8 and 7 DF, p-value: 1.497e-06
summary(aov(funcao))
Df Sum Sq Mean Sq F value Pr(>F)
x1 1 0.001 0.001 0.027 0.874
x2 1 11.239 11.239 286.670 6.14e-07 ***
x3 1 20.498 20.498 522.831 7.75e-08 ***
Bloco 1 0.056 0.056 1.439 0.269
x1:x2 1 0.039 0.039 0.995 0.352
x1:x3 1 0.004 0.004 0.100 0.761
x2:x3 1 0.033 0.033 0.850 0.387
x1:x2:x3 1 0.086 0.086 2.182 0.183
Residuals 7 0.274 0.039
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
funcao<-lm(y~x2+x3,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ x2 + x3, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.39938 -0.06219 0.04750 0.10813 0.26063
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.90250 0.24842 -11.68 2.88e-08 ***
x2 0.83812 0.04872 17.20 2.52e-10 ***
x3 1.13188 0.04872 23.23 5.69e-12 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1949 on 13 degrees of freedom
Multiple R-squared: 0.9847, Adjusted R-squared: 0.9823
F-statistic: 417.9 on 2 and 13 DF, p-value: 1.598e-12
funcao<-lm(y~ -1+x1*x2*x3,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ -1 + x1 * x2 * x3, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.39176 -0.11794 0.05706 0.12353 0.26824
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x1 -0.77500 0.19128 -4.052 0.00288 **
x2 0.25500 0.19128 1.333 0.21524
x3 0.63687 0.32517 1.959 0.08183 .
x1:x2 0.15941 0.06464 2.466 0.03579 *
x1:x3 0.14313 0.09753 1.467 0.17631
x2:x3 0.08188 0.09753 0.839 0.42295
x1:x2:x3 -0.02570 0.02724 -0.944 0.37006
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.2419 on 9 degrees of freedom
Multiple R-squared: 0.998, Adjusted R-squared: 0.9965
F-statistic: 654.8 on 7 and 9 DF, p-value: 1.884e-11
funcao<-lm(y~ -1+x1+x2+x3+x2*x3,data = DOE)
summary(funcao)
Call:
lm.default(formula = y ~ -1 + x1 + x2 + x3 + x2 * x3, data = DOE)
Residuals:
Min 1Q Median 3Q Max
-0.55909 -0.28585 0.08425 0.17886 0.48036
Coefficients:
Estimate Std. Error t value Pr(>|t|)
x1 -0.08162 0.08348 -0.978 0.3475
x2 0.24005 0.10324 2.325 0.0384 *
x3 0.37732 0.15165 2.488 0.0285 *
x2:x3 0.17486 0.04149 4.214 0.0012 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.3493 on 12 degrees of freedom
Multiple R-squared: 0.9946, Adjusted R-squared: 0.9927
F-statistic: 547.9 on 4 and 12 DF, p-value: 1.816e-13
#Resíduos
curve(dnorm(x,mean(funcao$residuals),sd(funcao$residuals)),
from = min(funcao$residuals),to=max(funcao$residuals),
lwd=3,col="violet",main="Curva Normal dos Resíduos",
xlab="Observações",ylab = "Densidade")

shapiro.test(funcao$residuals)
Shapiro-Wilk normality test
data: funcao$residuals
W = 0.95075, p-value = 0.5017
library(lmtest)
library(car)
residualPlot(funcao)

bptest(funcao)
studentized Breusch-Pagan test
data: funcao
BP = 1.2482, df = 3, p-value = 0.7415
durbinWatsonTest(funcao)
lag Autocorrelation D-W Statistic p-value
1 -0.2059954 2.334132 0.414
Alternative hypothesis: rho != 0
dwtest(funcao)
Durbin-Watson test
data: funcao
DW = 2.3341, p-value = 0.8053
alternative hypothesis: true autocorrelation is greater than 0
dwt(funcao)
lag Autocorrelation D-W Statistic p-value
1 -0.2059954 2.334132 0.408
Alternative hypothesis: rho != 0
library(FrF2)
MEPlot(funcao)

obj=function(x){a<- predict(funcao,newdata = data.frame(x1=x[1],
x2=x[2],
x3=x[3]))
return(-a)}
x0<-c(0,0,0)
optim(par =x0, fn=obj, lower = c(3,3,2),upper = c(5,5,4),
method = c("L-BFGS-B"))
$par
[1] 3 5 4
$value
[1] -5.961862
$counts
function gradient
5 5
$convergence
[1] 0
$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
library(NlcOptim)
solnl(X=x0,objfun = obj, lb = c(3,3,2),ub=c(5,5,4))
$par
[,1]
[1,] 3
[2,] 5
[3,] 4
$fn
1
-5.961862
$counts
nfval ngval
[1,] 13 4
$lambda
$lambda$lower
[,1]
[1,] 0.08161962
[2,] 0.00000000
[3,] 0.00000000
$lambda$upper
[,1]
[1,] 0.0000000
[2,] 0.9394892
[3,] 1.2516129
$grad
[,1]
[1,] 0.08161962
[2,] -0.93948925
[3,] -1.25161290
$hessian
[,1] [,2] [,3]
[1,] 1.000000e+00 3.748032e-09 -3.058125e-09
[2,] 3.748032e-09 7.383624e-02 -6.914123e-02
[3,] -3.058125e-09 -6.914123e-02 1.087904e-01
DOE
predict(funcao,newdata = data.frame(x1=3,x2=5,x3=4),
se.fit = T,interval = "conf")
$fit
fit lwr upr
1 5.961862 5.559959 6.363764
$se.fit
[1] 0.1844595
$df
[1] 12
$residual.scale
[1] 0.3492838
LS0tDQp0aXRsZTogIkRPRSBDT00gQkxPQ0FHRU06IENBVEFQVUxUQV8yMDI0Ig0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQpET0U8LWV4cGFuZC5ncmlkKHgxPWMoMyw1KSwNCiAgICAgICAgICAgICAgICAgeDI9YygzLDUpLA0KICAgICAgICAgICAgICAgICB4Mz1jKDIsNCkpDQpET0UNCkRPRTwtcmJpbmQoRE9FLERPRSkNCkRPRQ0KRE9FJEJsb2NvPC0gYXMuZmFjdG9yKGMocmVwKDEsOCkscmVwKDIsOCkpKQ0KDQpET0UNCg0KRE9FJHk8LWMoMS43MSwgIDEuODMsMy45NiwgMy41NCw0LjIyLCA0LjQyLCA1LjgwLCA1LjYwLA0KICAgICAgICAgMS43MiwgIDEuODcsMy44MywgMy41Nyw0LjE4LCA0LjQwLCA1LjkwLCA1LjkwICkNCmZ1bmNhbzwtbG0oeX54MSp4Mip4MytCbG9jbyxkYXRhID0gRE9FKQ0Kc3VtbWFyeShmdW5jYW8pDQpzdW1tYXJ5KGFvdihmdW5jYW8pKQ0KZnVuY2FvPC1sbSh5fiAtMSt4MSp4Mip4MyxkYXRhID0gRE9FKQ0Kc3VtbWFyeShmdW5jYW8pDQpzdW1tYXJ5KGFvdihmdW5jYW8pKQ0KI1Jlc8OtZHVvcw0KIyBBbsOhbGlzZSBkYSBub3JtYWxpZGFkZSBkb3MgcmVzw61kdW9zDQpjdXJ2ZShkbm9ybSh4LG1lYW4oZnVuY2FvJHJlc2lkdWFscyksc2QoZnVuY2FvJHJlc2lkdWFscykpLA0KICAgICAgZnJvbSA9IG1pbihmdW5jYW8kcmVzaWR1YWxzKSx0bz1tYXgoZnVuY2FvJHJlc2lkdWFscyksDQogICAgICBsd2Q9Myxjb2w9InZpb2xldCIsbWFpbj0iQ3VydmEgTm9ybWFsIGRvcyBSZXPDrWR1b3MiLA0KICAgICAgeGxhYj0iT2JzZXJ2YcOnw7VlcyIseWxhYiA9ICJEZW5zaWRhZGUiKQ0Kc2hhcGlyby50ZXN0KGZ1bmNhbyRyZXNpZHVhbHMpDQojIFRlc3RlcyBkZSBob21vY2VkYXN0aWNpZGFkZSBlIGF1dG9jb3JyZWxhw6fDo28gcmVzaWR1YWwNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShjYXIpDQpyZXNpZHVhbFBsb3QoZnVuY2FvKQ0KYnB0ZXN0KGZ1bmNhbykNCmR1cmJpbldhdHNvblRlc3QoZnVuY2FvKQ0KZHd0ZXN0KGZ1bmNhbykNCmR3dChmdW5jYW8pDQpgYGANCmBgYHtyfQ0KI0Fuw6FsaXNlIGRhcyBtw6lkaWFzIGRvcyBlZmVpdG9zDQpsaWJyYXJ5KEZyRjIpDQpmdW5jYW88LWxtKHl+IC0xK3gxKngyKngzLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbykNCk1FUGxvdChmdW5jYW8pDQojIFBlcmNlYmUtc2UgcG9yIG1laW8gZGVzdGFzIGFuw6FsaXNlcywgcXVhaXMgc8OjbyBvcyBuw612ZWlzIGRlIGFqdXN0ZXMgZG9zIGZhdG9yZXMsIHZpc2FuZG8gbyBhdW1lbnRvIGRhIGRpc3TDom5jaWEgZW0gW01dDQpgYGANCg0KDQpgYGB7cn0NCiMgT3RpbWl6YcOnw6NvDQpsaWJyYXJ5KHJzbSkNCm9iaj1mdW5jdGlvbih4KXthPC0gcHJlZGljdChmdW5jYW8sbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9eFsxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI9eFsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDM9eFszXSkpDQpyZXR1cm4oLWEpfQ0KDQp4MDwtYygwLDAsMCkNCm9wdGltKHBhciA9eDAsIGZuPW9iaiwgbG93ZXIgPSBjKDMsMywyKSx1cHBlciA9IGMoNSw1LDQpLA0KICAgICAgbWV0aG9kID0gYygiTC1CRkdTLUIiKSkNCmxpYnJhcnkoTmxjT3B0aW0pDQpzb2xubChYPXgwLG9iamZ1biA9IG9iaiwgbGIgPSBjKDMsMywyKSx1Yj1jKDUsNSw0KSkNCmxpYnJhcnkocnNtKQ0KcGVyc3AoZnVuY2FvLH54MSt4Mix6bGFiID0gImNvbXByaW1lbnRvIixjb2w9ImJsdWUiLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIix0aGV0YSA9IDMwLHBoaSA9IDMwKQ0KcGVyc3AoZnVuY2FvLH54MSt4Myx6bGFiID0gImNvbXByaW1lbnRvIixjb2w9ImJsdWUiLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIix0aGV0YSA9IDMwLHBoaSA9IDMwKQ0KcGVyc3AoZnVuY2FvLH54Mit4Myx6bGFiID0gImNvbXByaW1lbnRvIixjb2w9ImJsdWUiLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIix0aGV0YSA9IDMwLHBoaSA9IDMwKQ0KY29udG91cihmdW5jYW8sfngxK3gyLCBpbWFnZSA9IFQgKQ0KcG9pbnRzKDMsNSxjb2w9ImJsdWUiLGx3ZD00KSAjIHBvbnRvIGRlIMOzdGltbw0KY29udG91cihmdW5jYW8sfngxK3gzLCBjb2w9InB1cnBsZSIgKQ0KcG9pbnRzKDMsNCxjb2w9ImJsdWUiLGx3ZD00KSAjIHBvbnRvIGRlIMOzdGltbw0KY29udG91cihmdW5jYW8sfngxK3gyLCBjb2w9cmFpbmJvdygxMCkgKQ0KcG9pbnRzKDUsNCxjb2w9ImJsdWUiLGx3ZD00KSAjIHBvbnRvIGRlIMOzdGltbw0KYGBgDQoNCg0KYGBge3J9DQojVmFsaWRhw6fDo28gRXN0YXTDrXN0aWNhDQpET0UNCnByZWRpY3QoZnVuY2FvLG5ld2RhdGEgPSBkYXRhLmZyYW1lKHgxPTMseDI9NSx4Mz00KSwNCiAgICAgICAgc2UuZml0ID0gVCxpbnRlcnZhbCA9ICJwcmVkIikNCnByZWRpY3QoZnVuY2FvLG5ld2RhdGEgPSBkYXRhLmZyYW1lKHgxPTMseDI9NSx4Mz00KSwNCiAgICAgICAgc2UuZml0ID0gVCxpbnRlcnZhbCA9ICJjb25mIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBDb20gYWxlYXRvcml6YcOnw6NvIG91IHJhbmRvbWl6YcOnw6NvDQoNCkRPRTwtZXhwYW5kLmdyaWQoeDE9YygzLDUpLA0KICAgICAgICAgICAgICAgICB4Mj1jKDMsNSksDQogICAgICAgICAgICAgICAgIHgzPWMoMiw0KSkNCkRPRQ0KRE9FPC1yYmluZChET0UsRE9FKQ0KRE9FDQpET0UkQmxvY288LSBhcy5mYWN0b3IoYyhyZXAoMSw4KSxyZXAoMiw4KSkpDQoNCkRPRQ0KDQpzZXQuc2VlZCgzMCk7RE9FPC0gRE9FW3NhbXBsZShucm93KERPRSkpLF0gIyBBbGVhdG9yaXphw6fDo28NCg0KRE9FDQpET0UkeTwtKGMoIDEuODMsNC40MCwgMS44Myw1LjUwLCAzLjY2LDUuODUsMy42NiwzLjYzLA0KICAgICAgICAgIDMuNDQsMS43MiwgMS45NCw0LjQwLDUuNzgsNC4yMCw1Ljk1LDMuNzQpKQ0KZnVuY2FvPC1sbSh5fngxKngyKngzK0Jsb2NvLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbykNCnN1bW1hcnkoYW92KGZ1bmNhbykpDQpmdW5jYW88LWxtKHl+eDIreDMsZGF0YSA9IERPRSkNCnN1bW1hcnkoZnVuY2FvKQ0KDQpmdW5jYW88LWxtKHl+IC0xK3gxKngyKngzLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbykNCmZ1bmNhbzwtbG0oeX4gLTEreDEreDIreDMreDIqeDMsZGF0YSA9IERPRSkNCnN1bW1hcnkoZnVuY2FvKQ0KDQojUmVzw61kdW9zDQpjdXJ2ZShkbm9ybSh4LG1lYW4oZnVuY2FvJHJlc2lkdWFscyksc2QoZnVuY2FvJHJlc2lkdWFscykpLA0KICAgICAgZnJvbSA9IG1pbihmdW5jYW8kcmVzaWR1YWxzKSx0bz1tYXgoZnVuY2FvJHJlc2lkdWFscyksDQogICAgICBsd2Q9Myxjb2w9InZpb2xldCIsbWFpbj0iQ3VydmEgTm9ybWFsIGRvcyBSZXPDrWR1b3MiLA0KICAgICAgeGxhYj0iT2JzZXJ2YcOnw7VlcyIseWxhYiA9ICJEZW5zaWRhZGUiKQ0Kc2hhcGlyby50ZXN0KGZ1bmNhbyRyZXNpZHVhbHMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoY2FyKQ0KcmVzaWR1YWxQbG90KGZ1bmNhbykNCmJwdGVzdChmdW5jYW8pDQpkdXJiaW5XYXRzb25UZXN0KGZ1bmNhbykNCmR3dGVzdChmdW5jYW8pDQpkd3QoZnVuY2FvKQ0KbGlicmFyeShGckYyKQ0KTUVQbG90KGZ1bmNhbykNCm9iaj1mdW5jdGlvbih4KXthPC0gcHJlZGljdChmdW5jYW8sbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9eFsxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI9eFsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDM9eFszXSkpDQpyZXR1cm4oLWEpfQ0KDQp4MDwtYygwLDAsMCkNCm9wdGltKHBhciA9eDAsIGZuPW9iaiwgbG93ZXIgPSBjKDMsMywyKSx1cHBlciA9IGMoNSw1LDQpLA0KICAgICAgbWV0aG9kID0gYygiTC1CRkdTLUIiKSkNCmxpYnJhcnkoTmxjT3B0aW0pDQpzb2xubChYPXgwLG9iamZ1biA9IG9iaiwgbGIgPSBjKDMsMywyKSx1Yj1jKDUsNSw0KSkNCkRPRQ0KcHJlZGljdChmdW5jYW8sbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9Myx4Mj01LHgzPTQpLA0KICAgICAgICBzZS5maXQgPSBULGludGVydmFsID0gImNvbmYiKQ0KDQpgYGANCg0KDQoNCg==