library(tidyverse)
library(dplyr)
library(agricolae)
library(psych)
## Importação e limpeza dos dados
df = read.csv("Dataset.csv", stringsAsFactors = FALSE)


################### Filtering treatments ###################
target <- c("T1R1", "T1R2", "T1R3", "T1R4", "T4R1", "T4R2", "T4R3", "T4R4",
            "T5R1", "T5R2", "T5R3", "T5R4", "T6R1", "T6R2", "T6R3", "T6R4",
            "T11R1", "T11R2", "T11R3", "T11R4", 
            "T12R1", "T12R2", "T12R3", "T12R4")
df <- df %>%
    filter(TRATAMENTO %in% target)
#### Função para renomear os tratamentos
###################################################################################
my_fun <- function(x) { 
  x %>%       
    mutate(TRATAMENTO = case_when(TRATAMENTO == 'T1R1' ~'T1',
                                  TRATAMENTO == 'T1R2' ~'T1',
                                  TRATAMENTO == 'T1R3' ~'T1',
                                  TRATAMENTO == 'T1R4' ~'T1',
                                  TRATAMENTO == 'T2R1' ~'T2',
                                  TRATAMENTO == 'T2R2' ~'T2',
                                  TRATAMENTO == 'T2R3' ~'T2',
                                  TRATAMENTO == 'T2R4' ~'T2',
                                  TRATAMENTO == 'T3R1' ~'T3',
                                  TRATAMENTO == 'T3R2' ~'T3',
                                  TRATAMENTO == 'T3R3' ~'T3',
                                  TRATAMENTO == 'T3R4' ~'T3',
                                  TRATAMENTO == 'T4R1' ~'T4',
                                  TRATAMENTO == 'T4R2' ~'T4',
                                  TRATAMENTO == 'T4R3' ~'T4',
                                  TRATAMENTO == 'T4R4' ~'T4',
                                  TRATAMENTO == 'T5R1' ~'T5',
                                  TRATAMENTO == 'T5R2' ~'T5',
                                  TRATAMENTO == 'T5R3' ~'T5',
                                  TRATAMENTO == 'T5R4' ~'T5',
                                  TRATAMENTO == 'T6R1' ~'T6',
                                  TRATAMENTO == 'T6R2' ~'T6',
                                  TRATAMENTO == 'T6R3' ~'T6',
                                  TRATAMENTO == 'T6R4' ~'T6',
                                  TRATAMENTO == 'T7R1' ~'T7',
                                  TRATAMENTO == 'T7R2' ~'T7',
                                  TRATAMENTO == 'T7R3' ~'T7',
                                  TRATAMENTO == 'T7R4' ~'T7',
                                  TRATAMENTO == 'T8R1' ~'T8',
                                  TRATAMENTO == 'T8R2' ~'T8',
                                  TRATAMENTO == 'T8R3' ~'T8',
                                  TRATAMENTO == 'T8R4' ~'T8',
                                  TRATAMENTO == 'T9R1' ~'T9',
                                  TRATAMENTO == 'T9R2' ~'T9',
                                  TRATAMENTO == 'T9R3' ~'T9',
                                  TRATAMENTO == 'T9R4' ~'T9',
                                  TRATAMENTO == 'T10R1' ~'T10',
                                  TRATAMENTO == 'T10R2' ~'T10',
                                  TRATAMENTO == 'T10R3' ~'T10',
                                  TRATAMENTO == 'T10R4' ~'T10',
                                  TRATAMENTO == 'T11R1' ~'T11',
                                  TRATAMENTO == 'T11R2' ~'T11',
                                  TRATAMENTO == 'T11R3' ~'T11',
                                  TRATAMENTO == 'T11R4' ~'T11',
                                  TRATAMENTO == 'T12R1' ~'T12',
                                  TRATAMENTO == 'T12R2' ~'T12',
                                  TRATAMENTO == 'T12R3' ~'T12',
                                  TRATAMENTO == 'T12R4' ~'T12'))
}
### Separa as bases por doenças e remove outliers
D1 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(DIPLOCARPON.In = ifelse((abs(DIPLOCARPON.In - median(DIPLOCARPON.In)) > 2*sd(DIPLOCARPON.In)), mean(DIPLOCARPON.In), DIPLOCARPON.In)) %>%
  select(SEMANA, TRATAMENTO, DIPLOCARPON.In) 

D2 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(DIPLOCARPON.Sev = ifelse((abs(DIPLOCARPON.Sev - median(DIPLOCARPON.Sev)) > 2*sd(DIPLOCARPON.Sev)), mean(DIPLOCARPON.Sev), DIPLOCARPON.Sev)) %>%
  select(SEMANA, TRATAMENTO, DIPLOCARPON.Sev) 

