Esse é o caderno de anotações dos dados de pesquisa teste realizada com familiares

Pergunta(s) de Pesquisa(s)

Todas são supondo que essa amostra represente o brasil, nesse tem olivias, gregos, etc…. mutliplicado e mais uns carinhas inventados (bem radicais contra e favor) para dar mais consistencia, mas o grosso é de respostas da familia multiplicado por uns 500.

Minhas perguntas são

’questão-1 O conhecimento em política é associada com avaliação em geral da gestão bozo

’questão-2 O futuro do brasil é explicado pelas outras três. Se sim, em que grau?

Explorando os dados gerais

#A primeira tabela é o quanto acompanha política
plot(swe$conheci_tran)

#A segunda é como avaliação a gestao bozo em geral
plot(swe$avalia_gestao_tran)

#A terceira é como avalia a gestão no covid 19
plot(swe$avalia_bozo_covid19)

Nos dados abaixo verificamos as estatísticas da nota futuro brasil e as somas de todas as variáveis

summary(swe)
 nota_futuro_bra  avalia_gestao_tran conheci_tran avalia_bozo_covid19
 Min.   : 0.000   pessimo:552        pouco:704    desaprova:1020     
 1st Qu.: 3.000   ruim   : 95        muito:519    aprova   : 110     
 Median : 5.000   regular:311                     NA's     :  93     
 Mean   : 4.711   bom    : 93                                        
 3rd Qu.: 6.000   otimo  :172                                        
 Max.   :10.000                                                      
swe %>%
summarise(mean_dd = mean(nota_futuro_bra), sd_dd = sd(nota_futuro_bra), n = n())

a nota média é 4.71 a mediana é 5 Resultados da pesquisa Trecho da Web em destaque A média é a média aritmética de um conjunto de números. A mediana é um valor numérico que separa a metade superior de um conjunto da metade inferior.

A maior nota é 10. A menor é 0. 25% das notas é de 0 a 3 e 25% é de 6 a 10. Os outros 50% estão entre 3 e 5. COnfirmando as tabelas acima temos que 78 avaliam pessimo a gestao, 39 regular e 13 otimo 704 dizem acompanhar pouco e 519 muito 1020 desaprovam a gestão de bozo no covid 19, e 110 aprovam, 93 optaram por não responder. os valores de avaliação geral podem ser vistos acima

Ainda em relação a nota há um desvio padrão de cerca de 2.65. O desvio padrão é uma medida que expressa o grau de dispersão de um conjunto de dados. Ou seja, o desvio padrão indica o quanto um conjunto de dados é uniforme. Quanto mais próximo de 0 for o desvio padrão, mais homogêneo são os dados.O desvio padrão é uma medida que indica a dispersão dos dados dentro de uma amostra com relação à média.Um desvio padrão grande significa que os valores amostrais estão bem distribuídos em torno da média, enquanto que um desvio padrão pequeno indica que eles estão condensados próximos da média. Em poucas palavras, quanto menor o desvio padrão, mais homogênea é a amostra. Nosso desvio padrão indica que a amostra não é tão homogenea no que concerne a nota, veja o histograma abaixo:

hist (swe$nota_futuro_bra)

questão de pesquisa 1 - dados exploratórios

Iniciamos com uma tabela comparando se há associação entre ‘conhecimento em política’ e ‘avaliação em geral da gestão bozo’.

nossas hipóteses são

HO - não há associação = 0 H1 - há associação -> diferente de 0

prop.table(table(swe$conheci_tran,swe$avalia_gestao_tran),2)
       
          pessimo      ruim   regular       bom     otimo
  pouco 0.5996377 1.0000000 0.4919614 0.3333333 0.5465116
  muito 0.4003623 0.0000000 0.5080386 0.6666667 0.4534884

dos que avaliam a gestão em geral como péssimo 59% dizem acompanhar pouco dos que avaliam a gestão em geral como ruim 100% dizem acompanhar pouco dos que avaliam a gestão em geral como regular 49% dizem acompanhar pouco dos que avaliam a gestão em geral como péssimo 33% dizem acompanhar pouco dos que avaliam a gestão em geral como ótimo 54% dizem acompanhar pouco

Dada a ‘géleia’ acima, não parece haver associação. Um plot pode aclarar ainda mais essa questão:

ggplot(data = swe, aes(x = avalia_gestao_tran, fill = conheci_tran)) +
geom_bar()

O gráfico acima corrobora a tese de não haver associação, a seguir uma inferência para dar ainda mais corroboração na hipótese H0 ou se há alguma possibilidade de H1

questão de pequisa 1 - inferência

A inferência é um modo mais seguro de afirmar H0 ou H1. A exploração e correlação vista acima levantam tão somente suspeitas.

inference(y = conheci_tran, x = avalia_gestao_tran, data = swe, statistic = 'proportion', type = 'ht', null = 0, alternative = 'greater', success = 'muito', method = 'theoretical')
Ignoring null value since it's undefined for chi-square test of independence
Response variable: categorical (2 levels) 
Explanatory variable: categorical (5 levels) 
Observed:
         y
x         pouco muito
  pessimo   331   221
  ruim       95     0
  regular   153   158
  bom        31    62
  otimo      94    78

Expected:
         y
x             pouco     muito
  pessimo 317.74980 234.25020
  ruim     54.68520  40.31480
  regular 179.02208 131.97792
  bom      53.53393  39.46607
  otimo    99.00899  72.99101

H0: avalia_gestao_tran and conheci_tran are independent
HA: avalia_gestao_tran and conheci_tran are dependent
chi_sq = 103.1993, df = 4, p_value = 0

Parece-nos haver alguma associação ainda que fraca. O valor de p-value é ok. As tabelas que comparam esperado e predito, mostram alguma problema. Portanto optamos por H1, com reservas.

questão de pesquisa 2 - dados exploratórios

Nessa questão faremos uma regressão linear. Para facilitar, deixaremos todas as variáveis com menos casos. Deste modo exlcuiremos as avaliações ‘ruim’ e ’bom’que deram poucos casos. Utilizaremos na avaliação gestao: péssimo e regular e ótimo.

#primeiro passo seleção das variáveis e ajuste binário
q1 <- subset(swe, avalia_gestao_tran == 'pessimo' |avalia_gestao_tran == 'regular'|avalia_gestao_tran == 'otimo',  select = c(nota_futuro_bra, avalia_gestao_tran, conheci_tran, avalia_bozo_covid19))  %>% na.omit()
q1<-droplevels(subset(q1,avalia_gestao_tran!="ruim"))
q1<-droplevels(subset(q1,avalia_gestao_tran!="bom"))
plot(q1$avalia_gestao_tran)

Vemos acima uma nova variável com três levels em pessimo, regular e ótimo.

dim(q1)
[1] 1004    4

Restaram com as exclusões acima mencionadas 1004 casos. A seguir um resumo dos dados dessa nova amostra:

summary(q1)
 nota_futuro_bra avalia_gestao_tran conheci_tran avalia_bozo_covid19
 Min.   : 0.00   pessimo:552        pouco:547    desaprova:894      
 1st Qu.: 2.00   regular:311        muito:457    aprova   :110      
 Median : 5.00   otimo  :141                                        
 Mean   : 4.59                                                      
 3rd Qu.: 5.00                                                      
 Max.   :10.00                                                      

Com a retirada nao se alterou tanto os dados acima conforme visualizados na seção explorando dados gerais

Nossa variável a ser explicada é a “nota_futuro_bra”, que é númerica Variável possível de entrar no modelo: “avalia_gestao_tran”, “conheci_tran” e “avalia_bozo_covid19” todas categóricas.

Antes de modelar, vamos a relacionar as três candidatas a variáveis explicativas com a variável a ser explicada.

#relacionado nota_futuro_bra com avalia_gestao em geral.
Warning messages:
1: In readChar(file, size, TRUE) : truncating string with embedded nuls
2: In readChar(file, size, TRUE) : truncating string with embedded nuls
3: In readChar(file, size, TRUE) : truncating string with embedded nuls
4: In readChar(file, size, TRUE) : truncating string with embedded nuls
5: In readChar(file, size, TRUE) : truncating string with embedded nuls
6: In readChar(file, size, TRUE) : truncating string with embedded nuls
7: In readChar(file, size, TRUE) : truncating string with embedded nuls
  ggplot(data = q1) +
  geom_bar(aes(nota_futuro_bra, fill = avalia_gestao_tran), position = position_dodge(), width = .75) 

Somente um valor azul no gráfico destoa (e pequeno). No restante é claro que as avaliações regulares se encontram em notas futuro brasil no meio. Assim, como também as avaliações ótimos em sua imensa maioria se encotnram em nota 10 para bozo.

Já as avaliações péssimo se espalham mais pelas notas, embora o grosso desta esteja abaixo de cinco. A função by vai mensurar as medidas de dispersão.

by(q1$nota_futuro_bra, q1$avalia_gestao_tran, summary)
q1$avalia_gestao_tran: pessimo
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    2.00    4.00    3.62    5.00    7.00 
---------------------------------------------------------------------------- 
q1$avalia_gestao_tran: regular
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   4.000   5.000   4.756   5.000   7.000 
---------------------------------------------------------------------------- 
q1$avalia_gestao_tran: otimo
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000  10.000  10.000   8.021  10.000  10.000 

Os dados acima tornam mais claro que há uma relação. Os valores de média acompanham a avaliação. Até agora é possível afirmar que quanto mais bem se avalia o governo, melhor a nota que se dá para o fururo do Brasil.

A seguir relacionaremos com a segunda potencial variável explicativa:

#relacionado nota_futuro_bra com conheci_tran.
ggplot(data = q1) +
geom_bar(aes(nota_futuro_bra, fill = conheci_tran), position = position_dodge(), width = .75) 

Visualmente parece haver alguma associação, embora mais fraca que a vista acima. A concentraçao do ‘pouco’ na nota 5 pode acarretar alguma problema, embora os valores de muito esteja mais associados a notas altas, visualmente e os valores de pouco a notas baixas. Mas para ter certeza é necessário testá-los na fase de modelagem.

Antes, se faz necessário uma elucidação matemática com a função ‘by’:

by(q1$nota_futuro_bra, q1$conheci_tran, summary)
q1$conheci_tran: pouco
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
      0       4       5       4       5      10 
---------------------------------------------------------------------------- 
q1$conheci_tran: muito
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  2.000   2.000   5.000   5.295   7.000  10.000 

Todos os valores acima são muito próximos, logo parece não parece haver associação clara entre conhecimento de política e nota dada para o futuro do brasil.

A seguir relacionaremos coma terceira e última potencial variável explicativa:

#relacionado nota_futuro_bra com avalia_bozo_covid19.
ggplot(data = q1) +
geom_bar(aes(nota_futuro_bra, fill = avalia_bozo_covid19), position = position_dodge(), width = .75) 

também parece não haver uma forte associação entre os casos. Os valores de desaprova parecem bem espalhados, embora a maior parte dos casos, visualmente, pareça estar em notas abaixo de cinco. Já os casos de aprova que são poucos, parecem estar mais concentrados em notas dez. A função by mostrará que há uma associação, não se sabe se forte ou fraca.

by(q1$nota_futuro_bra, q1$avalia_bozo_covid19, summary)
q1$avalia_bozo_covid19: desaprova
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   2.000   5.000   4.236   5.000  10.000 
---------------------------------------------------------------------------- 
q1$avalia_bozo_covid19: aprova
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.000   1.000  10.000   7.464  10.000  10.000 

Os dados mostram que há sim uma associação, que só nao é forte pela quantidade de casos em ‘aprova’ ser pouco para gestão covid 19.

Em suma, a variável avalia gestao geral mostrou forte associação, a variável conhecimento de política mostrou associação fraca ou inexistente e a variável avalia bozo na covid mostrou média associação.

Vamos agora a procura do melhor modelo.

questão de pesquisa 2 - modelagem (na busca do melhor modelo R quadrado ajustado e p-value)

Primeiro um ggpairs para verificar se há algum risco de colinearidade

library(GGally)
There were 11 warnings (use warnings() to see them)
ggpairs(q1, columns = 1:4)

que bom , não há esse risco. Se houvesse apareceria. Observe a primeira linha, e veja como se comporta nossa variável nota futuro, parece que muda conforme a os levels das explicativas pensadas. Bom sinal

Nosso primeiro método será o p-value. trata-se do teste de significância, mede se tem relação e nao a intensidade. Nesse caso, se não houver significância estatística a variável explicativa sai do modelo.

gestação do modelo 1 - método - Stepwise Backwards with p-value

O método nesse modelo 1 é o Stepwise Backwards with p-value

#passo 1 modelo full (completo)
md_full <- lm(nota_futuro_bra ~ avalia_gestao_tran + conheci_tran + avalia_bozo_covid19, data = q1)
summary(md_full)

Call:
lm(formula = nota_futuro_bra ~ avalia_gestao_tran + conheci_tran + 
    avalia_bozo_covid19, data = q1)

Residuals:
    Min      1Q  Median      3Q     Max 
-5.5914 -2.1271  0.8693  1.8729  3.4086 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                 3.1271     0.1054  29.680  < 2e-16 ***
avalia_gestao_tranregular   1.0036     0.1502   6.684 3.86e-11 ***
avalia_gestao_tranotimo     6.8729     0.3929  17.494  < 2e-16 ***
conheci_tranmuito           1.2300     0.1381   8.908  < 2e-16 ***
avalia_bozo_covid19aprova  -3.4086     0.4396  -7.755 2.18e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.107 on 999 degrees of freedom
Multiple R-squared:  0.378, Adjusted R-squared:  0.3755 
F-statistic: 151.8 on 4 and 999 DF,  p-value: < 2.2e-16

Não é necessário fazer mais nada, já q todas as variáveis passram no teste de sig (ver acima as três ***) Portanto nesse método nosso modelo é o full.

Obs. Pessimo e desaprova são categorias de referência. Explicaremos melhor isso na parte de ‘analise dos dados da regressão esoclhida abaixo’.

A seguir faremos uso de outra forma de gestação de modelos, Stepwise Backwards with R Adjusted Squared. Essa não mede a significância, mas sim a correlação. O problema é passar nos testes de diagnóstico, se for o caso, veremos isso mais abaixo nesse relatório.

gestação do modelo 2 - método Stepwise Backwards with R Adjusted Squared

Antes de seguir vale a pena guardar o valor de R Adjudeste Square gerado acima, vemos ele novamente abaixo:

summary(md_full)$adj.r.squared
[1] 0.3755411

Guarde esse valor, pois será ele que será utilizado como padrão para nosso próximo passos. Qual é o significado desse número ‘0.375…’? Significa que a nota do futuro do brasil é explicada pelas três variávies em 37,5% por cento. Esse e o poder explicativo do modelo full. E o restante ? É explicado por outros fatores que não dispomos de dados para responder. Esse valor é muito bom para ciências humanas, considerado explicação médio alto.

A seguir, continuamos nossa busca pelo melhor modelo. Para tal fim faremos um modelo onde testaremos com uma variável a menos, Eis os modelos a serem criados seus respectivos valores de R Adjusted Square:

