library(rsm)
library(lmtest)
Loading required package: zoo

Attaching package: ‘zoo’

The following objects are masked from ‘package:base’:

    as.Date, as.Date.numeric
library(car)
Loading required package: carData
library(FrF2)
Loading required package: DoE.base
Loading required package: grid
Loading required package: conf.design
Registered S3 method overwritten by 'DoE.base':
  method           from       
  factorize.factor conf.design

Attaching package: ‘DoE.base’

The following objects are masked from ‘package:stats’:

    aov, lm

The following object is masked from ‘package:graphics’:

    plot.design

The following object is masked from ‘package:base’:

    lengths
library(nortest)
library(ROI)
ROI: R Optimization Infrastructure
Registered solver plugins: nlminb, glpk.
Default solver: auto.
library(nloptr)
library(rio)
The following rio suggested packages are not installed: ‘arrow’, ‘hexView’, ‘fst’, ‘pzfx’, ‘rmatio’, ‘readODS’, ‘qs’
Use 'install_formats()' to install them

Attaching package: ‘rio’

The following object is masked from ‘package:conf.design’:

    factorize
DOE<-bbd(k=~ x1+x2+x3,
             randomize = F,
             block = F,
             n0=3,
         coding = list(x1~(A-0)/1,
                       x2~(T-1000)/100,
                        x3~(Carb-20)/10))
DOE$y<-c(2.49,3.46,4.08,4.40,2.87,
         3.99,4.62,4.92,1.83,1.16,
         2.39,2.25,2.07,2.64,2.82)
DOE$y2<-c(6.92,317,5.20,110.37,3.89,
          6.89,194.96,544.56,5.92,4.08,
          467.93,183.51,7.48,57.33,32.4050)
DOE
   run.order std.order  A    T Carb    y      y2
1          1         1 -1  900   20 2.49   6.920
2          2         2  1  900   20 3.46 317.000
3          3         3 -1 1100   20 4.08   5.200
4          4         4  1 1100   20 4.40 110.370
5          5         5 -1 1000   10 2.87   3.890
6          6         6  1 1000   10 3.99   6.890
7          7         7 -1 1000   30 4.62 194.960
8          8         8  1 1000   30 4.92 544.560
9          9         9  0  900   10 1.83   5.920
10        10        10  0 1100   10 1.16   4.080
11        11        11  0  900   30 2.39 467.930
12        12        12  0 1100   30 2.25 183.510
13        13        13  0 1000   20 2.07   7.480
14        14        14  0 1000   20 2.64  57.330
15        15        15  0 1000   20 2.82  32.405

Data are stored in coded form using these coding formulas ...
x1 ~ (A - 0)/1
x2 ~ (T - 1000)/100
x3 ~ (Carb - 20)/10
funcao<-rsm(y~ SO(x1,x2,x3),data = DOE)
summary(funcao)

Call:
rsm(formula = y ~ SO(x1, x2, x3), data = DOE)

            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  2.51000    0.34984  7.1748 0.0008182 ***
x1           0.33875    0.21423  1.5812 0.1746636    
x2           0.21500    0.21423  1.0036 0.3616406    
x3           0.54125    0.21423  2.5265 0.0527551 .  
x1:x2       -0.16250    0.30297 -0.5364 0.6147022    
x1:x3       -0.20500    0.30297 -0.6766 0.5286646    
x2:x3        0.13250    0.30297  0.4373 0.6801081    
x1^2         1.64500    0.31534  5.2166 0.0034194 ** 
x2^2        -0.54750    0.31534 -1.7362 0.1430375    
x3^2        -0.05500    0.31534 -0.1744 0.8683807    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.8954,    Adjusted R-squared:  0.7072 
F-statistic: 4.758 on 9 and 5 DF,  p-value: 0.05031

Analysis of Variance Table

Response: y
                Df  Sum Sq Mean Sq F value  Pr(>F)
