Política Pública Pueblos Mágicos

Desde la década de los noventa, el modelo de desarrollo conocido como “Nueva ruralidad“ fomentó en América Latina el implemento de políticas públicas a fin de diversificar las actividades económicas bajo la premisa de combatir la pobreza en contextos rurales (Rosado y González, 2016).

En dicho tenor, el Programa de Pueblos Mágicos de México, es una política pública que desde inicios de la década del 2000 buscaba impulsar el turismo como una herramienta que podría apoyar en el alcance de un desarrollo sostenible para las comunidades rurales del país. Dicho programa, consistía[1] en otorgar apoyo financiero a las cabeceras municipales que contaran con algún tipo de patrimonio biocultural que permitiera justificar su “magia” y así, poder mejorar la oferta e infraestructura (Madrid, 2016).

Tras dieciocho años de ejecución, y un total de 121 localidades declaradas “Pueblo Mágico”, los gobiernos locales e industria turística lo consideran como una iniciativa exitosa que ha permitido el desarrollo económico y bienestar social a partir del número de visitantes, ingresos y empleos generados en estos sitios (Secretaría de Turismo, 2020).

Con miras a un desarrollo sostenible, el éxito del programa es cuestionable si solo se prioriza el beneficio económico y se es permisivo con el replicamiento de impactos socio-ambientales típicos del turismo de masas en los Pueblos Mágicos, tales como la saturación del espacio público, injusta distribución de la riqueza, afectaciones directas al patrimonio, daño al recurso natural, homogenización de los destinos, incremento de los residuos sólidos y segregación social (Davidson, 1998; Mason, 2008)

A partir de ello, la intención del presente proyecto, es analizar cuantitativamente las condiciones socioeconómicas, medioambientales y de infraestructura en seis municipios con nombramiento de Pueblo Mágico a fin de delimitar los cambios generados a partir de la entrada en vigor del programa.

setwd("C:/RSC/S12")
install.packages(c("readxl", "dplyr"))
install.packages('tables')
install.packages('reshape2')
install.packages('readr')
install.packages('ggplot2')
install.packages('data.table')
library(readxl)
library(dplyr)
library(tables)
library(reshape2)
library(data.table)
library(readr)
library(ggplot2)
excel_agricola <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="Act Agricola")
resumen_agricola <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="AgrPM")
VPAgr <- read_excel("agricola_siap_2003_2018_PM.xlsx",sheet="VPAgr")
basecom <- read.csv("BF.csv", header=T)

En primer lugar, se despliega en gráficas de barras la evolución del crecimiento poblacional de los 6 Pueblos Mágicos seleccionados. Cabe recordar que el programa “Pueblos Mágicos” entró en vigor en el año 2001, por lo que se revisó el crecimiento poblacional del año previo (2000), para observar los cambios en dicha variable, a raíz del inicio del programa. En resumen, se eligieron los años 2000, 2005 y 2010 para observar el crecimiento poblacional en Tepoztlán, Huautla de Jimenez, Cuetzalan del Progreso, Zacatlán, Ezequiel Montes y Tequisquiapan.