#modelos b1,b2 e b3 com duas variáveis explicativas
#modelo b1 variáveis explicativas = conheci_tran + avalia_bozo_covid19
md_b1<- lm(nota_futuro_bra ~  conheci_tran + avalia_bozo_covid19, data = q1)
summary(md_b1)$adj.r.squared
[1] 0.1728145
#modelo b2 variáveis explicativas = avalia_gestao_tran + avalia_bozo_covid19
md_b2<- lm(nota_futuro_bra ~ avalia_gestao_tran + avalia_bozo_covid19, data = q1)
summary(md_b2)$adj.r.squared
[1] 0.3266083
#modelo b3 variáveis explicativas = avalia_gestao_tran + conheci_tran
md_b3 <- lm(nota_futuro_bra ~ conheci_tran + avalia_gestao_tran, data = q1)
summary(md_b3)$adj.r.squared
[1] 0.3386154
#modelos inciados com a letra ''c'' com uma variável explicativa
#modelo c1 com uma variável explicativa = conheci_tran
md_c1<- lm(nota_futuro_bra ~  conheci_tran, data = q1)
summary(md_c1)$adj.r.squared
[1] 0.05763551
# modelo c2 com uma variável explicativa = avalia_bozo_covid19
md_c2<- lm(nota_futuro_bra ~  avalia_bozo_covid19, data = q1)
summary(md_c2)$adj.r.squared
[1] 0.1421964
# modelo c3 com uma variável explicativa = avalia_gestao_tran
md_c3<- lm(nota_futuro_bra ~  avalia_gestao_tran, data = q1)
summary(md_c3)$adj.r.squared
[1] 0.3054257

OS valores acima são abaixo do R Adjusted Square do valor do modelo full. Poranto, nesse método nossa escolha tambem é pelo modelo completo com as três variáveis explicativas.

1- md_full - nota futuro_bra explicad por avalia_gestao_tran + conheci_tran + avalia_bozo_covid19

Os valores que ficam na reserva caso o o modelo escolhido não passe no diagnóstico são:

2- md_b3 - nota futuro_bra explicado por conheci_tran + avalia_gestao_tran

3- md_b2 - nota futuro_bra explicado por avalia_gestao_tran + avalia_bozo_covid19

4- md_c3 - nota futuro_bra explicado por avalia_gestao_tran

5- md_b1 - explicado por conheci_tran + avalia_bozo_covid19

6- md_c2 - explicado por avalia_bozo_covid19

7- md_c1 - explicado por conheci_tran

modelo 1 v.s modelo 2 - e diagnóstico do modelo.

Os dois métodos geraram o mesmo resultado ‘md_full’, portanto não se faz necessário compará-lo, a seguir executaremos o diagnóstico. Caso passe no mesmo podemos proceder para análise, em caso contrário iremos para nosso primeiro teste reserva (md_b3).

##diagnóstico do modelo md_full - reprovado

para verificar se está tudo ok com um modelo se faz necessário os passos de diagnóstico: são eles> 1. LINEAR RELATIONSHIPS BETWEEN X AND Y

  1. Nearly normal residuals

  2. Constant variability of residuals

  3. INDEPENDENCE OF RESIDUALS

#passo 1. LINEAR RELATIONSHIPS BETWEEN X AND Y
cog_final = md_full
#esse passo não é necessário por não haver variável númerica dada como explicativa

esse passo não é necessário por não haver variável númerica dada como explicativa Abaixo o passo 2:

#passo 2. Nearly normal residuals
hist(md_full$residuals)

qqnorm(cog_final$residuals)
qqline(cog_final$residuals)

SINAL VERMELHO não é possível usar o modelo, não passou no teste. Os theorical quantiles estão mal distribuídos. Vemos o que dá nos outros passos

#passo 3. Constant variability of residuals
plot(cog_final$residuals ~ cog_final$fitted)

análise - IDEM Sinal vermelho

#passo 4. INDEPENDENCE OF RESIDUALS
plot(cog_final$residuals)

confirmado - reprovado

vamos fazer agora o diagnóstico de nosso próximo modelo:

diagnóstico modelo md_b3

analisaremos o primeiro do banco de reservas: md_b3 - nota futuro_bra explicado por conheci_tran + avalia_gestao_tran

#Nearly normal residuals de md_b3
hist(md_b3$residuals)

qqnorm(md_b3$residuals)
qqline(md_b3$residuals)

Mesmo problema- descartado

##diagnóstico modelo md_b2

analisaremos o segundo do banco de reservas: md_b2 - nota futuro_bra explicado por avalia_gestao_tran + avalia_bozo_covid19

#Nearly normal residuals de md_b3
hist(md_b2$residuals)

qqnorm(md_b2$residuals)
qqline(md_b2$residuals)

Mesmo problema- descartado

analise modelo md_c3

Reelembrando que o modelo md_c3 (nota futuro_bra explicado por avalia_gestao_tran) o próximo da lista, só tem uma variável explicativa.

Existem regras diferentes de diagnóstico para regressão lineares simples (com uma variável explicativa);

Quais são? ….

Os testes são somente 3:

  1. linearity, (2) nearly normal residuals, and (3) constant variability.
