Resolvamos las siguientes preguntas:
- Si un investigador usa la data de The Economist e
hipotetiza que la calidad del proceso electoral depende del nivel de
funcionamiento de gobierno y el nivel de participación política. ¿Ud qué
puede afirmar?
rm(list = ls()) # clean memory
LINK='https://en.wikipedia.org/wiki/Democracy_Index'
PATH='//*[@id="mw-content-text"]/div[1]/table[6]'
demo=htmltab::htmltab(LINK,PATH)
demo=demo[,c(3,7:11)] # just what is needed
names(demo)=c("Country","elect","func","parti","cult","civil")
demo[,-1]=lapply(demo[,-1], as.numeric)
demo=na.omit(demo)
h1=formula(elect~func + parti)
r1=lm(h1,data=demo)
summary(r1)
Call:
lm(formula = h1, data = demo)
Residuals:
Min 1Q Median 3Q Max
-4.7820 -1.2590 -0.0798 1.4786 4.4657
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -2.42114 0.43500 -5.566 1.04e-07 ***
func 0.73121 0.08212 8.904 9.73e-16 ***
parti 0.86349 0.10801 7.995 2.21e-13 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1.912 on 164 degrees of freedom
Multiple R-squared: 0.7531, Adjusted R-squared: 0.7501
F-statistic: 250.1 on 2 and 164 DF, p-value: < 2.2e-16
- El mismo investigador tiene una duda: cree que lograría un modelo
mejor que el anterior si añadiese como predictor el nivel de libertades
civiles. ¿Qué opinas?
h2=formula(elect~func + parti + civil)
r2=lm(h2,data=demo)
# model selection --------
anova(r1,r2)
Analysis of Variance Table
Model 1: elect ~ func + parti
Model 2: elect ~ func + parti + civil
Res.Df RSS Df Sum of Sq F Pr(>F)
1 164 599.32
2 163 364.19 1 235.13 105.24 < 2.2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- Descargue la data de este LINK
(note que el documento incluye la metadata). No olvide trabajar con
datos completos. ¿Se verifica la hipótesis que la Mortalidad materna es
explicada por la fertilidad y la desnutrición?
rm(list = ls())
wb=read.csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vSpe4ZRgc92WdHLjNdFJGDpEZOTZ2zvwVUUjPuRhZo-pXyoF44B91ut2ChagKB8Iw/pub?gid=1446884572&single=true&output=csv")
# names(wb) # fair
# str(wb)
wb=na.omit(wb)
h1=formula(MaterMort100m~TasaFertil1mMuje + UndernourishPerPop)
r1=lm(h1,data=wb)
summary(r1)
Call:
lm(formula = h1, data = wb)
Residuals:
Min 1Q Median 3Q Max
-254.49 -56.87 -20.80 16.02 941.71
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -12.1276 10.0810 -1.203 0.23055
TasaFertil1mMuje 2.6156 0.2217 11.799 < 2e-16 ***
UndernourishPerPop 3.9128 1.0441 3.747 0.00024 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 134.7 on 180 degrees of freedom
Multiple R-squared: 0.9979, Adjusted R-squared: 0.9979
F-statistic: 4.335e+04 on 2 and 180 DF, p-value: < 2.2e-16
# standardized results -------
lm.beta::lm.beta(r1)
Call:
lm(formula = h1, data = wb)
Standardized Coefficients::
(Intercept) TasaFertil1mMuje UndernourishPerPop
NA 0.7583632 0.2408552
- De lo anterior, Uds. se preguntan si pueden obtener un mejor modelo
si añade el empleo, ¿Qué encuentras al correr el modelo
actualizado?
h2=formula(MaterMort100m~TasaFertil1mMuje + UndernourishPerPop + EmployPerPop)
r2=lm(h2,data=wb)
anova(r1,r2)
Analysis of Variance Table
Model 1: MaterMort100m ~ TasaFertil1mMuje + UndernourishPerPop
Model 2: MaterMort100m ~ TasaFertil1mMuje + UndernourishPerPop + EmployPerPop
Res.Df RSS Df Sum of Sq F Pr(>F)
1 180 3267451
2 179 2922157 1 345295 21.151 8.004e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
- Diríjase a la pagina web de la CIA.
Descargue Infant Mortality rate y Education
expenditures (People and Society); Public debt (Economy);
Carbon dioxide emissions (Energy). Ud quiere plantearse dos
hipótesis. En ambas hipótesis, la deuda publica y las emisiones de
carbono son variables independientes. En la primera hipótesis, la
mortalidad infantil es la dependiente, y los gastos en educación pasa a
ser independiente con las otras; en la segunda, los gastos en educación
será la dependiente y la mortalidad infantil pasa a ser independiente
con las ya mencionadas. Si Ud prueba ambas hipótesis, ¿Qué
encuentras?
inf=htmltab::htmltab(infLink,xPathAll)
No encoding supplied: defaulting to UTF-8.
Warning: Columns [Date of Information] seem to have no data and are removed. Use rm_nodata_cols = F to suppress this behavior.
# hipotheses -------
h1=formula(inf~edu + deb + car)
h2=formula(edu~ inf + deb + car)
# modelling --------------------------------------------------------------
r1=lm(h1,data=alldata)
r2=lm(h2,data=alldata)
# results -------
summary(r1)
summary(r2)
- Diversas escuelas de la ciudad están sufriendo quejas por ataques
violentos a los alumnos. Los datos están disponibles en este ENLACE.
Al probar la hipotesis que el tipo de escuela y la ubicación del colegio
afectan los ataques ¿Qué encuentras?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vRZgLtdckN--CBTFFzWx_CZF8aqSosuwTZ6GOHAbBOZFEbIjnSvNg_0wrZ-VdW9T2u1qWdhogQIluYN/pub?gid=0&single=true&output=csv"
dataate=read.csv(lk)
#names(dataate)
modeltr <- glm(ataVio ~ tipo + region, family = poisson,
offset = log(poblacion), data = dataate)
#summary(modeltr)
#overdispersion
AER::dispersiontest(modeltr,alternative='greater')$ p.value<0.05
[1] TRUE
#underdispersion
AER::dispersiontest(modeltr,alternative='less')$ p.value<0.05
[1] FALSE
library(MASS)
modeltr2 <- glm.nb(ataVio ~ tipo + region + offset(log(poblacion)), data = dataate)
summary(modeltr2)
Call:
glm.nb(formula = ataVio ~ tipo + region + offset(log(poblacion)),
data = dataate, init.theta = 1.242581365, link = log)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.2499 -1.1136 -0.4544 0.4696 2.4795
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -8.20727 0.27203 -30.171 < 2e-16 ***
tipoPublica -0.16068 0.26537 -0.605 0.54486
regionMW 0.12305 0.42403 0.290 0.77167
regionNE 0.99469 0.34807 2.858 0.00427 **
regionS 0.54792 0.34520 1.587 0.11245
regionW 0.06314 0.45582 0.139 0.88982
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for Negative Binomial(1.2426) family taken to be 1)
Null deviance: 97.868 on 79 degrees of freedom
Residual deviance: 87.600 on 74 degrees of freedom
AIC: 420.59
Number of Fisher Scoring iterations: 1
Theta: 1.243
Std. Err.: 0.276
2 x log-likelihood: -406.588
exp(coef(modeltr2))
(Intercept) tipoPublica regionMW regionNE regionS regionW
0.0002726629 0.8515661558 1.1309419625 2.7038764497 1.7296441419 1.0651801125
- Se está estudiando los factores que influencian la admisión a los
colegios elite del Perú. Para ello se tienen datos de los postulantes
procedentes de diferentes escuelas primarias. Descargue la data de este
LINK
Si usa todas las variables disponibles como predictoras de la admisión,
¿Qué encuentras?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vSIeBRLEmHacvpWqAsi5W6B091eeZa0XN6wA3zww1qZlltK-EWCIkLN6J3_FkYvUDElViR67Rkx_80a/pub?gid=0&single=true&output=csv"
mydata <- read.csv(lk)
#str(mydata)
mylogit <- glm(admitido ~ letras + ciencias + prestigio,
data = mydata, family = "binomial")
#summary(mylogit)
sdVIs=apply(mydata[,c("letras","ciencias", "prestigio")],2,sd)
list(LogitSt=sdVIs*coef(mylogit)[c(2,3,4)])%>%
data.frame()
summary(mylogit)
Call:
glm(formula = admitido ~ letras + ciencias + prestigio, family = "binomial",
data = mydata)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.5802 -0.8848 -0.6382 1.1575 2.1732
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -6.249705 1.155732 -5.408 6.39e-08 ***
letras 0.002294 0.001092 2.101 0.0356 *
ciencias 0.007770 0.003275 2.373 0.0177 *
prestigio 0.560031 0.127137 4.405 1.06e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 499.98 on 399 degrees of freedom
Residual deviance: 459.44 on 396 degrees of freedom
AIC: 467.44
Number of Fisher Scoring iterations: 4
- Se está estudiando qué factores influyen en que los convictos
puestos en libertad vuelvan a la carcel. Los datos puede descargarlos de
aqui.
Con esos datos, dos investigadores desean probar algunas hipotesis. Un
investigador “A” afirma que mientras mayor la edad, y si uno ya está
casado, disminuirá el riesgo de volver a la carcel; mientras que otro
investigador “B” asegura que, además de esas predictoras, la experiencia
laboral previa también disminuye el riesgo de volver a la carcel. ¿Qué
opinas en esta situación?
rm(list = ls())
lk="https://docs.google.com/spreadsheets/d/e/2PACX-1vQSlGaMI8Q8qlXI0Bp3m7BQcEh8ZLzaP7RymVtRYkg3ah1sZVlCi6-HmeKCic1RjfuH3gL_wrbMms88/pub?gid=1573532387&single=true&output=csv"
carcel=read.csv(lk)
#names(carcel)
library(survival)
carcel$survival=with(carcel,Surv(time = semanasLibre,event = as.numeric(fueArrestado)))
carcel$casado=factor(carcel$casado)
COX_H1= formula(survival~edad + casado)
COX_H2= formula(survival~edad + casado + expLaboralPrevia)
#regression
rcox1 <- coxph(COX_H1,data=carcel)
rcox2 <- coxph(COX_H2,data=carcel)
summary(rcox1)
Call:
coxph(formula = COX_H1, data = carcel)
n= 432, number of events= 114
coef exp(coef) se(coef) z Pr(>|z|)
edad -0.06672 0.93545 0.02082 -3.205 0.00135 **
casado1 -0.49314 0.61070 0.37269 -1.323 0.18576
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
edad 0.9355 1.069 0.8981 0.9744
casado1 0.6107 1.637 0.2942 1.2678
Concordance= 0.616 (se = 0.027 )
Likelihood ratio test= 17.27 on 2 df, p=2e-04
Wald test = 13.99 on 2 df, p=9e-04
Score (logrank) test = 14.51 on 2 df, p=7e-04
summary(rcox2)
Call:
coxph(formula = COX_H2, data = carcel)
n= 432, number of events= 114
coef exp(coef) se(coef) z Pr(>|z|)
edad -0.05614 0.94541 0.02158 -2.602 0.00927 **
casado1 -0.39569 0.67322 0.37911 -1.044 0.29662
expLaboralPrevia -0.30907 0.73413 0.20427 -1.513 0.13026
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
edad 0.9454 1.058 0.9063 0.9862
casado1 0.6732 1.485 0.3202 1.4153
expLaboralPrevia 0.7341 1.362 0.4919 1.0956
Concordance= 0.615 (se = 0.026 )
Likelihood ratio test= 19.58 on 3 df, p=2e-04
Wald test = 16.83 on 3 df, p=8e-04
Score (logrank) test = 17.64 on 3 df, p=5e-04
anova(rcox1,rcox2)
Analysis of Deviance Table
Cox model: response is survival
Model 1: ~ edad + casado
Model 2: ~ edad + casado + expLaboralPrevia
loglik Chisq Df Pr(>|Chi|)
1 -666.75
2 -665.59 2.3132 1 0.1283
- A su data de democracia añádale el índice de desarrollo humano (en
ingles) que descargará de este LINK.
En este caso quédese con los nombres que se escriban de la misma manera.
Con la data unida, ¿Cuántos factores serían sugeridos de la data?
#-----
rm(list = ls())
library(htmltab)
# links
WhereDEMO=list(page="https://en.wikipedia.org/wiki/Democracy_Index",
xpath='//*[@id="mw-content-text"]/div[1]/table[6]/tbody')
#carga
idh = rio::import("HDR21-22_Statistical_Annex_HDI_Table.xlsx",skip=4)
New names:
• `` -> `...1`
• `` -> `...2`
• `` -> `...4`
• `` -> `...6`
• `` -> `...8`
• `` -> `...10`
• `` -> `...12`
• `` -> `...14`
demo = htmltab(doc = WhereDEMO$page,
which = WhereDEMO$xpath,
encoding = "UTF-8")
#-----prepareIDH
#names(idh)
idh=idh[,c(2,3,5,7,9,11)]
newNames=c('Pais','puntuacion','EsperanzaVida','EscolaridadDuracion','EscolaridadPromedio','PBI')
names(idh)=newNames
#idh[idh$Pais=='Somalia' & !is.na(idh$Pais),]
idh=idh[c(1:202),]
idh=idh[!is.na(idh$Pais),]
idh[,-1]=lapply(idh[,-1], as.numeric)
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
Warning in lapply(idh[, -1], as.numeric) : NAs introduced by coercion
#idh[!complete.cases(idh[,-1]),]
idh=idh[complete.cases(idh[,-1]),]
row.names(idh)=NULL
#---- prepro DEMO
#names(demo)
demo=demo[,-c(1,2,6)]
names(demo)=c("Pais","RegimeType","Score","Electoral","Functioning","participation","culture",'Civilliberties')
demo[,3:8]=lapply(demo[,3:8],as.numeric)
#---- keys
idh$Pais= trimws(idh$Pais,whitespace = "[\\h\\v]")
demo$Pais= trimws(demo$Pais,whitespace = "[\\h\\v]")
idhdemo=merge(idh,demo)
#----- efa
dontselect=c("Pais","RegimeType","puntuacion",'Score')
select=setdiff(names(idhdemo),dontselect)
theData=idhdemo[,select]
library(polycor)
corMatrix=polycor::hetcor(theData)$correlations
library(psych)
#psych::KMO(corMatrix)
#cortest.bartlett(corMatrix,n=nrow(theData))$p.value>0.05
library(matrixcalc)
#is.singular.matrix(corMatrix)
fa.parallel(theData, fa = 'fa',correct = T,plot = F)
Parallel analysis suggests that the number of factors = 2 and the number of components = NA
- Si siguiese la recomendación para reducir la dimensionalidad,
¿Cuánta info logran recuperar los factores?
library(GPArotation)
resfa <- fa(theData,
nfactors = 2,
cor = 'mixed',
rotate = "varimax",
fm="minres")
print(resfa$loadings,cutoff = 0.5)
Loadings:
MR2 MR1
EsperanzaVida 0.867
EscolaridadDuracion 0.813
EscolaridadPromedio 0.791
PBI 0.806
Electoral 0.901
Functioning 0.521 0.738
participation 0.767
culture
Civilliberties 0.913
MR2 MR1
SS loadings 3.450 3.443
Proportion Var 0.383 0.383
Cumulative Var 0.383 0.766
- ¿Cómo interpreta el rol de complejidad y comunalidad de las
variables utilizadas?
sort(resfa$communality)
culture participation EscolaridadPromedio
0.4264771 0.7059212 0.7288980
PBI Functioning EscolaridadDuracion
0.7300781 0.8168660 0.8237711
EsperanzaVida Electoral Civilliberties
0.8384541 0.8777419 0.9443247
sort(resfa$complexity)
Electoral EsperanzaVida PBI
1.160066 1.226160 1.242377
Civilliberties EscolaridadPromedio participation
1.261717 1.318609 1.385843
EscolaridadDuracion Functioning culture
1.463350 1.798043 1.983687
- Si plantease un análisis factorial basado en alguna teoría, ¿Qué
usaría para darle sustento a los resultados de esa técnica?
modelCFA='demo=~ Electoral + Functioning + participation + culture + Civilliberties
idh=~EsperanzaVida + EscolaridadDuracion + EscolaridadPromedio + PBI'
# normalizar las variables:
theDataNorm=scale(theData)
library(lavaan)
cfa_fit <- cfa(modelCFA, data=theDataNorm,
std.lv=TRUE,
missing="fiml")
allParamCFA=parameterEstimates(cfa_fit,standardized = T)
allFitCFA=as.list(fitMeasures(cfa_fit))
allFitCFA[c("chisq", "df", "pvalue")] # pvalue>0.05
$chisq
[1] 120.3633
$df
[1] 26
$pvalue
[1] 4.274359e-14
allFitCFA$tli
[1] 0.9017975
allFitCFA[c('rmsea.ci.lower','rmsea' ,'rmsea.ci.upper')]
$rmsea.ci.lower
[1] 0.1302663
$rmsea
[1] 0.1582089
$rmsea.ci.upper
[1] 0.1873278
- Con la data original del Democracy Index pide 4 clusters y compara
el resultado con lo propuesto por The Economist. ¿Qué observas?
#### 1
dataClus=demo[,-c(1:3)]
row.names(dataClus)=demo$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
set.seed(123)
res.pam=pam(g.dist,4,cluster.only = F)
#nueva columna
dataClus$pam=res.pam$cluster
#aggregate(.~ pam, data=dataClus,mean)
demo$pam=res.pam$cluster
table(demo$pam,demo$RegimeType,dnn = c('Particion','Econo'))
Econo
Particion Authoritarian Flawed democracy Full democracy Hybrid regime
1 0 20 21 0
2 0 25 0 6
3 0 8 0 28
4 59 0 0 0
- Con la data original del IDH averigua cuantos clusters se
recomiendan siguiendo la técnica aglomerativa.
#boxplot(idh[,-c(1:2)],horizontal = F,las=2,cex.axis = 0.5)
dataClus=BBmisc::normalize(idh[,-c(1:2)],method='standardize')
row.names(dataClus)=idh$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
set.seed(123)
library(factoextra)
fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "agnes")