FO(x1, x2, x3)   3  3.6314  1.2105  3.2969 0.11592
TWI(x1, x2, x3)  3  0.3440  0.1147  0.3123 0.81653
PQ(x1, x2, x3)   3 11.7454  3.9151 10.6634 0.01301
Residuals        5  1.8358  0.3672                
Lack of fit      3  1.5292  0.5097  3.3250 0.23975
Pure error       2  0.3066  0.1533                

Stationary point of response surface:
       x1        x2        x3 
0.2724875 0.8075658 5.3853867 

Stationary point in original units:
           A            T         Carb 
   0.2724875 1080.7565779   73.8538671 

Eigenanalysis:
eigen() decomposition
$values
[1]  1.65444822 -0.05362437 -0.55832385

$vectors
          [,1]        [,2]        [,3]
x1  0.99737086 -0.06559914 -0.03079145
x2 -0.03864649 -0.12205694 -0.99177041
x3 -0.06130098 -0.99035289  0.12427121
funcao<-rsm(y~ FO(x1,x2,x3)+PQ(x1,x2),data = DOE)
summary(funcao)
Near-stationary-ridge situation detected -- stationary point altered
 Change 'threshold' if this is not what you intend

Call:
rsm(formula = y ~ FO(x1, x2, x3) + PQ(x1, x2), data = DOE)

            Estimate Std. Error t value  Pr(>|t|)    
(Intercept)  2.47615    0.23702 10.4472 2.483e-06 ***
x1           0.33875    0.17444  1.9419 0.0840478 .  
x2           0.21500    0.17444  1.2325 0.2489804    
x3           0.54125    0.17444  3.1028 0.0126652 *  
x1^2         1.64923    0.25601  6.4421 0.0001192 ***
x2^2        -0.54327    0.25601 -2.1221 0.0628241 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Multiple R-squared:  0.8752,    Adjusted R-squared:  0.8059 
F-statistic: 12.62 on 5 and 9 DF,  p-value: 0.0007543

Analysis of Variance Table

Response: y
               Df  Sum Sq Mean Sq F value    Pr(>F)
FO(x1, x2, x3)  3  3.6314  1.2105  4.9725 0.0264474
PQ(x1, x2)      2 11.7342  5.8671 24.1016 0.0002431
Residuals       9  2.1909  0.2434                  
Lack of fit     7  1.8843  0.2692  1.7559 0.4100087
Pure error      2  0.3066  0.1533                  

Stationary point of response surface:
        x1         x2         x3 
-0.1026994  0.1978761  0.0000000 

Stationary point in original units:
           A            T         Carb 
  -0.1026994 1019.7876106   20.0000000 

Eigenanalysis:
eigen() decomposition
$values
[1]  1.6492308  0.0000000 -0.5432692

$vectors
   [,1] [,2] [,3]
x1    1    0    0
x2    0    0    1
x3    0    1    0
persp(funcao,~x1+x2,col = rainbow(280),
      contours = "colors", zlab = "Rendimento")

persp(funcao,~x1+x3,col = rainbow(280),
      contours = "colors", zlab = "Rendimento")

persp(funcao,~x2+x3,col = rainbow(280),
      contours = "colors", zlab = "Rendimento")


residualPlot(funcao)

hist(funcao$residuals)

curve(dnorm(x,mean(funcao$residuals),sd(funcao$residuals)),
      from = min(funcao$residuals),to=max(funcao$residuals),
      xlab = "Observações", ylab = "Densidade",lwd=4,col="turquoise")
lines(density(funcao$residuals),col="red",lwd=3)
legend("topright",  legend = c("Real","Estimada"),
       col = c("turquoise","red"),lwd=2)

shapiro.test(funcao$residuals)

    Shapiro-Wilk normality test

data:  funcao$residuals
W = 0.92752, p-value = 0.2505
bptest(funcao)

    studentized Breusch-Pagan test

