Análise de Sobrevivência - Projeto 02

1 Modelos de regressão

1.1 Descrição do estudo e das variáveis

library(readr)
library(survival)
library(flexsurv)
library(knitr)
library(ggplot2)
library(RColorBrewer)
library(pacman)
library(tidyverse)
library(scales)
pacman::p_load(knitr, captioner, bundesligR, stringr)

table_nums <- captioner::captioner(prefix = "Tabela")
tab.1_cap <- table_nums(name = "tab_1", 
                         caption = "Descrição das variáveis da base de dados")
Drogas_SP <- read_csv("Drogas-SP.csv")[,-5]
  • Os dados são provenientes da Pesquisa Nacional de Saúde do Escolar (PeNSE) de 2015, conduzida pelo IBGE, e se referem ao tempo até a experimentação de drogas ilícitas em uma amostra de estudantes do 9º ano do ensino fundamental de escolas privadas da cidade de São Paulo.

  • Objetivo: modelar o tempo até a experimentação de drogas ilícitas utilizando técnicas de análise de sobrevivência.


Tabela 1: Descrição das variáveis da base de dados


desc_variaveis <- data.frame(Variável = colnames(Drogas_SP),
                             Renomeando = c("tempo",
                                             "censura",
                                             "sexo",
                                             "cor_raca", 
                                             "mora_mae",
                                             "tempo_livre_responsaveis",
                                             "bebida_alcoolica",
                                             "cigarro",
                                             "responsavel_fuma",
                                             "sentido_sozinho",
                                             "amigos_drogas"),
                             Descrição = c("Tempo até o primeiro uso de drogas ilícitas, como: maconha, cocaína, crack, loló, lança-perfume, ecstasy, oxy, etc (variável resposta)",
                                           "Indicador de censura ",
                                           "Qual é o seu sexo?",
                                           "Qual é a sua cor ou raça? ",
                                           "Você mora com sua mãe? ",
                                           "NOS ÚLTIMOS 30 DIAS, com que frequência seus pais ou responsáveis sabiam realmente o que você estava fazendo em seu tempo livre? ",
                                           "Alguma vez na vida você tomou uma dose de bebida alcoólica? (Uma dose equivale a uma lata de cerveja ou uma taça de vinho ou uma dose de cachaça ou uísque etc) ",
                                           "Alguma vez na vida, você já fumou cigarro, mesmo uma ou duas tragadas? ",
                                           "Algum de seus pais ou responsáveis fuma? ",
                                           "NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)? ",
                                           "Quantos amigos seus usam drogas? "),
                             
                             Categorias =c("-","0=censura e 1=falha","1=Masculino e 2=Feminino","1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena e  99=Não informado","1=Sim, 2=Não e 99=Não informado","1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre e 99=Não informado","1=Sim, 2=Não e 99=Não informado", "1=Sim, 2=Não e 99=Não informado","1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado","1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes, 5=Sempre e 99=Não informado","1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei e 99=Não informado"))

knitr::kable(desc_variaveis)
Variável Renomeando Descrição Categorias
Tempo tempo Tempo até o primeiro uso de drogas ilícitas, como: maconha, cocaína, crack, loló, lança-perfume, ecstasy, oxy, etc (variável resposta) -
Censura censura Indicador de censura 0=censura e 1=falha
VB01001 sexo Qual é o seu sexo? 1=Masculino e 2=Feminino
VB01002 cor_raca Qual é a sua cor ou raça? 1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena e 99=Não informado
VB01006 mora_mae Você mora com sua mãe? 1=Sim, 2=Não e 99=Não informado
VB07002 tempo_livre_responsaveis NOS ÚLTIMOS 30 DIAS, com que frequência seus pais ou responsáveis sabiam realmente o que você estava fazendo em seu tempo livre? 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre e 99=Não informado
VB05002 bebida_alcoolica Alguma vez na vida você tomou uma dose de bebida alcoólica? (Uma dose equivale a uma lata de cerveja ou uma taça de vinho ou uma dose de cachaça ou uísque etc) 1=Sim, 2=Não e 99=Não informado
VB04001 cigarro Alguma vez na vida, você já fumou cigarro, mesmo uma ou duas tragadas? 1=Sim, 2=Não e 99=Não informado
VB04006A responsavel_fuma Algum de seus pais ou responsáveis fuma? 1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado
VB12001 sentido_sozinho NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)? 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes, 5=Sempre e 99=Não informado
VB06006 amigos_drogas Quantos amigos seus usam drogas? 1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei e 99=Não informado
colnames(Drogas_SP)<- c("tempo",
                        "censura",
                        "sexo",
                        "cor_raca",
                        "mora_mae",
                        "tempo_livre_responsaveis",
                        "bebida_alcoolica",
                        "cigarro",
                        "responsavel_fuma",
                        "sentido_sozinho",
                        "amigos_drogas")
  • A base de dados é composta por 445 observações e 13 variáveis: as 9 covariáveis e a variável resposta que é representada pelo tempo até o primeiro uso de drogas ilícitas e uma variável indicadora de ocorrência de censura.

  • Observação: a variável V0007 foi removida da base por não conter descrição e conter somente uma categoria (2).

1.2 Estimação de S(t) por Kaplan-Meier para cada uma das covariáveis

Drogas_SP <- Drogas_SP %>% mutate(sexo_cat = ifelse(sexo==1,"Masculino","Feminino"),
                                  cor_raca_cat = ifelse(cor_raca ==1, "Branca",ifelse(cor_raca==2,"Preta",ifelse(cor_raca==3,"Amarela",ifelse(cor_raca==4,"Parda","Indígena")))),
                                  mora_mae_cat = ifelse(mora_mae == 1,"Sim","Não"),
                                    tempo_livre_responsaveis_cat = ifelse(tempo_livre_responsaveis==1,"Nunca",ifelse(tempo_livre_responsaveis==2,"Raramente",ifelse(tempo_livre_responsaveis==3,"Às vezes",ifelse(tempo_livre_responsaveis==4,"Na maior parte do tempo","Sempre")))),
                                  bebida_alcoolica_cat = ifelse(bebida_alcoolica==1,"Sim","Não"),
                                  cigarro_cat = ifelse(cigarro==1,"Sim","Não"),
                                  responsavel_fuma_cat = ifelse(responsavel_fuma==1,"Nenhum deles",ifelse(responsavel_fuma==2,"Só meu pai ou responsável do sexo masculino",ifelse(responsavel_fuma==3,"Só minha mãe ou responsável do sexo feminino",ifelse(responsavel_fuma==4,"Meu pai e minha mãe ou responsáveis",ifelse(responsavel_fuma==5,"Não sei","Não informado"))))),
                                  sentido_sozinho_cat = ifelse(sentido_sozinho==1,"Nunca",ifelse(sentido_sozinho==2,"Raramente",ifelse(sentido_sozinho==3,"Às vezes",ifelse(sentido_sozinho==4,"Na maioria das vezes","Sempre")))),
                                  amigos_drogas_cat = ifelse(amigos_drogas == 1,"Nenhum",ifelse(amigos_drogas==2,"Poucos",ifelse(amigos_drogas==3,"Alguns",ifelse(amigos_drogas==4,"A maioria",ifelse(amigos_drogas==5,"Todos","Não sei"))))))

tempos<- Drogas_SP$tempo
cens<-Drogas_SP$censura


ekmV1<-survfit(Surv(tempos,cens)~Drogas_SP$sexo_cat)
ekmV2<-survfit(Surv(tempos,cens)~Drogas_SP$cor_raca_cat)
ekmV3<-survfit(Surv(tempos,cens)~Drogas_SP$mora_mae_cat)
ekmV4<-survfit(Surv(tempos,cens)~Drogas_SP$tempo_livre_responsaveis_cat)
ekmV5<-survfit(Surv(tempos,cens)~Drogas_SP$bebida_alcoolica_cat)
ekmV6<-survfit(Surv(tempos,cens)~Drogas_SP$cigarro_cat)
ekmV7<-survfit(Surv(tempos,cens)~Drogas_SP$responsavel_fuma_cat)
ekmV8<-survfit(Surv(tempos,cens)~Drogas_SP$sentido_sozinho_cat)
ekmV9<-survfit(Surv(tempos,cens)~Drogas_SP$amigos_drogas_cat )


plot(ekmV1,lty=c(1,2),xlab="Tempo (anos)",ylab="S(t) estimada",main="sexo")
legend("bottomleft",lty=c(1,2),c("Feminino","Masculino"),lwd=1,bty="n")

- A partir dos 15 anos, a curva de sobrevivência do sexo feminino possui queda abrupta, ficando abaixo da curva do sexo masculino. Isso nos diz que a partir dessa idade, as probabilidades de sobrevivência para o sexo feminino são inferiores às probabilidades de sobrevivência do sexo masculino

plot(ekmV2,lty=c(1,2,3,4,5),xlab="Tempo (anos)",ylab="S(t) estimada",main="cor_raca", col=c(1,2,3,4,5))
legend("bottomleft",lty=c(1,2,3,4,5),c("Amarela","Branca","Indígena","Parda","Preta"),lwd=1,bty="n", col=c(1,2,3,4,5))

- A curva de sobrevivência por Kaplan-Meier da cor branca é a primeira a apresentar queda na probabilidade de sobrevivência.

plot(ekmV3,lty=c(1,2),xlab="Tempo (anos)",ylab="S(t) estimada",main="mora_mae")
legend("bottomleft",lty=c(1,2),c("Não","Sim"),lwd=1,bty="n")

  • A diferença entre as probabilidades de sobrevivência dos estudantes que não moram com a mãe e dos que moram com a mãe é maior ao se aproximar dos 15 anos.
plot(ekmV4,lty=c(1,2,3,4,5),xlab="Tempo (anos)",ylab="S(t) estimada",main="tempo_livre_responsaveis",col=c(1,2,3,4,5))
legend("bottomleft",lty=c(1,2,3,4,5),c("Às vezes","Na maior parte do tempo","Nunca","Raramente","Sempre"),lwd=1,bty="n",col=c(1,2,3,4,5))

  • As curvas de sobrevivência das categorias Às vezes, Na maior parte do tempo e Sempre ficam acima das curvas das categorias Nunca e Raramente em grande parte dos anos.
plot(ekmV5,lty=c(1,2),xlab="Tempo (anos)",ylab="S(t) estimada",main="bebida_alcoolica")
legend("bottomleft",lty=c(1,2),c("Não","Sim"),lwd=1,bty="n")

- A curva de sobrevivência dos estudantes que alguma vez na vida você tomaram uma dose de bebida alcoólica possui mais falhas, bem como decai mais cedo e rapidamente que a curva dos estudantes que não tomaram.

  • As probabilidades de sobrevivência para os estudantes que tomaram bebida alcóolica é menor.
plot(ekmV6,lty=c(1,2),xlab="Tempo (anos)",ylab="S(t) estimada",main="cigarro")
legend("bottomleft",lty=c(1,2),c("Não","Sim"),lwd=1,bty="n")

  • A curva de sobrevivência dos estudantes que alguma vez na vida você fumaram cigarro possui mais falhas decai mais rapidamente que a curva dos estudantes que não fumaram. As probabilidades de sobrevivência para os estudantes que tomaram bebida alcóolica é menor.
plot(ekmV7,lty=c(1,2,3,4,5,6),xlab="Tempo (anos)",ylab="S(t) estimada",main="responsavel_fuma", col=c(1,2,3,4,5,6))
legend("bottomleft",lty=c(1,2,3,4,5,6),c("Meu pai e minha mãe ou responsáveis","Não informado","Não sei","Nenhum deles","Só meu pai ou responsável do sexo masculino","Só minha mãe ou responsável do sexo feminino"),lwd=1,bty="n", col=c(1,2,3,4,5,6))

- As menores probabilidades de sobrevivência são observadas para os estudantes que não sabem se o responsável fuma, seguido dos estudantes que declararam que só a mãe ou responsável do sexo feminino fuma.

plot(ekmV8,lty=c(1,2,3,4,5),xlab="Tempo (anos)",ylab="S(t) estimada",main="sentido_sozinho", col=c(1,2,3,4,5))
legend("bottomleft",lty=c(1,2,3,4,5),c("Às vezes","Na maioria das vezes","Nunca","Raramente","Sempre"),lwd=1,bty="n", col=c(1,2,3,4,5))

  • As curvas dos estudantes que declararam que nos últimos 12 meses se sentiram sozinhos sempre ou na maioria das vezes estão abaixo das demais, o que indica menores probabilidades de sobrevivência.
plot(ekmV9,lty=c(1,2,3,4,5),xlab="Tempo (anos)",ylab="S(t) estimada",main="amigos_drogas", col=c(1,2,3,4,5))
legend("bottomleft",lty=c(1,2,3,4,5),c("A maioria","Alguns","Não sei","Nenhum","Poucos"),lwd=1,bty="n", col=c(1,2,3,4,5))

- A curva de sobrevivência dos estudantes que declararam que a maioria dos amigos usam drogas destoa das demais, possuindo queda abrupta.

1.3 Teste Logrank para cada uma das covariáveis

logrank1 <- survdiff(Surv(tempos,cens)~Drogas_SP$sexo_cat,rho=0)
logrank2 <- survdiff(Surv(tempos,cens)~Drogas_SP$cor_raca_cat,rho=0)
logrank3 <- survdiff(Surv(tempos,cens)~Drogas_SP$mora_mae_cat,rho=0)
logrank4 <- survdiff(Surv(tempos,cens)~Drogas_SP$tempo_livre_responsaveis_cat,rho=0)
logrank5 <- survdiff(Surv(tempos,cens)~Drogas_SP$bebida_alcoolica_cat,rho=0)
logrank6 <- survdiff(Surv(tempos,cens)~Drogas_SP$cigarro_cat,rho=0)
logrank7 <- survdiff(Surv(tempos,cens)~Drogas_SP$responsavel_fuma_cat,rho=0)
logrank8 <- survdiff(Surv(tempos,cens)~Drogas_SP$sentido_sozinho_cat,rho=0)
logrank9 <- survdiff(Surv(tempos,cens)~Drogas_SP$amigos_drogas_cat,rho=0)

lr_pv = data.frame(
  Covariaveis = c("sexo",
 "cor_raca",
 "mora_mae",
 "tempo_livre_respon",
 "bebida_alcoolica",
 "cigarro",
 "responsavel_fuma",
 "sentido_sozinho" ,
 "amigos_drogas"),
                       "P-Valores"= round(c(1-pchisq(logrank1$chisq,1),
                                      1-pchisq(logrank2$chisq,4),
                                      1-pchisq(logrank3$chisq,1),
                                      1-pchisq(logrank4$chisq,4),
                                      1-pchisq(logrank5$chisq,1),
                                      1-pchisq(logrank6$chisq,1),
                                      1-pchisq(logrank7$chisq,5),
                                      1-pchisq(logrank8$chisq,4),
                                      1-pchisq(logrank9$chisq,4)),4), 
Categorias=c("1=Masculino e 2=Feminino",
             "1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena",
             "1=Sim, 2=Não",
             "1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre",
             "1=Sim, 2=Não", 
             "1=Sim, 2=Não",
             "1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado",
             "1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes, 
             5=Sempre",
             "1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei"),
Resultado = ifelse(c(1-pchisq(logrank1$chisq,1),
                                      1-pchisq(logrank2$chisq,4),
                                      1-pchisq(logrank3$chisq,1),
                                      1-pchisq(logrank4$chisq,4),
                                      1-pchisq(logrank5$chisq,1),
                                      1-pchisq(logrank6$chisq,1),
                                      1-pchisq(logrank7$chisq,5),
                                      1-pchisq(logrank8$chisq,4),
                                      1-pchisq(logrank9$chisq,4))<=0.1,"Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável","Ao nível de significancia de 0.1, não rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável"))
                      
knitr::kable(lr_pv,col.names =c("Covariáveis","P-valores", "Categorias","Resultados"))
Covariáveis P-valores Categorias Resultados
sexo 0.5581 1=Masculino e 2=Feminino Ao nível de significancia de 0.1, não rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
cor_raca 0.9660 1=Branca, 2=Preta, 3=Amarela, 4=Parda, 5=Indígena Ao nível de significancia de 0.1, não rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
mora_mae 0.6251 1=Sim, 2=Não Ao nível de significancia de 0.1, não rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
tempo_livre_respon 0.0036 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maior parte do tempo, 5=Sempre Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
bebida_alcoolica 0.0000 1=Sim, 2=Não Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
cigarro 0.0000 1=Sim, 2=Não Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
responsavel_fuma 0.3852 1=Nenhum deles, 2=Só meu pai ou responsável do sexo masculino, 3=Só minha mãe ou responsável do sexo feminino, 4=Meu pai e minha mãe ou responsáveis, 5=Não sei e 99=Não informado Ao nível de significancia de 0.1, não rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
sentido_sozinho 0.0090 1=Nunca, 2=Raramente, 3=Às vezes, 4=Na maioria das vezes,
5=Sempre Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável
amigos_drogas 0.0000 1=Nenhum, 2=Poucos, 3=Alguns, 4=A maioria, 5=Todos, 6=Não sei Ao nível de significancia de 0.1, rejeitamos a hipótese nula
de igualdade entre as curvas de sobrevivência das categorias da variável

1.4 Seleção de covariáveis para o modelo

1.4.1 Passo 1

  • Passo 1: Ajustar modelos de regressão univariados usando a distribuição Gama Generalizada
Drogas_SP_reg <- Drogas_SP %>%  mutate (V1 = as.factor(sexo),
                                        V2 = as.factor(cor_raca),
                                        V3 = as.factor(mora_mae),
                                        V4 = as.factor(tempo_livre_responsaveis),
                                        V5 = as.factor(bebida_alcoolica),
                                        V6 = as.factor(cigarro),
                                        V7 = as.factor(responsavel_fuma),
                                        V8 = as.factor(sentido_sozinho),
                                        V9 = as.factor(amigos_drogas)) %>% 
  select(tempo, censura, V1,V2,V3,V4,V5,V6,V7,V8,V9)

m0<-flexsurvreg(formula=Surv(tempo,censura)~1,dist='gengamma',data=Drogas_SP) #modelo nulo

m1<-flexsurvreg(formula=Surv(tempo,censura)~V1,dist='gengamma',data=Drogas_SP_reg) #modelo com V1
m2<-flexsurvreg(formula=Surv(tempo,censura)~V2,dist='gengamma',data=Drogas_SP_reg) #modelo com V2
m3<-flexsurvreg(formula=Surv(tempo,censura)~V3,dist='gengamma',data=Drogas_SP_reg) #modelo com V3
m4<-flexsurvreg(formula=Surv(tempo,censura)~V4,dist='gengamma',data=Drogas_SP_reg) #modelo com V4
m5<-flexsurvreg(formula=Surv(tempo,censura)~V5,dist='gengamma',data=Drogas_SP_reg) #modelo com V5
m6<-flexsurvreg(formula=Surv(tempo,censura)~V6,dist='gengamma',data=Drogas_SP_reg) #modelo com V6
m7<-flexsurvreg(formula=Surv(tempo,censura)~V7,dist='gengamma',data=Drogas_SP_reg) #modelo com V7
m8<-flexsurvreg(formula=Surv(tempo,censura)~V8,dist='gengamma',data=Drogas_SP_reg) #modelo com V8
m9<-flexsurvreg(formula=Surv(tempo,censura)~V9,dist='gengamma',data=Drogas_SP_reg) #modelo com V9

TRV1=2*(m1$loglik-m0$loglik)
TRV2=2*(m2$loglik-m0$loglik)
TRV3=2*(m3$loglik-m0$loglik)
TRV4=2*(m4$loglik-m0$loglik)
TRV5=2*(m5$loglik-m0$loglik)
TRV6=2*(m6$loglik-m0$loglik)
TRV7=2*(m7$loglik-m0$loglik)
TRV8=2*(m8$loglik-m0$loglik)
TRV9=2*(m9$loglik-m0$loglik)