- Con la data original del Democracy Index pide los clusters que se
recomienden, ¿Cuántos países quedan mal clusterizados?
demo$pam=NULL
dataClus=demo[,-c(1:3)]
row.names(dataClus)=demo$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
fviz_nbclust(dataClus, pam,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F)

set.seed(123)
res.pam=pam(g.dist,7,cluster.only = F)
silPAM=data.frame(res.pam$silinfo$widths)
silPAM$country=row.names(silPAM)
poorPAM=silPAM[silPAM$sil_width<0,'country']#%>%sort()
poorPAM
[1] "Trinidad and Tobago" "Slovakia" "Kenya"
[4] "Tunisia" "Ukraine" "Albania"
[7] "Mexico" "Guyana" "Namibia"
[10] "Ghana" "Turkey" "Hong Kong"
[13] "Qatar" "Angola" "Eswatini"
[16] "Laos"
- Haz un merge con IDH y Democracy Index, pero recuperando todos los
paises aun cuando no se escriban igual. Normalice los valores del IDH
con el metodo rango (del 1 al 10). ¿Hay diferencias en cuanto a las
sugerencia de la cantidad de clusters para cada tecnica jerarquica si
usa los componentes de ambos conceptos?

fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "diana")

- Para el caso anterior, si Ud pide 3 clusters, ¿Qué diferencias
encuentra al clusterizar por ambas técnicas?
res.agnes<- hcut(g.dist, k = 3,hc_func='agnes',hc_method = "ward.D")
fviz_silhouette(res.agnes,print.summary = F)