data:  funcao
BP = 9.7392, df = 5, p-value = 0.08297
dwtest(funcao)

    Durbin-Watson test

data:  funcao
DW = 2.0706, p-value = 0.4292
alternative hypothesis: true autocorrelation is greater than 0
dwt(funcao)
Near-stationary-ridge situation detected -- stationary point altered
 Change 'threshold' if this is not what you intend
 lag Autocorrelation D-W Statistic p-value
   1        -0.12841      2.070564   0.842
 Alternative hypothesis: rho != 0
bgtest(funcao,order = 1)

    Breusch-Godfrey test for serial correlation of order up to
    1

data:  funcao
LM test = 0.39314, df = 1, p-value = 0.5307
funcao2<-lm((y2)~ -1+ SO(x1,x2,x3),data = DOE)
summary(funcao2)

Call:
lm.default(formula = (y2) ~ -1 + SO(x1, x2, x3), data = DOE)

Residuals:
    Min      1Q  Median      3Q     Max 
-20.651  -2.494   1.907  18.157  57.330 

Coefficients:
                    Estimate Std. Error t value Pr(>|t|)    
SO(x1, x2, x3)x1       95.98      11.72   8.189 0.000179 ***
SO(x1, x2, x3)x2      -61.83      11.72  -5.275 0.001875 ** 
SO(x1, x2, x3)x3      171.27      11.72  14.612 6.45e-06 ***
SO(x1, x2, x3)x1:x2   -51.23      16.58  -3.090 0.021378 *  
SO(x1, x2, x3)x1:x3    86.65      16.58   5.227 0.001962 ** 
SO(x1, x2, x3)x2:x3   -70.64      16.58  -4.262 0.005311 ** 
SO(x1, x2, x3)x1^2     66.04      14.36   4.601 0.003690 ** 
SO(x1, x2, x3)x2^2     43.83      14.36   3.053 0.022424 *  
SO(x1, x2, x3)x3^2    121.53      14.36   8.466 0.000148 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 33.15 on 6 degrees of freedom
Multiple R-squared:  0.9906,    Adjusted R-squared:  0.9766 
F-statistic: 70.55 on 9 and 6 DF,  p-value: 2.146e-05
persp(funcao2,~x1+x2,col = rainbow(280),
      contours = "colors", zlab = "Super.Espec")

persp(funcao2,~x1+x3,col = rainbow(280),
      contours = "colors", zlab = "Super.Espec")

persp(funcao2,~x2+x3,col = rainbow(280),
      contours = "colors", zlab = "Super.Espec")



#===================== Resíduos ================================================
residualPlot(funcao2)

hist(funcao2$residuals)

curve(dnorm(x,mean(funcao2$residuals),sd(funcao2$residuals)),
      from = min(funcao2$residuals),to=max(funcao2$residuals),
      xlab = "Observações", ylab = "Densidade",lwd=4,col="turquoise")
lines(density(funcao2$residuals),col="red",lwd=3)
legend("topright",  legend = c("Real","Estimada"),
       col = c("turquoise","red"),lwd=2)

shapiro.test(funcao$residuals)

    Shapiro-Wilk normality test

data:  funcao$residuals
W = 0.92752, p-value = 0.2505
bptest(funcao)

    studentized Breusch-Pagan test

data:  funcao
BP = 9.7392, df = 5, p-value = 0.08297
dwtest(funcao)

    Durbin-Watson test

data:  funcao
DW = 2.0706, p-value = 0.4292
alternative hypothesis: true autocorrelation is greater than 0
dwt(funcao)
Near-stationary-ridge situation detected -- stationary point altered
 Change 'threshold' if this is not what you intend
 lag Autocorrelation D-W Statistic p-value
   1        -0.12841      2.070564   0.834
 Alternative hypothesis: rho != 0
bgtest(funcao,order = 1)

    Breusch-Godfrey test for serial correlation of order up to
    1