D3 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(MICOSFAERELA.In = ifelse(!(abs(MICOSFAERELA.In - median(MICOSFAERELA.In)) > 2*sd(MICOSFAERELA.In)), mean(MICOSFAERELA.In), MICOSFAERELA.In)) %>%
  select(SEMANA, TRATAMENTO, MICOSFAERELA.In) 

D4 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(MICOSFAERELA.Sev = ifelse((abs(MICOSFAERELA.Sev - median(MICOSFAERELA.Sev)) > 2*sd(MICOSFAERELA.Sev)), mean(MICOSFAERELA.Sev), MICOSFAERELA.Sev)) %>%
  select(SEMANA, TRATAMENTO, MICOSFAERELA.Sev) 

D5 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(ANTRACNOSE.In = ifelse((abs(ANTRACNOSE.In - median(ANTRACNOSE.In)) > 2*sd(ANTRACNOSE.In)), mean(ANTRACNOSE.In), ANTRACNOSE.In)) %>%
  select(SEMANA, TRATAMENTO, ANTRACNOSE.In) 

D6 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(ANTRACNOSE.Sev = ifelse(!(abs(ANTRACNOSE.Sev - median(ANTRACNOSE.Sev)) > 2*sd(ANTRACNOSE.Sev)), mean(ANTRACNOSE.Sev), ANTRACNOSE.Sev)) %>%
  select(SEMANA, TRATAMENTO, ANTRACNOSE.Sev) 

D7 = df %>%
  group_by(TRATAMENTO) %>%
  mutate(BOTRYTIS.Inf = ifelse(!(abs(BOTRYTIS.Inf - median(BOTRYTIS.Inf)) > 2*sd(BOTRYTIS.Inf)), mean(BOTRYTIS.Inf), BOTRYTIS.Inf)) %>%
  select(SEMANA, TRATAMENTO, BOTRYTIS.Inf) 
### Renomeia os tratamentos
D1 <- my_fun(D1)
D2 <- my_fun(D2)
D3 <- my_fun(D3)
D4 <- my_fun(D4)
D5 <- my_fun(D5)
D6 <- my_fun(D6)
D7 <- my_fun(D7)
#################################################################
####################### DIPLOCARPON.In ##########################
#################################################################