res.diana <- hcut(g.dist, k = 3,hc_func='diana')
fviz_silhouette(res.diana,print.summary = F)

silDIANA=data.frame(res.diana$silinfo$widths)
silDIANA$country=row.names(silDIANA)
poorDIANA=silDIANA[silDIANA$sil_width<0,'country']#%>%sort()
poorDIANA
[1] "Senegal" "Liberia" "Guatemala"
[4] "Turkey" "Madagascar" "Zambia"
[7] "Morocco" "Malawi" "Papua New Guinea"
[10] "Bolivia" "Honduras"
silAGNES=data.frame(res.agnes$silinfo$widths)
silAGNES$country=row.names(silAGNES)
poorAGNES=silAGNES[silAGNES$sil_width<0,'country']#%>%sort()
poorAGNES
[1] "Guatemala" "Madagascar" "Turkey"
[4] "Zambia" "Morocco" "Malawi"
[7] "Papua New Guinea" "Honduras" "Bolivia"
[10] "Lesotho" "Bhutan" "Latvia"
[13] "Lithuania"
- Rehaga las preguntas 16 y 17, pero normalizando toda la data con la
técnica de estandarización.
idhdemo2=merge(idh,demo)
idhdemo2[,c(3:6,9:13)]=BBmisc::normalize(idhdemo2[,c(3:6,9:13)],method='standardize')
dataClus=idhdemo2[,c(3:6,9:13)]
row.names(dataClus)=idhdemo2$Pais
library(cluster)
g.dist = daisy(dataClus, metric="gower")
fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "agnes")

fviz_nbclust(dataClus, hcut,diss=g.dist,method = "gap_stat",k.max = 10,verbose = F,hc_func = "diana")

res.agnes<- hcut(g.dist, k = 3,hc_func='agnes',hc_method = "ward.D")
fviz_silhouette(res.agnes,print.summary = F)

res.diana <- hcut(g.dist, k = 3,hc_func='diana')
fviz_silhouette(res.diana,print.summary = F)