data:  funcao
LM test = 0.39314, df = 1, p-value = 0.5307
#================== Otimização =================================================

obj=function(x){a<- predict(funcao,newdata = data.frame(x1=x[1],
                                                      x2=x[2],
                                                      x3=x[3]))
  return(-a)}

obj2=function(x){a<- predict(funcao2,newdata = data.frame(x1=x[1],
                                                        x2=x[2],
                                                        x3=x[3]))
return(-a)}

constraint <- function(x) {
  return(as.integer(x) - x[1])} # Defini que x1 deve ser inteiro

x0<-c(0,0,0)
ANE<- optim(par = x0,fn =obj,lower = -1,upper = 1,
      method = c("L-BFGS-B"))
ANE
$par
[1] 1.0000000 0.1978761 1.0000000

$value
[1] -5.026656

$counts
function gradient 
       5        5 

$convergence
[1] 0

$message
[1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
ANE2<- optim(par = x0,fn =obj2,lower = -1,upper = 1,
            method = c("L-BFGS-B"))
ANE2
$par
[1]  1 -1  1

$value
[1] -769.0062

$counts
function gradient 
       2        2 

$convergence
[1] 0

$message
[1] "CONVERGENCE: NORM OF PROJECTED GRADIENT <= PGTOL"
ANE<- nloptr(x0,eval_f =  obj2,lb=c(-1,-1,-1),ub=c(1,1,1),
             eval_g_ineq = constraint, 
       opts = list("algorithm"="NLOPT_LN_COBYLA",
                   "xtol_rel"=1.0e-8))



ANE

Call:

nloptr(x0 = x0, eval_f = obj2, lb = c(-1, -1, -1), ub = c(1, 
    1, 1), eval_g_ineq = constraint, opts = list(algorithm = "NLOPT_LN_COBYLA", 
    xtol_rel = 1e-08))


Minimization using NLopt version 2.7.1 

NLopt solver status: 4 ( NLOPT_XTOL_REACHED: Optimization stopped 
because xtol_rel or xtol_abs (above) was reached. )

Number of Iterations....: 85 
Termination conditions:  xtol_rel: 1e-08 
Number of inequality constraints:  3 
Number of equality constraints:    0 
Optimal value of objective function:  -769.00625 
Optimal value of controls: 1 -1 1
cat("Valor ótimo de x:", ANE$solution, "\n")
Valor ótimo de x: 1 -1 1 
cat("Valor ótimo da função objetivo:", ANE$objective, "\n")
Valor ótimo da função objetivo: -769.0062 
#================== Desirability ===============================================

obj=function(x){a<- predict(funcao, newdata = data.frame(x1=x[1],
                                                         x2=x[2],
                                                         x3=x[3]))
if(a < 4 ){
  return(0)}

if(a > 5){
  return(1)}

if(a<= 5 && a>= 4){
  return((a-4)/(5-4))}
return(-a)}

obj2=function(x){b<- predict(funcao2, newdata = data.frame(x1=x[1],
                                                           x2=x[2],
                                                           x3=x[3]))
if(b < 500 ){
  return(0)}

if(b > 580){
  return(1)}

if(b<=580 && b>= 500){
  return((b-500)/(580-500))}
return(-b)}


#cons_eq= function(x){g<- x[1]+x[2]+x[3] -1
#return(list(ceq=g, c=NULL))


#}
x0<-x0<-c(0,0,0) # ponto de partida
#Desirability function

d = function(x){
  
  -(obj(x)^0.5*obj2(x)^0.5)
}

d
function(x){
  
  -(obj(x)^0.5*obj2(x)^0.5)
}
constraint <- function(x) {
  return(as.integer(x) - x[1])}


x0<-c(1,    -0.228600183,   1)

optim(par = x0,fn=d,lower = -1,upper = 1,
      method = c("L-BFGS-B"))
$par
[1]  1.0000000 -0.2001506  1.0000000

$value
[1] -0.9698395

$counts
function gradient 
      61       61 

$convergence
[1] 52

$message
[1] "ERROR: ABNORMAL_TERMINATION_IN_LNSRCH"
nloptr(x0,eval_f =d,lb=c(-1,-1,-1),ub=c(1,1,1),
       eval_g_ineq = constraint, 
       opts = list("algorithm"="NLOPT_LN_COBYLA",
                   xtol_rel=1.0e-8))

Call:

nloptr(x0 = x0, eval_f = d, lb = c(-1, -1, -1), ub = c(1, 1, 
    1), eval_g_ineq = constraint, opts = list(algorithm = "NLOPT_LN_COBYLA", 
    xtol_rel = 1e-08))


Minimization using NLopt version 2.7.1 

NLopt solver status: 5 ( NLOPT_MAXEVAL_REACHED: Optimization 
stopped because maxeval (above) was reached. )

Number of Iterations....: 100 
Termination conditions:  xtol_rel: 1e-08 
Number of inequality constraints:  3 
Number of equality constraints:    0 
Current value of objective function:  -0.969841241490465 
Current value of controls: 1 -0.2001425 0.9999997
# "algorithm"="NLOPT_LN_COBYLA"

#============== Intervalo de Confiança da Predição =============================
predict(funcao, newdata = data.frame(x1=1,x2=-0.200182988225692,x3=1),
        se.fit = T,interval = "pred")
$fit
       fit      lwr      upr
1 4.940575 3.602641 6.278508

$se.fit
[1] 0.3261448

$df
[1] 9

$residual.scale
[1] 0.493389
predict(funcao2, newdata = data.frame(x1=1,x2=-0.200182988225692,x3=1),
        se.fit = T,interval = "pred")
$fit
       fit     lwr     upr
1 580.0085 472.224 687.793

$se.fit
[1] 29.00341

$df
[1] 6

$residual.scale
[1] 33.15318
LS0tDQp0aXRsZTogIlIgUlNNX0RPRV9BTkVJUlNPTiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQpgYGB7cn0NCmxpYnJhcnkocnNtKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoRnJGMikNCmxpYnJhcnkobm9ydGVzdCkNCmxpYnJhcnkoUk9JKQ0KbGlicmFyeShubG9wdHIpDQpsaWJyYXJ5KHJpbykNCg0KDQpET0U8LWJiZChrPX4geDEreDIreDMsDQogICAgICAgICAgICAgcmFuZG9taXplID0gRiwNCiAgICAgICAgICAgICBibG9jayA9IEYsDQogICAgICAgICAgICAgbjA9MywNCiAgICAgICAgIGNvZGluZyA9IGxpc3QoeDF+KEEtMCkvMSwNCiAgICAgICAgICAgICAgICAgICAgICAgeDJ+KFQtMTAwMCkvMTAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgeDN+KENhcmItMjApLzEwKSkNCkRPRSR5PC1jKDIuNDksMy40Niw0LjA4LDQuNDAsMi44NywNCiAgICAgICAgIDMuOTksNC42Miw0LjkyLDEuODMsMS4xNiwNCiAgICAgICAgIDIuMzksMi4yNSwyLjA3LDIuNjQsMi44MikNCkRPRSR5MjwtYyg2LjkyLDMxNyw1LjIwLDExMC4zNywzLjg5LA0KICAgICAgICAgIDYuODksMTk0Ljk2LDU0NC41Niw1LjkyLDQuMDgsDQogICAgICAgICAgNDY3LjkzLDE4My41MSw3LjQ4LDU3LjMzLDMyLjQwNTApDQpET0UNCmZ1bmNhbzwtcnNtKHl+IFNPKHgxLHgyLHgzKSxkYXRhID0gRE9FKQ0Kc3VtbWFyeShmdW5jYW8pDQpmdW5jYW88LXJzbSh5fiBGTyh4MSx4Mix4MykrUFEoeDEseDIpLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbykNCnBlcnNwKGZ1bmNhbyx+eDEreDIsY29sID0gcmFpbmJvdygyODApLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIiwgemxhYiA9ICJSZW5kaW1lbnRvIikNCnBlcnNwKGZ1bmNhbyx+eDEreDMsY29sID0gcmFpbmJvdygyODApLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIiwgemxhYiA9ICJSZW5kaW1lbnRvIikNCnBlcnNwKGZ1bmNhbyx+eDIreDMsY29sID0gcmFpbmJvdygyODApLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIiwgemxhYiA9ICJSZW5kaW1lbnRvIikNCg0KcmVzaWR1YWxQbG90KGZ1bmNhbykNCmhpc3QoZnVuY2FvJHJlc2lkdWFscykNCmN1cnZlKGRub3JtKHgsbWVhbihmdW5jYW8kcmVzaWR1YWxzKSxzZChmdW5jYW8kcmVzaWR1YWxzKSksDQogICAgICBmcm9tID0gbWluKGZ1bmNhbyRyZXNpZHVhbHMpLHRvPW1heChmdW5jYW8kcmVzaWR1YWxzKSwNCiAgICAgIHhsYWIgPSAiT2JzZXJ2YcOnw7VlcyIsIHlsYWIgPSAiRGVuc2lkYWRlIixsd2Q9NCxjb2w9InR1cnF1b2lzZSIpDQpsaW5lcyhkZW5zaXR5KGZ1bmNhbyRyZXNpZHVhbHMpLGNvbD0icmVkIixsd2Q9MykNCmxlZ2VuZCgidG9wcmlnaHQiLCAgbGVnZW5kID0gYygiUmVhbCIsIkVzdGltYWRhIiksDQogICAgICAgY29sID0gYygidHVycXVvaXNlIiwicmVkIiksbHdkPTIpDQpzaGFwaXJvLnRlc3QoZnVuY2FvJHJlc2lkdWFscykNCmJwdGVzdChmdW5jYW8pDQpkd3Rlc3QoZnVuY2FvKQ0KZHd0KGZ1bmNhbykNCmJndGVzdChmdW5jYW8sb3JkZXIgPSAxKQ0KDQpmdW5jYW8yPC1sbSgoeTIpfiAtMSsgU08oeDEseDIseDMpLGRhdGEgPSBET0UpDQpzdW1tYXJ5KGZ1bmNhbzIpDQoNCnBlcnNwKGZ1bmNhbzIsfngxK3gyLGNvbCA9IHJhaW5ib3coMjgwKSwNCiAgICAgIGNvbnRvdXJzID0gImNvbG9ycyIsIHpsYWIgPSAiU3VwZXIuRXNwZWMiKQ0KcGVyc3AoZnVuY2FvMix+eDEreDMsY29sID0gcmFpbmJvdygyODApLA0KICAgICAgY29udG91cnMgPSAiY29sb3JzIiwgemxhYiA9ICJTdXBlci5Fc3BlYyIpDQpwZXJzcChmdW5jYW8yLH54Mit4Myxjb2wgPSByYWluYm93KDI4MCksDQogICAgICBjb250b3VycyA9ICJjb2xvcnMiLCB6bGFiID0gIlN1cGVyLkVzcGVjIikNCg0KDQojPT09PT09PT09PT09PT09PT09PT09IFJlc8OtZHVvcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCnJlc2lkdWFsUGxvdChmdW5jYW8yKQ0KaGlzdChmdW5jYW8yJHJlc2lkdWFscykNCmN1cnZlKGRub3JtKHgsbWVhbihmdW5jYW8yJHJlc2lkdWFscyksc2QoZnVuY2FvMiRyZXNpZHVhbHMpKSwNCiAgICAgIGZyb20gPSBtaW4oZnVuY2FvMiRyZXNpZHVhbHMpLHRvPW1heChmdW5jYW8yJHJlc2lkdWFscyksDQogICAgICB4bGFiID0gIk9ic2VydmHDp8O1ZXMiLCB5bGFiID0gIkRlbnNpZGFkZSIsbHdkPTQsY29sPSJ0dXJxdW9pc2UiKQ0KbGluZXMoZGVuc2l0eShmdW5jYW8yJHJlc2lkdWFscyksY29sPSJyZWQiLGx3ZD0zKQ0KbGVnZW5kKCJ0b3ByaWdodCIsICBsZWdlbmQgPSBjKCJSZWFsIiwiRXN0aW1hZGEiKSwNCiAgICAgICBjb2wgPSBjKCJ0dXJxdW9pc2UiLCJyZWQiKSxsd2Q9MikNCnNoYXBpcm8udGVzdChmdW5jYW8kcmVzaWR1YWxzKQ0KYnB0ZXN0KGZ1bmNhbykNCmR3dGVzdChmdW5jYW8pDQpkd3QoZnVuY2FvKQ0KYmd0ZXN0KGZ1bmNhbyxvcmRlciA9IDEpDQojPT09PT09PT09PT09PT09PT09IE90aW1pemHDp8OjbyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQoNCm9iaj1mdW5jdGlvbih4KXthPC0gcHJlZGljdChmdW5jYW8sbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9eFsxXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyPXhbMl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mz14WzNdKSkNCiAgcmV0dXJuKC1hKX0NCg0Kb2JqMj1mdW5jdGlvbih4KXthPC0gcHJlZGljdChmdW5jYW8yLG5ld2RhdGEgPSBkYXRhLmZyYW1lKHgxPXhbMV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyPXhbMl0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzPXhbM10pKQ0KcmV0dXJuKC1hKX0NCg0KY29uc3RyYWludCA8LSBmdW5jdGlvbih4KSB7DQogIHJldHVybihhcy5pbnRlZ2VyKHgpIC0geFsxXSl9ICMgRGVmaW5pIHF1ZSB4MSBkZXZlIHNlciBpbnRlaXJvDQoNCngwPC1jKDAsMCwwKQ0KQU5FPC0gb3B0aW0ocGFyID0geDAsZm4gPW9iaixsb3dlciA9IC0xLHVwcGVyID0gMSwNCiAgICAgIG1ldGhvZCA9IGMoIkwtQkZHUy1CIikpDQpBTkUNCg0KQU5FMjwtIG9wdGltKHBhciA9IHgwLGZuID1vYmoyLGxvd2VyID0gLTEsdXBwZXIgPSAxLA0KICAgICAgICAgICAgbWV0aG9kID0gYygiTC1CRkdTLUIiKSkNCkFORTINCg0KDQpBTkU8LSBubG9wdHIoeDAsZXZhbF9mID0gIG9iajIsbGI9YygtMSwtMSwtMSksdWI9YygxLDEsMSksDQogICAgICAgICAgICAgZXZhbF9nX2luZXEgPSBjb25zdHJhaW50LCANCiAgICAgICBvcHRzID0gbGlzdCgiYWxnb3JpdGhtIj0iTkxPUFRfTE5fQ09CWUxBIiwNCiAgICAgICAgICAgICAgICAgICAieHRvbF9yZWwiPTEuMGUtOCkpDQoNCg0KDQpBTkUNCg0KY2F0KCJWYWxvciDDs3RpbW8gZGUgeDoiLCBBTkUkc29sdXRpb24sICJcbiIpDQpjYXQoIlZhbG9yIMOzdGltbyBkYSBmdW7Dp8OjbyBvYmpldGl2bzoiLCBBTkUkb2JqZWN0aXZlLCAiXG4iKQ0KDQojPT09PT09PT09PT09PT09PT09IERlc2lyYWJpbGl0eSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KDQpvYmo9ZnVuY3Rpb24oeCl7YTwtIHByZWRpY3QoZnVuY2FvLCBuZXdkYXRhID0gZGF0YS5mcmFtZSh4MT14WzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDI9eFsyXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzPXhbM10pKQ0KaWYoYSA8IDQgKXsNCiAgcmV0dXJuKDApfQ0KDQppZihhID4gNSl7DQogIHJldHVybigxKX0NCg0KaWYoYTw9IDUgJiYgYT49IDQpew0KICByZXR1cm4oKGEtNCkvKDUtNCkpfQ0KcmV0dXJuKC1hKX0NCg0Kb2JqMj1mdW5jdGlvbih4KXtiPC0gcHJlZGljdChmdW5jYW8yLCBuZXdkYXRhID0gZGF0YS5mcmFtZSh4MT14WzFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mj14WzJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4Mz14WzNdKSkNCmlmKGIgPCA1MDAgKXsNCiAgcmV0dXJuKDApfQ0KDQppZihiID4gNTgwKXsNCiAgcmV0dXJuKDEpfQ0KDQppZihiPD01ODAgJiYgYj49IDUwMCl7DQogIHJldHVybigoYi01MDApLyg1ODAtNTAwKSl9DQpyZXR1cm4oLWIpfQ0KDQoNCiNjb25zX2VxPSBmdW5jdGlvbih4KXtnPC0geFsxXSt4WzJdK3hbM10gLTENCiNyZXR1cm4obGlzdChjZXE9ZywgYz1OVUxMKSkNCg0KDQojfQ0KeDA8LXgwPC1jKDAsMCwwKSAjIHBvbnRvIGRlIHBhcnRpZGENCiNEZXNpcmFiaWxpdHkgZnVuY3Rpb24NCg0KZCA9IGZ1bmN0aW9uKHgpew0KICANCiAgLShvYmooeCleMC41Km9iajIoeCleMC41KQ0KfQ0KDQpkDQpjb25zdHJhaW50IDwtIGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuKGFzLmludGVnZXIoeCkgLSB4WzFdKX0NCg0KDQp4MDwtYygxLAktMC4yMjg2MDAxODMsCTEpDQoNCm9wdGltKHBhciA9IHgwLGZuPWQsbG93ZXIgPSAtMSx1cHBlciA9IDEsDQogICAgICBtZXRob2QgPSBjKCJMLUJGR1MtQiIpKQ0KDQoNCm5sb3B0cih4MCxldmFsX2YgPWQsbGI9YygtMSwtMSwtMSksdWI9YygxLDEsMSksDQogICAgICAgZXZhbF9nX2luZXEgPSBjb25zdHJhaW50LCANCiAgICAgICBvcHRzID0gbGlzdCgiYWxnb3JpdGhtIj0iTkxPUFRfTE5fQ09CWUxBIiwNCiAgICAgICAgICAgICAgICAgICB4dG9sX3JlbD0xLjBlLTgpKQ0KDQojICJhbGdvcml0aG0iPSJOTE9QVF9MTl9DT0JZTEEiDQoNCiM9PT09PT09PT09PT09PSBJbnRlcnZhbG8gZGUgQ29uZmlhbsOnYSBkYSBQcmVkacOnw6NvID09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQpwcmVkaWN0KGZ1bmNhbywgbmV3ZGF0YSA9IGRhdGEuZnJhbWUoeDE9MSx4Mj0tMC4yMDAxODI5ODgyMjU2OTIseDM9MSksDQogICAgICAgIHNlLmZpdCA9IFQsaW50ZXJ2YWwgPSAicHJlZCIpDQpwcmVkaWN0KGZ1bmNhbzIsIG5ld2RhdGEgPSBkYXRhLmZyYW1lKHgxPTEseDI9LTAuMjAwMTgyOTg4MjI1NjkyLHgzPTEpLA0KICAgICAgICBzZS5maXQgPSBULGludGVydmFsID0gInByZWQiKQ0KDQpgYGANCg0KDQoNCg==