### Plot Boxplot disease
D1 %>% 
  ggplot(aes(TRATAMENTO, DIPLOCARPON.In)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

###################################################
kruskal.test(DIPLOCARPON.In~TRATAMENTO,D1)

    Kruskal-Wallis rank sum test

data:  DIPLOCARPON.In by TRATAMENTO
Kruskal-Wallis chi-squared = 14.041, df = 5, p-value = 0.01535
pairwise.wilcox.test(D1$DIPLOCARPON.In, D1$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D1$DIPLOCARPON.In and D1$TRATAMENTO 

    T1    T11   T12   T4    T5   
T11 0.354 -     -     -     -    
T12 0.049 1.000 -     -     -    
T4  1.000 1.000 0.428 -     -    
T5  0.039 1.000 1.000 0.400 -    
T6  0.684 1.000 1.000 1.000 1.000

P value adjustment method: holm 
##################################################
################ SUMMARY
saida <- describeBy(D1 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média    DesvP
T1  5.6725 4.636974
T11 3.3250 3.257162
T12 2.7000 2.823346
T4  4.2325 3.501383
T5  2.5050 2.153465
T6  3.8300 3.827646
#################################################################
####################### DIPLOCARPON.Sev ##########################
#################################################################

### Plot Boxplot disease
D2 %>% 
  ggplot(aes(TRATAMENTO, DIPLOCARPON.Sev)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

ANOVA<-aov(DIPLOCARPON.Sev~TRATAMENTO,D2)
res <- ANOVA$residuals
shapiro.test(res)

    Shapiro-Wilk normality test

data:  res
W = 0.81426, p-value = 3.158e-16
summary(ANOVA)
             Df Sum Sq Mean Sq F value Pr(>F)
TRATAMENTO    5   1.24  0.2485    0.92  0.468
Residuals   234  63.20  0.2701               
TukeyHSD(ANOVA)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = DIPLOCARPON.Sev ~ TRATAMENTO, data = D2)

$TRATAMENTO
           diff        lwr       upr     p adj
T11-T1   0.0725 -0.2614094 0.4064094 0.9891805
T12-T1   0.0350 -0.2989094 0.3689094 0.9996650
T4-T1   -0.0425 -0.3764094 0.2914094 0.9991367
T5-T1   -0.0625 -0.3964094 0.2714094 0.9945560
T6-T1   -0.1500 -0.4839094 0.1839094 0.7898663
T12-T11 -0.0375 -0.3714094 0.2964094 0.9995305
T4-T11  -0.1150 -0.4489094 0.2189094 0.9209167
T5-T11  -0.1350 -0.4689094 0.1989094 0.8544640
T6-T11  -0.2225 -0.5564094 0.1114094 0.3957297
T4-T12  -0.0775 -0.4114094 0.2564094 0.9853522
T5-T12  -0.0975 -0.4314094 0.2364094 0.9598962
T6-T12  -0.1850 -0.5189094 0.1489094 0.6046418
T5-T4   -0.0200 -0.3539094 0.3139094 0.9999789
T6-T4   -0.1075 -0.4414094 0.2264094 0.9397452
T6-T5   -0.0875 -0.4214094 0.2464094 0.9748612
################ SUMMARY
saida <- describeBy(D2 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média     DesvP
T1  0.8775 0.4054042
T11 0.9500 0.6774765
T12 0.9125 0.5979398
T4  0.8350 0.3641287
T5  0.8150 0.5484477
T6  0.7275 0.4540346
#################################################################
####################### MICOSFAERELA.In ##########################
#################################################################
### Plot Boxplot disease
D3 %>% 
  ggplot(aes(TRATAMENTO, MICOSFAERELA.In)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

kruskal.test(MICOSFAERELA.In~TRATAMENTO,D3)

    Kruskal-Wallis rank sum test

data:  MICOSFAERELA.In by TRATAMENTO
Kruskal-Wallis chi-squared = 54.403, df = 5, p-value = 1.732e-10
pairwise.wilcox.test(D3$MICOSFAERELA.In, D3$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D3$MICOSFAERELA.In and D3$TRATAMENTO 

    T1      T11     T12    T4     T5    
T11 0.0080  -       -      -      -     
T12 1.0000  0.2311  -      -      -     
T4  0.0011  1.3e-07 0.0014 -      -     
T5  4.2e-05 1.1e-05 0.0187 1.0000 -     
T6  0.0232  5.7e-05 0.1694 1.0000 1.0000

P value adjustment method: holm 
saida <- describeBy(D3 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média     DesvP
T1  0.9075 0.5050451
T11 1.6050 1.8886910
T12 1.1575 1.0928409
T4  0.5400 0.8414883
T5  0.5325 0.7630531
T6  0.6300 0.7759857
#################################################################
####################### MICOSFAERELA.Sev ##########################
#################################################################
### Plot Boxplot disease
D4 %>% 
  ggplot(aes(TRATAMENTO, MICOSFAERELA.Sev)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

kruskal.test(MICOSFAERELA.Sev~TRATAMENTO,D4)

    Kruskal-Wallis rank sum test

data:  MICOSFAERELA.Sev by TRATAMENTO
Kruskal-Wallis chi-squared = 28.231, df = 5, p-value = 3.28e-05
pairwise.wilcox.test(D4$MICOSFAERELA.Sev, D4$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D4$MICOSFAERELA.Sev and D4$TRATAMENTO 

    T1     T11    T12    T4     T5    
T11 1.0000 -      -      -      -     
T12 1.0000 0.6616 -      -      -     
T4  0.0140 0.0079 0.2617 -      -     
T5  0.0077 0.0051 0.1908 1.0000 -     
T6  0.0397 0.0239 0.6416 1.0000 1.0000

P value adjustment method: holm 
saida <- describeBy(D4 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média     DesvP
T1  0.4725 0.5392243
T11 0.6325 0.7353309
T12 0.3525 0.5218250
T4  0.1225 0.3100765
T5  0.0850 0.2348486
T6  0.1400 0.3326660
#################################################################
####################### ANTRACNOSE.In ##########################
#################################################################
### Plot Boxplot disease
D5 %>% 
  ggplot(aes(TRATAMENTO, ANTRACNOSE.In)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

kruskal.test(ANTRACNOSE.In~TRATAMENTO,D5)

    Kruskal-Wallis rank sum test

data:  ANTRACNOSE.In by TRATAMENTO
Kruskal-Wallis chi-squared = 17.353, df = 5, p-value = 0.003877
pairwise.wilcox.test(D5$ANTRACNOSE.In, D5$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D5$ANTRACNOSE.In and D5$TRATAMENTO 

    T1    T11   T12   T4    T5   
T11 0.027 -     -     -     -    
T12 0.050 1.000 -     -     -    
T4  0.024 1.000 1.000 -     -    
T5  0.012 1.000 1.000 1.000 -    
T6  0.017 1.000 1.000 1.000 1.000

P value adjustment method: holm 
saida <- describeBy(D5 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média    DesvP
T1  4.4050 3.143895
T11 2.2850 1.948379
T12 2.4425 1.854155
T4  2.3225 2.336169
T5  2.1100 1.896123
T6  2.1650 1.866788
#################################################################
####################### ANTRACNOSE.Sev ##########################
#################################################################
### Plot Boxplot disease
D6 %>% 
  ggplot(aes(TRATAMENTO, ANTRACNOSE.Sev)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

kruskal.test(ANTRACNOSE.Sev~TRATAMENTO,D6)

    Kruskal-Wallis rank sum test

data:  ANTRACNOSE.Sev by TRATAMENTO
Kruskal-Wallis chi-squared = 27.756, df = 5, p-value = 4.062e-05
pairwise.wilcox.test(D6$ANTRACNOSE.Sev, D6$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D6$ANTRACNOSE.Sev and D6$TRATAMENTO 

    T1      T11    T12    T4     T5    
T11 0.6004  -      -      -      -     
T12 0.0086  1.0000 -      -      -     
T4  1.3e-07 1.0000 1.0000 -      -     
T5  0.0114  1.0000 1.0000 1.0000 -     
T6  1.0e-05 1.0000 1.0000 1.0000 1.0000

P value adjustment method: holm 
saida <- describeBy(D6 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média     DesvP
T1  1.9175 0.6126393
T11 1.4550 0.7214480
T12 1.5525 0.6151871
T4  1.3525 0.3862957
T5  1.4675 0.8483430
T6  1.5100 0.7989737
#################################################################
####################### BOTRYTIS.Inf ##########################
#################################################################
### Plot Boxplot disease
D7 %>% 
  ggplot(aes(TRATAMENTO, BOTRYTIS.Inf)) +
  geom_jitter(size=3, width = .1)+
  geom_boxplot(size=1)

kruskal.test(BOTRYTIS.Inf~TRATAMENTO,D7)

    Kruskal-Wallis rank sum test

data:  BOTRYTIS.Inf by TRATAMENTO
Kruskal-Wallis chi-squared = 35.737, df = 5, p-value = 1.072e-06
pairwise.wilcox.test(D7$BOTRYTIS.Inf, D7$TRATAMENTO)

    Pairwise comparisons using Wilcoxon rank sum test 

data:  D7$BOTRYTIS.Inf and D7$TRATAMENTO 

    T1      T11     T12     T4      T5     
T11 1.00000 -       -       -       -      
T12 1.00000 1.00000 -       -       -      
T4  1.00000 1.00000 1.00000 -       -      
T5  1.00000 0.24717 0.47524 0.71947 -      
T6  0.00231 9.5e-06 0.00161 8.2e-06 0.00038

P value adjustment method: holm 
saida <- describeBy(D7 ~ TRATAMENTO, skew=FALSE,ranges=FALSE,mat=TRUE)
mat <- c(saida[13,5], saida[13,6], saida[14,5], saida[14,6],
         saida[15,5], saida[15,6], saida[16,5], saida[16,6],
         saida[17,5], saida[17,6], saida[18,5], saida[18,6])
rnames <- c(toString(saida[13,2]),toString(saida[14,2]),toString(saida[15,2]),
            toString(saida[16,2]),toString(saida[17,2]),toString(saida[18,2]))
cnames <- c("Média","DesvP")
mat <- matrix(mat,nrow=6, ncol=2,byrow=TRUE,dimnames=list(rnames,cnames))
print("Valores de Média e Desvio Padrão")
[1] "Valores de Média e Desvio Padrão"
print(mat)
     Média     DesvP
T1  1.7275 1.5207939
T11 1.6900 1.4840692
T12 1.4050 0.6898346
T4  1.8650 1.8259595
T5  1.3500 1.1502508
T6  0.9175 1.3157600
LS0tCnRpdGxlOiAiQW7DoWxpc2UgYSBwYXJ0aXIgZG9zIGRhZG9zIGJydXRvcyBkYXMgRG9lbsOnYXMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShkcGx5cikKbGlicmFyeShhZ3JpY29sYWUpCmxpYnJhcnkocHN5Y2gpCmBgYAoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9IAprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpIApgYGAKCmBgYHtyfQojIyBJbXBvcnRhw6fDo28gZSBsaW1wZXphIGRvcyBkYWRvcwpkZiA9IHJlYWQuY3N2KCJEYXRhc2V0LmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKCgojIyMjIyMjIyMjIyMjIyMjIyMjIEZpbHRlcmluZyB0cmVhdG1lbnRzICMjIyMjIyMjIyMjIyMjIyMjIyMKdGFyZ2V0IDwtIGMoIlQxUjEiLCAiVDFSMiIsICJUMVIzIiwgIlQxUjQiLCAiVDRSMSIsICJUNFIyIiwgIlQ0UjMiLCAiVDRSNCIsCiAgICAgICAgICAgICJUNVIxIiwgIlQ1UjIiLCAiVDVSMyIsICJUNVI0IiwgIlQ2UjEiLCAiVDZSMiIsICJUNlIzIiwgIlQ2UjQiLAogICAgICAgICAgICAiVDExUjEiLCAiVDExUjIiLCAiVDExUjMiLCAiVDExUjQiLCAKICAgICAgICAgICAgIlQxMlIxIiwgIlQxMlIyIiwgIlQxMlIzIiwgIlQxMlI0IikKZGYgPC0gZGYgJT4lCiAgICBmaWx0ZXIoVFJBVEFNRU5UTyAlaW4lIHRhcmdldCkKYGBgCgoKYGBge3J9CiMjIyMgRnVuw6fDo28gcGFyYSByZW5vbWVhciBvcyB0cmF0YW1lbnRvcwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpteV9mdW4gPC0gZnVuY3Rpb24oeCkgeyAKICB4ICU+JSAgICAgICAKICAgIG11dGF0ZShUUkFUQU1FTlRPID0gY2FzZV93aGVuKFRSQVRBTUVOVE8gPT0gJ1QxUjEnIH4nVDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDFSMicgfidUMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMVIzJyB+J1QxJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxUjQnIH4nVDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDJSMScgfidUMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMlIyJyB+J1QyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QyUjMnIH4nVDInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDJSNCcgfidUMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUM1IxJyB+J1QzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QzUjInIH4nVDMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDNSMycgfidUMycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUM1I0JyB+J1QzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q0UjEnIH4nVDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDRSMicgfidUNCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNFIzJyB+J1Q0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q0UjQnIH4nVDQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDVSMScgfidUNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNVIyJyB+J1Q1JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q1UjMnIH4nVDUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDVSNCcgfidUNScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNlIxJyB+J1Q2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q2UjInIH4nVDYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDZSMycgfidUNicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUNlI0JyB+J1Q2JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q3UjEnIH4nVDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDdSMicgfidUNycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUN1IzJyB+J1Q3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q3UjQnIH4nVDcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDhSMScgfidUOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOFIyJyB+J1Q4JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q4UjMnIH4nVDgnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDhSNCcgfidUOCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOVIxJyB+J1Q5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1Q5UjInIH4nVDknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDlSMycgfidUOScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUOVI0JyB+J1Q5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMFIxJyB+J1QxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTBSMicgfidUMTAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEwUjMnIH4nVDEwJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMFI0JyB+J1QxMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTFSMScgfidUMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDExUjInIH4nVDExJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMVIzJyB+J1QxMScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTFSNCcgfidUMTEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEyUjEnIH4nVDEyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQVRBTUVOVE8gPT0gJ1QxMlIyJyB+J1QxMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFUQU1FTlRPID09ICdUMTJSMycgfidUMTInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBVEFNRU5UTyA9PSAnVDEyUjQnIH4nVDEyJykpCn0KCmBgYAoKYGBge3J9CiMjIyBTZXBhcmEgYXMgYmFzZXMgcG9yIGRvZW7Dp2FzIGUgcmVtb3ZlIG91dGxpZXJzCkQxID0gZGYgJT4lCiAgZ3JvdXBfYnkoVFJBVEFNRU5UTykgJT4lCiAgbXV0YXRlKERJUExPQ0FSUE9OLkluID0gaWZlbHNlKChhYnMoRElQTE9DQVJQT04uSW4gLSBtZWRpYW4oRElQTE9DQVJQT04uSW4pKSA+IDIqc2QoRElQTE9DQVJQT04uSW4pKSwgbWVhbihESVBMT0NBUlBPTi5JbiksIERJUExPQ0FSUE9OLkluKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgRElQTE9DQVJQT04uSW4pIAoKRDIgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoRElQTE9DQVJQT04uU2V2ID0gaWZlbHNlKChhYnMoRElQTE9DQVJQT04uU2V2IC0gbWVkaWFuKERJUExPQ0FSUE9OLlNldikpID4gMipzZChESVBMT0NBUlBPTi5TZXYpKSwgbWVhbihESVBMT0NBUlBPTi5TZXYpLCBESVBMT0NBUlBPTi5TZXYpKSAlPiUKICBzZWxlY3QoU0VNQU5BLCBUUkFUQU1FTlRPLCBESVBMT0NBUlBPTi5TZXYpIAoKRDMgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoTUlDT1NGQUVSRUxBLkluID0gaWZlbHNlKCEoYWJzKE1JQ09TRkFFUkVMQS5JbiAtIG1lZGlhbihNSUNPU0ZBRVJFTEEuSW4pKSA+IDIqc2QoTUlDT1NGQUVSRUxBLkluKSksIG1lYW4oTUlDT1NGQUVSRUxBLkluKSwgTUlDT1NGQUVSRUxBLkluKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgTUlDT1NGQUVSRUxBLkluKSAKCkQ0ID0gZGYgJT4lCiAgZ3JvdXBfYnkoVFJBVEFNRU5UTykgJT4lCiAgbXV0YXRlKE1JQ09TRkFFUkVMQS5TZXYgPSBpZmVsc2UoKGFicyhNSUNPU0ZBRVJFTEEuU2V2IC0gbWVkaWFuKE1JQ09TRkFFUkVMQS5TZXYpKSA+IDIqc2QoTUlDT1NGQUVSRUxBLlNldikpLCBtZWFuKE1JQ09TRkFFUkVMQS5TZXYpLCBNSUNPU0ZBRVJFTEEuU2V2KSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgTUlDT1NGQUVSRUxBLlNldikgCgpENSA9IGRmICU+JQogIGdyb3VwX2J5KFRSQVRBTUVOVE8pICU+JQogIG11dGF0ZShBTlRSQUNOT1NFLkluID0gaWZlbHNlKChhYnMoQU5UUkFDTk9TRS5JbiAtIG1lZGlhbihBTlRSQUNOT1NFLkluKSkgPiAyKnNkKEFOVFJBQ05PU0UuSW4pKSwgbWVhbihBTlRSQUNOT1NFLkluKSwgQU5UUkFDTk9TRS5JbikpICU+JQogIHNlbGVjdChTRU1BTkEsIFRSQVRBTUVOVE8sIEFOVFJBQ05PU0UuSW4pIAoKRDYgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoQU5UUkFDTk9TRS5TZXYgPSBpZmVsc2UoIShhYnMoQU5UUkFDTk9TRS5TZXYgLSBtZWRpYW4oQU5UUkFDTk9TRS5TZXYpKSA+IDIqc2QoQU5UUkFDTk9TRS5TZXYpKSwgbWVhbihBTlRSQUNOT1NFLlNldiksIEFOVFJBQ05PU0UuU2V2KSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5TZXYpIAoKRDcgPSBkZiAlPiUKICBncm91cF9ieShUUkFUQU1FTlRPKSAlPiUKICBtdXRhdGUoQk9UUllUSVMuSW5mID0gaWZlbHNlKCEoYWJzKEJPVFJZVElTLkluZiAtIG1lZGlhbihCT1RSWVRJUy5JbmYpKSA+IDIqc2QoQk9UUllUSVMuSW5mKSksIG1lYW4oQk9UUllUSVMuSW5mKSwgQk9UUllUSVMuSW5mKSkgJT4lCiAgc2VsZWN0KFNFTUFOQSwgVFJBVEFNRU5UTywgQk9UUllUSVMuSW5mKSAKYGBgCgpgYGB7cn0KIyMjIFJlbm9tZWlhIG9zIHRyYXRhbWVudG9zCkQxIDwtIG15X2Z1bihEMSkKRDIgPC0gbXlfZnVuKEQyKQpEMyA8LSBteV9mdW4oRDMpCkQ0IDwtIG15X2Z1bihENCkKRDUgPC0gbXlfZnVuKEQ1KQpENiA8LSBteV9mdW4oRDYpCkQ3IDwtIG15X2Z1bihENykKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRElQTE9DQVJQT04uSW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiMjIyBQbG90IEJveHBsb3QgZGlzZWFzZQpEMSAlPiUgCiAgZ2dwbG90KGFlcyhUUkFUQU1FTlRPLCBESVBMT0NBUlBPTi5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwprcnVza2FsLnRlc3QoRElQTE9DQVJQT04uSW5+VFJBVEFNRU5UTyxEMSkKcGFpcndpc2Uud2lsY294LnRlc3QoRDEkRElQTE9DQVJQT04uSW4sIEQxJFRSQVRBTUVOVE8pCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMgU1VNTUFSWQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQxIH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRElQTE9DQVJQT04uU2V2ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDIgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgRElQTE9DQVJQT04uU2V2KSkgKwogIGdlb21faml0dGVyKHNpemU9Mywgd2lkdGggPSAuMSkrCiAgZ2VvbV9ib3hwbG90KHNpemU9MSkKYGBgCgpgYGB7cn0KQU5PVkE8LWFvdihESVBMT0NBUlBPTi5TZXZ+VFJBVEFNRU5UTyxEMikKcmVzIDwtIEFOT1ZBJHJlc2lkdWFscwpzaGFwaXJvLnRlc3QocmVzKQpzdW1tYXJ5KEFOT1ZBKQpUdWtleUhTRChBTk9WQSkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyBTVU1NQVJZCnNhaWRhIDwtIGRlc2NyaWJlQnkoRDIgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBNSUNPU0ZBRVJFTEEuSW4gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQzICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIE1JQ09TRkFFUkVMQS5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCgpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoTUlDT1NGQUVSRUxBLkluflRSQVRBTUVOVE8sRDMpCnBhaXJ3aXNlLndpbGNveC50ZXN0KEQzJE1JQ09TRkFFUkVMQS5JbiwgRDMkVFJBVEFNRU5UTykKYGBgCgpgYGB7cn0Kc2FpZGEgPC0gZGVzY3JpYmVCeShEMyB+IFRSQVRBTUVOVE8sIHNrZXc9RkFMU0UscmFuZ2VzPUZBTFNFLG1hdD1UUlVFKQptYXQgPC0gYyhzYWlkYVsxMyw1XSwgc2FpZGFbMTMsNl0sIHNhaWRhWzE0LDVdLCBzYWlkYVsxNCw2XSwKICAgICAgICAgc2FpZGFbMTUsNV0sIHNhaWRhWzE1LDZdLCBzYWlkYVsxNiw1XSwgc2FpZGFbMTYsNl0sCiAgICAgICAgIHNhaWRhWzE3LDVdLCBzYWlkYVsxNyw2XSwgc2FpZGFbMTgsNV0sIHNhaWRhWzE4LDZdKQpybmFtZXMgPC0gYyh0b1N0cmluZyhzYWlkYVsxMywyXSksdG9TdHJpbmcoc2FpZGFbMTQsMl0pLHRvU3RyaW5nKHNhaWRhWzE1LDJdKSwKICAgICAgICAgICAgdG9TdHJpbmcoc2FpZGFbMTYsMl0pLHRvU3RyaW5nKHNhaWRhWzE3LDJdKSx0b1N0cmluZyhzYWlkYVsxOCwyXSkpCmNuYW1lcyA8LSBjKCJNw6lkaWEiLCJEZXN2UCIpCm1hdCA8LSBtYXRyaXgobWF0LG5yb3c9NiwgbmNvbD0yLGJ5cm93PVRSVUUsZGltbmFtZXM9bGlzdChybmFtZXMsY25hbWVzKSkKcHJpbnQoIlZhbG9yZXMgZGUgTcOpZGlhIGUgRGVzdmlvIFBhZHLDo28iKQpwcmludChtYXQpCmBgYAoKYGBge3J9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE1JQ09TRkFFUkVMQS5TZXYgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQ0ICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIE1JQ09TRkFFUkVMQS5TZXYpKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZT0zLCB3aWR0aCA9IC4xKSsKICBnZW9tX2JveHBsb3Qoc2l6ZT0xKQpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoTUlDT1NGQUVSRUxBLlNldn5UUkFUQU1FTlRPLEQ0KQpwYWlyd2lzZS53aWxjb3gudGVzdChENCRNSUNPU0ZBRVJFTEEuU2V2LCBENCRUUkFUQU1FTlRPKQpgYGAKCmBgYHtyfQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQ0IH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgpgYGB7cn0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgQU5UUkFDTk9TRS5JbiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDUgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5JbikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CmtydXNrYWwudGVzdChBTlRSQUNOT1NFLkluflRSQVRBTUVOVE8sRDUpCnBhaXJ3aXNlLndpbGNveC50ZXN0KEQ1JEFOVFJBQ05PU0UuSW4sIEQ1JFRSQVRBTUVOVE8pCmBgYAoKYGBge3J9CnNhaWRhIDwtIGRlc2NyaWJlQnkoRDUgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBBTlRSQUNOT1NFLlNldiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMgUGxvdCBCb3hwbG90IGRpc2Vhc2UKRDYgJT4lIAogIGdncGxvdChhZXMoVFJBVEFNRU5UTywgQU5UUkFDTk9TRS5TZXYpKSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZT0zLCB3aWR0aCA9IC4xKSsKICBnZW9tX2JveHBsb3Qoc2l6ZT0xKQpgYGAKCmBgYHtyfQprcnVza2FsLnRlc3QoQU5UUkFDTk9TRS5TZXZ+VFJBVEFNRU5UTyxENikKcGFpcndpc2Uud2lsY294LnRlc3QoRDYkQU5UUkFDTk9TRS5TZXYsIEQ2JFRSQVRBTUVOVE8pCmBgYAoKYGBge3J9CnNhaWRhIDwtIGRlc2NyaWJlQnkoRDYgfiBUUkFUQU1FTlRPLCBza2V3PUZBTFNFLHJhbmdlcz1GQUxTRSxtYXQ9VFJVRSkKbWF0IDwtIGMoc2FpZGFbMTMsNV0sIHNhaWRhWzEzLDZdLCBzYWlkYVsxNCw1XSwgc2FpZGFbMTQsNl0sCiAgICAgICAgIHNhaWRhWzE1LDVdLCBzYWlkYVsxNSw2XSwgc2FpZGFbMTYsNV0sIHNhaWRhWzE2LDZdLAogICAgICAgICBzYWlkYVsxNyw1XSwgc2FpZGFbMTcsNl0sIHNhaWRhWzE4LDVdLCBzYWlkYVsxOCw2XSkKcm5hbWVzIDwtIGModG9TdHJpbmcoc2FpZGFbMTMsMl0pLHRvU3RyaW5nKHNhaWRhWzE0LDJdKSx0b1N0cmluZyhzYWlkYVsxNSwyXSksCiAgICAgICAgICAgIHRvU3RyaW5nKHNhaWRhWzE2LDJdKSx0b1N0cmluZyhzYWlkYVsxNywyXSksdG9TdHJpbmcoc2FpZGFbMTgsMl0pKQpjbmFtZXMgPC0gYygiTcOpZGlhIiwiRGVzdlAiKQptYXQgPC0gbWF0cml4KG1hdCxucm93PTYsIG5jb2w9MixieXJvdz1UUlVFLGRpbW5hbWVzPWxpc3Qocm5hbWVzLGNuYW1lcykpCnByaW50KCJWYWxvcmVzIGRlIE3DqWRpYSBlIERlc3ZpbyBQYWRyw6NvIikKcHJpbnQobWF0KQpgYGAKCmBgYHtyfQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBCT1RSWVRJUy5JbmYgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIFBsb3QgQm94cGxvdCBkaXNlYXNlCkQ3ICU+JSAKICBnZ3Bsb3QoYWVzKFRSQVRBTUVOVE8sIEJPVFJZVElTLkluZikpICsKICBnZW9tX2ppdHRlcihzaXplPTMsIHdpZHRoID0gLjEpKwogIGdlb21fYm94cGxvdChzaXplPTEpCmBgYAoKYGBge3J9CmtydXNrYWwudGVzdChCT1RSWVRJUy5JbmZ+VFJBVEFNRU5UTyxENykKcGFpcndpc2Uud2lsY294LnRlc3QoRDckQk9UUllUSVMuSW5mLCBENyRUUkFUQU1FTlRPKQpgYGAKCmBgYHtyfQpzYWlkYSA8LSBkZXNjcmliZUJ5KEQ3IH4gVFJBVEFNRU5UTywgc2tldz1GQUxTRSxyYW5nZXM9RkFMU0UsbWF0PVRSVUUpCm1hdCA8LSBjKHNhaWRhWzEzLDVdLCBzYWlkYVsxMyw2XSwgc2FpZGFbMTQsNV0sIHNhaWRhWzE0LDZdLAogICAgICAgICBzYWlkYVsxNSw1XSwgc2FpZGFbMTUsNl0sIHNhaWRhWzE2LDVdLCBzYWlkYVsxNiw2XSwKICAgICAgICAgc2FpZGFbMTcsNV0sIHNhaWRhWzE3LDZdLCBzYWlkYVsxOCw1XSwgc2FpZGFbMTgsNl0pCnJuYW1lcyA8LSBjKHRvU3RyaW5nKHNhaWRhWzEzLDJdKSx0b1N0cmluZyhzYWlkYVsxNCwyXSksdG9TdHJpbmcoc2FpZGFbMTUsMl0pLAogICAgICAgICAgICB0b1N0cmluZyhzYWlkYVsxNiwyXSksdG9TdHJpbmcoc2FpZGFbMTcsMl0pLHRvU3RyaW5nKHNhaWRhWzE4LDJdKSkKY25hbWVzIDwtIGMoIk3DqWRpYSIsIkRlc3ZQIikKbWF0IDwtIG1hdHJpeChtYXQsbnJvdz02LCBuY29sPTIsYnlyb3c9VFJVRSxkaW1uYW1lcz1saXN0KHJuYW1lcyxjbmFtZXMpKQpwcmludCgiVmFsb3JlcyBkZSBNw6lkaWEgZSBEZXN2aW8gUGFkcsOjbyIpCnByaW50KG1hdCkKYGBgCgoKCgo=