silDIANA=data.frame(res.diana$silinfo$widths)
silDIANA$country=row.names(silDIANA)
poorDIANA=silDIANA[silDIANA$sil_width<0,'country']#%>%sort()
poorDIANA
[1] "Senegal" "Liberia" "Guatemala"
[4] "Turkey" "Madagascar" "Zambia"
[7] "Morocco" "Malawi" "Papua New Guinea"
[10] "Bolivia" "Honduras"
silAGNES=data.frame(res.agnes$silinfo$widths)
silAGNES$country=row.names(silAGNES)
poorAGNES=silAGNES[silAGNES$sil_width<0,'country']#%>%sort()
poorAGNES
[1] "Guatemala" "Madagascar" "Turkey"
[4] "Zambia" "Morocco" "Malawi"
[7] "Papua New Guinea" "Honduras" "Bolivia"
[10] "Lesotho" "Bhutan" "Latvia"
[13] "Lithuania"
LS0tCnRpdGxlOiAiUmVwYXNvIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpSZXNvbHZhbW9zIGxhcyBzaWd1aWVudGVzIHByZWd1bnRhczoKCjEuIFNpIHVuIGludmVzdGlnYWRvciB1c2EgbGEgZGF0YSBkZSBbVGhlIEVjb25vbWlzdF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVtb2NyYWN5X0luZGV4KSBlIGhpcG90ZXRpemEgcXVlIGxhIGNhbGlkYWQgZGVsIHByb2Nlc28gZWxlY3RvcmFsIGRlcGVuZGUgZGVsIG5pdmVsIGRlIGZ1bmNpb25hbWllbnRvIGRlIGdvYmllcm5vIHkgZWwgbml2ZWwgZGUgcGFydGljaXBhY2nDs24gcG9sw610aWNhLiDCv1VkIHF1w6kgcHVlZGUgYWZpcm1hcj8KYGBge3J9CnJtKGxpc3QgPSBscygpKSAjIGNsZWFuIG1lbW9yeQpMSU5LPSdodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZW1vY3JhY3lfSW5kZXgnClBBVEg9Jy8vKltAaWQ9Im13LWNvbnRlbnQtdGV4dCJdL2RpdlsxXS90YWJsZVs2XScKZGVtbz1odG1sdGFiOjpodG1sdGFiKExJTkssUEFUSCkKZGVtbz1kZW1vWyxjKDMsNzoxMSldICMganVzdCB3aGF0IGlzIG5lZWRlZApuYW1lcyhkZW1vKT1jKCJDb3VudHJ5IiwiZWxlY3QiLCJmdW5jIiwicGFydGkiLCJjdWx0IiwiY2l2aWwiKQpkZW1vWywtMV09bGFwcGx5KGRlbW9bLC0xXSwgYXMubnVtZXJpYykgCmRlbW89bmEub21pdChkZW1vKQpoMT1mb3JtdWxhKGVsZWN0fmZ1bmMgKyBwYXJ0aSkKcjE9bG0oaDEsZGF0YT1kZW1vKQpzdW1tYXJ5KHIxKQpgYGAKCgoKCgoyLiBFbCBtaXNtbyBpbnZlc3RpZ2Fkb3IgdGllbmUgdW5hIGR1ZGE6IGNyZWUgcXVlIGxvZ3JhcsOtYSB1biBtb2RlbG8gbWVqb3IgcXVlIGVsIGFudGVyaW9yIHNpIGHDsWFkaWVzZSBjb21vIHByZWRpY3RvciAgZWwgbml2ZWwgZGUgbGliZXJ0YWRlcyBjaXZpbGVzLiDCv1F1w6kgIG9waW5hcz8KCmBgYHtyfQpoMj1mb3JtdWxhKGVsZWN0fmZ1bmMgKyBwYXJ0aSArIGNpdmlsKQpyMj1sbShoMixkYXRhPWRlbW8pCmFub3ZhKHIxLHIyKQpgYGAKCgozLiBEZXNjYXJndWUgbGEgZGF0YSBkZSBlc3RlIFtMSU5LXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xczJOZTl1UTdud1R2U282Y2tOUUhWMzVOWnQtT1lzOFYvZWRpdD91c3A9c2hhcmluZyZvdWlkPTEwNjkzNTc4ODUxODk0NzE2NTkxNyZydHBvZj10cnVlJnNkPXRydWUpIChub3RlIHF1ZSBlbCBkb2N1bWVudG8gaW5jbHV5ZSBsYSBtZXRhZGF0YSkuIE5vIG9sdmlkZSB0cmFiYWphciBjb24gZGF0b3MgY29tcGxldG9zLiDCv1NlIHZlcmlmaWNhIGxhIGhpcMOzdGVzaXMgcXVlIGxhIE1vcnRhbGlkYWQgbWF0ZXJuYSBlcyBleHBsaWNhZGEgcG9yIGxhIGZlcnRpbGlkYWQgeSBsYSBkZXNudXRyaWNpw7NuPwoKYGBge3J9CnJtKGxpc3QgPSBscygpKQp3Yj1yZWFkLmNzdigiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlNwZTRaUmdjOTJXZEhMak5kRkpHRHBFWk9UWjJ6dndWVVVqUHVSaFpvLXBYeW9GNDRCOTF1dDJDaGFnS0I4SXcvcHViP2dpZD0xNDQ2ODg0NTcyJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiKQojIG5hbWVzKHdiKSAjIGZhaXIKIyBzdHIod2IpCndiPW5hLm9taXQod2IpCmgxPWZvcm11bGEoTWF0ZXJNb3J0MTAwbX5UYXNhRmVydGlsMW1NdWplICsgVW5kZXJub3VyaXNoUGVyUG9wKQpyMT1sbShoMSxkYXRhPXdiKQpzdW1tYXJ5KHIxKQpgYGAKCmBgYHtyfQojIHN0YW5kYXJkaXplZCByZXN1bHRzIC0tLS0tLS0KbG0uYmV0YTo6bG0uYmV0YShyMSkKYGBgCjQuIERlIGxvIGFudGVyaW9yLCBVZHMuIHNlIHByZWd1bnRhbiBzaSBwdWVkZW4gb2J0ZW5lciB1biBtZWpvciBtb2RlbG8gc2kgYcOxYWRlIGVsIGVtcGxlbywgwr9RdcOpIGVuY3VlbnRyYXMgIGFsIGNvcnJlciBlbCBtb2RlbG8gYWN0dWFsaXphZG8/CmBgYHtyfQpoMj1mb3JtdWxhKE1hdGVyTW9ydDEwMG1+VGFzYUZlcnRpbDFtTXVqZSArIFVuZGVybm91cmlzaFBlclBvcCArIEVtcGxveVBlclBvcCkKcjI9bG0oaDIsZGF0YT13YikKYW5vdmEocjEscjIpCmBgYAoKCjUuIERpcsOtamFzZSBhIGxhIHBhZ2luYSB3ZWIgZGUgbGEgW0NJQV0oaHR0cHM6Ly93d3cuY2lhLmdvdi90aGUtd29ybGQtZmFjdGJvb2svYWJvdXQvYXJjaGl2ZXMvMjAyMS8pLiBEZXNjYXJndWUgX0luZmFudCBNb3J0YWxpdHkgcmF0ZV8geSAKX0VkdWNhdGlvbiBleHBlbmRpdHVyZXNfIChQZW9wbGUgYW5kIFNvY2lldHkpOyBfUHVibGljIGRlYnRfIChFY29ub215KTsgX0NhcmJvbiBkaW94aWRlIGVtaXNzaW9uc18gKEVuZXJneSkuIFVkIHF1aWVyZSBwbGFudGVhcnNlIGRvcyBoaXDDs3Rlc2lzLiBFbiBhbWJhcyBoaXDDs3Rlc2lzLCBsYSBkZXVkYSBwdWJsaWNhIHkgbGFzIGVtaXNpb25lcyBkZSBjYXJib25vIHNvbiB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMuIEVuIGxhIHByaW1lcmEgaGlww7N0ZXNpcywgbGEgbW9ydGFsaWRhZCBpbmZhbnRpbCBlcyBsYSBkZXBlbmRpZW50ZSwgeSBsb3MgZ2FzdG9zIGVuIGVkdWNhY2nDs24gcGFzYSBhIHNlciBpbmRlcGVuZGllbnRlIGNvbiBsYXMgb3RyYXM7IGVuIGxhIHNlZ3VuZGEsIGxvcyBnYXN0b3MgZW4gZWR1Y2FjacOzbiBzZXLDoSBsYSBkZXBlbmRpZW50ZSB5IGxhIG1vcnRhbGlkYWQgaW5mYW50aWwgcGFzYSBhIHNlciBpbmRlcGVuZGllbnRlIGNvbiBsYXMgeWEgbWVuY2lvbmFkYXMuIFNpIFVkIHBydWViYSBhbWJhcyBoaXDDs3Rlc2lzLCDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKI2xpbmsgdG8gcGFnZXMKY2lhPSdodHRwczovL3d3dy5jaWEuZ292L3RoZS13b3JsZC1mYWN0Ym9vay9maWVsZC8nCmluZkxpbms9cGFzdGUwKGNpYSwiaW5mYW50LW1vcnRhbGl0eS1yYXRlL2NvdW50cnktY29tcGFyaXNvbiIpCmVkdUxpbms9cGFzdGUwKGNpYSwiZWR1Y2F0aW9uLWV4cGVuZGl0dXJlcy9jb3VudHJ5LWNvbXBhcmlzb24iKQpkZWJMaW5rPXBhc3RlMChjaWEsInB1YmxpYy1kZWJ0L2NvdW50cnktY29tcGFyaXNvbiIpCmNhckxpbms9cGFzdGUwKGNpYSwiY2FyYm9uLWRpb3hpZGUtZW1pc3Npb25zL2NvdW50cnktY29tcGFyaXNvbiIpCgojIGxpbmsgdG8gcGF0aHMKeFBhdGhBbGw9Jy8vKltAaWQ9ImluZGV4LWNvbnRlbnQtc2VjdGlvbiJdL2Rpdi9kaXZbMl0vZGl2L2Rpdi9kaXYvZGl2L2Rpdi90YWJsZScKaW5mPWh0bWx0YWI6Omh0bWx0YWIoaW5mTGluayx4UGF0aEFsbCkKZWR1PWh0bWx0YWI6Omh0bWx0YWIoZWR1TGluayx4UGF0aEFsbCkKZGViPWh0bWx0YWI6Omh0bWx0YWIoZGViTGluayx4UGF0aEFsbCkKY2FyPWh0bWx0YWI6Omh0bWx0YWIoY2FyTGluayx4UGF0aEFsbCkKCiMga2VlcCB3aGF0IHlvdSBuZWVkOgppbmY9aW5mWyxjKDIsMyldCmVkdT1lZHVbLGMoMiwzKV0KZGViPWRlYlssYygyLDMpXQpjYXI9Y2FyWyxjKDIsMyldCgojIHJlbmFtZSAtLS0tLQpuYW1lcyhpbmYpPWMoIkNvdW50cnkiLCJpbmYiKQpuYW1lcyhlZHUpPWMoIkNvdW50cnkiLCJlZHUiKQpuYW1lcyhkZWIpPWMoIkNvdW50cnkiLCJkZWIiKQpuYW1lcyhjYXIpPWMoIkNvdW50cnkiLCJjYXIiKQoKIyBtZXJnaW5nIC0tLS0tLQphbGxDaWE9bWVyZ2UoaW5mLGVkdSxhbGwueCA9IFQsIGFsbC55ID0gVCwgYnkgPSAnQ291bnRyeScpCmFsbENpYT1tZXJnZShhbGxDaWEsZGViLGFsbC54ID0gVCwgYWxsLnkgPSBULCBieSA9ICdDb3VudHJ5JykKYWxsQ2lhPW1lcmdlKGFsbENpYSxjYXIsYWxsLnggPSBULCBhbGwueSA9IFQsIGJ5ID0gJ0NvdW50cnknKQoKIyB2ZXJpZnkgZGF0YSB0eXBlIC0tLS0tLQojc3RyKGFsbENpYSkKCiMgcGFyc2luZzoKYWxsQ2lhJGNhcj1hcy5udW1lcmljKGdzdWIoIiwiLCIiLGFsbENpYSRjYXIpKQoKIyBzZXQgZGF0YSB0eXBlIC0tLS0gIyMgYWZ0ZXIgcGFyc2luZyEKYWxsQ2lhWywtMV09bGFwcGx5KGFsbENpYVssLTFdLCBhcy5udW1lcmljKQoKIyBubyBtaXNzaW5nIC0tLS0tCmFsbENpYT1uYS5vbWl0KGFsbENpYSkKYGBgCgpgYGB7cn0KIyBoaXBvdGhlc2VzIC0tLS0tLS0KaDE9Zm9ybXVsYShpbmZ+ZWR1ICsgZGViICsgY2FyKQpoMj1mb3JtdWxhKGVkdX4gaW5mICsgZGViICsgY2FyKQojIG1vZGVsbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpyMT1sbShoMSxkYXRhPWFsbGRhdGEpCnIyPWxtKGgyLGRhdGE9YWxsZGF0YSkKIyByZXN1bHRzIC0tLS0tLS0Kc3VtbWFyeShyMSkKc3VtbWFyeShyMikKYGBgCgoKNi4gRGl2ZXJzYXMgZXNjdWVsYXMgZGUgbGEgY2l1ZGFkIGVzdMOhbiBzdWZyaWVuZG8gcXVlamFzIHBvciBhdGFxdWVzIHZpb2xlbnRvcyBhIGxvcyBhbHVtbm9zLiBMb3MgZGF0b3MgZXN0w6FuIGRpc3BvbmlibGVzIGVuIGVzdGUgW0VOTEFDRV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUM5QzhjMjBvQlNqUFJEaGZaN19vQWk3WE9FbWVDX0xsbVpEWlZmSWVXdHMvZWRpdD91c3A9c2hhcmluZykuIEFsIHByb2JhciBsYSBoaXBvdGVzaXMgcXVlIGVsIHRpcG8gZGUgZXNjdWVsYSB5IGxhIHViaWNhY2nDs24gZGVsIGNvbGVnaW8gYWZlY3RhbiBsb3MgYXRhcXVlcyDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKbGs9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZSWmdMdGRja04tLUNCVEZGeld4X0NaRjhhcVNvc3V3VFo2R09IQWJCT1pGRWJJam5Tdk5nXzB3clotVmRXOVQydTFxV2Rob2dRSWx1WU4vcHViP2dpZD0wJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiCmRhdGFhdGU9cmVhZC5jc3YobGspCiNuYW1lcyhkYXRhYXRlKQptb2RlbHRyIDwtIGdsbShhdGFWaW8gfiB0aXBvICsgcmVnaW9uLCBmYW1pbHkgPSBwb2lzc29uLAogICAgICAgICAgICAgICBvZmZzZXQgPSBsb2cocG9ibGFjaW9uKSwgZGF0YSA9IGRhdGFhdGUpCiNzdW1tYXJ5KG1vZGVsdHIpCiNvdmVyZGlzcGVyc2lvbgpBRVI6OmRpc3BlcnNpb250ZXN0KG1vZGVsdHIsYWx0ZXJuYXRpdmU9J2dyZWF0ZXInKSQgcC52YWx1ZTwwLjA1CiN1bmRlcmRpc3BlcnNpb24KQUVSOjpkaXNwZXJzaW9udGVzdChtb2RlbHRyLGFsdGVybmF0aXZlPSdsZXNzJykkIHAudmFsdWU8MC4wNQoKbGlicmFyeShNQVNTKQptb2RlbHRyMiA8LSBnbG0ubmIoYXRhVmlvIH4gdGlwbyArIHJlZ2lvbiArIG9mZnNldChsb2cocG9ibGFjaW9uKSksIGRhdGEgPSBkYXRhYXRlKQpzdW1tYXJ5KG1vZGVsdHIyKQpleHAoY29lZihtb2RlbHRyMikpCmBgYAoKCjcuIFNlIGVzdMOhIGVzdHVkaWFuZG8gbG9zIGZhY3RvcmVzIHF1ZSBpbmZsdWVuY2lhbiBsYSBhZG1pc2nDs24gYSBsb3MgY29sZWdpb3MgZWxpdGUgZGVsIFBlcsO6LiBQYXJhIGVsbG8gc2UgdGllbmVuIGRhdG9zIGRlIGxvcyBwb3N0dWxhbnRlcyBwcm9jZWRlbnRlcyBkZSBkaWZlcmVudGVzIGVzY3VlbGFzIHByaW1hcmlhcy4gCkRlc2Nhcmd1ZSBsYSBkYXRhIGRlIGVzdGUgW0xJTktdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFxclJGRUFCLWpaQlVVam45WHdFbThtaS1sMGw0bUpuQ1dVUFg2YVh0cHo0L2VkaXQ/dXNwPXNoYXJpbmcpIFNpIHVzYSB0b2RhcyBsYXMgdmFyaWFibGVzIGRpc3BvbmlibGVzIGNvbW8gcHJlZGljdG9yYXMgZGUgbGEgYWRtaXNpw7NuLCDCv1F1w6kgZW5jdWVudHJhcz8KCmBgYHtyfQpybShsaXN0ID0gbHMoKSkKbGs9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZTSWVCUkxFbUhhY3ZwV3FBc2k1VzZCMDkxZWVaYTBYTjZ3QTN6d3cxcVpsbHRLLUVXQ0lrTE42SjNfRmtZdlVERWxWaVI2N1JreF84MGEvcHViP2dpZD0wJnNpbmdsZT10cnVlJm91dHB1dD1jc3YiCm15ZGF0YSA8LSByZWFkLmNzdihsaykKI3N0cihteWRhdGEpCm15bG9naXQgPC0gZ2xtKGFkbWl0aWRvIH4gbGV0cmFzICsgY2llbmNpYXMgKyBwcmVzdGlnaW8sIAogICAgICAgICAgICAgICBkYXRhID0gbXlkYXRhLCBmYW1pbHkgPSAiYmlub21pYWwiKQojc3VtbWFyeShteWxvZ2l0KQoKc2RWSXM9YXBwbHkobXlkYXRhWyxjKCJsZXRyYXMiLCJjaWVuY2lhcyIsICJwcmVzdGlnaW8iKV0sMixzZCkKbGlzdChMb2dpdFN0PXNkVklzKmNvZWYobXlsb2dpdClbYygyLDMsNCldKSU+JQogICAgZGF0YS5mcmFtZSgpCmBgYApgYGB7cn0Kc3VtbWFyeShteWxvZ2l0KQpgYGAKCgo4LiBTZSBlc3TDoSBlc3R1ZGlhbmRvIHF1w6kgZmFjdG9yZXMgaW5mbHV5ZW4gZW4gcXVlIGxvcyBjb252aWN0b3MgcHVlc3RvcyBlbiBsaWJlcnRhZCB2dWVsdmFuIGEgbGEgY2FyY2VsLiBMb3MgZGF0b3MgcHVlZGUgZGVzY2FyZ2FybG9zIGRlIFthcXVpXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xQWhsb1pJYXBvSWh6NC1xT2duM3UyQVhLeWtLb0E5LWZER25oVDJDR3h0MC9lZGl0P3VzcD1zaGFyaW5nKS4gQ29uIGVzb3MgZGF0b3MsIGRvcyBpbnZlc3RpZ2Fkb3JlcyBkZXNlYW4gcHJvYmFyIGFsZ3VuYXMgaGlwb3Rlc2lzLiBVbiBpbnZlc3RpZ2Fkb3IgIkEiIGFmaXJtYSBxdWUgbWllbnRyYXMgbWF5b3IgbGEgZWRhZCwgeSBzaSB1bm8geWEgZXN0w6EgY2FzYWRvLCBkaXNtaW51aXLDoSBlbCByaWVzZ28gZGUgdm9sdmVyIGEgbGEgY2FyY2VsOyBtaWVudHJhcyBxdWUgb3RybyBpbnZlc3RpZ2Fkb3IgIkIiIGFzZWd1cmEgcXVlLCBhZGVtw6FzIGRlIGVzYXMgcHJlZGljdG9yYXMsIGxhIGV4cGVyaWVuY2lhIGxhYm9yYWwgcHJldmlhIHRhbWJpw6luIGRpc21pbnV5ZSBlbCByaWVzZ28gZGUgdm9sdmVyIGEgbGEgY2FyY2VsLiDCv1F1w6kgb3BpbmFzIGVuIGVzdGEgc2l0dWFjacOzbj8KYGBge3J9CnJtKGxpc3QgPSBscygpKQpsaz0iaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvZS8yUEFDWC0xdlFTbEdhTUk4UThxbFhJMEJwM203QlFjRWg4Wkx6YVA3UnltVnRSWWtnM2FoMXNaVmxDaTYtSG1lS0NpYzFSamZ1SDNnTF93cmJNbXM4OC9wdWI/Z2lkPTE1NzM1MzIzODcmc2luZ2xlPXRydWUmb3V0cHV0PWNzdiIKY2FyY2VsPXJlYWQuY3N2KGxrKQojbmFtZXMoY2FyY2VsKQpsaWJyYXJ5KHN1cnZpdmFsKQpjYXJjZWwkc3Vydml2YWw9d2l0aChjYXJjZWwsU3Vydih0aW1lID0gc2VtYW5hc0xpYnJlLGV2ZW50ID0gIGFzLm51bWVyaWMoZnVlQXJyZXN0YWRvKSkpCmNhcmNlbCRjYXNhZG89ZmFjdG9yKGNhcmNlbCRjYXNhZG8pCkNPWF9IMT0gZm9ybXVsYShzdXJ2aXZhbH5lZGFkICsgY2FzYWRvKQpDT1hfSDI9IGZvcm11bGEoc3Vydml2YWx+ZWRhZCArIGNhc2FkbyArIGV4cExhYm9yYWxQcmV2aWEpCiNyZWdyZXNzaW9uCnJjb3gxIDwtIGNveHBoKENPWF9IMSxkYXRhPWNhcmNlbCkKcmNveDIgPC0gY294cGgoQ09YX0gyLGRhdGE9Y2FyY2VsKQpzdW1tYXJ5KHJjb3gxKQpzdW1tYXJ5KHJjb3gyKQpgYGAKYGBge3J9CmFub3ZhKHJjb3gxLHJjb3gyKQpgYGAKCgo5LiBBIHN1IGRhdGEgZGUgZGVtb2NyYWNpYSBhw7HDoWRhbGUgZWwgw61uZGljZSBkZSBkZXNhcnJvbGxvIGh1bWFubyAoZW4gaW5nbGVzKSBxdWUgZGVzY2FyZ2Fyw6EgZGUgZXN0ZSBbTElOS10oaHR0cHM6Ly9oZHIudW5kcC5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy8yMDIxLTIyX0hEUi9IRFIyMS0yMl9TdGF0aXN0aWNhbF9Bbm5leF9IRElfVGFibGUueGxzeCkuIEVuIGVzdGUgY2FzbyBxdcOpZGVzZSBjb24gbG9zIG5vbWJyZXMgcXVlIHNlIGVzY3JpYmFuIGRlIGxhIG1pc21hIG1hbmVyYS4gQ29uIGxhIGRhdGEgdW5pZGEsIMK/Q3XDoW50b3MgZmFjdG9yZXMgc2Vyw61hbiBzdWdlcmlkb3MgZGUgbGEgZGF0YT8KYGBge3J9CiMtLS0tLQpybShsaXN0ID0gbHMoKSkKbGlicmFyeShodG1sdGFiKQoKIyBsaW5rcwpXaGVyZURFTU89bGlzdChwYWdlPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZW1vY3JhY3lfSW5kZXgiLAogICAgICAgICAgICAgICB4cGF0aD0nLy8qW0BpZD0ibXctY29udGVudC10ZXh0Il0vZGl2WzFdL3RhYmxlWzZdL3Rib2R5JykKCiNjYXJnYQpXaGVyZUlESD0naHR0cHM6Ly9naXRodWIuY29tL0VzdGFkaXN0aWNhLUFuYWxpc2lzUG9saXRpY28vRGF0YUZpbGVzLWVzdGFkaXN0aWNhL3Jhdy9tYWluL0hEUjIxLTIyX1N0YXRpc3RpY2FsX0FubmV4X0hESV9UYWJsZS54bHN4JwoKI2NhcmdhCmlkaCAgPSByaW86OmltcG9ydChXaGVyZUlESCxza2lwPTQsLm5hbWVfcmVwYWlyPSdtaW5pbWFsJykKZGVtbyAgPSBodG1sdGFiKGRvYyA9IFdoZXJlREVNTyRwYWdlLCAKICAgICAgICAgICAgICAgIHdoaWNoICA9IFdoZXJlREVNTyR4cGF0aCwKICAgICAgICAgICAgICAgIGVuY29kaW5nID0gIlVURi04IikKIy0tLS0tcHJlcGFyZUlESAojbmFtZXMoaWRoKQppZGg9aWRoWyxjKDIsMyw1LDcsOSwxMSldCm5ld05hbWVzPWMoJ1BhaXMnLCdwdW50dWFjaW9uJywnRXNwZXJhbnphVmlkYScsJ0VzY29sYXJpZGFkRHVyYWNpb24nLCdFc2NvbGFyaWRhZFByb21lZGlvJywnUEJJJykKbmFtZXMoaWRoKT1uZXdOYW1lcwojaWRoW2lkaCRQYWlzPT0nU29tYWxpYScgJiAhaXMubmEoaWRoJFBhaXMpLF0KaWRoPWlkaFtjKDE6MjAyKSxdCmlkaD1pZGhbIWlzLm5hKGlkaCRQYWlzKSxdCgppZGhbLC0xXT1sYXBwbHkoaWRoWywtMV0sIGFzLm51bWVyaWMpCgojaWRoWyFjb21wbGV0ZS5jYXNlcyhpZGhbLC0xXSksXQppZGg9aWRoW2NvbXBsZXRlLmNhc2VzKGlkaFssLTFdKSxdCnJvdy5uYW1lcyhpZGgpPU5VTEwKCiMtLS0tIHByZXBybyBERU1PCiNuYW1lcyhkZW1vKQpkZW1vPWRlbW9bLC1jKDEsMiw2KV0KCm5hbWVzKGRlbW8pPWMoIlBhaXMiLCJSZWdpbWVUeXBlIiwiU2NvcmUiLCJFbGVjdG9yYWwiLCJGdW5jdGlvbmluZyIsInBhcnRpY2lwYXRpb24iLCJjdWx0dXJlIiwnQ2l2aWxsaWJlcnRpZXMnKQoKZGVtb1ssMzo4XT1sYXBwbHkoZGVtb1ssMzo4XSxhcy5udW1lcmljKQoKIy0tLS0ga2V5cwppZGgkUGFpcz0gdHJpbXdzKGlkaCRQYWlzLHdoaXRlc3BhY2UgPSAiW1xcaFxcdl0iKQpkZW1vJFBhaXM9IHRyaW13cyhkZW1vJFBhaXMsd2hpdGVzcGFjZSA9ICJbXFxoXFx2XSIpIAoKaWRoZGVtbz1tZXJnZShpZGgsZGVtbykKYGBgCgpgYGB7cn0KIy0tLS0tIGVmYQoKZG9udHNlbGVjdD1jKCJQYWlzIiwiUmVnaW1lVHlwZSIsInB1bnR1YWNpb24iLCdTY29yZScpCnNlbGVjdD1zZXRkaWZmKG5hbWVzKGlkaGRlbW8pLGRvbnRzZWxlY3QpIAp0aGVEYXRhPWlkaGRlbW9bLHNlbGVjdF0KbGlicmFyeShwb2x5Y29yKQpjb3JNYXRyaXg9cG9seWNvcjo6aGV0Y29yKHRoZURhdGEpJGNvcnJlbGF0aW9ucwpsaWJyYXJ5KHBzeWNoKQojcHN5Y2g6OktNTyhjb3JNYXRyaXgpIAojY29ydGVzdC5iYXJ0bGV0dChjb3JNYXRyaXgsbj1ucm93KHRoZURhdGEpKSRwLnZhbHVlPjAuMDUKbGlicmFyeShtYXRyaXhjYWxjKQojaXMuc2luZ3VsYXIubWF0cml4KGNvck1hdHJpeCkKZmEucGFyYWxsZWwodGhlRGF0YSwgZmEgPSAnZmEnLGNvcnJlY3QgPSBULHBsb3QgPSBGKQpgYGAKCgoxMC4gU2kgc2lndWllc2UgbGEgcmVjb21lbmRhY2nDs24gcGFyYSByZWR1Y2lyIGxhIGRpbWVuc2lvbmFsaWRhZCwgwr9DdcOhbnRhIGluZm8gbG9ncmFuIHJlY3VwZXJhciBsb3MgZmFjdG9yZXM/CmBgYHtyfQpsaWJyYXJ5KEdQQXJvdGF0aW9uKQpyZXNmYSA8LSBmYSh0aGVEYXRhLAogICAgICAgICAgICBuZmFjdG9ycyA9IDIsCiAgICAgICAgICAgIGNvciA9ICdtaXhlZCcsCiAgICAgICAgICAgIHJvdGF0ZSA9ICJ2YXJpbWF4IiwKICAgICAgICAgICAgZm09Im1pbnJlcyIpCnByaW50KHJlc2ZhJGxvYWRpbmdzLGN1dG9mZiA9IDAuNSkKYGBgCgoKMTEuIMK/Q8OzbW8gaW50ZXJwcmV0YSBlbCByb2wgZGUgY29tcGxlamlkYWQgeSBjb211bmFsaWRhZCBkZSBsYXMgdmFyaWFibGVzIHV0aWxpemFkYXM/CgpgYGB7cn0Kc29ydChyZXNmYSRjb21tdW5hbGl0eSkKYGBgCmBgYHtyfQpzb3J0KHJlc2ZhJGNvbXBsZXhpdHkpCmBgYAoKCgoxMi4gU2kgcGxhbnRlYXNlIHVuIGFuw6FsaXNpcyBmYWN0b3JpYWwgYmFzYWRvIGVuIGFsZ3VuYSB0ZW9yw61hLCDCv1F1w6kgdXNhcsOtYSBwYXJhIGRhcmxlIHN1c3RlbnRvIGEgbG9zIHJlc3VsdGFkb3MgZGUgZXNhIHTDqWNuaWNhPwoKYGBge3J9Cm1vZGVsQ0ZBPSdkZW1vPX4gRWxlY3RvcmFsICsgRnVuY3Rpb25pbmcgKyBwYXJ0aWNpcGF0aW9uICsgY3VsdHVyZSArIENpdmlsbGliZXJ0aWVzCmlkaD1+RXNwZXJhbnphVmlkYSArIEVzY29sYXJpZGFkRHVyYWNpb24gKyBFc2NvbGFyaWRhZFByb21lZGlvICsgUEJJJwoKIyBub3JtYWxpemFyIGxhcyB2YXJpYWJsZXM6CnRoZURhdGFOb3JtPXNjYWxlKHRoZURhdGEpCgpsaWJyYXJ5KGxhdmFhbikKY2ZhX2ZpdCA8LSBjZmEobW9kZWxDRkEsIGRhdGE9dGhlRGF0YU5vcm0sIAogICAgICAgICAgICAgICBzdGQubHY9VFJVRSwgIAogICAgICAgICAgICAgICBtaXNzaW5nPSJmaW1sIikKYWxsUGFyYW1DRkE9cGFyYW1ldGVyRXN0aW1hdGVzKGNmYV9maXQsc3RhbmRhcmRpemVkID0gVCkKYWxsRml0Q0ZBPWFzLmxpc3QoZml0TWVhc3VyZXMoY2ZhX2ZpdCkpCmFsbEZpdENGQVtjKCJjaGlzcSIsICJkZiIsICJwdmFsdWUiKV0gIyBwdmFsdWU+MC4wNQpgYGAKCmBgYHtyfQphbGxGaXRDRkEkdGxpIApgYGAKCmBgYHtyfQphbGxGaXRDRkFbYygncm1zZWEuY2kubG93ZXInLCdybXNlYScgLCdybXNlYS5jaS51cHBlcicpXSAKYGBgCgoKMTMuIENvbiBsYSBkYXRhIG9yaWdpbmFsIGRlbCBEZW1vY3JhY3kgSW5kZXggcGlkZSA0IGNsdXN0ZXJzIHkgY29tcGFyYSBlbCByZXN1bHRhZG8gY29uIGxvIHByb3B1ZXN0byBwb3IgVGhlIEVjb25vbWlzdC4gwr9RdcOpIG9ic2VydmFzPwoKYGBge3J9CiMjIyMgMQpkYXRhQ2x1cz1kZW1vWywtYygxOjMpXQpyb3cubmFtZXMoZGF0YUNsdXMpPWRlbW8kUGFpcwpsaWJyYXJ5KGNsdXN0ZXIpCmcuZGlzdCA9IGRhaXN5KGRhdGFDbHVzLCBtZXRyaWM9Imdvd2VyIikKc2V0LnNlZWQoMTIzKQpyZXMucGFtPXBhbShnLmRpc3QsNCxjbHVzdGVyLm9ubHkgPSBGKQoKI251ZXZhIGNvbHVtbmEKZGF0YUNsdXMkcGFtPXJlcy5wYW0kY2x1c3RlcgoKI2FnZ3JlZ2F0ZSgufiBwYW0sIGRhdGE9ZGF0YUNsdXMsbWVhbikKZGVtbyRwYW09cmVzLnBhbSRjbHVzdGVyCnRhYmxlKGRlbW8kcGFtLGRlbW8kUmVnaW1lVHlwZSxkbm4gPSBjKCdQYXJ0aWNpb24nLCdFY29ubycpKQoKYGBgCjE0LiBDb24gbGEgZGF0YSBvcmlnaW5hbCBkZWwgSURIIGF2ZXJpZ3VhIGN1YW50b3MgY2x1c3RlcnMgc2UgcmVjb21pZW5kYW4gc2lndWllbmRvIGxhIHTDqWNuaWNhIGFnbG9tZXJhdGl2YS4KCmBgYHtyfQojYm94cGxvdChpZGhbLC1jKDE6MildLGhvcml6b250YWwgPSBGLGxhcz0yLGNleC5heGlzID0gMC41KQoKCmRhdGFDbHVzPUJCbWlzYzo6bm9ybWFsaXplKGlkaFssLWMoMToyKV0sbWV0aG9kPSdzdGFuZGFyZGl6ZScpCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoJFBhaXMKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCnNldC5zZWVkKDEyMykKCgpsaWJyYXJ5KGZhY3RvZXh0cmEpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgaGN1dCxkaXNzPWcuZGlzdCxtZXRob2QgPSAiZ2FwX3N0YXQiLGsubWF4ID0gMTAsdmVyYm9zZSA9IEYsaGNfZnVuYyA9ICJhZ25lcyIpCgpgYGAKMTUuIENvbiBsYSBkYXRhIG9yaWdpbmFsIGRlbCBEZW1vY3JhY3kgSW5kZXggcGlkZSBsb3MgY2x1c3RlcnMgcXVlIHNlIHJlY29taWVuZGVuLCDCv0N1w6FudG9zIHBhw61zZXMgcXVlZGFuIG1hbCBjbHVzdGVyaXphZG9zPwoKYGBge3J9CmRlbW8kcGFtPU5VTEwKZGF0YUNsdXM9ZGVtb1ssLWMoMTozKV0Kcm93Lm5hbWVzKGRhdGFDbHVzKT1kZW1vJFBhaXMKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgcGFtLGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRikKc2V0LnNlZWQoMTIzKQpyZXMucGFtPXBhbShnLmRpc3QsNyxjbHVzdGVyLm9ubHkgPSBGKQpzaWxQQU09ZGF0YS5mcmFtZShyZXMucGFtJHNpbGluZm8kd2lkdGhzKQpzaWxQQU0kY291bnRyeT1yb3cubmFtZXMoc2lsUEFNKQoKcG9vclBBTT1zaWxQQU1bc2lsUEFNJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JQQU0KYGBgCgoxNi4gSGF6IHVuIG1lcmdlIGNvbiBJREggeSBEZW1vY3JhY3kgSW5kZXgsIHBlcm8gcmVjdXBlcmFuZG8gdG9kb3MgbG9zIHBhaXNlcyBhdW4gY3VhbmRvIG5vIHNlIGVzY3JpYmFuIGlndWFsLiBOb3JtYWxpY2UgbG9zIHZhbG9yZXMgZGVsIElESCBjb24gZWwgbWV0b2RvIHJhbmdvIChkZWwgMSBhbCAxMCkuIMK/SGF5IGRpZmVyZW5jaWFzIGVuIGN1YW50byBhIGxhcyBzdWdlcmVuY2lhIGRlIGxhIGNhbnRpZGFkIGRlIGNsdXN0ZXJzIHBhcmEgY2FkYSB0ZWNuaWNhIGplcmFycXVpY2Egc2kgdXNhIGxvcyBjb21wb25lbnRlcyBkZSBhbWJvcyBjb25jZXB0b3M/CgpgYGB7cn0KaWRoW2lkaCRQYWlzPT0iQm9saXZpYSAoUGx1cmluYXRpb25hbCBTdGF0ZSBvZikiLCdQYWlzJ109ICJCb2xpdmlhIgppZGhbaWRoJFBhaXM9PSJDYWJvIFZlcmRlIiwnUGFpcyddPSAiQ2FwZSBWZXJkZSIKaWRoW2lkaCRQYWlzPT0iQ3plY2hpYSIsJ1BhaXMnXT0gIkN6ZWNoIFJlcHVibGljIgppZGhbaWRoJFBhaXM9PSJDb25nbyAoRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUpIiwnUGFpcyddPSAiRGVtb2NyYXRpYyBSZXB1YmxpYyBvZiB0aGUgQ29uZ28iCmlkaFtpZGgkUGFpcz09IlRpbW9yLUxlc3RlIiwnUGFpcyddPSAgIkVhc3QgVGltb3IiCmlkaFtpZGgkUGFpcz09IkVzd2F0aW5pIChLaW5nZG9tIG9mKSIsJ1BhaXMnXT0gIkVzd2F0aW5pIgppZGhbaWRoJFBhaXM9PSJIb25nIEtvbmcsIENoaW5hIChTQVIpIiwnUGFpcyddPSAiSG9uZyBLb25nIgppZGhbaWRoJFBhaXM9PSJJcmFuIChJc2xhbWljIFJlcHVibGljIG9mKSIsJ1BhaXMnXT0gIklyYW4iCmlkaFtpZGgkUGFpcz09IkPDtHRlIGQnSXZvaXJlIiwnUGFpcyddPSAiSXZvcnkgQ29hc3QiCmlkaFtpZGgkUGFpcz09IkxhbyBQZW9wbGUncyBEZW1vY3JhdGljIFJlcHVibGljIiAsJ1BhaXMnXT0gIkxhb3MiCmlkaFtpZGgkUGFpcz09Ik1vbGRvdmEgKFJlcHVibGljIG9mKSIsJ1BhaXMnXT0gIk1vbGRvdmEiCmlkaFtpZGgkUGFpcz09IlBhbGVzdGluZSwgU3RhdGUgb2YiLCdQYWlzJ109ICJQYWxlc3RpbmUiCmlkaFtpZGgkUGFpcz09IkNvbmdvIiwnUGFpcyddPSAiUmVwdWJsaWMgb2YgdGhlIENvbmdvIgppZGhbaWRoJFBhaXM9PSJSdXNzaWFuIEZlZGVyYXRpb24iLCdQYWlzJ109ICAiUnVzc2lhIgppZGhbaWRoJFBhaXM9PSJLb3JlYSAoUmVwdWJsaWMgb2YpIiwnUGFpcyddPSAiU291dGggS29yZWEiCmlkaFtpZGgkUGFpcz09IlN5cmlhbiBBcmFiIFJlcHVibGljIiwnUGFpcyddPSJTeXJpYSIKaWRoW2lkaCRQYWlzPT0iVGFuemFuaWEgKFVuaXRlZCBSZXB1YmxpYyBvZikiLCdQYWlzJ109ICJUYW56YW5pYSIKaWRoW2lkaCRQYWlzPT0iVMO8cmtpeWUiICwnUGFpcyddPSAiVHVya2V5IgppZGhbaWRoJFBhaXM9PSJWZW5lenVlbGEgKEJvbGl2YXJpYW4gUmVwdWJsaWMgb2YpIiwnUGFpcyddPSJWZW5lenVlbGEiCmlkaFtpZGgkUGFpcz09IlZpZXQgTmFtIiAsJ1BhaXMnXT0iVmlldG5hbSIKaWRoZGVtbz1tZXJnZShpZGgsZGVtbykKCgppZGhkZW1vWyxjKDM6NildPUJCbWlzYzo6bm9ybWFsaXplKGlkaGRlbW9bLGMoMzo2KV0sbWV0aG9kPSdyYW5nZScscmFuZ2U9YygwLDEwKSkKZGF0YUNsdXM9aWRoZGVtb1ssYygzOjYsOToxMyldCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoZGVtbyRQYWlzCgpsaWJyYXJ5KGNsdXN0ZXIpCmcuZGlzdCA9IGRhaXN5KGRhdGFDbHVzLCBtZXRyaWM9Imdvd2VyIikKZnZpel9uYmNsdXN0KGRhdGFDbHVzLCBoY3V0LGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRixoY19mdW5jID0gImFnbmVzIikKYGBgCmBgYHtyfQpmdml6X25iY2x1c3QoZGF0YUNsdXMsIGhjdXQsZGlzcz1nLmRpc3QsbWV0aG9kID0gImdhcF9zdGF0IixrLm1heCA9IDEwLHZlcmJvc2UgPSBGLGhjX2Z1bmMgPSAiZGlhbmEiKQpgYGAKCgoKCjE3LiBQYXJhIGVsIGNhc28gYW50ZXJpb3IsIHNpIFVkIHBpZGUgMyBjbHVzdGVycywgwr9RdcOpIGRpZmVyZW5jaWFzIGVuY3VlbnRyYSBhbCBjbHVzdGVyaXphciBwb3IgYW1iYXMgdMOpY25pY2FzPwpgYGB7cn0KcmVzLmFnbmVzPC0gaGN1dChnLmRpc3QsIGsgPSAzLGhjX2Z1bmM9J2FnbmVzJyxoY19tZXRob2QgPSAid2FyZC5EIikKZnZpel9zaWxob3VldHRlKHJlcy5hZ25lcyxwcmludC5zdW1tYXJ5ID0gRikKCnJlcy5kaWFuYSA8LSBoY3V0KGcuZGlzdCwgayA9IDMsaGNfZnVuYz0nZGlhbmEnKQpmdml6X3NpbGhvdWV0dGUocmVzLmRpYW5hLHByaW50LnN1bW1hcnkgPSBGKQoKYGBgCmBgYHtyfQpzaWxESUFOQT1kYXRhLmZyYW1lKHJlcy5kaWFuYSRzaWxpbmZvJHdpZHRocykKc2lsRElBTkEkY291bnRyeT1yb3cubmFtZXMoc2lsRElBTkEpCnBvb3JESUFOQT1zaWxESUFOQVtzaWxESUFOQSRzaWxfd2lkdGg8MCwnY291bnRyeSddIyU+JXNvcnQoKQpwb29yRElBTkEKCnNpbEFHTkVTPWRhdGEuZnJhbWUocmVzLmFnbmVzJHNpbGluZm8kd2lkdGhzKQpzaWxBR05FUyRjb3VudHJ5PXJvdy5uYW1lcyhzaWxBR05FUykKcG9vckFHTkVTPXNpbEFHTkVTW3NpbEFHTkVTJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JBR05FUwpgYGAKCgoKMTguIFJlaGFnYSBsYXMgcHJlZ3VudGFzIDE2IHkgMTcsIHBlcm8gbm9ybWFsaXphbmRvIHRvZGEgbGEgZGF0YSBjb24gbGEgdMOpY25pY2EgZGUgZXN0YW5kYXJpemFjacOzbi4KCmBgYHtyfQppZGhkZW1vMj1tZXJnZShpZGgsZGVtbykKaWRoZGVtbzJbLGMoMzo2LDk6MTMpXT1CQm1pc2M6Om5vcm1hbGl6ZShpZGhkZW1vMlssYygzOjYsOToxMyldLG1ldGhvZD0nc3RhbmRhcmRpemUnKQpkYXRhQ2x1cz1pZGhkZW1vMlssYygzOjYsOToxMyldCnJvdy5uYW1lcyhkYXRhQ2x1cyk9aWRoZGVtbzIkUGFpcwoKbGlicmFyeShjbHVzdGVyKQpnLmRpc3QgPSBkYWlzeShkYXRhQ2x1cywgbWV0cmljPSJnb3dlciIpCmZ2aXpfbmJjbHVzdChkYXRhQ2x1cywgaGN1dCxkaXNzPWcuZGlzdCxtZXRob2QgPSAiZ2FwX3N0YXQiLGsubWF4ID0gMTAsdmVyYm9zZSA9IEYsaGNfZnVuYyA9ICJhZ25lcyIpCmBgYApgYGB7cn0KZnZpel9uYmNsdXN0KGRhdGFDbHVzLCBoY3V0LGRpc3M9Zy5kaXN0LG1ldGhvZCA9ICJnYXBfc3RhdCIsay5tYXggPSAxMCx2ZXJib3NlID0gRixoY19mdW5jID0gImRpYW5hIikKYGBgCmBgYHtyfQpyZXMuYWduZXM8LSBoY3V0KGcuZGlzdCwgayA9IDMsaGNfZnVuYz0nYWduZXMnLGhjX21ldGhvZCA9ICJ3YXJkLkQiKQpmdml6X3NpbGhvdWV0dGUocmVzLmFnbmVzLHByaW50LnN1bW1hcnkgPSBGKQoKcmVzLmRpYW5hIDwtIGhjdXQoZy5kaXN0LCBrID0gMyxoY19mdW5jPSdkaWFuYScpCmZ2aXpfc2lsaG91ZXR0ZShyZXMuZGlhbmEscHJpbnQuc3VtbWFyeSA9IEYpCmBgYAoKYGBge3J9CnNpbERJQU5BPWRhdGEuZnJhbWUocmVzLmRpYW5hJHNpbGluZm8kd2lkdGhzKQpzaWxESUFOQSRjb3VudHJ5PXJvdy5uYW1lcyhzaWxESUFOQSkKcG9vckRJQU5BPXNpbERJQU5BW3NpbERJQU5BJHNpbF93aWR0aDwwLCdjb3VudHJ5J10jJT4lc29ydCgpCnBvb3JESUFOQQoKc2lsQUdORVM9ZGF0YS5mcmFtZShyZXMuYWduZXMkc2lsaW5mbyR3aWR0aHMpCnNpbEFHTkVTJGNvdW50cnk9cm93Lm5hbWVzKHNpbEFHTkVTKQpwb29yQUdORVM9c2lsQUdORVNbc2lsQUdORVMkc2lsX3dpZHRoPDAsJ2NvdW50cnknXSMlPiVzb3J0KCkKcG9vckFHTkVTCmBgYAoK