selecao1 <- data.frame(Modelo=c("Nulo","V1: sexo","V2: cor_raca","V3: mora_mae","V4: tempo_livre_responsaveis","V5: bebida_alcoolica","V6: cigarro","V7: responsavel_fuma","V8: sentido_sozinho","V9: amigos_drogas"),
                       TRV = c("-",round(c(TRV1,TRV2,TRV3,TRV4,TRV5,TRV6,TRV7,TRV8,TRV9),4)),
                       pvalor = c("-", round(c(1-pchisq(TRV1,df=1), 1-pchisq(TRV2,df=1), 1-pchisq(TRV3,df=1), 1-pchisq(TRV4,df=1), 1-pchisq(TRV5,df=1), 1-pchisq(TRV6,df=1), 1-pchisq(TRV7,df=1), 1-pchisq(TRV8,df=1), 1-pchisq(TRV9,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV1,df=1), 1-pchisq(TRV2,df=1), 1-pchisq(TRV3,df=1), 1-pchisq(TRV4,df=1), 1-pchisq(TRV5,df=1), 1-pchisq(TRV6,df=1), 1-pchisq(TRV7,df=1), 1-pchisq(TRV8,df=1), 1-pchisq(TRV9,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao1)
Modelo TRV pvalor Significancia
Nulo - - -
V1: sexo 0.5913 0.4419 Ao nível de 10%, NÃO É significativa
V2: cor_raca 0.6609 0.4162 Ao nível de 10%, NÃO É significativa
V3: mora_mae 0.0393 0.8429 Ao nível de 10%, NÃO É significativa
V4: tempo_livre_responsaveis 15.8959 1e-04 Ao nível de 10%, É significativa
V5: bebida_alcoolica 41.9055 0 Ao nível de 10%, É significativa
V6: cigarro 71.8734 0 Ao nível de 10%, É significativa
V7: responsavel_fuma 3.7302 0.0534 Ao nível de 10%, É significativa
V8: sentido_sozinho 10.8572 0.001 Ao nível de 10%, É significativa
V9: amigos_drogas 89.3055 0 Ao nível de 10%, É significativa

1.4.2 Passo 2

  • Passo 2: Ajustar conjuntamente todas as cováriaveis significativas ao nível de significância de \(0.1\) no passo anterior e, em seguida, ajustar modelos reduzidos eliminando uma covariável de cada vez.

  • Ao nível de significância de \(0.1\), as covariáveis significativas no passo 1 foram tempo_livre_responsaveis (V4), bebida_alcoolica (V5), cigarro (V6), responsavel_fuma(V7), sentido_sozinho (V8) e amigos_drogas (V9). Portanto, estas covariáveis compõem o modelo completo.

m.comp <-flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V6+V7+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo completo
m.1 <- flexsurvreg(formula=Surv(tempo,censura)~V5+V6+V7+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V4
m.2 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V7+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V5
m.3 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V7+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V6
m.4 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V7
m.5 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V6+V7+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V8
m.6 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V6+V7+V8,dist='gengamma',data=Drogas_SP_reg) #modelo sem V9


TRV.1=2*(m.comp$loglik-m.1$loglik) #TRV comparando o modelo sem V4 e o modelo completo (H0:beta_V4=0)
TRV.2=2*(m.comp$loglik-m.2$loglik) #TRV comparando o modelo sem V5 e o modelo completo (H0:beta_V5=0)
TRV.3=2*(m.comp$loglik-m.3$loglik) #TRV comparando o modelo sem V6 e o modelo completo (H0:beta_V6=0)
TRV.4=2*(m.comp$loglik-m.4$loglik) #TRV comparando o modelo sem V7 e o modelo completo (H0:beta_V7=0)
TRV.5=2*(m.comp$loglik-m.5$loglik) #TRV comparando o modelo sem V8 e o modelo completo (H0:beta_V8=0)
TRV.6=2*(m.comp$loglik-m.6$loglik) #TRV comparando o modelo sem V9 e o modelo completo (H0:beta_V9=0)


selecao2 <- data.frame(Modelo=c("Completo: V4+V5+V6+V8+V9","Tirando tempo_livre_responsaveis (V4): V5+V6+V8+V9 "," Tirando bebida_alcoolica (V5): V4+V6+V7+V8+V9"," Tirando cigarro(V6): V4+V5+V8+V9 ","Tirando responsavel_fuma (V7) : V4+V5+V6+V8+V9","Tirando sentido_sozinho (V8): ","Tirando amigos_drogas (V9): V4+V5+V6+V8"),
                       TRV = c("-",round(c(TRV.1,TRV.2,TRV.3,TRV.4,TRV.5,TRV.6),4)),
                       pvalor = c("-", round(c(1-pchisq(TRV.1,df=1),1-pchisq(TRV.2,df=1),1-pchisq(TRV.3,df=1),1-pchisq(TRV.4,df=1),1-pchisq(TRV.5,df=1),1-pchisq(TRV.6,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV.1,df=1), 1-pchisq(TRV.2,df=1), 1-pchisq(TRV.3,df=1), 1-pchisq(TRV.4,df=1), 1-pchisq(TRV.5,df=1),1-pchisq(TRV.6,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao2)
Modelo TRV pvalor Significancia
Completo: V4+V5+V6+V8+V9 - - -
Tirando tempo_livre_responsaveis (V4): V5+V6+V8+V9 4.6341 0.0313 Ao nível de 10%, É significativa
Tirando bebida_alcoolica (V5): V4+V6+V7+V8+V9 0.9119 0.3396 Ao nível de 10%, NÃO É significativa
Tirando cigarro(V6): V4+V5+V8+V9 4.5017 0.0339 Ao nível de 10%, É significativa
Tirando responsavel_fuma (V7) : V4+V5+V6+V8+V9 1.3784 0.2404 Ao nível de 10%, NÃO É significativa
Tirando sentido_sozinho (V8): 2.8897 0.0891 Ao nível de 10%, É significativa
Tirando amigos_drogas (V9): V4+V5+V6+V8 29.4385 0 Ao nível de 10%, É significativa
  • Ao nível de significância de \(0.1\), a retirada das variáveis tempo_livre_responsaveis (V4), cigarro (V6), sentido_sozinho (V8) e amigos_drogas (V9) impacta o modelo, portanto, estas covariáveis são mantidas no modelo completo.

1.4.3 Passo 3

  • Passo 3: Ajustar um modelo com as covariáveis retidas no passo 2 (ao nível de significância de \(0.1\)). Retornar as covariáveis excluídas no passo 2 para verificar se não são significativas.

  • Ao nível de significância de \(0.1\), as covariáveis retidas no passo 2 tempo_livre_responsaveis (V4), cigarro (V6), sentido_sozinho (V8) e amigos_drogas (V9), portanto, estas covariáveis compõem o modelo completo.

  • As covariáveis excluídas no passo 2: bebida_alcoolica (V5) e responsavel_fuma(V7).

m.comp1 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo com variáveis retidas no passo 2 

m.compV5 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V5+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #voltar com V5 
m.compV7 <- flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V7+V8+V9,dist='gengamma',data=Drogas_SP_reg) #voltar com V7 

TRV.V5=2*(m.compV5$loglik-m.comp1$loglik)  #TRV comparando o modelo sem V5 e o modelo voltando com V5 (H0:beta_V5=0)
TRV.V7=2*(m.compV7$loglik-m.comp1$loglik)  #TRV comparando o modelo sem V7 e o modelo voltando com V7 (H0:beta_V7=0)


selecao3 <- data.frame(Modelo=c("Completo: V4+V6+V8+V9","Voltando com bebida_alcoolica (V5): V4+V5+V6+V8+V9","Voltando com responsavel_fuma (V7): V4+V6+V7+V8+V9"),
                       TRV = c("-",round(c(TRV.V5,TRV.V7),4)),
                       pvalor = c("-",round(c(1-pchisq(TRV.V5,df=1),1-pchisq(TRV.V7,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV.V5,df=1), 1-pchisq(TRV.V7,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao3)
Modelo TRV pvalor Significancia
Completo: V4+V6+V8+V9 - - -
Voltando com bebida_alcoolica (V5): V4+V5+V6+V8+V9 0.9931 0.319 Ao nível de 10%, NÃO É significativa
Voltando com responsavel_fuma (V7): V4+V6+V7+V8+V9 1.4596 0.227 Ao nível de 10%, NÃO É significativa
  • Ao nível de \(0.1\), nenhuma covariável excluída no passo 2 retorna ao modelo.

1.4.4 Passo 4

  • Passo 4: Retornar as covariáveis excluídas no passo 1 (V1,V2,V3) para verificar se não são significativas.
m.comp2<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo obtido 

m.comp2.V1<-flexsurvreg(formula=Surv(tempo,censura)~V1+V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) 
m.comp2.V2<-flexsurvreg(formula=Surv(tempo,censura)~V2+V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) 
m.comp2.V3<-flexsurvreg(formula=Surv(tempo,censura)~V3+V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) 


TRV.V1=2*(m.comp2.V1$loglik-m.comp2$loglik) #TRV comparando o modelo sem V1 e o modelo voltando com V1 (H0:beta_V1=0)
TRV.V2=2*(m.comp2.V2$loglik-m.comp2$loglik) #TRV comparando o modelo sem V2 e o modelo voltando com V1 (H0:beta_V2=0)
TRV.V3=2*(m.comp2.V3$loglik-m.comp2$loglik) #TRV comparando o modelo sem V3 e o modelo voltando com V3 (H0:beta_V3=0)

selecao4 <- data.frame(Modelo=c("Completo: V4+V6+V8+V9","Voltando com sexo (V1): V1+V4+V6+V8+V9 ","Voltando com cor_raca (V2): V2+V4+V6+V8+V9 ","Voltando com mora_mae (V3): V3+V4+V6+V8+V9"),
                       TRV = c("-",round(c(TRV.V1,TRV.V2,TRV.V3),4)),
                       pvalor = c("-",round(c(1-pchisq(TRV.V1,df=1),1-pchisq(TRV.V2,df=1),1-pchisq(TRV.V3,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV.V1,df=1), 1-pchisq(TRV.V2,df=1), 1-pchisq(TRV.V3,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao4)
Modelo TRV pvalor Significancia
Completo: V4+V6+V8+V9 - - -
Voltando com sexo (V1): V1+V4+V6+V8+V9 0.0111 0.9159 Ao nível de 10%, NÃO É significativa
Voltando com cor_raca (V2): V2+V4+V6+V8+V9 1.3141 0.2517 Ao nível de 10%, NÃO É significativa
Voltando com mora_mae (V3): V3+V4+V6+V8+V9 0.413 0.5204 Ao nível de 10%, NÃO É significativa
  • Ao nível de \(0.1\), nenhuma covariável excluída no passo 1 retorna ao modelo.

1.4.5 Passo 5

  • Passo 5: Testar se alguma covariável pode sair do modelo.
m.comp2<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo obtido 

m.semV4<-flexsurvreg(formula=Surv(tempo,censura)~V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V4
m.semV6<-flexsurvreg(formula=Surv(tempo,censura)~V4+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V6
m.semV8<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V9,dist='gengamma',data=Drogas_SP_reg) #modelo sem V8
m.semV9<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8,dist='gengamma',data=Drogas_SP_reg) #modelo sem V9


TRV.semV4=2*(m.comp2$loglik-m.semV4$loglik) #TRV comparando o modelo completo e o sem V4 (H0:beta_V4=0)
TRV.semV6=2*(m.comp2$loglik-m.semV6$loglik) #TRV comparando o modelo completo e o sem V6 (H0:beta_V6=0)
TRV.semV8=2*(m.comp2$loglik-m.semV8$loglik) #TRV comparando o modelo completo e o sem V8 (H0:beta_V8=0)
TRV.semV9=2*(m.comp2$loglik-m.semV9$loglik) #TRV comparando o modelo completo e o sem V9 (H0:beta_V9=0)

selecao5 <- data.frame(Modelo=c("Completo: V4+V6+V8+V9","Tirando tempo_livre_responsaveis (V4): V6+V8+V9 ","Tirando cigarro (V6): V4+V8+V9","Tirando sentido_sozinho (V8): V4+V6+V9","Tirando amigos_drogas (V9): V4+V6+V8"),
                       TRV = c("-",round(c(TRV.semV4,TRV.semV6,TRV.semV8,TRV.semV9),4)),
                       pvalor = c("-",round(c(1-pchisq(TRV.semV4,df=1),1-pchisq(TRV.semV6,df=1),1-pchisq(TRV.semV8,df=1),1-pchisq(TRV.semV9,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV.semV4,df=1), 1-pchisq(TRV.semV6,df=1),1-pchisq(TRV.semV8,df=1),1-pchisq(TRV.semV9,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao5)
Modelo TRV pvalor Significancia
Completo: V4+V6+V8+V9 - - -
Tirando tempo_livre_responsaveis (V4): V6+V8+V9 6.7723 0.0093 Ao nível de 10%, É significativa
Tirando cigarro (V6): V4+V8+V9 17.9297 0 Ao nível de 10%, É significativa
Tirando sentido_sozinho (V8): V4+V6+V9 3.5034 0.0612 Ao nível de 10%, É significativa
Tirando amigos_drogas (V9): V4+V6+V8 33.676 0 Ao nível de 10%, É significativa
  • Ao nível de significância de \(0.1\), conclui-se que a retirada de qualquer covariável (V4, V6, V8 ou V9) é significativa, logo, o modelo completo mantém as covariáveis tempo_livre_responsaveis (V4), cigarro (V6), sentido_sozinho (V8) e amigos_drogas (V9).

1.4.6 Passo 6

  • Passo 6: Verificar a possibilidade de inclusão de interação dupla entre as variáveis “sobreviventes”.
m.comp2<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) #modelo obtido 


m.V4V6<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V6,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V4 e V6 
m.V4V8<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V4 e V8 
m.V4V9<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V4 e V9
m.V6V8<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V6 e V8
m.V6V9<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V9,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V6 e V9
m.V8V9<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V8*V9,dist='gengamma',data=Drogas_SP_reg) #modelo com interação entre V8 e V9



TRV.V4V6=2*(m.V4V6$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V4*V6 (H0:beta_V4*V6=0)
TRV.V4V8=2*(m.V4V8$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V4*V8 (H0:beta_V4*V8=0)
TRV.V4V9=2*(m.V4V9$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V4*V9 (H0:beta_V4*V9=0)
TRV.V6V8=2*(m.V6V8$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V6*V8 (H0:beta_V6*V8=0)
TRV.V6V9=2*(m.V6V9$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V6*V9 (H0:beta_V6*V9=0)
TRV.V8V9= 2*(m.V8V9$loglik-m.comp2$loglik) #TRV comparando o modelo sem interacao e o modelo com V8*V9 (H0:beta_V8*V9=0)


selecao6 <- data.frame(Modelo=c("Completo: V4+V6+V8+V9",
                                "Com interação entre tempo_livre_responsaveis e cigarro (V4 e V6): V4+V6+V8+V9+V4*V6 ",
                                "Com interação entre tempo_livre_responsaveis e sentido_sozinho (V4 e V8): V4+V6+V8+V9+V4*V8 ",
                                "Com interação entre tempo_livre_responsaveis e amigos_drogas (V4 e V9): V4+V6+V8+V9+V4*V9 ",
                                "Com interação entre cigarro e sentido_sozinho (V6 e V8): V4+V6+V8+V9+V6*V8",
                                "Com interação entre cigarro e amigos_drogas (V6 e V9): V4+V6+V8+V9+V6*V9",
                                "Com interação entre sentido_sozinho e amigos_drogas (V8 e V9): V4+V6+V8+V9+V8*V9"),
                       TRV = c("-",round(c(TRV.V4V6,TRV.V4V8,TRV.V4V9,TRV.V6V8,TRV.V6V9,TRV.V8V9),4)),
                       pvalor = c("-",round(c(1-pchisq(TRV.V4V6,df=1),1-pchisq(TRV.V4V8,df=1),1-pchisq(TRV.V4V9,df=1),1-pchisq(TRV.V6V8,df=1),1-pchisq(TRV.V6V9,df=1),1-pchisq(TRV.V8V9,df=1)),4)),
                       Significancia = c("-",ifelse(round(c(1-pchisq(TRV.V4V6,df=1),1-pchisq(TRV.V4V8,df=1),1-pchisq(TRV.V4V9,df=1),1-pchisq(TRV.V6V8,df=1),1-pchisq(TRV.V6V9,df=1),1-pchisq(TRV.V8V9,df=1)),4)
<=0.1,"Ao nível de 10%, É significativa","Ao nível de 10%, NÃO É significativa")))

knitr::kable(selecao6)
Modelo TRV pvalor Significancia
Completo: V4+V6+V8+V9 - - -
Com interação entre tempo_livre_responsaveis e cigarro (V4 e V6): V4+V6+V8+V9+V4*V6 2.4047 0.121 Ao nível de 10%, NÃO É significativa
Com interação entre tempo_livre_responsaveis e sentido_sozinho (V4 e V8): V4+V6+V8+V9+V4*V8 26.8446 0 Ao nível de 10%, É significativa
Com interação entre tempo_livre_responsaveis e amigos_drogas (V4 e V9): V4+V6+V8+V9+V4*V9 7.8189 0.0052 Ao nível de 10%, É significativa
Com interação entre cigarro e sentido_sozinho (V6 e V8): V4+V6+V8+V9+V6*V8 4.1242 0.0423 Ao nível de 10%, É significativa
Com interação entre cigarro e amigos_drogas (V6 e V9): V4+V6+V8+V9+V6*V9 0.2517 0.6159 Ao nível de 10%, NÃO É significativa
Com interação entre sentido_sozinho e amigos_drogas (V8 e V9): V4+V6+V8+V9+V8*V9 22.3374 0 Ao nível de 10%, É significativa

Ao nível de significância de \(0.1\), as interações:

  • tempo_livre_responsaveis e sentido_sozinho (V4 e V8)

  • tempo_livre_responsaveis e amigos_drogas (V4 e V9)

  • cigarro e sentido_sozinho (V6 e V8)

  • sentido_sozinho e amigos_drogas (V8 e V9)

são significativas, portanto, serão adicionadas ao modelo.

1.4.7 Passo 7

  • Passo 7: Modelo final escolhido.

  • \(Modelo \, Final = V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9\)

  • O modelo final ficou composto pelas covariáveis: tempo_livre_responsaveis (V4), cigarro (V6), sentido_sozinho (V8) e amigos_drogas (V9).

  • Os termos de interação \(V4*V8\), \(V4*V9\), \(V6 e V8\) e \(V6*V9\) foram significativos ao nível de \(0.1\), portanto, foram incluídos no modelo.

modeloGama<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9,dist='gengamma',data=Drogas_SP_reg) #modelo final

1.5 Investigando a utilização de modelos mais simples

  • Uma vez escolhido o conjunto de covariáveis, o interesse se concentra em investigar a utilização de modelos mais simples, casos especiais da gama generalizada, mas não menos adequados aos dados.

  • Ao rodar a função flexsurvreg para os modelos Exponencial, Weibull e Lognormal utilizando o modelo \(V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9\), obtivemos erros de convergência e singularidade:

Warning: Optimisation has probably not converged to the maximum likelihood - Hessian is not positive definite.

Error in solve.default(hessian, tol = tol.solve) : Lapack routine dgesv: system is exactly singular: U[41,41] = 0

  • A fim de possibilitar a continuidade do trabalho, adotamos a seguinte metodologia: como os últimos termos a serem inseridos no modelo final foram os de interação, removemos cada termo de interação individualmente e ajustamos os modelos Exponencial, Weibull e Lognormal, verificando a presença de erros.

  • Ao remover cada termo de interação, individualmente, obtivemos os seguintes resultados:

#------------------------------ Modelo final com todas as interações

#Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9,dist='exponential',data=Drogas_SP_reg) 

#Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9,dist='weibull',data=Drogas_SP_reg) 

#Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8+V8*V9,dist='lnorm',data=Drogas_SP_reg) 

# Erro de convergência e singularidade da Matriz Hessiana

#------------------------------- Modelo final sem interação V8*V9


#Modelo exponencial 

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8,dist='exponential',data=Drogas_SP_reg) 

#Modelo Weibull 

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8,dist='weibull',data=Drogas_SP_reg) 

#Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V6*V8,dist='lnorm',data=Drogas_SP_reg) 

# Erro de convergência e singularidade da Matriz Hessiana 

#------------------------------- Modelo final sem interação V6*V8


#Modelo exponencial 

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V8*V9,dist='exponential',data=Drogas_SP_reg) 

#Modelo Weibull 

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V8*V9,dist='weibull',data=Drogas_SP_reg) 

#Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9+V8*V9,dist='lnorm',data=Drogas_SP_reg) 

# Erro de convergência e singularidade da Matriz Hessiana

#------------------------------- Modelo final sem interação V4*V9


#Modelo exponencial 

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8+V8*V9,dist='exponential',data=Drogas_SP_reg) 
#Modelo Weibull 

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8+V8*V9,dist='weibull',data=Drogas_SP_reg) 

#Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8+V8*V9,dist='lnorm',data=Drogas_SP_reg) 

# Erro de convergência e singularidade da Matriz Hessiana

#------------------------------- Modelo final sem interação V4*V8


#Modelo exponencial 
# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8+V8*V9,dist='exponential',data=Drogas_SP_reg) 
#Modelo Weibull 
# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8+V8*V9,dist='weibull',data=Drogas_SP_reg) 
#Modelo Log-normal 
# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8+V8*V9,dist='lnorm',data=Drogas_SP_reg) 
# Erro de convergência e singularidade da Matriz Hessiana


selecao_modelo1 <- data.frame(Modelo=c("Retirando do modelo final a interação $V8*V9$",
                                      "Retirando do modelo final a interação $V6*V8$",
                                      "Retirando do modelo final a interação $V4*V9$",
                                      "Retirando do modelo final a interação $V4*V8$"),
                             Resultado=c("Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal"))

knitr::kable(selecao_modelo1)
Modelo Resultado
Retirando do modelo final a interação \(V8*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final a interação \(V6*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final a interação \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final a interação \(V4*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
  • Dado que a remoção dos termos de interação, individualmente, não acarretou em melhoras na execução dos modelos Exponencial, Weibull e Lognormal, o próximo passo consistiu na remoção conjunta de termos de interação. Para isso, as combinações dos termos de interação tomados 2 a 2, 3 a 3 e 4 a 4 foram retiradas do modelo e foi verificada a presença de erros.
# combn(4,2)
# combn(4,3)

# -------------------------- Modelo final sem V8*V9 e V6*V8 

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V4*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana


# -------------------------- Modelo final sem V8*V9 e V4*V9 

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V6*V8,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana


# -------------------------- Modelo final sem V8*V9 e V4*V8 

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V6*V8,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana




#------------------------------ Modelo final sem V6*V8 e V4*V9

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V8*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V8*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8+V8*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana

#------------------------------ Modelo final sem V6*V8 e V4*V8

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V8*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V8*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9+V8*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana


#------------------------------ Modelo final sem V4*V8 e V4*V9

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8+V8*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8+V8*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8+V8*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana


#------------------------------ Modelo final sem V8*V9, V6*V8 e V4*V9  

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V8,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana



# --------------------------- Modelo final sem V8*V9, V6*V8 e V4*V8

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V4*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana



#---------------------------- Modelo final sem V8*V9, V4*V9 e V4*V8

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='lnorm',data=Drogas_SP_reg)

# SEM ERROS

#---------------------------- Modelo final sem V6*V8, V4*V8 e V4*V9

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V8*V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V8*V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V8*V9,dist='lnorm',data=Drogas_SP_reg)

# Erro de convergência e singularidade da Matriz Hessiana

#---------------------------- Modelo final sem V8*V9, V6*V8, V4*V9 e V4*V8

# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='lnorm',data=Drogas_SP_reg)

# SEM ERROS




selecao_modelo2 <- data.frame(Modelo=c("Retirando do modelo final as interações $V8*V9$ e $V6*V8$",
                                      "Retirando do modelo final as interações $V8*V9$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V8*V9$ e $V4*V8$",
                                      "Retirando do modelo final as interações $V6*V8$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V6*V8$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V4*V9$ e $V4*V8$",
                                      "Retirando do modelo final as interações $V8*V9$, $V6*V8$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V8*V9$, $V6*V8$ e $V4*V8$",
                                      "Retirando do modelo final as interações $V8*V9$, $V4*V8$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V6*V8$, $V4*V8$ e $V4*V9$",
                                      "Retirando do modelo final as interações $V8*V9$, $V6*V8$, $V4*V9$ e $V4*V8$"),
                             Resultado=c("Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Não apresentou erros para os modelos Exponencial, Weibull e Lognormal",
                                         "Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal",
                                         "Não apresentou erros para os modelos Exponencial, Weibull e Lognormal"))

knitr::kable(selecao_modelo2)
Modelo Resultado
Retirando do modelo final as interações \(V8*V9\) e \(V6*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\) e \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\) e \(V4*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V6*V8\) e \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V6*V8\) e \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V4*V9\) e \(V4*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\), \(V6*V8\) e \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\), \(V6*V8\) e \(V4*V8\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\), \(V4*V8\) e \(V4*V9\) Não apresentou erros para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V6*V8\), \(V4*V8\) e \(V4*V9\) Apresentou erros de convergência e singularidade para os modelos Exponencial, Weibull e Lognormal
Retirando do modelo final as interações \(V8*V9\), \(V6*V8\), \(V4*V9\) e \(V4*V8\) Não apresentou erros para os modelos Exponencial, Weibull e Lognormal
  • De acordo com os resultados obtidos nesses testes, temos que o modelo apenas com o termo de interação \(V6*V8\) e o modelo sem interações que não apresentaram erros. Portanto, optamos por adotar o \(Modelo \, Final = V4+V6+V8+V9+V6*V8\), composto pelas covariáveis tempo_livre_responsaveis (V4), cigarro (V6), sentido_sozinho (V8) e amigos_drogas (V9) e pelo termo de interação \(V6 e V8\).
#---------------------------- Modelo final sem V8*V9, V4*V9 e V4*V8

# modelo final Gama Generalizado

modeloGama<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='gengamma',data=Drogas_SP_reg) 

# Modelo exponencial

modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='lnorm',data=Drogas_SP_reg)


TRV.exp=2*(modeloGama$loglik-modeloexp$loglik) #TRV comparando o modelo exponencial e o modelo Gama (H0: O modelo exponencial é adequado) 
TRV.Wei=2*(modeloGama$loglik-modeloWei$loglik)#TRV comparando o modelo Weibull e o modelo Gama (H0: O modelo Weibull é adequado)
TRV.Logn=2*(modeloGama$loglik-modeloLogn$loglik)#TRV comparando o modelo Weibull e o modelo Gama (H0: O modelo Weibull é adequado)

selecao_modelo3 <- data.frame(Modelos = c("Exponencial","Weibull","Lognormal"), 
                             TRV = round(c(TRV.exp,TRV.Wei,TRV.Logn),4),
                             pvalor = round(c(1-pchisq(TRV.exp,df=2),1-pchisq(TRV.Wei,df=1),1-pchisq(TRV.Logn,df=1)),4),
                             Significancia = ifelse (round(c(1-pchisq(TRV.exp,df=2),1-pchisq(TRV.Wei,df=1),1-pchisq(TRV.Logn,df=1)),4)<=0.1,"Ao nível de 10%, NÃO É adequado","Ao nível de 10%, É adequado"))

knitr::kable(selecao_modelo3)
Modelos TRV pvalor Significancia
Exponencial 176.8423 0.0000 Ao nível de 10%, NÃO É adequado
Weibull 1.2317 0.2671 Ao nível de 10%, É adequado
Lognormal 0.3215 0.5707 Ao nível de 10%, É adequado
#---------------------------- Modelo final sem interações

# modelo final Gama Generalizado

# modeloGama<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='gengamma',data=Drogas_SP_reg) 


# Modelo exponencial

# modeloexp<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='exponential',data=Drogas_SP_reg)

# Modelo Weibull

# modeloWei<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='weibull',data=Drogas_SP_reg)

# Modelo Log-normal 

# modeloLogn<-flexsurvreg(formula=Surv(tempo,censura)~V4+V6+V8+V9,dist='lnorm',data=Drogas_SP_reg)


# TRV.exp=2*(modeloGama$loglik-modeloexp$loglik) #TRV comparando o modelo exponencial e o modelo Gama (H0: O modelo exponencial é adequado) 
# TRV.Wei=2*(modeloGama$loglik-modeloWei$loglik)#TRV comparando o modelo Weibull e o modelo Gama (H0: O modelo Weibull é adequado)
# TRV.Logn=2*(modeloGama$loglik-modeloLogn$loglik)#TRV comparando o modelo Weibull e o modelo Gama (H0: O modelo Weibull é adequado)
# 
# selecao_modelo3 <- data.frame(Modelos = c("Exponencial","Weibull","Lognormal"), 
#                              TRV = round(c(TRV.exp,TRV.Wei,TRV.Logn),4),
#                              pvalor = round(c(1-pchisq(TRV.exp,df=2),1-pchisq(TRV.Wei,df=1),1-pchisq(TRV.Logn,df=1)),4),
#                              Significancia = ifelse (round(c(1-pchisq(TRV.exp,df=2),1-pchisq(TRV.Wei,df=1),1-pchisq(TRV.Logn,df=1)),4)<=0.1,"Ao nível de 10%, NÃO É adequado","Ao nível de 10%, É adequado"))
# 
# knitr::kable(selecao_modelo3)
  • Ao nível de significância de \(0.1\), rejeita-se a hipótese nula de adequação do modelo Exponencial. Os modelos Weibull e Lognormal se adequam aos dados.

  • Escolhemos então o modelo Lognormal para modelar os tempos até a experimentação de drogas ilícitas pois foi o que apresentou maior p-valor (\(0.5707\).

  • Desse modo, todas as análises seguintes são baseadas nesse modelo.

1.6 Estimando os parâmetros do modelo Lognormal

modeloLogn<-survreg(formula=Surv(tempo,censura)~V4+V6+V8+V9+V6*V8,dist='lognormal',data=Drogas_SP_reg)
summary(modeloLogn)
## 
## Call:
## survreg(formula = Surv(tempo, censura) ~ V4 + V6 + V8 + V9 + 
##     V6 * V8, data = Drogas_SP_reg, dist = "lognormal")
##                 Value Std. Error      z      p
## (Intercept)   3.24792  284.92012   0.01  0.991
## V42          -0.03061    0.04815  -0.64  0.525
## V43          -0.04666    0.04781  -0.98  0.329
## V44          -0.01312    0.04012  -0.33  0.744
## V45           0.03221    0.04634   0.70  0.487
## V62           0.12562    0.05713   2.20  0.028
## V82           0.05505    0.04564   1.21  0.228
## V83          -0.00849    0.04225  -0.20  0.841
## V84           0.03972    0.04402   0.90  0.367
## V85          -0.04165    0.05029  -0.83  0.408
## V92          -0.55839  284.92012   0.00  0.998
## V93          -0.58017  284.92012   0.00  0.998
## V94          -0.65450  284.92012   0.00  0.998
## V96           0.00487  527.77047   0.00  1.000
## V62:V82      -0.08653    0.07070  -1.22  0.221
## V62:V83       0.03219    0.07249   0.44  0.657
## V62:V84      -0.04878    0.07804  -0.63  0.532
## V62:V85      -0.02531    0.08123  -0.31  0.755
## Log(scale)   -2.35354    0.11434 -20.58 <2e-16
## 
## Scale= 0.095 
## 
## Log Normal distribution
## Loglik(model)= -103.1   Loglik(intercept only)= -164.8
##  Chisq= 123.44 on 17 degrees of freedom, p= 3.4e-18 
## Number of Newton-Raphson Iterations: 20 
## n= 445
  • Ao nível de significância de \(0.1\), \(V9\) é retirada do modelo \(V4+V6+V8+V9+V6*V8\) por não ser significativa (ou seja, não se rejeita a hipótese nula de que o coeficiente é igual a zero)
modeloLogn<-survreg(formula=Surv(tempo,censura)~V6+V8+V6*V8,dist='lognormal',data=Drogas_SP_reg)
summary(modeloLogn)
## 
## Call:
## survreg(formula = Surv(tempo, censura) ~ V6 + V8 + V6 * V8, data = Drogas_SP_reg, 
##     dist = "lognormal")
##                Value Std. Error      z      p
## (Intercept)  2.64948    0.03285  80.65 <2e-16
## V62          0.22528    0.05612   4.01  6e-05
## V82          0.07200    0.04702   1.53  0.126
## V83          0.00652    0.04285   0.15  0.879
## V84          0.05539    0.04498   1.23  0.218
## V85         -0.04956    0.05046  -0.98  0.326
## V62:V82     -0.12910    0.06683  -1.93  0.053
## V62:V83     -0.00111    0.06965  -0.02  0.987
## V62:V84     -0.09851    0.07398  -1.33  0.183
## V62:V85     -0.06128    0.07811  -0.78  0.433
## Log(scale)  -2.24840    0.11509 -19.54 <2e-16
## 
## Scale= 0.106 
## 
## Log Normal distribution
## Loglik(model)= -122.4   Loglik(intercept only)= -164.8
##  Chisq= 84.79 on 9 degrees of freedom, p= 1.8e-14 
## Number of Newton-Raphson Iterations: 6 
## n= 445
  • Ao nível de significância de \(0.1\), \(V4\) é retirada do modelo \(V4+V6+V8+V6*V8\) por não ser significativa (ou seja, não se rejeita a hipótese nula de que o coeficiente é igual a zero).
modeloLogn<-survreg(formula=Surv(tempo,censura)~V6+V8+V6*V8,dist='lognormal',data=Drogas_SP_reg)
summary(modeloLogn)
## 
## Call:
## survreg(formula = Surv(tempo, censura) ~ V6 + V8 + V6 * V8, data = Drogas_SP_reg, 
##     dist = "lognormal")
##                Value Std. Error      z      p
## (Intercept)  2.64948    0.03285  80.65 <2e-16
## V62          0.22528    0.05612   4.01  6e-05
## V82          0.07200    0.04702   1.53  0.126
## V83          0.00652    0.04285   0.15  0.879
## V84          0.05539    0.04498   1.23  0.218
## V85         -0.04956    0.05046  -0.98  0.326
## V62:V82     -0.12910    0.06683  -1.93  0.053
## V62:V83     -0.00111    0.06965  -0.02  0.987
## V62:V84     -0.09851    0.07398  -1.33  0.183
## V62:V85     -0.06128    0.07811  -0.78  0.433
## Log(scale)  -2.24840    0.11509 -19.54 <2e-16
## 
## Scale= 0.106 
## 
## Log Normal distribution
## Loglik(model)= -122.4   Loglik(intercept only)= -164.8
##  Chisq= 84.79 on 9 degrees of freedom, p= 1.8e-14 
## Number of Newton-Raphson Iterations: 6 
## n= 445
  • Ao nível de significância de \(0.1\), a interação \(V62:V82\) é significativa. De acordo com a literatura, recomenda-se manter as variáveis utilizadas em uma interação significativa ainda que elas sozinhas não sejam significativas. Portanto, utilizaremos o modelo \(V6+V8+V6*V8\).

  • Observações: Dentre os modelos considerados nessa etapa, o modelo com menor Bayesian Information Criterion (BIC) foi o modelo \(V6+V8+V6*V8\), o que corrobora sua escolha. Além disso, ao repetir o teste TRV para seleção de modelos mais simples utilizando como modelo final \(V6+V8+V6*V8\), a distribuição Lognormal continuou apresentando o maior p-valor e, portanto, sendo escolhida como a adequada para o processo de modelagem.

1.7 Adequação do modelo ajustado

1.7.1 Resíduos de Cox-Snell

  • Os resíduos \(\hat{e_i}\) vêm de uma população homogênea e devem seguir uma distribuição exponencial padrão se o modelo for adequado.
xb<-modeloLogn$linear.predictors
sigma<-modeloLogn$scale
res<-(log(Drogas_SP_reg$tempo)-(xb))/sigma
ei<- -log(1-pnorm(res)) #residuos de cox-Snell = funcao de taxa de falha acumulada

# Para o modelo de regressão lognormal:



ekm1<-survfit(Surv(ei,Drogas_SP_reg$censura)~1)
t<-ekm1$time
st<-ekm1$surv
sexp<-exp(-t)

par(mfrow=c(1,2))
plot(st,sexp,xlab="S(ei): Kaplan-Meier",ylab="S(ei): Exponencial padrao",pch=16)

plot(ekm1,conf.int=F,mark.time=F, xlab="Residuos de Cox-Snell", ylab="Sobrevivencia estimada")
lines(t,sexp,lty=4)
legend("bottomleft",lty=c(1,4),c("Kaplan-Meier","Exponencial padrao"),cex=0.8,bty="n")

- Acredita-se que o modelo de regressão Lognormal se encontra razoavelmente ajustado aos dados.

1.7.2 Resíduos padronizados

  • Se o modelo de regressão lognormal for apropriado, \(\hat{\upsilon_i}\) é normal padrão.
xb<-modeloLogn$linear.predictors
sigma<-modeloLogn$scale
nu<-(log(Drogas_SP_reg$tempo)-(xb))/sigma
resid<-exp(nu)
ekm<- survfit(Surv(resid,Drogas_SP_reg$censura)~1)
resid<-ekm$time
sln<-pnorm(-log(resid)) #funcao de sobrevivencia da lognormal padrao
par(mfrow=c(1,2))
plot(ekm$surv,sln, xlab="S(ei): Kaplan-Meier",ylab="S(ei): Lognormal padrão",pch=16)


plot(ekm,conf.int=F,mark.time=F,xlab="Residuos (ei)",ylab="Sobrevivencia estimada",pch=16)
lines(resid,sln,lty=2)
legend("bottomleft",lty=c(1,2),c("Kaplan-Meier","Log-normal padrao"),cex=0.8,bty="n")

1.7.3 Resíduos deviance

  • Se o modelo de regressão lognormal for apropriado, os gráficos dos resíduos deviance vs. tempo devem apresentar comportamento aleatório em torno de zero.
res<-(log(Drogas_SP_reg$tempo)-(xb))/sigma
ei<- -log(1-pnorm(res)) #residuos de cox-Snell
mi<-Drogas_SP_reg$censura-ei
di<-sign(mi)*(-2*(mi+Drogas_SP_reg$censura*log(Drogas_SP_reg$censura-mi)))^0.5
par(mfrow=c(1,2))
plot(Drogas_SP$cigarro,di,xlab="cigarro (V6)")
plot(Drogas_SP$sentido_sozinho,di,xlab="sentido_sozinho (V8)")

- A partir da análise dos gráficos acima, nota-se um aglomerado na categoria 2 de V6, o que não corrobora a hipótese de comportamento aleatório em torno de zero. Entretanto, na categoria 1 de V6 e nas demais categorias de V8, podemos observar que os pontos estão distribuídos de forma mais apropriada.

1.8 Interpretação dos resultados

  • Tomando-se o exponencial dos coeficientes estimados, obtém-se a razão dos tempos medianos de sobrevivência.
interpretacao1 <- data.frame(Exp_beta = round(c(exp(modeloLogn$coefficients[2:6])),2))
knitr::kable(interpretacao1)
Exp_beta
V62 1.25
V82 1.07
V83 1.01
V84 1.06
V85 0.95
  • V62: o tempo mediano até a experimentação de drogas ilícitas para os estudantes que não fumaram cigarro, é 1.25 vezes o tempo mediano dos estudantes que alguma vez na vida já fumaram, mesmo uma ou duas tragadas.

  • V82: o tempo mediano até a experimentação de drogas ilícitas para os estudantes que nos últimos 12 meses RARAMENTE se sentiram sozinhos é \(1.07\) vezes o tempo mediano dos estudantes que NUNCA se sentiram sozinhos.

  • V83: o tempo mediano até a experimentação de drogas ilícitas para os estudantes que nos últimos 12 meses ÀS VEZES se sentiram sozinhos é \(1.01\) vezes o tempo mediano dos estudantes que NUNCA se sentiram sozinhos.

  • V84: o tempo mediano até a experimentação de drogas ilícitas para os estudantes que nos últimos 12 meses NA MAIORIA DAS VEZES se sentiram sozinhos é \(1.06\) vezes o tempo mediano dos que NUNCA se sentiram sozinhos.

  • V85: o tempo mediano até a experimentação de drogas ilícitas para os estudantes que nos últimos 12 meses SEMPRE se sentiram sozinhos é \(0.95\) vezes o tempo mediano dos que NUNCA se sentiram sozinhos.

  • A experimentação de cigarro e o fato do estudante sempre se sentir sozinho com maior frequência acarretam em menores tempos medianos até a experimentação de drogas ilícitas.

interpretacao2 <- data.frame(Interacao=c("Fixado sentido_sozinho=5 (Sempre)","Fixado sentido_sozinho=2 (Raramente) "),
                             Exp_beta = round(c(exp(modeloLogn$coefficients[2]+modeloLogn$coefficients[10]),
                                                exp(modeloLogn$coefficients[2]+modeloLogn$coefficients[7])),2))
knitr::kable(interpretacao2)
Interacao Exp_beta
Fixado sentido_sozinho=5 (Sempre) 1.18
Fixado sentido_sozinho=2 (Raramente) 1.10
  • Fixando a variável sentido_sozinho (V8) na categoria 5 (Sempre), não ter fumado alguma vez aumenta em \(18\%\) o tempo mediano da experimentação de drogas ilícitas em comparação a ter fumado alguma vez.

  • Fixando a variável sentido_sozinho (V8) na categoria 2 (Raramente), não ter fumado alguma vez aumenta em \(10\%\) o tempo mediano da experimentação de drogas ilícitas em comparação a ter fumado alguma vez.

1.9 Curvas de sobrevivencia estimadas pelo modelo final

1.9.1 Comparando V6=1 com V6=2:

  • Fixou-se sentido_sozinho (V8) na categoria de referência (1- Nunca se sentiu sozinho nos últimos 12 meses).
b0<-modeloLogn$coefficients[1]
beta.V62<-modeloLogn$coefficients[2]
beta.V82<-modeloLogn$coefficients[3]
beta.V83<-modeloLogn$coefficients[4]
beta.V84<-modeloLogn$coefficients[5]
beta.V85<-modeloLogn$coefficients[6]
beta.V62.V82<-modeloLogn$coefficients[7]    
beta.V62.V83<-modeloLogn$coefficients[8]   
beta.V62.V84<-modeloLogn$coefficients[9]   
beta.V62.V85<-modeloLogn$coefficients[10]  
                                 
sigma<-modeloLogn$scale

V62<-0 # 1 se V6=2 e 0 c.c
V82<-0 #1, se V8=2, 0 caso contrário.
V83<-0 #1, se V8=3, 0 caso contrário.
V84<-0 #1, se V8=4, 0 caso contrário.
V85<-0 #1, se V8=5, 0 caso contrário.
V62.V82<- 0 
V62.V83<- 0
V62.V84<- 0
V62.V85<- 0

tempo<-0:25
sobrev.1<-pnorm((-log(tempo)+b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85)/sigma)


V62<-1
sobrev.2<-pnorm((-log(tempo)+b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85)/sigma)

par(mfrow=c(1,1))
plot(sobrev.1,tempo*0,pch=" ",ylim=range(c(0,1)), xlim=range(c(0,25)),
xlab="Tempo (anos)",ylab="S(t) estimada",bty="n",main="Cigarro")
lines(tempo,sobrev.1,lty=1)
lines(tempo,sobrev.2,lty=2)
legend("topright",lty=c(1,2),c("Sim","Não"),lwd=1, bty="n",cex=0.8)

  • A função de sobrevivência nos indica que o tempo até a experimentação de drogas ilícitas é consideravelmente menor para os estudantes que já fumaram cigarro alguma vez. A distância entre as curvas fornece uma dimensão dessa diferença.

  • O risco de experimentar drogas ilícitas começa a aumentar mais cedo para os estudantes que já fumaram cigarro alguma vez.

1.9.2 Comparando V8=5 com V8=1:

  • Fixou-se cigarro (V6) na categoria (2- Não).
V62<-1 # 1 se V6=2 e 0 c.c
V82<-0 #1, se V8=2, 0 caso contrário.
V83<-0 #1, se V8=3, 0 caso contrário.
V84<-0 #1, se V8=4, 0 caso contrário.
V85<-1 #1, se V8=5, 0 caso contrário.
V62.V82<- 0 
V62.V83<- 0
V62.V84<- 0
V62.V85<- 1

tempo<-0:25
sobrev.1<-pnorm((-log(tempo)+b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85)/sigma)


V85<-0
sobrev.2<-pnorm((-log(tempo)+b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85)/sigma)


par(mfrow=c(1,1))
plot(sobrev.1,tempo*0,pch=" ",ylim=range(c(0,1)), xlim=range(c(0,25)),
xlab="Tempo (anos)",ylab="S(t) estimada",bty="n",main="NOS ÚLTIMOS 12 MESES com que frequência tem se sentido sozinho(a)?")
lines(tempo,sobrev.1,lty=1)
lines(tempo,sobrev.2,lty=2)
legend("topright",lty=c(1,2),c("Sempre","Nunca"),lwd=1, bty="n",cex=0.8)

  • A função de sobrevivência nos indica que o tempo até a experimentação de drogas ilícitas é menor para os estudantes que nos últimos 12 meses declararam que sempre se sentem sozinhos. Nota-se a proximidade das curvas.

1.10 Estimação para um indivíduo

1.10.1 Perfil 1: indivíduo com valores V6=2 (Não), V8=1 (Nunca)

V62<-1 # 1 se V6=2 e 0 c.c
V82<-0 #1, se V8=2, 0 caso contrário.
V83<-0 #1, se V8=3, 0 caso contrário.
V84<-0 #1, se V8=4, 0 caso contrário.
V85<-0 #1, se V8=5, 0 caso contrário.
V62.V82<- 0 
V62.V83<- 0
V62.V84<- 0
V62.V85<- 0

xb<-b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85


par(mfrow=c(3,1))
# Função de sobrevivência
tempo<-0:30
sobreviv<-pnorm((-log(tempo)+xb)/sigma)
plot(tempo,sobreviv,type="l",ylim=range(c(0,1)), xlim=range(c(0,30)),
xlab="Tempo (anos)",ylab="S(t) estimada",bty="n",main="Função de sobrevivência")


# Função Taxa de falha 
fdensidade<-(1/(sqrt(2*pi)*tempo*sigma))*exp(-0.5*((log(tempo)-xb)/sigma)^2)
plot(tempo,fdensidade,type="l",xlab="Tempo (anos)",ylab="f(t) estimada",bty="n",
main="Função densidade")

h_t<-fdensidade/sobreviv
plot(tempo,h_t,type="l",xlab="Tempo (anos)",ylab="h(t) estimada",bty="n",main=
"Função taxa de falha")

# Percentis da distribuição do tempo de vida:
t_p<-function(p){
exp(qnorm(p)*sigma+xb)
}
 
knitr::kable(data.frame(Percentis=c("Percentil 20%","Mediana","Percentil 90%"),Valor=c(t_p(0.2),t_p(0.5),t_p(0.9))))
Percentis Valor
Percentil 20% 16.21459
Mediana 17.72117
Percentil 90% 20.28843
  • Os indivíduos do perfil 1 (Nunca fumaram; Nos últimos 12 meses, nunca se sentem sozinhos), começam a apresentar um decaimento da função de sobrevivência por volta de 15 anos. Aos 20 anos, a função de sobrevivência já se encontra próxima a zero.

  • A partir dos 15 anos, o risco instantâneo de experimentar drogas ilícitas começa a aumentar.

  • Aos 20 anos, o risco de experimentar drogas ilícitas é de 90%.

1.10.2 Perfil 2: indivíduo com valores V6=1 (Sim), V8=5 (Sempre)

V62<-0 # 1 se V6=2 e 0 c.c
V82<-0 #1, se V8=2, 0 caso contrário.
V83<-0 #1, se V8=3, 0 caso contrário.
V84<-0 #1, se V8=4, 0 caso contrário.
V85<-1 #1, se V8=5, 0 caso contrário.
V62.V82<- 0 
V62.V83<- 0
V62.V84<- 0
V62.V85<- 0

xb<-b0+beta.V62*V62+
beta.V82*V82+
beta.V83*V83+
beta.V84*V84+
beta.V85*V85+
beta.V62.V82*V62.V82+
beta.V62.V83*V62.V83+
beta.V62.V84*V62.V84+
beta.V62.V85*V62.V85


par(mfrow=c(3,1))
# Função de sobrevivência
tempo<-0:30
sobreviv<-pnorm((-log(tempo)+xb)/sigma)
plot(tempo,sobreviv,type="l",ylim=range(c(0,1)), xlim=range(c(0,30)),
xlab="Tempo (anos)",ylab="S(t) estimada",bty="n",main="Função de sobrevivência")


# Função Taxa de falha 
fdensidade<-(1/(sqrt(2*pi)*tempo*sigma))*exp(-0.5*((log(tempo)-xb)/sigma)^2)
plot(tempo,fdensidade,type="l",xlab="Tempo (anos)",ylab="f(t) estimada",bty="n",
main="Função densidade")

h_t<-fdensidade/sobreviv
plot(tempo,h_t,type="l",xlab="Tempo (anos)",ylab="h(t) estimada",bty="n",main=
"Função taxa de falha")

# Percentis da distribuição do tempo de vida:
t_p<-function(p){
exp(qnorm(p)*sigma+xb)
}
 
knitr::kable(data.frame(Percentis=c("Percentil 20%","Mediana","Percentil 90%"),Valor=c(t_p(0.2),t_p(0.5),t_p(0.9))))
Percentis Valor
Percentil 20% 12.31815
Mediana 13.46269
Percentil 90% 15.41302
  • Os indivíduos do perfil 2 (Já fumaram alguma vez; Nos últimos 12 meses, sempre se sentem sozinhos), apresentam decaimento da função de sobrevivência por volta de 13 anos, mais cedo que os indivíduos do perfil 1.

  • O risco instantâneo de experimentar drogas ilícitas começa a apresentar aumento entre 10 e 15 anos, também mais cedo que os indivíduos do perfil 1.

  • Aos 15 anos, o risco de experimentar drogas ilícitas é de 90%.

LS0tDQp0aXRsZTogIkFuw6FsaXNlIGRlIFNvYnJldml2w6puY2lhIC0gUHJvamV0byAwMiINCmF1dGhvcjogIlZpY3TDs3JpYSBWYXJnYXMiDQpvdXRwdXQ6IA0KICBybWRmb3JtYXRzOjpyb2JvYm9vazoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlIA0KICAgIHRvY19kZXB0aDogNA0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KLS0tDQoNCg0KIyBNb2RlbG9zIGRlIHJlZ3Jlc3PDo28NCg0KIyMgRGVzY3Jpw6fDo28gZG8gZXN0dWRvIGUgZGFzIHZhcmnDoXZlaXMNCmBgYHtyICBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoc3Vydml2YWwpDQpsaWJyYXJ5KGZsZXhzdXJ2KQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShwYWNtYW4pDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoc2NhbGVzKQ0KcGFjbWFuOjpwX2xvYWQoa25pdHIsIGNhcHRpb25lciwgYnVuZGVzbGlnUiwgc3RyaW5ncikNCg0KdGFibGVfbnVtcyA8LSBjYXB0aW9uZXI6OmNhcHRpb25lcihwcmVmaXggPSAiVGFiZWxhIikNCnRhYi4xX2NhcCA8LSB0YWJsZV9udW1zKG5hbWUgPSAidGFiXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0aW9uID0gIkRlc2NyacOnw6NvIGRhcyB2YXJpw6F2ZWlzIGRhIGJhc2UgZGUgZGFkb3MiKQ0KRHJvZ2FzX1NQIDwtIHJlYWRfY3N2KCJEcm9nYXMtU1AuY3N2IilbLC01XQ0KDQpgYGANCg0KLSBPcyBkYWRvcyBzw6NvIHByb3ZlbmllbnRlcyBkYSBQZXNxdWlzYSBOYWNpb25hbCBkZSBTYcO6ZGUgZG8gRXNjb2xhciAoUGVOU0UpIGRlIDIwMTUsIGNvbmR1emlkYSBwZWxvIElCR0UsIGUgc2UgcmVmZXJlbSBhbyB0ZW1wbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIGVtIHVtYSBhbW9zdHJhIGRlIGVzdHVkYW50ZXMgZG8gOcK6IGFubyBkbyBlbnNpbm8gZnVuZGFtZW50YWwgZGUgZXNjb2xhcyBwcml2YWRhcyBkYSBjaWRhZGUgZGUgU8OjbyBQYXVsby4NCg0KLSAqKk9iamV0aXZvOioqIG1vZGVsYXIgbyB0ZW1wbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIHV0aWxpemFuZG8gdMOpY25pY2FzIGRlIGFuw6FsaXNlIGRlIHNvYnJldml2w6puY2lhLg0KDQotLS0NCg0KPGRpdiBhbGlnbj0iY2VudGVyIj4NCiAgIGByIHRhYmxlX251bXMoJ3RhYl8xJylgDQo8L2Rpdj4NCg0KLS0tDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQoNCmRlc2NfdmFyaWF2ZWlzIDwtIGRhdGEuZnJhbWUoVmFyacOhdmVsID0gY29sbmFtZXMoRHJvZ2FzX1NQKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVub21lYW5kbyA9IGMoInRlbXBvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW5zdXJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXhvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JfcmFjYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vcmFfbWFlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlYmlkYV9hbGNvb2xpY2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNpZ2Fycm8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc3BvbnNhdmVsX2Z1bWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbnRpZG9fc296aW5obyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW1pZ29zX2Ryb2dhcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmnDp8OjbyA9IGMoIlRlbXBvIGF0w6kgbyBwcmltZWlybyB1c28gZGUgZHJvZ2FzIGlsw61jaXRhcywgY29tbzogbWFjb25oYSwgY29jYcOtbmEsIGNyYWNrLCBsb2zDsywgbGFuw6dhLXBlcmZ1bWUsIGVjc3Rhc3ksIG94eSwgZXRjICh2YXJpw6F2ZWwgcmVzcG9zdGEpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5kaWNhZG9yIGRlIGNlbnN1cmEgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXVhbCDDqSBvIHNldSBzZXhvPyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF1YWwgw6kgYSBzdWEgY29yIG91IHJhw6dhPyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWb2PDqiBtb3JhIGNvbSBzdWEgbcOjZT8gIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTk9TIMOaTFRJTU9TIDMwIERJQVMsIGNvbSBxdWUgZnJlcXXDqm5jaWEgc2V1cyBwYWlzIG91IHJlc3BvbnPDoXZlaXMgc2FiaWFtIHJlYWxtZW50ZSBvIHF1ZSB2b2PDqiBlc3RhdmEgZmF6ZW5kbyBlbSBzZXUgdGVtcG8gbGl2cmU/ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsZ3VtYSB2ZXogbmEgdmlkYSB2b2PDqiB0b21vdSB1bWEgZG9zZSBkZSBiZWJpZGEgYWxjb8OzbGljYT8gKFVtYSBkb3NlIGVxdWl2YWxlIGEgdW1hIGxhdGEgZGUgY2VydmVqYSBvdSB1bWEgdGHDp2EgZGUgdmluaG8gb3UgdW1hIGRvc2UgZGUgY2FjaGHDp2Egb3UgdcOtc3F1ZSBldGMpICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsZ3VtYSB2ZXogbmEgdmlkYSwgdm9jw6ogasOhIGZ1bW91IGNpZ2Fycm8sIG1lc21vIHVtYSBvdSBkdWFzIHRyYWdhZGFzPyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGd1bSBkZSBzZXVzIHBhaXMgb3UgcmVzcG9uc8OhdmVpcyBmdW1hPyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOT1Mgw5pMVElNT1MgMTIgTUVTRVMgY29tIHF1ZSBmcmVxdcOqbmNpYSB0ZW0gc2Ugc2VudGlkbyBzb3ppbmhvKGEpPyAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdWFudG9zIGFtaWdvcyBzZXVzIHVzYW0gZHJvZ2FzPyAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3JpYXMgPWMoIi0iLCIwPWNlbnN1cmEgZSAxPWZhbGhhIiwiMT1NYXNjdWxpbm8gZSAyPUZlbWluaW5vIiwiMT1CcmFuY2EsIDI9UHJldGEsIDM9QW1hcmVsYSwgND1QYXJkYSwgNT1JbmTDrWdlbmEgZSAgOTk9TsOjbyBpbmZvcm1hZG8iLCIxPVNpbSwgMj1Ow6NvIGUgOTk9TsOjbyBpbmZvcm1hZG8iLCIxPU51bmNhLCAyPVJhcmFtZW50ZSwgMz3DgHMgdmV6ZXMsIDQ9TmEgbWFpb3IgcGFydGUgZG8gdGVtcG8sIDU9U2VtcHJlIGUgOTk9TsOjbyBpbmZvcm1hZG8iLCIxPVNpbSwgMj1Ow6NvIGUgOTk9TsOjbyBpbmZvcm1hZG8iLCAiMT1TaW0sIDI9TsOjbyBlIDk5PU7Do28gaW5mb3JtYWRvIiwiMT1OZW5odW0gZGVsZXMsIDI9U8OzIG1ldSBwYWkgb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gbWFzY3VsaW5vLCAzPVPDsyBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIGZlbWluaW5vLCA0PU1ldSBwYWkgZSBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlaXMsIDU9TsOjbyBzZWkgZSA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9TnVuY2EsIDI9UmFyYW1lbnRlLCAzPcOAcyB2ZXplcywgND1OYSBtYWlvcmlhIGRhcyB2ZXplcywgNT1TZW1wcmUgZSA5OT1Ow6NvIGluZm9ybWFkbyIsIjE9TmVuaHVtLCAyPVBvdWNvcywgMz1BbGd1bnMsIDQ9QSBtYWlvcmlhLCA1PVRvZG9zLCA2PU7Do28gc2VpIGUgOTk9TsOjbyBpbmZvcm1hZG8iKSkNCg0Ka25pdHI6OmthYmxlKGRlc2NfdmFyaWF2ZWlzKQ0KY29sbmFtZXMoRHJvZ2FzX1NQKTwtIGMoInRlbXBvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJjZW5zdXJhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJzZXhvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJjb3JfcmFjYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAibW9yYV9tYWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgInRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAiYmViaWRhX2FsY29vbGljYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAiY2lnYXJybyIsDQogICAgICAgICAgICAgICAgICAgICAgICAicmVzcG9uc2F2ZWxfZnVtYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAic2VudGlkb19zb3ppbmhvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJhbWlnb3NfZHJvZ2FzIikNCg0KYGBgDQoNCi0gQSBiYXNlIGRlIGRhZG9zIMOpIGNvbXBvc3RhIHBvciA0NDUgb2JzZXJ2YcOnw7VlcyBlICAxMyB2YXJpw6F2ZWlzOiBhcyA5IGNvdmFyacOhdmVpcyBlIGEgdmFyacOhdmVsIHJlc3Bvc3RhIHF1ZSDDqSByZXByZXNlbnRhZGEgcGVsbw0KdGVtcG8gYXTDqSBvIHByaW1laXJvIHVzbyBkZSBkcm9nYXMgaWzDrWNpdGFzIGUgdW1hIHZhcmnDoXZlbCBpbmRpY2Fkb3JhIGRlIG9jb3Jyw6puY2lhIGRlIGNlbnN1cmEuIA0KDQotICoqT2JzZXJ2YcOnw6NvOioqIGEgdmFyacOhdmVsIFYwMDA3IGZvaSByZW1vdmlkYSBkYSBiYXNlIHBvciBuw6NvIGNvbnRlciBkZXNjcmnDp8OjbyBlIGNvbnRlciBzb21lbnRlIHVtYSBjYXRlZ29yaWEgKDIpLg0KDQoNCiMjIEVzdGltYcOnw6NvIGRlIFModCkgcG9yIEthcGxhbi1NZWllciBwYXJhIGNhZGEgdW1hIGRhcyBjb3ZhcmnDoXZlaXMgDQoNCg0KYGBge3J9DQoNCg0KRHJvZ2FzX1NQIDwtIERyb2dhc19TUCAlPiUgbXV0YXRlKHNleG9fY2F0ID0gaWZlbHNlKHNleG89PTEsIk1hc2N1bGlubyIsIkZlbWluaW5vIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29yX3JhY2FfY2F0ID0gaWZlbHNlKGNvcl9yYWNhID09MSwgIkJyYW5jYSIsaWZlbHNlKGNvcl9yYWNhPT0yLCJQcmV0YSIsaWZlbHNlKGNvcl9yYWNhPT0zLCJBbWFyZWxhIixpZmVsc2UoY29yX3JhY2E9PTQsIlBhcmRhIiwiSW5kw61nZW5hIikpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yYV9tYWVfY2F0ID0gaWZlbHNlKG1vcmFfbWFlID09IDEsIlNpbSIsIk7Do28iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzX2NhdCA9IGlmZWxzZSh0ZW1wb19saXZyZV9yZXNwb25zYXZlaXM9PTEsIk51bmNhIixpZmVsc2UodGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzPT0yLCJSYXJhbWVudGUiLGlmZWxzZSh0ZW1wb19saXZyZV9yZXNwb25zYXZlaXM9PTMsIsOAcyB2ZXplcyIsaWZlbHNlKHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcz09NCwiTmEgbWFpb3IgcGFydGUgZG8gdGVtcG8iLCJTZW1wcmUiKSkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWJpZGFfYWxjb29saWNhX2NhdCA9IGlmZWxzZShiZWJpZGFfYWxjb29saWNhPT0xLCJTaW0iLCJOw6NvIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lnYXJyb19jYXQgPSBpZmVsc2UoY2lnYXJybz09MSwiU2ltIiwiTsOjbyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNhdmVsX2Z1bWFfY2F0ID0gaWZlbHNlKHJlc3BvbnNhdmVsX2Z1bWE9PTEsIk5lbmh1bSBkZWxlcyIsaWZlbHNlKHJlc3BvbnNhdmVsX2Z1bWE9PTIsIlPDsyBtZXUgcGFpIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIG1hc2N1bGlubyIsaWZlbHNlKHJlc3BvbnNhdmVsX2Z1bWE9PTMsIlPDsyBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIGZlbWluaW5vIixpZmVsc2UocmVzcG9uc2F2ZWxfZnVtYT09NCwiTWV1IHBhaSBlIG1pbmhhIG3Do2Ugb3UgcmVzcG9uc8OhdmVpcyIsaWZlbHNlKHJlc3BvbnNhdmVsX2Z1bWE9PTUsIk7Do28gc2VpIiwiTsOjbyBpbmZvcm1hZG8iKSkpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGlkb19zb3ppbmhvX2NhdCA9IGlmZWxzZShzZW50aWRvX3NvemluaG89PTEsIk51bmNhIixpZmVsc2Uoc2VudGlkb19zb3ppbmhvPT0yLCJSYXJhbWVudGUiLGlmZWxzZShzZW50aWRvX3NvemluaG89PTMsIsOAcyB2ZXplcyIsaWZlbHNlKHNlbnRpZG9fc296aW5obz09NCwiTmEgbWFpb3JpYSBkYXMgdmV6ZXMiLCJTZW1wcmUiKSkpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWlnb3NfZHJvZ2FzX2NhdCA9IGlmZWxzZShhbWlnb3NfZHJvZ2FzID09IDEsIk5lbmh1bSIsaWZlbHNlKGFtaWdvc19kcm9nYXM9PTIsIlBvdWNvcyIsaWZlbHNlKGFtaWdvc19kcm9nYXM9PTMsIkFsZ3VucyIsaWZlbHNlKGFtaWdvc19kcm9nYXM9PTQsIkEgbWFpb3JpYSIsaWZlbHNlKGFtaWdvc19kcm9nYXM9PTUsIlRvZG9zIiwiTsOjbyBzZWkiKSkpKSkpDQoNCnRlbXBvczwtIERyb2dhc19TUCR0ZW1wbw0KY2VuczwtRHJvZ2FzX1NQJGNlbnN1cmENCg0KDQpla21WMTwtc3VydmZpdChTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1Akc2V4b19jYXQpDQpla21WMjwtc3VydmZpdChTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkY29yX3JhY2FfY2F0KQ0KZWttVjM8LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJG1vcmFfbWFlX2NhdCkNCmVrbVY0PC1zdXJ2Zml0KFN1cnYodGVtcG9zLGNlbnMpfkRyb2dhc19TUCR0ZW1wb19saXZyZV9yZXNwb25zYXZlaXNfY2F0KQ0KZWttVjU8LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJGJlYmlkYV9hbGNvb2xpY2FfY2F0KQ0KZWttVjY8LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJGNpZ2Fycm9fY2F0KQ0KZWttVjc8LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJHJlc3BvbnNhdmVsX2Z1bWFfY2F0KQ0KZWttVjg8LXN1cnZmaXQoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJHNlbnRpZG9fc296aW5ob19jYXQpDQpla21WOTwtc3VydmZpdChTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkYW1pZ29zX2Ryb2dhc19jYXQgKQ0KDQoNCnBsb3QoZWttVjEsbHR5PWMoMSwyKSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLG1haW49InNleG8iKQ0KbGVnZW5kKCJib3R0b21sZWZ0IixsdHk9YygxLDIpLGMoIkZlbWluaW5vIiwiTWFzY3VsaW5vIiksbHdkPTEsYnR5PSJuIikNCg0KYGBgDQotIEEgcGFydGlyIGRvcyAxNSBhbm9zLCBhIGN1cnZhIGRlIHNvYnJldml2w6puY2lhIGRvIHNleG8gZmVtaW5pbm8gcG9zc3VpIHF1ZWRhIGFicnVwdGEsIGZpY2FuZG8gYWJhaXhvIGRhIGN1cnZhIGRvIHNleG8gbWFzY3VsaW5vLiBJc3NvIG5vcyBkaXogcXVlIGEgcGFydGlyIGRlc3NhIGlkYWRlLCBhcyBwcm9iYWJpbGlkYWRlcyBkZSBzb2JyZXZpdsOqbmNpYSBwYXJhIG8gc2V4byBmZW1pbmlubyBzw6NvIGluZmVyaW9yZXMgw6BzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIGRvIHNleG8gbWFzY3VsaW5vDQoNCg0KYGBge3J9DQoNCnBsb3QoZWttVjIsbHR5PWMoMSwyLDMsNCw1KSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLG1haW49ImNvcl9yYWNhIiwgY29sPWMoMSwyLDMsNCw1KSkNCmxlZ2VuZCgiYm90dG9tbGVmdCIsbHR5PWMoMSwyLDMsNCw1KSxjKCJBbWFyZWxhIiwiQnJhbmNhIiwiSW5kw61nZW5hIiwiUGFyZGEiLCJQcmV0YSIpLGx3ZD0xLGJ0eT0ibiIsIGNvbD1jKDEsMiwzLDQsNSkpDQoNCmBgYA0KLSBBIGN1cnZhIGRlIHNvYnJldml2w6puY2lhIHBvciBLYXBsYW4tTWVpZXIgZGEgY29yIGJyYW5jYSDDqSBhIHByaW1laXJhIGEgYXByZXNlbnRhciBxdWVkYSBuYSBwcm9iYWJpbGlkYWRlIGRlIHNvYnJldml2w6puY2lhLg0KDQoNCg0KDQpgYGB7cn0NCnBsb3QoZWttVjMsbHR5PWMoMSwyKSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLG1haW49Im1vcmFfbWFlIikNCmxlZ2VuZCgiYm90dG9tbGVmdCIsbHR5PWMoMSwyKSxjKCJOw6NvIiwiU2ltIiksbHdkPTEsYnR5PSJuIikNCg0KYGBgDQoNCi0gQSBkaWZlcmVuw6dhIGVudHJlIGFzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIGRvcyBlc3R1ZGFudGVzIHF1ZSBuw6NvIG1vcmFtIGNvbSBhIG3Do2UgZSBkb3MgcXVlIG1vcmFtIGNvbSBhIG3Do2Ugw6kgbWFpb3IgYW8gc2UgYXByb3hpbWFyIGRvcyAxNSBhbm9zLiANCg0KDQpgYGB7cn0NCnBsb3QoZWttVjQsbHR5PWMoMSwyLDMsNCw1KSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLG1haW49InRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyIsY29sPWMoMSwyLDMsNCw1KSkNCmxlZ2VuZCgiYm90dG9tbGVmdCIsbHR5PWMoMSwyLDMsNCw1KSxjKCLDgHMgdmV6ZXMiLCJOYSBtYWlvciBwYXJ0ZSBkbyB0ZW1wbyIsIk51bmNhIiwiUmFyYW1lbnRlIiwiU2VtcHJlIiksbHdkPTEsYnR5PSJuIixjb2w9YygxLDIsMyw0LDUpKQ0KDQpgYGANCg0KDQotIEFzIGN1cnZhcyBkZSBzb2JyZXZpdsOqbmNpYSBkYXMgY2F0ZWdvcmlhcyAqw4BzIHZlemVzKiwgKk5hIG1haW9yIHBhcnRlIGRvIHRlbXBvKiBlICpTZW1wcmUqDQpmaWNhbSBhY2ltYSBkYXMgY3VydmFzIGRhcyBjYXRlZ29yaWFzICpOdW5jYSogZSAqUmFyYW1lbnRlKiBlbSBncmFuZGUgcGFydGUgZG9zIGFub3MuIA0KDQogDQoNCmBgYHtyfQ0KcGxvdChla21WNSxsdHk9YygxLDIpLHhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iUyh0KSBlc3RpbWFkYSIsbWFpbj0iYmViaWRhX2FsY29vbGljYSIpDQpsZWdlbmQoImJvdHRvbWxlZnQiLGx0eT1jKDEsMiksYygiTsOjbyIsIlNpbSIpLGx3ZD0xLGJ0eT0ibiIpDQoNCmBgYA0KLSBBIGN1cnZhIGRlIHNvYnJldml2w6puY2lhIGRvcyBlc3R1ZGFudGVzIHF1ZSBhbGd1bWEgdmV6IG5hIHZpZGEgdm9jw6ogdG9tYXJhbSB1bWEgZG9zZSBkZSBiZWJpZGEgYWxjb8OzbGljYSBwb3NzdWkgbWFpcyBmYWxoYXMsIGJlbSBjb21vIGRlY2FpIG1haXMgY2VkbyBlIHJhcGlkYW1lbnRlIHF1ZSBhIGN1cnZhIGRvcyBlc3R1ZGFudGVzIHF1ZSBuw6NvIHRvbWFyYW0uIA0KDQotIEFzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhIHBhcmEgb3MgZXN0dWRhbnRlcyBxdWUgdG9tYXJhbSBiZWJpZGEgYWxjw7NvbGljYSDDqSBtZW5vci4gDQoNCmBgYHtyfQ0KcGxvdChla21WNixsdHk9YygxLDIpLHhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iUyh0KSBlc3RpbWFkYSIsbWFpbj0iY2lnYXJybyIpDQpsZWdlbmQoImJvdHRvbWxlZnQiLGx0eT1jKDEsMiksYygiTsOjbyIsIlNpbSIpLGx3ZD0xLGJ0eT0ibiIpDQoNCmBgYA0KDQotIEEgY3VydmEgZGUgc29icmV2aXbDqm5jaWEgZG9zIGVzdHVkYW50ZXMgcXVlIGFsZ3VtYSB2ZXogbmEgdmlkYSB2b2PDqiBmdW1hcmFtIGNpZ2Fycm8gcG9zc3VpIG1haXMgZmFsaGFzIGRlY2FpIG1haXMgcmFwaWRhbWVudGUgcXVlIGEgY3VydmEgZG9zIGVzdHVkYW50ZXMgcXVlIG7Do28gZnVtYXJhbS4gQXMgcHJvYmFiaWxpZGFkZXMgZGUgc29icmV2aXbDqm5jaWEgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSB0b21hcmFtIGJlYmlkYSBhbGPDs29saWNhIMOpIG1lbm9yLiANCg0KDQpgYGB7cn0NCnBsb3QoZWttVjcsbHR5PWMoMSwyLDMsNCw1LDYpLHhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iUyh0KSBlc3RpbWFkYSIsbWFpbj0icmVzcG9uc2F2ZWxfZnVtYSIsIGNvbD1jKDEsMiwzLDQsNSw2KSkNCmxlZ2VuZCgiYm90dG9tbGVmdCIsbHR5PWMoMSwyLDMsNCw1LDYpLGMoIk1ldSBwYWkgZSBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlaXMiLCJOw6NvIGluZm9ybWFkbyIsIk7Do28gc2VpIiwiTmVuaHVtIGRlbGVzIiwiU8OzIG1ldSBwYWkgb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gbWFzY3VsaW5vIiwiU8OzIG1pbmhhIG3Do2Ugb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gZmVtaW5pbm8iKSxsd2Q9MSxidHk9Im4iLCBjb2w9YygxLDIsMyw0LDUsNikpDQoNCg0KYGBgDQotIEFzIG1lbm9yZXMgcHJvYmFiaWxpZGFkZXMgZGUgc29icmV2aXbDqm5jaWEgc8OjbyBvYnNlcnZhZGFzIHBhcmEgb3MgZXN0dWRhbnRlcyBxdWUgbsOjbyBzYWJlbSBzZSBvIHJlc3BvbnPDoXZlbCBmdW1hLCANCnNlZ3VpZG8gZG9zIGVzdHVkYW50ZXMgcXVlIGRlY2xhcmFyYW0gcXVlIHPDsyBhIG3Do2Ugb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gZmVtaW5pbm8gZnVtYS4gDQoNCg0KYGBge3J9DQpwbG90KGVrbVY4LGx0eT1jKDEsMiwzLDQsNSkseGxhYj0iVGVtcG8gKGFub3MpIix5bGFiPSJTKHQpIGVzdGltYWRhIixtYWluPSJzZW50aWRvX3NvemluaG8iLCBjb2w9YygxLDIsMyw0LDUpKQ0KbGVnZW5kKCJib3R0b21sZWZ0IixsdHk9YygxLDIsMyw0LDUpLGMoIsOAcyB2ZXplcyIsIk5hIG1haW9yaWEgZGFzIHZlemVzIiwiTnVuY2EiLCJSYXJhbWVudGUiLCJTZW1wcmUiKSxsd2Q9MSxidHk9Im4iLCBjb2w9YygxLDIsMyw0LDUpKQ0KDQpgYGANCg0KLSBBcyBjdXJ2YXMgZG9zIGVzdHVkYW50ZXMgcXVlIGRlY2xhcmFyYW0gcXVlIG5vcyDDumx0aW1vcyAxMiBtZXNlcyBzZSBzZW50aXJhbSBzb3ppbmhvcyBzZW1wcmUgb3UgbmEgbWFpb3JpYSBkYXMgdmV6ZXMgZXN0w6NvIGFiYWl4byBkYXMgZGVtYWlzLCANCm8gcXVlIGluZGljYSBtZW5vcmVzIHByb2JhYmlsaWRhZGVzIGRlIHNvYnJldml2w6puY2lhLiANCg0KDQpgYGB7cn0NCnBsb3QoZWttVjksbHR5PWMoMSwyLDMsNCw1KSx4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLG1haW49ImFtaWdvc19kcm9nYXMiLCBjb2w9YygxLDIsMyw0LDUpKQ0KbGVnZW5kKCJib3R0b21sZWZ0IixsdHk9YygxLDIsMyw0LDUpLGMoIkEgbWFpb3JpYSIsIkFsZ3VucyIsIk7Do28gc2VpIiwiTmVuaHVtIiwiUG91Y29zIiksbHdkPTEsYnR5PSJuIiwgY29sPWMoMSwyLDMsNCw1KSkNCg0KYGBgDQotIEEgY3VydmEgZGUgc29icmV2aXbDqm5jaWEgZG9zIGVzdHVkYW50ZXMgcXVlIGRlY2xhcmFyYW0gcXVlIGEgbWFpb3JpYSBkb3MgYW1pZ29zIHVzYW0gZHJvZ2FzIGRlc3RvYSBkYXMgZGVtYWlzLCBwb3NzdWluZG8gcXVlZGEgYWJydXB0YS4gDQoNCiMjICBUZXN0ZSBMb2dyYW5rIHBhcmEgY2FkYSB1bWEgZGFzIGNvdmFyacOhdmVpcyANCg0KYGBge3J9DQoNCmxvZ3JhbmsxIDwtIHN1cnZkaWZmKFN1cnYodGVtcG9zLGNlbnMpfkRyb2dhc19TUCRzZXhvX2NhdCxyaG89MCkNCmxvZ3JhbmsyIDwtIHN1cnZkaWZmKFN1cnYodGVtcG9zLGNlbnMpfkRyb2dhc19TUCRjb3JfcmFjYV9jYXQscmhvPTApDQpsb2dyYW5rMyA8LSBzdXJ2ZGlmZihTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkbW9yYV9tYWVfY2F0LHJobz0wKQ0KbG9ncmFuazQgPC0gc3VydmRpZmYoU3Vydih0ZW1wb3MsY2Vucyl+RHJvZ2FzX1NQJHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpc19jYXQscmhvPTApDQpsb2dyYW5rNSA8LSBzdXJ2ZGlmZihTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkYmViaWRhX2FsY29vbGljYV9jYXQscmhvPTApDQpsb2dyYW5rNiA8LSBzdXJ2ZGlmZihTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkY2lnYXJyb19jYXQscmhvPTApDQpsb2dyYW5rNyA8LSBzdXJ2ZGlmZihTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1AkcmVzcG9uc2F2ZWxfZnVtYV9jYXQscmhvPTApDQpsb2dyYW5rOCA8LSBzdXJ2ZGlmZihTdXJ2KHRlbXBvcyxjZW5zKX5Ecm9nYXNfU1Akc2VudGlkb19zb3ppbmhvX2NhdCxyaG89MCkNCmxvZ3Jhbms5IDwtIHN1cnZkaWZmKFN1cnYodGVtcG9zLGNlbnMpfkRyb2dhc19TUCRhbWlnb3NfZHJvZ2FzX2NhdCxyaG89MCkNCg0KbHJfcHYgPSBkYXRhLmZyYW1lKA0KICBDb3ZhcmlhdmVpcyA9IGMoInNleG8iLA0KICJjb3JfcmFjYSIsDQogIm1vcmFfbWFlIiwNCiAidGVtcG9fbGl2cmVfcmVzcG9uIiwNCiAiYmViaWRhX2FsY29vbGljYSIsDQogImNpZ2Fycm8iLA0KICJyZXNwb25zYXZlbF9mdW1hIiwNCiAic2VudGlkb19zb3ppbmhvIiAsDQogImFtaWdvc19kcm9nYXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsb3JlcyI9IHJvdW5kKGMoMS1wY2hpc3EobG9ncmFuazEkY2hpc3EsMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3JhbmsyJGNoaXNxLDQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rMyRjaGlzcSwxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1wY2hpc3EobG9ncmFuazQkY2hpc3EsNCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3Jhbms1JGNoaXNxLDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rNiRjaGlzcSwxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1wY2hpc3EobG9ncmFuazckY2hpc3EsNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3Jhbms4JGNoaXNxLDQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rOSRjaGlzcSw0KSksNCksIA0KQ2F0ZWdvcmlhcz1jKCIxPU1hc2N1bGlubyBlIDI9RmVtaW5pbm8iLA0KICAgICAgICAgICAgICIxPUJyYW5jYSwgMj1QcmV0YSwgMz1BbWFyZWxhLCA0PVBhcmRhLCA1PUluZMOtZ2VuYSIsDQogICAgICAgICAgICAgIjE9U2ltLCAyPU7Do28iLA0KICAgICAgICAgICAgICIxPU51bmNhLCAyPVJhcmFtZW50ZSwgMz3DgHMgdmV6ZXMsIDQ9TmEgbWFpb3IgcGFydGUgZG8gdGVtcG8sIDU9U2VtcHJlIiwNCiAgICAgICAgICAgICAiMT1TaW0sIDI9TsOjbyIsIA0KICAgICAgICAgICAgICIxPVNpbSwgMj1Ow6NvIiwNCiAgICAgICAgICAgICAiMT1OZW5odW0gZGVsZXMsIDI9U8OzIG1ldSBwYWkgb3UgcmVzcG9uc8OhdmVsIGRvIHNleG8gbWFzY3VsaW5vLCAzPVPDsyBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlbCBkbyBzZXhvIGZlbWluaW5vLCA0PU1ldSBwYWkgZSBtaW5oYSBtw6NlIG91IHJlc3BvbnPDoXZlaXMsIDU9TsOjbyBzZWkgZSA5OT1Ow6NvIGluZm9ybWFkbyIsDQogICAgICAgICAgICAgIjE9TnVuY2EsIDI9UmFyYW1lbnRlLCAzPcOAcyB2ZXplcywgND1OYSBtYWlvcmlhIGRhcyB2ZXplcywgDQogICAgICAgICAgICAgNT1TZW1wcmUiLA0KICAgICAgICAgICAgICIxPU5lbmh1bSwgMj1Qb3Vjb3MsIDM9QWxndW5zLCA0PUEgbWFpb3JpYSwgNT1Ub2RvcywgNj1Ow6NvIHNlaSIpLA0KUmVzdWx0YWRvID0gaWZlbHNlKGMoMS1wY2hpc3EobG9ncmFuazEkY2hpc3EsMSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3JhbmsyJGNoaXNxLDQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rMyRjaGlzcSwxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1wY2hpc3EobG9ncmFuazQkY2hpc3EsNCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3Jhbms1JGNoaXNxLDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rNiRjaGlzcSwxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS1wY2hpc3EobG9ncmFuazckY2hpc3EsNSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEtcGNoaXNxKGxvZ3Jhbms4JGNoaXNxLDQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLXBjaGlzcShsb2dyYW5rOSRjaGlzcSw0KSk8PTAuMSwiQW8gbsOtdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4xLCByZWplaXRhbW9zIGEgaGlww7N0ZXNlIG51bGENCmRlIGlndWFsZGFkZSBlbnRyZSBhcyBjdXJ2YXMgZGUgc29icmV2aXbDqm5jaWEgZGFzIGNhdGVnb3JpYXMgZGEgdmFyacOhdmVsIiwiQW8gbsOtdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4xLCBuw6NvIHJlamVpdGFtb3MgYSBoaXDDs3Rlc2UgbnVsYQ0KZGUgaWd1YWxkYWRlIGVudHJlIGFzIGN1cnZhcyBkZSBzb2JyZXZpdsOqbmNpYSBkYXMgY2F0ZWdvcmlhcyBkYSB2YXJpw6F2ZWwiKSkNCiAgICAgICAgICAgICAgICAgICAgICANCmtuaXRyOjprYWJsZShscl9wdixjb2wubmFtZXMgPWMoIkNvdmFyacOhdmVpcyIsIlAtdmFsb3JlcyIsICJDYXRlZ29yaWFzIiwiUmVzdWx0YWRvcyIpKQ0KYGBgDQoNCg0KIyMgU2VsZcOnw6NvIGRlIGNvdmFyacOhdmVpcyBwYXJhIG8gbW9kZWxvIA0KDQojIyMgUGFzc28gMSANCi0gKipQYXNzbyAxOioqIEFqdXN0YXIgbW9kZWxvcyBkZSByZWdyZXNzw6NvIHVuaXZhcmlhZG9zIHVzYW5kbyBhIGRpc3RyaWJ1acOnw6NvIEdhbWEgR2VuZXJhbGl6YWRhDQoNCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQpEcm9nYXNfU1BfcmVnIDwtIERyb2dhc19TUCAlPiUgIG11dGF0ZSAoVjEgPSBhcy5mYWN0b3Ioc2V4byksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjIgPSBhcy5mYWN0b3IoY29yX3JhY2EpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYzID0gYXMuZmFjdG9yKG1vcmFfbWFlKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNCA9IGFzLmZhY3Rvcih0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY1ID0gYXMuZmFjdG9yKGJlYmlkYV9hbGNvb2xpY2EpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY2ID0gYXMuZmFjdG9yKGNpZ2Fycm8pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY3ID0gYXMuZmFjdG9yKHJlc3BvbnNhdmVsX2Z1bWEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY4ID0gYXMuZmFjdG9yKHNlbnRpZG9fc296aW5obyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjkgPSBhcy5mYWN0b3IoYW1pZ29zX2Ryb2dhcykpICU+JSANCiAgc2VsZWN0KHRlbXBvLCBjZW5zdXJhLCBWMSxWMixWMyxWNCxWNSxWNixWNyxWOCxWOSkNCg0KbTA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX4xLGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUCkgI21vZGVsbyBudWxvDQoNCm0xPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjEsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjENCm0yPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjIsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjINCm0zPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjMsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjMNCm00PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjQNCm01PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjUsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjUNCm02PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjYsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjYNCm03PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjcsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjcNCm04PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjgsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjgNCm05PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjksZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gVjkNCg0KVFJWMT0yKihtMSRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWMj0yKihtMiRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWMz0yKihtMyRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWND0yKihtNCRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWNT0yKihtNSRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWNj0yKihtNiRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWNz0yKihtNyRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWOD0yKihtOCRsb2dsaWstbTAkbG9nbGlrKQ0KVFJWOT0yKihtOSRsb2dsaWstbTAkbG9nbGlrKQ0KDQoNCnNlbGVjYW8xIDwtIGRhdGEuZnJhbWUoTW9kZWxvPWMoIk51bG8iLCJWMTogc2V4byIsIlYyOiBjb3JfcmFjYSIsIlYzOiBtb3JhX21hZSIsIlY0OiB0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMiLCJWNTogYmViaWRhX2FsY29vbGljYSIsIlY2OiBjaWdhcnJvIiwiVjc6IHJlc3BvbnNhdmVsX2Z1bWEiLCJWODogc2VudGlkb19zb3ppbmhvIiwiVjk6IGFtaWdvc19kcm9nYXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgVFJWID0gYygiLSIscm91bmQoYyhUUlYxLFRSVjIsVFJWMyxUUlY0LFRSVjUsVFJWNixUUlY3LFRSVjgsVFJWOSksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBwdmFsb3IgPSBjKCItIiwgcm91bmQoYygxLXBjaGlzcShUUlYxLGRmPTEpLCAxLXBjaGlzcShUUlYyLGRmPTEpLCAxLXBjaGlzcShUUlYzLGRmPTEpLCAxLXBjaGlzcShUUlY0LGRmPTEpLCAxLXBjaGlzcShUUlY1LGRmPTEpLCAxLXBjaGlzcShUUlY2LGRmPTEpLCAxLXBjaGlzcShUUlY3LGRmPTEpLCAxLXBjaGlzcShUUlY4LGRmPTEpLCAxLXBjaGlzcShUUlY5LGRmPTEpKSw0KSksDQogICAgICAgICAgICAgICAgICAgICAgIFNpZ25pZmljYW5jaWEgPSBjKCItIixpZmVsc2Uocm91bmQoYygxLXBjaGlzcShUUlYxLGRmPTEpLCAxLXBjaGlzcShUUlYyLGRmPTEpLCAxLXBjaGlzcShUUlYzLGRmPTEpLCAxLXBjaGlzcShUUlY0LGRmPTEpLCAxLXBjaGlzcShUUlY1LGRmPTEpLCAxLXBjaGlzcShUUlY2LGRmPTEpLCAxLXBjaGlzcShUUlY3LGRmPTEpLCAxLXBjaGlzcShUUlY4LGRmPTEpLCAxLXBjaGlzcShUUlY5LGRmPTEpKSw0KQ0KPD0wLjEsIkFvIG7DrXZlbCBkZSAxMCUsIMOJIHNpZ25pZmljYXRpdmEiLCJBbyBuw612ZWwgZGUgMTAlLCBOw4NPIMOJIHNpZ25pZmljYXRpdmEiKSkpDQoNCmtuaXRyOjprYWJsZShzZWxlY2FvMSkNCg0KYGBgDQojIyMgUGFzc28gMg0KLSAqKlBhc3NvIDI6KiogQWp1c3RhciBjb25qdW50YW1lbnRlIHRvZGFzIGFzIGNvdsOhcmlhdmVpcyBzaWduaWZpY2F0aXZhcyBhbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgZGUgJDAuMSQgbm8gcGFzc28NCmFudGVyaW9yIGUsIGVtIHNlZ3VpZGEsIGFqdXN0YXIgbW9kZWxvcyByZWR1emlkb3MgZWxpbWluYW5kbyB1bWEgY292YXJpw6F2ZWwgZGUgY2FkYSB2ZXouIA0KDQotIEFvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBkZSAkMC4xJCwgYXMgY292YXJpw6F2ZWlzIHNpZ25pZmljYXRpdmFzIG5vIHBhc3NvIDEgZm9yYW0gdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIChWNCksIGJlYmlkYV9hbGNvb2xpY2EgKFY1KSwgY2lnYXJybyAoVjYpLCByZXNwb25zYXZlbF9mdW1hKFY3KSwgc2VudGlkb19zb3ppbmhvIChWOCkgZSBhbWlnb3NfZHJvZ2FzIChWOSkuIFBvcnRhbnRvLCBlc3RhcyBjb3ZhcmnDoXZlaXMgY29tcMO1ZW0gbyBtb2RlbG8gY29tcGxldG8uIA0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KDQptLmNvbXAgPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjUrVjYrVjcrVjgrVjksZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb21wbGV0bw0KbS4xIDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNStWNitWNytWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWNA0KbS4yIDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWNytWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWNQ0KbS4zIDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNStWNytWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWNg0KbS40IDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNStWNitWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWNw0KbS41IDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNStWNitWNytWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWOA0KbS42IDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNStWNitWNytWOCxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWOQ0KDQoNClRSVi4xPTIqKG0uY29tcCRsb2dsaWstbS4xJGxvZ2xpaykgI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIHNlbSBWNCBlIG8gbW9kZWxvIGNvbXBsZXRvIChIMDpiZXRhX1Y0PTApDQpUUlYuMj0yKihtLmNvbXAkbG9nbGlrLW0uMiRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gVjUgZSBvIG1vZGVsbyBjb21wbGV0byAoSDA6YmV0YV9WNT0wKQ0KVFJWLjM9MioobS5jb21wJGxvZ2xpay1tLjMkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIFY2IGUgbyBtb2RlbG8gY29tcGxldG8gKEgwOmJldGFfVjY9MCkNClRSVi40PTIqKG0uY29tcCRsb2dsaWstbS40JGxvZ2xpaykgI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIHNlbSBWNyBlIG8gbW9kZWxvIGNvbXBsZXRvIChIMDpiZXRhX1Y3PTApDQpUUlYuNT0yKihtLmNvbXAkbG9nbGlrLW0uNSRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gVjggZSBvIG1vZGVsbyBjb21wbGV0byAoSDA6YmV0YV9WOD0wKQ0KVFJWLjY9MioobS5jb21wJGxvZ2xpay1tLjYkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIFY5IGUgbyBtb2RlbG8gY29tcGxldG8gKEgwOmJldGFfVjk9MCkNCg0KDQpzZWxlY2FvMiA8LSBkYXRhLmZyYW1lKE1vZGVsbz1jKCJDb21wbGV0bzogVjQrVjUrVjYrVjgrVjkiLCJUaXJhbmRvIHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyAoVjQpOiBWNStWNitWOCtWOSAiLCIgVGlyYW5kbyBiZWJpZGFfYWxjb29saWNhIChWNSk6IFY0K1Y2K1Y3K1Y4K1Y5IiwiIFRpcmFuZG8gY2lnYXJybyhWNik6IFY0K1Y1K1Y4K1Y5ICIsIlRpcmFuZG8gcmVzcG9uc2F2ZWxfZnVtYSAoVjcpIDogVjQrVjUrVjYrVjgrVjkiLCJUaXJhbmRvIHNlbnRpZG9fc296aW5obyAoVjgpOiAiLCJUaXJhbmRvIGFtaWdvc19kcm9nYXMgKFY5KTogVjQrVjUrVjYrVjgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgVFJWID0gYygiLSIscm91bmQoYyhUUlYuMSxUUlYuMixUUlYuMyxUUlYuNCxUUlYuNSxUUlYuNiksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBwdmFsb3IgPSBjKCItIiwgcm91bmQoYygxLXBjaGlzcShUUlYuMSxkZj0xKSwxLXBjaGlzcShUUlYuMixkZj0xKSwxLXBjaGlzcShUUlYuMyxkZj0xKSwxLXBjaGlzcShUUlYuNCxkZj0xKSwxLXBjaGlzcShUUlYuNSxkZj0xKSwxLXBjaGlzcShUUlYuNixkZj0xKSksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBTaWduaWZpY2FuY2lhID0gYygiLSIsaWZlbHNlKHJvdW5kKGMoMS1wY2hpc3EoVFJWLjEsZGY9MSksIDEtcGNoaXNxKFRSVi4yLGRmPTEpLCAxLXBjaGlzcShUUlYuMyxkZj0xKSwgMS1wY2hpc3EoVFJWLjQsZGY9MSksIDEtcGNoaXNxKFRSVi41LGRmPTEpLDEtcGNoaXNxKFRSVi42LGRmPTEpKSw0KQ0KPD0wLjEsIkFvIG7DrXZlbCBkZSAxMCUsIMOJIHNpZ25pZmljYXRpdmEiLCJBbyBuw612ZWwgZGUgMTAlLCBOw4NPIMOJIHNpZ25pZmljYXRpdmEiKSkpDQoNCmtuaXRyOjprYWJsZShzZWxlY2FvMikNCg0KYGBgDQotIEFvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBkZSAkMC4xJCwgYSByZXRpcmFkYSBkYXMgdmFyacOhdmVpcyB0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMgKFY0KSwgY2lnYXJybyAoVjYpLCBzZW50aWRvX3NvemluaG8gKFY4KSBlIGFtaWdvc19kcm9nYXMgKFY5KSBpbXBhY3RhIG8gbW9kZWxvLCBwb3J0YW50bywgZXN0YXMgY292YXJpw6F2ZWlzIHPDo28gbWFudGlkYXMgbm8gbW9kZWxvIGNvbXBsZXRvLiANCg0KIyMjIFBhc3NvIDMgDQoNCi0gKipQYXNzbyAzOioqIEFqdXN0YXIgdW0gbW9kZWxvIGNvbSBhcyBjb3ZhcmnDoXZlaXMgcmV0aWRhcyBubyBwYXNzbyAyIChhbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgZGUgJDAuMSQpLiBSZXRvcm5hciBhcyBjb3ZhcmnDoXZlaXMNCmV4Y2x1w61kYXMgbm8gcGFzc28gMiBwYXJhIHZlcmlmaWNhciBzZSBuw6NvIHPDo28gc2lnbmlmaWNhdGl2YXMuIA0KDQoNCi0gQW8gbsOtdmVsIGRlIHNpZ25pZmljw6JuY2lhIGRlICQwLjEkLCBhcyBjb3ZhcmnDoXZlaXMgcmV0aWRhcyBubyBwYXNzbyAyIHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyAoVjQpLCBjaWdhcnJvIChWNiksIHNlbnRpZG9fc296aW5obyAoVjgpIGUgYW1pZ29zX2Ryb2dhcyAoVjkpLCBwb3J0YW50bywgZXN0YXMgY292YXJpw6F2ZWlzIGNvbXDDtWVtIG8gbW9kZWxvIGNvbXBsZXRvLiANCg0KLSBBcyBjb3ZhcmnDoXZlaXMgZXhjbHXDrWRhcyBubyBwYXNzbyAyOiBiZWJpZGFfYWxjb29saWNhIChWNSkgZSByZXNwb25zYXZlbF9mdW1hKFY3KS4NCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCg0KbS5jb21wMSA8LSBmbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjksZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gdmFyacOhdmVpcyByZXRpZGFzIG5vIHBhc3NvIDIgDQoNCm0uY29tcFY1IDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNStWNitWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjdm9sdGFyIGNvbSBWNSANCm0uY29tcFY3IDwtIGZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWNytWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjdm9sdGFyIGNvbSBWNyANCg0KVFJWLlY1PTIqKG0uY29tcFY1JGxvZ2xpay1tLmNvbXAxJGxvZ2xpaykgICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gVjUgZSBvIG1vZGVsbyB2b2x0YW5kbyBjb20gVjUgKEgwOmJldGFfVjU9MCkNClRSVi5WNz0yKihtLmNvbXBWNyRsb2dsaWstbS5jb21wMSRsb2dsaWspICAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIFY3IGUgbyBtb2RlbG8gdm9sdGFuZG8gY29tIFY3IChIMDpiZXRhX1Y3PTApDQoNCg0Kc2VsZWNhbzMgPC0gZGF0YS5mcmFtZShNb2RlbG89YygiQ29tcGxldG86IFY0K1Y2K1Y4K1Y5IiwiVm9sdGFuZG8gY29tIGJlYmlkYV9hbGNvb2xpY2EgKFY1KTogVjQrVjUrVjYrVjgrVjkiLCJWb2x0YW5kbyBjb20gcmVzcG9uc2F2ZWxfZnVtYSAoVjcpOiBWNCtWNitWNytWOCtWOSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBUUlYgPSBjKCItIixyb3VuZChjKFRSVi5WNSxUUlYuVjcpLDQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHZhbG9yID0gYygiLSIscm91bmQoYygxLXBjaGlzcShUUlYuVjUsZGY9MSksMS1wY2hpc3EoVFJWLlY3LGRmPTEpKSw0KSksDQogICAgICAgICAgICAgICAgICAgICAgIFNpZ25pZmljYW5jaWEgPSBjKCItIixpZmVsc2Uocm91bmQoYygxLXBjaGlzcShUUlYuVjUsZGY9MSksIDEtcGNoaXNxKFRSVi5WNyxkZj0xKSksNCkNCjw9MC4xLCJBbyBuw612ZWwgZGUgMTAlLCDDiSBzaWduaWZpY2F0aXZhIiwiQW8gbsOtdmVsIGRlIDEwJSwgTsODTyDDiSBzaWduaWZpY2F0aXZhIikpKQ0KDQprbml0cjo6a2FibGUoc2VsZWNhbzMpDQoNCg0KDQoNCmBgYA0KDQotIEFvIG7DrXZlbCBkZSAkMC4xJCwgbmVuaHVtYSBjb3ZhcmnDoXZlbCBleGNsdcOtZGEgbm8gcGFzc28gMiByZXRvcm5hIGFvIG1vZGVsby4NCg0KIyMjIFBhc3NvIDQgDQoNCi0gKipQYXNzbyA0OioqIFJldG9ybmFyIGFzIGNvdmFyacOhdmVpcyBleGNsdcOtZGFzIG5vIHBhc3NvIDEgKFYxLFYyLFYzKSBwYXJhIHZlcmlmaWNhciBzZSBuw6NvIHPDo28gc2lnbmlmaWNhdGl2YXMuDQoNCg0KYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCm0uY29tcDI8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIG9idGlkbyANCg0KbS5jb21wMi5WMTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflYxK1Y0K1Y2K1Y4K1Y5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KbS5jb21wMi5WMjwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflYyK1Y0K1Y2K1Y4K1Y5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KbS5jb21wMi5WMzwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflYzK1Y0K1Y2K1Y4K1Y5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KDQoNClRSVi5WMT0yKihtLmNvbXAyLlYxJGxvZ2xpay1tLmNvbXAyJGxvZ2xpaykgI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIHNlbSBWMSBlIG8gbW9kZWxvIHZvbHRhbmRvIGNvbSBWMSAoSDA6YmV0YV9WMT0wKQ0KVFJWLlYyPTIqKG0uY29tcDIuVjIkbG9nbGlrLW0uY29tcDIkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIFYyIGUgbyBtb2RlbG8gdm9sdGFuZG8gY29tIFYxIChIMDpiZXRhX1YyPTApDQpUUlYuVjM9MioobS5jb21wMi5WMyRsb2dsaWstbS5jb21wMiRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gVjMgZSBvIG1vZGVsbyB2b2x0YW5kbyBjb20gVjMgKEgwOmJldGFfVjM9MCkNCg0Kc2VsZWNhbzQgPC0gZGF0YS5mcmFtZShNb2RlbG89YygiQ29tcGxldG86IFY0K1Y2K1Y4K1Y5IiwiVm9sdGFuZG8gY29tIHNleG8gKFYxKTogVjErVjQrVjYrVjgrVjkgIiwiVm9sdGFuZG8gY29tIGNvcl9yYWNhIChWMik6IFYyK1Y0K1Y2K1Y4K1Y5ICIsIlZvbHRhbmRvIGNvbSBtb3JhX21hZSAoVjMpOiBWMytWNCtWNitWOCtWOSIpLA0KICAgICAgICAgICAgICAgICAgICAgICBUUlYgPSBjKCItIixyb3VuZChjKFRSVi5WMSxUUlYuVjIsVFJWLlYzKSw0KSksDQogICAgICAgICAgICAgICAgICAgICAgIHB2YWxvciA9IGMoIi0iLHJvdW5kKGMoMS1wY2hpc3EoVFJWLlYxLGRmPTEpLDEtcGNoaXNxKFRSVi5WMixkZj0xKSwxLXBjaGlzcShUUlYuVjMsZGY9MSkpLDQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgU2lnbmlmaWNhbmNpYSA9IGMoIi0iLGlmZWxzZShyb3VuZChjKDEtcGNoaXNxKFRSVi5WMSxkZj0xKSwgMS1wY2hpc3EoVFJWLlYyLGRmPTEpLCAxLXBjaGlzcShUUlYuVjMsZGY9MSkpLDQpDQo8PTAuMSwiQW8gbsOtdmVsIGRlIDEwJSwgw4kgc2lnbmlmaWNhdGl2YSIsIkFvIG7DrXZlbCBkZSAxMCUsIE7Dg08gw4kgc2lnbmlmaWNhdGl2YSIpKSkNCg0Ka25pdHI6OmthYmxlKHNlbGVjYW80KQ0KIA0KYGBgDQotIEFvIG7DrXZlbCBkZSAkMC4xJCwgbmVuaHVtYSBjb3ZhcmnDoXZlbCBleGNsdcOtZGEgbm8gcGFzc28gMSByZXRvcm5hIGFvIG1vZGVsby4NCg0KIyMjIFBhc3NvIDUgDQoNCi0gKipQYXNzbyA1OioqIFRlc3RhciBzZSBhbGd1bWEgY292YXJpw6F2ZWwgcG9kZSBzYWlyIGRvIG1vZGVsby4NCg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQoNCm0uY29tcDI8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIG9idGlkbyANCg0KbS5zZW1WNDwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY2K1Y4K1Y5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gc2VtIFY0DQptLnNlbVY2PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjgrVjksZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBzZW0gVjYNCm0uc2VtVjg8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIHNlbSBWOA0KbS5zZW1WOTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gc2VtIFY5DQoNCg0KVFJWLnNlbVY0PTIqKG0uY29tcDIkbG9nbGlrLW0uc2VtVjQkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gY29tcGxldG8gZSBvIHNlbSBWNCAoSDA6YmV0YV9WND0wKQ0KVFJWLnNlbVY2PTIqKG0uY29tcDIkbG9nbGlrLW0uc2VtVjYkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gY29tcGxldG8gZSBvIHNlbSBWNiAoSDA6YmV0YV9WNj0wKQ0KVFJWLnNlbVY4PTIqKG0uY29tcDIkbG9nbGlrLW0uc2VtVjgkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gY29tcGxldG8gZSBvIHNlbSBWOCAoSDA6YmV0YV9WOD0wKQ0KVFJWLnNlbVY5PTIqKG0uY29tcDIkbG9nbGlrLW0uc2VtVjkkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gY29tcGxldG8gZSBvIHNlbSBWOSAoSDA6YmV0YV9WOT0wKQ0KDQpzZWxlY2FvNSA8LSBkYXRhLmZyYW1lKE1vZGVsbz1jKCJDb21wbGV0bzogVjQrVjYrVjgrVjkiLCJUaXJhbmRvIHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyAoVjQpOiBWNitWOCtWOSAiLCJUaXJhbmRvIGNpZ2Fycm8gKFY2KTogVjQrVjgrVjkiLCJUaXJhbmRvIHNlbnRpZG9fc296aW5obyAoVjgpOiBWNCtWNitWOSIsIlRpcmFuZG8gYW1pZ29zX2Ryb2dhcyAoVjkpOiBWNCtWNitWOCIpLA0KICAgICAgICAgICAgICAgICAgICAgICBUUlYgPSBjKCItIixyb3VuZChjKFRSVi5zZW1WNCxUUlYuc2VtVjYsVFJWLnNlbVY4LFRSVi5zZW1WOSksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBwdmFsb3IgPSBjKCItIixyb3VuZChjKDEtcGNoaXNxKFRSVi5zZW1WNCxkZj0xKSwxLXBjaGlzcShUUlYuc2VtVjYsZGY9MSksMS1wY2hpc3EoVFJWLnNlbVY4LGRmPTEpLDEtcGNoaXNxKFRSVi5zZW1WOSxkZj0xKSksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBTaWduaWZpY2FuY2lhID0gYygiLSIsaWZlbHNlKHJvdW5kKGMoMS1wY2hpc3EoVFJWLnNlbVY0LGRmPTEpLCAxLXBjaGlzcShUUlYuc2VtVjYsZGY9MSksMS1wY2hpc3EoVFJWLnNlbVY4LGRmPTEpLDEtcGNoaXNxKFRSVi5zZW1WOSxkZj0xKSksNCkNCjw9MC4xLCJBbyBuw612ZWwgZGUgMTAlLCDDiSBzaWduaWZpY2F0aXZhIiwiQW8gbsOtdmVsIGRlIDEwJSwgTsODTyDDiSBzaWduaWZpY2F0aXZhIikpKQ0KDQprbml0cjo6a2FibGUoc2VsZWNhbzUpDQoNCiANCmBgYA0KDQotIEFvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBkZSAkMC4xJCwgY29uY2x1aS1zZSBxdWUgYSByZXRpcmFkYSBkZSBxdWFscXVlciBjb3ZhcmnDoXZlbCAoVjQsIFY2LCBWOCBvdSBWOSkgw6kgc2lnbmlmaWNhdGl2YSwgbG9nbywgbyBtb2RlbG8gY29tcGxldG8gbWFudMOpbSBhcyBjb3ZhcmnDoXZlaXMgdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIChWNCksIGNpZ2Fycm8gKFY2KSwgc2VudGlkb19zb3ppbmhvIChWOCkgZSAgYW1pZ29zX2Ryb2dhcyAoVjkpLiANCg0KIyMjIFBhc3NvIDYNCg0KLSAqKlBhc3NvIDY6KiogVmVyaWZpY2FyIGEgcG9zc2liaWxpZGFkZSBkZSBpbmNsdXPDo28gZGUgaW50ZXJhw6fDo28gZHVwbGEgZW50cmUgYXMgdmFyacOhdmVpcyDigJxzb2JyZXZpdmVudGVz4oCdLg0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQoNCm0uY29tcDI8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOSxkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIG9idGlkbyANCg0KDQptLlY0VjY8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWNixkaXN0PSdnZW5nYW1tYScsZGF0YT1Ecm9nYXNfU1BfcmVnKSAjbW9kZWxvIGNvbSBpbnRlcmHDp8OjbyBlbnRyZSBWNCBlIFY2IA0KbS5WNFY4PC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgI21vZGVsbyBjb20gaW50ZXJhw6fDo28gZW50cmUgVjQgZSBWOCANCm0uVjRWOTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gY29tIGludGVyYcOnw6NvIGVudHJlIFY0IGUgVjkNCm0uVjZWODwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y2KlY4LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gY29tIGludGVyYcOnw6NvIGVudHJlIFY2IGUgVjgNCm0uVjZWOTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y2KlY5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gY29tIGludGVyYcOnw6NvIGVudHJlIFY2IGUgVjkNCm0uVjhWOTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y4KlY5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gY29tIGludGVyYcOnw6NvIGVudHJlIFY4IGUgVjkNCg0KDQoNClRSVi5WNFY2PTIqKG0uVjRWNiRsb2dsaWstbS5jb21wMiRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gaW50ZXJhY2FvIGUgbyBtb2RlbG8gY29tIFY0KlY2IChIMDpiZXRhX1Y0KlY2PTApDQpUUlYuVjRWOD0yKihtLlY0VjgkbG9nbGlrLW0uY29tcDIkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIGludGVyYWNhbyBlIG8gbW9kZWxvIGNvbSBWNCpWOCAoSDA6YmV0YV9WNCpWOD0wKQ0KVFJWLlY0Vjk9MioobS5WNFY5JGxvZ2xpay1tLmNvbXAyJGxvZ2xpaykgI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIHNlbSBpbnRlcmFjYW8gZSBvIG1vZGVsbyBjb20gVjQqVjkgKEgwOmJldGFfVjQqVjk9MCkNClRSVi5WNlY4PTIqKG0uVjZWOCRsb2dsaWstbS5jb21wMiRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gaW50ZXJhY2FvIGUgbyBtb2RlbG8gY29tIFY2KlY4IChIMDpiZXRhX1Y2KlY4PTApDQpUUlYuVjZWOT0yKihtLlY2VjkkbG9nbGlrLW0uY29tcDIkbG9nbGlrKSAjVFJWIGNvbXBhcmFuZG8gbyBtb2RlbG8gc2VtIGludGVyYWNhbyBlIG8gbW9kZWxvIGNvbSBWNipWOSAoSDA6YmV0YV9WNipWOT0wKQ0KVFJWLlY4Vjk9IDIqKG0uVjhWOSRsb2dsaWstbS5jb21wMiRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBzZW0gaW50ZXJhY2FvIGUgbyBtb2RlbG8gY29tIFY4KlY5IChIMDpiZXRhX1Y4KlY5PTApDQoNCg0Kc2VsZWNhbzYgPC0gZGF0YS5mcmFtZShNb2RlbG89YygiQ29tcGxldG86IFY0K1Y2K1Y4K1Y5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbSBpbnRlcmHDp8OjbyBlbnRyZSB0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMgZSBjaWdhcnJvIChWNCBlIFY2KTogVjQrVjYrVjgrVjkrVjQqVjYgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbSBpbnRlcmHDp8OjbyBlbnRyZSB0ZW1wb19saXZyZV9yZXNwb25zYXZlaXMgZSBzZW50aWRvX3NvemluaG8gKFY0IGUgVjgpOiBWNCtWNitWOCtWOStWNCpWOCAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tIGludGVyYcOnw6NvIGVudHJlIHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyBlIGFtaWdvc19kcm9nYXMgKFY0IGUgVjkpOiBWNCtWNitWOCtWOStWNCpWOSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tIGludGVyYcOnw6NvIGVudHJlIGNpZ2Fycm8gZSBzZW50aWRvX3NvemluaG8gKFY2IGUgVjgpOiBWNCtWNitWOCtWOStWNipWOCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb20gaW50ZXJhw6fDo28gZW50cmUgY2lnYXJybyBlIGFtaWdvc19kcm9nYXMgKFY2IGUgVjkpOiBWNCtWNitWOCtWOStWNipWOSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb20gaW50ZXJhw6fDo28gZW50cmUgc2VudGlkb19zb3ppbmhvIGUgYW1pZ29zX2Ryb2dhcyAoVjggZSBWOSk6IFY0K1Y2K1Y4K1Y5K1Y4KlY5IiksDQogICAgICAgICAgICAgICAgICAgICAgIFRSViA9IGMoIi0iLHJvdW5kKGMoVFJWLlY0VjYsVFJWLlY0VjgsVFJWLlY0VjksVFJWLlY2VjgsVFJWLlY2VjksVFJWLlY4VjkpLDQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgcHZhbG9yID0gYygiLSIscm91bmQoYygxLXBjaGlzcShUUlYuVjRWNixkZj0xKSwxLXBjaGlzcShUUlYuVjRWOCxkZj0xKSwxLXBjaGlzcShUUlYuVjRWOSxkZj0xKSwxLXBjaGlzcShUUlYuVjZWOCxkZj0xKSwxLXBjaGlzcShUUlYuVjZWOSxkZj0xKSwxLXBjaGlzcShUUlYuVjhWOSxkZj0xKSksNCkpLA0KICAgICAgICAgICAgICAgICAgICAgICBTaWduaWZpY2FuY2lhID0gYygiLSIsaWZlbHNlKHJvdW5kKGMoMS1wY2hpc3EoVFJWLlY0VjYsZGY9MSksMS1wY2hpc3EoVFJWLlY0VjgsZGY9MSksMS1wY2hpc3EoVFJWLlY0VjksZGY9MSksMS1wY2hpc3EoVFJWLlY2VjgsZGY9MSksMS1wY2hpc3EoVFJWLlY2VjksZGY9MSksMS1wY2hpc3EoVFJWLlY4VjksZGY9MSkpLDQpDQo8PTAuMSwiQW8gbsOtdmVsIGRlIDEwJSwgw4kgc2lnbmlmaWNhdGl2YSIsIkFvIG7DrXZlbCBkZSAxMCUsIE7Dg08gw4kgc2lnbmlmaWNhdGl2YSIpKSkNCg0Ka25pdHI6OmthYmxlKHNlbGVjYW82KQ0KDQoNCmBgYA0KQW8gbsOtdmVsIGRlIHNpZ25pZmljw6JuY2lhIGRlICQwLjEkLCBhcyBpbnRlcmHDp8O1ZXM6DQoNCi0gdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIGUgc2VudGlkb19zb3ppbmhvIChWNCBlIFY4KQ0KDQotIHRlbXBvX2xpdnJlX3Jlc3BvbnNhdmVpcyBlIGFtaWdvc19kcm9nYXMgKFY0IGUgVjkpDQoNCi0gY2lnYXJybyBlIHNlbnRpZG9fc296aW5obyAoVjYgZSBWOCkNCg0KLSBzZW50aWRvX3NvemluaG8gZSBhbWlnb3NfZHJvZ2FzIChWOCBlIFY5KQ0KDQpzw6NvIHNpZ25pZmljYXRpdmFzLCBwb3J0YW50bywgc2Vyw6NvIGFkaWNpb25hZGFzIGFvIG1vZGVsby4gDQoNCiMjIyBQYXNzbyA3DQoNCi0gKipQYXNzbyA3OioqIE1vZGVsbyBmaW5hbCBlc2NvbGhpZG8uDQoNCi0gJE1vZGVsbyBcLCBGaW5hbCA9IFY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5K1Y2KlY4K1Y4KlY5JCANCg0KLSBPIG1vZGVsbyBmaW5hbCBmaWNvdSBjb21wb3N0byBwZWxhcyBjb3ZhcmnDoXZlaXM6ICoqdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIChWNCkqKiwgKipjaWdhcnJvIChWNikqKiwgKipzZW50aWRvX3NvemluaG8gKFY4KSoqIGUgKiphbWlnb3NfZHJvZ2FzIChWOSkqKi4NCg0KLSBPcyB0ZXJtb3MgZGUgaW50ZXJhw6fDo28gJFY0KlY4JCwgJFY0KlY5JCwgJFY2IGUgVjgkIGUgJFY2KlY5JCBmb3JhbSBzaWduaWZpY2F0aXZvcyBhbyBuw612ZWwgZGUgJDAuMSQsIHBvcnRhbnRvLCBmb3JhbSBpbmNsdcOtZG9zIG5vIG1vZGVsby4gDQoNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0Usd2FybmluZz1GQUxTRX0NCg0KbW9kZWxvR2FtYTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5K1Y2KlY4K1Y4KlY5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpICNtb2RlbG8gZmluYWwNCg0KDQpgYGANCg0KIyMgSW52ZXN0aWdhbmRvIGEgdXRpbGl6YcOnw6NvIGRlIG1vZGVsb3MgbWFpcyBzaW1wbGVzDQoNCi0gVW1hIHZleiBlc2NvbGhpZG8gbyBjb25qdW50byBkZSBjb3ZhcmnDoXZlaXMsIG8gaW50ZXJlc3NlIHNlIGNvbmNlbnRyYSBlbSBpbnZlc3RpZ2FyIGEgdXRpbGl6YcOnw6NvIGRlIG1vZGVsb3MgbWFpcyBzaW1wbGVzLCBjYXNvcyBlc3BlY2lhaXMgZGEgZ2FtYQ0KZ2VuZXJhbGl6YWRhLCBtYXMgbsOjbyBtZW5vcyBhZGVxdWFkb3MgYW9zIGRhZG9zLiANCg0KLSBBbyByb2RhciBhIGZ1bsOnw6NvICpmbGV4c3VydnJlZyogcGFyYSBvcyBtb2RlbG9zIEV4cG9uZW5jaWFsLCBXZWlidWxsIGUgTG9nbm9ybWFsIHV0aWxpemFuZG8gbyBtb2RlbG8gJFY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5K1Y2KlY4K1Y4KlY5JCwgb2J0aXZlbW9zIGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlOiANCg0KPiBXYXJuaW5nOiBPcHRpbWlzYXRpb24gaGFzIHByb2JhYmx5IG5vdCBjb252ZXJnZWQgdG8gdGhlIG1heGltdW0gbGlrZWxpaG9vZCAtIEhlc3NpYW4gaXMgbm90IHBvc2l0aXZlIGRlZmluaXRlLg0KDQo+IEVycm9yIGluIHNvbHZlLmRlZmF1bHQoaGVzc2lhbiwgdG9sID0gdG9sLnNvbHZlKSA6IA0KICBMYXBhY2sgcm91dGluZSBkZ2Vzdjogc3lzdGVtIGlzIGV4YWN0bHkgc2luZ3VsYXI6IFVbNDEsNDFdID0gMA0KICANCi0gQSBmaW0gZGUgcG9zc2liaWxpdGFyIGEgY29udGludWlkYWRlIGRvIHRyYWJhbGhvLCBhZG90YW1vcyBhIHNlZ3VpbnRlIG1ldG9kb2xvZ2lhOiBjb21vIG9zIMO6bHRpbW9zIHRlcm1vcyBhIHNlcmVtIGluc2VyaWRvcyBubyBtb2RlbG8gZmluYWwgZm9yYW0gb3MgZGUgaW50ZXJhw6fDo28sIHJlbW92ZW1vcyBjYWRhIHRlcm1vIGRlICBpbnRlcmHDp8OjbyBpbmRpdmlkdWFsbWVudGUgZSBhanVzdGFtb3Mgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCwgdmVyaWZpY2FuZG8gYSBwcmVzZW7Dp2EgZGUgZXJyb3MuIA0KDQotIEFvIHJlbW92ZXIgY2FkYSB0ZXJtbyBkZSBpbnRlcmHDp8OjbywgaW5kaXZpZHVhbG1lbnRlLCBvYnRpdmVtb3Mgb3Mgc2VndWludGVzIHJlc3VsdGFkb3M6IA0KDQoNCmBgYHtyfQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBjb20gdG9kYXMgYXMgaW50ZXJhw6fDtWVzDQoNCiNNb2RlbG8gZXhwb25lbmNpYWwNCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNCpWOStWNipWOCtWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KI01vZGVsbyBXZWlidWxsDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgrVjQqVjkrVjYqVjgrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KI01vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNCpWOStWNipWOCtWOCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KIyBFcnJvIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIGRhIE1hdHJpeiBIZXNzaWFuYQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIGludGVyYcOnw6NvIFY4KlY5DQoNCg0KI01vZGVsbyBleHBvbmVuY2lhbCANCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNCpWOStWNipWOCxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KI01vZGVsbyBXZWlidWxsIA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5K1Y2KlY4LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykgDQoNCiNNb2RlbG8gTG9nLW5vcm1hbCANCg0KIyBtb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgrVjQqVjkrVjYqVjgsZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykgDQoNCiMgRXJybyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBkYSBNYXRyaXogSGVzc2lhbmEgDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gaW50ZXJhw6fDo28gVjYqVjgNCg0KDQojTW9kZWxvIGV4cG9uZW5jaWFsIA0KDQojIG1vZGVsb2V4cDwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5K1Y4KlY5LGRpc3Q9J2V4cG9uZW50aWFsJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KDQojTW9kZWxvIFdlaWJ1bGwgDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgrVjQqVjkrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KI01vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNCpWOStWOCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCg0KIyBFcnJvIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIGRhIE1hdHJpeiBIZXNzaWFuYQ0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIGludGVyYcOnw6NvIFY0KlY5DQoNCg0KI01vZGVsbyBleHBvbmVuY2lhbCANCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNipWOCtWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCiNNb2RlbG8gV2VpYnVsbCANCg0KIyBtb2RlbG9XZWk8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNipWOCtWOCpWOSxkaXN0PSd3ZWlidWxsJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KDQojTW9kZWxvIExvZy1ub3JtYWwgDQoNCiMgbW9kZWxvTG9nbjwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y2KlY4K1Y4KlY5LGRpc3Q9J2xub3JtJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gaW50ZXJhw6fDo28gVjQqVjgNCg0KDQojTW9kZWxvIGV4cG9uZW5jaWFsIA0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOStWNipWOCtWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCiNNb2RlbG8gV2VpYnVsbCANCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjkrVjYqVjgrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKSANCiNNb2RlbG8gTG9nLW5vcm1hbCANCiMgbW9kZWxvTG9nbjwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY5K1Y2KlY4K1Y4KlY5LGRpc3Q9J2xub3JtJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KIyBFcnJvIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIGRhIE1hdHJpeiBIZXNzaWFuYQ0KDQoNCnNlbGVjYW9fbW9kZWxvMSA8LSBkYXRhLmZyYW1lKE1vZGVsbz1jKCJSZXRpcmFuZG8gZG8gbW9kZWxvIGZpbmFsIGEgaW50ZXJhw6fDo28gJFY4KlY5JCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRpcmFuZG8gZG8gbW9kZWxvIGZpbmFsIGEgaW50ZXJhw6fDo28gJFY2KlY4JCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRpcmFuZG8gZG8gbW9kZWxvIGZpbmFsIGEgaW50ZXJhw6fDo28gJFY0KlY5JCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRpcmFuZG8gZG8gbW9kZWxvIGZpbmFsIGEgaW50ZXJhw6fDo28gJFY0KlY4JCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRhZG89YygiQXByZXNlbnRvdSBlcnJvcyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBwYXJhIG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXByZXNlbnRvdSBlcnJvcyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBwYXJhIG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXByZXNlbnRvdSBlcnJvcyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBwYXJhIG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXByZXNlbnRvdSBlcnJvcyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBwYXJhIG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwiKSkNCg0Ka25pdHI6OmthYmxlKHNlbGVjYW9fbW9kZWxvMSkNCg0KDQpgYGANCg0KLSBEYWRvIHF1ZSBhIHJlbW/Dp8OjbyBkb3MgdGVybW9zIGRlIGludGVyYcOnw6NvLCBpbmRpdmlkdWFsbWVudGUsIG7Do28gYWNhcnJldG91IGVtIG1lbGhvcmFzIG5hIGV4ZWN1w6fDo28gZG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwsIG8gcHLDs3hpbW8gcGFzc28gY29uc2lzdGl1IG5hIHJlbW/Dp8OjbyBjb25qdW50YSBkZSB0ZXJtb3MgZGUgaW50ZXJhw6fDo28uIFBhcmEgaXNzbywgYXMgY29tYmluYcOnw7VlcyBkb3MgdGVybW9zIGRlIGludGVyYcOnw6NvIHRvbWFkb3MgMiBhIDIsIDMgYSAzIGUgNCBhIDQgZm9yYW0gcmV0aXJhZGFzIGRvIG1vZGVsbyBlIGZvaSB2ZXJpZmljYWRhIGEgcHJlc2Vuw6dhIGRlIGVycm9zLiANCg0KDQpgYGB7cn0NCg0KIyBjb21ibig0LDIpDQojIGNvbWJuKDQsMykNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY4KlY5IGUgVjYqVjggDQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgrVjQqVjksZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y0KlY5LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY4KlY5IGUgVjQqVjkgDQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgrVjYqVjgsZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y2KlY4LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWNipWOCxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCg0KIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY4KlY5IGUgVjQqVjggDQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjkrVjYqVjgsZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY5K1Y2KlY4LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbCANCg0KIyBtb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjkrVjYqVjgsZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBFcnJvIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIGRhIE1hdHJpeiBIZXNzaWFuYQ0KDQoNCg0KDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gVjYqVjggZSBWNCpWOQ0KDQojIE1vZGVsbyBleHBvbmVuY2lhbA0KDQojIG1vZGVsb2V4cDwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y4KlY5LGRpc3Q9J2V4cG9uZW50aWFsJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgTW9kZWxvIFdlaWJ1bGwNCg0KIyBtb2RlbG9XZWk8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCtWOCpWOSxkaXN0PSd3ZWlidWxsJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgTW9kZWxvIExvZy1ub3JtYWwgDQoNCiMgbW9kZWxvTG9nbjwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY4K1Y4KlY5LGRpc3Q9J2xub3JtJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgRXJybyBkZSBjb252ZXJnw6puY2lhIGUgc2luZ3VsYXJpZGFkZSBkYSBNYXRyaXogSGVzc2lhbmENCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY2KlY4IGUgVjQqVjgNCg0KIyBNb2RlbG8gZXhwb25lbmNpYWwNCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOStWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBXZWlidWxsDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjkrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOStWOCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY0KlY4IGUgVjQqVjkNCg0KIyBNb2RlbG8gZXhwb25lbmNpYWwNCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNipWOCtWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBXZWlidWxsDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjYqVjgrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNipWOCtWOCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY4KlY5LCBWNipWOCBlIFY0KlY5ICANCg0KIyBNb2RlbG8gZXhwb25lbmNpYWwNCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBXZWlidWxsDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjgsZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNCpWOCxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCg0KDQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNb2RlbG8gZmluYWwgc2VtIFY4KlY5LCBWNipWOCBlIFY0KlY4DQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjksZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y0KlY5LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbCANCg0KIyBtb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjQqVjksZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBFcnJvIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIGRhIE1hdHJpeiBIZXNzaWFuYQ0KDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9kZWxvIGZpbmFsIHNlbSBWOCpWOSwgVjQqVjkgZSBWNCpWOA0KDQojIE1vZGVsbyBleHBvbmVuY2lhbA0KDQojIG1vZGVsb2V4cDwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y2KlY4LGRpc3Q9J2V4cG9uZW50aWFsJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgTW9kZWxvIFdlaWJ1bGwNCg0KIyBtb2RlbG9XZWk8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNipWOCxkaXN0PSd3ZWlidWxsJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgTW9kZWxvIExvZy1ub3JtYWwgDQoNCiMgbW9kZWxvTG9nbjwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y2KlY4LGRpc3Q9J2xub3JtJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgU0VNIEVSUk9TDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gVjYqVjgsIFY0KlY4IGUgVjQqVjkNCg0KIyBNb2RlbG8gZXhwb25lbmNpYWwNCg0KIyBtb2RlbG9leHA8LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWOCpWOSxkaXN0PSdleHBvbmVudGlhbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBXZWlidWxsDQoNCiMgbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjgqVjksZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBMb2ctbm9ybWFsIA0KDQojIG1vZGVsb0xvZ248LWZsZXhzdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWOCpWOSxkaXN0PSdsbm9ybScsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIEVycm8gZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgZGEgTWF0cml6IEhlc3NpYW5hDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gVjgqVjksIFY2KlY4LCBWNCpWOSBlIFY0KlY4DQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjksZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbCANCg0KIyBtb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjksZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBTRU0gRVJST1MNCg0KDQoNCg0Kc2VsZWNhb19tb2RlbG8yIDwtIGRhdGEuZnJhbWUoTW9kZWxvPWMoIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQgZSAkVjYqVjgkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQgZSAkVjQqVjgkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWNipWOCQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWNipWOCQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWNCpWOSQgZSAkVjQqVjgkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQsICRWNipWOCQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQsICRWNipWOCQgZSAkVjQqVjgkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQsICRWNCpWOCQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWNipWOCQsICRWNCpWOCQgZSAkVjQqVjkkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldGlyYW5kbyBkbyBtb2RlbG8gZmluYWwgYXMgaW50ZXJhw6fDtWVzICRWOCpWOSQsICRWNipWOCQsICRWNCpWOSQgZSAkVjQqVjgkIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdGFkbz1jKCJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHJlc2VudG91IGVycm9zIGRlIGNvbnZlcmfDqm5jaWEgZSBzaW5ndWxhcmlkYWRlIHBhcmEgb3MgbW9kZWxvcyBFeHBvbmVuY2lhbCwgV2VpYnVsbCBlIExvZ25vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOw6NvIGFwcmVzZW50b3UgZXJyb3MgcGFyYSBvcyBtb2RlbG9zIEV4cG9uZW5jaWFsLCBXZWlidWxsIGUgTG9nbm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcmVzZW50b3UgZXJyb3MgZGUgY29udmVyZ8OqbmNpYSBlIHNpbmd1bGFyaWRhZGUgcGFyYSBvcyBtb2RlbG9zIEV4cG9uZW5jaWFsLCBXZWlidWxsIGUgTG9nbm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk7Do28gYXByZXNlbnRvdSBlcnJvcyBwYXJhIG9zIG1vZGVsb3MgRXhwb25lbmNpYWwsIFdlaWJ1bGwgZSBMb2dub3JtYWwiKSkNCg0Ka25pdHI6OmthYmxlKHNlbGVjYW9fbW9kZWxvMikNCg0KYGBgDQoNCg0KDQotIERlIGFjb3JkbyBjb20gb3MgcmVzdWx0YWRvcyBvYnRpZG9zIG5lc3NlcyB0ZXN0ZXMsIHRlbW9zIHF1ZSBvIG1vZGVsbyBhcGVuYXMgY29tIG8gdGVybW8gZGUgaW50ZXJhw6fDo28gJFY2KlY4JCBlIG8gbW9kZWxvIHNlbSBpbnRlcmHDp8O1ZXMgcXVlIG7Do28gYXByZXNlbnRhcmFtIGVycm9zLiBQb3J0YW50bywgb3B0YW1vcyBwb3IgYWRvdGFyIG8gJE1vZGVsbyBcLCBGaW5hbCA9IFY0K1Y2K1Y4K1Y5K1Y2KlY4JCwgY29tcG9zdG8gcGVsYXMgY292YXJpw6F2ZWlzICoqdGVtcG9fbGl2cmVfcmVzcG9uc2F2ZWlzIChWNCkqKiwgKipjaWdhcnJvIChWNikqKiwgKipzZW50aWRvX3NvemluaG8gKFY4KSoqIGUgKiphbWlnb3NfZHJvZ2FzIChWOSkqKiBlIHBlbG8gdGVybW8gZGUgaW50ZXJhw6fDo28gJFY2IGUgVjgkLg0KDQoNCmBgYHtyfQ0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTW9kZWxvIGZpbmFsIHNlbSBWOCpWOSwgVjQqVjkgZSBWNCpWOA0KDQojIG1vZGVsbyBmaW5hbCBHYW1hIEdlbmVyYWxpemFkbw0KDQptb2RlbG9HYW1hPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjYqVjgsZGlzdD0nZ2VuZ2FtbWEnLGRhdGE9RHJvZ2FzX1NQX3JlZykgDQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCm1vZGVsb2V4cDwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5K1Y2KlY4LGRpc3Q9J2V4cG9uZW50aWFsJyxkYXRhPURyb2dhc19TUF9yZWcpDQoNCiMgTW9kZWxvIFdlaWJ1bGwNCg0KbW9kZWxvV2VpPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjYqVjgsZGlzdD0nd2VpYnVsbCcsZGF0YT1Ecm9nYXNfU1BfcmVnKQ0KDQojIE1vZGVsbyBMb2ctbm9ybWFsIA0KDQptb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjkrVjYqVjgsZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KDQpUUlYuZXhwPTIqKG1vZGVsb0dhbWEkbG9nbGlrLW1vZGVsb2V4cCRsb2dsaWspICNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBleHBvbmVuY2lhbCBlIG8gbW9kZWxvIEdhbWEgKEgwOiBPIG1vZGVsbyBleHBvbmVuY2lhbCDDqSBhZGVxdWFkbykgDQpUUlYuV2VpPTIqKG1vZGVsb0dhbWEkbG9nbGlrLW1vZGVsb1dlaSRsb2dsaWspI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIFdlaWJ1bGwgZSBvIG1vZGVsbyBHYW1hIChIMDogTyBtb2RlbG8gV2VpYnVsbCDDqSBhZGVxdWFkbykNClRSVi5Mb2duPTIqKG1vZGVsb0dhbWEkbG9nbGlrLW1vZGVsb0xvZ24kbG9nbGlrKSNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBXZWlidWxsIGUgbyBtb2RlbG8gR2FtYSAoSDA6IE8gbW9kZWxvIFdlaWJ1bGwgw6kgYWRlcXVhZG8pDQoNCnNlbGVjYW9fbW9kZWxvMyA8LSBkYXRhLmZyYW1lKE1vZGVsb3MgPSBjKCJFeHBvbmVuY2lhbCIsIldlaWJ1bGwiLCJMb2dub3JtYWwiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSViA9IHJvdW5kKGMoVFJWLmV4cCxUUlYuV2VpLFRSVi5Mb2duKSw0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZhbG9yID0gcm91bmQoYygxLXBjaGlzcShUUlYuZXhwLGRmPTIpLDEtcGNoaXNxKFRSVi5XZWksZGY9MSksMS1wY2hpc3EoVFJWLkxvZ24sZGY9MSkpLDQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaWduaWZpY2FuY2lhID0gaWZlbHNlIChyb3VuZChjKDEtcGNoaXNxKFRSVi5leHAsZGY9MiksMS1wY2hpc3EoVFJWLldlaSxkZj0xKSwxLXBjaGlzcShUUlYuTG9nbixkZj0xKSksNCk8PTAuMSwiQW8gbsOtdmVsIGRlIDEwJSwgTsODTyDDiSBhZGVxdWFkbyIsIkFvIG7DrXZlbCBkZSAxMCUsIMOJIGFkZXF1YWRvIikpDQoNCmtuaXRyOjprYWJsZShzZWxlY2FvX21vZGVsbzMpDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1vZGVsbyBmaW5hbCBzZW0gaW50ZXJhw6fDtWVzDQoNCiMgbW9kZWxvIGZpbmFsIEdhbWEgR2VuZXJhbGl6YWRvDQoNCiMgbW9kZWxvR2FtYTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5LGRpc3Q9J2dlbmdhbW1hJyxkYXRhPURyb2dhc19TUF9yZWcpIA0KDQoNCiMgTW9kZWxvIGV4cG9uZW5jaWFsDQoNCiMgbW9kZWxvZXhwPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjksZGlzdD0nZXhwb25lbnRpYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gV2VpYnVsbA0KDQojIG1vZGVsb1dlaTwtZmxleHN1cnZyZWcoZm9ybXVsYT1TdXJ2KHRlbXBvLGNlbnN1cmEpflY0K1Y2K1Y4K1Y5LGRpc3Q9J3dlaWJ1bGwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KIyBNb2RlbG8gTG9nLW5vcm1hbCANCg0KIyBtb2RlbG9Mb2duPC1mbGV4c3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjQrVjYrVjgrVjksZGlzdD0nbG5vcm0nLGRhdGE9RHJvZ2FzX1NQX3JlZykNCg0KDQojIFRSVi5leHA9MioobW9kZWxvR2FtYSRsb2dsaWstbW9kZWxvZXhwJGxvZ2xpaykgI1RSViBjb21wYXJhbmRvIG8gbW9kZWxvIGV4cG9uZW5jaWFsIGUgbyBtb2RlbG8gR2FtYSAoSDA6IE8gbW9kZWxvIGV4cG9uZW5jaWFsIMOpIGFkZXF1YWRvKSANCiMgVFJWLldlaT0yKihtb2RlbG9HYW1hJGxvZ2xpay1tb2RlbG9XZWkkbG9nbGlrKSNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBXZWlidWxsIGUgbyBtb2RlbG8gR2FtYSAoSDA6IE8gbW9kZWxvIFdlaWJ1bGwgw6kgYWRlcXVhZG8pDQojIFRSVi5Mb2duPTIqKG1vZGVsb0dhbWEkbG9nbGlrLW1vZGVsb0xvZ24kbG9nbGlrKSNUUlYgY29tcGFyYW5kbyBvIG1vZGVsbyBXZWlidWxsIGUgbyBtb2RlbG8gR2FtYSAoSDA6IE8gbW9kZWxvIFdlaWJ1bGwgw6kgYWRlcXVhZG8pDQojIA0KIyBzZWxlY2FvX21vZGVsbzMgPC0gZGF0YS5mcmFtZShNb2RlbG9zID0gYygiRXhwb25lbmNpYWwiLCJXZWlidWxsIiwiTG9nbm9ybWFsIiksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSViA9IHJvdW5kKGMoVFJWLmV4cCxUUlYuV2VpLFRSVi5Mb2duKSw0KSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdmFsb3IgPSByb3VuZChjKDEtcGNoaXNxKFRSVi5leHAsZGY9MiksMS1wY2hpc3EoVFJWLldlaSxkZj0xKSwxLXBjaGlzcShUUlYuTG9nbixkZj0xKSksNCksDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmlmaWNhbmNpYSA9IGlmZWxzZSAocm91bmQoYygxLXBjaGlzcShUUlYuZXhwLGRmPTIpLDEtcGNoaXNxKFRSVi5XZWksZGY9MSksMS1wY2hpc3EoVFJWLkxvZ24sZGY9MSkpLDQpPD0wLjEsIkFvIG7DrXZlbCBkZSAxMCUsIE7Dg08gw4kgYWRlcXVhZG8iLCJBbyBuw612ZWwgZGUgMTAlLCDDiSBhZGVxdWFkbyIpKQ0KIyANCiMga25pdHI6OmthYmxlKHNlbGVjYW9fbW9kZWxvMykNCg0KDQpgYGANCg0KLSBBbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgZGUgJDAuMSQsIHJlamVpdGEtc2UgYSBoaXDDs3Rlc2UgbnVsYSBkZSBhZGVxdWHDp8OjbyBkbyBtb2RlbG8gRXhwb25lbmNpYWwuIE9zIG1vZGVsb3MgV2VpYnVsbCBlIExvZ25vcm1hbCBzZSBhZGVxdWFtIGFvcyBkYWRvcy4NCg0KLSBFc2NvbGhlbW9zIGVudMOjbyBvIG1vZGVsbyBMb2dub3JtYWwgcGFyYSBtb2RlbGFyIG9zIHRlbXBvcyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIHBvaXMgZm9pIG8gcXVlIGFwcmVzZW50b3UgbWFpb3IgcC12YWxvciAoJDAuNTcwNyQuDQoNCi0gRGVzc2UgbW9kbywgdG9kYXMgYXMgYW7DoWxpc2VzIHNlZ3VpbnRlcyBzw6NvIGJhc2VhZGFzIG5lc3NlIG1vZGVsby4gDQoNCg0KIyMgRXN0aW1hbmRvIG9zIHBhcsOibWV0cm9zIGRvIG1vZGVsbyBMb2dub3JtYWwNCg0KYGBge3J9DQptb2RlbG9Mb2duPC1zdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNCtWNitWOCtWOStWNipWOCxkaXN0PSdsb2dub3JtYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCnN1bW1hcnkobW9kZWxvTG9nbikNCmBgYA0KDQotIEFvIG7DrXZlbCBkZSBzaWduaWZpY8OibmNpYSBkZSAkMC4xJCwgJFY5JCDDqSByZXRpcmFkYSBkbyBtb2RlbG8gJFY0K1Y2K1Y4K1Y5K1Y2KlY4JCAgcG9yIG7Do28gc2VyIHNpZ25pZmljYXRpdmEgKG91IHNlamEsIG7Do28gc2UgcmVqZWl0YSBhIGhpcMOzdGVzZSBudWxhIGRlIHF1ZSBvIGNvZWZpY2llbnRlIMOpIGlndWFsIGEgemVybykNCg0KYGBge3J9DQptb2RlbG9Mb2duPC1zdXJ2cmVnKGZvcm11bGE9U3Vydih0ZW1wbyxjZW5zdXJhKX5WNitWOCtWNipWOCxkaXN0PSdsb2dub3JtYWwnLGRhdGE9RHJvZ2FzX1NQX3JlZykNCnN1bW1hcnkobW9kZWxvTG9nbikNCmBgYA0KLSBBbyBuw612ZWwgZGUgc2lnbmlmaWPDom5jaWEgZGUgJDAuMSQsICRWNCQgw6kgcmV0aXJhZGEgZG8gbW9kZWxvICRWNCtWNitWOCtWNipWOCQgcG9yIG7Do28gc2VyIHNpZ25pZmljYXRpdmEgKG91IHNlamEsIG7Do28gc2UgcmVqZWl0YSBhIGhpcMOzdGVzZSBudWxhIGRlIHF1ZSBvIGNvZWZpY2llbnRlIMOpIGlndWFsIGEgemVybykuDQoNCmBgYHtyfQ0KbW9kZWxvTG9nbjwtc3VydnJlZyhmb3JtdWxhPVN1cnYodGVtcG8sY2Vuc3VyYSl+VjYrVjgrVjYqVjgsZGlzdD0nbG9nbm9ybWFsJyxkYXRhPURyb2dhc19TUF9yZWcpDQpzdW1tYXJ5KG1vZGVsb0xvZ24pDQpgYGANCi0gQW8gbsOtdmVsIGRlIHNpZ25pZmljw6JuY2lhIGRlICQwLjEkLCBhIGludGVyYcOnw6NvICRWNjI6VjgyJCDDqSBzaWduaWZpY2F0aXZhLiBEZSBhY29yZG8gY29tIGEgW2xpdGVyYXR1cmFdKGh0dHBzOi8vaGFzdGllLnN1LmRvbWFpbnMvSVNMUjIvSVNMUnYyX3dlYnNpdGUucGRmKSwgcmVjb21lbmRhLXNlIG1hbnRlciBhcyB2YXJpw6F2ZWlzIHV0aWxpemFkYXMgZW0gdW1hIGludGVyYcOnw6NvIHNpZ25pZmljYXRpdmEgYWluZGEgcXVlIGVsYXMgc296aW5oYXMgbsOjbyBzZWphbSBzaWduaWZpY2F0aXZhcy4gUG9ydGFudG8sIHV0aWxpemFyZW1vcyBvIG1vZGVsbw0KJFY2K1Y4K1Y2KlY4JC4NCg0KLSAqKk9ic2VydmHDp8O1ZXM6KiogRGVudHJlIG9zIG1vZGVsb3MgY29uc2lkZXJhZG9zIG5lc3NhIGV0YXBhLCBvIG1vZGVsbyBjb20gbWVub3IgQmF5ZXNpYW4gSW5mb3JtYXRpb24gQ3JpdGVyaW9uIChCSUMpIGZvaSBvIG1vZGVsbyAkVjYrVjgrVjYqVjgkLCBvIHF1ZSBjb3Jyb2JvcmEgc3VhIGVzY29saGEuIEFsw6ltIGRpc3NvLCBhbyByZXBldGlyIG8gdGVzdGUgVFJWIHBhcmEgc2VsZcOnw6NvIGRlIG1vZGVsb3MgbWFpcyBzaW1wbGVzIHV0aWxpemFuZG8gY29tbyBtb2RlbG8gZmluYWwgJFY2K1Y4K1Y2KlY4JCwgYSBkaXN0cmlidWnDp8OjbyBMb2dub3JtYWwgY29udGludW91IGFwcmVzZW50YW5kbyBvIG1haW9yIHAtdmFsb3IgZSwgcG9ydGFudG8sIHNlbmRvIGVzY29saGlkYSBjb21vIGEgYWRlcXVhZGEgcGFyYSBvIHByb2Nlc3NvIGRlIG1vZGVsYWdlbS4gDQoNCg0KIyMgQWRlcXVhw6fDo28gZG8gbW9kZWxvIGFqdXN0YWRvIA0KDQojIyMgUmVzw61kdW9zIGRlIENveC1TbmVsbA0KDQotIE9zIHJlc8OtZHVvcyAkXGhhdHtlX2l9JCB2w6ptIGRlIHVtYSBwb3B1bGHDp8OjbyBob21vZ8OqbmVhIGUgZGV2ZW0gc2VndWlyIHVtYQ0KZGlzdHJpYnVpw6fDo28gZXhwb25lbmNpYWwgcGFkcsOjbyBzZSBvIG1vZGVsbyBmb3IgYWRlcXVhZG8uDQoNCmBgYHtyfQ0KeGI8LW1vZGVsb0xvZ24kbGluZWFyLnByZWRpY3RvcnMNCnNpZ21hPC1tb2RlbG9Mb2duJHNjYWxlDQpyZXM8LShsb2coRHJvZ2FzX1NQX3JlZyR0ZW1wbyktKHhiKSkvc2lnbWENCmVpPC0gLWxvZygxLXBub3JtKHJlcykpICNyZXNpZHVvcyBkZSBjb3gtU25lbGwgPSBmdW5jYW8gZGUgdGF4YSBkZSBmYWxoYSBhY3VtdWxhZGENCg0KIyBQYXJhIG8gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gbG9nbm9ybWFsOg0KDQoNCg0KZWttMTwtc3VydmZpdChTdXJ2KGVpLERyb2dhc19TUF9yZWckY2Vuc3VyYSl+MSkNCnQ8LWVrbTEkdGltZQ0Kc3Q8LWVrbTEkc3Vydg0Kc2V4cDwtZXhwKC10KQ0KDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChzdCxzZXhwLHhsYWI9IlMoZWkpOiBLYXBsYW4tTWVpZXIiLHlsYWI9IlMoZWkpOiBFeHBvbmVuY2lhbCBwYWRyYW8iLHBjaD0xNikNCg0KcGxvdChla20xLGNvbmYuaW50PUYsbWFyay50aW1lPUYsIHhsYWI9IlJlc2lkdW9zIGRlIENveC1TbmVsbCIsIHlsYWI9IlNvYnJldml2ZW5jaWEgZXN0aW1hZGEiKQ0KbGluZXModCxzZXhwLGx0eT00KQ0KbGVnZW5kKCJib3R0b21sZWZ0IixsdHk9YygxLDQpLGMoIkthcGxhbi1NZWllciIsIkV4cG9uZW5jaWFsIHBhZHJhbyIpLGNleD0wLjgsYnR5PSJuIikNCg0KDQpgYGANCi0gQWNyZWRpdGEtc2UgcXVlIG8gbW9kZWxvIGRlIHJlZ3Jlc3PDo28gTG9nbm9ybWFsIHNlIGVuY29udHJhIHJhem9hdmVsbWVudGUgYWp1c3RhZG8gYW9zIGRhZG9zLiANCg0KIyMjIFJlc8OtZHVvcyBwYWRyb25pemFkb3MgDQoNCi0gU2UgbyBtb2RlbG8gZGUgcmVncmVzc8OjbyBsb2dub3JtYWwgZm9yIGFwcm9wcmlhZG8sICRcaGF0e1x1cHNpbG9uX2l9JCDDqSBub3JtYWwNCnBhZHLDo28uDQoNCmBgYHtyfQ0KeGI8LW1vZGVsb0xvZ24kbGluZWFyLnByZWRpY3RvcnMNCnNpZ21hPC1tb2RlbG9Mb2duJHNjYWxlDQpudTwtKGxvZyhEcm9nYXNfU1BfcmVnJHRlbXBvKS0oeGIpKS9zaWdtYQ0KcmVzaWQ8LWV4cChudSkNCmVrbTwtIHN1cnZmaXQoU3VydihyZXNpZCxEcm9nYXNfU1BfcmVnJGNlbnN1cmEpfjEpDQpyZXNpZDwtZWttJHRpbWUNCnNsbjwtcG5vcm0oLWxvZyhyZXNpZCkpICNmdW5jYW8gZGUgc29icmV2aXZlbmNpYSBkYSBsb2dub3JtYWwgcGFkcmFvDQpwYXIobWZyb3c9YygxLDIpKQ0KcGxvdChla20kc3VydixzbG4sIHhsYWI9IlMoZWkpOiBLYXBsYW4tTWVpZXIiLHlsYWI9IlMoZWkpOiBMb2dub3JtYWwgcGFkcsOjbyIscGNoPTE2KQ0KDQoNCnBsb3QoZWttLGNvbmYuaW50PUYsbWFyay50aW1lPUYseGxhYj0iUmVzaWR1b3MgKGVpKSIseWxhYj0iU29icmV2aXZlbmNpYSBlc3RpbWFkYSIscGNoPTE2KQ0KbGluZXMocmVzaWQsc2xuLGx0eT0yKQ0KbGVnZW5kKCJib3R0b21sZWZ0IixsdHk9YygxLDIpLGMoIkthcGxhbi1NZWllciIsIkxvZy1ub3JtYWwgcGFkcmFvIiksY2V4PTAuOCxidHk9Im4iKQ0KDQpgYGANCg0KIyMjIFJlc8OtZHVvcyBkZXZpYW5jZSANCg0KLSBTZSBvIG1vZGVsbyBkZSByZWdyZXNzw6NvIGxvZ25vcm1hbCBmb3IgYXByb3ByaWFkbywgb3MgZ3LDoWZpY29zIGRvcyByZXPDrWR1b3MgZGV2aWFuY2UgdnMuIHRlbXBvIGRldmVtIGFwcmVzZW50YXINCmNvbXBvcnRhbWVudG8gYWxlYXTDs3JpbyBlbSB0b3JubyBkZSB6ZXJvLg0KYGBge3J9DQpyZXM8LShsb2coRHJvZ2FzX1NQX3JlZyR0ZW1wbyktKHhiKSkvc2lnbWENCmVpPC0gLWxvZygxLXBub3JtKHJlcykpICNyZXNpZHVvcyBkZSBjb3gtU25lbGwNCm1pPC1Ecm9nYXNfU1BfcmVnJGNlbnN1cmEtZWkNCmRpPC1zaWduKG1pKSooLTIqKG1pK0Ryb2dhc19TUF9yZWckY2Vuc3VyYSpsb2coRHJvZ2FzX1NQX3JlZyRjZW5zdXJhLW1pKSkpXjAuNQ0KcGFyKG1mcm93PWMoMSwyKSkNCnBsb3QoRHJvZ2FzX1NQJGNpZ2Fycm8sZGkseGxhYj0iY2lnYXJybyAoVjYpIikNCnBsb3QoRHJvZ2FzX1NQJHNlbnRpZG9fc296aW5obyxkaSx4bGFiPSJzZW50aWRvX3NvemluaG8gKFY4KSIpDQoNCmBgYA0KLSBBIHBhcnRpciBkYSBhbsOhbGlzZSBkb3MgZ3LDoWZpY29zIGFjaW1hLCBub3RhLXNlIHVtIGFnbG9tZXJhZG8gbmEgY2F0ZWdvcmlhIDIgZGUgVjYsIG8gcXVlIG7Do28gY29ycm9ib3JhIGEgaGlww7N0ZXNlIGRlIGNvbXBvcnRhbWVudG8gYWxlYXTDs3JpbyBlbSB0b3JubyBkZSB6ZXJvLiBFbnRyZXRhbnRvLCBuYSBjYXRlZ29yaWEgMSBkZSBWNiBlIG5hcyBkZW1haXMgY2F0ZWdvcmlhcyBkZSBWOCwgcG9kZW1vcyBvYnNlcnZhciBxdWUgb3MgcG9udG9zIGVzdMOjbyBkaXN0cmlidcOtZG9zIGRlIGZvcm1hIG1haXMgYXByb3ByaWFkYS4NCg0KDQojIyBJbnRlcnByZXRhw6fDo28gZG9zIHJlc3VsdGFkb3MgDQoNCi0gVG9tYW5kby1zZSBvIGV4cG9uZW5jaWFsIGRvcyBjb2VmaWNpZW50ZXMgZXN0aW1hZG9zLCBvYnTDqW0tc2UgYSByYXrDo28gZG9zIHRlbXBvcyBtZWRpYW5vcyBkZSBzb2JyZXZpdsOqbmNpYS4NCg0KYGBge3J9DQoNCmludGVycHJldGFjYW8xIDwtIGRhdGEuZnJhbWUoRXhwX2JldGEgPSByb3VuZChjKGV4cChtb2RlbG9Mb2duJGNvZWZmaWNpZW50c1syOjZdKSksMikpDQprbml0cjo6a2FibGUoaW50ZXJwcmV0YWNhbzEpDQpgYGANCg0KLSBWNjI6IG8gdGVtcG8gbWVkaWFubyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIHBhcmEgb3MgZXN0dWRhbnRlcyBxdWUgbsOjbyBmdW1hcmFtIGNpZ2Fycm8sIMOpIDEuMjUgdmV6ZXMgbyB0ZW1wbyBtZWRpYW5vIGRvcyBlc3R1ZGFudGVzIHF1ZSBhbGd1bWEgdmV6IG5hIHZpZGEgasOhIGZ1bWFyYW0sIG1lc21vIHVtYSBvdSBkdWFzIHRyYWdhZGFzLg0KDQotIFY4MjogbyB0ZW1wbyBtZWRpYW5vIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBub3Mgw7psdGltb3MgMTIgbWVzZXMgUkFSQU1FTlRFIHNlIHNlbnRpcmFtIHNvemluaG9zIMOpICQxLjA3JCB2ZXplcyBvIHRlbXBvIG1lZGlhbm8gZG9zIGVzdHVkYW50ZXMgcXVlIE5VTkNBIHNlIHNlbnRpcmFtIHNvemluaG9zLg0KDQotIFY4MzogbyB0ZW1wbyBtZWRpYW5vIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBub3Mgw7psdGltb3MgMTIgbWVzZXMgw4BTIFZFWkVTIHNlIHNlbnRpcmFtIHNvemluaG9zIMOpICQxLjAxJCB2ZXplcyBvIHRlbXBvIG1lZGlhbm8gZG9zIGVzdHVkYW50ZXMgcXVlIE5VTkNBIHNlIHNlbnRpcmFtIHNvemluaG9zLg0KDQotIFY4NDogbyB0ZW1wbyBtZWRpYW5vIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBub3Mgw7psdGltb3MgMTIgbWVzZXMgTkEgTUFJT1JJQSBEQVMgVkVaRVMgc2Ugc2VudGlyYW0gc296aW5ob3Mgw6kgJDEuMDYkIHZlemVzIG8gdGVtcG8gbWVkaWFubyBkb3MgcXVlIE5VTkNBIHNlIHNlbnRpcmFtIHNvemluaG9zLg0KDQotIFY4NTogbyB0ZW1wbyBtZWRpYW5vIGF0w6kgYSBleHBlcmltZW50YcOnw6NvIGRlIGRyb2dhcyBpbMOtY2l0YXMgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBub3Mgw7psdGltb3MgMTIgbWVzZXMgU0VNUFJFIHNlIHNlbnRpcmFtIHNvemluaG9zIMOpICQwLjk1JCB2ZXplcyBvIHRlbXBvIG1lZGlhbm8gZG9zIHF1ZSBOVU5DQSBzZSBzZW50aXJhbSBzb3ppbmhvcy4NCg0KLSBBIGV4cGVyaW1lbnRhw6fDo28gZGUgY2lnYXJybyBlIG8gZmF0byBkbyBlc3R1ZGFudGUgc2VtcHJlIHNlIHNlbnRpciBzb3ppbmhvIGNvbSBtYWlvciBmcmVxdcOqbmNpYSBhY2FycmV0YW0gZW0gbWVub3JlcyB0ZW1wb3MgbWVkaWFub3MgYXTDqSBhIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcy4gDQoNCmBgYHtyfQ0KDQppbnRlcnByZXRhY2FvMiA8LSBkYXRhLmZyYW1lKEludGVyYWNhbz1jKCJGaXhhZG8gc2VudGlkb19zb3ppbmhvPTUgKFNlbXByZSkiLCJGaXhhZG8gc2VudGlkb19zb3ppbmhvPTIgKFJhcmFtZW50ZSkgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cF9iZXRhID0gcm91bmQoYyhleHAobW9kZWxvTG9nbiRjb2VmZmljaWVudHNbMl0rbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbMTBdKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cChtb2RlbG9Mb2duJGNvZWZmaWNpZW50c1syXSttb2RlbG9Mb2duJGNvZWZmaWNpZW50c1s3XSkpLDIpKQ0Ka25pdHI6OmthYmxlKGludGVycHJldGFjYW8yKQ0KYGBgDQoNCi0gRml4YW5kbyBhIHZhcmnDoXZlbCBzZW50aWRvX3NvemluaG8gKFY4KSBuYSBjYXRlZ29yaWEgNSAoU2VtcHJlKSwgbsOjbyB0ZXIgZnVtYWRvIGFsZ3VtYSB2ZXogYXVtZW50YSBlbSAkMThcJSQgbyB0ZW1wbyBtZWRpYW5vIGRhIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyBlbSBjb21wYXJhw6fDo28gYSB0ZXIgZnVtYWRvIGFsZ3VtYSB2ZXouDQoNCi0gRml4YW5kbyBhIHZhcmnDoXZlbCBzZW50aWRvX3NvemluaG8gKFY4KSBuYSBjYXRlZ29yaWEgMiAoUmFyYW1lbnRlKSwgbsOjbyB0ZXIgZnVtYWRvIGFsZ3VtYSB2ZXogYXVtZW50YSBlbSAkMTBcJSQgbyB0ZW1wbyBtZWRpYW5vIGRhIGV4cGVyaW1lbnRhw6fDo28gZGUgZHJvZ2FzIGlsw61jaXRhcyBlbSBjb21wYXJhw6fDo28gYSB0ZXIgZnVtYWRvIGFsZ3VtYSB2ZXouDQoNCg0KIyMgQ3VydmFzIGRlIHNvYnJldml2ZW5jaWEgZXN0aW1hZGFzIHBlbG8gbW9kZWxvIGZpbmFsDQoNCiMjIyBDb21wYXJhbmRvIFY2PTEgY29tIFY2PTI6DQoNCi0gRml4b3Utc2Ugc2VudGlkb19zb3ppbmhvIChWOCkgbmEgY2F0ZWdvcmlhIGRlIHJlZmVyw6puY2lhICgxLSBOdW5jYSBzZSBzZW50aXUgc296aW5obyBub3Mgw7psdGltb3MgMTIgbWVzZXMpLg0KDQpgYGB7cn0NCg0KYjA8LW1vZGVsb0xvZ24kY29lZmZpY2llbnRzWzFdDQpiZXRhLlY2MjwtbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbMl0NCmJldGEuVjgyPC1tb2RlbG9Mb2duJGNvZWZmaWNpZW50c1szXQ0KYmV0YS5WODM8LW1vZGVsb0xvZ24kY29lZmZpY2llbnRzWzRdDQpiZXRhLlY4NDwtbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbNV0NCmJldGEuVjg1PC1tb2RlbG9Mb2duJGNvZWZmaWNpZW50c1s2XQ0KYmV0YS5WNjIuVjgyPC1tb2RlbG9Mb2duJGNvZWZmaWNpZW50c1s3XSAgICANCmJldGEuVjYyLlY4MzwtbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbOF0gICANCmJldGEuVjYyLlY4NDwtbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbOV0gICANCmJldGEuVjYyLlY4NTwtbW9kZWxvTG9nbiRjb2VmZmljaWVudHNbMTBdICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0Kc2lnbWE8LW1vZGVsb0xvZ24kc2NhbGUNCg0KVjYyPC0wICMgMSBzZSBWNj0yIGUgMCBjLmMNClY4MjwtMCAjMSwgc2UgVjg9MiwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWODM8LTAgIzEsIHNlIFY4PTMsIDAgY2FzbyBjb250csOhcmlvLg0KVjg0PC0wICMxLCBzZSBWOD00LCAwIGNhc28gY29udHLDoXJpby4NClY4NTwtMCAjMSwgc2UgVjg9NSwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWNjIuVjgyPC0gMCANClY2Mi5WODM8LSAwDQpWNjIuVjg0PC0gMA0KVjYyLlY4NTwtIDANCg0KdGVtcG88LTA6MjUNCnNvYnJldi4xPC1wbm9ybSgoLWxvZyh0ZW1wbykrYjArYmV0YS5WNjIqVjYyKw0KYmV0YS5WODIqVjgyKw0KYmV0YS5WODMqVjgzKw0KYmV0YS5WODQqVjg0Kw0KYmV0YS5WODUqVjg1Kw0KYmV0YS5WNjIuVjgyKlY2Mi5WODIrDQpiZXRhLlY2Mi5WODMqVjYyLlY4MysNCmJldGEuVjYyLlY4NCpWNjIuVjg0Kw0KYmV0YS5WNjIuVjg1KlY2Mi5WODUpL3NpZ21hKQ0KDQoNClY2MjwtMQ0Kc29icmV2LjI8LXBub3JtKCgtbG9nKHRlbXBvKStiMCtiZXRhLlY2MipWNjIrDQpiZXRhLlY4MipWODIrDQpiZXRhLlY4MypWODMrDQpiZXRhLlY4NCpWODQrDQpiZXRhLlY4NSpWODUrDQpiZXRhLlY2Mi5WODIqVjYyLlY4MisNCmJldGEuVjYyLlY4MypWNjIuVjgzKw0KYmV0YS5WNjIuVjg0KlY2Mi5WODQrDQpiZXRhLlY2Mi5WODUqVjYyLlY4NSkvc2lnbWEpDQoNCnBhcihtZnJvdz1jKDEsMSkpDQpwbG90KHNvYnJldi4xLHRlbXBvKjAscGNoPSIgIix5bGltPXJhbmdlKGMoMCwxKSksIHhsaW09cmFuZ2UoYygwLDI1KSksDQp4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLGJ0eT0ibiIsbWFpbj0iQ2lnYXJybyIpDQpsaW5lcyh0ZW1wbyxzb2JyZXYuMSxsdHk9MSkNCmxpbmVzKHRlbXBvLHNvYnJldi4yLGx0eT0yKQ0KbGVnZW5kKCJ0b3ByaWdodCIsbHR5PWMoMSwyKSxjKCJTaW0iLCJOw6NvIiksbHdkPTEsIGJ0eT0ibiIsY2V4PTAuOCkNCg0KYGBgDQoNCi0gIEEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgbm9zIGluZGljYSBxdWUgbyB0ZW1wbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIMOpIGNvbnNpZGVyYXZlbG1lbnRlIG1lbm9yIA0KcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBqw6EgZnVtYXJhbSBjaWdhcnJvIGFsZ3VtYSB2ZXouIEEgZGlzdMOibmNpYSBlbnRyZSBhcyBjdXJ2YXMgZm9ybmVjZSB1bWEgZGltZW5zw6NvIGRlc3NhIGRpZmVyZW7Dp2EuDQoNCi0gIE8gcmlzY28gZGUgZXhwZXJpbWVudGFyIGRyb2dhcyBpbMOtY2l0YXMgY29tZcOnYSBhIGF1bWVudGFyIG1haXMgY2VkbyBwYXJhIG9zIGVzdHVkYW50ZXMgcXVlIGrDoSBmdW1hcmFtIGNpZ2Fycm8gYWxndW1hIHZlei4gDQoNCiMjIyBDb21wYXJhbmRvIFY4PTUgY29tIFY4PTE6DQoNCi0gRml4b3Utc2UgY2lnYXJybyAoVjYpIG5hIGNhdGVnb3JpYSAoMi0gTsOjbykuDQoNCg0KYGBge3J9DQoNClY2MjwtMSAjIDEgc2UgVjY9MiBlIDAgYy5jDQpWODI8LTAgIzEsIHNlIFY4PTIsIDAgY2FzbyBjb250csOhcmlvLg0KVjgzPC0wICMxLCBzZSBWOD0zLCAwIGNhc28gY29udHLDoXJpby4NClY4NDwtMCAjMSwgc2UgVjg9NCwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWODU8LTEgIzEsIHNlIFY4PTUsIDAgY2FzbyBjb250csOhcmlvLg0KVjYyLlY4MjwtIDAgDQpWNjIuVjgzPC0gMA0KVjYyLlY4NDwtIDANClY2Mi5WODU8LSAxDQoNCnRlbXBvPC0wOjI1DQpzb2JyZXYuMTwtcG5vcm0oKC1sb2codGVtcG8pK2IwK2JldGEuVjYyKlY2MisNCmJldGEuVjgyKlY4MisNCmJldGEuVjgzKlY4MysNCmJldGEuVjg0KlY4NCsNCmJldGEuVjg1KlY4NSsNCmJldGEuVjYyLlY4MipWNjIuVjgyKw0KYmV0YS5WNjIuVjgzKlY2Mi5WODMrDQpiZXRhLlY2Mi5WODQqVjYyLlY4NCsNCmJldGEuVjYyLlY4NSpWNjIuVjg1KS9zaWdtYSkNCg0KDQpWODU8LTANCnNvYnJldi4yPC1wbm9ybSgoLWxvZyh0ZW1wbykrYjArYmV0YS5WNjIqVjYyKw0KYmV0YS5WODIqVjgyKw0KYmV0YS5WODMqVjgzKw0KYmV0YS5WODQqVjg0Kw0KYmV0YS5WODUqVjg1Kw0KYmV0YS5WNjIuVjgyKlY2Mi5WODIrDQpiZXRhLlY2Mi5WODMqVjYyLlY4MysNCmJldGEuVjYyLlY4NCpWNjIuVjg0Kw0KYmV0YS5WNjIuVjg1KlY2Mi5WODUpL3NpZ21hKQ0KDQoNCnBhcihtZnJvdz1jKDEsMSkpDQpwbG90KHNvYnJldi4xLHRlbXBvKjAscGNoPSIgIix5bGltPXJhbmdlKGMoMCwxKSksIHhsaW09cmFuZ2UoYygwLDI1KSksDQp4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9IlModCkgZXN0aW1hZGEiLGJ0eT0ibiIsbWFpbj0iTk9TIMOaTFRJTU9TIDEyIE1FU0VTIGNvbSBxdWUgZnJlcXXDqm5jaWEgdGVtIHNlIHNlbnRpZG8gc296aW5obyhhKT8iKQ0KbGluZXModGVtcG8sc29icmV2LjEsbHR5PTEpDQpsaW5lcyh0ZW1wbyxzb2JyZXYuMixsdHk9MikNCmxlZ2VuZCgidG9wcmlnaHQiLGx0eT1jKDEsMiksYygiU2VtcHJlIiwiTnVuY2EiKSxsd2Q9MSwgYnR5PSJuIixjZXg9MC44KQ0KYGBgDQoNCi0gIEEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgbm9zIGluZGljYSBxdWUgbyB0ZW1wbyBhdMOpIGEgZXhwZXJpbWVudGHDp8OjbyBkZSBkcm9nYXMgaWzDrWNpdGFzIMOpIA0KbWVub3IgcGFyYSBvcyBlc3R1ZGFudGVzIHF1ZSBub3Mgw7psdGltb3MgMTIgbWVzZXMgZGVjbGFyYXJhbSBxdWUgc2VtcHJlIHNlIHNlbnRlbSBzb3ppbmhvcy4gTm90YS1zZSBhIHByb3hpbWlkYWRlIGRhcyBjdXJ2YXMuDQoNCg0KIyMgRXN0aW1hw6fDo28gcGFyYSB1bSBpbmRpdsOtZHVvIA0KDQoNCiMjIyBQZXJmaWwgMTogaW5kaXbDrWR1byBjb20gdmFsb3JlcyBWNj0yIChOw6NvKSwgVjg9MSAoTnVuY2EpDQoNCg0KYGBge3J9DQoNClY2MjwtMSAjIDEgc2UgVjY9MiBlIDAgYy5jDQpWODI8LTAgIzEsIHNlIFY4PTIsIDAgY2FzbyBjb250csOhcmlvLg0KVjgzPC0wICMxLCBzZSBWOD0zLCAwIGNhc28gY29udHLDoXJpby4NClY4NDwtMCAjMSwgc2UgVjg9NCwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWODU8LTAgIzEsIHNlIFY4PTUsIDAgY2FzbyBjb250csOhcmlvLg0KVjYyLlY4MjwtIDAgDQpWNjIuVjgzPC0gMA0KVjYyLlY4NDwtIDANClY2Mi5WODU8LSAwDQoNCnhiPC1iMCtiZXRhLlY2MipWNjIrDQpiZXRhLlY4MipWODIrDQpiZXRhLlY4MypWODMrDQpiZXRhLlY4NCpWODQrDQpiZXRhLlY4NSpWODUrDQpiZXRhLlY2Mi5WODIqVjYyLlY4MisNCmJldGEuVjYyLlY4MypWNjIuVjgzKw0KYmV0YS5WNjIuVjg0KlY2Mi5WODQrDQpiZXRhLlY2Mi5WODUqVjYyLlY4NQ0KDQoNCnBhcihtZnJvdz1jKDMsMSkpDQojIEZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhDQp0ZW1wbzwtMDozMA0Kc29icmV2aXY8LXBub3JtKCgtbG9nKHRlbXBvKSt4Yikvc2lnbWEpDQpwbG90KHRlbXBvLHNvYnJldml2LHR5cGU9ImwiLHlsaW09cmFuZ2UoYygwLDEpKSwgeGxpbT1yYW5nZShjKDAsMzApKSwNCnhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iUyh0KSBlc3RpbWFkYSIsYnR5PSJuIixtYWluPSJGdW7Dp8OjbyBkZSBzb2JyZXZpdsOqbmNpYSIpDQoNCg0KIyBGdW7Dp8OjbyBUYXhhIGRlIGZhbGhhIA0KZmRlbnNpZGFkZTwtKDEvKHNxcnQoMipwaSkqdGVtcG8qc2lnbWEpKSpleHAoLTAuNSooKGxvZyh0ZW1wbykteGIpL3NpZ21hKV4yKQ0KcGxvdCh0ZW1wbyxmZGVuc2lkYWRlLHR5cGU9ImwiLHhsYWI9IlRlbXBvIChhbm9zKSIseWxhYj0iZih0KSBlc3RpbWFkYSIsYnR5PSJuIiwNCm1haW49IkZ1bsOnw6NvIGRlbnNpZGFkZSIpDQoNCmhfdDwtZmRlbnNpZGFkZS9zb2JyZXZpdg0KcGxvdCh0ZW1wbyxoX3QsdHlwZT0ibCIseGxhYj0iVGVtcG8gKGFub3MpIix5bGFiPSJoKHQpIGVzdGltYWRhIixidHk9Im4iLG1haW49DQoiRnVuw6fDo28gdGF4YSBkZSBmYWxoYSIpDQoNCg0KIyBQZXJjZW50aXMgZGEgZGlzdHJpYnVpw6fDo28gZG8gdGVtcG8gZGUgdmlkYToNCnRfcDwtZnVuY3Rpb24ocCl7DQpleHAocW5vcm0ocCkqc2lnbWEreGIpDQp9DQogDQprbml0cjo6a2FibGUoZGF0YS5mcmFtZShQZXJjZW50aXM9YygiUGVyY2VudGlsIDIwJSIsIk1lZGlhbmEiLCJQZXJjZW50aWwgOTAlIiksVmFsb3I9Yyh0X3AoMC4yKSx0X3AoMC41KSx0X3AoMC45KSkpKQ0KDQpgYGANCg0KLSBPcyBpbmRpdsOtZHVvcyBkbyBwZXJmaWwgMSAoTnVuY2EgZnVtYXJhbTsgTm9zIMO6bHRpbW9zIDEyIG1lc2VzLCBudW5jYSBzZSBzZW50ZW0gc296aW5ob3MpLCBjb21lw6dhbSBhIGFwcmVzZW50YXIgdW0NCmRlY2FpbWVudG8gZGEgZnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWEgcG9yIHZvbHRhIGRlIDE1IGFub3MuIEFvcyAyMCBhbm9zLCBhIGZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIGrDoSBzZSBlbmNvbnRyYSBwcsOzeGltYSBhIHplcm8uIA0KDQotIEEgcGFydGlyIGRvcyAxNSBhbm9zLCBvIHJpc2NvIGluc3RhbnTDom5lbyBkZSBleHBlcmltZW50YXIgZHJvZ2FzIGlsw61jaXRhcyBjb21lw6dhIGEgYXVtZW50YXIuIA0KDQotIEFvcyAyMCBhbm9zLCBvIHJpc2NvIGRlIGV4cGVyaW1lbnRhciBkcm9nYXMgaWzDrWNpdGFzIMOpIGRlIDkwJS4gDQoNCg0KIyMjIFBlcmZpbCAyOiBpbmRpdsOtZHVvIGNvbSB2YWxvcmVzIFY2PTEgKFNpbSksIFY4PTUgKFNlbXByZSkNCg0KDQpgYGB7cn0NCg0KVjYyPC0wICMgMSBzZSBWNj0yIGUgMCBjLmMNClY4MjwtMCAjMSwgc2UgVjg9MiwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWODM8LTAgIzEsIHNlIFY4PTMsIDAgY2FzbyBjb250csOhcmlvLg0KVjg0PC0wICMxLCBzZSBWOD00LCAwIGNhc28gY29udHLDoXJpby4NClY4NTwtMSAjMSwgc2UgVjg9NSwgMCBjYXNvIGNvbnRyw6FyaW8uDQpWNjIuVjgyPC0gMCANClY2Mi5WODM8LSAwDQpWNjIuVjg0PC0gMA0KVjYyLlY4NTwtIDANCg0KeGI8LWIwK2JldGEuVjYyKlY2MisNCmJldGEuVjgyKlY4MisNCmJldGEuVjgzKlY4MysNCmJldGEuVjg0KlY4NCsNCmJldGEuVjg1KlY4NSsNCmJldGEuVjYyLlY4MipWNjIuVjgyKw0KYmV0YS5WNjIuVjgzKlY2Mi5WODMrDQpiZXRhLlY2Mi5WODQqVjYyLlY4NCsNCmJldGEuVjYyLlY4NSpWNjIuVjg1DQoNCg0KcGFyKG1mcm93PWMoMywxKSkNCiMgRnVuw6fDo28gZGUgc29icmV2aXbDqm5jaWENCnRlbXBvPC0wOjMwDQpzb2JyZXZpdjwtcG5vcm0oKC1sb2codGVtcG8pK3hiKS9zaWdtYSkNCnBsb3QodGVtcG8sc29icmV2aXYsdHlwZT0ibCIseWxpbT1yYW5nZShjKDAsMSkpLCB4bGltPXJhbmdlKGMoMCwzMCkpLA0KeGxhYj0iVGVtcG8gKGFub3MpIix5bGFiPSJTKHQpIGVzdGltYWRhIixidHk9Im4iLG1haW49IkZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIikNCg0KDQojIEZ1bsOnw6NvIFRheGEgZGUgZmFsaGEgDQpmZGVuc2lkYWRlPC0oMS8oc3FydCgyKnBpKSp0ZW1wbypzaWdtYSkpKmV4cCgtMC41KigobG9nKHRlbXBvKS14Yikvc2lnbWEpXjIpDQpwbG90KHRlbXBvLGZkZW5zaWRhZGUsdHlwZT0ibCIseGxhYj0iVGVtcG8gKGFub3MpIix5bGFiPSJmKHQpIGVzdGltYWRhIixidHk9Im4iLA0KbWFpbj0iRnVuw6fDo28gZGVuc2lkYWRlIikNCg0KaF90PC1mZGVuc2lkYWRlL3NvYnJldml2DQpwbG90KHRlbXBvLGhfdCx0eXBlPSJsIix4bGFiPSJUZW1wbyAoYW5vcykiLHlsYWI9ImgodCkgZXN0aW1hZGEiLGJ0eT0ibiIsbWFpbj0NCiJGdW7Dp8OjbyB0YXhhIGRlIGZhbGhhIikNCg0KDQojIFBlcmNlbnRpcyBkYSBkaXN0cmlidWnDp8OjbyBkbyB0ZW1wbyBkZSB2aWRhOg0KdF9wPC1mdW5jdGlvbihwKXsNCmV4cChxbm9ybShwKSpzaWdtYSt4YikNCn0NCiANCmtuaXRyOjprYWJsZShkYXRhLmZyYW1lKFBlcmNlbnRpcz1jKCJQZXJjZW50aWwgMjAlIiwiTWVkaWFuYSIsIlBlcmNlbnRpbCA5MCUiKSxWYWxvcj1jKHRfcCgwLjIpLHRfcCgwLjUpLHRfcCgwLjkpKSkpDQoNCmBgYA0KDQotIE9zIGluZGl2w61kdW9zIGRvIHBlcmZpbCAyIChKw6EgZnVtYXJhbSBhbGd1bWEgdmV6OyBOb3Mgw7psdGltb3MgMTIgbWVzZXMsIHNlbXByZSBzZSBzZW50ZW0gc296aW5ob3MpLA0KYXByZXNlbnRhbSBkZWNhaW1lbnRvIGRhIGZ1bsOnw6NvIGRlIHNvYnJldml2w6puY2lhIHBvciB2b2x0YSBkZSAxMyBhbm9zLCBtYWlzIGNlZG8gcXVlIG9zIGluZGl2w61kdW9zIGRvIHBlcmZpbCAxLiANCg0KLSBPIHJpc2NvIGluc3RhbnTDom5lbyBkZSBleHBlcmltZW50YXIgZHJvZ2FzIGlsw61jaXRhcyBjb21lw6dhIGEgYXByZXNlbnRhciBhdW1lbnRvIGVudHJlIDEwIGUgMTUgYW5vcywgdGFtYsOpbSBtYWlzIGNlZG8gcXVlIG9zIGluZGl2w61kdW9zIGRvIHBlcmZpbCAxLiANCg0KLSBBb3MgMTUgYW5vcywgbyByaXNjbyBkZSBleHBlcmltZW50YXIgZHJvZ2FzIGlsw61jaXRhcyDDqSBkZSA5MCUuIA0K