#passo 1 linearity
ggplot(data = md_c3, aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")

Parece distribuído aleatoriamente? nao muito, mas vamos os outros dois passos

#passo 2 Nearly normal residuals de md_c3
ggplot(data = md_c3, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

Não deu boa

Último passo

ggplot(data = md_c3, aes(sample = .resid)) +
  stat_qq()

nao aprovado para md_c3

Vamos para o próximo do banco de reservas:

5- md_b1 - explicado por conheci_tran + avalia_bozo_covid19 (linear múltipla)

6- md_c2 - explicado por avalia_bozo_covid19 (linear simples)

7- md_c1 - explicado por conheci_tran (linear simples)

diagnóstico para possível modelo md_b1

#Nearly normal residuals de md_b1
hist(md_b1$residuals)

qqnorm(md_b1$residuals)
qqline(md_b1$residuals)

descartado próximo modelo:

6- md_c2 - explicado por avalia_bozo_covid19 (linear simples)

7- md_c1 - explicado por conheci_tran (linear simples)

diagnóstico possível modelo md_c2 -> explicado por avalia_bozo_covid19 (linear simples)

#passo 1 linearity de md_c2
ggplot(data = md_c2, aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")

#passo 2 Nearly normal residuals de md_c2
ggplot(data = md_c2, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

Até agora não deu boa - vamos para o passo 3

ggplot(data = md_c2, aes(sample = .resid)) +
  stat_qq()

descartado próximo modelo e útlimo modelo:

7- md_c1 - explicado por conheci_tran (linear simples)

diagnóstico modelo md_c1

#passo 1 linearity de md_c1
ggplot(data = md_c2, aes(x = .fitted, y = .resid)) +
  geom_point() +
  geom_hline(yintercept = 0, linetype = "dashed") +
  xlab("Fitted values") +
  ylab("Residuals")

#passo 2 Nearly normal residuals de md_c2
ggplot(data = md_c1, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

ggplot(data = md_c1, aes(sample = .resid)) +
  stat_qq()

Não foi possível modelo descartado

não podemos utilizar nenhum modelo, os dados são insuficientes.

analise dos dados da regressão esoclhida abaixo para resolver questão 2

Não foi pssível fazer analise de regresssão, , uma vez que as regressões naõ foram aprovados nos testes de diagnóstico.

A solução são análises de inferência com cada uma das três variáveis explicativas acerca da variável nota futuro_bra

questão de pesquisa 2.1 - inferência de avalia gestao explicando nota_futuro_bra

boxplot(swe$nota_futuro_bra ~ swe$avalia_gestao_tran, col = "orange", main="nota futuro bra e avalia gestao", ylab="nota fut", xlab="avalia gestao")
There were 44 warnings (use warnings() to see them)

Há uma visível relação. abaixo mais um teste:

swe %>%
There were 32 warnings (use warnings() to see them)
  group_by(avalia_gestao_tran) %>%
  summarise(mean_nota_fut = mean(nota_futuro_bra))
`summarise()` ungrouping output (override with `.groups` argument)

Com excessão do pessimo e do ruim, o resto segue um caminho. A seguir a inferência propriamente dita:

inference(y = nota_futuro_bra, x = avalia_gestao_tran, data = swe, statistic = "mean", type = "ht", null = 0, 
          alternative = "greater", method = "theoretical")
Ignoring null value since it's undefined for ANOVA
Response variable: numerical
Explanatory variable: categorical (5 levels) 
n_pessimo = 552, y_bar_pessimo = 3.6196, s_pessimo = 2.1327
n_ruim = 95, y_bar_ruim = 3.0105, s_ruim = 0.8186
n_regular = 311, y_bar_regular = 4.7556, s_regular = 1.2436
n_bom = 93, y_bar_bom = 6.3333, s_bom = 1.7089
n_otimo = 172, y_bar_otimo = 8.1977, s_otimo = 3.4056

ANOVA:

Pairwise tests - t tests with pooled SD:

analise- o p_value nos dá segurança em afirmar que há signifcância entre as variáveis (mesmo com essa diferença entre ruim e pessimo).

questão de pesquisa 2.2 - inferência de conheci_tran explicando nota_futuro_bra

boxplot(swe$nota_futuro_bra ~ swe$conheci_tran, col = "orange", main="nota futuro bra e conheci/acompanha", ylab="nota fut", xlab="conhec/acomp")

Há uma visível relação. abaixo mais um teste:

swe %>%
  group_by(conheci_tran) %>%
  summarise(mean_nota_fut = mean(nota_futuro_bra))
`summarise()` ungrouping output (override with `.groups` argument)

parece ok, vamos para a inferência propriamente dita


inference(y = nota_futuro_bra, x = conheci_tran, data = swe, statistic = "mean", type = "ht", null = 0, 
          alternative = "twosided", method = "theoretical")
Response variable: numerical
Explanatory variable: categorical (2 levels) 
n_pouco = 704, y_bar_pouco = 4.0866, s_pouco = 2.4096
n_muito = 519, y_bar_muito = 5.5588, s_muito = 2.7227
H0: mu_pouco =  mu_muito
HA: mu_pouco != mu_muito
t = -9.8074, df = 518
p_value = < 0.0001

Deu boa.(bom p-value) tem associação.

questão de pesquisa 2.3 - inferência de avalia_bozo_covid19 explicando nota_futuro_bra

Mesmo procedimento das duas anteriores.

boxplot(swe$nota_futuro_bra ~ swe$avalia_bozo_covid19, col = "orange", main="nota futuro bra e bozo no corona", ylab="nota fut", xlab="bozo no coronga")

Nesse caso nao parece haver tao forte, como já vimos antes os valores do aprova se consolidam por todos as notas.

Os que desaprovam dao notas mais baixar, os que aprovam dão todos os tipos de notas.

Veremos mais dados abaixo que corroboram isso que foi dito:

swe %>%
  group_by(avalia_bozo_covid19) %>%
  summarise(mean_nota_fut = mean(nota_futuro_bra))
`summarise()` ungrouping output (override with `.groups` argument)

Ok, a inferência a seguir:

inference(y = nota_futuro_bra, x = avalia_bozo_covid19, data = swe, statistic = "mean", type = "ht", null = 0, 
          alternative = "twosided", method = "theoretical")
Response variable: numerical
Explanatory variable: categorical (2 levels) 
n_desaprova = 1020, y_bar_desaprova = 4.3882, s_desaprova = 2.2178
n_aprova = 110, y_bar_aprova = 7.4636, s_aprova = 4.0675
H0: mu_desaprova =  mu_aprova
HA: mu_desaprova != mu_aprova
t = -7.8058, df = 109
p_value = < 0.0001

Opa deu boa. Isso nos dá uma esperança, a seguir:

Uma tentativa desesperada de regressão full model com swe

Faremos uma última tentativa desesperada de tentar as regressões COM TODOS OS VALORES DISPONÍVES, SEM CORTAR NADA

m_full <- lm(nota_futuro_bra ~ avalia_gestao_tran + conheci_tran + avalia_bozo_covid19, data = swe)
summary(m_full)

Call:
lm(formula = nota_futuro_bra ~ avalia_gestao_tran + conheci_tran + 
    avalia_bozo_covid19, data = swe)

Residuals:
   Min     1Q Median     3Q    Max 
-5.591 -1.361  0.500  1.873  3.409 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                3.12711    0.09973  31.357  < 2e-16 ***
avalia_gestao_tranruim     0.37289    0.26853   1.389    0.165    
avalia_gestao_tranregular  1.00362    0.14212   7.062 2.88e-12 ***
avalia_gestao_tranbom      3.14286    0.27842  11.288  < 2e-16 ***
avalia_gestao_tranotimo    6.87289    0.37187  18.482  < 2e-16 ***
conheci_tranmuito          1.23003    0.13069   9.412  < 2e-16 ***
avalia_bozo_covid19aprova -3.40856    0.41605  -8.193 6.90e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.995 on 1123 degrees of freedom
  (93 observations deleted due to missingness)
Multiple R-squared:  0.4238,    Adjusted R-squared:  0.4208 
F-statistic: 137.7 on 6 and 1123 DF,  p-value: < 2.2e-16
r_adj_m_full <- 0.4208

Bom valor de 42%, talvez o erro tenha sido criar ‘q1’. Vamos aos temidos diagnósticos:

testes de diagnostico de m_full

hist(m_full$residuals)

qqnorm(m_full$residuals)
qqline(m_full$residuals)

plot(m_full$residuals ~ m_full$fitted)

plot(m_full$residuals)

O terceira tabela nos da segurança de seguir com esse modelo, embora ele não esteja tão ok. ele está mais ok que o md_full

Pra desencargo veremos se há algum modelo sem ‘q1’ que tem maior R adjusted Square.

testando o R adjusted Square com a base toda.

#modelos f1,f2 e f3 com duas variáveis explicativas
#modelo f1 variáveis explicativas = conheci_tran + avalia_bozo_covid19
md_f1<- lm(nota_futuro_bra ~  conheci_tran + avalia_bozo_covid19, data = swe)
summary(md_f1)$adj.r.squared
[1] 0.1834883
#modelo f2 variáveis explicativas = avalia_gestao_tran + avalia_bozo_covid19
md_f2<- lm(nota_futuro_bra ~ avalia_gestao_tran + avalia_bozo_covid19, data = swe)
summary(md_f2)$adj.r.squared
[1] 0.375628
#modelo f3 variáveis explicativas = avalia_gestao_tran + conheci_tran
md_f3 <- lm(nota_futuro_bra ~ conheci_tran + avalia_gestao_tran, data = swe)
summary(md_f3)$adj.r.squared
[1] 0.4178691
#modelos inciados com a letra ''g'' com uma variável explicativa
#modelo g1 com uma variável explicativa = conheci_tran
md_g1<- lm(nota_futuro_bra ~  conheci_tran, data = swe)
summary(md_g1)$adj.r.squared
[1] 0.07479796
# modelo g2 com uma variável explicativa = avalia_bozo_covid19
md_g2<- lm(nota_futuro_bra ~  avalia_bozo_covid19, data = swe)
summary(md_g2)$adj.r.squared
[1] 0.1203229
# modelo g3 com uma variável explicativa = avalia_gestao_tran
md_g3<- lm(nota_futuro_bra ~  avalia_gestao_tran, data = swe)
summary(md_g3)$adj.r.squared
[1] 0.3794131
#relembrando o valor de m_full
r_adj_m_full
[1] 0.4208

nenhum valor superou o 0.4208, vamos com ele

analisando os resultados m_full

Já que o m_full foi escolhido(so testes diagnóstico colocam ele no limiar de ok e não ok), vamos analisar o que ele nos diz:

summary(m_full)

Call:
lm(formula = nota_futuro_bra ~ avalia_gestao_tran + conheci_tran + 
    avalia_bozo_covid19, data = swe)

Residuals:
   Min     1Q Median     3Q    Max 
-5.591 -1.361  0.500  1.873  3.409 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                3.12711    0.09973  31.357  < 2e-16 ***
avalia_gestao_tranruim     0.37289    0.26853   1.389    0.165    
avalia_gestao_tranregular  1.00362    0.14212   7.062 2.88e-12 ***
avalia_gestao_tranbom      3.14286    0.27842  11.288  < 2e-16 ***
avalia_gestao_tranotimo    6.87289    0.37187  18.482  < 2e-16 ***
conheci_tranmuito          1.23003    0.13069   9.412  < 2e-16 ***
avalia_bozo_covid19aprova -3.40856    0.41605  -8.193 6.90e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1.995 on 1123 degrees of freedom
  (93 observations deleted due to missingness)
Multiple R-squared:  0.4238,    Adjusted R-squared:  0.4208 
F-statistic: 137.7 on 6 and 1123 DF,  p-value: < 2.2e-16
r_adj_m_full <- 0.4208

analise - devemos entender que é um exercício e o o diagnóstico não foi muito bom

feita essa ressalva, é possível notar primeiramente que as categorias de referência são pessimo, pouco e desaprova.

-Sobre a avaliação gestão ruim não é possível dizer nada (pois não passa no teste de sig, não tem as ***)

-Sobre avaliação gestão regular é possível dizer avaliar regularmente ao invés de pessimamente tem como expectativa no modelo melhorar em cerca de 1 ponto a nota do futuro do Brasil.

-Avaliar como bom ao invés de pessimamente tem como expectativa no modelo melhorar em cerca de 3.14 pontos a nota do futuro do Brasil.

A segunda regressão com mais R Adjusted foi md_f3, vamos testá-la também

analisando os resultados md_f3

Os plots do diagnóstico de md_f3 são um pouco melhores que em m_full veja abaixo

hist(md_f3$residuals)

qqnorm(md_f3$residuals)
qqline(md_f3$residuals)

plot(md_f3$residuals ~ md_f3$fitted)

plot(md_f3$residuals)

Portanto cabe também analisá-lo (dado seu alto R adjusted)

summary(md_f3)

Call:
lm(formula = nota_futuro_bra ~ conheci_tran + avalia_gestao_tran, 
    data = swe)

Residuals:
    Min      1Q  Median      3Q     Max 
-6.6977 -1.2980  0.8045  1.3023  2.7193 

Coefficients:
                          Estimate Std. Error t value Pr(>|t|)    
(Intercept)                3.17814    0.09893  32.125  < 2e-16 ***
conheci_tranmuito          1.10257    0.12216   9.026  < 2e-16 ***
avalia_gestao_tranruim    -0.16761    0.22969  -0.730    0.466    
avalia_gestao_tranregular  1.01734    0.14385   7.072 2.57e-12 ***
avalia_gestao_tranbom      2.42015    0.22880  10.578  < 2e-16 ***
avalia_gestao_tranotimo    4.51953    0.17655  25.599  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 2.02 on 1217 degrees of freedom
Multiple R-squared:  0.4203,    Adjusted R-squared:  0.4179 
F-statistic: 176.4 on 5 and 1217 DF,  p-value: < 2.2e-16

-Sobre a avaliação gestão ruim não é possível dizer nada (pois não passa no teste de sig, não tem as ***)

-Sobre avaliação gestão regular é possível dizer avaliar regularmente ao invés de pessimamente tem como expectativa no modelo melhorar em cerca de 1 ponto a nota do futuro do Brasil.

-Avaliar como bom ao invés de pessimamente tem como expectativa no modelo melhorar em cerca de 2.42 pontos a nota do futuro do Brasil.

questão de pequisa 2 - predição em m_full e md_f3

vamos criar três personagens: o bolsonarista, o critico e o neutro abaixo mais infos:

##Vamos prever que nota daria um apoiador forte de Bolsonaro Vamos prever que nota daria um apoiador forte de Bolsonaro (avalia como ótimo a gestão, acompanha muito e aprova a gestão covid)

Vamos chamá-lo de bolsonarista

newdata1 <- data.frame(avalia_gestao_tran = "otimo", conheci_tran = "muito", avalia_bozo_covid19 = "aprova")

bolsonarista <- round(predict(m_full, newdata1), digit = 0)

c(bolsonarista , newdata1$nota_futuro_bra)
1 
8 

a nota prevista do bolsonarista é 8.

vamos ampliar o escopo com intervalo de 95% de confiança

predict(m_full, newdata1, interval = 'prediction', level = 0.95)
       fit      lwr      upr
1 7.821462 3.889363 11.75356

entre 3,88 e 10. (temos 95% de confiança que não dará menos que 3,88 para o futuro do brasil)

##Vamos prever que nota daria um crítico forte de Bolsonaro Vamos prever que nota daria um crítico forte de Bolsonaro (avalia como péssimo a gestão, acompanha muito e reprova a gestão covid)

Vamos chamá-lo de crítico


newdata2 <- data.frame(avalia_gestao_tran = "pessimo", conheci_tran = "muito", avalia_bozo_covid19 = "desaprova")

critico <- round(predict(m_full, newdata2), digit = 0)

c(critico , newdata2$nota_futuro_bra)
1 
4 

a nota prevista do crítico é 4

predict(m_full, newdata2, interval = 'prediction', level = 0.95)
       fit       lwr      upr
1 4.357136 0.4369333 8.277338

o intervalo com 95% DE CONFIANÇA É 0.43 E 8.27 - TEMOS 95% DE CERTEZA QUE NÃO DARÁ MAIS 8.27 PARA O FUTURO DO BRASIL.

##Vamos prever um que acompanha pouco, avalia regular e nao tem opinião sobre a covid Vamos prever um que acompanha pouco, avalia regular e nao tem opinião sobre a covid

Vamos chamá-lo de neutro e usar md_f3

newdata3 <- data.frame(avalia_gestao_tran = "regular", conheci_tran = "pouco")

neutro <- round(predict(md_f3, newdata3), digit = 0)

c(neutro , newdata3$nota_futuro_bra)
1 
4 

Previsão de nota 4

predict(md_f3, newdata2, interval = 'prediction', level = 0.95)
       fit      lwr    upr
1 4.280708 0.310615 8.2508

entre 0.31 e 8,25

Conclusão.

Em relação a pergunta 1, Há associação

Em relação a pergunta 2, é seguro afimar que nota_futuro é explicado por no entanto, como não foi possível rodar as regressões com 100% de seguraça, não é possível dizer com segurança a intensidade.

Se aceitarmos que os modelo m_full e md_f3 estão ok -(pode-se dizer que estão no limiar), as conclusões estão presentes na análise analise da regressão m_full e md_f3

Concluimos também dizendo que que se prevê que os bolsonaristas sejam mais otimistas que os neutros e críticos.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCkVzc2Ugw6kgbyBjYWRlcm5vIGRlIGFub3Rhw6fDtWVzIGRvcyBkYWRvcyBkZSBwZXNxdWlzYSB0ZXN0ZSByZWFsaXphZGEgY29tIGZhbWlsaWFyZXMNCg0KDQojIyBQZXJndW50YShzKSBkZSBQZXNxdWlzYShzKQ0KDQpUb2RhcyBzw6NvIHN1cG9uZG8gcXVlIGVzc2EgYW1vc3RyYSByZXByZXNlbnRlIG8gYnJhc2lsLCBuZXNzZSB0ZW0gb2xpdmlhcywgZ3JlZ29zLCBldGMuLi4uIG11dGxpcGxpY2FkbyBlIG1haXMgdW5zIGNhcmluaGFzIGludmVudGFkb3MgKGJlbSByYWRpY2FpcyBjb250cmEgZSBmYXZvcikgcGFyYSBkYXIgbWFpcyBjb25zaXN0ZW5jaWEsIG1hcyBvIGdyb3NzbyDDqSBkZSByZXNwb3N0YXMgZGEgZmFtaWxpYSBtdWx0aXBsaWNhZG8gcG9yIHVucyA1MDAuDQoNCk1pbmhhcyBwZXJndW50YXMgc8Ojbw0KDQoNCidxdWVzdMOjby0xIE8gY29uaGVjaW1lbnRvIGVtIHBvbMOtdGljYSDDqSBhc3NvY2lhZGEgY29tIGF2YWxpYcOnw6NvIGVtIGdlcmFsIGRhIGdlc3TDo28gYm96bw0KDQoNCidxdWVzdMOjby0yIE8gZnV0dXJvIGRvIGJyYXNpbCDDqSBleHBsaWNhZG8gcGVsYXMgb3V0cmFzIHRyw6pzLiBTZSBzaW0sIGVtICBxdWUgZ3JhdT8NCg0KIyMgRXhwbG9yYW5kbyBvcyBkYWRvcyBnZXJhaXMNCg0KYGBge3J9DQojQSBwcmltZWlyYSB0YWJlbGEgw6kgbyBxdWFudG8gYWNvbXBhbmhhIHBvbMOtdGljYQ0KcGxvdChzd2UkY29uaGVjaV90cmFuKQ0KI0Egc2VndW5kYSDDqSBjb21vIGF2YWxpYcOnw6NvIGEgZ2VzdGFvIGJvem8gZW0gZ2VyYWwNCnBsb3Qoc3dlJGF2YWxpYV9nZXN0YW9fdHJhbikNCiNBIHRlcmNlaXJhIMOpIGNvbW8gYXZhbGlhIGEgZ2VzdMOjbyBubyBjb3ZpZCAxOQ0KcGxvdChzd2UkYXZhbGlhX2Jvem9fY292aWQxOSkNCmBgYA0KDQoNCg0KTm9zIGRhZG9zIGFiYWl4byB2ZXJpZmljYW1vcyBhcyBlc3RhdMOtc3RpY2FzIGRhIG5vdGEgZnV0dXJvIGJyYXNpbCBlIGFzIHNvbWFzIGRlIHRvZGFzIGFzIHZhcmnDoXZlaXMNCg0KDQpgYGB7cn0NCnN1bW1hcnkoc3dlKQ0Kc3dlICU+JQ0Kc3VtbWFyaXNlKG1lYW5fZGQgPSBtZWFuKG5vdGFfZnV0dXJvX2JyYSksIHNkX2RkID0gc2Qobm90YV9mdXR1cm9fYnJhKSwgbiA9IG4oKSkNCmBgYA0KDQphIG5vdGEgbcOpZGlhIMOpIDQuNzEgYSBtZWRpYW5hIMOpIDUNClJlc3VsdGFkb3MgZGEgcGVzcXVpc2ENClRyZWNobyBkYSBXZWIgZW0gZGVzdGFxdWUNCkEgbcOpZGlhIMOpIGEgbcOpZGlhIGFyaXRtw6l0aWNhIGRlIHVtIGNvbmp1bnRvIGRlIG7Dum1lcm9zLiBBIG1lZGlhbmEgw6kgdW0gdmFsb3IgbnVtw6lyaWNvIHF1ZSBzZXBhcmEgYSBtZXRhZGUgc3VwZXJpb3IgZGUgdW0gY29uanVudG8gZGEgbWV0YWRlIGluZmVyaW9yLg0KDQpBIG1haW9yIG5vdGEgw6kgMTAuIEEgbWVub3Igw6kgMC4gMjUlIGRhcyBub3RhcyDDqSBkZSAwIGEgMyBlIDI1JSDDqSBkZSA2IGEgMTAuIE9zIG91dHJvcyA1MCUgZXN0w6NvIGVudHJlIDMgZSA1Lg0KQ09uZmlybWFuZG8gYXMgdGFiZWxhcyBhY2ltYSB0ZW1vcyBxdWUgNzggYXZhbGlhbSBwZXNzaW1vIGEgZ2VzdGFvLCAzOSByZWd1bGFyIGUgMTMgb3RpbW8NCjcwNCBkaXplbSBhY29tcGFuaGFyIHBvdWNvIGUgNTE5IG11aXRvDQoxMDIwIGRlc2Fwcm92YW0gYSBnZXN0w6NvIGRlIGJvem8gbm8gY292aWQgMTksIGUgMTEwIGFwcm92YW0sIDkzIG9wdGFyYW0gcG9yIG7Do28gcmVzcG9uZGVyLg0Kb3MgdmFsb3JlcyBkZSBhdmFsaWHDp8OjbyBnZXJhbCBwb2RlbSBzZXIgdmlzdG9zIGFjaW1hDQoNCkFpbmRhIGVtIHJlbGHDp8OjbyBhIG5vdGEgaMOhIHVtIGRlc3ZpbyBwYWRyw6NvIGRlIGNlcmNhIGRlIDIuNjUuIE8gZGVzdmlvIHBhZHLDo28gw6kgdW1hIG1lZGlkYSBxdWUgZXhwcmVzc2EgbyBncmF1IGRlIGRpc3BlcnPDo28gZGUgdW0gY29uanVudG8gZGUgZGFkb3MuIE91IHNlamEsIG8gZGVzdmlvIHBhZHLDo28gaW5kaWNhIG8gcXVhbnRvIHVtIGNvbmp1bnRvIGRlIGRhZG9zIMOpIHVuaWZvcm1lLiBRdWFudG8gbWFpcyBwcsOzeGltbyBkZSAwIGZvciBvIGRlc3ZpbyBwYWRyw6NvLCBtYWlzIGhvbW9nw6puZW8gc8OjbyBvcyBkYWRvcy5PIGRlc3ZpbyBwYWRyw6NvIMOpIHVtYSBtZWRpZGEgcXVlIGluZGljYSBhIGRpc3BlcnPDo28gZG9zIGRhZG9zIGRlbnRybyBkZSB1bWEgYW1vc3RyYSBjb20gcmVsYcOnw6NvIMOgIG3DqWRpYS5VbSBkZXN2aW8gcGFkcsOjbyBncmFuZGUgc2lnbmlmaWNhIHF1ZSBvcyB2YWxvcmVzIGFtb3N0cmFpcyBlc3TDo28gYmVtIGRpc3RyaWJ1w61kb3MgZW0gdG9ybm8gZGEgbcOpZGlhLCBlbnF1YW50byBxdWUgdW0gZGVzdmlvIHBhZHLDo28gcGVxdWVubyBpbmRpY2EgcXVlIGVsZXMgZXN0w6NvIGNvbmRlbnNhZG9zIHByw7N4aW1vcyBkYSBtw6lkaWEuIEVtIHBvdWNhcyBwYWxhdnJhcywgcXVhbnRvIG1lbm9yIG8gZGVzdmlvIHBhZHLDo28sIG1haXMgaG9tb2fDqm5lYSDDqSBhIGFtb3N0cmEuDQpOb3NzbyBkZXN2aW8gcGFkcsOjbyBpbmRpY2EgcXVlIGEgYW1vc3RyYSBuw6NvIMOpIHTDo28gaG9tb2dlbmVhIG5vIHF1ZSBjb25jZXJuZSBhIG5vdGEsIHZlamEgbyBoaXN0b2dyYW1hIGFiYWl4bzoNCg0KYGBge3J9DQpoaXN0IChzd2Ukbm90YV9mdXR1cm9fYnJhKQ0KYGBgDQoNCg0KIyMgcXVlc3TDo28gZGUgcGVzcXVpc2EgMSAtIGRhZG9zIGV4cGxvcmF0w7NyaW9zDQoNCkluaWNpYW1vcyBjb20gdW1hIHRhYmVsYSBjb21wYXJhbmRvIHNlIGjDoSBhc3NvY2lhw6fDo28gZW50cmUgJ2NvbmhlY2ltZW50byBlbSBwb2zDrXRpY2EnIGUgJ2F2YWxpYcOnw6NvIGVtIGdlcmFsIGRhIGdlc3TDo28gYm96bycuDQoNCm5vc3NhcyBoaXDDs3Rlc2VzIHPDo28NCg0KSE8gLSBuw6NvIGjDoSBhc3NvY2lhw6fDo28gPSAwDQpIMSAtIGjDoSBhc3NvY2lhw6fDo28gLT4gZGlmZXJlbnRlIGRlIDANCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlKHN3ZSRjb25oZWNpX3RyYW4sc3dlJGF2YWxpYV9nZXN0YW9fdHJhbiksMikNCmBgYA0KZG9zIHF1ZSBhdmFsaWFtIGEgZ2VzdMOjbyBlbSBnZXJhbCBjb21vIHDDqXNzaW1vIDU5JSBkaXplbSBhY29tcGFuaGFyIHBvdWNvDQpkb3MgcXVlIGF2YWxpYW0gYSBnZXN0w6NvIGVtIGdlcmFsIGNvbW8gcnVpbSAxMDAlIGRpemVtIGFjb21wYW5oYXIgcG91Y28NCmRvcyBxdWUgYXZhbGlhbSBhIGdlc3TDo28gZW0gZ2VyYWwgY29tbyByZWd1bGFyIDQ5JSBkaXplbSBhY29tcGFuaGFyIHBvdWNvDQpkb3MgcXVlIGF2YWxpYW0gYSBnZXN0w6NvIGVtIGdlcmFsIGNvbW8gcMOpc3NpbW8gMzMlIGRpemVtIGFjb21wYW5oYXIgcG91Y28NCmRvcyBxdWUgYXZhbGlhbSBhIGdlc3TDo28gZW0gZ2VyYWwgY29tbyDDs3RpbW8gNTQlIGRpemVtIGFjb21wYW5oYXIgcG91Y28NCg0KRGFkYSBhICdnw6lsZWlhJyBhY2ltYSwgbsOjbyBwYXJlY2UgaGF2ZXIgYXNzb2NpYcOnw6NvLiBVbSBwbG90IHBvZGUgYWNsYXJhciBhaW5kYSBtYWlzIGVzc2EgcXVlc3TDo286DQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEgPSBzd2UsIGFlcyh4ID0gYXZhbGlhX2dlc3Rhb190cmFuLCBmaWxsID0gY29uaGVjaV90cmFuKSkgKw0KZ2VvbV9iYXIoKQ0KYGBgDQoNCg0KTyBncsOhZmljbyBhY2ltYSBjb3Jyb2JvcmEgYSB0ZXNlIGRlIG7Do28gaGF2ZXIgYXNzb2NpYcOnw6NvLCBhIHNlZ3VpciB1bWEgaW5mZXLDqm5jaWEgcGFyYSBkYXIgYWluZGEgbWFpcyBjb3Jyb2JvcmHDp8OjbyBuYSBoaXDDs3Rlc2UgSDAgb3Ugc2UgaMOhIGFsZ3VtYSBwb3NzaWJpbGlkYWRlIGRlIEgxDQoNCg0KIyMgcXVlc3TDo28gZGUgcGVxdWlzYSAxIC0gaW5mZXLDqm5jaWENCg0KQSBpbmZlcsOqbmNpYSDDqSB1bSBtb2RvIG1haXMgc2VndXJvIGRlIGFmaXJtYXIgSDAgb3UgSDEuIEEgZXhwbG9yYcOnw6NvIGUgY29ycmVsYcOnw6NvIHZpc3RhIGFjaW1hIGxldmFudGFtIHTDo28gc29tZW50ZSBzdXNwZWl0YXMuDQoNCmBgYHtyfQ0KaW5mZXJlbmNlKHkgPSBjb25oZWNpX3RyYW4sIHggPSBhdmFsaWFfZ2VzdGFvX3RyYW4sIGRhdGEgPSBzd2UsIHN0YXRpc3RpYyA9ICdwcm9wb3J0aW9uJywgdHlwZSA9ICdodCcsIG51bGwgPSAwLCBhbHRlcm5hdGl2ZSA9ICdncmVhdGVyJywgc3VjY2VzcyA9ICdtdWl0bycsIG1ldGhvZCA9ICd0aGVvcmV0aWNhbCcpDQpgYGANCg0KUGFyZWNlLW5vcyBoYXZlciBhbGd1bWEgYXNzb2NpYcOnw6NvIGFpbmRhIHF1ZSBmcmFjYS4gTyB2YWxvciBkZSBwLXZhbHVlIMOpIG9rLiBBcyB0YWJlbGFzIHF1ZSBjb21wYXJhbSBlc3BlcmFkbyBlIHByZWRpdG8sIG1vc3RyYW0gYWxndW1hIHByb2JsZW1hLiBQb3J0YW50byBvcHRhbW9zIHBvciBIMSwgY29tIHJlc2VydmFzLg0KDQojIyAgcXVlc3TDo28gZGUgcGVzcXVpc2EgMiAtIGRhZG9zIGV4cGxvcmF0w7NyaW9zDQoNCk5lc3NhIHF1ZXN0w6NvIGZhcmVtb3MgdW1hIHJlZ3Jlc3PDo28gbGluZWFyLiBQYXJhIGZhY2lsaXRhciwgZGVpeGFyZW1vcyB0b2RhcyBhcyB2YXJpw6F2ZWlzIGNvbSBtZW5vcyBjYXNvcy4gRGVzdGUgbW9kbyBleGxjdWlyZW1vcyBhcyBhdmFsaWHDp8O1ZXMgJ3J1aW0nIGUgICdib20ncXVlIGRlcmFtIHBvdWNvcyBjYXNvcy4gVXRpbGl6YXJlbW9zIG5hIGF2YWxpYcOnw6NvIGdlc3RhbzogcMOpc3NpbW8gZSByZWd1bGFyIGUgw7N0aW1vLg0KDQpgYGB7cn0NCiNwcmltZWlybyBwYXNzbyBzZWxlw6fDo28gZGFzIHZhcmnDoXZlaXMgZSBhanVzdGUgYmluw6FyaW8NCnExIDwtIHN1YnNldChzd2UsIGF2YWxpYV9nZXN0YW9fdHJhbiA9PSAncGVzc2ltbycgfGF2YWxpYV9nZXN0YW9fdHJhbiA9PSAncmVndWxhcid8YXZhbGlhX2dlc3Rhb190cmFuID09ICdvdGltbycsICBzZWxlY3QgPSBjKG5vdGFfZnV0dXJvX2JyYSwgYXZhbGlhX2dlc3Rhb190cmFuLCBjb25oZWNpX3RyYW4sIGF2YWxpYV9ib3pvX2NvdmlkMTkpKSAgJT4lIG5hLm9taXQoKQ0KcTE8LWRyb3BsZXZlbHMoc3Vic2V0KHExLGF2YWxpYV9nZXN0YW9fdHJhbiE9InJ1aW0iKSkNCnExPC1kcm9wbGV2ZWxzKHN1YnNldChxMSxhdmFsaWFfZ2VzdGFvX3RyYW4hPSJib20iKSkNCnBsb3QocTEkYXZhbGlhX2dlc3Rhb190cmFuKQ0KYGBgDQoNClZlbW9zIGFjaW1hIHVtYSBub3ZhIHZhcmnDoXZlbCBjb20gdHLDqnMgbGV2ZWxzIGVtIHBlc3NpbW8sIHJlZ3VsYXIgZSDDs3RpbW8uDQoNCmBgYHtyfQ0KZGltKHExKQ0KYGBgDQoNCg0KUmVzdGFyYW0gY29tIGFzIGV4Y2x1c8O1ZXMgYWNpbWEgbWVuY2lvbmFkYXMgMTAwNCBjYXNvcy4gQSBzZWd1aXIgdW0gcmVzdW1vIGRvcyBkYWRvcyBkZXNzYSBub3ZhIGFtb3N0cmE6DQoNCmBgYHtyfQ0Kc3VtbWFyeShxMSkNCmBgYA0KDQpDb20gYSByZXRpcmFkYSBuYW8gc2UgYWx0ZXJvdSB0YW50byBvcyBkYWRvcyBhY2ltYSBjb25mb3JtZSB2aXN1YWxpemFkb3MgbmEgc2XDp8OjbyAqKmV4cGxvcmFuZG8gZGFkb3MgZ2VyYWlzKioNCg0KTm9zc2EgdmFyacOhdmVsIGEgc2VyIGV4cGxpY2FkYSDDqSBhICJub3RhX2Z1dHVyb19icmEiLCBxdWUgw6kgbsO6bWVyaWNhDQpWYXJpw6F2ZWwgcG9zc8OtdmVsIGRlIGVudHJhciBubyBtb2RlbG86ICJhdmFsaWFfZ2VzdGFvX3RyYW4iLCAiY29uaGVjaV90cmFuIiBlICJhdmFsaWFfYm96b19jb3ZpZDE5IiB0b2RhcyBjYXRlZ8OzcmljYXMuDQoNCkFudGVzIGRlIG1vZGVsYXIsIHZhbW9zIGEgcmVsYWNpb25hciBhcyB0csOqcyBjYW5kaWRhdGFzIGEgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgY29tIGEgdmFyacOhdmVsIGEgc2VyIGV4cGxpY2FkYS4NCg0KYGBge3J9DQojcmVsYWNpb25hZG8gbm90YV9mdXR1cm9fYnJhIGNvbSBhdmFsaWFfZ2VzdGFvIGVtIGdlcmFsLg0KICBnZ3Bsb3QoZGF0YSA9IHExKSArDQogIGdlb21fYmFyKGFlcyhub3RhX2Z1dHVyb19icmEsIGZpbGwgPSBhdmFsaWFfZ2VzdGFvX3RyYW4pLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCksIHdpZHRoID0gLjc1KSANCmBgYA0KDQpTb21lbnRlIHVtIHZhbG9yIGF6dWwgbm8gZ3LDoWZpY28gZGVzdG9hIChlIHBlcXVlbm8pLiBObyByZXN0YW50ZSDDqSBjbGFybyBxdWUgYXMgYXZhbGlhw6fDtWVzIHJlZ3VsYXJlcyBzZSBlbmNvbnRyYW0gZW0gbm90YXMgZnV0dXJvIGJyYXNpbCBubyBtZWlvLiBBc3NpbSwgY29tbyB0YW1iw6ltIGFzIGF2YWxpYcOnw7VlcyDDs3RpbW9zIGVtIHN1YSBpbWVuc2EgbWFpb3JpYSBzZSBlbmNvdG5yYW0gZW0gbm90YSAxMCBwYXJhIGJvem8uIA0KDQpKw6EgYXMgYXZhbGlhw6fDtWVzIHDDqXNzaW1vIHNlIGVzcGFsaGFtIG1haXMgcGVsYXMgbm90YXMsIGVtYm9yYSBvIGdyb3NzbyBkZXN0YSBlc3RlamEgYWJhaXhvIGRlIGNpbmNvLiBBIGZ1bsOnw6NvIGJ5IHZhaSBtZW5zdXJhciBhcyBtZWRpZGFzIGRlIGRpc3BlcnPDo28uDQoNCmBgYHtyfQ0KYnkocTEkbm90YV9mdXR1cm9fYnJhLCBxMSRhdmFsaWFfZ2VzdGFvX3RyYW4sIHN1bW1hcnkpDQpgYGANCg0KT3MgZGFkb3MgYWNpbWEgdG9ybmFtIG1haXMgY2xhcm8gcXVlIGjDoSB1bWEgcmVsYcOnw6NvLiBPcyB2YWxvcmVzIGRlIG3DqWRpYSBhY29tcGFuaGFtIGEgYXZhbGlhw6fDo28uIEF0w6kgYWdvcmEgw6kgcG9zc8OtdmVsIGFmaXJtYXIgcXVlIHF1YW50byBtYWlzIGJlbSBzZSBhdmFsaWEgbyBnb3Zlcm5vLCBtZWxob3IgYSBub3RhIHF1ZSBzZSBkw6EgcGFyYSBvIGZ1cnVybyBkbyBCcmFzaWwuDQoNCkEgc2VndWlyIHJlbGFjaW9uYXJlbW9zIGNvbSBhIHNlZ3VuZGEgcG90ZW5jaWFsIHZhcmnDoXZlbCBleHBsaWNhdGl2YToNCmBgYHtyfQ0KI3JlbGFjaW9uYWRvIG5vdGFfZnV0dXJvX2JyYSBjb20gY29uaGVjaV90cmFuLg0KZ2dwbG90KGRhdGEgPSBxMSkgKw0KZ2VvbV9iYXIoYWVzKG5vdGFfZnV0dXJvX2JyYSwgZmlsbCA9IGNvbmhlY2lfdHJhbiksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSwgd2lkdGggPSAuNzUpIA0KYGBgDQoNClZpc3VhbG1lbnRlIHBhcmVjZSBoYXZlciBhbGd1bWEgYXNzb2NpYcOnw6NvLCBlbWJvcmEgbWFpcyBmcmFjYSBxdWUgYSB2aXN0YSBhY2ltYS4NCkEgY29uY2VudHJhw6dhbyBkbyAncG91Y28nIG5hIG5vdGEgNSBwb2RlIGFjYXJyZXRhciBhbGd1bWEgcHJvYmxlbWEsIGVtYm9yYSBvcyB2YWxvcmVzIGRlIG11aXRvIGVzdGVqYSBtYWlzIGFzc29jaWFkb3MgYSBub3RhcyBhbHRhcywgdmlzdWFsbWVudGUgZSBvcyB2YWxvcmVzIGRlIHBvdWNvIGEgbm90YXMgYmFpeGFzLiBNYXMgcGFyYSB0ZXIgY2VydGV6YSDDqSBuZWNlc3PDoXJpbyB0ZXN0w6EtbG9zIG5hIGZhc2UgZGUgbW9kZWxhZ2VtLg0KDQpBbnRlcywgc2UgZmF6IG5lY2Vzc8OhcmlvIHVtYSBlbHVjaWRhw6fDo28gbWF0ZW3DoXRpY2EgY29tIGEgZnVuw6fDo28gJ2J5JzoNCg0KDQpgYGB7cn0NCmJ5KHExJG5vdGFfZnV0dXJvX2JyYSwgcTEkY29uaGVjaV90cmFuLCBzdW1tYXJ5KQ0KYGBgDQoNClRvZG9zIG9zIHZhbG9yZXMgYWNpbWEgc8OjbyBtdWl0byBwcsOzeGltb3MsIGxvZ28gcGFyZWNlIG7Do28gcGFyZWNlIGhhdmVyIGFzc29jaWHDp8OjbyBjbGFyYSBlbnRyZSBjb25oZWNpbWVudG8gZGUgcG9sw610aWNhIGUgbm90YSBkYWRhIHBhcmEgbyBmdXR1cm8gZG8gYnJhc2lsLg0KDQpBIHNlZ3VpciByZWxhY2lvbmFyZW1vcyBjb21hICB0ZXJjZWlyYSBlIMO6bHRpbWEgcG90ZW5jaWFsIHZhcmnDoXZlbCBleHBsaWNhdGl2YToNCg0KYGBge3J9DQojcmVsYWNpb25hZG8gbm90YV9mdXR1cm9fYnJhIGNvbSBhdmFsaWFfYm96b19jb3ZpZDE5Lg0KZ2dwbG90KGRhdGEgPSBxMSkgKw0KZ2VvbV9iYXIoYWVzKG5vdGFfZnV0dXJvX2JyYSwgZmlsbCA9IGF2YWxpYV9ib3pvX2NvdmlkMTkpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCksIHdpZHRoID0gLjc1KSANCmBgYA0KDQp0YW1iw6ltIHBhcmVjZSBuw6NvIGhhdmVyIHVtYSBmb3J0ZSBhc3NvY2lhw6fDo28gZW50cmUgb3MgY2Fzb3MuIE9zIHZhbG9yZXMgZGUgZGVzYXByb3ZhIHBhcmVjZW0gYmVtIGVzcGFsaGFkb3MsIGVtYm9yYSBhIG1haW9yIHBhcnRlIGRvcyBjYXNvcywgdmlzdWFsbWVudGUsIHBhcmXDp2EgZXN0YXIgZW0gbm90YXMgYWJhaXhvIGRlIGNpbmNvLiBKw6Egb3MgY2Fzb3MgZGUgYXByb3ZhIHF1ZSBzw6NvIHBvdWNvcywgcGFyZWNlbSBlc3RhciBtYWlzIGNvbmNlbnRyYWRvcyBlbSBub3RhcyBkZXouIEEgZnVuw6fDo28gYnkgbW9zdHJhcsOhIHF1ZSBow6EgdW1hIGFzc29jaWHDp8OjbywgbsOjbyBzZSBzYWJlIHNlIGZvcnRlIG91IGZyYWNhLg0KDQpgYGB7cn0NCmJ5KHExJG5vdGFfZnV0dXJvX2JyYSwgcTEkYXZhbGlhX2Jvem9fY292aWQxOSwgc3VtbWFyeSkNCmBgYA0KDQpPcyBkYWRvcyBtb3N0cmFtIHF1ZSBow6Egc2ltIHVtYSBhc3NvY2lhw6fDo28sIHF1ZSBzw7MgbmFvIMOpIGZvcnRlIHBlbGEgcXVhbnRpZGFkZSBkZSBjYXNvcyBlbSAnYXByb3ZhJyBzZXIgcG91Y28gcGFyYSBnZXN0w6NvIGNvdmlkIDE5Lg0KDQpFbSBzdW1hLCBhIHZhcmnDoXZlbCBhdmFsaWEgZ2VzdGFvIGdlcmFsIG1vc3Ryb3UgZm9ydGUgYXNzb2NpYcOnw6NvLCBhIHZhcmnDoXZlbCBjb25oZWNpbWVudG8gZGUgcG9sw610aWNhIG1vc3Ryb3UgYXNzb2NpYcOnw6NvIGZyYWNhIG91IGluZXhpc3RlbnRlIGUgYSB2YXJpw6F2ZWwgYXZhbGlhIGJvem8gbmEgIGNvdmlkIG1vc3Ryb3UgbcOpZGlhIGFzc29jaWHDp8Ojby4NCg0KVmFtb3MgYWdvcmEgYSBwcm9jdXJhIGRvIG1lbGhvciBtb2RlbG8uDQoNCg0KDQojIyBxdWVzdMOjbyBkZSBwZXNxdWlzYSAyIC0gbW9kZWxhZ2VtIChuYSBidXNjYSBkbyBtZWxob3IgbW9kZWxvIFIgcXVhZHJhZG8gYWp1c3RhZG8gZSBwLXZhbHVlKQ0KDQpQcmltZWlybyB1bSBnZ3BhaXJzIHBhcmEgdmVyaWZpY2FyIHNlIGjDoSBhbGd1bSByaXNjbyBkZSBjb2xpbmVhcmlkYWRlDQoNCmBgYHtyfQ0KbGlicmFyeShHR2FsbHkpDQpnZ3BhaXJzKHExLCBjb2x1bW5zID0gMTo0KQ0KYGBgDQoNCnF1ZSBib20gLCBuw6NvIGjDoSBlc3NlIHJpc2NvLiBTZSBob3V2ZXNzZSBhcGFyZWNlcmlhLiAqKk9ic2VydmUgYSBwcmltZWlyYSBsaW5oYSwgZSB2ZWphIGNvbW8gc2UgY29tcG9ydGEgbm9zc2EgdmFyacOhdmVsIG5vdGEgZnV0dXJvLCBwYXJlY2UgcXVlIG11ZGEgY29uZm9ybWUgYSBvcyBsZXZlbHMgZGFzIGV4cGxpY2F0aXZhcyBwZW5zYWRhcy4gQm9tIHNpbmFsKioNCg0KTm9zc28gcHJpbWVpcm8gbcOpdG9kbyBzZXLDoSBvIHAtdmFsdWUuIHRyYXRhLXNlIGRvIHRlc3RlIGRlIHNpZ25pZmljw6JuY2lhLCBtZWRlIHNlIHRlbSByZWxhw6fDo28gZSBuYW8gYSBpbnRlbnNpZGFkZS4gTmVzc2UgY2Fzbywgc2UgbsOjbyBob3V2ZXIgc2lnbmlmaWPDom5jaWEgZXN0YXTDrXN0aWNhIGEgdmFyacOhdmVsIGV4cGxpY2F0aXZhIHNhaSBkbyBtb2RlbG8uDQoNCiMjIGdlc3Rhw6fDo28gZG8gbW9kZWxvIDEgLSBtw6l0b2RvIC0gU3RlcHdpc2UgQmFja3dhcmRzIHdpdGggcC12YWx1ZQ0KDQpPIG3DqXRvZG8gbmVzc2UgbW9kZWxvIDEgw6kgbyBTdGVwd2lzZSBCYWNrd2FyZHMgd2l0aCBwLXZhbHVlDQoNCmBgYHtyfQ0KI3Bhc3NvIDEgbW9kZWxvIGZ1bGwgKGNvbXBsZXRvKQ0KbWRfZnVsbCA8LSBsbShub3RhX2Z1dHVyb19icmEgfiBhdmFsaWFfZ2VzdGFvX3RyYW4gKyBjb25oZWNpX3RyYW4gKyBhdmFsaWFfYm96b19jb3ZpZDE5LCBkYXRhID0gcTEpDQpzdW1tYXJ5KG1kX2Z1bGwpDQpgYGANCg0KTsOjbyDDqSBuZWNlc3PDoXJpbyBmYXplciBtYWlzIG5hZGEsIGrDoSBxIHRvZGFzIGFzIHZhcmnDoXZlaXMgcGFzc3JhbSBubyB0ZXN0ZSBkZSBzaWcgKHZlciBhY2ltYSBhcyB0csOqcyAqKiopDQpQb3J0YW50byBuZXNzZSBtw6l0b2RvIG5vc3NvIG1vZGVsbyDDqSBvIGZ1bGwuDQoNCk9icy4gUGVzc2ltbyBlIGRlc2Fwcm92YSBzw6NvIGNhdGVnb3JpYXMgZGUgcmVmZXLDqm5jaWEuIEV4cGxpY2FyZW1vcyBtZWxob3IgaXNzbyBuYSBwYXJ0ZSBkZSAnYW5hbGlzZSBkb3MgZGFkb3MgZGEgcmVncmVzc8OjbyBlc29jbGhpZGEgYWJhaXhvJy4NCg0KDQpBIHNlZ3VpciBmYXJlbW9zIHVzbyBkZSBvdXRyYSBmb3JtYSBkZSBnZXN0YcOnw6NvIGRlIG1vZGVsb3MsIFN0ZXB3aXNlIEJhY2t3YXJkcyB3aXRoIFIgQWRqdXN0ZWQgU3F1YXJlZC4NCkVzc2EgbsOjbyBtZWRlIGEgc2lnbmlmaWPDom5jaWEsIG1hcyBzaW0gYSBjb3JyZWxhw6fDo28uIE8gcHJvYmxlbWEgw6kgcGFzc2FyIG5vcyB0ZXN0ZXMgZGUgZGlhZ27Ds3N0aWNvLCBzZSBmb3IgbyBjYXNvLCB2ZXJlbW9zIGlzc28gbWFpcyBhYmFpeG8gbmVzc2UgcmVsYXTDs3Jpby4NCg0KDQojIyBnZXN0YcOnw6NvIGRvIG1vZGVsbyAyIC0gbcOpdG9kbyBTdGVwd2lzZSBCYWNrd2FyZHMgd2l0aCBSIEFkanVzdGVkIFNxdWFyZWQNCg0KQW50ZXMgZGUgc2VndWlyIHZhbGUgYSBwZW5hIGd1YXJkYXIgbyB2YWxvciBkZSBSIEFkanVkZXN0ZSBTcXVhcmUgZ2VyYWRvIGFjaW1hLCB2ZW1vcyBlbGUgbm92YW1lbnRlIGFiYWl4bzoNCmBgYHtyfQ0Kc3VtbWFyeShtZF9mdWxsKSRhZGouci5zcXVhcmVkDQpgYGANCg0KR3VhcmRlIGVzc2UgdmFsb3IsIHBvaXMgc2Vyw6EgZWxlIHF1ZSBzZXLDoSB1dGlsaXphZG8gY29tbyBwYWRyw6NvIHBhcmEgbm9zc28gcHLDs3hpbW8gcGFzc29zLg0KUXVhbCDDqSBvIHNpZ25pZmljYWRvIGRlc3NlIG7Dum1lcm8gJzAuMzc1Li4uICc/IFNpZ25pZmljYSBxdWUgYSBub3RhIGRvIGZ1dHVybyBkbyBicmFzaWwgw6kgZXhwbGljYWRhIHBlbGFzIHRyw6pzIHZhcmnDoXZpZXMgZW0gMzcsNSUgcG9yIGNlbnRvLiBFc3NlIGUgbyBwb2RlciBleHBsaWNhdGl2byBkbyBtb2RlbG8gZnVsbC4gRSBvIHJlc3RhbnRlID8gw4kgZXhwbGljYWRvIHBvciBvdXRyb3MgZmF0b3JlcyBxdWUgbsOjbyBkaXNwb21vcyBkZSBkYWRvcyBwYXJhIHJlc3BvbmRlci4gRXNzZSB2YWxvciDDqSBtdWl0byBib20gcGFyYSBjacOqbmNpYXMgaHVtYW5hcywgY29uc2lkZXJhZG8gZXhwbGljYcOnw6NvIG3DqWRpbyBhbHRvLg0KDQpBIHNlZ3VpciwgY29udGludWFtb3Mgbm9zc2EgYnVzY2EgcGVsbyBtZWxob3IgbW9kZWxvLiBQYXJhIHRhbCBmaW0gZmFyZW1vcyB1bSBtb2RlbG8gb25kZSB0ZXN0YXJlbW9zIGNvbSB1bWEgdmFyacOhdmVsIGEgbWVub3MsIEVpcyBvcyBtb2RlbG9zIGEgc2VyZW0gY3JpYWRvcyBzZXVzIHJlc3BlY3Rpdm9zIHZhbG9yZXMgZGUgUiBBZGp1c3RlZCBTcXVhcmU6DQoNCmBgYHtyfQ0KI21vZGVsb3MgYjEsYjIgZSBiMyBjb20gZHVhcyB2YXJpw6F2ZWlzIGV4cGxpY2F0aXZhcw0KI21vZGVsbyBiMSB2YXJpw6F2ZWlzIGV4cGxpY2F0aXZhcyA9IGNvbmhlY2lfdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCm1kX2IxPC0gbG0obm90YV9mdXR1cm9fYnJhIH4gIGNvbmhlY2lfdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTksIGRhdGEgPSBxMSkNCnN1bW1hcnkobWRfYjEpJGFkai5yLnNxdWFyZWQNCiNtb2RlbG8gYjIgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgPSBhdmFsaWFfZ2VzdGFvX3RyYW4gKyBhdmFsaWFfYm96b19jb3ZpZDE5DQptZF9iMjwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+IGF2YWxpYV9nZXN0YW9fdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTksIGRhdGEgPSBxMSkNCnN1bW1hcnkobWRfYjIpJGFkai5yLnNxdWFyZWQNCiNtb2RlbG8gYjMgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgPSBhdmFsaWFfZ2VzdGFvX3RyYW4gKyBjb25oZWNpX3RyYW4NCm1kX2IzIDwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+IGNvbmhlY2lfdHJhbiArIGF2YWxpYV9nZXN0YW9fdHJhbiwgZGF0YSA9IHExKQ0Kc3VtbWFyeShtZF9iMykkYWRqLnIuc3F1YXJlZA0KI21vZGVsb3MgaW5jaWFkb3MgY29tIGEgbGV0cmEgJydjJycgY29tIHVtYSB2YXJpw6F2ZWwgZXhwbGljYXRpdmENCiNtb2RlbG8gYzEgY29tIHVtYSB2YXJpw6F2ZWwgZXhwbGljYXRpdmEgPSBjb25oZWNpX3RyYW4NCm1kX2MxPC0gbG0obm90YV9mdXR1cm9fYnJhIH4gIGNvbmhlY2lfdHJhbiwgZGF0YSA9IHExKQ0Kc3VtbWFyeShtZF9jMSkkYWRqLnIuc3F1YXJlZA0KIyBtb2RlbG8gYzIgY29tIHVtYSB2YXJpw6F2ZWwgZXhwbGljYXRpdmEgPSBhdmFsaWFfYm96b19jb3ZpZDE5DQptZF9jMjwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+ICBhdmFsaWFfYm96b19jb3ZpZDE5LCBkYXRhID0gcTEpDQpzdW1tYXJ5KG1kX2MyKSRhZGouci5zcXVhcmVkDQojIG1vZGVsbyBjMyBjb20gdW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YSA9IGF2YWxpYV9nZXN0YW9fdHJhbg0KbWRfYzM8LSBsbShub3RhX2Z1dHVyb19icmEgfiAgYXZhbGlhX2dlc3Rhb190cmFuLCBkYXRhID0gcTEpDQpzdW1tYXJ5KG1kX2MzKSRhZGouci5zcXVhcmVkDQpgYGANCg0KT1MgdmFsb3JlcyBhY2ltYSBzw6NvIGFiYWl4byBkbyBSIEFkanVzdGVkIFNxdWFyZSBkbyB2YWxvciBkbyBtb2RlbG8gZnVsbC4gUG9yYW50bywgbmVzc2UgbcOpdG9kbyBub3NzYSBlc2NvbGhhIHRhbWJlbSDDqSBwZWxvIG1vZGVsbyBjb21wbGV0byBjb20gYXMgdHLDqnMgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMuDQoNCjEtIG1kX2Z1bGwgLSBub3RhIGZ1dHVyb19icmEgZXhwbGljYWQgcG9yIGF2YWxpYV9nZXN0YW9fdHJhbiArIGNvbmhlY2lfdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCg0KT3MgdmFsb3JlcyBxdWUgZmljYW0gbmEgcmVzZXJ2YSBjYXNvIG8gbyBtb2RlbG8gZXNjb2xoaWRvIG7Do28gcGFzc2Ugbm8gZGlhZ27Ds3N0aWNvIHPDo286IA0KDQoyLSBtZF9iMyAtIG5vdGEgZnV0dXJvX2JyYSBleHBsaWNhZG8gcG9yIGNvbmhlY2lfdHJhbiArIGF2YWxpYV9nZXN0YW9fdHJhbg0KDQozLSBtZF9iMiAtIG5vdGEgZnV0dXJvX2JyYSBleHBsaWNhZG8gcG9yIGF2YWxpYV9nZXN0YW9fdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCg0KNC0gbWRfYzMgLSBub3RhIGZ1dHVyb19icmEgZXhwbGljYWRvIHBvciBhdmFsaWFfZ2VzdGFvX3RyYW4NCg0KNS0gbWRfYjEgLSBleHBsaWNhZG8gcG9yIGNvbmhlY2lfdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCg0KNi0gbWRfYzIgLSBleHBsaWNhZG8gcG9yIGF2YWxpYV9ib3pvX2NvdmlkMTkNCg0KNy0gbWRfYzEgLSBleHBsaWNhZG8gcG9yIGNvbmhlY2lfdHJhbiAgDQoNCg0KDQojIyBtb2RlbG8gMSB2LnMgbW9kZWxvIDIgLSBlIGRpYWduw7NzdGljbyBkbyBtb2RlbG8uDQoNCk9zIGRvaXMgbcOpdG9kb3MgZ2VyYXJhbSBvIG1lc21vIHJlc3VsdGFkbyAnbWRfZnVsbCcsIHBvcnRhbnRvIG7Do28gc2UgZmF6IG5lY2Vzc8OhcmlvIGNvbXBhcsOhLWxvLCBhIHNlZ3VpciBleGVjdXRhcmVtb3MgbyBkaWFnbsOzc3RpY28uIENhc28gcGFzc2Ugbm8gbWVzbW8gcG9kZW1vcyBwcm9jZWRlciBwYXJhIGFuw6FsaXNlLCBlbSBjYXNvIGNvbnRyw6FyaW8gaXJlbW9zIHBhcmEgbm9zc28gcHJpbWVpcm8gdGVzdGUgcmVzZXJ2YSAobWRfYjMpLg0KDQojI2RpYWduw7NzdGljbyBkbyBtb2RlbG8gbWRfZnVsbCAtIHJlcHJvdmFkbw0KDQpwYXJhIHZlcmlmaWNhciBzZSBlc3TDoSB0dWRvIG9rIGNvbSB1bSBtb2RlbG8gc2UgZmF6IG5lY2Vzc8OhcmlvIG9zIHBhc3NvcyBkZSBkaWFnbsOzc3RpY286DQpzw6NvIGVsZXM+DQoxLiBMSU5FQVIgUkVMQVRJT05TSElQUyBCRVRXRUVOIFggQU5EIFkNCg0KMi4gTmVhcmx5IG5vcm1hbCByZXNpZHVhbHMNCg0KMy4gQ29uc3RhbnQgdmFyaWFiaWxpdHkgb2YgcmVzaWR1YWxzDQoNCjQuIElOREVQRU5ERU5DRSBPRiBSRVNJRFVBTFMNCg0KYGBge3J9DQojcGFzc28gMS4gTElORUFSIFJFTEFUSU9OU0hJUFMgQkVUV0VFTiBYIEFORCBZDQpjb2dfZmluYWwgPSBtZF9mdWxsDQojZXNzZSBwYXNzbyBuw6NvIMOpIG5lY2Vzc8OhcmlvIHBvciBuw6NvIGhhdmVyIHZhcmnDoXZlbCBuw7ptZXJpY2EgZGFkYSBjb21vIGV4cGxpY2F0aXZhDQpgYGANCg0KZXNzZSBwYXNzbyBuw6NvIMOpIG5lY2Vzc8OhcmlvIHBvciBuw6NvIGhhdmVyIHZhcmnDoXZlbCBuw7ptZXJpY2EgZGFkYSBjb21vIGV4cGxpY2F0aXZhDQpBYmFpeG8gbyBwYXNzbyAyOg0KDQpgYGB7cn0NCiNwYXNzbyAyLiBOZWFybHkgbm9ybWFsIHJlc2lkdWFscw0KaGlzdChtZF9mdWxsJHJlc2lkdWFscykNCnFxbm9ybShjb2dfZmluYWwkcmVzaWR1YWxzKQ0KcXFsaW5lKGNvZ19maW5hbCRyZXNpZHVhbHMpDQpgYGANCg0KKipTSU5BTCBWRVJNRUxITyoqIG7Do28gw6kgcG9zc8OtdmVsIHVzYXIgbyBtb2RlbG8sIG7Do28gcGFzc291IG5vIHRlc3RlLiAgT3MgdGhlb3JpY2FsIHF1YW50aWxlcyBlc3TDo28gbWFsIGRpc3RyaWJ1w61kb3MuDQpWZW1vcyBvIHF1ZSBkw6Egbm9zIG91dHJvcyBwYXNzb3MNCg0KYGBge3J9DQojcGFzc28gMy4gQ29uc3RhbnQgdmFyaWFiaWxpdHkgb2YgcmVzaWR1YWxzDQpwbG90KGNvZ19maW5hbCRyZXNpZHVhbHMgfiBjb2dfZmluYWwkZml0dGVkKQ0KYGBgDQoNCmFuw6FsaXNlIC0gSURFTSAqKlNpbmFsIHZlcm1lbGhvKioNCg0KYGBge3J9DQojcGFzc28gNC4gSU5ERVBFTkRFTkNFIE9GIFJFU0lEVUFMUw0KcGxvdChjb2dfZmluYWwkcmVzaWR1YWxzKQ0KYGBgDQoNCmNvbmZpcm1hZG8gLSAqKnJlcHJvdmFkbyoqDQoNCnZhbW9zIGZhemVyIGFnb3JhIG8gZGlhZ27Ds3N0aWNvIGRlIG5vc3NvIHByw7N4aW1vIG1vZGVsbzoNCg0KIyMgZGlhZ27Ds3N0aWNvIG1vZGVsbyBtZF9iMw0KDQphbmFsaXNhcmVtb3MgbyBwcmltZWlybyBkbyBiYW5jbyBkZSByZXNlcnZhczogbWRfYjMgLSBub3RhIGZ1dHVyb19icmEgZXhwbGljYWRvIHBvciBjb25oZWNpX3RyYW4gKyBhdmFsaWFfZ2VzdGFvX3RyYW4NCg0KYGBge3J9DQojTmVhcmx5IG5vcm1hbCByZXNpZHVhbHMgZGUgbWRfYjMNCmhpc3QobWRfYjMkcmVzaWR1YWxzKQ0KcXFub3JtKG1kX2IzJHJlc2lkdWFscykNCnFxbGluZShtZF9iMyRyZXNpZHVhbHMpDQpgYGANCg0KTWVzbW8gcHJvYmxlbWEtICoqZGVzY2FydGFkbyoqDQoNCiMjZGlhZ27Ds3N0aWNvIG1vZGVsbyBtZF9iMg0KDQphbmFsaXNhcmVtb3MgbyBzZWd1bmRvIGRvIGJhbmNvIGRlIHJlc2VydmFzOiBtZF9iMiAtIG5vdGEgZnV0dXJvX2JyYSBleHBsaWNhZG8gcG9yIGF2YWxpYV9nZXN0YW9fdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCg0KYGBge3J9DQojTmVhcmx5IG5vcm1hbCByZXNpZHVhbHMgZGUgbWRfYjMNCmhpc3QobWRfYjIkcmVzaWR1YWxzKQ0KcXFub3JtKG1kX2IyJHJlc2lkdWFscykNCnFxbGluZShtZF9iMiRyZXNpZHVhbHMpDQpgYGANCg0KTWVzbW8gcHJvYmxlbWEtICoqZGVzY2FydGFkbyoqDQoNCiMjIGFuYWxpc2UgbW9kZWxvIG1kX2MzDQoNClJlZWxlbWJyYW5kbyBxdWUgbyBtb2RlbG8gbWRfYzMgKG5vdGEgZnV0dXJvX2JyYSBleHBsaWNhZG8gcG9yIGF2YWxpYV9nZXN0YW9fdHJhbikgIG8gcHLDs3hpbW8gZGEgbGlzdGEsIHPDsyB0ZW0gdW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YS4gDQoNCkV4aXN0ZW0gcmVncmFzIGRpZmVyZW50ZXMgZGUgZGlhZ27Ds3N0aWNvIHBhcmEgcmVncmVzc8OjbyBsaW5lYXJlcyBzaW1wbGVzIChjb20gdW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YSk7DQoNClF1YWlzIHPDo28/IC4uLi4NCg0KT3MgdGVzdGVzIHPDo28gc29tZW50ZSAzOg0KDQooMSkgbGluZWFyaXR5LCAoMikgbmVhcmx5IG5vcm1hbCByZXNpZHVhbHMsIGFuZCAoMykgY29uc3RhbnQgdmFyaWFiaWxpdHkuDQoNCmBgYHtyfQ0KI3Bhc3NvIDEgbGluZWFyaXR5DQpnZ3Bsb3QoZGF0YSA9IG1kX2MzLCBhZXMoeCA9IC5maXR0ZWQsIHkgPSAucmVzaWQpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgeGxhYigiRml0dGVkIHZhbHVlcyIpICsNCiAgeWxhYigiUmVzaWR1YWxzIikNCmBgYA0KDQpQYXJlY2UgZGlzdHJpYnXDrWRvIGFsZWF0b3JpYW1lbnRlPyBuYW8gbXVpdG8sIG1hcyB2YW1vcyBvcyBvdXRyb3MgZG9pcyBwYXNzb3MNCg0KYGBge3J9DQojcGFzc28gMiBOZWFybHkgbm9ybWFsIHJlc2lkdWFscyBkZSBtZF9jMw0KZ2dwbG90KGRhdGEgPSBtZF9jMywgYWVzKHggPSAucmVzaWQpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMjUpICsNCiAgeGxhYigiUmVzaWR1YWxzIikNCmBgYA0KTsOjbyBkZXUgYm9hDQoNCsOabHRpbW8gcGFzc28NCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1kX2MzLCBhZXMoc2FtcGxlID0gLnJlc2lkKSkgKw0KICBzdGF0X3FxKCkNCmBgYA0KDQoqKm5hbyBhcHJvdmFkbyoqIHBhcmEgbWRfYzMNCg0KVmFtb3MgcGFyYSBvIHByw7N4aW1vIGRvIGJhbmNvIGRlIHJlc2VydmFzOg0KDQo1LSBtZF9iMSAtIGV4cGxpY2FkbyBwb3IgY29uaGVjaV90cmFuICsgYXZhbGlhX2Jvem9fY292aWQxOSAobGluZWFyIG3Dumx0aXBsYSkNCg0KNi0gbWRfYzIgLSBleHBsaWNhZG8gcG9yIGF2YWxpYV9ib3pvX2NvdmlkMTkgKGxpbmVhciBzaW1wbGVzKQ0KDQo3LSBtZF9jMSAtIGV4cGxpY2FkbyBwb3IgY29uaGVjaV90cmFuICAobGluZWFyIHNpbXBsZXMpDQoNCiMjIGRpYWduw7NzdGljbyBwYXJhIHBvc3PDrXZlbCBtb2RlbG8gbWRfYjENCg0KYGBge3J9DQojTmVhcmx5IG5vcm1hbCByZXNpZHVhbHMgZGUgbWRfYjENCmhpc3QobWRfYjEkcmVzaWR1YWxzKQ0KcXFub3JtKG1kX2IxJHJlc2lkdWFscykNCnFxbGluZShtZF9iMSRyZXNpZHVhbHMpDQpgYGANCioqZGVzY2FydGFkbyoqIHByw7N4aW1vIG1vZGVsbzoNCg0KNi0gbWRfYzIgLSBleHBsaWNhZG8gcG9yIGF2YWxpYV9ib3pvX2NvdmlkMTkgKGxpbmVhciBzaW1wbGVzKQ0KDQo3LSBtZF9jMSAtIGV4cGxpY2FkbyBwb3IgY29uaGVjaV90cmFuICAobGluZWFyIHNpbXBsZXMpDQoNCiMjIGRpYWduw7NzdGljbyBwb3Nzw612ZWwgbW9kZWxvIG1kX2MyIC0+IGV4cGxpY2FkbyBwb3IgYXZhbGlhX2Jvem9fY292aWQxOSAobGluZWFyIHNpbXBsZXMpDQoNCmBgYHtyfQ0KI3Bhc3NvIDEgbGluZWFyaXR5IGRlIG1kX2MyDQpnZ3Bsb3QoZGF0YSA9IG1kX2MyLCBhZXMoeCA9IC5maXR0ZWQsIHkgPSAucmVzaWQpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgeGxhYigiRml0dGVkIHZhbHVlcyIpICsNCiAgeWxhYigiUmVzaWR1YWxzIikNCmBgYA0KDQoNCmBgYHtyfQ0KI3Bhc3NvIDIgTmVhcmx5IG5vcm1hbCByZXNpZHVhbHMgZGUgbWRfYzINCmdncGxvdChkYXRhID0gbWRfYzIsIGFlcyh4ID0gLnJlc2lkKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDI1KSArDQogIHhsYWIoIlJlc2lkdWFscyIpDQpgYGANCg0KQXTDqSBhZ29yYSBuw6NvIGRldSBib2EgLSB2YW1vcyBwYXJhIG8gcGFzc28gMw0KDQpgYGB7cn0NCmdncGxvdChkYXRhID0gbWRfYzIsIGFlcyhzYW1wbGUgPSAucmVzaWQpKSArDQogIHN0YXRfcXEoKQ0KYGBgDQoqKmRlc2NhcnRhZG8qKiBwcsOzeGltbyBtb2RlbG8gZSDDunRsaW1vIG1vZGVsbzoNCg0KNy0gbWRfYzEgLSBleHBsaWNhZG8gcG9yIGNvbmhlY2lfdHJhbiAgKGxpbmVhciBzaW1wbGVzKQ0KDQojIyBkaWFnbsOzc3RpY28gbW9kZWxvIG1kX2MxDQoNCmBgYHtyfQ0KI3Bhc3NvIDEgbGluZWFyaXR5IGRlIG1kX2MxDQpnZ3Bsb3QoZGF0YSA9IG1kX2MyLCBhZXMoeCA9IC5maXR0ZWQsIHkgPSAucmVzaWQpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIpICsNCiAgeGxhYigiRml0dGVkIHZhbHVlcyIpICsNCiAgeWxhYigiUmVzaWR1YWxzIikNCmBgYA0KDQpgYGB7cn0NCiNwYXNzbyAyIE5lYXJseSBub3JtYWwgcmVzaWR1YWxzIGRlIG1kX2MyDQpnZ3Bsb3QoZGF0YSA9IG1kX2MxLCBhZXMoeCA9IC5yZXNpZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyNSkgKw0KICB4bGFiKCJSZXNpZHVhbHMiKQ0KYGBgDQoNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSA9IG1kX2MxLCBhZXMoc2FtcGxlID0gLnJlc2lkKSkgKw0KICBzdGF0X3FxKCkNCmBgYA0KDQoNCk7Do28gZm9pIHBvc3PDrXZlbCAqKm1vZGVsbyBkZXNjYXJ0YWRvKioNCg0KbsOjbyBwb2RlbW9zIHV0aWxpemFyIG5lbmh1bSBtb2RlbG8sIG9zIGRhZG9zIHPDo28gaW5zdWZpY2llbnRlcy4NCg0KDQojIyBhbmFsaXNlIGRvcyBkYWRvcyBkYSByZWdyZXNzw6NvIGVzb2NsaGlkYSBhYmFpeG8gcGFyYSByZXNvbHZlciBxdWVzdMOjbyAyDQoNCk7Do28gZm9pIHBzc8OtdmVsIGZhemVyIGFuYWxpc2UgZGUgcmVncmVzc3PDo28sICwgdW1hIHZleiBxdWUgYXMgcmVncmVzc8O1ZXMgbmHDtSBmb3JhbSBhcHJvdmFkb3Mgbm9zIHRlc3RlcyBkZSBkaWFnbsOzc3RpY28uDQoNCkEgc29sdcOnw6NvIHPDo28gYW7DoWxpc2VzIGRlIGluZmVyw6puY2lhIGNvbSBjYWRhIHVtYSBkYXMgdHLDqnMgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgYWNlcmNhIGRhIHZhcmnDoXZlbCBub3RhIGZ1dHVyb19icmENCg0KIyMgcXVlc3TDo28gZGUgcGVzcXVpc2EgMi4xIC0gaW5mZXLDqm5jaWEgZGUgYXZhbGlhIGdlc3RhbyBleHBsaWNhbmRvIG5vdGFfZnV0dXJvX2JyYQ0KDQoNCmBgYHtyfQ0KYm94cGxvdChzd2Ukbm90YV9mdXR1cm9fYnJhIH4gc3dlJGF2YWxpYV9nZXN0YW9fdHJhbiwgY29sID0gIm9yYW5nZSIsIG1haW49Im5vdGEgZnV0dXJvIGJyYSBlIGF2YWxpYSBnZXN0YW8iLCB5bGFiPSJub3RhIGZ1dCIsIHhsYWI9ImF2YWxpYSBnZXN0YW8iKQ0KYGBgDQoNCkjDoSB1bWEgdmlzw612ZWwgcmVsYcOnw6NvLiBhYmFpeG8gbWFpcyB1bSB0ZXN0ZToNCg0KYGBge3J9DQpzd2UgJT4lDQogIGdyb3VwX2J5KGF2YWxpYV9nZXN0YW9fdHJhbikgJT4lDQogIHN1bW1hcmlzZShtZWFuX25vdGFfZnV0ID0gbWVhbihub3RhX2Z1dHVyb19icmEpKQ0KYGBgDQoNCkNvbSBleGNlc3PDo28gZG8gcGVzc2ltbyBlIGRvIHJ1aW0sIG8gcmVzdG8gc2VndWUgdW0gY2FtaW5oby4gQSBzZWd1aXIgYSBpbmZlcsOqbmNpYSBwcm9wcmlhbWVudGUgZGl0YToNCg0KYGBge3J9DQppbmZlcmVuY2UoeSA9IG5vdGFfZnV0dXJvX2JyYSwgeCA9IGF2YWxpYV9nZXN0YW9fdHJhbiwgZGF0YSA9IHN3ZSwgc3RhdGlzdGljID0gIm1lYW4iLCB0eXBlID0gImh0IiwgbnVsbCA9IDAsIA0KICAgICAgICAgIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBtZXRob2QgPSAidGhlb3JldGljYWwiKQ0KYGBgDQoNCg0KYW5hbGlzZS0gbyBwX3ZhbHVlIG5vcyBkw6Egc2VndXJhbsOnYSBlbSBhZmlybWFyIHF1ZSBow6Egc2lnbmlmY8OibmNpYSBlbnRyZSBhcyB2YXJpw6F2ZWlzICAobWVzbW8gY29tIGVzc2EgZGlmZXJlbsOnYSBlbnRyZSBydWltIGUgcGVzc2ltbykuDQoNCg0KDQojIyBxdWVzdMOjbyBkZSBwZXNxdWlzYSAyLjIgLSBpbmZlcsOqbmNpYSBkZSBjb25oZWNpX3RyYW4gZXhwbGljYW5kbyBub3RhX2Z1dHVyb19icmENCg0KYGBge3J9DQpib3hwbG90KHN3ZSRub3RhX2Z1dHVyb19icmEgfiBzd2UkY29uaGVjaV90cmFuLCBjb2wgPSAib3JhbmdlIiwgbWFpbj0ibm90YSBmdXR1cm8gYnJhIGUgY29uaGVjaS9hY29tcGFuaGEiLCB5bGFiPSJub3RhIGZ1dCIsIHhsYWI9ImNvbmhlYy9hY29tcCIpDQpgYGANCg0KSMOhIHVtYSB2aXPDrXZlbCByZWxhw6fDo28uIGFiYWl4byBtYWlzIHVtIHRlc3RlOg0KDQpgYGB7cn0NCnN3ZSAlPiUNCiAgZ3JvdXBfYnkoY29uaGVjaV90cmFuKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fbm90YV9mdXQgPSBtZWFuKG5vdGFfZnV0dXJvX2JyYSkpDQpgYGANCnBhcmVjZSBvaywgdmFtb3MgcGFyYSBhIGluZmVyw6puY2lhIHByb3ByaWFtZW50ZSBkaXRhDQoNCmBgYHtyfQ0KDQppbmZlcmVuY2UoeSA9IG5vdGFfZnV0dXJvX2JyYSwgeCA9IGNvbmhlY2lfdHJhbiwgZGF0YSA9IHN3ZSwgc3RhdGlzdGljID0gIm1lYW4iLCB0eXBlID0gImh0IiwgbnVsbCA9IDAsIA0KICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3b3NpZGVkIiwgbWV0aG9kID0gInRoZW9yZXRpY2FsIikNCmBgYA0KDQoNCioqRGV1IGJvYS4oYm9tIHAtdmFsdWUpIHRlbSBhc3NvY2lhw6fDo28uKiogDQoNCiMjIHF1ZXN0w6NvIGRlIHBlc3F1aXNhIDIuMyAtIGluZmVyw6puY2lhIGRlIGF2YWxpYV9ib3pvX2NvdmlkMTkgZXhwbGljYW5kbyBub3RhX2Z1dHVyb19icmENCg0KTWVzbW8gcHJvY2VkaW1lbnRvIGRhcyBkdWFzIGFudGVyaW9yZXMuDQoNCmBgYHtyfQ0KYm94cGxvdChzd2Ukbm90YV9mdXR1cm9fYnJhIH4gc3dlJGF2YWxpYV9ib3pvX2NvdmlkMTksIGNvbCA9ICJvcmFuZ2UiLCBtYWluPSJub3RhIGZ1dHVybyBicmEgZSBib3pvIG5vIGNvcm9uYSIsIHlsYWI9Im5vdGEgZnV0IiwgeGxhYj0iYm96byBubyBjb3JvbmdhIikNCmBgYA0KDQpOZXNzZSBjYXNvIG5hbyBwYXJlY2UgaGF2ZXIgdGFvIGZvcnRlLCBjb21vIGrDoSB2aW1vcyBhbnRlcyBvcyB2YWxvcmVzIGRvIGFwcm92YSBzZSBjb25zb2xpZGFtIHBvciB0b2RvcyBhcyBub3Rhcy4NCg0KT3MgcXVlIGRlc2Fwcm92YW0gZGFvIG5vdGFzIG1haXMgYmFpeGFyLCBvcyBxdWUgYXByb3ZhbSBkw6NvIHRvZG9zIG9zIHRpcG9zIGRlIG5vdGFzLg0KDQpWZXJlbW9zIG1haXMgZGFkb3MgYWJhaXhvIHF1ZSBjb3Jyb2JvcmFtIGlzc28gcXVlIGZvaSBkaXRvOg0KDQpgYGB7cn0NCnN3ZSAlPiUNCiAgZ3JvdXBfYnkoYXZhbGlhX2Jvem9fY292aWQxOSkgJT4lDQogIHN1bW1hcmlzZShtZWFuX25vdGFfZnV0ID0gbWVhbihub3RhX2Z1dHVyb19icmEpKQ0KYGBgDQoNCk9rLCBhIGluZmVyw6puY2lhIGEgc2VndWlyOg0KDQpgYGB7cn0NCmluZmVyZW5jZSh5ID0gbm90YV9mdXR1cm9fYnJhLCB4ID0gYXZhbGlhX2Jvem9fY292aWQxOSwgZGF0YSA9IHN3ZSwgc3RhdGlzdGljID0gIm1lYW4iLCB0eXBlID0gImh0IiwgbnVsbCA9IDAsIA0KICAgICAgICAgIGFsdGVybmF0aXZlID0gInR3b3NpZGVkIiwgbWV0aG9kID0gInRoZW9yZXRpY2FsIikNCg0KYGBgDQoNCg0KT3BhIGRldSBib2EuIElzc28gbm9zIGTDoSB1bWEgZXNwZXJhbsOnYSwgYSBzZWd1aXI6DQoNCiMjIFVtYSB0ZW50YXRpdmEgZGVzZXNwZXJhZGEgZGUgcmVncmVzc8OjbyBmdWxsIG1vZGVsIGNvbSBzd2UgDQoNCkZhcmVtb3MgdW1hIMO6bHRpbWEgdGVudGF0aXZhIGRlc2VzcGVyYWRhIGRlIHRlbnRhciBhcyByZWdyZXNzw7VlcyBDT00gVE9ET1MgT1MgVkFMT1JFUyBESVNQT07DjVZFUywgU0VNIENPUlRBUiBOQURBDQoNCmBgYHtyfQ0KbV9mdWxsIDwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+IGF2YWxpYV9nZXN0YW9fdHJhbiArIGNvbmhlY2lfdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTksIGRhdGEgPSBzd2UpDQpzdW1tYXJ5KG1fZnVsbCkNCnJfYWRqX21fZnVsbCA8LSAwLjQyMDgNCmBgYA0KDQpCb20gdmFsb3IgZGUgNDIlLCB0YWx2ZXogbyBlcnJvIHRlbmhhIHNpZG8gY3JpYXIgJ3ExJy4gIFZhbW9zIGFvcyB0ZW1pZG9zIGRpYWduw7NzdGljb3M6DQoNCg0KIyMgdGVzdGVzIGRlIGRpYWdub3N0aWNvIGRlIG1fZnVsbA0KDQpgYGB7cn0NCmhpc3QobV9mdWxsJHJlc2lkdWFscykNCnFxbm9ybShtX2Z1bGwkcmVzaWR1YWxzKQ0KcXFsaW5lKG1fZnVsbCRyZXNpZHVhbHMpDQpwbG90KG1fZnVsbCRyZXNpZHVhbHMgfiBtX2Z1bGwkZml0dGVkKQ0KcGxvdChtX2Z1bGwkcmVzaWR1YWxzKQ0KYGBgDQoNCk8gdGVyY2VpcmEgdGFiZWxhIG5vcyBkYSBzZWd1cmFuw6dhIGRlIHNlZ3VpciBjb20gZXNzZSBtb2RlbG8sIGVtYm9yYSBlbGUgbsOjbyBlc3RlamEgdMOjbyBvay4gZWxlIGVzdMOhIG1haXMgb2sgcXVlIG8gbWRfZnVsbA0KDQpQcmEgZGVzZW5jYXJnbyB2ZXJlbW9zIHNlIGjDoSBhbGd1bSBtb2RlbG8gc2VtICdxMScgcXVlIHRlbSBtYWlvciBSIGFkanVzdGVkIFNxdWFyZS4gDQoNCiMjIHRlc3RhbmRvIG8gUiBhZGp1c3RlZCBTcXVhcmUgY29tIGEgYmFzZSB0b2RhLg0KDQpgYGB7cn0NCiNtb2RlbG9zIGYxLGYyIGUgZjMgY29tIGR1YXMgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMNCiNtb2RlbG8gZjEgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgPSBjb25oZWNpX3RyYW4gKyBhdmFsaWFfYm96b19jb3ZpZDE5DQptZF9mMTwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+ICBjb25oZWNpX3RyYW4gKyBhdmFsaWFfYm96b19jb3ZpZDE5LCBkYXRhID0gc3dlKQ0Kc3VtbWFyeShtZF9mMSkkYWRqLnIuc3F1YXJlZA0KI21vZGVsbyBmMiB2YXJpw6F2ZWlzIGV4cGxpY2F0aXZhcyA9IGF2YWxpYV9nZXN0YW9fdHJhbiArIGF2YWxpYV9ib3pvX2NvdmlkMTkNCm1kX2YyPC0gbG0obm90YV9mdXR1cm9fYnJhIH4gYXZhbGlhX2dlc3Rhb190cmFuICsgYXZhbGlhX2Jvem9fY292aWQxOSwgZGF0YSA9IHN3ZSkNCnN1bW1hcnkobWRfZjIpJGFkai5yLnNxdWFyZWQNCiNtb2RlbG8gZjMgdmFyacOhdmVpcyBleHBsaWNhdGl2YXMgPSBhdmFsaWFfZ2VzdGFvX3RyYW4gKyBjb25oZWNpX3RyYW4NCm1kX2YzIDwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+IGNvbmhlY2lfdHJhbiArIGF2YWxpYV9nZXN0YW9fdHJhbiwgZGF0YSA9IHN3ZSkNCnN1bW1hcnkobWRfZjMpJGFkai5yLnNxdWFyZWQNCiNtb2RlbG9zIGluY2lhZG9zIGNvbSBhIGxldHJhICcnZycnIGNvbSB1bWEgdmFyacOhdmVsIGV4cGxpY2F0aXZhDQojbW9kZWxvIGcxIGNvbSB1bWEgdmFyacOhdmVsIGV4cGxpY2F0aXZhID0gY29uaGVjaV90cmFuDQptZF9nMTwtIGxtKG5vdGFfZnV0dXJvX2JyYSB+ICBjb25oZWNpX3RyYW4sIGRhdGEgPSBzd2UpDQpzdW1tYXJ5KG1kX2cxKSRhZGouci5zcXVhcmVkDQojIG1vZGVsbyBnMiBjb20gdW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YSA9IGF2YWxpYV9ib3pvX2NvdmlkMTkNCm1kX2cyPC0gbG0obm90YV9mdXR1cm9fYnJhIH4gIGF2YWxpYV9ib3pvX2NvdmlkMTksIGRhdGEgPSBzd2UpDQpzdW1tYXJ5KG1kX2cyKSRhZGouci5zcXVhcmVkDQojIG1vZGVsbyBnMyBjb20gdW1hIHZhcmnDoXZlbCBleHBsaWNhdGl2YSA9IGF2YWxpYV9nZXN0YW9fdHJhbg0KbWRfZzM8LSBsbShub3RhX2Z1dHVyb19icmEgfiAgYXZhbGlhX2dlc3Rhb190cmFuLCBkYXRhID0gc3dlKQ0Kc3VtbWFyeShtZF9nMykkYWRqLnIuc3F1YXJlZA0KI3JlbGVtYnJhbmRvIG8gdmFsb3IgZGUgbV9mdWxsDQpyX2Fkal9tX2Z1bGwNCmBgYA0KbmVuaHVtIHZhbG9yIHN1cGVyb3UgbyAwLjQyMDgsIHZhbW9zIGNvbSBlbGUNCg0KIyMgYW5hbGlzYW5kbyBvcyByZXN1bHRhZG9zIG1fZnVsbA0KDQpKw6EgcXVlIG8gbV9mdWxsIGZvaSBlc2NvbGhpZG8oc28gdGVzdGVzIGRpYWduw7NzdGljbyBjb2xvY2FtIGVsZSBubyBsaW1pYXIgZGUgb2sgZSBuw6NvIG9rKSwgdmFtb3MgYW5hbGlzYXIgbyBxdWUgZWxlIG5vcyBkaXo6DQoNCmBgYHtyfQ0Kc3VtbWFyeShtX2Z1bGwpDQpgYGANCg0KYW5hbGlzZSAtIGRldmVtb3MgZW50ZW5kZXIgcXVlIMOpIHVtIGV4ZXJjw61jaW8gZSBvIG8gZGlhZ27Ds3N0aWNvIG7Do28gZm9pIG11aXRvIGJvbQ0KDQpmZWl0YSBlc3NhIHJlc3NhbHZhLCDDqSBwb3Nzw612ZWwgbm90YXIgcHJpbWVpcmFtZW50ZSBxdWUgYXMgY2F0ZWdvcmlhcyBkZSByZWZlcsOqbmNpYSBzw6NvIHBlc3NpbW8sIHBvdWNvIGUgZGVzYXByb3ZhLg0KDQotU29icmUgYSBhdmFsaWHDp8OjbyBnZXN0w6NvIHJ1aW0gbsOjbyDDqSBwb3Nzw612ZWwgZGl6ZXIgbmFkYSAocG9pcyBuw6NvIHBhc3NhIG5vIHRlc3RlIGRlIHNpZywgbsOjbyB0ZW0gYXMgKioqKQ0KDQotU29icmUgYXZhbGlhw6fDo28gZ2VzdMOjbyByZWd1bGFyIMOpIHBvc3PDrXZlbCBkaXplciBhdmFsaWFyIHJlZ3VsYXJtZW50ZSBhbyBpbnbDqXMgZGUgcGVzc2ltYW1lbnRlIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBlbSBjZXJjYSBkZSAxIHBvbnRvIGEgbm90YSBkbyBmdXR1cm8gZG8gQnJhc2lsLg0KDQotQXZhbGlhciBjb21vIGJvbSBhbyBpbnbDqXMgZGUgcGVzc2ltYW1lbnRlIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBlbSBjZXJjYSBkZSAzLjE0IHBvbnRvcyBhIG5vdGEgZG8gZnV0dXJvIGRvIEJyYXNpbC4NCg0KLSBBdmFsaWFyIGNvbW8gw7N0aW1vIGFvIGludsOpcyBkZSBwZXNzaW1hbWVudGUgdGVtIGNvbW8gZXhwZWN0YXRpdmEgbm8gbW9kZWxvIG1lbGhvcmFyIGVtIGNlcmNhIGRlIDYuODcgcG9udG9zIGEgbm90YSBkbyBmdXR1cm8gZG8gQnJhc2lsLg0KDQotIFNlIGRpc3plciBjb25oZWNlZG8wciBlIHF1ZSBhY29tcGFuaGEgbXVpdG8gYSBwb2zDrXRpY2EgIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBhIG5vdGEgZG8gZnV0dXJvIGRvIEJyYXNpbCBlbSAxLjIzMDAzLg0KDQotIGFwcm92YXIgYSBnZXN0w6NvIEJvbHNvbmFkbyBuYSBjb3ZpZC0xOSB0ZW0gY29tbyBleHBlY3RhdGl2YSByZWR1emlyIGEgbm90YSBkbyBmdXR1cm8gZG8gQnJhc2lsIGVtIDMuNDAgcG9udG9zLg0KDQpBIHNlZ3VuZGEgcmVncmVzc8OjbyBjb20gbWFpcyBSIEFkanVzdGVkIGZvaSBtZF9mMywgdmFtb3MgdGVzdMOhLWxhIHRhbWLDqW0gDQoNCiMjIGFuYWxpc2FuZG8gb3MgcmVzdWx0YWRvcyBtZF9mMw0KDQpPcyBwbG90cyBkbyBkaWFnbsOzc3RpY28gZGUgbWRfZjMgc8OjbyB1bSBwb3VjbyBtZWxob3JlcyBxdWUgZW0gbV9mdWxsIHZlamEgYWJhaXhvDQoNCmBgYHtyfQ0KaGlzdChtZF9mMyRyZXNpZHVhbHMpDQpxcW5vcm0obWRfZjMkcmVzaWR1YWxzKQ0KcXFsaW5lKG1kX2YzJHJlc2lkdWFscykNCnBsb3QobWRfZjMkcmVzaWR1YWxzIH4gbWRfZjMkZml0dGVkKQ0KcGxvdChtZF9mMyRyZXNpZHVhbHMpDQpgYGANCg0KUG9ydGFudG8gY2FiZSB0YW1iw6ltIGFuYWxpc8OhLWxvIChkYWRvIHNldSBhbHRvIFIgYWRqdXN0ZWQpDQpgYGB7cn0NCnN1bW1hcnkobWRfZjMpDQpgYGANCg0KLSBzZSBkaXN6ZXIgY29uaGVjZWRvciBlIHF1ZSBhY29tcGFuaGEgbXVpdG8gYSBwb2zDrXRpY2EgIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBhIG5vdGEgZG8gZnV0dXJvIGRvIEJyYXNpbCBlbSAxLjEwLg0KDQotU29icmUgYSBhdmFsaWHDp8OjbyBnZXN0w6NvIHJ1aW0gbsOjbyDDqSBwb3Nzw612ZWwgZGl6ZXIgbmFkYSAocG9pcyBuw6NvIHBhc3NhIG5vIHRlc3RlIGRlIHNpZywgbsOjbyB0ZW0gYXMgKioqKQ0KDQotU29icmUgYXZhbGlhw6fDo28gZ2VzdMOjbyByZWd1bGFyIMOpIHBvc3PDrXZlbCBkaXplciBhdmFsaWFyIHJlZ3VsYXJtZW50ZSBhbyBpbnbDqXMgZGUgcGVzc2ltYW1lbnRlIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBlbSBjZXJjYSBkZSAxIHBvbnRvIGEgbm90YSBkbyBmdXR1cm8gZG8gQnJhc2lsLg0KDQotQXZhbGlhciBjb21vIGJvbSBhbyBpbnbDqXMgZGUgcGVzc2ltYW1lbnRlIHRlbSBjb21vIGV4cGVjdGF0aXZhIG5vIG1vZGVsbyBtZWxob3JhciBlbSBjZXJjYSBkZSAyLjQyIHBvbnRvcyBhIG5vdGEgZG8gZnV0dXJvIGRvIEJyYXNpbC4NCg0KLSBBdmFsaWFyIGNvbW8gw7N0aW1vIGFvIGludsOpcyBkZSBwZXNzaW1hbWVudGUgdGVtIGNvbW8gZXhwZWN0YXRpdmEgbm8gbW9kZWxvIG1lbGhvcmFyIGVtIGNlcmNhIGRlIDQuNTEgcG9udG9zIGEgbm90YSBkbyBmdXR1cm8gZG8gQnJhc2lsLg0KDQoNCg0KIyMgcXVlc3TDo28gZGUgcGVxdWlzYSAyIC0gcHJlZGnDp8OjbyBlbSBtX2Z1bGwgZSBtZF9mMw0KDQp2YW1vcyBjcmlhciB0csOqcyBwZXJzb25hZ2VuczogbyBib2xzb25hcmlzdGEsIG8gY3JpdGljbyBlIG8gbmV1dHJvIGFiYWl4byBtYWlzIGluZm9zOg0KDQojI1ZhbW9zIHByZXZlciBxdWUgbm90YSBkYXJpYSB1bSBhcG9pYWRvciBmb3J0ZSBkZSBCb2xzb25hcm8gDQpWYW1vcyBwcmV2ZXIgcXVlIG5vdGEgZGFyaWEgdW0gYXBvaWFkb3IgZm9ydGUgZGUgQm9sc29uYXJvIChhdmFsaWEgY29tbyDDs3RpbW8gYSBnZXN0w6NvLCBhY29tcGFuaGEgbXVpdG8gZSBhcHJvdmEgYSBnZXN0w6NvIGNvdmlkKQ0KDQpWYW1vcyBjaGFtw6EtbG8gZGUgKipib2xzb25hcmlzdGEqKg0KDQpgYGB7cn0NCm5ld2RhdGExIDwtIGRhdGEuZnJhbWUoYXZhbGlhX2dlc3Rhb190cmFuID0gIm90aW1vIiwgY29uaGVjaV90cmFuID0gIm11aXRvIiwgYXZhbGlhX2Jvem9fY292aWQxOSA9ICJhcHJvdmEiKQ0KDQpib2xzb25hcmlzdGEgPC0gcm91bmQocHJlZGljdChtX2Z1bGwsIG5ld2RhdGExKSwgZGlnaXQgPSAwKQ0KDQpjKGJvbHNvbmFyaXN0YSAsIG5ld2RhdGExJG5vdGFfZnV0dXJvX2JyYSkNCmBgYA0KICoqYSBub3RhIHByZXZpc3RhIGRvIGJvbHNvbmFyaXN0YSDDqSA4KiouDQogDQogdmFtb3MgYW1wbGlhciBvIGVzY29wbyBjb20gaW50ZXJ2YWxvIGRlIDk1JSBkZSBjb25maWFuw6dhDQpgYGB7cn0NCnByZWRpY3QobV9mdWxsLCBuZXdkYXRhMSwgaW50ZXJ2YWwgPSAncHJlZGljdGlvbicsIGxldmVsID0gMC45NSkNCmBgYA0KIA0KIGVudHJlIDMsODggZSAxMC4gKHRlbW9zIDk1JSBkZSBjb25maWFuw6dhIHF1ZSBuw6NvIGRhcsOhIG1lbm9zIHF1ZSAzLDg4IHBhcmEgbyBmdXR1cm8gZG8gYnJhc2lsKQ0KIA0KDQojI1ZhbW9zIHByZXZlciBxdWUgbm90YSBkYXJpYSB1bSBjcsOtdGljbyBmb3J0ZSBkZSBCb2xzb25hcm8NClZhbW9zIHByZXZlciBxdWUgbm90YSBkYXJpYSB1bSBjcsOtdGljbyBmb3J0ZSBkZSBCb2xzb25hcm8gKGF2YWxpYSBjb21vIHDDqXNzaW1vIGEgZ2VzdMOjbywgYWNvbXBhbmhhIG11aXRvIGUgcmVwcm92YSBhIGdlc3TDo28gY292aWQpDQoNClZhbW9zIGNoYW3DoS1sbyBkZSAqKmNyw610aWNvKioNCg0KYGBge3J9DQoNCm5ld2RhdGEyIDwtIGRhdGEuZnJhbWUoYXZhbGlhX2dlc3Rhb190cmFuID0gInBlc3NpbW8iLCBjb25oZWNpX3RyYW4gPSAibXVpdG8iLCBhdmFsaWFfYm96b19jb3ZpZDE5ID0gImRlc2Fwcm92YSIpDQoNCmNyaXRpY28gPC0gcm91bmQocHJlZGljdChtX2Z1bGwsIG5ld2RhdGEyKSwgZGlnaXQgPSAwKQ0KDQpjKGNyaXRpY28gLCBuZXdkYXRhMiRub3RhX2Z1dHVyb19icmEpDQpgYGANCioqYSBub3RhIHByZXZpc3RhIGRvIGNyw610aWNvIMOpIDQqKg0KDQpgYGB7cn0NCnByZWRpY3QobV9mdWxsLCBuZXdkYXRhMiwgaW50ZXJ2YWwgPSAncHJlZGljdGlvbicsIGxldmVsID0gMC45NSkNCmBgYA0KbyBpbnRlcnZhbG8gY29tIDk1JSBERSBDT05GSUFOw4dBIMOJIDAuNDMgRSA4LjI3IC0gVEVNT1MgOTUlIERFIENFUlRFWkEgUVVFIE7Dg08gREFSw4EgTUFJUyA4LjI3IFBBUkEgTyBGVVRVUk8gRE8gQlJBU0lMLg0KDQojI1ZhbW9zIHByZXZlciB1bSBxdWUgYWNvbXBhbmhhIHBvdWNvLCBhdmFsaWEgcmVndWxhciBlIG5hbyB0ZW0gb3BpbmnDo28gc29icmUgYSBjb3ZpZA0KVmFtb3MgcHJldmVyIHVtIHF1ZSBhY29tcGFuaGEgcG91Y28sIGF2YWxpYSByZWd1bGFyIGUgbmFvIHRlbSBvcGluacOjbyBzb2JyZSBhIGNvdmlkDQoNClZhbW9zIGNoYW3DoS1sbyBkZSAqKm5ldXRybyoqIGUgdXNhciBtZF9mMw0KDQpgYGB7cn0NCm5ld2RhdGEzIDwtIGRhdGEuZnJhbWUoYXZhbGlhX2dlc3Rhb190cmFuID0gInJlZ3VsYXIiLCBjb25oZWNpX3RyYW4gPSAicG91Y28iKQ0KDQpuZXV0cm8gPC0gcm91bmQocHJlZGljdChtZF9mMywgbmV3ZGF0YTMpLCBkaWdpdCA9IDApDQoNCmMobmV1dHJvICwgbmV3ZGF0YTMkbm90YV9mdXR1cm9fYnJhKQ0KYGBgDQoNClByZXZpc8OjbyBkZSBub3RhIDQNCg0KYGBge3J9DQpwcmVkaWN0KG1kX2YzLCBuZXdkYXRhMiwgaW50ZXJ2YWwgPSAncHJlZGljdGlvbicsIGxldmVsID0gMC45NSkNCmBgYA0KZW50cmUgMC4zMSBlIDgsMjUNCg0KDQojIyBDb25jbHVzw6NvLg0KDQpFbSByZWxhw6fDo28gYSBwZXJndW50YSAxLCBIw6EgYXNzb2NpYcOnw6NvDQoNCkVtIHJlbGHDp8OjbyBhIHBlcmd1bnRhIDIsIMOpIHNlZ3VybyBhZmltYXIgcXVlIG5vdGFfZnV0dXJvIMOpIGV4cGxpY2FkbyBwb3IgDQpubyBlbnRhbnRvLCBjb21vIG7Do28gZm9pIHBvc3PDrXZlbCByb2RhciBhcyByZWdyZXNzw7VlcyBjb20gMTAwJSBkZSBzZWd1cmHDp2EsIG7Do28gw6kgcG9zc8OtdmVsIGRpemVyIGNvbSBzZWd1cmFuw6dhIGEgaW50ZW5zaWRhZGUuDQoNClNlIGFjZWl0YXJtb3MgcXVlIG9zIG1vZGVsbyBtX2Z1bGwgZSBtZF9mMyBlc3TDo28gb2sgLShwb2RlLXNlIGRpemVyIHF1ZSBlc3TDo28gbm8gbGltaWFyKSwgIGFzIGNvbmNsdXPDtWVzIGVzdMOjbyBwcmVzZW50ZXMgbmEgYW7DoWxpc2UgKiphbmFsaXNlIGRhIHJlZ3Jlc3PDo28gbV9mdWxsIGUgbWRfZjMqKg0KDQpDb25jbHVpbW9zIHRhbWLDqW0gZGl6ZW5kbyBxdWUgcXVlIHNlIHByZXbDqiBxdWUgb3MgYm9sc29uYXJpc3RhcyBzZWphbSBtYWlzIG90aW1pc3RhcyBxdWUgb3MgbmV1dHJvcyBlICBjcsOtdGljb3MuDQo=