Pob2000<-c(34055, 33130, 46682, 71985, 30502, 55265)
names(Pob2000)<-tabla1$PUEBLO
barplot(Pob2000, main="Población en el año 2000", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

NA
Pob2005<-c(39463,33810,50352,75078,32941,59627)
names(Pob2005)<-tabla1$PUEBLO
barplot(Pob2005, main="Población en el año 2005", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

Pob2010<-c(45906,34747,54202,78362,35716,64613)
names(Pob2010)<-tabla1$PUEBLO
barplot(Pob2010, main="Población en el año 2010", xlab="Pueblos Mágicos",ylab="Cantidad de Población",col=c("lightblue","blue","yellow","red","green","purple"))

En el caso de Tepoztlán, se observa un crecimiento poblacional sostenido, a partir de la entrada en vigor del programa “Pueblos Mágicos”. De acuerdo con Guzmán y León (2005), esto puede deberse al desarrollo turístico que ha atraído a un gran número de extranjeros, los cuales eligieron establecer en Tepoztlán su lugar de residencia. Por otra parte, si se les compara con el resto de los pueblos elegidos, tanto Huautla de Jiménez como Ezequiel Montes son los dos territorios con menor cantidad de población; sin embargo, éste último registró un mayor incremento poblacional en 2010. Por su parte, Zacatlán es el pueblo mágico con mayor cantidad de población, cuestión que puede estar relacionada con el tamaño de su superficie, la cual equivale a 489.3 km². En este tenor, Tequisquiapan cuenta con una superficie territorial de 343.6 km², lo cual también puede explicar que sea el segundo pueblo con mayor cantidad de población de nuestra muestra. Finalmente, Cuetzalan del Progreso presentó un incremento poblacional del 7.8%, en 2005, con respecto al año 2000 y, para el año 2010, el incremento fue del 14.46% Producto Interno Bruto y Vulnerabilidad La siguiente gráfica muestra la evolución del Producto Interno Bruto de los destinos seleccionados entre 2000 y 2015.

basecom$CVE_MUN<-as.factor(basecom$CVE_MUN2)
tabla3<-basecom[,23:26]
tabla3<-as.data.frame(tabla3)
tabla3
Producto<-rbind(tabla3$PIB00,tabla3$PIB05,tabla3$PIB10,tabla3$PIB15)
Producto
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1327  419 1021 1753 1104 2923
[2,]  972  271  567 1541 1699 2751
[3,] 1393  393  321 1990 2746 2935
[4,] 1649  296  278 1208 3244 1761
dimnames(Producto)=list(c("2000","2005","2010","2015"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
barplot(Producto,beside=T,xlab='Pueblos Magicos', ylab='PIB',main= 'PIB',col=c("lightblue","blue","pink","aquamarine"),ylim=c(0,4000))
legend(x = "topright", legend = c("2000", "2005","2010","2015"), fill = c("lightblue", "blue","pink","aquamarine"), 
       title = "Años")

De la misma forma, la siguiente gráfica de barras hace referencia a los cambios que experimento el Indice de Marginación, durante el mismo periodo.

tabla4<-basecom[,195:198]
tabla4<-as.data.frame(tabla4)
tabla4
IndMar<-rbind(tabla4$IM_00,tabla4$IM_05,tabla4$IM_10,tabla4$IM_15)
IndMar
      [,1] [,2] [,3]  [,4]  [,5]  [,6]
[1,] -1.06 1.25 1.04 -0.20 -0.56 -0.89
[2,] -1.05 1.36 0.96 -0.24 -0.58 -0.82
[3,] -0.78 1.35 1.06 -0.24 -0.70 -0.96
[4,] -0.60 1.71 1.03 -0.16 -0.65 -0.98
dimnames(Producto)=list(c("2000","2005","2010","2015"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
barplot(IndMar,beside=T,xlab='Pueblos Magicos', ylab='PIB',main = 'Indice de marginacion',col=c("lightblue","blue","pink","aquamarine"),ylim=c(0,2))
legend(x = "topright", legend = c("2000", "2005","2010","2015"), fill = c("lightblue", "blue","pink","aquamarine"), 
       title = "Años")

Además, el siguiente gráfico de puntos muestra la relación entre el PIB y el Indice de Marginación en el 2015.

qplot(tabla3$PIB15,tabla4$IM_15,geom = c("point","smooth"))

Accesibilidad

read_xlsx("Accesibilidad.xlsx")


Accesibilidad <- read_xlsx("Accesibilidad.xlsx")


table(Accesibilidad$municipio)

Cuetzalan del Progreso        Ezequiel Montes     Huautla de Jiménez 
                   161                    139                     41 
             Tepoztlán          Tequisquiapan               Zacatlán 
                    72                    102                     97 
barplot(table(Accesibilidad$municipio), main='Accesibilidad carretera en 2010', col = 'green', xlab = 'Pueblos mágicos', ylab = 'Grado de accesibilidad')

Aquí otro ejemplo de la grafica usando ggplot

library(ggplot2)
ggplot(Accesibilidad, aes(x= municipio)) + ggtitle('Accesibilidad carretera 2010 Pueblos Mágicos') + geom_bar(width=0.5, colour="red", fill="red") + labs(y="Grado de Accesibilidad")

Producción de la actividad turística

Los Censos económicos en México, generan indicadores, con información sobre producción y comercialización de bienes y mercancías, así como de la prestación de servicios.En este apartado se analizará la producción bruta total que se refiere al valor de todos los bienes y servicios producidos o comercializados por la unidad económica como resultado del ejercicio de sus actividades. La siguiente tabla muestra la Producción bruta total del Sector Económico de servicios de Alojamiento temporal y preparación de alimentos y bebidas.

basecom$CVE_MUN<-as.factor(basecom$CVE_MUN2)
basecom$CVE_MUN=factor(basecom$CVE_MUN2,levels=levels(basecom$CVE_MUN),labels = c("Tepoztlán","Huautla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"),ordered=F)
tabla1<-basecom[,217:223]
tabla1<-as.data.frame(tabla1)
tabla1

La siguiente gráfica señala el cambio de está Producción Bruta Total durante 2004,2009 y 2014 en los destinos seleccionados.

tabla1$CVE_MUN2<-as.factor(tabla1$CVE_MUN2)
tabla1$CVE_MUN2=factor(tabla1$CVE_MUN2,levels=levels(tabla1$CVE_MUN2),labels = c("Tepoztlán","Huautla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"),ordered=F)
Produccion<-rbind(tabla1$PBAL_2004,tabla1$PBAL_2009,tabla1$PBAL_2014)
Produccion
       [,1]  [,2]  [,3]  [,4]  [,5]   [,6]
[1,]  38834 44022 15083 29923 25384  88714
[2,]  90521 20750 20485 59683 44670 120314
[3,] 125924 23618 28845 87709 96581 159054
dimnames(Produccion)=list(c("2004","2009","2014"),c("Tepoztlan","Huatla de Jimenez","Cuetzalan del Progreso","Zacatlan","Ezequiel Montes","Tequisquiapan"))
 barplot(Produccion,beside=T, ylab='Produccion bruta total',main = 'PBT en Alojamiento temporal',las=2,col=c("lightblue","blue","yellow"),ylim=c(0,150000))
 legend(x = "topright", legend = c("2004", "2009","2014"), fill = c("lightblue", "blue","yellow"), 
       title = "Años")

mean(tabla1$PBAL_2004)
[1] 40326.67
mean(tabla1$PBAL_2009)
[1] 59403.83
mean(tabla1$PBAL_2014)
[1] 86955.17

Como pudimos observar, a excepción del Municipio de Huautla de Jiménez, todos los municipios experimentaron un incremento con respecto al año anterior.La siguiente tabla muestra la tasa de variación positiva de cada uno de ellos. El promedio de estas tasas de variación es 137%, es que el desempeño del sector turístico mejoró ampliamente durante esa década. Aunque, es importante mencionar que su inclusión en el programa de “Pueblos Mágicos,” difiere en años, incluso antes de este periodo.

Pueblo Mágico Tasa de variación (2004-2014)
Tepoztlán 224.2622
Huautla de Jiménez -46.34955
Cuetzalán del Progreso 91.2418
Zacatlán 193.1157
Ezequiel Montes 280.4798
Tequisquiapán 79.2885
(tabla1[1,4]/tabla1[1,2]-1)*100
[1] 224.2622
(tabla1[2,4]/tabla1[2,2]-1)*100 
[1] -46.34955
(tabla1[3,4]/tabla1[3,2]-1)*100
[1] 91.2418
(tabla1[4,4]/tabla1[4,2]-1)*100
[1] 193.1157
(tabla1[5,4]/tabla1[5,2]-1)*100
[1] 280.4798
(tabla1[6,4]/tabla1[6,2]-1)*100
[1] 79.2885

Inversión

La inversion se refiere al incremento en activos, insumos y productos que experimentaron las unidades económicas durante el año de referencia. Lo siguiente gráficos muestran la inversión en el sector de alojamiento y preparación de alimentos y bebidas , en azul y la producción del mismo sector en azul claro en 2004 y 2009. El año 2014 se omitió, dado que no es posible consultar el dato debido a problemas del Sistema Actualizado de información Censal del INEGI.

P_I2004<-rbind(tabla1$INV_2004,tabla1$PBAL_2004)
dimnames(P_I2004)=list(c("Inversión","Producción bruta total"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
P_I2009<-rbind(tabla1$INV_2009,tabla1$PBAL_2009)
dimnames(P_I2009)=list(c("Inversión","Producción bruta total"),c("Tepoztlán","Huatla de Jiménez","Cuetzalán del Progreso","Zacatlán","Ezequiel Montes","Tequisquiapán"))
library(ggplot2)
ggplot() + 
ggtitle('Inversión en Alojamiento temporal y Preparación de alimento')+
geom_bar(data=tabla1,aes(x=CVE_MUN2, y=INV_2004), stat='identity', position='dodge') +
 coord_flip()

barplot(P_I2004,col=c("blue","light blue"),main = "PBT vs Inversión 2004")


ggplot() + 
ggtitle('Inversión en Alojamiento temporal y Preparación de alimento')+
geom_bar(data=tabla1,aes(x=CVE_MUN2, y=INV_2009), stat='identity', position='dodge') +
 coord_flip()

barplot(P_I2009,col=c("blue","light blue"),main = "PBT vs Inversión 2009")

Personal ocupado

Por otro lado, se analizarán la cifras de Personal ocupado, que se refieren a las personas que trabajaron durante el periodo de referencia dependiendo contractualmente o no de la unidad económica, sujetas a su dirección y control.Al respecto, se tratará de identificar si existe una relación lineal simple entre la producción brutal total y el personal ocupado de 2004 en el sector. Como primer paso, se presentán los histogramas de ambas variables.

hist(tabla1$PBAL_2004)

hist(tabla1$PER_2004)

Para estudiar la normalidad, además se realiza la prueba de shapiro por ser una muestra menor. Dado que ambas cifras dadas del p-valor, son mayores a 0.05, podemos decir que no tenemos evidencia de que no se trate de distribuciones normales. Aunque, podemos observar en el histograma de la Producción bruta total existe un sesgo a la derecha, mientras que la de Personal es bastante simetrica.

shapiro.test(tabla1$PBAL_2004)

    Shapiro-Wilk normality test

data:  tabla1$PBAL_2004
W = 0.85611, p-value = 0.1762
shapiro.test(tabla1$PER_2004)

    Shapiro-Wilk normality test

data:  tabla1$PER_2004
W = 0.95213, p-value = 0.7575

Con el objetivo de seguir explorando los comandos de R, impartidos como parte del curso, se asumirá que ambas variables son normales. En ese sentido, se ejecutará el coeficiente de Pearson para identificar si existe una correlación. El coeficiente de 0.74 aparece como indicio de que existe una correlación directa media.

cor(tabla1$PER_2004,tabla1$PBAL_2004, method="pearson")
[1] 0.742123

Por último, se llevará a cabo un ejercicio para tratar de establecer un modelo lineal. Las características del modelo lineal nos indican que el p valor es sólo ligeramente mayor a 0.05 y el ajuste nos dice que el modelo solo explicaría el 40% de la variabilidad del personal ocupado respecto a la Producción Bruta Total.


ejercicio <- lm(tabla1$PBAL_2004 ~ tabla1$PER_2004)
summary(ejercicio)

Call:
lm(formula = tabla1$PBAL_2004 ~ tabla1$PER_2004)

Residuals:
     1      2      3      4      5      6 
 -5470  25260  -8010 -18800 -10347  17366 

Coefficients:
                Estimate Std. Error t value Pr(>|t|)  
(Intercept)      4268.00   18094.56   0.236   0.8251  
tabla1$PER_2004    88.38      39.91   2.214   0.0912 .
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 19330 on 4 degrees of freedom
Multiple R-squared:  0.5507,    Adjusted R-squared:  0.4384 
F-statistic: 4.904 on 1 and 4 DF,  p-value: 0.09118

Así,el siguiente gráfico asocia el modelo planteado anteriormente y se puede identificar que la correlación no es muy precisa, como los parámetros, mencionados arriba, nos indican. A estós, podemos añadir los posibles errores que una muestra tan pequeña puedan suponer para este tipo de modelos.

plot(tabla1$PBAL_2004 ~ tabla1$PER_2004)
abline(lm(tabla1$PBAL_2004~ tabla1$PER_2004))

qplot(tabla1$PER_2004,tabla1$PBAL_2004,geom=c("point","smooth"))

Actividad turística en los Pueblos Mágicos (2017)

En la presente seección, se muestran alunos gráficos que comparan la actividad turística en los 6 Pueblos mágicos seleccionados durante el año 2017. Los gráficos muestran el total de número de cuartos, hoteles, turistas recibidos, e ingresos por actividad turística en dicho año.

datos2<-read.csv("DatosPM.csv", header = T)
datos2

Cuartos<-datos2$NUM_CUAR
Cuartos
[1]  972  130  824 1400  811 1126
PuebloMagico<-datos2$PM
PuebloMagico
[1] "Tepoztlán"              "Huautla de Jiménez"    
[3] "Cuetzalan del Progreso" "Zacatlán"              
[5] "Ezequiel Montes"        "Tequisquiapan"         
TEH<-datos2$TEH
TEH
[1]  89   8  64 152  76  48
Cuartos
[1]  972  130  824 1400  811 1126
names(Cuartos)<-datos2$PM
Cuartos
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
                   972                    130                    824 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
                  1400                    811                   1126 
barplot(Cuartos,
        main="Número de cuartos disponibles",
        xlab="PM",
        ylab="Cuartos")



names(TEH)<-datos2$PM
TEH
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
                    89                      8                     64 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
                   152                     76                     48 
barplot(TEH,
        main="Número de hoteles en los PM",
        xlab="PM",
        ylab="Hoteles disponibles")


turistas<-datos2$NUM_TUR
turistas
[1] 248591  13000 116388 140848 189800 111307
names(turistas)<-datos2$PM
turistas
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
                248591                  13000                 116388 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
                140848                 189800                 111307 
barplot(turistas,
        main="Número de turistas en los PM",
        xlab="PM",
        ylab="Número de turistas")



ingresos<-datos2$I_AT
ingresos
[1] 472.300   0.004 232.700 277.500 341.600 222.600
names(ingresos)<-datos2$PM
ingresos
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
               472.300                  0.004                232.700 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
               277.500                341.600                222.600 
barplot(ingresos,
        main="Ingresos por turismo en los PM (Millones de pesos)",
        xlab="PM",
        ylab="Ingreso")



Agrario<-datos2$P_A
Agrario
[1]  99.7  14.3  69.1 149.0  85.9 202.5
names(Agrario)<-datos2$PM
Agrario
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
                  99.7                   14.3                   69.1 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
                 149.0                   85.9                  202.5 

A partir de los datos mostrados, podemos definir la media generada por cada localidad en los rubros mencionados

mean(datos2$I_AT)
[1] 257.784
mean(datos2$TEH)
[1] 72.83333
mean(datos2$NUM_TUR)
[1] 136655.7
mean(datos2$NUM_CUAR)
[1] 877.1667

Finalmente, el siguiente gráfico muestra que al comparar los ingresos de la producción agraria con los de turismo el mismo año, en 5 de los 6 Pueblos Mágicos, se obtienen mayores inresos por actividad turística. Incluso la media muestra que en general se obtiene más de el doble de ingresos por turismo. Resultado del abandono del campo y la dependencia al turismo de estos sitios.

Agrario<-datos2$P_A
Agrario
[1]  99.7  14.3  69.1 149.0  85.9 202.5
names(Agrario)<-datos2$PM
Agrario
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
                  99.7                   14.3                   69.1 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
                 149.0                   85.9                  202.5 
ingresos<-datos2$I_AT
ingresos
[1] 472.300   0.004 232.700 277.500 341.600 222.600
names(ingresos)<-datos2$PM
ingresos
             Tepoztlán     Huautla de Jiménez Cuetzalan del Progreso 
               472.300                  0.004                232.700 
              Zacatlán        Ezequiel Montes          Tequisquiapan 
               277.500                341.600                222.600 
AyT<-rbind(Agrario,
           ingresos)
AyT
         Tepoztlán Huautla de Jiménez Cuetzalan del Progreso Zacatlán
Agrario       99.7             14.300                   69.1    149.0
ingresos     472.3              0.004                  232.7    277.5
         Ezequiel Montes Tequisquiapan
Agrario             85.9         202.5
ingresos           341.6         222.6
barplot(AyT,beside=T,
        main="Ingresos por producción Agraria y Turismo en PM (Millones de pesos)",
        xlab="PM",
        ylab="MDP",
        col=c("blue","grey"))

legend(x = "topright", legend =c("Ingreso Producción agraria", "Ingreso por Turismo"),
       fill = c("blue","grey"),
       title="Ingreso por Producción agraria y Turismo (2017)")

       

mean(datos2$P_A)
[1] 103.4167
mean(datos2$I_AT)
[1] 257.784

Producción agrícola

A continuación se analiza la información de la producción agrícola en los seis Pueblos Mágicos seleccionados.

Se consideró relevante revisar dicha información, dado que la actividad económica principal en el medio rural mexicano es fundamentalmente agrícola, principalmente en aquellas localidades con alta concentración de población indígena.

Para identificar la importancia de la actividad agrícola en los municipios seleccionados adscritos al Programa de Pueblos Mágicos se observan los datos del periodo 2003-2018 de las siguientes variables:

  1. Superficie sembrada
  2. Valor de la producción agrícola
pivot <- excel_agricola %>% group_by(nommunicipio) %>% summarise(
  sup_total = n(),
  sup_sembrada = mean(sembrada),
  sup_cosechada = mean(cosechada),
  valor_produccion_milespesos= mean(valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)

Histograma superficie sembrada por municipio, 2003-2018

ggplot(data=pivot, aes(x=nommunicipio, y=sup_sembrada)) + 
  geom_bar(stat="identity", position="dodge") +
  xlab("Municipio") + ylab("Hectáreas") +
  ggtitle("Superficie sembrada promedio por municipio 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Histograma Valor de la producción por municipio, 2003-2018

ggplot(data=pivot, aes(x=nommunicipio, y=valor_produccion_milespesos)) + 
  geom_bar(stat="identity", position="dodge") + 
  xlab("Municipio") + ylab("Miles de pesos") +
  ggtitle("Valor de la producción por municipio 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Destaca que de los municipios seleccionados, aquellos con población preponderantemente indígena como son Cuetzalán del Progreso, Puebla y Huautla de Jimenez, Oaxaca destinan las mayores superficies sembradas, no obstante, el mayor valor de la producción agrícola lo ocupa el municipio de Tequisquiapan, Querétaro. Huautla de Jiménez por su parte reporta el menor valor de la producción agrícola de los seis municipios.

En la siguiente gráfica se muestra la evoluación del valor de la producción agrícola para cada uno de los seis municipios. Conviene destacar que Cuetzalan del Progreso y Ezequiel Montes se adhirieron al Programa de Pueblos Mágicos en 2002 y 2005, respectivamente. El resto obtuvo la adscripción posterior al 2010, siendo Huautla de Jiménez el último (2015).

ggplot(VPAgr, aes(x=Anio, y= ValProdAgr, group = Municipio, colour =Municipio )) + 
  geom_line()  + xlab("Año") + ylab("Miles de pesos") +
  geom_point( size=0.5, shape=21, fill="white") + 
  theme_minimal() 

A continuación se presenta el análisis por municipio para identificar los principales cultivos y la evolución de su producción en el periodo 2003-2018.

Huautla de Jiménez

grupo_hj1<- excel_agricola %>% filter(nommunicipio== 'Huautla de Jiménez' & anio==2018) %>% 
  group_by (nomcultivo) %>% 
  summarise ( SupPromSemb = mean (sembrada),
              SupPromCos = mean (cosechada),
              ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_hj2 <- excel_agricola %>% filter(nommunicipio== 'Huautla de Jiménez') %>% 
  group_by (nomcultivo,anio,sembrada) %>% 
  summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)

En el municipio de Huautla de Jimenez se observa la alta concentración de la producción agrícola en dos cultivos proncipalmente: café cereza y maíz grano.

Como se observa en la segunda gráfica, el valor de la producción del café tuvo una caída drástica en el año 2012.

ggplot(data=grupo_hj1, aes(x=nomcultivo, y=ValorProd)) + 
  geom_bar(stat="identity", position="stack") + 
  xlab("Cultivo") + ylab("Miles de pesos") +
  ggtitle("Huautla de Jimenez. Valor de la producción agrícola 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_hj2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) + 
  geom_line()   + xlab("Año") + ylab("Miles de pesos") +
  geom_point( size=0.5, shape=21, fill="white") + 
  theme_minimal() 

Cuetzalan del Progreso

grupo_cuet1<- excel_agricola %>% filter(nommunicipio== 'Cuetzalan del Progreso' & anio==2018) %>% 
  group_by (nomcultivo) %>% 
  summarise ( SupPromSemb = mean (sembrada),
              SupPromCos = mean (cosechada),
              ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_cuet2 <- excel_agricola %>% filter(nommunicipio== 'Cuetzalan del Progreso') %>% 
  group_by (nomcultivo,anio,sembrada) %>% 
  summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio' (override with `.groups` argument)

Cuetzalan del Progreso también concentra una alta dependencia de la producción agrícola en pocos cultivos, principalmente el café cereza. También se muestra la inestabilidad en el valor de su producción del café, aunque con una tendencia creciente a partir de 2016.

ggplot(data=grupo_cuet1, aes(x=nomcultivo, y=ValorProd)) + 
  geom_bar(stat="identity", position="stack") + 
  xlab("Cultivo") + ylab("Miles de pesos") +
  ggtitle("Cuetzalan del Progreso. Valor de la producción agrícola 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_cuet2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) + 
  geom_line()  + xlab("Año") + ylab("Miles de pesos") +
  geom_point( size=0.5, shape=21, fill="white") + 
  theme_minimal() 

Tequisquiapan

grupo_tequis1<- excel_agricola %>% filter(nommunicipio== 'Tequisquiapan' & anio==2018) %>% 
  group_by (nomcultivo) %>% 
  summarise ( SupPromSemb = mean (sembrada),
              SupPromCos = mean (cosechada),
              ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_tequis2 <- excel_agricola %>% filter(nommunicipio== 'Tequisquiapan') %>% 
  group_by (nomcultivo,anio,sembrada) %>% 
  summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)

En contraste con los municipios de Huautla de Jiménez y Cuetzalan del Progreso, tanto en Tequisquiapan como Zacatlán se observa una mayor diversidad de cultivos e incluso en la evolución entre 2003 y 2018 se observa el crecimiento de la participación de cultivos no tradicionales.

ggplot(data=grupo_tequis1, aes(x=nomcultivo, y=ValorProd)) + 
  geom_bar(stat="identity", position="stack") + 
  xlab("Cultivo") + ylab("Miles de pesos") +
  ggtitle("Tequisquiapan. Valor de la producción agrícola 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_tequis2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) + 
  geom_line()  + xlab("Año") + ylab("Miles de pesos") +
  geom_point( size=0.5, shape=21, fill="white") + 
  theme_minimal() 

Zacatlán

grupo_zac1<- excel_agricola %>% filter(nommunicipio== 'Zacatlán' & anio==2018) %>% 
  group_by (nomcultivo) %>% 
  summarise ( SupPromSemb = mean (sembrada),
              SupPromCos = mean (cosechada),
              ValorProd = mean (valorproduccionKP))
`summarise()` ungrouping output (override with `.groups` argument)
grupo_zac2 <- excel_agricola %>% filter(nommunicipio== 'Zacatlán') %>% 
  group_by (nomcultivo,anio,sembrada) %>% 
  summarise(valorproduccionKP)
`summarise()` regrouping output by 'nomcultivo', 'anio', 'sembrada' (override with `.groups` argument)
ggplot(data=grupo_zac1, aes(x=nomcultivo, y=ValorProd)) + 
  geom_bar(stat="identity", position="stack") + 
  xlab("Cultivo") + ylab("Miles de pesos") +
  ggtitle("Zacatlán. Valor de la producción agrícola 2003-2018") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

ggplot(grupo_zac2, aes(x=anio, y=valorproduccionKP, group = nomcultivo, colour =nomcultivo )) + 
  geom_line()  + xlab("Año") + ylab("Miles de pesos") +
  geom_point( size=0.5, shape=21, fill="white") + 
  theme_minimal()

DQotLS0NCnRpdGxlOiAiUHVlYmxvcyBNw6FnaWNvcyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCl9Qb2zDrXRpY2EgUMO6YmxpY2EgUHVlYmxvcyBNw6FnaWNvc18NCg0KRGVzZGUgbGEgZMOpY2FkYSBkZSBsb3Mgbm92ZW50YSwgZWwgbW9kZWxvIGRlIGRlc2Fycm9sbG8gY29ub2NpZG8gY29tbyDigJxOdWV2YSBydXJhbGlkYWTigJwgZm9tZW50w7MgZW4gQW3DqXJpY2EgTGF0aW5hIGVsIGltcGxlbWVudG8gZGUgcG9sw610aWNhcyBww7pibGljYXMgYSBmaW4gZGUgZGl2ZXJzaWZpY2FyIGxhcyBhY3RpdmlkYWRlcyBlY29uw7NtaWNhcyBiYWpvIGxhIHByZW1pc2EgZGUgY29tYmF0aXIgbGEgcG9icmV6YSBlbiBjb250ZXh0b3MgcnVyYWxlcyAoUm9zYWRvIHkgR29uesOhbGV6LCAyMDE2KS4NCg0KRW4gZGljaG8gdGVub3IsIGVsIFByb2dyYW1hIGRlIFB1ZWJsb3MgTcOhZ2ljb3MgZGUgTcOpeGljbywgZXMgdW5hIHBvbMOtdGljYSBww7pibGljYSBxdWUgZGVzZGUgaW5pY2lvcyBkZSBsYSBkw6ljYWRhIGRlbCAyMDAwIGJ1c2NhYmEgaW1wdWxzYXIgZWwgdHVyaXNtbyBjb21vIHVuYSBoZXJyYW1pZW50YSBxdWUgcG9kcsOtYSBhcG95YXIgZW4gZWwgYWxjYW5jZSBkZSB1biBkZXNhcnJvbGxvIHNvc3RlbmlibGUgcGFyYSBsYXMgY29tdW5pZGFkZXMgcnVyYWxlcyBkZWwgcGHDrXMuIERpY2hvIHByb2dyYW1hLCBjb25zaXN0w61hWzFdIGVuIG90b3JnYXIgYXBveW8gZmluYW5jaWVybyBhIGxhcyBjYWJlY2VyYXMgbXVuaWNpcGFsZXMgcXVlIGNvbnRhcmFuIGNvbiBhbGfDum4gdGlwbyBkZSBwYXRyaW1vbmlvIGJpb2N1bHR1cmFsIHF1ZSBwZXJtaXRpZXJhIGp1c3RpZmljYXIgc3Ug4oCcbWFnaWHigJ0geSBhc8OtLCBwb2RlciBtZWpvcmFyIGxhIG9mZXJ0YSBlIGluZnJhZXN0cnVjdHVyYSAoTWFkcmlkLCAyMDE2KS4NCg0KVHJhcyBkaWVjaW9jaG8gYcOxb3MgZGUgZWplY3VjacOzbiwgeSB1biB0b3RhbCBkZSAxMjEgbG9jYWxpZGFkZXMgZGVjbGFyYWRhcyDigJxQdWVibG8gTcOhZ2ljb+KAnSwgbG9zIGdvYmllcm5vcyBsb2NhbGVzIGUgaW5kdXN0cmlhIHR1csOtc3RpY2EgbG8gY29uc2lkZXJhbiBjb21vIHVuYSBpbmljaWF0aXZhIGV4aXRvc2EgcXVlIGhhIHBlcm1pdGlkbyBlbCBkZXNhcnJvbGxvIGVjb27Ds21pY28geSBiaWVuZXN0YXIgc29jaWFsIGEgcGFydGlyIGRlbCBuw7ptZXJvIGRlIHZpc2l0YW50ZXMsIGluZ3Jlc29zIHkgZW1wbGVvcyBnZW5lcmFkb3MgZW4gZXN0b3Mgc2l0aW9zIChTZWNyZXRhcsOtYSBkZSBUdXJpc21vLCAyMDIwKS4gDQoNCkNvbiBtaXJhcyBhIHVuIGRlc2Fycm9sbG8gc29zdGVuaWJsZSwgZWwgw6l4aXRvIGRlbCBwcm9ncmFtYSBlcyBjdWVzdGlvbmFibGUgc2kgc29sbyBzZSBwcmlvcml6YSBlbCBiZW5lZmljaW8gZWNvbsOzbWljbyB5IHNlIGVzIHBlcm1pc2l2byBjb24gZWwgcmVwbGljYW1pZW50byBkZSBpbXBhY3RvcyBzb2Npby1hbWJpZW50YWxlcyB0w61waWNvcyBkZWwgdHVyaXNtbyBkZSBtYXNhcyBlbiBsb3MgUHVlYmxvcyBNw6FnaWNvcywgdGFsZXMgY29tbyBsYSBzYXR1cmFjacOzbiBkZWwgZXNwYWNpbyBww7pibGljbywgaW5qdXN0YSBkaXN0cmlidWNpw7NuIGRlIGxhIHJpcXVlemEsIGFmZWN0YWNpb25lcyBkaXJlY3RhcyBhbCBwYXRyaW1vbmlvLCBkYcOxbyBhbCByZWN1cnNvIG5hdHVyYWwsIGhvbW9nZW5pemFjacOzbiBkZSBsb3MgZGVzdGlub3MsIGluY3JlbWVudG8gZGUgbG9zIHJlc2lkdW9zIHPDs2xpZG9zIHkgc2VncmVnYWNpw7NuIHNvY2lhbCAoRGF2aWRzb24sIDE5OTg7IE1hc29uLCAyMDA4KQ0KDQpBIHBhcnRpciBkZSBlbGxvLCBsYSBpbnRlbmNpw7NuIGRlbCBwcmVzZW50ZSBwcm95ZWN0bywgZXMgYW5hbGl6YXIgY3VhbnRpdGF0aXZhbWVudGUgbGFzIGNvbmRpY2lvbmVzIHNvY2lvZWNvbsOzbWljYXMsIG1lZGlvYW1iaWVudGFsZXMgeSBkZSBpbmZyYWVzdHJ1Y3R1cmEgZW4gc2VpcyBtdW5pY2lwaW9zIGNvbiBub21icmFtaWVudG8gZGUgUHVlYmxvIE3DoWdpY28gYSBmaW4gZGUgZGVsaW1pdGFyIGxvcyBjYW1iaW9zIGdlbmVyYWRvcyBhIHBhcnRpciBkZSBsYSBlbnRyYWRhIGVuIHZpZ29yIGRlbCBwcm9ncmFtYS4NCg0KDQpgYGB7cn0NCnNldHdkKCJDOi9SU0MvUzEyIikNCmluc3RhbGwucGFja2FnZXMoYygicmVhZHhsIiwgImRwbHlyIikpDQppbnN0YWxsLnBhY2thZ2VzKCd0YWJsZXMnKQ0KaW5zdGFsbC5wYWNrYWdlcygncmVzaGFwZTInKQ0KaW5zdGFsbC5wYWNrYWdlcygncmVhZHInKQ0KaW5zdGFsbC5wYWNrYWdlcygnZ2dwbG90MicpDQppbnN0YWxsLnBhY2thZ2VzKCdkYXRhLnRhYmxlJykNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGFibGVzKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KGdncGxvdDIpDQpleGNlbF9hZ3JpY29sYSA8LSByZWFkX2V4Y2VsKCJhZ3JpY29sYV9zaWFwXzIwMDNfMjAxOF9QTS54bHN4IixzaGVldD0iQWN0IEFncmljb2xhIikNCnJlc3VtZW5fYWdyaWNvbGEgPC0gcmVhZF9leGNlbCgiYWdyaWNvbGFfc2lhcF8yMDAzXzIwMThfUE0ueGxzeCIsc2hlZXQ9IkFnclBNIikNClZQQWdyIDwtIHJlYWRfZXhjZWwoImFncmljb2xhX3NpYXBfMjAwM18yMDE4X1BNLnhsc3giLHNoZWV0PSJWUEFnciIpDQpgYGANCg0KYGBge3J9DQpiYXNlY29tIDwtIHJlYWQuY3N2KCJCRi5jc3YiLCBoZWFkZXI9VCkNCg0KYGBgDQoNCkVuIHByaW1lciBsdWdhciwgc2UgZGVzcGxpZWdhIGVuIGdyw6FmaWNhcyBkZSBiYXJyYXMgbGEgZXZvbHVjacOzbiBkZWwgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwgZGUgbG9zIDYgKlB1ZWJsb3MgTcOhZ2ljb3MqIHNlbGVjY2lvbmFkb3MuIENhYmUgcmVjb3JkYXIgcXVlIGVsIHByb2dyYW1hICJQdWVibG9zIE3DoWdpY29zIiBlbnRyw7MgZW4gdmlnb3IgZW4gZWwgYcOxbyAyMDAxLCBwb3IgbG8gcXVlIHNlIHJldmlzw7MgZWwgY3JlY2ltaWVudG8gcG9ibGFjaW9uYWwgZGVsIGHDsW8gcHJldmlvICgyMDAwKSwgcGFyYSBvYnNlcnZhciBsb3MgY2FtYmlvcyBlbiBkaWNoYSB2YXJpYWJsZSwgYSByYcOteiBkZWwgaW5pY2lvIGRlbCBwcm9ncmFtYS4gRW4gcmVzdW1lbiwgc2UgZWxpZ2llcm9uIGxvcyBhw7FvcyAyMDAwLCAyMDA1IHkgMjAxMCBwYXJhIG9ic2VydmFyIGVsIGNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIGVuIFRlcG96dGzDoW4sIEh1YXV0bGEgZGUgSmltZW5leiwgQ3VldHphbGFuIGRlbCBQcm9ncmVzbywgWmFjYXRsw6FuLCBFemVxdWllbCBNb250ZXMgeSBUZXF1aXNxdWlhcGFuLg0KYGBge3J9DQpQb2IyMDAwPC1jKDM0MDU1LCAzMzEzMCwgNDY2ODIsIDcxOTg1LCAzMDUwMiwgNTUyNjUpDQpuYW1lcyhQb2IyMDAwKTwtdGFibGExJFBVRUJMTw0KYmFycGxvdChQb2IyMDAwLCBtYWluPSJQb2JsYWNpw7NuIGVuIGVsIGHDsW8gMjAwMCIsIHhsYWI9IlB1ZWJsb3MgTcOhZ2ljb3MiLHlsYWI9IkNhbnRpZGFkIGRlIFBvYmxhY2nDs24iLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwieWVsbG93IiwicmVkIiwiZ3JlZW4iLCJwdXJwbGUiKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KYGBgDQpgYGB7cn0NClBvYjIwMDU8LWMoMzk0NjMsMzM4MTAsNTAzNTIsNzUwNzgsMzI5NDEsNTk2MjcpDQpuYW1lcyhQb2IyMDA1KTwtdGFibGExJFBVRUJMTw0KYmFycGxvdChQb2IyMDA1LCBtYWluPSJQb2JsYWNpw7NuIGVuIGVsIGHDsW8gMjAwNSIsIHhsYWI9IlB1ZWJsb3MgTcOhZ2ljb3MiLHlsYWI9IkNhbnRpZGFkIGRlIFBvYmxhY2nDs24iLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwieWVsbG93IiwicmVkIiwiZ3JlZW4iLCJwdXJwbGUiKSkNCmBgYA0KYGBge3J9DQpQb2IyMDEwPC1jKDQ1OTA2LDM0NzQ3LDU0MjAyLDc4MzYyLDM1NzE2LDY0NjEzKQ0KbmFtZXMoUG9iMjAxMCk8LXRhYmxhMSRQVUVCTE8NCmJhcnBsb3QoUG9iMjAxMCwgbWFpbj0iUG9ibGFjacOzbiBlbiBlbCBhw7FvIDIwMTAiLCB4bGFiPSJQdWVibG9zIE3DoWdpY29zIix5bGFiPSJDYW50aWRhZCBkZSBQb2JsYWNpw7NuIixjb2w9YygibGlnaHRibHVlIiwiYmx1ZSIsInllbGxvdyIsInJlZCIsImdyZWVuIiwicHVycGxlIikpDQpgYGANCg0KRW4gZWwgY2FzbyBkZSBUZXBvenRsw6FuLCBzZSBvYnNlcnZhIHVuIGNyZWNpbWllbnRvIHBvYmxhY2lvbmFsIHNvc3RlbmlkbywgYSBwYXJ0aXIgZGUgbGEgZW50cmFkYSBlbiB2aWdvciBkZWwgcHJvZ3JhbWEgIlB1ZWJsb3MgTcOhZ2ljb3MiLiBEZSBhY3VlcmRvIGNvbiBHdXptw6FuIHkgTGXDs24gKDIwMDUpLCBlc3RvIHB1ZWRlIGRlYmVyc2UgYWwgZGVzYXJyb2xsbyB0dXLDrXN0aWNvIHF1ZSBoYSBhdHJhw61kbyBhIHVuIGdyYW4gbsO6bWVybyBkZSBleHRyYW5qZXJvcywgbG9zIGN1YWxlcyBlbGlnaWVyb24gZXN0YWJsZWNlciBlbiBUZXBvenRsw6FuIHN1IGx1Z2FyIGRlIHJlc2lkZW5jaWEuIFBvciBvdHJhIHBhcnRlLCBzaSBzZSBsZXMgY29tcGFyYSBjb24gZWwgcmVzdG8gZGUgbG9zIHB1ZWJsb3MgZWxlZ2lkb3MsIHRhbnRvIEh1YXV0bGEgZGUgSmltw6luZXogY29tbyBFemVxdWllbCBNb250ZXMgc29uIGxvcyBkb3MgdGVycml0b3Jpb3MgY29uIG1lbm9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs247IHNpbiBlbWJhcmdvLCDDqXN0ZSDDumx0aW1vIHJlZ2lzdHLDsyB1biBtYXlvciBpbmNyZW1lbnRvIHBvYmxhY2lvbmFsIGVuIDIwMTAuIA0KUG9yIHN1IHBhcnRlLCBaYWNhdGzDoW4gZXMgZWwgcHVlYmxvIG3DoWdpY28gY29uIG1heW9yIGNhbnRpZGFkIGRlIHBvYmxhY2nDs24sIGN1ZXN0acOzbiBxdWUgcHVlZGUgZXN0YXIgcmVsYWNpb25hZGEgY29uIGVsIHRhbWHDsW8gZGUgc3Ugc3VwZXJmaWNpZSwgbGEgY3VhbCBlcXVpdmFsZSBhIDQ4OS4zIGttwrIuIEVuIGVzdGUgdGVub3IsIFRlcXVpc3F1aWFwYW4gY3VlbnRhIGNvbiAgdW5hIHN1cGVyZmljaWUgdGVycml0b3JpYWwgZGUgMzQzLjYga23CsiwgbG8gY3VhbCB0YW1iacOpbiBwdWVkZSBleHBsaWNhciBxdWUgc2VhIGVsIHNlZ3VuZG8gcHVlYmxvIGNvbiBtYXlvciBjYW50aWRhZCBkZSBwb2JsYWNpw7NuIGRlIG51ZXN0cmEgbXVlc3RyYS4gDQpGaW5hbG1lbnRlLCBDdWV0emFsYW4gZGVsIFByb2dyZXNvIHByZXNlbnTDsyB1biBpbmNyZW1lbnRvIHBvYmxhY2lvbmFsIGRlbCA3LjglLCBlbiAyMDA1LCBjb24gcmVzcGVjdG8gYWwgYcOxbyAyMDAwIHksIHBhcmEgZWwgYcOxbyAyMDEwLCBlbCBpbmNyZW1lbnRvIGZ1ZSBkZWwgMTQuNDYlDQpfUHJvZHVjdG8gSW50ZXJubyBCcnV0byB5IFZ1bG5lcmFiaWxpZGFkXyANCkxhIHNpZ3VpZW50ZSBncsOhZmljYSBtdWVzdHJhIGxhIGV2b2x1Y2nDs24gZGVsIFByb2R1Y3RvIEludGVybm8gQnJ1dG8gZGUgbG9zIGRlc3Rpbm9zIHNlbGVjY2lvbmFkb3MgZW50cmUgMjAwMCB5IDIwMTUuIA0KYGBge3J9DQpiYXNlY29tJENWRV9NVU48LWFzLmZhY3RvcihiYXNlY29tJENWRV9NVU4yKQ0KdGFibGEzPC1iYXNlY29tWywyMzoyNl0NCnRhYmxhMzwtYXMuZGF0YS5mcmFtZSh0YWJsYTMpDQp0YWJsYTMNClByb2R1Y3RvPC1yYmluZCh0YWJsYTMkUElCMDAsdGFibGEzJFBJQjA1LHRhYmxhMyRQSUIxMCx0YWJsYTMkUElCMTUpDQpQcm9kdWN0bw0KZGltbmFtZXMoUHJvZHVjdG8pPWxpc3QoYygiMjAwMCIsIjIwMDUiLCIyMDEwIiwiMjAxNSIpLGMoIlRlcG96dGzDg8KhbiIsIkh1YXRsYSBkZSBKaW3Dg8KpbmV6IiwiQ3VldHphbMODwqFuIGRlbCBQcm9ncmVzbyIsIlphY2F0bMODwqFuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDg8KhbiIpKQ0KYmFycGxvdChQcm9kdWN0byxiZXNpZGU9VCx4bGFiPSdQdWVibG9zIE1hZ2ljb3MnLCB5bGFiPSdQSUInLG1haW49ICdQSUInLGNvbD1jKCJsaWdodGJsdWUiLCJibHVlIiwicGluayIsImFxdWFtYXJpbmUiKSx5bGltPWMoMCw0MDAwKSkNCmxlZ2VuZCh4ID0gInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiMjAwMCIsICIyMDA1IiwiMjAxMCIsIjIwMTUiKSwgZmlsbCA9IGMoImxpZ2h0Ymx1ZSIsICJibHVlIiwicGluayIsImFxdWFtYXJpbmUiKSwgDQogICAgICAgdGl0bGUgPSAiQcOxb3MiKQ0KDQpgYGANCkRlIGxhIG1pc21hIGZvcm1hLCBsYSBzaWd1aWVudGUgZ3LDoWZpY2EgZGUgYmFycmFzIGhhY2UgcmVmZXJlbmNpYSBhIGxvcyBjYW1iaW9zIHF1ZSBleHBlcmltZW50byBlbCBJbmRpY2UgZGUgTWFyZ2luYWNpw7NuLCBkdXJhbnRlIGVsIG1pc21vIHBlcmlvZG8uIA0KYGBge3J9DQp0YWJsYTQ8LWJhc2Vjb21bLDE5NToxOThdDQp0YWJsYTQ8LWFzLmRhdGEuZnJhbWUodGFibGE0KQ0KdGFibGE0DQpJbmRNYXI8LXJiaW5kKHRhYmxhNCRJTV8wMCx0YWJsYTQkSU1fMDUsdGFibGE0JElNXzEwLHRhYmxhNCRJTV8xNSkNCkluZE1hcg0KZGltbmFtZXMoUHJvZHVjdG8pPWxpc3QoYygiMjAwMCIsIjIwMDUiLCIyMDEwIiwiMjAxNSIpLGMoIlRlcG96dGzDg8KhbiIsIkh1YXRsYSBkZSBKaW3Dg8KpbmV6IiwiQ3VldHphbMODwqFuIGRlbCBQcm9ncmVzbyIsIlphY2F0bMODwqFuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDg8KhbiIpKQ0KYmFycGxvdChJbmRNYXIsYmVzaWRlPVQseGxhYj0nUHVlYmxvcyBNYWdpY29zJywgeWxhYj0nUElCJyxtYWluID0gJ0luZGljZSBkZSBtYXJnaW5hY2lvbicsY29sPWMoImxpZ2h0Ymx1ZSIsImJsdWUiLCJwaW5rIiwiYXF1YW1hcmluZSIpLHlsaW09YygwLDIpKQ0KbGVnZW5kKHggPSAidG9wcmlnaHQiLCBsZWdlbmQgPSBjKCIyMDAwIiwgIjIwMDUiLCIyMDEwIiwiMjAxNSIpLCBmaWxsID0gYygibGlnaHRibHVlIiwgImJsdWUiLCJwaW5rIiwiYXF1YW1hcmluZSIpLCANCiAgICAgICB0aXRsZSA9ICJBw7FvcyIpDQoNCmBgYA0KDQpBZGVtw6FzLCBlbCBzaWd1aWVudGUgZ3LDoWZpY28gZGUgcHVudG9zIG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGVsIFBJQiB5IGVsIEluZGljZSBkZSBNYXJnaW5hY2nDs24gZW4gZWwgMjAxNS4gDQpgYGB7cn0NCnFwbG90KHRhYmxhMyRQSUIxNSx0YWJsYTQkSU1fMTUsZ2VvbSA9IGMoInBvaW50Iiwic21vb3RoIikpDQpgYGANCg0KDQoNCl9BY2Nlc2liaWxpZGFkXw0KYGBge3J9DQpyZWFkX3hsc3goIkFjY2VzaWJpbGlkYWQueGxzeCIpDQoNCg0KQWNjZXNpYmlsaWRhZCA8LSByZWFkX3hsc3goIkFjY2VzaWJpbGlkYWQueGxzeCIpDQoNCg0KdGFibGUoQWNjZXNpYmlsaWRhZCRtdW5pY2lwaW8pDQpiYXJwbG90KHRhYmxlKEFjY2VzaWJpbGlkYWQkbXVuaWNpcGlvKSwgbWFpbj0nQWNjZXNpYmlsaWRhZCBjYXJyZXRlcmEgZW4gMjAxMCcsIGNvbCA9ICdncmVlbicsIHhsYWIgPSAnUHVlYmxvcyBtw6FnaWNvcycsIHlsYWIgPSAnR3JhZG8gZGUgYWNjZXNpYmlsaWRhZCcpDQoNCmBgYA0KQXF1w60gb3RybyBlamVtcGxvIGRlIGxhIGdyYWZpY2EgdXNhbmRvIGdncGxvdA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoQWNjZXNpYmlsaWRhZCwgYWVzKHg9IG11bmljaXBpbykpICsgZ2d0aXRsZSgnQWNjZXNpYmlsaWRhZCBjYXJyZXRlcmEgMjAxMCBQdWVibG9zIE3DoWdpY29zJykgKyBnZW9tX2Jhcih3aWR0aD0wLjUsIGNvbG91cj0icmVkIiwgZmlsbD0icmVkIikgKyBsYWJzKHk9IkdyYWRvIGRlIEFjY2VzaWJpbGlkYWQiKQ0KYGBgDQoNCl9Qcm9kdWNjacOzbiBkZSBsYSBhY3RpdmlkYWQgdHVyw61zdGljYV8NCg0KTG9zIENlbnNvcyBlY29uw7NtaWNvcyBlbiBNw6l4aWNvLCBnZW5lcmFuIGluZGljYWRvcmVzLCBjb24gaW5mb3JtYWNpw7NuIHNvYnJlIHByb2R1Y2Npw7NuIHkgY29tZXJjaWFsaXphY2nDs24gZGUgYmllbmVzIHkgbWVyY2FuY8OtYXMsIGFzw60gY29tbyBkZSBsYSBwcmVzdGFjacOzbiBkZSBzZXJ2aWNpb3MuRW4gZXN0ZSBhcGFydGFkbyBzZSBhbmFsaXphcsOhIGxhIHByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIHF1ZSBzZSByZWZpZXJlIGFsIHZhbG9yIGRlIHRvZG9zIGxvcyBiaWVuZXMgeSBzZXJ2aWNpb3MgcHJvZHVjaWRvcyBvIGNvbWVyY2lhbGl6YWRvcyBwb3IgbGEgdW5pZGFkIGVjb27Ds21pY2EgY29tbyByZXN1bHRhZG8gZGVsIGVqZXJjaWNpbyBkZSBzdXMgYWN0aXZpZGFkZXMuIExhIHNpZ3VpZW50ZSB0YWJsYSBtdWVzdHJhIGxhIFByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIGRlbCBTZWN0b3IgRWNvbsOzbWljbyBkZSBzZXJ2aWNpb3MgZGUgQWxvamFtaWVudG8gdGVtcG9yYWwgeSBwcmVwYXJhY2nDs24gZGUgYWxpbWVudG9zIHkgYmViaWRhcy4NCg0KYGBge3J9DQpiYXNlY29tJENWRV9NVU48LWFzLmZhY3RvcihiYXNlY29tJENWRV9NVU4yKQ0KYmFzZWNvbSRDVkVfTVVOPWZhY3RvcihiYXNlY29tJENWRV9NVU4yLGxldmVscz1sZXZlbHMoYmFzZWNvbSRDVkVfTVVOKSxsYWJlbHMgPSBjKCJUZXBvenRsw6FuIiwiSHVhdXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSxvcmRlcmVkPUYpDQp0YWJsYTE8LWJhc2Vjb21bLDIxNzoyMjNdDQp0YWJsYTE8LWFzLmRhdGEuZnJhbWUodGFibGExKQ0KdGFibGExDQpgYGANCkxhIHNpZ3VpZW50ZSBncsOhZmljYSBzZcOxYWxhIGVsIGNhbWJpbyBkZSBlc3TDoSBQcm9kdWNjacOzbiBCcnV0YSBUb3RhbCAgZHVyYW50ZSAyMDA0LDIwMDkgeSAyMDE0IGVuIGxvcyBkZXN0aW5vcyBzZWxlY2Npb25hZG9zLg0KDQpgYGB7cn0NCnRhYmxhMSRDVkVfTVVOMjwtYXMuZmFjdG9yKHRhYmxhMSRDVkVfTVVOMikNCnRhYmxhMSRDVkVfTVVOMj1mYWN0b3IodGFibGExJENWRV9NVU4yLGxldmVscz1sZXZlbHModGFibGExJENWRV9NVU4yKSxsYWJlbHMgPSBjKCJUZXBvenRsw6FuIiwiSHVhdXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSxvcmRlcmVkPUYpDQpQcm9kdWNjaW9uPC1yYmluZCh0YWJsYTEkUEJBTF8yMDA0LHRhYmxhMSRQQkFMXzIwMDksdGFibGExJFBCQUxfMjAxNCkNClByb2R1Y2Npb24NCmRpbW5hbWVzKFByb2R1Y2Npb24pPWxpc3QoYygiMjAwNCIsIjIwMDkiLCIyMDE0IiksYygiVGVwb3p0bGFuIiwiSHVhdGxhIGRlIEppbWVuZXoiLCJDdWV0emFsYW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsYW4iLCJFemVxdWllbCBNb250ZXMiLCJUZXF1aXNxdWlhcGFuIikpDQogYmFycGxvdChQcm9kdWNjaW9uLGJlc2lkZT1ULCB5bGFiPSdQcm9kdWNjaW9uIGJydXRhIHRvdGFsJyxtYWluID0gJ1BCVCBlbiBBbG9qYW1pZW50byB0ZW1wb3JhbCcsbGFzPTIsY29sPWMoImxpZ2h0Ymx1ZSIsImJsdWUiLCJ5ZWxsb3ciKSx5bGltPWMoMCwxNTAwMDApKQ0KIGxlZ2VuZCh4ID0gInRvcHJpZ2h0IiwgbGVnZW5kID0gYygiMjAwNCIsICIyMDA5IiwiMjAxNCIpLCBmaWxsID0gYygibGlnaHRibHVlIiwgImJsdWUiLCJ5ZWxsb3ciKSwgDQogICAgICAgdGl0bGUgPSAiQcOxb3MiKQ0KYGBgDQpgYGB7cn0NCm1lYW4odGFibGExJFBCQUxfMjAwNCkNCm1lYW4odGFibGExJFBCQUxfMjAwOSkNCm1lYW4odGFibGExJFBCQUxfMjAxNCkNCmBgYA0KDQoNCkNvbW8gcHVkaW1vcyBvYnNlcnZhciwgYSBleGNlcGNpw7NuIGRlbCBNdW5pY2lwaW8gZGUgSHVhdXRsYSBkZSBKaW3DqW5leiwgdG9kb3MgbG9zIG11bmljaXBpb3MgZXhwZXJpbWVudGFyb24gdW4gaW5jcmVtZW50byBjb24gcmVzcGVjdG8gYWwgYcOxbyBhbnRlcmlvci5MYSBzaWd1aWVudGUgdGFibGEgbXVlc3RyYSBsYSB0YXNhIGRlIHZhcmlhY2nDs24gcG9zaXRpdmEgZGUgY2FkYSB1bm8gZGUgZWxsb3MuIEVsIHByb21lZGlvIGRlIGVzdGFzIHRhc2FzIGRlIHZhcmlhY2nDs24gZXMgMTM3JSwgZXMgcXVlIGVsIGRlc2VtcGXDsW8gZGVsIHNlY3RvciB0dXLDrXN0aWNvIG1lam9yw7MgYW1wbGlhbWVudGUgZHVyYW50ZSBlc2EgZMOpY2FkYS4gQXVucXVlLCBlcyBpbXBvcnRhbnRlIG1lbmNpb25hciBxdWUgc3UgaW5jbHVzacOzbiBlbiBlbCBwcm9ncmFtYSBkZSAiUHVlYmxvcyBNw6FnaWNvcywiIGRpZmllcmUgZW4gYcOxb3MsIGluY2x1c28gYW50ZXMgZGUgZXN0ZSBwZXJpb2RvLiANCg0KDQoNCnwgIF9fUHVlYmxvIE3DoWdpY29fXyAgICAgIHwgICAgIF9fVGFzYSBkZSB2YXJpYWNpw7NuICgyMDA0LTIwMTQpX18gICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBUZXBvenRsw6FuICAgICAgICAgICAgICB8IDIyNC4yNjIyDQp8IEh1YXV0bGEgZGUgSmltw6luZXogICAgICAgICAgICAgIHwgLTQ2LjM0OTU1IHwNCnwgQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28gIHwgOTEuMjQxOCB8DQp8IFphY2F0bMOhbiAgfDE5My4xMTU3IHwNCnxFemVxdWllbCBNb250ZXMgfCAyODAuNDc5OHwgICANCnwgVGVxdWlzcXVpYXDDoW4gIHw3OS4yODg1IHwNCg0KYGBge3J9DQoodGFibGExWzEsNF0vdGFibGExWzEsMl0tMSkqMTAwDQoodGFibGExWzIsNF0vdGFibGExWzIsMl0tMSkqMTAwIA0KKHRhYmxhMVszLDRdL3RhYmxhMVszLDJdLTEpKjEwMA0KKHRhYmxhMVs0LDRdL3RhYmxhMVs0LDJdLTEpKjEwMA0KKHRhYmxhMVs1LDRdL3RhYmxhMVs1LDJdLTEpKjEwMA0KKHRhYmxhMVs2LDRdL3RhYmxhMVs2LDJdLTEpKjEwMA0KDQpgYGANCl9JbnZlcnNpw7NuXw0KDQogTGEgaW52ZXJzaW9uIHNlIHJlZmllcmUgYWwgaW5jcmVtZW50byBlbiBhY3Rpdm9zLCBpbnN1bW9zIHkgcHJvZHVjdG9zIHF1ZSBleHBlcmltZW50YXJvbiBsYXMgdW5pZGFkZXMgZWNvbsOzbWljYXMgZHVyYW50ZSBlbCBhw7FvIGRlIHJlZmVyZW5jaWEuDQpMbyBzaWd1aWVudGUgZ3LDoWZpY29zIG11ZXN0cmFuIGxhIGludmVyc2nDs24gZW4gZWwgc2VjdG9yIGRlIGFsb2phbWllbnRvIHkgcHJlcGFyYWNpw7NuIGRlIGFsaW1lbnRvcyB5IGJlYmlkYXMgLCBlbiBhenVsIHkgbGEgcHJvZHVjY2nDs24gZGVsIG1pc21vIHNlY3RvciBlbiBhenVsIGNsYXJvIGVuIDIwMDQgeSAyMDA5LiBFbCBhw7FvIDIwMTQgc2Ugb21pdGnDsywgZGFkbyBxdWUgbm8gZXMgcG9zaWJsZSBjb25zdWx0YXIgZWwgZGF0byBkZWJpZG8gYSBwcm9ibGVtYXMgZGVsIFNpc3RlbWEgQWN0dWFsaXphZG8gZGUgaW5mb3JtYWNpw7NuIENlbnNhbCBkZWwgSU5FR0kuIA0KIA0KYGBge3J9DQpQX0kyMDA0PC1yYmluZCh0YWJsYTEkSU5WXzIwMDQsdGFibGExJFBCQUxfMjAwNCkNCmRpbW5hbWVzKFBfSTIwMDQpPWxpc3QoYygiSW52ZXJzacOzbiIsIlByb2R1Y2Npw7NuIGJydXRhIHRvdGFsIiksYygiVGVwb3p0bMOhbiIsIkh1YXRsYSBkZSBKaW3DqW5leiIsIkN1ZXR6YWzDoW4gZGVsIFByb2dyZXNvIiwiWmFjYXRsw6FuIiwiRXplcXVpZWwgTW9udGVzIiwiVGVxdWlzcXVpYXDDoW4iKSkNClBfSTIwMDk8LXJiaW5kKHRhYmxhMSRJTlZfMjAwOSx0YWJsYTEkUEJBTF8yMDA5KQ0KZGltbmFtZXMoUF9JMjAwOSk9bGlzdChjKCJJbnZlcnNpw7NuIiwiUHJvZHVjY2nDs24gYnJ1dGEgdG90YWwiKSxjKCJUZXBvenRsw6FuIiwiSHVhdGxhIGRlIEppbcOpbmV6IiwiQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28iLCJaYWNhdGzDoW4iLCJFemVxdWllbCBNb250ZXMiLCJUZXF1aXNxdWlhcMOhbiIpKQ0KDQpgYGANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KCkgKyANCmdndGl0bGUoJ0ludmVyc2nDs24gZW4gQWxvamFtaWVudG8gdGVtcG9yYWwgeSBQcmVwYXJhY2nDs24gZGUgYWxpbWVudG8nKSsNCmdlb21fYmFyKGRhdGE9dGFibGExLGFlcyh4PUNWRV9NVU4yLCB5PUlOVl8yMDA0KSwgc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nZG9kZ2UnKSArDQogY29vcmRfZmxpcCgpDQpiYXJwbG90KFBfSTIwMDQsY29sPWMoImJsdWUiLCJsaWdodCBibHVlIiksbWFpbiA9ICJQQlQgdnMgSW52ZXJzacOzbiAyMDA0IikNCg0KZ2dwbG90KCkgKyANCmdndGl0bGUoJ0ludmVyc2nDs24gZW4gQWxvamFtaWVudG8gdGVtcG9yYWwgeSBQcmVwYXJhY2nDs24gZGUgYWxpbWVudG8nKSsNCmdlb21fYmFyKGRhdGE9dGFibGExLGFlcyh4PUNWRV9NVU4yLCB5PUlOVl8yMDA5KSwgc3RhdD0naWRlbnRpdHknLCBwb3NpdGlvbj0nZG9kZ2UnKSArDQogY29vcmRfZmxpcCgpDQpiYXJwbG90KFBfSTIwMDksY29sPWMoImJsdWUiLCJsaWdodCBibHVlIiksbWFpbiA9ICJQQlQgdnMgSW52ZXJzacOzbiAyMDA5IikNCg0KYGBgDQpfUGVyc29uYWwgb2N1cGFkb18NCg0KUG9yIG90cm8gbGFkbywgc2UgYW5hbGl6YXLDoW4gbGEgY2lmcmFzIGRlIFBlcnNvbmFsIG9jdXBhZG8sIHF1ZSBzZSByZWZpZXJlbiBhIGxhcyBwZXJzb25hcyBxdWUgdHJhYmFqYXJvbiBkdXJhbnRlIGVsIHBlcmlvZG8gZGUgcmVmZXJlbmNpYSBkZXBlbmRpZW5kbyBjb250cmFjdHVhbG1lbnRlIG8gbm8gZGUgbGEgdW5pZGFkIGVjb27Ds21pY2EsIHN1amV0YXMgYSBzdSBkaXJlY2Npw7NuIHkgY29udHJvbC5BbCByZXNwZWN0bywgc2UgdHJhdGFyw6EgZGUgaWRlbnRpZmljYXIgc2kgZXhpc3RlIHVuYSByZWxhY2nDs24gbGluZWFsIHNpbXBsZSBlbnRyZSBsYSBwcm9kdWNjacOzbiBicnV0YWwgdG90YWwgeSBlbCBwZXJzb25hbCBvY3VwYWRvIGRlIDIwMDQgZW4gZWwgc2VjdG9yLiBDb21vIHByaW1lciBwYXNvLCBzZSBwcmVzZW50w6FuIGxvcyBoaXN0b2dyYW1hcyBkZSBhbWJhcyB2YXJpYWJsZXMuIA0KYGBge3J9DQpoaXN0KHRhYmxhMSRQQkFMXzIwMDQpDQpoaXN0KHRhYmxhMSRQRVJfMjAwNCkNCg0KYGBgDQpQYXJhIGVzdHVkaWFyIGxhIG5vcm1hbGlkYWQsIGFkZW3DoXMgc2UgcmVhbGl6YSBsYSBwcnVlYmEgZGUgc2hhcGlybyBwb3Igc2VyIHVuYSBtdWVzdHJhIG1lbm9yLiBEYWRvIHF1ZSBhbWJhcyBjaWZyYXMgZGFkYXMgZGVsIHAtdmFsb3IsIHNvbiBtYXlvcmVzIGEgMC4wNSwgcG9kZW1vcyBkZWNpciBxdWUgbm8gdGVuZW1vcyBldmlkZW5jaWEgZGUgcXVlIG5vIHNlIHRyYXRlIGRlIGRpc3RyaWJ1Y2lvbmVzIG5vcm1hbGVzLiBBdW5xdWUsIHBvZGVtb3Mgb2JzZXJ2YXIgZW4gZWwgaGlzdG9ncmFtYSBkZSBsYSBQcm9kdWNjacOzbiBicnV0YSB0b3RhbCAgZXhpc3RlIHVuIHNlc2dvIGEgbGEgZGVyZWNoYSwgbWllbnRyYXMgcXVlIGxhIGRlIFBlcnNvbmFsIGVzIGJhc3RhbnRlIHNpbWV0cmljYS4gIA0KYGBge3J9DQpzaGFwaXJvLnRlc3QodGFibGExJFBCQUxfMjAwNCkNCnNoYXBpcm8udGVzdCh0YWJsYTEkUEVSXzIwMDQpDQpgYGANCkNvbiBlbCBvYmpldGl2byBkZSBzZWd1aXIgZXhwbG9yYW5kbyBsb3MgY29tYW5kb3MgZGUgUiwgaW1wYXJ0aWRvcyBjb21vIHBhcnRlIGRlbCBjdXJzbywgc2UgYXN1bWlyw6EgcXVlIGFtYmFzIHZhcmlhYmxlcyBzb24gbm9ybWFsZXMuIEVuIGVzZSBzZW50aWRvLCBzZSBlamVjdXRhcsOhIGVsIGNvZWZpY2llbnRlIGRlIFBlYXJzb24gcGFyYSBpZGVudGlmaWNhciBzaSBleGlzdGUgdW5hIGNvcnJlbGFjacOzbi4gRWwgY29lZmljaWVudGUgZGUgMC43NCBhcGFyZWNlIGNvbW8gaW5kaWNpbyBkZSBxdWUgZXhpc3RlIHVuYSBjb3JyZWxhY2nDs24gZGlyZWN0YSBtZWRpYS4gIA0KYGBge3J9DQpjb3IodGFibGExJFBFUl8yMDA0LHRhYmxhMSRQQkFMXzIwMDQsIG1ldGhvZD0icGVhcnNvbiIpDQoNCmBgYA0KDQpQb3Igw7psdGltbywgc2UgbGxldmFyw6EgYSBjYWJvIHVuIGVqZXJjaWNpbyBwYXJhIHRyYXRhciBkZSBlc3RhYmxlY2VyIHVuIG1vZGVsbyBsaW5lYWwuIExhcyBjYXJhY3RlcsOtc3RpY2FzIGRlbCBtb2RlbG8gbGluZWFsIG5vcyBpbmRpY2FuIHF1ZSBlbCBwIHZhbG9yIGVzIHPDs2xvIGxpZ2VyYW1lbnRlIG1heW9yIGEgMC4wNSB5IGVsIGFqdXN0ZSBub3MgZGljZSBxdWUgZWwgbW9kZWxvIHNvbG8gZXhwbGljYXLDrWEgZWwgNDAlIGRlIGxhIHZhcmlhYmlsaWRhZCBkZWwgcGVyc29uYWwgb2N1cGFkbyByZXNwZWN0byBhIGxhIFByb2R1Y2Npw7NuIEJydXRhIFRvdGFsLiANCg0KYGBge3J9DQoNCmVqZXJjaWNpbyA8LSBsbSh0YWJsYTEkUEJBTF8yMDA0IH4gdGFibGExJFBFUl8yMDA0KQ0Kc3VtbWFyeShlamVyY2ljaW8pDQpgYGANCg0KDQoNCkFzw60sZWwgc2lndWllbnRlIGdyw6FmaWNvIGFzb2NpYSBlbCBtb2RlbG8gcGxhbnRlYWRvIGFudGVyaW9ybWVudGUgeSBzZSBwdWVkZSBpZGVudGlmaWNhciBxdWUgbGEgY29ycmVsYWNpw7NuIG5vIGVzIG11eSBwcmVjaXNhLCBjb21vIGxvcyBwYXLDoW1ldHJvcywgbWVuY2lvbmFkb3MgYXJyaWJhLCBub3MgaW5kaWNhbi4gQSBlc3TDs3MsIHBvZGVtb3MgYcOxYWRpciBsb3MgcG9zaWJsZXMgZXJyb3JlcyBxdWUgdW5hIG11ZXN0cmEgdGFuIHBlcXVlw7FhIHB1ZWRhbiBzdXBvbmVyIHBhcmEgZXN0ZSB0aXBvIGRlIG1vZGVsb3MuIA0KYGBge3J9DQpwbG90KHRhYmxhMSRQQkFMXzIwMDQgfiB0YWJsYTEkUEVSXzIwMDQpDQphYmxpbmUobG0odGFibGExJFBCQUxfMjAwNH4gdGFibGExJFBFUl8yMDA0KSkNCnFwbG90KHRhYmxhMSRQRVJfMjAwNCx0YWJsYTEkUEJBTF8yMDA0LGdlb209YygicG9pbnQiLCJzbW9vdGgiKSkNCg0KYGBgDQpfQWN0aXZpZGFkIHR1csOtc3RpY2EgZW4gbG9zIFB1ZWJsb3MgTcOhZ2ljb3MgKDIwMTcpXw0KDQpFbiBsYSAgcHJlc2VudGUgc2VlY2Npw7NuLCBzZSBtdWVzdHJhbiBhbHVub3MgZ3LDoWZpY29zIHF1ZSBjb21wYXJhbiBsYSBhY3RpdmlkYWQgdHVyw61zdGljYSBlbiBsb3MgNiBQdWVibG9zIG3DoWdpY29zIHNlbGVjY2lvbmFkb3MgZHVyYW50ZSBlbCBhw7FvIDIwMTcuIExvcyBncsOhZmljb3MgbXVlc3RyYW4gZWwgdG90YWwgZGUgbsO6bWVybyBkZSBjdWFydG9zLCBob3RlbGVzLCB0dXJpc3RhcyByZWNpYmlkb3MsIGUgaW5ncmVzb3MgcG9yIGFjdGl2aWRhZCB0dXLDrXN0aWNhIGVuIGRpY2hvIGHDsW8uDQoNCmBgYHtyfQ0KZGF0b3MyPC1yZWFkLmNzdigiRGF0b3NQTS5jc3YiLCBoZWFkZXIgPSBUKQ0KZGF0b3MyDQoNCkN1YXJ0b3M8LWRhdG9zMiROVU1fQ1VBUg0KQ3VhcnRvcw0KDQpQdWVibG9NYWdpY288LWRhdG9zMiRQTQ0KUHVlYmxvTWFnaWNvDQoNClRFSDwtZGF0b3MyJFRFSA0KVEVIDQoNCkN1YXJ0b3MNCm5hbWVzKEN1YXJ0b3MpPC1kYXRvczIkUE0NCkN1YXJ0b3MNCg0KDQpiYXJwbG90KEN1YXJ0b3MsDQogICAgICAgIG1haW49Ik7Dum1lcm8gZGUgY3VhcnRvcyBkaXNwb25pYmxlcyIsDQogICAgICAgIHhsYWI9IlBNIiwNCiAgICAgICAgeWxhYj0iQ3VhcnRvcyIpDQoNCg0KbmFtZXMoVEVIKTwtZGF0b3MyJFBNDQpURUgNCg0KYmFycGxvdChURUgsDQogICAgICAgIG1haW49Ik7Dum1lcm8gZGUgaG90ZWxlcyBlbiBsb3MgUE0iLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9IkhvdGVsZXMgZGlzcG9uaWJsZXMiKQ0KDQp0dXJpc3RhczwtZGF0b3MyJE5VTV9UVVINCnR1cmlzdGFzDQoNCm5hbWVzKHR1cmlzdGFzKTwtZGF0b3MyJFBNDQp0dXJpc3Rhcw0KDQpiYXJwbG90KHR1cmlzdGFzLA0KICAgICAgICBtYWluPSJOw7ptZXJvIGRlIHR1cmlzdGFzIGVuIGxvcyBQTSIsDQogICAgICAgIHhsYWI9IlBNIiwNCiAgICAgICAgeWxhYj0iTsO6bWVybyBkZSB0dXJpc3RhcyIpDQoNCg0KaW5ncmVzb3M8LWRhdG9zMiRJX0FUDQppbmdyZXNvcw0KDQpuYW1lcyhpbmdyZXNvcyk8LWRhdG9zMiRQTQ0KaW5ncmVzb3MNCg0KYmFycGxvdChpbmdyZXNvcywNCiAgICAgICAgbWFpbj0iSW5ncmVzb3MgcG9yIHR1cmlzbW8gZW4gbG9zIFBNIChNaWxsb25lcyBkZSBwZXNvcykiLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9IkluZ3Jlc28iKQ0KDQoNCkFncmFyaW88LWRhdG9zMiRQX0ENCkFncmFyaW8NCg0KbmFtZXMoQWdyYXJpbyk8LWRhdG9zMiRQTQ0KQWdyYXJpbw0KYGBgDQpBIHBhcnRpciBkZSBsb3MgZGF0b3MgbW9zdHJhZG9zLCBwb2RlbW9zIGRlZmluaXIgbGEgbWVkaWEgZ2VuZXJhZGEgcG9yIGNhZGEgbG9jYWxpZGFkIGVuIGxvcyBydWJyb3MgbWVuY2lvbmFkb3MNCg0KYGBge3J9DQptZWFuKGRhdG9zMiRJX0FUKQ0KbWVhbihkYXRvczIkVEVIKQ0KbWVhbihkYXRvczIkTlVNX1RVUikNCm1lYW4oZGF0b3MyJE5VTV9DVUFSKQ0KYGBgDQoNCkZpbmFsbWVudGUsIGVsIHNpZ3VpZW50ZSBncsOhZmljbyBtdWVzdHJhIHF1ZSBhbCBjb21wYXJhciBsb3MgaW5ncmVzb3MgZGUgbGEgcHJvZHVjY2nDs24gYWdyYXJpYSBjb24gbG9zIGRlIHR1cmlzbW8gZWwgbWlzbW8gYcOxbywgZW4gNSBkZSBsb3MgNiBQdWVibG9zIE3DoWdpY29zLCBzZSBvYnRpZW5lbiBtYXlvcmVzIGlucmVzb3MgcG9yIGFjdGl2aWRhZCB0dXLDrXN0aWNhLiBJbmNsdXNvIGxhIG1lZGlhIG11ZXN0cmEgcXVlIGVuIGdlbmVyYWwgc2Ugb2J0aWVuZSBtw6FzIGRlIGVsIGRvYmxlIGRlIGluZ3Jlc29zIHBvciB0dXJpc21vLiBSZXN1bHRhZG8gZGVsIGFiYW5kb25vIGRlbCBjYW1wbyB5IGxhIGRlcGVuZGVuY2lhIGFsIHR1cmlzbW8gZGUgZXN0b3Mgc2l0aW9zLg0KDQpgYGB7cn0NCkFncmFyaW88LWRhdG9zMiRQX0ENCkFncmFyaW8NCg0KbmFtZXMoQWdyYXJpbyk8LWRhdG9zMiRQTQ0KQWdyYXJpbw0KDQppbmdyZXNvczwtZGF0b3MyJElfQVQNCmluZ3Jlc29zDQoNCm5hbWVzKGluZ3Jlc29zKTwtZGF0b3MyJFBNDQppbmdyZXNvcw0KDQpBeVQ8LXJiaW5kKEFncmFyaW8sDQogICAgICAgICAgIGluZ3Jlc29zKQ0KQXlUDQoNCg0KDQpiYXJwbG90KEF5VCxiZXNpZGU9VCwNCiAgICAgICAgbWFpbj0iSW5ncmVzb3MgcG9yIHByb2R1Y2Npw7NuIEFncmFyaWEgeSBUdXJpc21vIGVuIFBNIChNaWxsb25lcyBkZSBwZXNvcykiLA0KICAgICAgICB4bGFiPSJQTSIsDQogICAgICAgIHlsYWI9Ik1EUCIsDQogICAgICAgIGNvbD1jKCJibHVlIiwiZ3JleSIpKQ0KDQpsZWdlbmQoeCA9ICJ0b3ByaWdodCIsIGxlZ2VuZCA9YygiSW5ncmVzbyBQcm9kdWNjacOzbiBhZ3JhcmlhIiwgIkluZ3Jlc28gcG9yIFR1cmlzbW8iKSwNCiAgICAgICBmaWxsID0gYygiYmx1ZSIsImdyZXkiKSwNCiAgICAgICB0aXRsZT0iSW5ncmVzbyBwb3IgUHJvZHVjY2nDs24gYWdyYXJpYSB5IFR1cmlzbW8gKDIwMTcpIikNCiAgICAgICANCg0KbWVhbihkYXRvczIkUF9BKQ0KbWVhbihkYXRvczIkSV9BVCkNCmBgYA0KDQpfUHJvZHVjY2nDs24gYWdyw61jb2xhXw0KDQpBIGNvbnRpbnVhY2nDs24gc2UgYW5hbGl6YSBsYSBpbmZvcm1hY2nDs24gZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIGVuIGxvcyBzZWlzICpQdWVibG9zIE3DoWdpY29zKiBzZWxlY2Npb25hZG9zLiANCg0KU2UgY29uc2lkZXLDsyByZWxldmFudGUgcmV2aXNhciBkaWNoYSBpbmZvcm1hY2nDs24sIGRhZG8gcXVlIGxhIGFjdGl2aWRhZCBlY29uw7NtaWNhIHByaW5jaXBhbCBlbiBlbCBtZWRpbyBydXJhbCBtZXhpY2FubyBlcyBmdW5kYW1lbnRhbG1lbnRlIGFncsOtY29sYSwgcHJpbmNpcGFsbWVudGUgZW4gYXF1ZWxsYXMgbG9jYWxpZGFkZXMgY29uIGFsdGEgY29uY2VudHJhY2nDs24gZGUgcG9ibGFjacOzbiBpbmTDrWdlbmEuIA0KDQpQYXJhIGlkZW50aWZpY2FyIGxhIGltcG9ydGFuY2lhIGRlIGxhIGFjdGl2aWRhZCBhZ3LDrWNvbGEgZW4gbG9zIG11bmljaXBpb3Mgc2VsZWNjaW9uYWRvcyBhZHNjcml0b3MgYWwgKlByb2dyYW1hIGRlIFB1ZWJsb3MgTcOhZ2ljb3MqIHNlIG9ic2VydmFuIGxvcyBkYXRvcyBkZWwgcGVyaW9kbyAyMDAzLTIwMTggZGUgbGFzIHNpZ3VpZW50ZXMgdmFyaWFibGVzOg0KDQoxLiBfX1N1cGVyZmljaWUgc2VtYnJhZGFfXyANCjIuIF9fVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhX18NCg0KYGBge3J9DQpwaXZvdCA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZ3JvdXBfYnkobm9tbXVuaWNpcGlvKSAlPiUgc3VtbWFyaXNlKA0KICBzdXBfdG90YWwgPSBuKCksDQogIHN1cF9zZW1icmFkYSA9IG1lYW4oc2VtYnJhZGEpLA0KICBzdXBfY29zZWNoYWRhID0gbWVhbihjb3NlY2hhZGEpLA0KICB2YWxvcl9wcm9kdWNjaW9uX21pbGVzcGVzb3M9IG1lYW4odmFsb3Jwcm9kdWNjaW9uS1ApKQ0KYGBgDQojIyMgSGlzdG9ncmFtYSBzdXBlcmZpY2llIHNlbWJyYWRhIHBvciBtdW5pY2lwaW8sIDIwMDMtMjAxOA0KYGBge3J9DQpnZ3Bsb3QoZGF0YT1waXZvdCwgYWVzKHg9bm9tbXVuaWNpcGlvLCB5PXN1cF9zZW1icmFkYSkpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIikgKw0KICB4bGFiKCJNdW5pY2lwaW8iKSArIHlsYWIoIkhlY3TDoXJlYXMiKSArDQogIGdndGl0bGUoIlN1cGVyZmljaWUgc2VtYnJhZGEgcHJvbWVkaW8gcG9yIG11bmljaXBpbyAyMDAzLTIwMTgiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KIyMjIEhpc3RvZ3JhbWEgVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gcG9yIG11bmljaXBpbywgMjAwMy0yMDE4DQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9cGl2b3QsIGFlcyh4PW5vbW11bmljaXBpbywgeT12YWxvcl9wcm9kdWNjaW9uX21pbGVzcGVzb3MpKSArIA0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJkb2RnZSIpICsgDQogIHhsYWIoIk11bmljaXBpbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdndGl0bGUoIlZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIHBvciBtdW5pY2lwaW8gMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQoNCkRlc3RhY2EgcXVlIGRlIGxvcyBtdW5pY2lwaW9zIHNlbGVjY2lvbmFkb3MsIGFxdWVsbG9zIGNvbiBwb2JsYWNpw7NuIHByZXBvbmRlcmFudGVtZW50ZSBpbmTDrWdlbmEgY29tbyBzb24gQ3VldHphbMOhbiBkZWwgUHJvZ3Jlc28sIFB1ZWJsYSB5IEh1YXV0bGEgZGUgSmltZW5leiwgT2F4YWNhIGRlc3RpbmFuIGxhcyBtYXlvcmVzIHN1cGVyZmljaWVzIHNlbWJyYWRhcywgbm8gb2JzdGFudGUsIGVsIG1heW9yIHZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBsbyBvY3VwYSBlbCBtdW5pY2lwaW8gZGUgVGVxdWlzcXVpYXBhbiwgUXVlcsOpdGFyby4gSHVhdXRsYSBkZSBKaW3DqW5leiBwb3Igc3UgcGFydGUgcmVwb3J0YSBlbCBtZW5vciB2YWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgZGUgbG9zIHNlaXMgbXVuaWNpcGlvcy4NCg0KRW4gbGEgc2lndWllbnRlIGdyw6FmaWNhIHNlIG11ZXN0cmEgbGEgZXZvbHVhY2nDs24gZGVsIHZhbG9yIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBwYXJhIGNhZGEgdW5vIGRlIGxvcyBzZWlzIG11bmljaXBpb3MuIENvbnZpZW5lIGRlc3RhY2FyIHF1ZSBDdWV0emFsYW4gZGVsIFByb2dyZXNvIHkgRXplcXVpZWwgTW9udGVzIHNlIGFkaGlyaWVyb24gYWwgUHJvZ3JhbWEgZGUgUHVlYmxvcyBNw6FnaWNvcyBlbiAyMDAyIHkgMjAwNSwgcmVzcGVjdGl2YW1lbnRlLiBFbCByZXN0byBvYnR1dm8gbGEgYWRzY3JpcGNpw7NuIHBvc3RlcmlvciBhbCAyMDEwLCBzaWVuZG8gSHVhdXRsYSBkZSBKaW3DqW5leiBlbCDDumx0aW1vICgyMDE1KS4NCmBgYHtyfQ0KZ2dwbG90KFZQQWdyLCBhZXMoeD1BbmlvLCB5PSBWYWxQcm9kQWdyLCBncm91cCA9IE11bmljaXBpbywgY29sb3VyID1NdW5pY2lwaW8gKSkgKyANCiAgZ2VvbV9saW5lKCkgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCkEgY29udGludWFjacOzbiBzZSBwcmVzZW50YSBlbCBhbsOhbGlzaXMgcG9yIG11bmljaXBpbyBwYXJhIGlkZW50aWZpY2FyIGxvcyBwcmluY2lwYWxlcyBjdWx0aXZvcyB5IGxhIGV2b2x1Y2nDs24gZGUgc3UgcHJvZHVjY2nDs24gZW4gZWwgcGVyaW9kbyAyMDAzLTIwMTguDQoNCiMgSHVhdXRsYSBkZSBKaW3DqW5leg0KYGBge3J9DQpncnVwb19oajE8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdIdWF1dGxhIGRlIEppbcOpbmV6JyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX2hqMiA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdIdWF1dGxhIGRlIEppbcOpbmV6JykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KDQpFbiBlbCBtdW5pY2lwaW8gZGUgSHVhdXRsYSBkZSBKaW1lbmV6IHNlIG9ic2VydmEgbGEgYWx0YSBjb25jZW50cmFjacOzbiBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgZW4gZG9zIGN1bHRpdm9zIHByb25jaXBhbG1lbnRlOiBjYWbDqSBjZXJlemEgeSBtYcOteiBncmFuby4gDQoNCkNvbW8gc2Ugb2JzZXJ2YSBlbiBsYSBzZWd1bmRhIGdyw6FmaWNhLCBlbCB2YWxvciBkZSBsYSBwcm9kdWNjacOzbiBkZWwgY2Fmw6kgdHV2byB1bmEgY2HDrWRhIGRyw6FzdGljYSBlbiBlbCBhw7FvIDIwMTIuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9faGoxLCBhZXMoeD1ub21jdWx0aXZvLCB5PVZhbG9yUHJvZCkpICsgDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249InN0YWNrIikgKyANCiAgeGxhYigiQ3VsdGl2byIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdndGl0bGUoIkh1YXV0bGEgZGUgSmltZW5lei4gVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIDIwMDMtMjAxOCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KYGBge3J9DQpnZ3Bsb3QoZ3J1cG9faGoyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyBDdWV0emFsYW4gZGVsIFByb2dyZXNvDQoNCmBgYHtyfQ0KZ3J1cG9fY3VldDE8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdDdWV0emFsYW4gZGVsIFByb2dyZXNvJyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX2N1ZXQyIDwtIGV4Y2VsX2Fncmljb2xhICU+JSBmaWx0ZXIobm9tbXVuaWNpcGlvPT0gJ0N1ZXR6YWxhbiBkZWwgUHJvZ3Jlc28nKSAlPiUgDQogIGdyb3VwX2J5IChub21jdWx0aXZvLGFuaW8sc2VtYnJhZGEpICU+JSANCiAgc3VtbWFyaXNlKHZhbG9ycHJvZHVjY2lvbktQKQ0KYGBgDQoNCkN1ZXR6YWxhbiBkZWwgUHJvZ3Jlc28gdGFtYmnDqW4gY29uY2VudHJhIHVuYSBhbHRhIGRlcGVuZGVuY2lhIGRlIGxhIHByb2R1Y2Npw7NuIGFncsOtY29sYSBlbiBwb2NvcyBjdWx0aXZvcywgcHJpbmNpcGFsbWVudGUgZWwgY2Fmw6kgY2VyZXphLiBUYW1iacOpbiBzZSBtdWVzdHJhIGxhIGluZXN0YWJpbGlkYWQgZW4gZWwgdmFsb3IgZGUgc3UgcHJvZHVjY2nDs24gZGVsIGNhZsOpLCBhdW5xdWUgY29uIHVuYSB0ZW5kZW5jaWEgY3JlY2llbnRlIGEgcGFydGlyIGRlIDIwMTYuDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9fY3VldDEsIGFlcyh4PW5vbWN1bHRpdm8sIHk9VmFsb3JQcm9kKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siKSArIA0KICB4bGFiKCJDdWx0aXZvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2d0aXRsZSgiQ3VldHphbGFuIGRlbCBQcm9ncmVzby4gVmFsb3IgZGUgbGEgcHJvZHVjY2nDs24gYWdyw61jb2xhIDIwMDMtMjAxOCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChncnVwb19jdWV0MiwgYWVzKHg9YW5pbywgeT12YWxvcnByb2R1Y2Npb25LUCwgZ3JvdXAgPSBub21jdWx0aXZvLCBjb2xvdXIgPW5vbWN1bHRpdm8gKSkgKyANCiAgZ2VvbV9saW5lKCkgICsgeGxhYigiQcOxbyIpICsgeWxhYigiTWlsZXMgZGUgcGVzb3MiKSArDQogIGdlb21fcG9pbnQoIHNpemU9MC41LCBzaGFwZT0yMSwgZmlsbD0id2hpdGUiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgDQpgYGANCg0KIyBUZXF1aXNxdWlhcGFuDQoNCmBgYHtyfQ0KZ3J1cG9fdGVxdWlzMTwtIGV4Y2VsX2Fncmljb2xhICU+JSBmaWx0ZXIobm9tbXVuaWNpcGlvPT0gJ1RlcXVpc3F1aWFwYW4nICYgYW5pbz09MjAxOCkgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2bykgJT4lIA0KICBzdW1tYXJpc2UgKCBTdXBQcm9tU2VtYiA9IG1lYW4gKHNlbWJyYWRhKSwNCiAgICAgICAgICAgICAgU3VwUHJvbUNvcyA9IG1lYW4gKGNvc2VjaGFkYSksDQogICAgICAgICAgICAgIFZhbG9yUHJvZCA9IG1lYW4gKHZhbG9ycHJvZHVjY2lvbktQKSkNCg0KZ3J1cG9fdGVxdWlzMiA8LSBleGNlbF9hZ3JpY29sYSAlPiUgZmlsdGVyKG5vbW11bmljaXBpbz09ICdUZXF1aXNxdWlhcGFuJykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KRW4gY29udHJhc3RlIGNvbiBsb3MgbXVuaWNpcGlvcyBkZSBIdWF1dGxhIGRlIEppbcOpbmV6IHkgQ3VldHphbGFuIGRlbCBQcm9ncmVzbywgdGFudG8gZW4gVGVxdWlzcXVpYXBhbiBjb21vIFphY2F0bMOhbiBzZSBvYnNlcnZhIHVuYSBtYXlvciBkaXZlcnNpZGFkIGRlIGN1bHRpdm9zIGUgaW5jbHVzbyBlbiBsYSBldm9sdWNpw7NuIGVudHJlIDIwMDMgeSAyMDE4IHNlIG9ic2VydmEgZWwgY3JlY2ltaWVudG8gZGUgbGEgcGFydGljaXBhY2nDs24gZGUgY3VsdGl2b3Mgbm8gdHJhZGljaW9uYWxlcy4NCmBgYHtyfQ0KZ2dwbG90KGRhdGE9Z3J1cG9fdGVxdWlzMSwgYWVzKHg9bm9tY3VsdGl2bywgeT1WYWxvclByb2QpKSArIA0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIpICsgDQogIHhsYWIoIkN1bHRpdm8iKSArIHlsYWIoIk1pbGVzIGRlIHBlc29zIikgKw0KICBnZ3RpdGxlKCJUZXF1aXNxdWlhcGFuLiBWYWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChncnVwb190ZXF1aXMyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgKyB4bGFiKCJBw7FvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT0wLjUsIHNoYXBlPTIxLCBmaWxsPSJ3aGl0ZSIpICsgDQogIHRoZW1lX21pbmltYWwoKSANCmBgYA0KDQojIFphY2F0bMOhbiANCg0KYGBge3J9DQpncnVwb196YWMxPC0gZXhjZWxfYWdyaWNvbGEgJT4lIGZpbHRlcihub21tdW5pY2lwaW89PSAnWmFjYXRsw6FuJyAmIGFuaW89PTIwMTgpICU+JSANCiAgZ3JvdXBfYnkgKG5vbWN1bHRpdm8pICU+JSANCiAgc3VtbWFyaXNlICggU3VwUHJvbVNlbWIgPSBtZWFuIChzZW1icmFkYSksDQogICAgICAgICAgICAgIFN1cFByb21Db3MgPSBtZWFuIChjb3NlY2hhZGEpLA0KICAgICAgICAgICAgICBWYWxvclByb2QgPSBtZWFuICh2YWxvcnByb2R1Y2Npb25LUCkpDQoNCmdydXBvX3phYzIgPC0gZXhjZWxfYWdyaWNvbGEgJT4lIGZpbHRlcihub21tdW5pY2lwaW89PSAnWmFjYXRsw6FuJykgJT4lIA0KICBncm91cF9ieSAobm9tY3VsdGl2byxhbmlvLHNlbWJyYWRhKSAlPiUgDQogIHN1bW1hcmlzZSh2YWxvcnByb2R1Y2Npb25LUCkNCmBgYA0KDQpgYGB7cn0NCmdncGxvdChkYXRhPWdydXBvX3phYzEsIGFlcyh4PW5vbWN1bHRpdm8sIHk9VmFsb3JQcm9kKSkgKyANCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj0ic3RhY2siKSArIA0KICB4bGFiKCJDdWx0aXZvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2d0aXRsZSgiWmFjYXRsw6FuLiBWYWxvciBkZSBsYSBwcm9kdWNjacOzbiBhZ3LDrWNvbGEgMjAwMy0yMDE4IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpKQ0KYGBgDQpgYGB7cn0NCmdncGxvdChncnVwb196YWMyLCBhZXMoeD1hbmlvLCB5PXZhbG9ycHJvZHVjY2lvbktQLCBncm91cCA9IG5vbWN1bHRpdm8sIGNvbG91ciA9bm9tY3VsdGl2byApKSArIA0KICBnZW9tX2xpbmUoKSAgKyB4bGFiKCJBw7FvIikgKyB5bGFiKCJNaWxlcyBkZSBwZXNvcyIpICsNCiAgZ2VvbV9wb2ludCggc2l6ZT0wLjUsIHNoYXBlPTIxLCBmaWxsPSJ3aGl0ZSIpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg==