Análisis de la intención de voto en Buenos Aires y Córdoba para las elecciones generales del año 2015

Trabajo final de la materia Investigación Electoral y de Opinión Pública Aplicada I y II

Bardauil Ariana

2023-07-25

Introducción

El objetivo de este trabajo es analizar la intención de voto de dos encuestas realizadas en Buenos Aires y Córdoba realizada de las Primarias Abiertas Simultaneas y Obligatorias (PASO) del 9 de agosto del 2015 para la materia Investigación Electoral y de Opinión Pública Aplicada I y II. El resultado de las PASO fue el siguiente:

read_excel("Consigna y materiales TP1/Materiales de referencia/Resultados PASO2015.xlsx", 
    sheet = "Hoja2") |> 
  mutate(`Buenos Aires` = paste0(round(`Buenos Aires`*100, 2), "%"),
         `Córdoba` = paste0(round(`Córdoba`*100, 2), "%")) |> 
  kable(format = "html", escape = FALSE) |> 
  kable_styling(bootstrap_options = "striped", font_size = 14)
Candidato Buenos Aires Córdoba
Daniel Scioli 12.74% 42.63%
Mauricio Macri 33.82% 21.21%
Sergio Massa 5.6% 19.38%
Margarita Stolbizer 2.69% 4.29%
Nicolás del Caño 2.37% 1.67%
Rodriguez Saa 2.92% 1.1%
Jorge Altamira 3.49% 2.21%
José Manuel De La Zota 27.91% 2.14%
Sanz 2.93% 1.46%
Carrio 2.76% 2.03%
Otros 2.77% 1.89%

El 25 de octubre (Primera vuelta) y el 22 de noviembre (segunda vuelta) de 2015 se sucedieron las elecciones presidenciales de Argentina. Los principales candidatos fueron Daniel Scioli del Frente para la Victoria (FpV), candidato oficialista, y Mauricio Macri de Cambiemos, entonces jefe de gobierno de la Ciudad de Buenos Aires.

En la primera vuelta electoral, que tuvo lugar el 25 de octubre de 2015, ninguno de los candidatos obtuvo más del 45% de los votos ni una diferencia de más de 10 puntos porcentuales sobre el segundo candidato, lo que llevó a la realización de una segunda vuelta electoral.

  • Daniel Scioli (FpV): 37.08% de los votos.

  • Mauricio Macri (Cambiemos): 34.15% de los votos.

Daniel Scioli y Mauricio Macri, se enfrentaron en una segunda vuelta electoral el 22 de noviembre de 2015 lo que llevó al segundo a la victoria con el 51.34% de los votos.

Consigna

Sobre la base de los materiales entregados (Cuestionario y Bases de Resultados de los Estudios Electorales de Córdoba Capital y Base Individuos EPH)

1- Procesar las bases de datos de manera independiente aplicando el método de ponderación iterativa visto en clase (Parámetros en Base EPH).

2- En base a los indicadores relevados evaluar el potencial electoral de los principales candidatos a Presidente (Macri y Scioli)

3- Seleccionar un conjunto de indicadores que den cuenta de al menos dos de las perspectivas teóricas vistas en la bibliografía sobre comportamiento electoral y evaluar el impacto de dichos indicadores en la decisión de voto utilizando al menos dos herramientas de análisis. Comparar los resultados obtenidos entre ambas ciudades.

CORDOBA <- read_sav("Consigna y materiales TP1/Bases de datos/CORDOBA_FINAL.sav")
GBA <- read_sav("Consigna y materiales TP1/Bases de datos/GBA_FINAL.sav")

Análisis Exploratorio

Resumen de los Datos

En este apartado se realizará la manipulación y transformación de datos como así también el análisis exploratorio de ambas bases

Buenos Aires

En una primera apreciación de la base de Buenos Aires se puede observar que existen valores nulos. Estos pueden deberse a respuestas faltantes o preguntas que los encuestados optaron por no responder.

skimr::skim(GBA) 
Data summary
Name GBA
Number of rows 373
Number of columns 20
_______________________
Column type frequency:
character 7
factor 12
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
voto_candidato 0 1.00 7 20 0 8 0
voto_acotado 1 1.00 7 19 0 5 0
jamas_votaria 2 0.99 7 19 0 5 0
representacion_del_cambio 0 1.00 7 14 0 5 0
agenda_de_temas 0 1.00 6 35 0 6 0
percepcion_de_ganador 0 1.00 4 14 0 5 0
votacion_paso 0 1.00 5 22 0 8 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
edad 0 1.00 TRUE 4 50-: 168, 30-: 94, 18-: 60, >65: 51
sexo 0 1.00 TRUE 2 Muj: 196, Var: 177
niv_educativo 0 1.00 TRUE 5 Sec: 139, Pri: 80, Ter: 64, Uni: 61
gestion_cristina 0 1.00 TRUE 3 Des: 192, Apr: 145, No : 36
economia_pais_2_anos 0 1.00 TRUE 4 Emp: 177, Mej: 110, Se : 80, No : 6
economia_fliar_2_anos 3 0.99 TRUE 4 Emp: 134, Se : 124, Mej: 103, No : 9
continuidad_o_cambio 3 0.99 TRUE 4 Man: 199, Man: 88, Cam: 73, No : 10
influencia_de_cristina_en_scioli 83 0.78 TRUE 4 Bas: 149, Poc: 74, Nin: 38, No : 29
posicionamiento_espacial 0 1.00 TRUE 6 Ni : 224, No : 47, Más: 39, Tot: 28
posicionamiento_respecto_peronismo 0 1.00 TRUE 4 Ni : 209, Per: 124, Ant: 23, No : 17
posicionamiento_respecto_kirchnerismo 0 1.00 TRUE 4 Ni : 151, Ant: 110, Kir: 100, No : 12
ne_bsas 0 1.00 TRUE 3 Sec: 203, Ter: 90, P. : 80

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ua 0 1 187 107.82 1 94 187 280 373 ▇▇▇▇▇

Córdoba

Al igual que con el df de Buenos Aires, vemos que en el dataframe de Córdoba existen valores nulos.

skimr::skim(CORDOBA) 
Data summary
Name CORDOBA
Number of rows 320
Number of columns 20
_______________________
Column type frequency:
character 7
factor 12
numeric 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
voto_candidato 0 1 7 20 0 8 0
voto_acotado 0 1 7 19 0 5 0
jamas_votaria 0 1 7 19 0 5 0
representacion_del_cambio 0 1 7 14 0 5 0
agenda_de_temas 1 1 6 35 0 6 0
percepcion_de_ganador 0 1 4 14 0 5 0
votacion_paso 0 1 5 22 0 8 0

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
edad 0 1.00 TRUE 4 50-: 103, 30-: 96, 18-: 64, >65: 57
sexo 0 1.00 TRUE 2 Muj: 179, Var: 141
niv_educativo 0 1.00 TRUE 5 Uni: 120, Sec: 70, Ter: 58, Ter: 38
gestion_cristina 0 1.00 TRUE 3 Des: 210, Apr: 84, No : 26
economia_pais_2_anos 3 0.99 TRUE 4 Emp: 198, Se : 57, Mej: 48, No : 14
economia_fliar_2_anos 0 1.00 TRUE 4 Emp: 143, Se : 97, Mej: 63, No : 17
continuidad_o_cambio 0 1.00 TRUE 4 Man: 180, Cam: 75, Man: 42, No : 23
influencia_de_cristina_en_scioli 1 1.00 TRUE 5 Muc: 118, Bas: 102, Poc: 47, No : 31
posicionamiento_espacial 0 1.00 TRUE 6 Ni : 202, No : 37, Más: 36, Más: 20
posicionamiento_respecto_peronismo 0 1.00 TRUE 4 Ni : 207, Per: 47, Ant: 34, No : 32
posicionamiento_respecto_kirchnerismo 0 1.00 TRUE 4 Ni : 135, Ant: 124, Kir: 33, No : 28
ne_cba 0 1.00 TRUE 3 Ter: 158, Sec: 128, P. : 34

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
ua 0 1 160.5 92.52 1 80.75 160.5 240.25 320 ▇▇▇▇▇

Tratamiento de los valores nulos

Para el tratamiento de los mismos se utilizará el paquete {mice} Multiple Imputation by Chained Equations. Este método imputa los datos faltantes a través de una serie iterativa de modelos predictivos

Buenos Aires

En este subpanel se buscará realizar el tratamiento de los valores nulos de la base de Buenos Aires

GBA %>% visdat::vis_dat(warn_large_data = F)

naniar::gg_miss_var(GBA, show_pct = T)

naniar::gg_miss_upset(GBA,nsets = 10)

Como se puede ver en los gráficos anteriores, la variable que más posee valores nulos es influencia_de_cristina_en_scioli. Esta variable no se encuentra relacionada directamente con otras. Por lo que no se debe a un salto por no completar alguna pregunta de la encuesta.

# Convierto las variables a factor
df_bsas <- GBA  |> 
  mutate_all(as.factor) |> 
  mutate(ua = as.numeric(ua))

mice_object <- mice(df_bsas, method = "polyreg")
summary(mice_object)
df_gba_sin_NA <- complete(mice_object)

Mostramos el resultado de la imputación

visdat::vis_miss(df_gba_sin_NA)

Como se puede ver en el gráfico ya no hay valores nulos. Los mismos fueron imputados satisfactoriamente por mice .

Córdoba

En este subpanel se buscará realizar el tratamiento de los valores nulos de la base de Córdoba

CORDOBA %>% visdat::vis_dat(warn_large_data = F)

naniar::gg_miss_var(CORDOBA, show_pct = T)

naniar::gg_miss_upset(CORDOBA,nsets = 10)

A diferencia del dataset de Buenos Aires, se observa menos cantidad de valores nulos. Se procederá a imputar los mismos:

# Convierto las variables a factor
df_cordoba <- CORDOBA  |> 
  mutate_all(as.factor) |> 
  mutate(ua = as.numeric(ua))

mice_object <- mice(df_cordoba, method = "polyreg")
summary(mice_object)
df_cordoba_sin_NA <- complete(mice_object)

Mostramos el resultado de la imputación:

visdat::vis_miss(df_cordoba_sin_NA)

Explorando los datos

Buenos Aires

A continuación se analizará el dataset de Buenos Aires.El paquete {Hmisc} permite una buena visualización de la distribución de las variables categóricas. Algunas observaciones:

# analizamos los datos 
resumen_gba <- Hmisc::describe(df_gba_sin_NA, transpose = FALSE,tabular = FALSE)


resumen_gba
## df_gba_sin_NA 
## 
##  20  Variables      373  Observations
## --------------------------------------------------------------------------------
## ua 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      373        0      373        1      187    124.7     19.6     38.2 
##      .25      .50      .75      .90      .95 
##     94.0    187.0    280.0    335.8    354.4 
## 
## lowest :   1   2   3   4   5, highest: 369 370 371 372 373
## --------------------------------------------------------------------------------
## edad 
##        n  missing distinct 
##      373        0        4 
##                                   
## Value      18-29 30-49 50-65   >65
## Frequency     60    94   168    51
## Proportion 0.161 0.252 0.450 0.137
## --------------------------------------------------------------------------------
## sexo 
##        n  missing distinct 
##      373        0        2 
##                       
## Value      Varón Mujer
## Frequency    177   196
## Proportion 0.475 0.525
## --------------------------------------------------------------------------------
## niv_educativo 
##        n  missing distinct 
##      373        0        5 
## 
## Primario completo (80, 0.214), Secundario incompleto o completo (139, 0.373),
## Terciario no univ. incompleto (64, 0.172), Terciario no univ. completo (29,
## 0.078), Universitario incompleto o completo (61, 0.164)
## --------------------------------------------------------------------------------
## voto_candidato 
##        n  missing distinct 
##      373        0        8 
## 
## Adolfo Rodriguez Saa (2, 0.005), Daniel Scioli (144, 0.386), Margarita
## Stolbizer (15, 0.040), Mauricio Macri (111, 0.298), Nicolas Del Caño (4,
## 0.011), Ninguno / En Blanco (8, 0.021), No Sabe (9, 0.024), Sergio Massa (80,
## 0.214)
## --------------------------------------------------------------------------------
## voto_acotado 
##        n  missing distinct 
##      373        0        5 
##                                                                       
## Value            Daniel Scioli      Mauricio Macri Ninguno / En Blanco
## Frequency                  141                 119                  19
## Proportion               0.378               0.319               0.051
##                                                   
## Value                  No Sabe        Sergio Massa
## Frequency                   15                  79
## Proportion               0.040               0.212
## --------------------------------------------------------------------------------
## jamas_votaria 
##        n  missing distinct 
##      373        0        5 
##                                                                       
## Value            Daniel Scioli      Mauricio Macri Ninguno / En Blanco
## Frequency                  165                 149                  24
## Proportion               0.442               0.399               0.064
##                                                   
## Value                  No Sabe        Sergio Massa
## Frequency                   19                  16
## Proportion               0.051               0.043
## --------------------------------------------------------------------------------
## gestion_cristina 
##        n  missing distinct 
##      373        0        3 
##                                            
## Value      Desaprueba    Aprueba    No sabe
## Frequency         192        145         36
## Proportion      0.515      0.389      0.097
## --------------------------------------------------------------------------------
## economia_pais_2_anos 
##        n  missing distinct 
##      373        0        4 
##                                                                               
## Value                Mejoró          Empeoró Se mantuvo igual          No sabe
## Frequency               110              177               80                6
## Proportion            0.295            0.475            0.214            0.016
## --------------------------------------------------------------------------------
## economia_fliar_2_anos 
##        n  missing distinct 
##      373        0        4 
##                                                                               
## Value                Mejoró          Empeoró Se mantuvo igual          No sabe
## Frequency               104              135              125                9
## Proportion            0.279            0.362            0.335            0.024
## --------------------------------------------------------------------------------
## continuidad_o_cambio 
##        n  missing distinct 
##      373        0        4 
##                                                                             
## Value           Mantener políticas actuales Mantener algunas y cambiar otras
## Frequency                                91                              199
## Proportion                            0.244                            0.534
##                                                                             
## Value                         Cambiar todas                          No sabe
## Frequency                                73                               10
## Proportion                            0.196                            0.027
## --------------------------------------------------------------------------------
## representacion_del_cambio 
##        n  missing distinct 
##      373        0        5 
##                                                                       
## Value       Daniel Scioli Mauricio Macri        Ninguno        No sabe
## Frequency             117            127             28             19
## Proportion          0.314          0.340          0.075          0.051
##                          
## Value        Sergio Massa
## Frequency              82
## Proportion          0.220
## --------------------------------------------------------------------------------
## agenda_de_temas 
##        n  missing distinct 
##      373        0        6 
## 
## lowest : Economía                            Educacion, asistencia social, salud Empleo                              No sabe                             Respeto de instituciones           
## highest: Educacion, asistencia social, salud Empleo                              No sabe                             Respeto de instituciones            Seguridad                          
## --------------------------------------------------------------------------------
## percepcion_de_ganador 
##        n  missing distinct 
##      373        0        5 
##                                                                       
## Value       Daniel Scioli Mauricio Macri        No sabe           Otro
## Frequency             173             95             42              6
## Proportion          0.464          0.255          0.113          0.016
##                          
## Value        Sergio Massa
## Frequency              57
## Proportion          0.153
## --------------------------------------------------------------------------------
## influencia_de_cristina_en_scioli 
##        n  missing distinct 
##      373        0        4 
##                                               
## Value       Ninguna     Poca Bastante  No sabe
## Frequency        50       80      195       48
## Proportion    0.134    0.214    0.523    0.129
## --------------------------------------------------------------------------------
## posicionamiento_espacial 
##        n  missing distinct 
##      373        0        6 
## 
## Totalmente de izquierda (28, 0.075), Más izquierda que derecha (39, 0.105), Ni
## de izquierda ni de derecha (224, 0.601), Más de derecha que de izquierda (24,
## 0.064), Totalmente de derecha (11, 0.029), No sabe (47, 0.126)
## --------------------------------------------------------------------------------
## posicionamiento_respecto_peronismo 
##        n  missing distinct 
##      373        0        4 
##                                                                         
## Value                           Peronista                  Antiperonista
## Frequency                             124                             23
## Proportion                          0.332                          0.062
##                                                                         
## Value      Ni peronista ni anti peronista                        No sabe
## Frequency                             209                             17
## Proportion                          0.560                          0.046
## --------------------------------------------------------------------------------
## posicionamiento_respecto_kirchnerismo 
##        n  missing distinct 
##      373        0        4 
## 
## Kirchnerista (100, 0.268), Anti kirchnerista (110, 0.295), Ni kirchnerista ni
## anti kirchnerista (151, 0.405), No sabe (12, 0.032)
## --------------------------------------------------------------------------------
## ne_bsas 
##        n  missing distinct 
##      373        0        3 
##                                                                       
## Value              P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo
## Frequency                   80                 203                  90
## Proportion               0.214               0.544               0.241
## --------------------------------------------------------------------------------
## votacion_paso 
##        n  missing distinct 
##      373        0        8 
## 
## Blanco / No voto (23, 0.062), Daniel Scioli (133, 0.357), José Manuel De La
## Sota (5, 0.013), Margarita Stolbizer (25, 0.067), Mauricio Macri (79, 0.212),
## Otros (33, 0.088), Rodriguez Saa (7, 0.019), Sergio Massa (68, 0.182)
## --------------------------------------------------------------------------------

La mayoría de los encuestados (45%) se encuentra en el rango de edad de 50-65 años. El 52% según la variable sexo es mujer. Respecto al nivel educativo (niv_educativo) el 37.3% posee secundario, el 29% terciario completo, el 21% primario completo, el 17.2% Terciario incompleto. Y, por último, el 16.4% posee Universitario completo o incompleto.

Sobre el voto_candidato el 38.6% tiene intenciones de votar a Daniel Scioli, el 29.8% a Mauricio Macri y, el 21.4% a Sergio Massa. En esta misma linea, se obsevan los resultados de voto_acotado . En jamas_votaria rankea Daniel Scioli con un 44.2%.

El 51.5% desaprueba la gestion_cristina, para el 47.5% la economía en estos ultimos dos años empeoró (economia_pais_2_anos), el 36.2% considera que su economía familiar empeoro (economia_fliar_2_anos). Sin embargo, para el 53.6% se debería mantener algunas políticas y cambiar otras y el 24% piensa que habría que mantener todas las políticas (continuidad_o_cambio). Sobre este punto, el 34% sostiene que la representación del cambio (representacion_del_cambio) está en manos de Mauricio Macri y el 31.4 de Daniel Scioli

Entre la agenda de temas más mencionados se encuentra: Educación, Asistencia Social, Salud y Empleo (agenda_de_temas). El 46.4% cree que ganará Daniel Scioli (percepcion_de_ganador) y el 25.5% Mauricio Macri. En este sentido, el 52.5% considera que hay influencia de CFK sobre Daniel Scioli (influencia_de_cristina_en_scioli)

En relación con el posicionamiento de los encuestados: El 60% no se considera ni de izquierda ni de derecha (posicionamiento_espacial) y el 56% no se define ni como peronista ni antiperonista (posicionamiento_respecto_peronismo). Lo mismo sucede con el posicionamiento respecto al kirchnerismo, el 40.5% no se considera K ni antiK, el 29% es antiK y el 26.8% es K

Sobre qué votaron en las PASO, el 35.7% votó a Daniel Scioli y el 21.2% a Mauricio Macri

df_categoricas <- df_gba_sin_NA %>%
  select_if(is.factor)

# Creo una lista
lista_graficos <- list()

# Armo un loop para graficar todos
for (col in names(df_categoricas)) {
  # Calculamos la frecuencia de cada
  frecuencias <- df_gba_sin_NA %>%
    count(!!sym(col), voto_acotado ) %>%
    group_by(voto_acotado) %>%
    mutate(porcentaje = n / sum(n) * 100)
  
  
  # Graficamos
  grafico_barras_apilados <- ggplot(frecuencias, aes(x = reorder(!!sym(col), -porcentaje), y = porcentaje, fill = as.factor(voto_acotado))) +
    geom_bar(position = 'dodge',stat = "identity") +
    labs(title = NULL, x = col, y = " ", fill = "Voto Acotado") +
    guides(fill = guide_legend(title = " ")) +
    scale_fill_brewer(palette = "Set3") +# 
    theme_minimal() +
    theme(axis.text.x = element_text(hjust = 1, size = 5, angle = 45),
          axis.text.x.top = element_text(hjust = 1, size = 5,angle = 45),
          axis.text.y = element_text(size = 5),
          legend.position = 'top',
          legend.text = element_text(size = 4),
          legend.key.size = unit(0.4, 'cm'), # es para los cuadraditos
          legend.key.width = unit(0.4, 'cm')
          ) +
    scale_x_discrete(labels = function(x) str_wrap(x, width = 10))  
  
  # Guardo los gráficos en la lista
  lista_graficos[[col]] <- grafico_barras_apilados
}

# Armamos varias grillas para que no se apelmace
num_grillas <- ceiling(length(lista_graficos) / 6)
grillas <- lapply(1:num_grillas, function(i) {
  inicio <- (i - 1) * 6 + 1
  fin <- min(i * 6, length(lista_graficos))
  grid.arrange(grobs = lista_graficos[inicio:fin], ncol = 2)
})

En este gráfico se muestra por variable la distribución del voto_acotado . En relación con las variables sociodemográficas podemos decir que dentro del rango de edad 50-65 el “No sabe” lidera las respuestas, en segundo lugar Mauricio Macri y tercero Daniel Scioli. Entre los 18-29 años el voto en blanco o ninguno tiene mayor proporcion. Daniel Scioli tiene mayor proporción de Voto Femenino, y Sergio Massa masculino. Y, Sergio Massa lidera entre los que poseen secundario completo o incompleto y universitario y terciario está parejo entre Macri y Scioli

Respecto a las variables económicas: Quienes desaprueban la gestión cristina en mayor medida votarán a Mauricio Macri y, entre quienes la aprueban votarána a Daniel Scioli (gestion_cristina). En el mismo sentido, quienes consideran que su situación económica empeoró (economia_pais_2_anos y economia_fliar_2_anos) votarán a la oposición y, a la inversa, al oficialismo

Córdoba

A continuación se analizará el dataset de Córdoba.

resumen_cba <- Hmisc::describe(df_cordoba_sin_NA, transpose = FALSE,tabular = FALSE) 

resumen_cba
## df_cordoba_sin_NA 
## 
##  20  Variables      320  Observations
## --------------------------------------------------------------------------------
## ua 
##        n  missing distinct     Info     Mean      Gmd      .05      .10 
##      320        0      320        1    160.5      107    16.95    32.90 
##      .25      .50      .75      .90      .95 
##    80.75   160.50   240.25   288.10   304.05 
## 
## lowest :   1   2   3   4   5, highest: 316 317 318 319 320
## --------------------------------------------------------------------------------
## edad 
##        n  missing distinct 
##      320        0        4 
##                                   
## Value      18-29 30-49 50-65   >65
## Frequency     64    96   103    57
## Proportion 0.200 0.300 0.322 0.178
## --------------------------------------------------------------------------------
## sexo 
##        n  missing distinct 
##      320        0        2 
##                       
## Value      Varón Mujer
## Frequency    141   179
## Proportion 0.441 0.559
## --------------------------------------------------------------------------------
## niv_educativo 
##        n  missing distinct 
##      320        0        5 
## 
## Primario completo (34, 0.106), Secundario incompleto o completo (70, 0.219),
## Terciario no univ. incompleto (58, 0.181), Terciario no univ. completo (38,
## 0.119), Universitario incompleto o completo (120, 0.375)
## --------------------------------------------------------------------------------
## voto_candidato 
##        n  missing distinct 
##      320        0        8 
## 
## Adolfo Rodriguez Saa (7, 0.022), Daniel Scioli (75, 0.234), Margarita Stolbizer
## (13, 0.041), Mauricio Macri (150, 0.469), Nicolas Del Caño (5, 0.016), Ninguno
## / En Blanco (14, 0.044), No Sabe (13, 0.041), Sergio Massa (43, 0.134)
## --------------------------------------------------------------------------------
## voto_acotado 
##        n  missing distinct 
##      320        0        5 
##                                                                       
## Value            Daniel Scioli      Mauricio Macri Ninguno / En Blanco
## Frequency                   74                 155                  24
## Proportion               0.231               0.484               0.075
##                                                   
## Value                  No Sabe        Sergio Massa
## Frequency                   20                  47
## Proportion               0.062               0.147
## --------------------------------------------------------------------------------
## jamas_votaria 
##        n  missing distinct 
##      320        0        5 
##                                                                       
## Value            Daniel Scioli      Mauricio Macri Ninguno / En Blanco
## Frequency                  203                  77                  13
## Proportion               0.634               0.241               0.041
##                                                   
## Value                  No Sabe        Sergio Massa
## Frequency                   15                  12
## Proportion               0.047               0.038
## --------------------------------------------------------------------------------
## gestion_cristina 
##        n  missing distinct 
##      320        0        3 
##                                            
## Value      Desaprueba    Aprueba    No sabe
## Frequency         210         84         26
## Proportion      0.656      0.262      0.081
## --------------------------------------------------------------------------------
## economia_pais_2_anos 
##        n  missing distinct 
##      320        0        4 
##                                                                               
## Value                Mejoró          Empeoró Se mantuvo igual          No sabe
## Frequency                48              199               59               14
## Proportion            0.150            0.622            0.184            0.044
## --------------------------------------------------------------------------------
## economia_fliar_2_anos 
##        n  missing distinct 
##      320        0        4 
##                                                                               
## Value                Mejoró          Empeoró Se mantuvo igual          No sabe
## Frequency                63              143               97               17
## Proportion            0.197            0.447            0.303            0.053
## --------------------------------------------------------------------------------
## continuidad_o_cambio 
##        n  missing distinct 
##      320        0        4 
##                                                                             
## Value           Mantener políticas actuales Mantener algunas y cambiar otras
## Frequency                                42                              180
## Proportion                            0.131                            0.562
##                                                                             
## Value                         Cambiar todas                          No sabe
## Frequency                                75                               23
## Proportion                            0.234                            0.072
## --------------------------------------------------------------------------------
## representacion_del_cambio 
##        n  missing distinct 
##      320        0        5 
##                                                                       
## Value       Daniel Scioli Mauricio Macri        Ninguno        No sabe
## Frequency              55            151             36             31
## Proportion          0.172          0.472          0.112          0.097
##                          
## Value        Sergio Massa
## Frequency              47
## Proportion          0.147
## --------------------------------------------------------------------------------
## agenda_de_temas 
##        n  missing distinct 
##      320        0        6 
## 
## lowest : Economía                            Educacion, asistencia social, salud Empleo                              No sabe                             Respeto de instituciones           
## highest: Educacion, asistencia social, salud Empleo                              No sabe                             Respeto de instituciones            Seguridad                          
## --------------------------------------------------------------------------------
## percepcion_de_ganador 
##        n  missing distinct 
##      320        0        5 
##                                                                       
## Value       Daniel Scioli Mauricio Macri        No sabe           Otro
## Frequency             117            120             55              7
## Proportion          0.366          0.375          0.172          0.022
##                          
## Value        Sergio Massa
## Frequency              21
## Proportion          0.066
## --------------------------------------------------------------------------------
## influencia_de_cristina_en_scioli 
##        n  missing distinct 
##      320        0        5 
##                                                        
## Value       Ninguna     Poca Bastante    Mucha  No sabe
## Frequency        21       47      102      119       31
## Proportion    0.066    0.147    0.319    0.372    0.097
## --------------------------------------------------------------------------------
## posicionamiento_espacial 
##        n  missing distinct 
##      320        0        6 
## 
## Totalmente de izquierda (15, 0.047), Más izquierda que derecha (36, 0.112), Ni
## de izquierda ni de derecha (202, 0.631), Más de derecha que de izquierda (20,
## 0.062), Totalmente de derecha (10, 0.031), No sabe (37, 0.116)
## --------------------------------------------------------------------------------
## posicionamiento_respecto_peronismo 
##        n  missing distinct 
##      320        0        4 
##                                                                         
## Value                           Peronista                  Antiperonista
## Frequency                              47                             34
## Proportion                          0.147                          0.106
##                                                                         
## Value      Ni peronista ni anti peronista                        No sabe
## Frequency                             207                             32
## Proportion                          0.647                          0.100
## --------------------------------------------------------------------------------
## posicionamiento_respecto_kirchnerismo 
##        n  missing distinct 
##      320        0        4 
## 
## Kirchnerista (33, 0.103), Anti kirchnerista (124, 0.388), Ni kirchnerista ni
## anti kirchnerista (135, 0.422), No sabe (28, 0.088)
## --------------------------------------------------------------------------------
## votacion_paso 
##        n  missing distinct 
##      320        0        8 
## 
## Blanco / No voto (23, 0.072), Daniel Scioli (53, 0.166), José Manuel De La Sota
## (31, 0.097), Margarita Stolbizer (18, 0.056), Mauricio Macri (104, 0.325),
## Otros (33, 0.103), Rodriguez Saa (25, 0.078), Sergio Massa (33, 0.103)
## --------------------------------------------------------------------------------
## ne_cba 
##        n  missing distinct 
##      320        0        3 
##                                                                       
## Value              P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo
## Frequency                   34                 128                 158
## Proportion               0.106               0.400               0.494
## --------------------------------------------------------------------------------

En primer lugar, gracias a la imputación ya no hay valores nulos dentro del df. En total hay 273 observaciones. Al igual que como sucede en Buenos Aires, la mayoría de las personas encuestadas pertenecen se encuentran entre 30 y 65 años (edad) y, su sexo corresponde a mujer (55.9%). El nivel educativo predominante es universitario completo o incompleto (niv_educativo).

En voto_candidato el 46.9% votaría a Mauricio Macri y el 23.4% a Daniel Scioli. Esta distribución se mantiene en voto_acotado . Además, el 63.4% jamás votaría a Daniel Scioli y el 24.1% a Mauricio Macri.

En relación con la gestión del Gobierno de Cristina (gestion_cristina) 65.6% de los cordobeses encuestados la desaprueba y el 62.2% considera que la situación económica del país empeoró en los últimos dos años (economia_pais_2_anos). No obstante, si bien el 44% de los encuestados cree que su situación económica familiar empeoró, el 30% considera que no hubo cambio (economia_fliar_2_anos)

Al respecto de la continuidad de las políticas de gobierno para el 56.2% se debería mantener algunos y modificar otras (continuidad_o_cambio). En esta línea, para el 47.2% la imagen del cambio es Mauricio Macri (representacion_del_cambio). Los temas mas importantes más elegidos son: Educación, Asistencia Social, Salud y Empleo (agenda_de_temas)

Para el 37.5 % el ganador será Mauricio Macri y para el 36.6% será Daniel Scioli (percepcion_de_ganador). En linea, el 37.2% considera que hay influencia de CFK en Daniel Scioli (influencia_de_cristina_en_scioli)

Sobre la posición ideológica de los encuestados:

  • El 63.1% no se considera ni de izquierda ni de derecha (posicionamiento_espacial)

  • El 64.7% no es ni peronista ni antiperonista (posicionamiento_respecto_peronismo)

  • El 42.2% no es K ni AntiK, pero el 38.8% se considera antikirchnerista (posicionamiento_respecto_kirchnerismo)

Por último, en las PASO el 32.5 votó a Mauricio Macri, y el 16.6% a Daniel Scioli (votacion_paso)

df_categoricas <- df_cordoba_sin_NA %>%
  select_if(is.factor)

# Creo una lista
lista_graficos <- list()

# Armo un loop para graficar todos
for (col in names(df_categoricas)) {
  # Calculamos la frecuencia de cada
  frecuencias <- df_cordoba_sin_NA %>%
    count(!!sym(col), voto_acotado ) %>%
    group_by(voto_acotado) %>%
    mutate(porcentaje = n / sum(n) * 100)
  
  
  # Graficamos
  grafico_barras_apilados <- ggplot(frecuencias, aes(x = reorder(!!sym(col), -porcentaje), y = porcentaje, fill = as.factor(voto_acotado))) +
    geom_bar(position = 'dodge',stat = "identity") +
    labs(title = NULL, x = col, y = " ", fill = "Voto Acotato") +
    guides(fill = guide_legend(title = " ")) +
    scale_fill_brewer(palette = "Set3") +# 
    theme_minimal() +
    theme(axis.text.x = element_text(hjust = 1, size = 5, angle = 45),
          axis.text.x.top = element_text(hjust = 1, size = 5,angle = 45),
          axis.text.y = element_text(size = 5),
          legend.position = 'top',
          legend.text = element_text(size = 4),
          legend.key.size = unit(0.4, 'cm'), # es para los cuadraditos
          legend.key.width = unit(0.4, 'cm')
          ) +
    scale_x_discrete(labels = function(x) str_wrap(x, width = 10))  
  
  # Guardo los gráficos en la lista
  lista_graficos[[col]] <- grafico_barras_apilados
}

# Armamos varias grillas para que no se apelmace
num_grillas <- ceiling(length(lista_graficos) / 6)
grillas <- lapply(1:num_grillas, function(i) {
  inicio <- (i - 1) * 6 + 1
  fin <- min(i * 6, length(lista_graficos))
  grid.arrange(grobs = lista_graficos[inicio:fin], ncol = 2)
})

En este gráfico se muestra por variable la distribución del voto_acotado . En relación con las variables sociodemográficas podemos decir que: Daniel Scioli será más votado por el rango 30-49 años y Macri por 50-65, Sergio Massa tiene mayor proporción de Voto Femenino, al igual que Mauricio Macri. Y, Daniel Scioli lidera entre los universitaruis y Mauricio Macri entre los que poseen secundario completo o incompleto. Respecto a las variables económicas y de gestión, las respuestas van en línea con lo visto en Buenos Aires

Ponderación iterativa

El método de ponderación iterativa consiste en ajustar los valores asignados a cada observación . De esta manera, lo que se busca es corregir el error de muestreo y hacer coincidir la muestra con las características de la población. Para ello, es necesario aumentar la influencia de las unidades subrepresentadas y disminuir la influencia de las unidades sobrerrepresentadas.

Para dicha tarea se utilizará el paquete {anesrake} que permite realizar la calibración (o ajuste) de las muestras a partir de objetivos de población conocidos Aquí se puede acceder a la fuente. Se trata de una función que implementa el método de calibración iterativa.

El método de calibración iterativa se repite varias veces hasta que se alcanza la convergencia. En cada iteración, los pesos de la muestra se ajustan para que las proporciones de las variables calibradas se acerquen a las proporciones de la población objetivo. Luego, se utilizan estos nuevos pesos ajustados para calcular las proporciones nuevamente, y el proceso se repite hasta que las proporciones convergen a los valores deseados

A diferencia de paquetes como {survey} con {anesrake} no es necesario tener un diseño de muestreo creado previamente para utilizarlo sino que puede realizarse directamente con la base de encuestas y definir los objetivos de calibración en forma de una lista.

Para dicha tarea se utilizarán las variables sexo, edad y niv_educativo . A continuación se obtienen los valores poblacionales de la Encuesta Permanente de Hogares - EPH del año 2015 en función de estas variables demográficas

# cargo archivos 

ponderador_sexo <- read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "sexo")
ponderador_edad <- read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "edad")
ponderador_educa <- read_xlsx("Consigna y materiales TP1/Materiales de referencia/Sociodemograficos.xlsx",sheet = "educa")

Buenos Aires

# listado de ponderadores
targets_baires <- list(pon_sexo_baires,pon_edad_baires,pon_educ_baires)

# nombres del df
names(targets_baires) <- c("sexo","edad","ne_bsas")

# muestro los ponderadores
targets_baires
## $sexo
##    Varón    Mujer 
## 0.479009 0.520991 
## 
## $edad
##     18-29     30-49     50-65       >65 
## 0.2524552 0.4031634 0.2174784 0.1269029 
## 
## $ne_bsas
##         P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo 
##           0.3258950           0.4614199           0.2126851
base_baires <-  as.data.frame(df_gba_sin_NA)


# creo ponderacion_eph con anesrake
weights_baires <- anesrake(inputter = targets_baires, dataframe = base_baires, caseid = base_baires$ua, type = "nolim") 
## [1] "Raking converged in 31 iterations"
# unimos
base_baires$ponderacion_eph  <- unlist(weights_baires[1])

print(paste("la cantidad de iteraciones necesarias para realizar la ponderación de la muestra fue de", weights_baires$iterations, "iteraciones"))
## [1] "la cantidad de iteraciones necesarias para realizar la ponderación de la muestra fue de 31 iteraciones"

La base_baires fue ponderada en 31 iteraciones. Observamos la distribución en función de la variable voto_acotado

df_gba_summary <- base_baires %>%
  group_by(voto_acotado) %>%
  summarise(n = n_distinct(ua),
            n_pond = sum(ponderacion_eph)) %>%
  mutate(prop_n = (n / sum(n))*100,
         prop_pond = (n_pond / sum(n_pond))*100) %>%
  pivot_longer(cols = c(prop_n, prop_pond), names_to = "Tipo de ponderación", values_to = "Porcentaje") %>%
  mutate(`Tipo de ponderación` = ifelse(`Tipo de ponderación` == "prop_n", "No Ponderado", "Ponderado"))

# Graficamos

ggplot(df_gba_summary, aes(x = voto_acotado, y = Porcentaje, fill = `Tipo de ponderación`)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Voto acotado ponderado y sin ponderar",
       x = "Voto acotado",
       y = "Porcentaje",
       fill = "Tipo de muestra") +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) + scale_fill_brewer(palette = "Accent") + 
  theme_light() +
    scale_fill_brewer(palette = "Set3")

Córdoba

Repetimos el procedimiento con el df de Córdoba:

# creo la lista de ponderadores
targets_cordoba <- list(pon_sexo_cordoba,pon_edad_cordoba,pon_educ_cordoba)

# pongo los mismos nombres de las variables del df
names(targets_cordoba) <- c("sexo","edad","ne_cba")

# los ponderadores para iterar
targets_cordoba
## $sexo
##     Varón     Mujer 
## 0.4667904 0.5332096 
## 
## $edad
##     18-29     30-49     50-65       >65 
## 0.2817004 0.3795721 0.2026046 0.1361230 
## 
## $ne_cba
##         P. Completa Sec. Comp-Terc. Inc Terc/Univ. Completo 
##           0.2382054           0.3958940           0.3659006
base_cordoba <-  as.data.frame(df_cordoba_sin_NA)

# creo ponderacion_eph con anesrake
weights_cordoba <- anesrake(inputter = targets_cordoba, dataframe = base_cordoba, caseid = base_cordoba$ua, type = "nolim") 
## [1] "Raking converged in 23 iterations"
print(paste("la cantidad de iteraciones necesarias para realizar la ponderación de la muestra fue de", weights_cordoba$iterations, "iteraciones"))
## [1] "la cantidad de iteraciones necesarias para realizar la ponderación de la muestra fue de 23 iteraciones"
# unimos
base_cordoba$ponderacion_eph  <- unlist(weights_cordoba[1])

Vemos que se necesitaron 23 iteraciones para ponderar nuestra muestra. A continuación se muestra la nueva distribución población en función de la variable voto_acotado

df_cba_summary <- base_cordoba %>%
  group_by(voto_acotado) %>%
  summarise(n = n_distinct(ua),
            n_pond = sum(ponderacion_eph)) %>%
  mutate(prop_n = (n / sum(n))*100,
         prop_pond = (n_pond / sum(n_pond))*100) %>%
  pivot_longer(cols = c(prop_n, prop_pond), names_to = "Tipo de ponderación", values_to = "Porcentaje") %>%
  mutate(`Tipo de ponderación` = ifelse(`Tipo de ponderación` == "prop_n", "No Ponderado", "Ponderado"))

# Graficamos
ggplot(df_cba_summary, aes(x = voto_acotado, y = Porcentaje, fill = `Tipo de ponderación`)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Comparación entre el Voto Acotado ponderado y sin ponderar",
       x = "Voto acotado",
       y = "Porcentaje",
       fill = "Tipo de muestra") +
  scale_y_continuous(labels = scales::percent_format(scale = 1)) +
  theme_minimal() +
    scale_fill_brewer(palette = "Set3")

Potencial Electoral

En este apartado se buscará evaluar el potencial electoral de los principales candidatos a Presidente (Macri y Scioli) mediante la técnica de pisos y techos.

Cálculo del voto Potencial

Se entiende por voto potencial a la estimación del porcentaje máximo de votos que un candidato podría obtener en una elección. Para calcular el voto potencial, se consideran tres grupos de votantes:

  • Votantes Seguros: Son aquellos que ya han manifestado su intención de votar por un candidato específico y no cambiarán su elección. Para calcular esto se utilizarán las variables voto_acotado y voto_cantidato

  • Votantes Indecisos: Son aquellos que aún no han decidido por quién votar y están considerando diferentes opciones.

  • Votantes que No Votarían: Son aquellos que han manifestado que no votarían por un candidato específico bajo ninguna circunstancia. Para ello, se utilizará la variable jamas_votaría

El voto potencial se calcula restando el porcentaje de votantes que no votarían del 100% y luego restando el porcentaje de votantes seguros. Es decir:

Voto Potencial = 100% - Porcentaje de Votantes No Votarían - Porcentaje de Votantes Seguros

El resultado es el porcentaje máximo de votos que un candidato podría obtener si lograra atraer a todos los votantes indecisos. .

Buenos Aires

En primer lugar, se crea la variable voto_final imputando los valores de voto_acotado para aquellos casos en donde el encuestado No sabe

#unique(base_baires$voto_candidato)
df_potencial_ba <- base_baires |> 
  mutate(voto_final = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato),
         voto_final = case_when(
           voto_final == 1 ~ "Daniel Scioli",
           voto_final == 2 ~ "Mauricio Macri",
           voto_final == 3 ~ "Sergio Massa",
           voto_final == 4 ~ "Margarita Stolbizer",
           voto_final == 5 ~ "Nicolas Del Caño",
           voto_final == 6 ~ "Adolfo Rodriguez Saa",
           voto_final == 8 ~ "Ninguno / En Blanco",
           voto_final == 9 ~ "No Sabe"))

# Calculamos la intención de voto

#piso
df_baires_intencion <- df_potencial_ba %>%
  group_by(voto_final) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_votaria = (tot/sum(df_potencial_ba$ponderacion_eph))*100) %>%
  arrange(desc(porcentaje_votaria)) |> 
  rename("candidato" = voto_final) |> 
  select(-tot)


#techo
df_baires_techo <- df_potencial_ba %>%
  group_by(jamas_votaria) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_nunca_votaria = (tot/sum(df_potencial_ba$ponderacion_eph))*100) |> 
  rename("candidato" = jamas_votaria)|> 
  select(-tot)


#unimos
df_pe_gba <- left_join(df_baires_techo, df_baires_intencion, by = "candidato")

#potencial

df_pe_gba <-df_pe_gba |> 
  mutate(porcentaje_potencial = 100-(porcentaje_votaria+porcentaje_nunca_votaria))

# Filtramos por los candidatos solicitados
df_pe_gba <- df_pe_gba %>%
  filter(candidato %in% c("Daniel Scioli", "Mauricio Macri"))

# Seleccionar columnas relevantes para el gráfico
cols <- c("porcentaje_votaria", "porcentaje_potencial", "porcentaje_nunca_votaria")

# Graficamos 
df_pe_gba |> 
  pivot_longer(cols, names_to = "tipo_voto",values_to = "prop") |> ggplot() +
 aes(x = candidato, y = prop, fill = tipo_voto,label = paste0(round(prop, 1), "%")) +
 geom_col() +
 scale_fill_manual(values = c(porcentaje_nunca_votaria = "#9E0142", 
porcentaje_potencial = "#81CBA6", porcentaje_votaria = "#5E4FA2")) +
 labs(x = " ", y = " ", title = "Potencial electoral Buenos Aires", 
 subtitle = "Mauricio Macri y Daniel Scioli - 2015", fill = "Tipo de voto") +
 coord_flip() +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size = 13L, 
 face = "bold", hjust = 0.5)) +
  geom_text(position = position_stack(vjust = 0.5), size = 4, color = "black") 

Córdoba

#unique(base_baires$voto_candidato)
df_potencial_cba <- base_cordoba |> 
  mutate(voto_final = ifelse(voto_candidato == "No Sabe", voto_acotado, voto_candidato),
         voto_final = case_when(
           voto_final == 1 ~ "Daniel Scioli",
           voto_final == 2 ~ "Mauricio Macri",
           voto_final == 3 ~ "Sergio Massa",
           voto_final == 4 ~ "Margarita Stolbizer",
           voto_final == 5 ~ "Nicolas Del Caño",
           voto_final == 6 ~ "Adolfo Rodriguez Saa",
           voto_final == 8 ~ "Ninguno / En Blanco",
           voto_final == 9 ~ "No Sabe"))

# Calculamos la intención de voto

#piso
df_cordoba_intencion <- df_potencial_cba %>%
  group_by(voto_final) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_votaria = (tot/sum(df_potencial_cba$ponderacion_eph))*100) %>%
  arrange(desc(porcentaje_votaria)) |> 
  rename("candidato" = voto_final) |> 
  select(-tot)


#techo
df_cordoba_techo <- df_potencial_cba %>%
  group_by(jamas_votaria) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_nunca_votaria = (tot/sum(df_potencial_ba$ponderacion_eph))*100) |> 
  rename("candidato" = jamas_votaria)|> 
  select(-tot)


#unimos
df_pe_cba <- left_join(df_cordoba_techo, df_cordoba_intencion, by = "candidato")

#potencial

df_pe_cba <-df_pe_cba |> 
  mutate(porcentaje_potencial = 100-(porcentaje_votaria+porcentaje_nunca_votaria))

# Filtramos por los candidatos solicitados
df_pe_cba <- df_pe_cba %>%
  filter(candidato %in% c("Daniel Scioli", "Mauricio Macri"))

# Seleccionar columnas relevantes para el gráfico
cols <- c("porcentaje_votaria", "porcentaje_potencial", "porcentaje_nunca_votaria")

# Graficamos 
df_pe_cba |> 
  pivot_longer(cols, names_to = "tipo_voto",values_to = "prop") |> ggplot() +
 aes(x = candidato, y = prop, fill = tipo_voto,label = paste0(round(prop, 1), "%")) +
 geom_col() +
 scale_fill_manual(values = c(porcentaje_nunca_votaria = "#9E0142", 
porcentaje_potencial = "#81CBA6", porcentaje_votaria = "#5E4FA2")) +
 labs(x = " ", y = " ", title = "Potencial electoral Córdoba", 
 subtitle = "Mauricio Macri y Daniel Scioli - 2015", fill = "Tipo de voto") +
 coord_flip() +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 15L, hjust = 0.5), plot.subtitle = element_text(size = 13L, 
 face = "bold", hjust = 0.5)) +
  geom_text(position = position_stack(vjust = 0.5), size = 4, color = "black") 

Potencial Electoral Cruzado

A continuación se realiza otra forma de analizar el potencial electoral y es teniendo en cuenta los votos “en disputa”

  • Votaría al candidato: Representa el porcentaje de personas que tienen la intención de votar por el candidato en cuestión.

  • En disputa: Representa el porcentaje de personas que todavía no han decidido su voto (indecisos)

  • Jamás votaría al candidato: Representa el porcentaje de personas que han manifestado que nunca votarían por el candidato.

En este punto lo que se realiza es en los casos en donde no se vota a ninguno de los candidatos principales en voto_final se imputa el valor “indeciso” y, para los casos en donde en jamás_votaría se eligieron candidatos que no son ni Mauricio Macri y Daniel Scioli se imputa el valor “indeciso”

Buenos Aires

df_potencial_ba_cruz <- df_potencial_ba %>%
  filter(! voto_final == "Ninguno / En Blanco") |> 
  mutate(voto_final = ifelse(
    !(voto_final == "Daniel Scioli" & voto_final == "Mauricio Macri"), "Indeciso", voto_final), # indeciso: voto final no es ni MM ni DS
    nunca_final = ifelse(jamas_votaria == "Daniel Scioli" | jamas_votaria == "Mauricio Macri",jamas_votaria, "En disputa"),
    nunca_final = ifelse(nunca_final == 1, "Daniel Scioli", 
                         ifelse(nunca_final == 2, "Mauricio Macri",
                                nunca_final)))# En disputa los que no elijen a MM y DS como jamas votaria

# Calculo totales
ba_cruzado <- df_potencial_ba_cruz %>%
  group_by(voto_final, nunca_final) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_potencial = round(tot/sum(df_potencial_ba$ponderacion_eph)*100,2)) |>
  select(-tot) |> 
  pivot_wider(names_from = nunca_final, values_from = porcentaje_potencial)


# mostramos
ba_cruzado  %>%
  kableExtra::kable(caption = "Potencial Electoral Cruzado - Mauricio Macri y Daniel Scioli (2015) - Buenos Aires") %>%
  kableExtra::kable_styling(bootstrap_options = "responsive")
Potencial Electoral Cruzado - Mauricio Macri y Daniel Scioli (2015) - Buenos Aires
voto_final Daniel Scioli En disputa Mauricio Macri
Indeciso 29.71 14.51 35.54

Córdoba

df_potencial_cba_cruz <- df_potencial_cba %>%
  filter(! voto_final == "Ninguno / En Blanco") |> 
  mutate(voto_final = ifelse(
    voto_final != "Daniel Scioli" & voto_final != "Mauricio Macri", "Indeciso", voto_final), # indeciso: voto final no es ni MM ni DS
    nunca_final = ifelse(jamas_votaria == "Daniel Scioli" | jamas_votaria == "Mauricio Macri",jamas_votaria, "En disputa"),
    nunca_final = ifelse(nunca_final == 1, "Daniel Scioli", 
                         ifelse(nunca_final == 2, "Mauricio Macri",
                                nunca_final)))# En disputa los que no elijen a MM y DS como jamas votaria

# Calculo totales
cba_cruzado <- df_potencial_cba_cruz %>%
  group_by(voto_final, nunca_final) %>%
  summarise(tot = sum(ponderacion_eph)) |>
  mutate(porcentaje_potencial = round(tot/sum(df_potencial_ba$ponderacion_eph)*100,2)) |>
  select(-tot) |> 
  pivot_wider(names_from = nunca_final, values_from = porcentaje_potencial)


# mostramos

cba_cruzado  %>%
  kableExtra::kable(caption = "Potencial Electoral Cruzado - Mauricio Macri y Daniel Scioli (2015) - Córdoba") %>%
  kableExtra::kable_styling(bootstrap_options = "responsive")
Potencial Electoral Cruzado - Mauricio Macri y Daniel Scioli (2015) - Córdoba
voto_final Daniel Scioli En disputa Mauricio Macri
Daniel Scioli 0.91 2.88 0.90
Indeciso 40.24 8.54 1.40
Mauricio Macri 1.28 1.77 17.79

Comportamiento electoral

En este apartado se buscará seleccionar un conjunto de indicadores que den cuenta de dos de las perspectivas teóricas vistas en la bibliografía sobre comportamiento electoral y evaluar el impacto de dichos indicadores en la decisión de voto utilizando al menos dos herramientas de análisis comparando los resultados entre ambas ciudades

Existen tres modelos dentro de la teoría del comportamiento electoral: El modelo sociológico, el modelo psico-social y, el modelo racional-económico. Para el desarrollo de este apartado se seleccionó el modelo racional y, el modelo sociológico

Modelo Racional

El Modelo Racional de comportamiento electoral se basa en la idea de que los votantes toman decisiones electorales de manera racional y maximizan sus intereses personales y preferencias al elegir a qué candidato o partido votar. Este enfoque se deriva de la teoría económica y se centra en la idea de que los individuos actúan como “homo economicus”, es decir, como seres racionales y egoístas que buscan maximizar su bienestar personal. En el contexto electoral, el modelo racional asume que los votantes evalúan cuidadosamente las opciones políticas disponibles y toman decisiones en función de cómo creen que cada candidato o partido cumplirá con sus preferencias y necesidades. En este modelo, el electorado responsabiliza a los actores políticos del Estado de la economía y votan en función de la evaluación que realizan al respecto

En este marco, se realizará una clusterización con kmeans de la muestra para analizar la relación de las variables económicas en el voto al Frente para la Victoria (FPV). Se elige este partido con el objetivo de evaluar si, en función de las variables económicas y de gestión, el electorado elige continuar con el gobierno oficialista o prefiere cambiar, y qué variables influyen en dicha decisión. Para dicho análisis se utilizarán las variables gestion_cristina, economia_pais_2_anos, economia_fliar_2_anos, continuidad_o_cambio, voto_acotado y ponderacion_eph

Buenos Aires

En primer lugar, se crea un df con las variables que podrían explicar el voto al Frente para la Victoria en función del modelo relacional. Se construirá una variable binaria que sea ¿Vota al Frente para la Victoria (FPV)? “Sí, No” a partir de la variable voto_acotado

# Observamos las variables y su relación 
comp_elect_bsas <- df_potencial_ba |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli" , "Si", "No")) |> 
  select(gestion_cristina, economia_fliar_2_anos, economia_pais_2_anos, continuidad_o_cambio,voto_oficialista, ua, ponderacion_eph, voto_final)

Analizamos la relación entre las variables y voto_oficialista

comp_elect_bsas |> 
  group_by(voto_oficialista, gestion_cristina) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_bsas$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = gestion_cristina, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#CE276C", Si = "#4FA292")) +
 labs(x = " ", y = " ", title = "Valoración de la gestión de CFK según voto al Frente para la Victoria", 
 subtitle = "Buenos Aires - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

Se observa que quienes votan al FPV en voto_acotado, el 32% aprueba la gestión de cristina 2007-2015. Y, el 44,8% que no aprueba el desempeño en la gestión no votará al FPV

comp_elect_bsas |> 
  group_by(voto_oficialista, economia_fliar_2_anos) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_bsas$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(economia_fliar_2_anos,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#eafd17", Si = "#fd1777")) +
 labs(x = " ", y = " ", title = "Valoración de la economía familiar en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Buenos Aires - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En la misma linea, la mayoría de los que considera que empeoró su situación económica familiar no votará al FPV

comp_elect_bsas |> 
  group_by(voto_oficialista, economia_pais_2_anos) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_bsas$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(economia_pais_2_anos,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#17fd9d", Si = "#9d17fd")) +
 labs(x = " ", y = " ", 
      title = "Valoración de la economía en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Buenos Aires - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En este caso, sucede igual que con la variable anterior, entre quienes votarán al FPV hay valoraciones más positivas de la situación económica de los últimos dos años

comp_elect_bsas |> 
  group_by(voto_oficialista, continuidad_o_cambio) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_bsas$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(continuidad_o_cambio,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#9dfd17", Si = "#7717fd")) +
 labs(x = " ", y = " ", 
      title = "Valoración de la economía en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Buenos Aires - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En este gráfico vemos que los que votarían al FPV consideran que se deben mantener las políticas actuales y mantener algunas y cambiar otras a diferencia de quienes no los votarían

#unique(df_potencial_ba$voto_final) 
comp_elect_bsas <- df_potencial_ba |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli" , 1, 0)) 

# armo df para crear dummys
df_dummys <- df_potencial_ba |> 
  dplyr::select(gestion_cristina, economia_fliar_2_anos, economia_pais_2_anos, continuidad_o_cambio)

#Creo variables dummys
dummy<- data.frame(sapply(df_dummys,function(x) data.frame(model.matrix(~x-1,data =df_dummys))[,-1])) |> 
  clean_names()

# uno dfs
comp_elect_bsas <- comp_elect_bsas|> 
  dplyr::select(ua, voto_oficialista, ponderacion_eph)|> 
   cbind(dummy)

Cómo no es posible ponderar desde la propia función de kmeans, se replicarán las filas de la base en función de la ponderación. Además se crearon variables dummy con las ya mencionadas para poder realizar el análisis.

df_cluster <- comp_elect_bsas

# replicamos
df_cluster <- df_cluster[rep(seq_len(nrow(df_cluster)), df_cluster$ponderacion_eph), ]

# mostramos
df_cluster |> 
  head() |> 
  kable()
ua voto_oficialista ponderacion_eph gestion_cristina_x_aprueba gestion_cristina_x_no_sabe economia_fliar_2_anos_x_empeoro economia_fliar_2_anos_x_se_mantuvo_igual economia_fliar_2_anos_x_no_sabe economia_pais_2_anos_x_empeoro economia_pais_2_anos_x_se_mantuvo_igual economia_pais_2_anos_x_no_sabe continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras continuidad_o_cambio_x_cambiar_todas continuidad_o_cambio_x_no_sabe
1 1 1 1.537161 1 0 0 0 0 0 1 0 1 0 0
4 4 1 1.265581 1 0 0 0 0 0 1 0 0 0 0
5 5 0 1.454980 0 0 1 0 0 1 0 0 1 0 0
8 8 1 1.265581 1 0 0 0 0 0 0 0 1 0 0
9 9 1 1.215594 1 0 0 1 0 0 0 0 1 0 0
11 11 0 1.767203 1 0 0 0 0 0 0 0 1 0 0
df_cluster <- df_cluster |> 
  dplyr::select(-ponderacion_eph, -ua)

# armamos el plot
k_values <- 2:10
wss <- numeric(length(k_values))

for (k in k_values) {
  km <- kmeans(df_cluster,centers = k, nstart = 10)
  wss[k-1] <- sum(km$withinss)
}

# Realizo el método de Elbow para saber cuantos clusters realizar
elbow_plot <- data.frame(K = k_values, WSS = wss) %>%
  ggplot(aes(x = K, y = WSS)) +
  geom_line(colour = "#440154") +
  geom_point(colour = "#014454") +
  labs(x = "Número de clústeres (K)", y = "Suma de cuadrados dentro del clúster (WSS)",
       title = "Método del Codo para determinar \n el número óptimo de clústeres") +
  theme_light() +
  theme(
    plot.title = element_text(size = 16L,
    face = "bold",
    hjust = 0.5),
    plot.subtitle = element_text(face = "italic",
    hjust = 0.5)
  )

elbow_plot

Vamos a realizar el análisis con 3 clusters

# semilla
set.seed(123)

# realizamos el cluster
kmeans_result <- kmeans(df_cluster, centers = 3 ) 

# lo agregamos al dataset 
df_cluster$cluster <- kmeans_result$cluster

# resumen
aggregate(. ~ cluster, data = df_cluster, FUN = mean) |> 
  kable()
cluster voto_oficialista gestion_cristina_x_aprueba gestion_cristina_x_no_sabe economia_fliar_2_anos_x_empeoro economia_fliar_2_anos_x_se_mantuvo_igual economia_fliar_2_anos_x_no_sabe economia_pais_2_anos_x_empeoro economia_pais_2_anos_x_se_mantuvo_igual economia_pais_2_anos_x_no_sabe continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras continuidad_o_cambio_x_cambiar_todas continuidad_o_cambio_x_no_sabe
1 0.0327869 0.0655738 0.2459016 0.0327869 0.8196721 0.0655738 0.4262295 0.4426230 0.0000000 0.8688525 0.0983607 0.0327869
2 0.9204545 0.8863636 0.0227273 0.0568182 0.3409091 0.0227273 0.0568182 0.3295455 0.0000000 0.3977273 0.0000000 0.0000000
3 0.0000000 0.1044776 0.1194030 0.9104478 0.0000000 0.0000000 0.8059701 0.0149254 0.0895522 0.4029851 0.5074627 0.0895522

Queda así los encuestados divididos en tres grupos:

Un primer grupo de encuestados al que podríamos llamar Los Escépticos. En este cluster solo un 3% en promedio tiene la intención de votar al FPV. En este sentido, este grupo tiene una baja proporción de aprobación de la gestión de cristina (gestion_cristina_x_aprueba) y una alta proporción de gestion_cristina_x_no_sabe. En cuanto a la percepción económica, tienen una baja proporción de economia_fliar_2_anos_x_empeoro y economia_pais_2_anos_x_empeoro, lo que sugiere que no creen que la economía familiar o la del país haya empeorado en los años previos. En términos de preferencia por la continuidad o cambio, tienen una alta proporción de continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras. Esto indica que prefieren mantener algunas políticas y cambiar otras.

Un segundo cluster al que denominaremos Los Leales con un 92% de intención de votar al Frente para la Victoria. Este grupo se caracteriza por tener una alta proporción de aprobación de la gestión del gobierno de CFK,una baja proporción de economia_fliar_2_anos_x_empeoro y economia_pais_2_anos_x_empeoro lo que sugiere que no creen que la economía familiar o la del país hayan empeorado en los últimos 2 años. En términos de preferencia por la continuidad o cambio, tienen una baja proporción de continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras y continuidad_o_cambio_x_cambiar_todas, lo que indica que prefieren mantener las políticas actuales

Y, por último, Un tercer grupo de Los desencantados que no votará por el FPV con una baja proporción de gestion_cristina_x_aprueba y gestion_cristina_x_no_sabe, lo que indica que desaprueban la gestión de CFK. Respecto a la percepción económica, tienen una alta proporción de economia_fliar_2_anos_x_empeoro y economia_pais_2_anos_x_empeoro, lo que sugiere que creen que la economía familiar y la del país empeoró en los últimos años. Respecto a las políticas, tienen una alta proporción de continuidad_o_cambio_x_cambiar_todas

# Le ponemos los nombres a los clusters
cluster_names <- c("1-Escepticos", "2-Leales", "3-Desencantados")

kmeans_result$cluster <- cluster_names[kmeans_result$cluster]

# Visualizamos
fviz_cluster(kmeans_result, data = df_cluster, geom = "point") +
  theme_light() +  theme(legend.position = "bottom") +
  labs(title = "Resultados clustering K-means - Buenos Aires")

Córdoba

Se realizará el mismo procedimiento que con el df de Buenos Aires. En primer lugar se crea un df con las variables que podrían explicar el voto al FPV en función del modelo racional. Se construirá una variable binaria que sea ¿Vota al Frente para la Victoria (FPV)? “Sí, No” a partir de la variable voto_acotado

# Observamos las variables y su relación 
comp_elect_cba <- df_potencial_cba |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli" , "Si", "No")) |> 
  select(gestion_cristina, economia_fliar_2_anos, economia_pais_2_anos, continuidad_o_cambio,voto_oficialista, ua, ponderacion_eph, voto_final)

Analizamos la relación entre las variables y voto_oficialista

comp_elect_cba |> 
  group_by(voto_oficialista, gestion_cristina) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_cba$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = gestion_cristina, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#CE276C", Si = "#4FA292")) +
 labs(x = " ", y = " ", title = "Valoración de la gestión de CFK según voto al Frente para la Victoria", 
 subtitle = "Córdoba - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

Se observa que quienes votan al FPV en voto_acotado, el 19% aprueba la gestión de cristina 2007-2015. Y, el 59% que no aprueba el desempeño en la gestión no votará al FPV

comp_elect_cba |> 
  group_by(voto_oficialista, economia_fliar_2_anos) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_cba$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(economia_fliar_2_anos,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#eafd17", Si = "#fd1777")) +
 labs(x = " ", y = " ", title = "Valoración de la economía familiar en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Córdoba - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En este item, hay una alta proporción que considera que su situación económica familiar empeoró 43% y no votará al oficialismo

comp_elect_cba |> 
  group_by(voto_oficialista, economia_pais_2_anos) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_cba$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(economia_pais_2_anos,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#17fd9d", Si = "#9d17fd")) +
 labs(x = " ", y = " ", 
      title = "Valoración de la economía en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Córdoba- Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En este caso sucede igual que con la variable anterior, entre quienes votarán al FPV hay valoraciones más positivas de la situación económica de los últimos dos años

comp_elect_cba |> 
  group_by(voto_oficialista, continuidad_o_cambio) |> 
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(comp_elect_cba$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  ggplot() +
 aes(x = reorder(continuidad_o_cambio,porcentaje), y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#9dfd17", Si = "#7717fd")) +
 labs(x = " ", y = " ", 
      title = "Valoración de la economía en los últimos dos \n años según voto al Frente para la Victoria", 
 subtitle = "Córdoba - Ponderado en función de la eph", fill = "¿Vota al FPV?") +
 theme_light() +
 theme(legend.position = "top", 
 plot.title = element_text(size = 15L, face = "bold", hjust = 0.5), plot.subtitle = element_text(size = 12L, 
 face = "italic", hjust = 0.5))

En este gráfico vemos que si bien hay un alto porcentaje entre los que no votarían al FPV que desea cambiar las políticas (24%) la mayoría prediere mantener algunas y cambiar otras.

#unique(df_potencial_ba$voto_final) 
comp_elect_cba <- df_potencial_cba |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli" , 1, 0)) 

# armo df para crear dummys
df_dummys <- comp_elect_cba |> 
  dplyr::select(gestion_cristina, economia_fliar_2_anos, economia_pais_2_anos, continuidad_o_cambio)

#Creo las variables dummys
dummy<- data.frame(sapply(df_dummys,function(x) data.frame(model.matrix(~x-1,data =df_dummys))[,-1])) |> 
  clean_names()

# uno dfs
comp_elect_cba <- comp_elect_cba|> 
  dplyr::select(ua, voto_oficialista, ponderacion_eph)|> 
   cbind(dummy)

Al igual que con la base de Buenos Aires, cómo no es posible ponderar desde la propia función de kmeans, se replicarán las filas de la base en función de la ponderación. Además se crearon variables dummy con las ya mencionadas para poder realizar el análisis.

df_cluster <- comp_elect_cba

# replicamos
df_cluster <- df_cluster[rep(seq_len(nrow(df_cluster)), df_cluster$ponderacion_eph), ]

# mostramos
df_cluster |> 
  head() |> 
  kable()
ua voto_oficialista ponderacion_eph gestion_cristina_x_aprueba gestion_cristina_x_no_sabe economia_fliar_2_anos_x_empeoro economia_fliar_2_anos_x_se_mantuvo_igual economia_fliar_2_anos_x_no_sabe economia_pais_2_anos_x_empeoro economia_pais_2_anos_x_se_mantuvo_igual economia_pais_2_anos_x_no_sabe continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras continuidad_o_cambio_x_cambiar_todas continuidad_o_cambio_x_no_sabe
1 1 0 1.527288 0 0 1 0 0 0 1 0 0 1 0
3 3 0 1.035000 0 0 0 1 0 1 0 0 1 0 0
11 11 0 1.561429 0 0 1 0 0 1 0 0 1 0 0
12 12 0 1.209796 0 1 1 0 0 0 0 1 1 0 0
13 13 0 1.035000 0 0 0 1 0 1 0 0 0 1 0
14 14 0 1.058137 0 0 1 0 0 1 0 0 0 1 0

Al igual que con el df de Buenos Aires, vemos que al replicar con el ponderador hubo una disminución en la cantidad de registros

df_cluster <- df_cluster |> 
  dplyr::select(-ponderacion_eph, -ua)

# armamos el plot
k_values <- 2:10
wss <- numeric(length(k_values))

for (k in k_values) {
  km <- kmeans(df_cluster,centers = k, nstart = 10)
  wss[k-1] <- sum(km$withinss)
}

# Realizo el método de Elbow para saber cuantos clusters realizar
elbow_plot <- data.frame(K = k_values, WSS = wss) %>%
  ggplot(aes(x = K, y = WSS)) +
  geom_line(colour = "#440154") +
  geom_point(colour = "#014454") +
  labs(x = "Número de clústeres (K)", y = "Suma de cuadrados dentro del clúster (WSS)",
       title = "Método del Codo para determinar \n el número óptimo de clústeres") +
  theme_light() +
  theme(
    plot.title = element_text(size = 16L,
    face = "bold",
    hjust = 0.5),
    plot.subtitle = element_text(face = "italic",
    hjust = 0.5)
  )

elbow_plot

Vamos a realizar el análisis con 4 clusters

# semilla
set.seed(123)

# realizamos el cluster
kmeans_result <- kmeans(df_cluster, centers = 4 ) 


# lo agregamos al dataset 
df_cluster$cluster <- kmeans_result$cluster

# resumen
aggregate(. ~ cluster, data = df_cluster, FUN = mean) |> 
  kable()
cluster voto_oficialista gestion_cristina_x_aprueba gestion_cristina_x_no_sabe economia_fliar_2_anos_x_empeoro economia_fliar_2_anos_x_se_mantuvo_igual economia_fliar_2_anos_x_no_sabe economia_pais_2_anos_x_empeoro economia_pais_2_anos_x_se_mantuvo_igual economia_pais_2_anos_x_no_sabe continuidad_o_cambio_x_mantener_algunas_y_cambiar_otras continuidad_o_cambio_x_cambiar_todas continuidad_o_cambio_x_no_sabe
1 0.0000000 0.0000000 1.0000000 0.0714286 0.0000000 0.9285714 0.0000000 0.0000000 1 0.2142857 0.0000000 0.7857143
2 0.6666667 0.5454545 0.0606061 0.0303030 0.5454545 0.0909091 0.0000000 0.9696970 0 0.3939394 0.0606061 0.2727273
3 1.0000000 1.0000000 0.0000000 0.0000000 0.1000000 0.0333333 0.0000000 0.0000000 0 0.1666667 0.0000000 0.2000000
4 0.0190476 0.0476190 0.0095238 0.7333333 0.1523810 0.0095238 0.9238095 0.0380952 0 0.5333333 0.4190476 0.0285714

Queda así los encuestados divididos en cuatro grupos:

Cluster 1: Los desencantados Este grupo tiene un bajo voto por el FPV con un valor promedio cercano a 0. El apoyo a la gestión de Cristina es muy bajo, casi nulo. La percepción de la economía familiar en los últimos dos años es mayoritariamente negativa (71%) y consideran que empeoró. También tienen una percepción ambigüa de la economía del país, con un 92% que no sabe si mejoró o empeoró. Además, un 78$ no sabe si deberian continuar o cambiar las políticas

Cluster 2: Los Moderados En este grupo, el voto por el FPV es más alto, con un valor promedio de aproximadamente 0.66. Tienen una percepción mixta sobre la gestión de Cristina, con un 53% que aprueba su gestión. La percepción de la economía familiar en los últimos dos años es variada, con aproximadamente el 56% que cree que se mantuvo igual y el 31% que piensa que empeoró. Respecto a la economía del país, la mayoría (97%) cree que se mantuvo igual. La actitud hacia el cambio es menos pronunciada en este grupo.

Cluster 3: Los Leales Este grupo muestra un apoyo completo al FPV, con un voto promedio cercano a 1, lo que indica un alto apoyo a este partido político. Todos en este grupo aprueban la gestión de Cristina. En cuanto a la economía, la percepción sobre la economía familiar es predominantemente positiva, con solo el 10% que cree que se encuentra igual Además, creen que la economía del país también ha mejorado en su mayoría. Mostraron una fuerte preferencia por mantener algunas políticas actuales y cambiar otras.

Cluster 4: Los escepticos En este grupo, el voto por el FPV es bajo, con un valor promedio de aproximadamente 0.02. La aprobación de la gestión de Cristina es baja, con solo el 4% que aprueba. La percepción de la economía familiar en los últimos dos años es mayoritariamente negativa, con un 73% que cree que empeoró. También consideran que la economía del país empeoró en un 92%. Tienen una preferencia por cambiar algunas políticas actuales y mantener otras.

# Le ponemos los nombres a los clusters
cluster_names <- c("1-Desencantados", "2-Moderados", "3-Leales", "4-Escepticos")

kmeans_result$cluster <- cluster_names[kmeans_result$cluster]

# Visualizamos
fviz_cluster(kmeans_result, data = df_cluster, geom = "point") +
  theme_light() +  theme(legend.position = "bottom") +
  labs(title = "Resultados clustering K-means - Córdoba")

Conclusiones

Se puede afirmar entonces que en el caso de la Provincia de Buenos Aires y Córdoba hay una relación entre la percepción de la situación económica y el voto o no por la continuidad del gobierno oficialista. Es decir, quienes consideran que su situación económica empeoró en lineas generales eligen votar candidatos de otros frentes y prefieren cambios en las políticas públicas elaboradas. Por otro lado, a diferencia de Buenos Aires donde hay grupos más marcados que votarían y no votarían al FPV, en el caso de córdoba existe un cuarto grupo más moderado que muestra un voto relativamente alto por el FPV y una percepción mixta sobre la gestión de Cristina.

Modelo sociológico

El Modelo Sociológico por otro lado se enfoca en cómo factores sociales y demográficos influyen en las decisiones de voto de los ciudadanos Esta teoría considera que los contextos sociales y las características de los votantes tienen un impacto significativo en sus preferencias políticas y en su comportamiento electoral. De esta manera, el elector forma sus opiniones y opciones políticas en función de las posiciones y características de su grupo de pertenencia en la sociedad en general

Para analizar la intención de voto en función de la teoría de comportamiento electoral sociológica se utilizarán las variables edad, sexo,niv_educativo. Se llevará a cabo una regresión logística con el objetivo de analizar la relación entre estas variables predictoras y la variable de resultado (voto_oficialista) y determinar si existe una asociación significativa entre ellas.

Buenos Aires

#colnames(df_potencial_ba)
df_socio_pba <-  df_potencial_ba |> 
  select(ua,edad,sexo,niv_educativo,ponderacion_eph, voto_acotado) |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli", "Si","No")) |> 
  select(-voto_acotado)

rownames(df_socio_pba) <- df_socio_pba$ua

# Graficamos
df_socio_pba |> 
  group_by(voto_oficialista, edad) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_pba$ponderacion_eph),
         porcentaje = porcentaje*100)  %>%
 ggplot() +
 aes(x = edad, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#66C2A5", 
Si = "#9F13C5")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según la edad de los encuestados", 
 subtitle = "Buenos Aires - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5))

Entre los que votan al oficialismo el rango etario se encuentra más distribuido entre los 18 y 65 años. Por el otro lado, los votantes de la oposición se concentran entre los 30-49 en mayor medida

df_socio_pba |> 
  group_by(voto_oficialista, sexo) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_pba$ponderacion_eph),
         porcentaje = porcentaje*100) %>%
 ggplot() +
 aes(x = sexo, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#7ec492", 
Si = "#c47e92")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según el sexo de los encuestados", 
 subtitle = "Buenos Aires - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5))

Entre los votantes del FDT hay mayor proporción de mujeres. En cambio en el voto no oficialista la distribución se encuentra más pareja

df_socio_pba |> 
  group_by(voto_oficialista, niv_educativo) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_pba$ponderacion_eph),
         porcentaje = porcentaje*100) %>%
 ggplot() +
 aes(x = niv_educativo, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#ffce1c", 
Si = "#1cceff")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según el nivel \n educativo de los encuestados", 
 subtitle = "Buenos Aires - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5)) +
  coord_flip()

El voto no oficialista se concentra mayormente entre quienes tienen primario completo y secundario. Y, el voto oficialista entre quienes tienen secundario, primario y terciario.

Realizamos la regresión logística para analizar la relación entre las variables y el voto al oficialismo

# Creo variables dummys

# armo df para crear dummys
df_dummys <- df_socio_pba |> dplyr::select(-ponderacion_eph, -ua, -voto_oficialista,-sexo)

#Creating Dummy Variables
dummy<- data.frame(sapply(df_dummys,function(x) data.frame(model.matrix(~x-1,data =df_dummys))[,-1])) |> 
  clean_names()

# uno dfs
df_logit_ba <- df_socio_pba|> 
  dplyr::select(ponderacion_eph, sexo, voto_oficialista)|>
  mutate(sexo = ifelse(sexo == "Mujer", 1, 0),
         voto_oficialista = ifelse(voto_oficialista == "Si", 1, 0)) |> 
   cbind(dummy) 

#colnames(df_logit_ba)

# Modelo con todas las variables
modelo <- glm(voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 +sexo + niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo + voto_oficialista , data = df_logit_ba, family = binomial, weights = ponderacion_eph)

summary(modelo)
## 
## Call:
## glm(formula = voto_oficialista ~ edad_x30_49 + edad_x50_65 + 
##     edad_x_65 + sexo + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + 
##     niv_educativo_x_universitario_incompleto_o_completo + voto_oficialista, 
##     family = binomial, data = df_logit_ba, weights = ponderacion_eph)
## 
## Coefficients:
##                                                     Estimate Std. Error z value
## (Intercept)                                          -0.6796     0.3149  -2.158
## edad_x30_49                                          -0.5910     0.2769  -2.135
## edad_x50_65                                          -0.2955     0.3325  -0.889
## edad_x_65                                            -0.5365     0.4055  -1.323
## sexo                                                  0.4162     0.2327   1.788
## niv_educativo_x_secundario_incompleto_o_completo      0.2870     0.3065   0.936
## niv_educativo_x_terciario_no_univ_incompleto          0.4330     0.3713   1.166
## niv_educativo_x_terciario_no_univ_completo            0.9043     0.5057   1.788
## niv_educativo_x_universitario_incompleto_o_completo   0.6501     0.3720   1.748
##                                                     Pr(>|z|)  
## (Intercept)                                           0.0309 *
## edad_x30_49                                           0.0328 *
## edad_x50_65                                           0.3742  
## edad_x_65                                             0.1859  
## sexo                                                  0.0737 .
## niv_educativo_x_secundario_incompleto_o_completo      0.3490  
## niv_educativo_x_terciario_no_univ_incompleto          0.2435  
## niv_educativo_x_terciario_no_univ_completo            0.0737 .
## niv_educativo_x_universitario_incompleto_o_completo   0.0805 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 494.18  on 372  degrees of freedom
## Residual deviance: 477.14  on 364  degrees of freedom
## AIC: 453.67
## 
## Number of Fisher Scoring iterations: 4

Utilizando todas las variables sociodemográficas se observa que el nivel educativo es estadísticamente significativo para predecir el voto al oficialismo para los niveles universitario y terciario. Es decir que, a mayor nivel educativo mayor es el voto por el FPV. El sexo, por otro lado con un p-value de 0.0186 indica que manteniendo constantes las demás variables en el modelo, las mujeres (1) tienen más probabilidades de votar por el oficialismo en comparación con los hombres. A la inversa ocurre con edad_x30_49

A continuación, se utilizará el método STEPAIC que permite realizar el proceso de selección de variables mediante el Akaike (AIC). El AIC es una métrica que se utiliza para ocmparar diferentes modelos y seleccionar el mejor ajustado para los datos

#Usamos stepAIC para generar el mejor modelo
final_model <- MASS::stepAIC(modelo)
## Start:  AIC=453.67
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + 
##     niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo + 
##     voto_oficialista
## 
## 
## Step:  AIC=453.67
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + 
##     niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo
## 
##                                                       Df Deviance    AIC
## - edad_x50_65                                          1   477.93 452.46
## - niv_educativo_x_secundario_incompleto_o_completo     1   478.01 452.55
## - niv_educativo_x_terciario_no_univ_incompleto         1   478.49 453.02
## - edad_x_65                                            1   478.92 453.45
## <none>                                                     477.14 453.67
## - niv_educativo_x_universitario_incompleto_o_completo  1   480.19 454.72
## - niv_educativo_x_terciario_no_univ_completo           1   480.31 454.85
## - sexo                                                 1   480.35 454.89
## - edad_x30_49                                          1   481.71 456.25
## 
## Step:  AIC=451.27
## voto_oficialista ~ edad_x30_49 + edad_x_65 + sexo + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + 
##     niv_educativo_x_universitario_incompleto_o_completo
## 
##                                                       Df Deviance    AIC
## - edad_x_65                                            1   479.02 450.36
## - niv_educativo_x_secundario_incompleto_o_completo     1   479.52 450.86
## <none>                                                     477.93 451.27
## - niv_educativo_x_terciario_no_univ_incompleto         1   479.97 451.31
## - sexo                                                 1   480.94 452.28
## - niv_educativo_x_terciario_no_univ_completo           1   481.45 452.79
## - edad_x30_49                                          1   481.76 453.09
## - niv_educativo_x_universitario_incompleto_o_completo  1   482.08 453.42
## 
## Step:  AIC=449.24
## voto_oficialista ~ edad_x30_49 + sexo + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + 
##     niv_educativo_x_universitario_incompleto_o_completo
## 
##                                                       Df Deviance    AIC
## <none>                                                     479.02 449.24
## - niv_educativo_x_secundario_incompleto_o_completo     1   481.28 449.49
## - sexo                                                 1   481.60 449.81
## - niv_educativo_x_terciario_no_univ_incompleto         1   481.78 450.00
## - edad_x30_49                                          1   482.11 450.33
## - niv_educativo_x_terciario_no_univ_completo           1   482.88 451.09
## - niv_educativo_x_universitario_incompleto_o_completo  1   484.29 452.51
 # mostramos
summary(final_model)
## 
## Call:
## glm(formula = voto_oficialista ~ edad_x30_49 + sexo + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + 
##     niv_educativo_x_universitario_incompleto_o_completo, family = binomial, 
##     data = df_logit_ba, weights = ponderacion_eph)
## 
## Coefficients:
##                                                     Estimate Std. Error z value
## (Intercept)                                          -0.9545     0.2291  -4.167
## edad_x30_49                                          -0.4115     0.2356  -1.746
## sexo                                                  0.3655     0.2280   1.603
## niv_educativo_x_secundario_incompleto_o_completo      0.4292     0.2865   1.498
## niv_educativo_x_terciario_no_univ_incompleto          0.5862     0.3518   1.666
## niv_educativo_x_terciario_no_univ_completo            0.9885     0.5016   1.971
## niv_educativo_x_universitario_incompleto_o_completo   0.8087     0.3526   2.293
##                                                     Pr(>|z|)    
## (Intercept)                                         3.09e-05 ***
## edad_x30_49                                           0.0808 .  
## sexo                                                  0.1089    
## niv_educativo_x_secundario_incompleto_o_completo      0.1341    
## niv_educativo_x_terciario_no_univ_incompleto          0.0956 .  
## niv_educativo_x_terciario_no_univ_completo            0.0487 *  
## niv_educativo_x_universitario_incompleto_o_completo   0.0218 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 494.18  on 372  degrees of freedom
## Residual deviance: 479.02  on 366  degrees of freedom
## AIC: 449.24
## 
## Number of Fisher Scoring iterations: 4

Para este modelo la variable nivel educativo (universitario y terciario) es la que más podría predecir el voto al oficialismo junto con el rango de edad de 30-49 (a la inversa). Es decir, quienes se encuentran en ese rango de edad tienen menos probabilidad de votar al FPV

Córdoba

Repetimos el procedimiento para la base de Córdoba

#colnames(df_potencial_cba)
df_socio_cba <-  df_potencial_cba |> 
  select(ua,edad,sexo,niv_educativo,ponderacion_eph, voto_acotado) |> 
  mutate(voto_oficialista = ifelse(voto_acotado == "Daniel Scioli", "Si","No")) |> 
  select(-voto_acotado)


rownames(df_socio_cba) <- df_socio_cba$ua

df_socio_cba |> 
  group_by(voto_oficialista, edad) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_cba$ponderacion_eph),
         porcentaje = porcentaje*100)  %>%
 ggplot() +
 aes(x = edad, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#66C2A5", 
Si = "#9F13C5")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según la edad de los encuestados", 
 subtitle = "Córdoba - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5))

Entre los que votan al oficialismo el rango etario con mayor proporción es el de 30-49 años. Por el otro lado, los votantes de la oposición se concentran entre los 18-65 en mayor medida

df_socio_cba |> 
  group_by(voto_oficialista, sexo) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_cba$ponderacion_eph),
         porcentaje = porcentaje*100) %>%
 ggplot() +
 aes(x = sexo, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#7ec492", 
Si = "#c47e92")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según el sexo de los encuestados", 
 subtitle = "Córdoba - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5))

En ambos tipos de votantes (oficialistas y no oficialistas) hay una distribución bastante pareja entre los géneros

df_socio_cba |> 
  group_by(voto_oficialista, niv_educativo) |>  
  summarise(total = sum(ponderacion_eph)) |> 
  mutate(porcentaje = total/sum(df_socio_cba$ponderacion_eph),
         porcentaje = porcentaje*100) |> 
  select(-total)%>%
 ggplot() +
 aes(x = niv_educativo, y = porcentaje, fill = voto_oficialista) +
 geom_col() +
 scale_fill_manual(values = c(No = "#ffce1c", 
Si = "#1cceff")) +
 labs(x = " ", y = "%", title = "Voto al oficialismo según el nivel \n educativo de los encuestados", 
 subtitle = "Córdoba - Ponderado con eph", fill = "¿Vota al oficialismo?") +
 theme_light() +
 theme(legend.position = "top", plot.title = element_text(size = 16L, face = "bold", hjust = 0.5), 
 plot.subtitle = element_text(size = 14L, face = "italic", hjust = 0.5)) +
  coord_flip()

El voto oficialista se concentra mayormente entre quienes tienen primario completo y universitario Y, el voto no oficialista entre quienes tienen secundario, primario y terciario.

Realizamos la regresión logística para analizar la relación entre las variables

# Creo variables dummys
# armo df para crear dummys
df_dummys <- df_socio_cba |> dplyr::select(-ponderacion_eph, -ua, -voto_oficialista,-sexo)

# creo dummys
dummy<- data.frame(sapply(df_dummys,function(x) data.frame(model.matrix(~x-1,data =df_dummys))[,-1])) |> 
  clean_names()

# uno dfs
df_logit_cba <- df_socio_cba|> 
  dplyr::select(ponderacion_eph, sexo, voto_oficialista)|>
  mutate(sexo = ifelse(sexo == "Mujer", 1, 0),
         voto_oficialista = ifelse(voto_oficialista == "Si", 1, 0)) |> 
   cbind(dummy) 

#colnames(df_logit_ba)


# Modelo con todas las variables
modelo <- glm(voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 +sexo + niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo + voto_oficialista , data = df_logit_cba, family = binomial, weights = ponderacion_eph)

summary(modelo)
## 
## Call:
## glm(formula = voto_oficialista ~ edad_x30_49 + edad_x50_65 + 
##     edad_x_65 + sexo + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto + niv_educativo_x_terciario_no_univ_completo + 
##     niv_educativo_x_universitario_incompleto_o_completo + voto_oficialista, 
##     family = binomial, data = df_logit_cba, weights = ponderacion_eph)
## 
## Coefficients:
##                                                      Estimate Std. Error
## (Intercept)                                         -0.647359   0.312113
## edad_x30_49                                          0.366038   0.350193
## edad_x50_65                                         -0.827042   0.457562
## edad_x_65                                           -1.799367   0.652313
## sexo                                                 0.063499   0.291093
## niv_educativo_x_secundario_incompleto_o_completo    -1.380655   0.532217
## niv_educativo_x_terciario_no_univ_incompleto        -0.681470   0.444911
## niv_educativo_x_terciario_no_univ_completo          -0.021171   0.529485
## niv_educativo_x_universitario_incompleto_o_completo -0.003058   0.394030
##                                                     z value Pr(>|z|)   
## (Intercept)                                          -2.074  0.03807 * 
## edad_x30_49                                           1.045  0.29591   
## edad_x50_65                                          -1.807  0.07068 . 
## edad_x_65                                            -2.758  0.00581 **
## sexo                                                  0.218  0.82732   
## niv_educativo_x_secundario_incompleto_o_completo     -2.594  0.00948 **
## niv_educativo_x_terciario_no_univ_incompleto         -1.532  0.12560   
## niv_educativo_x_terciario_no_univ_completo           -0.040  0.96811   
## niv_educativo_x_universitario_incompleto_o_completo  -0.008  0.99381   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 361.04  on 319  degrees of freedom
## Residual deviance: 324.94  on 311  degrees of freedom
## AIC: 333.3
## 
## Number of Fisher Scoring iterations: 5

Utilizando todas las variables sociodemográficas, a diferencia del análisis en Buenos Aires se observa que, en este primer modelo, el sexo no es estadísticamente significativo para predecir el voto al oficialismo. El niv_educativo_x_secundario_incompleto_o_completo, por otro lado con un p-value de 0.00948 indica que manteniendo constantes las demás variables en el modelo, las personas con secundario tienen menos probabilidades de votar por el oficialismo en comparación con el resto. De la misma manera ocurre con edad_x_65 y edad_x50_65 .

A continuación se utilizará el método STEPAIC que permite realizar el proceso de selección de variables mediante el Akaike (AIC).

#Usamos stepAIC para generar el mejor modelo
final_model <- MASS::stepAIC(modelo)
## Start:  AIC=333.3
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + 
##     niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo + 
##     voto_oficialista
## 
## 
## Step:  AIC=333.3
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + 
##     niv_educativo_x_terciario_no_univ_completo + niv_educativo_x_universitario_incompleto_o_completo
## 
##                                                       Df Deviance    AIC
## - niv_educativo_x_universitario_incompleto_o_completo  1   324.94 331.30
## - niv_educativo_x_terciario_no_univ_completo           1   324.94 331.30
## - sexo                                                 1   324.98 331.34
## - edad_x30_49                                          1   326.04 332.40
## <none>                                                     324.94 333.30
## - niv_educativo_x_terciario_no_univ_incompleto         1   327.33 333.69
## - edad_x50_65                                          1   328.42 334.78
## - niv_educativo_x_secundario_incompleto_o_completo     1   332.45 338.81
## - edad_x_65                                            1   335.46 341.82
## 
## Step:  AIC=331.3
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto + 
##     niv_educativo_x_terciario_no_univ_completo
## 
##                                                    Df Deviance    AIC
## - niv_educativo_x_terciario_no_univ_completo        1   324.94 329.30
## - sexo                                              1   324.98 329.35
## - edad_x30_49                                       1   326.18 330.55
## <none>                                                  324.94 331.30
## - edad_x50_65                                       1   328.54 332.91
## - niv_educativo_x_terciario_no_univ_incompleto      1   328.63 333.00
## - niv_educativo_x_secundario_incompleto_o_completo  1   335.49 339.86
## - edad_x_65                                         1   335.50 339.87
## 
## Step:  AIC=329.33
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + sexo + 
##     niv_educativo_x_secundario_incompleto_o_completo + niv_educativo_x_terciario_no_univ_incompleto
## 
##                                                    Df Deviance    AIC
## - sexo                                              1   324.98 327.37
## - edad_x30_49                                       1   326.22 328.61
## <none>                                                  324.94 329.33
## - edad_x50_65                                       1   328.59 330.98
## - niv_educativo_x_terciario_no_univ_incompleto      1   328.84 331.23
## - edad_x_65                                         1   335.51 337.90
## - niv_educativo_x_secundario_incompleto_o_completo  1   335.94 338.33
## 
## Step:  AIC=327.27
## voto_oficialista ~ edad_x30_49 + edad_x50_65 + edad_x_65 + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto
## 
##                                                    Df Deviance    AIC
## - edad_x30_49                                       1   326.55 326.83
## <none>                                                  324.98 327.27
## - edad_x50_65                                       1   328.59 328.88
## - niv_educativo_x_terciario_no_univ_incompleto      1   328.84 329.13
## - edad_x_65                                         1   335.51 335.80
## - niv_educativo_x_secundario_incompleto_o_completo  1   335.98 336.26
## 
## Step:  AIC=326.8
## voto_oficialista ~ edad_x50_65 + edad_x_65 + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto
## 
##                                                    Df Deviance    AIC
## <none>                                                  326.55 326.80
## - niv_educativo_x_terciario_no_univ_incompleto      1   330.07 328.32
## - edad_x50_65                                       1   334.18 332.44
## - niv_educativo_x_secundario_incompleto_o_completo  1   337.46 335.71
## - edad_x_65                                         1   342.97 341.23
# mostramos
summary(final_model)
## 
## Call:
## glm(formula = voto_oficialista ~ edad_x50_65 + edad_x_65 + niv_educativo_x_secundario_incompleto_o_completo + 
##     niv_educativo_x_terciario_no_univ_incompleto, family = binomial, 
##     data = df_logit_cba, weights = ponderacion_eph)
## 
## Coefficients:
##                                                  Estimate Std. Error z value
## (Intercept)                                       -0.4130     0.1743  -2.369
## edad_x50_65                                       -1.0448     0.4080  -2.561
## edad_x_65                                         -2.0138     0.6254  -3.220
## niv_educativo_x_secundario_incompleto_o_completo  -1.3565     0.4587  -2.958
## niv_educativo_x_terciario_no_univ_incompleto      -0.6365     0.3493  -1.822
##                                                  Pr(>|z|)   
## (Intercept)                                       0.01784 * 
## edad_x50_65                                       0.01044 * 
## edad_x_65                                         0.00128 **
## niv_educativo_x_secundario_incompleto_o_completo  0.00310 **
## niv_educativo_x_terciario_no_univ_incompleto      0.06844 . 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 361.04  on 319  degrees of freedom
## Residual deviance: 326.55  on 315  degrees of freedom
## AIC: 326.8
## 
## Number of Fisher Scoring iterations: 5

En línea con el modelo anterior, las variables estadísticamente significativas son: niv_educativo_x_secundario_incompleto_o_completo y niv_educativo_x_terciario_no_univ_incompleto lo que indica que a medida que aumenta el nivel educativo (hasta el nivel universitario), la probabilidad de votar al oficialismo disminuye. Respecto a la edad, a medida que aumenta la edad a partir de los 50 años es menos probable que se vote al FPV.

Conclusiones

Los resultados que arrojan los modelos para Buenos Aires y Córdoba son parecidos respecto a las variables estadísticamente significativas. En este sentido, son la edad y el nivel educativo las variables que podrían explicar el voto al oficialismo. En Buenos Aires a mayor nivel educativo mayor voto al oficialismo, y el rango etario que influye inversamente es el de 30-49. En cambio, en córdoba sucede al revés, a partir de los 50 años a medida que aumenta la edad disminuye la probabilidad de votar al FPV, y lo mismo ocurre con el nivel educativo.

LS0tDQp0aXRsZTogIkFuw6FsaXNpcyBkZSBsYSBpbnRlbmNpw7NuIGRlIHZvdG8gZW4gQnVlbm9zIEFpcmVzIHkgQ8OzcmRvYmEgcGFyYSBsYXMgZWxlY2Npb25lcyBnZW5lcmFsZXMgZGVsIGHDsW8gMjAxNSINCnN1YnRpdGxlOiAiVHJhYmFqbyBmaW5hbCBkZSBsYSBtYXRlcmlhIEludmVzdGlnYWNpw7NuIEVsZWN0b3JhbCB5IGRlIE9waW5pw7NuIFDDumJsaWNhIEFwbGljYWRhIEkgeSBJSSINCmF1dGhvcjogIkJhcmRhdWlsIEFyaWFuYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCmxhbmc6ICJlcyINCm91dHB1dDoNCiAgcm1kZm9ybWF0czo6ZG93bmN1dGU6DQogICAgbGlnaHRib3g6IFRSVUUNCiAgICBoaWdobGlnaHQ6IHB5Z21lbnRzDQogICAgdG9jOiA0DQogICAgbnVtYmVyLXNlY3Rpb25zOiBUUlVFDQogICAgY29kZV9kb3dubG9hZDogVFJVRQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yID0gRkFMU0UpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShndCkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShncmlkKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpDQpsaWJyYXJ5KG1pY2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoa2FibGVFeHRyYSkNCmxpYnJhcnkoYW5lc3Jha2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShmYWN0b2V4dHJhKQ0KYGBgDQoNCiMgSW50cm9kdWNjacOzbg0KDQpFbCAqKm9iamV0aXZvKiogZGUgZXN0ZSB0cmFiYWpvIGVzIGFuYWxpemFyIGxhIGludGVuY2nDs24gZGUgdm90byBkZSBkb3MgZW5jdWVzdGFzIHJlYWxpemFkYXMgZW4gQnVlbm9zIEFpcmVzIHkgQ8OzcmRvYmEgcmVhbGl6YWRhIGRlIGxhcyBQcmltYXJpYXMgQWJpZXJ0YXMgU2ltdWx0YW5lYXMgeSBPYmxpZ2F0b3JpYXMgKFBBU08pIGRlbCA5IGRlIGFnb3N0byBkZWwgMjAxNSBwYXJhIGxhIG1hdGVyaWEgKipJbnZlc3RpZ2FjacOzbiBFbGVjdG9yYWwgeSBkZSBPcGluacOzbiBQw7pibGljYSBBcGxpY2FkYSBJIHkgSUkuKiogRWwgcmVzdWx0YWRvIGRlIGxhcyBQQVNPIGZ1ZSBlbCBzaWd1aWVudGU6DQoNCmBgYHtyfQ0KcmVhZF9leGNlbCgiQ29uc2lnbmEgeSBtYXRlcmlhbGVzIFRQMS9NYXRlcmlhbGVzIGRlIHJlZmVyZW5jaWEvUmVzdWx0YWRvcyBQQVNPMjAxNS54bHN4IiwgDQogICAgc2hlZXQgPSAiSG9qYTIiKSB8PiANCiAgbXV0YXRlKGBCdWVub3MgQWlyZXNgID0gcGFzdGUwKHJvdW5kKGBCdWVub3MgQWlyZXNgKjEwMCwgMiksICIlIiksDQogICAgICAgICBgQ8OzcmRvYmFgID0gcGFzdGUwKHJvdW5kKGBDw7NyZG9iYWAqMTAwLCAyKSwgIiUiKSkgfD4gDQogIGthYmxlKGZvcm1hdCA9ICJodG1sIiwgZXNjYXBlID0gRkFMU0UpIHw+IA0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInN0cmlwZWQiLCBmb250X3NpemUgPSAxNCkNCmBgYA0KDQpFbCAyNSBkZSBvY3R1YnJlIChQcmltZXJhIHZ1ZWx0YSkgeSBlbCAyMiBkZSBub3ZpZW1icmUgKHNlZ3VuZGEgdnVlbHRhKSBkZSAyMDE1IHNlIHN1Y2VkaWVyb24gbGFzICoqZWxlY2Npb25lcyBwcmVzaWRlbmNpYWxlcyBkZSBBcmdlbnRpbmEqKi4gTG9zICoqcHJpbmNpcGFsZXMgY2FuZGlkYXRvcyoqIGZ1ZXJvbiAqKkRhbmllbCBTY2lvbGkqKiBkZWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEgKEZwViksIGNhbmRpZGF0byBvZmljaWFsaXN0YSwgeSAqKk1hdXJpY2lvIE1hY3JpKiogZGUgQ2FtYmllbW9zLCBlbnRvbmNlcyBqZWZlIGRlIGdvYmllcm5vIGRlIGxhIENpdWRhZCBkZSBCdWVub3MgQWlyZXMuDQoNCiFbXShpbWFnZS1yZW1vdmViZy1wcmV2aWV3LnBuZykNCg0KRW4gbGEgcHJpbWVyYSB2dWVsdGEgZWxlY3RvcmFsLCBxdWUgdHV2byBsdWdhciBlbCAyNSBkZSBvY3R1YnJlIGRlIDIwMTUsIG5pbmd1bm8gZGUgbG9zIGNhbmRpZGF0b3Mgb2J0dXZvIG3DoXMgZGVsIDQ1JSBkZSBsb3Mgdm90b3MgbmkgdW5hIGRpZmVyZW5jaWEgZGUgbcOhcyBkZSAxMCBwdW50b3MgcG9yY2VudHVhbGVzIHNvYnJlIGVsIHNlZ3VuZG8gY2FuZGlkYXRvLCBsbyBxdWUgbGxldsOzIGEgbGEgcmVhbGl6YWNpw7NuIGRlIHVuYSBzZWd1bmRhIHZ1ZWx0YSBlbGVjdG9yYWwuDQoNCi0gICBEYW5pZWwgU2Npb2xpIChGcFYpOiAzNy4wOCUgZGUgbG9zIHZvdG9zLg0KDQotICAgTWF1cmljaW8gTWFjcmkgKENhbWJpZW1vcyk6IDM0LjE1JSBkZSBsb3Mgdm90b3MuDQoNCkRhbmllbCBTY2lvbGkgeSBNYXVyaWNpbyBNYWNyaSwgc2UgZW5mcmVudGFyb24gZW4gdW5hIHNlZ3VuZGEgdnVlbHRhIGVsZWN0b3JhbCBlbCAyMiBkZSBub3ZpZW1icmUgZGUgMjAxNSBsbyBxdWUgbGxldsOzIGFsIHNlZ3VuZG8gYSBsYSB2aWN0b3JpYSBjb24gZWwgNTEuMzQlIGRlIGxvcyB2b3Rvcy4NCg0KIyMgQ29uc2lnbmENCg0KU29icmUgbGEgYmFzZSBkZSBsb3MgbWF0ZXJpYWxlcyBlbnRyZWdhZG9zIChDdWVzdGlvbmFyaW8geSBCYXNlcyBkZSBSZXN1bHRhZG9zIGRlIGxvcyBFc3R1ZGlvcyBFbGVjdG9yYWxlcyBkZSBDw7NyZG9iYSBDYXBpdGFsIHkgQmFzZSBJbmRpdmlkdW9zIEVQSCkNCg0KMS0gUHJvY2VzYXIgbGFzIGJhc2VzIGRlIGRhdG9zIGRlIG1hbmVyYSBpbmRlcGVuZGllbnRlIGFwbGljYW5kbyBlbCBtw6l0b2RvIGRlIHBvbmRlcmFjacOzbiBpdGVyYXRpdmEgdmlzdG8gZW4gY2xhc2UgKFBhcsOhbWV0cm9zIGVuIEJhc2UgRVBIKS4NCg0KMi0gRW4gYmFzZSBhIGxvcyBpbmRpY2Fkb3JlcyByZWxldmFkb3MgZXZhbHVhciBlbCBwb3RlbmNpYWwgZWxlY3RvcmFsIGRlIGxvcyBwcmluY2lwYWxlcyBjYW5kaWRhdG9zIGEgUHJlc2lkZW50ZSAoTWFjcmkgeSBTY2lvbGkpDQoNCjMtIFNlbGVjY2lvbmFyIHVuIGNvbmp1bnRvIGRlIGluZGljYWRvcmVzIHF1ZSBkZW4gY3VlbnRhIGRlIGFsIG1lbm9zIGRvcyBkZSBsYXMgcGVyc3BlY3RpdmFzIHRlw7NyaWNhcyB2aXN0YXMgZW4gbGEgYmlibGlvZ3JhZsOtYSBzb2JyZSBjb21wb3J0YW1pZW50byBlbGVjdG9yYWwgeSBldmFsdWFyIGVsIGltcGFjdG8gZGUgZGljaG9zIGluZGljYWRvcmVzIGVuIGxhIGRlY2lzacOzbiBkZSB2b3RvIHV0aWxpemFuZG8gYWwgbWVub3MgZG9zIGhlcnJhbWllbnRhcyBkZSBhbsOhbGlzaXMuIENvbXBhcmFyIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcyBlbnRyZSBhbWJhcyBjaXVkYWRlcy4NCg0KYGBge3J9DQpDT1JET0JBIDwtIHJlYWRfc2F2KCJDb25zaWduYSB5IG1hdGVyaWFsZXMgVFAxL0Jhc2VzIGRlIGRhdG9zL0NPUkRPQkFfRklOQUwuc2F2IikNCkdCQSA8LSByZWFkX3NhdigiQ29uc2lnbmEgeSBtYXRlcmlhbGVzIFRQMS9CYXNlcyBkZSBkYXRvcy9HQkFfRklOQUwuc2F2IikNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KDQojIE1vZGlmaWNvIGxhcyBldGlxdWV0YXMgDQpDT1JET0JBIDwtIENPUkRPQkEgfD4gDQogIG11dGF0ZShVQSA9IGFzLm51bWVyaWMoVUEpLA0KICBFREFEID0gZmFjdG9yKEVEQUQsDQogICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjQpLCANCiAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxOC0yOSIsIjMwLTQ5IiwiNTAtNjUiLCI+NjUiKSwgDQogICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBTRVhPID0gZmFjdG9yKFNFWE8sDQogICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjIpLA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlZhcsOzbiIsIk11amVyIiksIA0KICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUKSwNCiAgTklWX0VEVUNBVElWTyA9IGZhY3RvciggTklWX0VEVUNBVElWTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gKDE6NSksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlByaW1hcmlvIGNvbXBsZXRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VjdW5kYXJpbyBpbmNvbXBsZXRvIG8gY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXJjaWFyaW8gbm8gdW5pdi4gaW5jb21wbGV0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcmNpYXJpbyBubyB1bml2LiBjb21wbGV0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaXZlcnNpdGFyaW8gaW5jb21wbGV0byBvIGNvbXBsZXRvIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUKSwNCiAgVk9UT19DQU5ESURBVE8gPSBjYXNlX3doZW4oDQogICAgVk9UT19DQU5ESURBVE8gPT0gMSB+ICJEYW5pZWwgU2Npb2xpIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSAyIH4gIk1hdXJpY2lvIE1hY3JpIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSAzIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgVk9UT19DQU5ESURBVE8gPT0gNCB+ICJNYXJnYXJpdGEgU3RvbGJpemVyIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSA1IH4gIk5pY29sYXMgRGVsIENhw7FvIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSA2IH4gIkFkb2xmbyBSb2RyaWd1ZXogU2FhIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSA4IH4gIk5pbmd1bm8gLyBFbiBCbGFuY28iLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDkgfiAiTm8gU2FiZSIpLA0KICBWT1RPX0FDT1RBRE8gPSBjYXNlX3doZW4oDQogICAgVk9UT19BQ09UQURPID09IDEgfiAiRGFuaWVsIFNjaW9saSIsDQogICAgVk9UT19BQ09UQURPID09IDIgfiAiTWF1cmljaW8gTWFjcmkiLA0KICAgIFZPVE9fQUNPVEFETyA9PSAzIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgVk9UT19BQ09UQURPID09IDggfiAiTmluZ3VubyAvIEVuIEJsYW5jbyIsDQogICAgVk9UT19BQ09UQURPID09IDkgfiAiTm8gU2FiZSIpLA0KICBKQU1BU19WT1RBUklBID0gY2FzZV93aGVuKA0KICAgIEpBTUFTX1ZPVEFSSUEgPT0gMSB+ICJEYW5pZWwgU2Npb2xpIiwNCiAgICBKQU1BU19WT1RBUklBID09IDIgfiAiTWF1cmljaW8gTWFjcmkiLA0KICAgIEpBTUFTX1ZPVEFSSUEgPT0gMyB+ICJTZXJnaW8gTWFzc2EiLA0KICAgIEpBTUFTX1ZPVEFSSUEgPT0gOCB+ICJOaW5ndW5vIC8gRW4gQmxhbmNvIiwNCiAgICBKQU1BU19WT1RBUklBID09IDkgfiAiTm8gU2FiZSIpLA0KICBHRVNUSU9OX0NSSVNUSU5BID0gZmFjdG9yKEdFU1RJT05fQ1JJU1RJTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxLDIsOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiRGVzYXBydWViYSIsIkFwcnVlYmEiLCJObyBzYWJlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBFQ09OT01JQV9QQUlTXzJfQcORT1MgPSBmYWN0b3IoRUNPTk9NSUFfUEFJU18yX0HDkU9TLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6Myw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTWVqb3LDsyIsIkVtcGVvcsOzIiwiU2UgbWFudHV2byBpZ3VhbCIsIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBFQ09OT01JQV9GTElBUl8yX0HDkU9TID0gZmFjdG9yKEVDT05PTUlBX0ZMSUFSXzJfQcORT1MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTozLDkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJNZWpvcsOzIiwiRW1wZW9yw7MiLCJTZSBtYW50dXZvIGlndWFsIiwiTm8gc2FiZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIENPTlRJTlVJREFEX09fQ0FNQklPID0gZmFjdG9yKENPTlRJTlVJREFEX09fQ0FNQklPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6Myw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTWFudGVuZXIgcG9sw610aWNhcyBhY3R1YWxlcyIsIk1hbnRlbmVyIGFsZ3VuYXMgeSBjYW1iaWFyIG90cmFzIiwiQ2FtYmlhciB0b2RhcyIsIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBSRVBSRVNFTlRBQ0lPTl9ERUxfQ0FNQklPID0gY2FzZV93aGVuKA0KICAgIFJFUFJFU0VOVEFDSU9OX0RFTF9DQU1CSU8gPT0gMSB+ICJTZXJnaW8gTWFzc2EiLA0KICAgIFJFUFJFU0VOVEFDSU9OX0RFTF9DQU1CSU8gPT0gMiB+ICJNYXVyaWNpbyBNYWNyaSIsDQogICAgUkVQUkVTRU5UQUNJT05fREVMX0NBTUJJTyA9PSAzIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIFJFUFJFU0VOVEFDSU9OX0RFTF9DQU1CSU8gPT0gOCB+ICJOaW5ndW5vIiwNCiAgICBSRVBSRVNFTlRBQ0lPTl9ERUxfQ0FNQklPID09IDkgfiAiTm8gc2FiZSIpLA0KICBBR0VOREFfREVfVEVNQVMgPSBjYXNlX3doZW4oDQogICAgQUdFTkRBX0RFX1RFTUFTID09IDEgfiAiU2VndXJpZGFkIiwNCiAgICBBR0VOREFfREVfVEVNQVMgPT0gMiB+ICJFY29ub23DrWEiLA0KICAgIEFHRU5EQV9ERV9URU1BUyA9PSAzIH4gIlJlc3BldG8gZGUgaW5zdGl0dWNpb25lcyIsDQogICAgQUdFTkRBX0RFX1RFTUFTID09IDQgfiAiRWR1Y2FjaW9uLCBhc2lzdGVuY2lhIHNvY2lhbCwgc2FsdWQiLA0KICAgIEFHRU5EQV9ERV9URU1BUyA9PSA1IH4gIkVtcGxlbyIsDQogICAgQUdFTkRBX0RFX1RFTUFTID09IDkgfiAiTm8gc2FiZSINCiAgKSwNCiAgUEVSQ0VQQ0lPTl9ERV9HQU5BRE9SID0gY2FzZV93aGVuKA0KICAgIFBFUkNFUENJT05fREVfR0FOQURPUiA9PSAxIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIFBFUkNFUENJT05fREVfR0FOQURPUiA9PSAyIH4gIk1hdXJpY2lvIE1hY3JpIiwNCiAgICBQRVJDRVBDSU9OX0RFX0dBTkFET1IgPT0gMyB+ICJTZXJnaW8gTWFzc2EiLA0KICAgIFBFUkNFUENJT05fREVfR0FOQURPUiA9PSA0IH4gIk90cm8iLA0KICAgIFBFUkNFUENJT05fREVfR0FOQURPUiA9PSA5IH4gIk5vIHNhYmUiDQogICksDQogIElORkxVRU5DSUFfREVfQ1JJU1RJTkFfRU5fU0NJT0xJID0gZmFjdG9yKElORkxVRU5DSUFfREVfQ1JJU1RJTkFfRU5fU0NJT0xJLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6NCw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTmluZ3VuYSIsIlBvY2EiLCJCYXN0YW50ZSIsIk11Y2hhIiwiTm8gc2FiZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIFBPU0lDSU9OQU1JRU5UT19FU1BBQ0lBTCA9IGZhY3RvcihQT1NJQ0lPTkFNSUVOVE9fRVNQQUNJQUwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6NSw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlRvdGFsbWVudGUgZGUgaXpxdWllcmRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk3DoXMgaXpxdWllcmRhIHF1ZSBkZXJlY2hhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5pIGRlIGl6cXVpZXJkYSBuaSBkZSBkZXJlY2hhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk3DoXMgZGUgZGVyZWNoYSBxdWUgZGUgaXpxdWllcmRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvdGFsbWVudGUgZGUgZGVyZWNoYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzYWJlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBQT1NJQ0lPTkFNSUVOVE9fUkVTUEVDVE9fUEVST05JU01PID0gZmFjdG9yKFBPU0lDSU9OQU1JRU5UT19SRVNQRUNUT19QRVJPTklTTU8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjMsOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUGVyb25pc3RhIiwiQW50aXBlcm9uaXN0YSIsIk5pIHBlcm9uaXN0YSBuaSBhbnRpIHBlcm9uaXN0YSIsIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBQT1NJQ0lPTkFNSUVOVE9fUkVTUEVDVE9fS0lSQ0hORVJJU01PID0gZmFjdG9yKFBPU0lDSU9OQU1JRU5UT19SRVNQRUNUT19LSVJDSE5FUklTTU8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjMsOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2lyY2huZXJpc3RhIiwiQW50aSBraXJjaG5lcmlzdGEiLCJOaSBraXJjaG5lcmlzdGEgbmkgYW50aSBraXJjaG5lcmlzdGEiLCJObyBzYWJlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUKSwNCiAgVk9UQUNJT05fUEFTTyA9IGNhc2Vfd2hlbigNCiAgICBWT1RBQ0lPTl9QQVNPID09IDAgfiAiTm8gU2FiZSIsDQogICAgVk9UQUNJT05fUEFTTyA9PSAxIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIFZPVEFDSU9OX1BBU08gPT0gMiB+ICJTZXJnaW8gTWFzc2EiLA0KICAgIFZPVEFDSU9OX1BBU08gPT0gMyB+ICJNYXVyaWNpbyBNYWNyaSIsDQogICAgVk9UQUNJT05fUEFTTyA9PSA0IH4gIkpvc8OpIE1hbnVlbCBEZSBMYSBTb3RhIiwNCiAgICBWT1RBQ0lPTl9QQVNPID09IDUgfiAiTWFyZ2FyaXRhIFN0b2xiaXplciIsDQogICAgVk9UQUNJT05fUEFTTyA9PSA2IH4gIlJvZHJpZ3VleiBTYWEiLA0KICAgIFZPVEFDSU9OX1BBU08gPT0gOCB+ICJPdHJvcyIsDQogICAgVk9UQUNJT05fUEFTTyA9PSA5IH4gIkJsYW5jbyAvIE5vIHZvdG8iKSwNCiAgTkVfQ0JBID0gZmFjdG9yKE5FX0NCQSwNCiAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTozKSwNCiAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlAuIENvbXBsZXRhIiwiU2VjLiBDb21wLVRlcmMuIEluYyIsIlRlcmMvVW5pdi4gQ29tcGxldG8iKSwgDQogICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCkNCiAgKXw+DQogIGNsZWFuX25hbWVzKCkNCg0KDQoNCkdCQSA8LSBHQkEgfD4gDQogIG11dGF0ZShVQSA9IGFzLm51bWVyaWMoVUEpLA0KICBFREFEID0gZmFjdG9yKEVEQUQsDQogICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjQpLCANCiAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxOC0yOSIsIjMwLTQ5IiwiNTAtNjUiLCI+NjUiKSwNCiAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogICBTRVhPID0gZmFjdG9yKFNFWE8sDQogICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjIpLA0KICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlZhcsOzbiIsIk11amVyIiksDQogICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBOSVZfRURVQ0FUSVZPID0gZmFjdG9yKCBOSVZfRURVQ0FUSVZPLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSAoMTo1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiUHJpbWFyaW8gY29tcGxldG8iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWN1bmRhcmlvIGluY29tcGxldG8gbyBjb21wbGV0byIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcmNpYXJpbyBubyB1bml2LiBpbmNvbXBsZXRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVyY2lhcmlvIG5vIHVuaXYuIGNvbXBsZXRvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5pdmVyc2l0YXJpbyBpbmNvbXBsZXRvIG8gY29tcGxldG8iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBWT1RPX0NBTkRJREFUTyA9IGNhc2Vfd2hlbigNCiAgICBWT1RPX0NBTkRJREFUTyA9PSAxIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDIgfiAiTWF1cmljaW8gTWFjcmkiLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDMgfiAiU2VyZ2lvIE1hc3NhIiwNCiAgICBWT1RPX0NBTkRJREFUTyA9PSA0IH4gIk1hcmdhcml0YSBTdG9sYml6ZXIiLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDUgfiAiTmljb2xhcyBEZWwgQ2HDsW8iLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDYgfiAiQWRvbGZvIFJvZHJpZ3VleiBTYWEiLA0KICAgIFZPVE9fQ0FORElEQVRPID09IDggfiAiTmluZ3VubyAvIEVuIEJsYW5jbyIsDQogICAgVk9UT19DQU5ESURBVE8gPT0gOSB+ICJObyBTYWJlIiksDQogIFZPVE9fQUNPVEFETyA9IGNhc2Vfd2hlbigNCiAgICBWT1RPX0FDT1RBRE8gPT0gMSB+ICJEYW5pZWwgU2Npb2xpIiwNCiAgICBWT1RPX0FDT1RBRE8gPT0gMiB+ICJNYXVyaWNpbyBNYWNyaSIsDQogICAgVk9UT19BQ09UQURPID09IDMgfiAiU2VyZ2lvIE1hc3NhIiwNCiAgICBWT1RPX0FDT1RBRE8gPT0gOCB+ICJOaW5ndW5vIC8gRW4gQmxhbmNvIiwNCiAgICBWT1RPX0FDT1RBRE8gPT0gOSB+ICJObyBTYWJlIiksDQogIEpBTUFTX1ZPVEFSSUEgPSBjYXNlX3doZW4oDQogICAgSkFNQVNfVk9UQVJJQSA9PSAxIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIEpBTUFTX1ZPVEFSSUEgPT0gMiB+ICJNYXVyaWNpbyBNYWNyaSIsDQogICAgSkFNQVNfVk9UQVJJQSA9PSAzIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgSkFNQVNfVk9UQVJJQSA9PSA4IH4gIk5pbmd1bm8gLyBFbiBCbGFuY28iLA0KICAgIEpBTUFTX1ZPVEFSSUEgPT0gOSB+ICJObyBTYWJlIiksDQogIEdFU1RJT05fQ1JJU1RJTkEgPSBmYWN0b3IoR0VTVElPTl9DUklTVElOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDEsMiw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJEZXNhcHJ1ZWJhIiwiQXBydWViYSIsIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIEVDT05PTUlBX1BBSVNfMl9Bw5FPUyA9IGZhY3RvcihFQ09OT01JQV9QQUlTXzJfQcORT1MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTozLDkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJNZWpvcsOzIiwiRW1wZW9yw7MiLCJTZSBtYW50dXZvIGlndWFsIiwiTm8gc2FiZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIEVDT05PTUlBX0ZMSUFSXzJfQcORT1MgPSBmYWN0b3IoRUNPTk9NSUFfRkxJQVJfMl9Bw5FPUywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjMsOSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk1lam9yw7MiLCJFbXBlb3LDsyIsIlNlIG1hbnR1dm8gaWd1YWwiLCJObyBzYWJlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUKSwNCiAgQ09OVElOVUlEQURfT19DQU1CSU8gPSBmYWN0b3IoQ09OVElOVUlEQURfT19DQU1CSU8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTozLDkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJNYW50ZW5lciBwb2zDrXRpY2FzIGFjdHVhbGVzIiwiTWFudGVuZXIgYWxndW5hcyB5IGNhbWJpYXIgb3RyYXMiLCJDYW1iaWFyIHRvZGFzIiwiTm8gc2FiZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIFJFUFJFU0VOVEFDSU9OX0RFTF9DQU1CSU8gPSBjYXNlX3doZW4oDQogICAgUkVQUkVTRU5UQUNJT05fREVMX0NBTUJJTyA9PSAxIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgUkVQUkVTRU5UQUNJT05fREVMX0NBTUJJTyA9PSAyIH4gIk1hdXJpY2lvIE1hY3JpIiwNCiAgICBSRVBSRVNFTlRBQ0lPTl9ERUxfQ0FNQklPID09IDMgfiAiRGFuaWVsIFNjaW9saSIsDQogICAgUkVQUkVTRU5UQUNJT05fREVMX0NBTUJJTyA9PSA4IH4gIk5pbmd1bm8iLA0KICAgIFJFUFJFU0VOVEFDSU9OX0RFTF9DQU1CSU8gPT0gOSB+ICJObyBzYWJlIiksDQogIEFHRU5EQV9ERV9URU1BUyA9IGNhc2Vfd2hlbigNCiAgICBBR0VOREFfREVfVEVNQVMgPT0gMSB+ICJTZWd1cmlkYWQiLA0KICAgIEFHRU5EQV9ERV9URU1BUyA9PSAyIH4gIkVjb25vbcOtYSIsDQogICAgQUdFTkRBX0RFX1RFTUFTID09IDMgfiAiUmVzcGV0byBkZSBpbnN0aXR1Y2lvbmVzIiwNCiAgICBBR0VOREFfREVfVEVNQVMgPT0gNCB+ICJFZHVjYWNpb24sIGFzaXN0ZW5jaWEgc29jaWFsLCBzYWx1ZCIsDQogICAgQUdFTkRBX0RFX1RFTUFTID09IDUgfiAiRW1wbGVvIiwNCiAgICBBR0VOREFfREVfVEVNQVMgPT0gOSB+ICJObyBzYWJlIg0KICApLA0KICBQRVJDRVBDSU9OX0RFX0dBTkFET1IgPSBjYXNlX3doZW4oDQogICAgUEVSQ0VQQ0lPTl9ERV9HQU5BRE9SID09IDEgfiAiRGFuaWVsIFNjaW9saSIsDQogICAgUEVSQ0VQQ0lPTl9ERV9HQU5BRE9SID09IDIgfiAiTWF1cmljaW8gTWFjcmkiLA0KICAgIFBFUkNFUENJT05fREVfR0FOQURPUiA9PSAzIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgUEVSQ0VQQ0lPTl9ERV9HQU5BRE9SID09IDQgfiAiT3RybyIsDQogICAgUEVSQ0VQQ0lPTl9ERV9HQU5BRE9SID09IDkgfiAiTm8gc2FiZSINCiAgKSwNCiAgSU5GTFVFTkNJQV9ERV9DUklTVElOQV9FTl9TQ0lPTEkgPSBmYWN0b3IoSU5GTFVFTkNJQV9ERV9DUklTVElOQV9FTl9TQ0lPTEksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTo0LDkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJOaW5ndW5hIiwiUG9jYSIsIkJhc3RhbnRlIiwiTXVjaGEiLCJObyBzYWJlIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUKSwNCiAgUE9TSUNJT05BTUlFTlRPX0VTUEFDSUFMID0gZmFjdG9yKFBPU0lDSU9OQU1JRU5UT19FU1BBQ0lBTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTo1LDkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiVG90YWxtZW50ZSBkZSBpenF1aWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTcOhcyBpenF1aWVyZGEgcXVlIGRlcmVjaGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmkgZGUgaXpxdWllcmRhIG5pIGRlIGRlcmVjaGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTcOhcyBkZSBkZXJlY2hhIHF1ZSBkZSBpenF1aWVyZGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWxtZW50ZSBkZSBkZXJlY2hhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIFBPU0lDSU9OQU1JRU5UT19SRVNQRUNUT19QRVJPTklTTU8gPSBmYWN0b3IoUE9TSUNJT05BTUlFTlRPX1JFU1BFQ1RPX1BFUk9OSVNNTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6Myw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQZXJvbmlzdGEiLCJBbnRpcGVyb25pc3RhIiwiTmkgcGVyb25pc3RhIG5pIGFudGkgcGVyb25pc3RhIiwiTm8gc2FiZSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCksDQogIFBPU0lDSU9OQU1JRU5UT19SRVNQRUNUT19LSVJDSE5FUklTTU8gPSBmYWN0b3IoUE9TSUNJT05BTUlFTlRPX1JFU1BFQ1RPX0tJUkNITkVSSVNNTywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6Myw5KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaXJjaG5lcmlzdGEiLCJBbnRpIGtpcmNobmVyaXN0YSIsIk5pIGtpcmNobmVyaXN0YSBuaSBhbnRpIGtpcmNobmVyaXN0YSIsIk5vIHNhYmUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpLA0KICBWT1RBQ0lPTl9QQVNPID0gY2FzZV93aGVuKA0KICAgIFZPVE9fUEFTTyA9PSAwIH4gIk5vIFNhYmUiLA0KICAgIFZPVE9fUEFTTyA9PSAxIH4gIkRhbmllbCBTY2lvbGkiLA0KICAgIFZPVE9fUEFTTyA9PSAyIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgVk9UT19QQVNPID09IDMgfiAiTWF1cmljaW8gTWFjcmkiLA0KICAgIFZPVE9fUEFTTyA9PSA0IH4gIkpvc8OpIE1hbnVlbCBEZSBMYSBTb3RhIiwNCiAgICBWT1RPX1BBU08gPT0gNSB+ICJNYXJnYXJpdGEgU3RvbGJpemVyIiwNCiAgICBWT1RPX1BBU08gPT0gNiB+ICJSb2RyaWd1ZXogU2FhIiwNCiAgICBWT1RPX1BBU08gPT0gOCB+ICJPdHJvcyIsDQogICAgVk9UT19QQVNPID09IDkgfiAiQmxhbmNvIC8gTm8gdm90byIpLA0KICBORV9CU0FTID0gZmFjdG9yKE5FX0JTQVMsDQogICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDE6MyksDQogICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQLiBDb21wbGV0YSIsIlNlYy4gQ29tcC1UZXJjLiBJbmMiLCJUZXJjL1VuaXYuIENvbXBsZXRvIiksDQogICAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCkpfD4NCiAgY2xlYW5fbmFtZXMoKSB8PiANCiAgc2VsZWN0KC12b3RvX3Bhc28pDQpgYGANCg0KIyBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvDQoNCiMjIFJlc3VtZW4gZGUgbG9zIERhdG9zIHsudGFic2V0fQ0KDQpFbiBlc3RlIGFwYXJ0YWRvIHNlIHJlYWxpemFyw6EgbGEgbWFuaXB1bGFjacOzbiB5IHRyYW5zZm9ybWFjacOzbiBkZSBkYXRvcyBjb21vIGFzw60gdGFtYmnDqW4gZWwgYW7DoWxpc2lzIGV4cGxvcmF0b3JpbyBkZSBhbWJhcyBiYXNlcw0KDQojIyMgKipCdWVub3MgQWlyZXMqKg0KDQpFbiB1bmEgcHJpbWVyYSBhcHJlY2lhY2nDs24gZGUgbGEgYmFzZSBkZSAqKkJ1ZW5vcyBBaXJlcyoqIHNlIHB1ZWRlIG9ic2VydmFyIHF1ZSBleGlzdGVuIHZhbG9yZXMgbnVsb3MuIEVzdG9zIHB1ZWRlbiBkZWJlcnNlIGEgcmVzcHVlc3RhcyBmYWx0YW50ZXMgbyBwcmVndW50YXMgcXVlIGxvcyBlbmN1ZXN0YWRvcyBvcHRhcm9uIHBvciBubyByZXNwb25kZXIuDQoNCmBgYHtyfQ0Kc2tpbXI6OnNraW0oR0JBKSANCg0KYGBgDQoNCiMjIyAqKkPDs3Jkb2JhKioNCg0KQWwgaWd1YWwgcXVlIGNvbiBlbCBkZiBkZSBCdWVub3MgQWlyZXMsIHZlbW9zIHF1ZSBlbiBlbCBkYXRhZnJhbWUgZGUgKipDw7NyZG9iYSoqIGV4aXN0ZW4gdmFsb3JlcyBudWxvcy4NCg0KYGBge3J9DQpza2ltcjo6c2tpbShDT1JET0JBKSANCmBgYA0KDQojIyAgey50YWJzZXR9DQoNCiMjIyBUcmF0YW1pZW50byBkZSBsb3MgdmFsb3JlcyBudWxvcw0KDQpQYXJhIGVsIHRyYXRhbWllbnRvIGRlIGxvcyBtaXNtb3Mgc2UgdXRpbGl6YXLDoSBlbCBwYXF1ZXRlIHttaWNlfSAqTXVsdGlwbGUgSW1wdXRhdGlvbiBieSBDaGFpbmVkIEVxdWF0aW9ucyouIEVzdGUgbcOpdG9kbyBpbXB1dGEgbG9zIGRhdG9zIGZhbHRhbnRlcyBhIHRyYXbDqXMgZGUgdW5hIHNlcmllIGl0ZXJhdGl2YSBkZSBtb2RlbG9zIHByZWRpY3Rpdm9zDQoNCiMjIyAqKkJ1ZW5vcyBBaXJlcyoqDQoNCkVuIGVzdGUgc3VicGFuZWwgc2UgYnVzY2Fyw6EgcmVhbGl6YXIgZWwgdHJhdGFtaWVudG8gZGUgbG9zIHZhbG9yZXMgbnVsb3MgZGUgbGEgYmFzZSBkZSAqKkJ1ZW5vcyBBaXJlcyoqDQoNCmBgYHtyfQ0KR0JBICU+JSB2aXNkYXQ6OnZpc19kYXQod2Fybl9sYXJnZV9kYXRhID0gRikNCm5hbmlhcjo6Z2dfbWlzc192YXIoR0JBLCBzaG93X3BjdCA9IFQpDQpuYW5pYXI6OmdnX21pc3NfdXBzZXQoR0JBLG5zZXRzID0gMTApDQpgYGANCg0KQ29tbyBzZSBwdWVkZSB2ZXIgZW4gbG9zIGdyw6FmaWNvcyBhbnRlcmlvcmVzLCBsYSB2YXJpYWJsZSBxdWUgbcOhcyBwb3NlZSB2YWxvcmVzIG51bG9zIGVzIGBpbmZsdWVuY2lhX2RlX2NyaXN0aW5hX2VuX3NjaW9saWAuIEVzdGEgdmFyaWFibGUgbm8gc2UgZW5jdWVudHJhIHJlbGFjaW9uYWRhIGRpcmVjdGFtZW50ZSBjb24gb3RyYXMuIFBvciBsbyBxdWUgbm8gc2UgZGViZSBhIHVuIHNhbHRvIHBvciBubyBjb21wbGV0YXIgYWxndW5hIHByZWd1bnRhIGRlIGxhIGVuY3Vlc3RhLg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJ30NCg0KIyBDb252aWVydG8gbGFzIHZhcmlhYmxlcyBhIGZhY3Rvcg0KZGZfYnNhcyA8LSBHQkEgIHw+IA0KICBtdXRhdGVfYWxsKGFzLmZhY3RvcikgfD4gDQogIG11dGF0ZSh1YSA9IGFzLm51bWVyaWModWEpKQ0KDQptaWNlX29iamVjdCA8LSBtaWNlKGRmX2JzYXMsIG1ldGhvZCA9ICJwb2x5cmVnIikNCnN1bW1hcnkobWljZV9vYmplY3QpDQpkZl9nYmFfc2luX05BIDwtIGNvbXBsZXRlKG1pY2Vfb2JqZWN0KQ0KYGBgDQoNCk1vc3RyYW1vcyBlbCByZXN1bHRhZG8gZGUgbGEgaW1wdXRhY2nDs24NCg0KYGBge3J9DQp2aXNkYXQ6OnZpc19taXNzKGRmX2diYV9zaW5fTkEpDQoNCmBgYA0KDQpDb21vIHNlIHB1ZWRlIHZlciBlbiBlbCBncsOhZmljbyB5YSBubyBoYXkgdmFsb3JlcyBudWxvcy4gTG9zIG1pc21vcyBmdWVyb24gaW1wdXRhZG9zIHNhdGlzZmFjdG9yaWFtZW50ZSBwb3IgYG1pY2VgIC4NCg0KIyMjICoqQ8OzcmRvYmEqKg0KDQpFbiBlc3RlIHN1YnBhbmVsIHNlIGJ1c2NhcsOhIHJlYWxpemFyIGVsIHRyYXRhbWllbnRvIGRlIGxvcyB2YWxvcmVzIG51bG9zIGRlIGxhIGJhc2UgZGUgKipDw7NyZG9iYSoqDQoNCmBgYHtyfQ0KQ09SRE9CQSAlPiUgdmlzZGF0Ojp2aXNfZGF0KHdhcm5fbGFyZ2VfZGF0YSA9IEYpDQpuYW5pYXI6OmdnX21pc3NfdmFyKENPUkRPQkEsIHNob3dfcGN0ID0gVCkNCm5hbmlhcjo6Z2dfbWlzc191cHNldChDT1JET0JBLG5zZXRzID0gMTApDQpgYGANCg0KQSBkaWZlcmVuY2lhIGRlbCBkYXRhc2V0IGRlIEJ1ZW5vcyBBaXJlcywgc2Ugb2JzZXJ2YSBtZW5vcyBjYW50aWRhZCBkZSB2YWxvcmVzIG51bG9zLiBTZSBwcm9jZWRlcsOhIGEgaW1wdXRhciBsb3MgbWlzbW9zOg0KDQpgYGB7ciByZXN1bHRzPSdoaWRlJ30NCiMgQ29udmllcnRvIGxhcyB2YXJpYWJsZXMgYSBmYWN0b3INCmRmX2NvcmRvYmEgPC0gQ09SRE9CQSAgfD4gDQogIG11dGF0ZV9hbGwoYXMuZmFjdG9yKSB8PiANCiAgbXV0YXRlKHVhID0gYXMubnVtZXJpYyh1YSkpDQoNCm1pY2Vfb2JqZWN0IDwtIG1pY2UoZGZfY29yZG9iYSwgbWV0aG9kID0gInBvbHlyZWciKQ0Kc3VtbWFyeShtaWNlX29iamVjdCkNCmRmX2NvcmRvYmFfc2luX05BIDwtIGNvbXBsZXRlKG1pY2Vfb2JqZWN0KQ0KYGBgDQoNCk1vc3RyYW1vcyBlbCByZXN1bHRhZG8gZGUgbGEgaW1wdXRhY2nDs246DQoNCmBgYHtyfQ0KdmlzZGF0Ojp2aXNfbWlzcyhkZl9jb3Jkb2JhX3Npbl9OQSkNCmBgYA0KDQojIyBFeHBsb3JhbmRvIGxvcyBkYXRvcw0KDQojIyMgKipCdWVub3MgQWlyZXMqKg0KDQpBIGNvbnRpbnVhY2nDs24gc2UgYW5hbGl6YXLDoSBlbCBkYXRhc2V0IGRlICoqQnVlbm9zIEFpcmVzLioqRWwgcGFxdWV0ZSB7SG1pc2N9IHBlcm1pdGUgdW5hIGJ1ZW5hIHZpc3VhbGl6YWNpw7NuIGRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMuIEFsZ3VuYXMgb2JzZXJ2YWNpb25lczoNCg0KYGBge3J9DQojIGFuYWxpemFtb3MgbG9zIGRhdG9zIA0KcmVzdW1lbl9nYmEgPC0gSG1pc2M6OmRlc2NyaWJlKGRmX2diYV9zaW5fTkEsIHRyYW5zcG9zZSA9IEZBTFNFLHRhYnVsYXIgPSBGQUxTRSkNCg0KDQpyZXN1bWVuX2diYQ0KYGBgDQoNCkxhIG1heW9yw61hIGRlIGxvcyBlbmN1ZXN0YWRvcyAoNDUlKSBzZSBlbmN1ZW50cmEgZW4gZWwgcmFuZ28gZGUgYGVkYWRgIGRlIDUwLTY1IGHDsW9zLiBFbCA1MiUgc2Vnw7puIGxhIHZhcmlhYmxlIGBzZXhvYCBlcyBtdWplci4gUmVzcGVjdG8gYWwgbml2ZWwgZWR1Y2F0aXZvIChgbml2X2VkdWNhdGl2b2ApIGVsIDM3LjMlIHBvc2VlIHNlY3VuZGFyaW8sIGVsIDI5JSB0ZXJjaWFyaW8gY29tcGxldG8sIGVsIDIxJSBwcmltYXJpbyBjb21wbGV0bywgZWwgMTcuMiUgVGVyY2lhcmlvIGluY29tcGxldG8uIFksIHBvciDDumx0aW1vLCBlbCAxNi40JSBwb3NlZSBVbml2ZXJzaXRhcmlvIGNvbXBsZXRvIG8gaW5jb21wbGV0by4NCg0KU29icmUgZWwgYHZvdG9fY2FuZGlkYXRvYCBlbCAzOC42JSB0aWVuZSBpbnRlbmNpb25lcyBkZSB2b3RhciBhIERhbmllbCBTY2lvbGksIGVsIDI5LjglIGEgTWF1cmljaW8gTWFjcmkgeSwgZWwgMjEuNCUgYSBTZXJnaW8gTWFzc2EuIEVuIGVzdGEgbWlzbWEgbGluZWEsIHNlIG9ic2V2YW4gbG9zIHJlc3VsdGFkb3MgZGUgYHZvdG9fYWNvdGFkb2AgLiBFbiBgamFtYXNfdm90YXJpYWAgcmFua2VhIERhbmllbCBTY2lvbGkgY29uIHVuIDQ0LjIlLg0KDQpFbCA1MS41JSBkZXNhcHJ1ZWJhIGxhIGBnZXN0aW9uX2NyaXN0aW5hYCwgcGFyYSBlbCA0Ny41JSBsYSBlY29ub23DrWEgZW4gZXN0b3MgdWx0aW1vcyBkb3MgYcOxb3MgZW1wZW9yw7MgKGBlY29ub21pYV9wYWlzXzJfYW5vc2ApLCBlbCAzNi4yJSBjb25zaWRlcmEgcXVlIHN1IGVjb25vbcOtYSBmYW1pbGlhciBlbXBlb3JvIChgZWNvbm9taWFfZmxpYXJfMl9hbm9zYCkuIFNpbiBlbWJhcmdvLCBwYXJhIGVsIDUzLjYlIHNlIGRlYmVyw61hIG1hbnRlbmVyIGFsZ3VuYXMgcG9sw610aWNhcyB5IGNhbWJpYXIgb3RyYXMgeSBlbCAyNCUgcGllbnNhIHF1ZSBoYWJyw61hIHF1ZSBtYW50ZW5lciB0b2RhcyBsYXMgcG9sw610aWNhcyAoYGNvbnRpbnVpZGFkX29fY2FtYmlvYCkuIFNvYnJlIGVzdGUgcHVudG8sIGVsIDM0JSBzb3N0aWVuZSBxdWUgbGEgcmVwcmVzZW50YWNpw7NuIGRlbCBjYW1iaW8gKGByZXByZXNlbnRhY2lvbl9kZWxfY2FtYmlvYCkgZXN0w6EgZW4gbWFub3MgZGUgTWF1cmljaW8gTWFjcmkgeSBlbCAzMS40IGRlIERhbmllbCBTY2lvbGkNCg0KRW50cmUgbGEgYWdlbmRhIGRlIHRlbWFzIG3DoXMgbWVuY2lvbmFkb3Mgc2UgZW5jdWVudHJhOiBFZHVjYWNpw7NuLCBBc2lzdGVuY2lhIFNvY2lhbCwgU2FsdWQgeSBFbXBsZW8gKGBhZ2VuZGFfZGVfdGVtYXNgKS4gRWwgNDYuNCUgY3JlZSBxdWUgZ2FuYXLDoSBEYW5pZWwgU2Npb2xpIChgcGVyY2VwY2lvbl9kZV9nYW5hZG9yYCkgeSBlbCAyNS41JSBNYXVyaWNpbyBNYWNyaS4gRW4gZXN0ZSBzZW50aWRvLCBlbCA1Mi41JSBjb25zaWRlcmEgcXVlIGhheSBpbmZsdWVuY2lhIGRlIENGSyBzb2JyZSBEYW5pZWwgU2Npb2xpIChgaW5mbHVlbmNpYV9kZV9jcmlzdGluYV9lbl9zY2lvbGlgKQ0KDQpFbiByZWxhY2nDs24gY29uIGVsIHBvc2ljaW9uYW1pZW50byBkZSBsb3MgZW5jdWVzdGFkb3M6IEVsIDYwJSBubyBzZSBjb25zaWRlcmEgbmkgZGUgaXpxdWllcmRhIG5pIGRlIGRlcmVjaGEgKGBwb3NpY2lvbmFtaWVudG9fZXNwYWNpYWxgKSB5IGVsIDU2JSBubyBzZSBkZWZpbmUgbmkgY29tbyBwZXJvbmlzdGEgbmkgYW50aXBlcm9uaXN0YSAoYHBvc2ljaW9uYW1pZW50b19yZXNwZWN0b19wZXJvbmlzbW9gKS4gTG8gbWlzbW8gc3VjZWRlIGNvbiBlbCBwb3NpY2lvbmFtaWVudG8gcmVzcGVjdG8gYWwga2lyY2huZXJpc21vLCBlbCA0MC41JSBubyBzZSBjb25zaWRlcmEgSyBuaSBhbnRpSywgZWwgMjklIGVzIGFudGlLIHkgZWwgMjYuOCUgZXMgSw0KDQpTb2JyZSBxdcOpIHZvdGFyb24gZW4gbGFzIFBBU08sIGVsIDM1LjclIHZvdMOzIGEgRGFuaWVsIFNjaW9saSB5IGVsIDIxLjIlIGEgTWF1cmljaW8gTWFjcmkNCg0KYGBge3J9DQpkZl9jYXRlZ29yaWNhcyA8LSBkZl9nYmFfc2luX05BICU+JQ0KICBzZWxlY3RfaWYoaXMuZmFjdG9yKQ0KDQojIENyZW8gdW5hIGxpc3RhDQpsaXN0YV9ncmFmaWNvcyA8LSBsaXN0KCkNCg0KIyBBcm1vIHVuIGxvb3AgcGFyYSBncmFmaWNhciB0b2Rvcw0KZm9yIChjb2wgaW4gbmFtZXMoZGZfY2F0ZWdvcmljYXMpKSB7DQogICMgQ2FsY3VsYW1vcyBsYSBmcmVjdWVuY2lhIGRlIGNhZGENCiAgZnJlY3VlbmNpYXMgPC0gZGZfZ2JhX3Npbl9OQSAlPiUNCiAgICBjb3VudCghIXN5bShjb2wpLCB2b3RvX2Fjb3RhZG8gKSAlPiUNCiAgICBncm91cF9ieSh2b3RvX2Fjb3RhZG8pICU+JQ0KICAgIG11dGF0ZShwb3JjZW50YWplID0gbiAvIHN1bShuKSAqIDEwMCkNCiAgDQogIA0KICAjIEdyYWZpY2Ftb3MNCiAgZ3JhZmljb19iYXJyYXNfYXBpbGFkb3MgPC0gZ2dwbG90KGZyZWN1ZW5jaWFzLCBhZXMoeCA9IHJlb3JkZXIoISFzeW0oY29sKSwgLXBvcmNlbnRhamUpLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IGFzLmZhY3Rvcih2b3RvX2Fjb3RhZG8pKSkgKw0KICAgIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJyxzdGF0ID0gImlkZW50aXR5IikgKw0KICAgIGxhYnModGl0bGUgPSBOVUxMLCB4ID0gY29sLCB5ID0gIiAiLCBmaWxsID0gIlZvdG8gQWNvdGFkbyIpICsNCiAgICBndWlkZXMoZmlsbCA9IGd1aWRlX2xlZ2VuZCh0aXRsZSA9ICIgIikpICsNCiAgICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDMiKSArIyANCiAgICB0aGVtZV9taW5pbWFsKCkgKw0KICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgc2l6ZSA9IDUsIGFuZ2xlID0gNDUpLA0KICAgICAgICAgIGF4aXMudGV4dC54LnRvcCA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEsIHNpemUgPSA1LGFuZ2xlID0gNDUpLA0KICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwNCiAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAndG9wJywNCiAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjQsICdjbScpLCAjIGVzIHBhcmEgbG9zIGN1YWRyYWRpdG9zDQogICAgICAgICAgbGVnZW5kLmtleS53aWR0aCA9IHVuaXQoMC40LCAnY20nKQ0KICAgICAgICAgICkgKw0KICAgIHNjYWxlX3hfZGlzY3JldGUobGFiZWxzID0gZnVuY3Rpb24oeCkgc3RyX3dyYXAoeCwgd2lkdGggPSAxMCkpICANCiAgDQogICMgR3VhcmRvIGxvcyBncsOhZmljb3MgZW4gbGEgbGlzdGENCiAgbGlzdGFfZ3JhZmljb3NbW2NvbF1dIDwtIGdyYWZpY29fYmFycmFzX2FwaWxhZG9zDQp9DQoNCiMgQXJtYW1vcyB2YXJpYXMgZ3JpbGxhcyBwYXJhIHF1ZSBubyBzZSBhcGVsbWFjZQ0KbnVtX2dyaWxsYXMgPC0gY2VpbGluZyhsZW5ndGgobGlzdGFfZ3JhZmljb3MpIC8gNikNCmdyaWxsYXMgPC0gbGFwcGx5KDE6bnVtX2dyaWxsYXMsIGZ1bmN0aW9uKGkpIHsNCiAgaW5pY2lvIDwtIChpIC0gMSkgKiA2ICsgMQ0KICBmaW4gPC0gbWluKGkgKiA2LCBsZW5ndGgobGlzdGFfZ3JhZmljb3MpKQ0KICBncmlkLmFycmFuZ2UoZ3JvYnMgPSBsaXN0YV9ncmFmaWNvc1tpbmljaW86ZmluXSwgbmNvbCA9IDIpDQp9KQ0KDQpgYGANCg0KRW4gZXN0ZSBncsOhZmljbyBzZSBtdWVzdHJhIHBvciB2YXJpYWJsZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBgdm90b19hY290YWRvYCAuIEVuIHJlbGFjacOzbiBjb24gbGFzICoqdmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcyoqIHBvZGVtb3MgZGVjaXIgcXVlIGRlbnRybyBkZWwgcmFuZ28gZGUgZWRhZCA1MC02NSBlbCAiTm8gc2FiZSIgbGlkZXJhIGxhcyByZXNwdWVzdGFzLCBlbiBzZWd1bmRvIGx1Z2FyIE1hdXJpY2lvIE1hY3JpIHkgdGVyY2VybyBEYW5pZWwgU2Npb2xpLiBFbnRyZSBsb3MgMTgtMjkgYcOxb3MgZWwgdm90byBlbiBibGFuY28gbyBuaW5ndW5vIHRpZW5lIG1heW9yIHByb3BvcmNpb24uIERhbmllbCBTY2lvbGkgdGllbmUgbWF5b3IgcHJvcG9yY2nDs24gZGUgVm90byBGZW1lbmlubywgeSBTZXJnaW8gTWFzc2EgbWFzY3VsaW5vLiBZLCBTZXJnaW8gTWFzc2EgbGlkZXJhIGVudHJlIGxvcyBxdWUgcG9zZWVuIHNlY3VuZGFyaW8gY29tcGxldG8gbyBpbmNvbXBsZXRvIHkgdW5pdmVyc2l0YXJpbyB5IHRlcmNpYXJpbyBlc3TDoSBwYXJlam8gZW50cmUgTWFjcmkgeSBTY2lvbGkNCg0KUmVzcGVjdG8gYSBsYXMgdmFyaWFibGVzIGVjb27Ds21pY2FzOiBRdWllbmVzIGRlc2FwcnVlYmFuIGxhIGdlc3Rpw7NuIGNyaXN0aW5hIGVuIG1heW9yIG1lZGlkYSB2b3RhcsOhbiBhIE1hdXJpY2lvIE1hY3JpIHksIGVudHJlIHF1aWVuZXMgbGEgYXBydWViYW4gdm90YXLDoW5hIGEgRGFuaWVsIFNjaW9saSAoYGdlc3Rpb25fY3Jpc3RpbmFgKS4gRW4gZWwgbWlzbW8gc2VudGlkbywgcXVpZW5lcyBjb25zaWRlcmFuIHF1ZSBzdSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgZW1wZW9yw7MgKGBlY29ub21pYV9wYWlzXzJfYW5vc2AgeSBgZWNvbm9taWFfZmxpYXJfMl9hbm9zYCkgdm90YXLDoW4gYSBsYSBvcG9zaWNpw7NuIHksIGEgbGEgaW52ZXJzYSwgYWwgb2ZpY2lhbGlzbW8NCg0KIyMjICoqQ8OzcmRvYmEqKg0KDQpBIGNvbnRpbnVhY2nDs24gc2UgYW5hbGl6YXLDoSBlbCBkYXRhc2V0IGRlICoqQ8OzcmRvYmEuKioNCg0KYGBge3J9DQpyZXN1bWVuX2NiYSA8LSBIbWlzYzo6ZGVzY3JpYmUoZGZfY29yZG9iYV9zaW5fTkEsIHRyYW5zcG9zZSA9IEZBTFNFLHRhYnVsYXIgPSBGQUxTRSkgDQoNCnJlc3VtZW5fY2JhDQoNCmBgYA0KDQpFbiBwcmltZXIgbHVnYXIsIGdyYWNpYXMgYSBsYSBpbXB1dGFjacOzbiB5YSBubyBoYXkgdmFsb3JlcyBudWxvcyBkZW50cm8gZGVsIGRmLiBFbiB0b3RhbCBoYXkgMjczIG9ic2VydmFjaW9uZXMuIEFsIGlndWFsIHF1ZSBjb21vIHN1Y2VkZSBlbiAqKkJ1ZW5vcyBBaXJlcywqKiBsYSBtYXlvcsOtYSBkZSBsYXMgcGVyc29uYXMgZW5jdWVzdGFkYXMgcGVydGVuZWNlbiBzZSBlbmN1ZW50cmFuIGVudHJlIDMwIHkgNjUgYcOxb3MgKGBlZGFkYCkgeSwgc3UgYHNleG9gIGNvcnJlc3BvbmRlIGEgbXVqZXIgKDU1LjklKS4gRWwgbml2ZWwgZWR1Y2F0aXZvIHByZWRvbWluYW50ZSBlcyAqdW5pdmVyc2l0YXJpbyBjb21wbGV0byBvIGluY29tcGxldG8qIChgbml2X2VkdWNhdGl2b2ApLg0KDQpFbiBgdm90b19jYW5kaWRhdG9gIGVsIDQ2LjklIHZvdGFyw61hIGEgTWF1cmljaW8gTWFjcmkgeSBlbCAyMy40JSBhIERhbmllbCBTY2lvbGkuIEVzdGEgZGlzdHJpYnVjacOzbiBzZSBtYW50aWVuZSBlbiBgdm90b19hY290YWRvYCAuIEFkZW3DoXMsIGVsIDYzLjQlIGphbcOhcyB2b3RhcsOtYSBhIERhbmllbCBTY2lvbGkgeSBlbCAyNC4xJSBhIE1hdXJpY2lvIE1hY3JpLg0KDQpFbiByZWxhY2nDs24gY29uIGxhIGdlc3Rpw7NuIGRlbCBHb2JpZXJubyBkZSBDcmlzdGluYSAoYGdlc3Rpb25fY3Jpc3RpbmFgKSA2NS42JSBkZSBsb3MgY29yZG9iZXNlcyBlbmN1ZXN0YWRvcyBsYSBkZXNhcHJ1ZWJhIHkgZWwgNjIuMiUgY29uc2lkZXJhIHF1ZSBsYSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgZGVsIHBhw61zIGVtcGVvcsOzIGVuIGxvcyDDumx0aW1vcyBkb3MgYcOxb3MgKGBlY29ub21pYV9wYWlzXzJfYW5vc2ApLiBObyBvYnN0YW50ZSwgc2kgYmllbiBlbCA0NCUgZGUgbG9zIGVuY3Vlc3RhZG9zIGNyZWUgcXVlIHN1IHNpdHVhY2nDs24gZWNvbsOzbWljYSBmYW1pbGlhciBlbXBlb3LDsywgZWwgMzAlIGNvbnNpZGVyYSBxdWUgbm8gaHVibyBjYW1iaW8gKGBlY29ub21pYV9mbGlhcl8yX2Fub3NgKQ0KDQpBbCByZXNwZWN0byBkZSBsYSBjb250aW51aWRhZCBkZSBsYXMgcG9sw610aWNhcyBkZSBnb2JpZXJubyBwYXJhIGVsIDU2LjIlIHNlIGRlYmVyw61hIG1hbnRlbmVyIGFsZ3Vub3MgeSBtb2RpZmljYXIgb3RyYXMgKGBjb250aW51aWRhZF9vX2NhbWJpb2ApLiBFbiBlc3RhIGzDrW5lYSwgcGFyYSBlbCA0Ny4yJSBsYSBpbWFnZW4gZGVsIGNhbWJpbyBlcyBNYXVyaWNpbyBNYWNyaSAoYHJlcHJlc2VudGFjaW9uX2RlbF9jYW1iaW9gKS4gTG9zIHRlbWFzIG1hcyBpbXBvcnRhbnRlcyBtw6FzIGVsZWdpZG9zIHNvbjogRWR1Y2FjacOzbiwgQXNpc3RlbmNpYSBTb2NpYWwsIFNhbHVkIHkgRW1wbGVvIChgYWdlbmRhX2RlX3RlbWFzYCkNCg0KUGFyYSBlbCAzNy41ICUgZWwgZ2FuYWRvciBzZXLDoSBNYXVyaWNpbyBNYWNyaSB5IHBhcmEgZWwgMzYuNiUgc2Vyw6EgRGFuaWVsIFNjaW9saSAoYHBlcmNlcGNpb25fZGVfZ2FuYWRvcmApLiBFbiBsaW5lYSwgZWwgMzcuMiUgY29uc2lkZXJhIHF1ZSBoYXkgaW5mbHVlbmNpYSBkZSBDRksgZW4gRGFuaWVsIFNjaW9saSAoYGluZmx1ZW5jaWFfZGVfY3Jpc3RpbmFfZW5fc2Npb2xpYCkNCg0KU29icmUgbGEgcG9zaWNpw7NuIGlkZW9sw7NnaWNhIGRlIGxvcyBlbmN1ZXN0YWRvczoNCg0KLSAgIEVsIDYzLjElIG5vIHNlIGNvbnNpZGVyYSBuaSBkZSBpenF1aWVyZGEgbmkgZGUgZGVyZWNoYSAoYHBvc2ljaW9uYW1pZW50b19lc3BhY2lhbGApDQoNCi0gICBFbCA2NC43JSBubyBlcyBuaSBwZXJvbmlzdGEgbmkgYW50aXBlcm9uaXN0YSAoYHBvc2ljaW9uYW1pZW50b19yZXNwZWN0b19wZXJvbmlzbW9gKQ0KDQotICAgRWwgNDIuMiUgbm8gZXMgSyBuaSBBbnRpSywgcGVybyBlbCAzOC44JSBzZSBjb25zaWRlcmEgYW50aWtpcmNobmVyaXN0YSAoYHBvc2ljaW9uYW1pZW50b19yZXNwZWN0b19raXJjaG5lcmlzbW9gKQ0KDQpQb3Igw7psdGltbywgZW4gbGFzIFBBU08gZWwgMzIuNSB2b3TDsyBhIE1hdXJpY2lvIE1hY3JpLCB5IGVsIDE2LjYlIGEgRGFuaWVsIFNjaW9saSAoYHZvdGFjaW9uX3Bhc29gKQ0KDQpgYGB7ciBmaWcuaGVpZ2h0PSA1LCBmaWcud2lkdGg9IDh9DQpkZl9jYXRlZ29yaWNhcyA8LSBkZl9jb3Jkb2JhX3Npbl9OQSAlPiUNCiAgc2VsZWN0X2lmKGlzLmZhY3RvcikNCg0KIyBDcmVvIHVuYSBsaXN0YQ0KbGlzdGFfZ3JhZmljb3MgPC0gbGlzdCgpDQoNCiMgQXJtbyB1biBsb29wIHBhcmEgZ3JhZmljYXIgdG9kb3MNCmZvciAoY29sIGluIG5hbWVzKGRmX2NhdGVnb3JpY2FzKSkgew0KICAjIENhbGN1bGFtb3MgbGEgZnJlY3VlbmNpYSBkZSBjYWRhDQogIGZyZWN1ZW5jaWFzIDwtIGRmX2NvcmRvYmFfc2luX05BICU+JQ0KICAgIGNvdW50KCEhc3ltKGNvbCksIHZvdG9fYWNvdGFkbyApICU+JQ0KICAgIGdyb3VwX2J5KHZvdG9fYWNvdGFkbykgJT4lDQogICAgbXV0YXRlKHBvcmNlbnRhamUgPSBuIC8gc3VtKG4pICogMTAwKQ0KICANCiAgDQogICMgR3JhZmljYW1vcw0KICBncmFmaWNvX2JhcnJhc19hcGlsYWRvcyA8LSBnZ3Bsb3QoZnJlY3VlbmNpYXMsIGFlcyh4ID0gcmVvcmRlcighIXN5bShjb2wpLCAtcG9yY2VudGFqZSksIHkgPSBwb3JjZW50YWplLCBmaWxsID0gYXMuZmFjdG9yKHZvdG9fYWNvdGFkbykpKSArDQogICAgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnLHN0YXQgPSAiaWRlbnRpdHkiKSArDQogICAgbGFicyh0aXRsZSA9IE5VTEwsIHggPSBjb2wsIHkgPSAiICIsIGZpbGwgPSAiVm90byBBY290YXRvIikgKw0KICAgIGd1aWRlcyhmaWxsID0gZ3VpZGVfbGVnZW5kKHRpdGxlID0gIiAiKSkgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpICsjIA0KICAgIHRoZW1lX21pbmltYWwoKSArDQogICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLCBzaXplID0gNSwgYW5nbGUgPSA0NSksDQogICAgICAgICAgYXhpcy50ZXh0LngudG9wID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMSwgc2l6ZSA9IDUsYW5nbGUgPSA0NSksDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICd0b3AnLA0KICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA0KSwNCiAgICAgICAgICBsZWdlbmQua2V5LnNpemUgPSB1bml0KDAuNCwgJ2NtJyksICMgZXMgcGFyYSBsb3MgY3VhZHJhZGl0b3MNCiAgICAgICAgICBsZWdlbmQua2V5LndpZHRoID0gdW5pdCgwLjQsICdjbScpDQogICAgICAgICAgKSArDQogICAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHMgPSBmdW5jdGlvbih4KSBzdHJfd3JhcCh4LCB3aWR0aCA9IDEwKSkgIA0KICANCiAgIyBHdWFyZG8gbG9zIGdyw6FmaWNvcyBlbiBsYSBsaXN0YQ0KICBsaXN0YV9ncmFmaWNvc1tbY29sXV0gPC0gZ3JhZmljb19iYXJyYXNfYXBpbGFkb3MNCn0NCg0KIyBBcm1hbW9zIHZhcmlhcyBncmlsbGFzIHBhcmEgcXVlIG5vIHNlIGFwZWxtYWNlDQpudW1fZ3JpbGxhcyA8LSBjZWlsaW5nKGxlbmd0aChsaXN0YV9ncmFmaWNvcykgLyA2KQ0KZ3JpbGxhcyA8LSBsYXBwbHkoMTpudW1fZ3JpbGxhcywgZnVuY3Rpb24oaSkgew0KICBpbmljaW8gPC0gKGkgLSAxKSAqIDYgKyAxDQogIGZpbiA8LSBtaW4oaSAqIDYsIGxlbmd0aChsaXN0YV9ncmFmaWNvcykpDQogIGdyaWQuYXJyYW5nZShncm9icyA9IGxpc3RhX2dyYWZpY29zW2luaWNpbzpmaW5dLCBuY29sID0gMikNCn0pDQpgYGANCg0KRW4gZXN0ZSBncsOhZmljbyBzZSBtdWVzdHJhIHBvciB2YXJpYWJsZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBgdm90b19hY290YWRvYCAuIEVuIHJlbGFjacOzbiBjb24gbGFzICoqdmFyaWFibGVzIHNvY2lvZGVtb2dyw6FmaWNhcyoqIHBvZGVtb3MgZGVjaXIgcXVlOiBEYW5pZWwgU2Npb2xpIHNlcsOhIG3DoXMgdm90YWRvIHBvciBlbCByYW5nbyAzMC00OSBhw7FvcyB5IE1hY3JpIHBvciA1MC02NSwgU2VyZ2lvIE1hc3NhIHRpZW5lIG1heW9yIHByb3BvcmNpw7NuIGRlIFZvdG8gRmVtZW5pbm8sIGFsIGlndWFsIHF1ZSBNYXVyaWNpbyBNYWNyaS4gWSwgRGFuaWVsIFNjaW9saSBsaWRlcmEgZW50cmUgbG9zIHVuaXZlcnNpdGFydWlzIHkgTWF1cmljaW8gTWFjcmkgZW50cmUgbG9zIHF1ZSBwb3NlZW4gc2VjdW5kYXJpbyBjb21wbGV0byBvIGluY29tcGxldG8uIFJlc3BlY3RvIGEgbGFzIHZhcmlhYmxlcyBlY29uw7NtaWNhcyB5IGRlIGdlc3Rpw7NuLCBsYXMgcmVzcHVlc3RhcyB2YW4gZW4gbMOtbmVhIGNvbiBsbyB2aXN0byBlbiAqKkJ1ZW5vcyBBaXJlcyoqDQoNCiMgUG9uZGVyYWNpw7NuIGl0ZXJhdGl2YQ0KDQpFbCAqKm3DqXRvZG8gZGUgcG9uZGVyYWNpw7NuIGl0ZXJhdGl2YSoqIGNvbnNpc3RlIGVuIGFqdXN0YXIgbG9zIHZhbG9yZXMgYXNpZ25hZG9zIGEgY2FkYSBvYnNlcnZhY2nDs24gLiBEZSBlc3RhIG1hbmVyYSwgbG8gcXVlIHNlIGJ1c2NhIGVzIGNvcnJlZ2lyIGVsIGVycm9yIGRlIG11ZXN0cmVvIHkgaGFjZXIgY29pbmNpZGlyIGxhIG11ZXN0cmEgY29uIGxhcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhIHBvYmxhY2nDs24uIFBhcmEgZWxsbywgZXMgbmVjZXNhcmlvIGF1bWVudGFyIGxhIGluZmx1ZW5jaWEgZGUgbGFzIHVuaWRhZGVzIHN1YnJlcHJlc2VudGFkYXMgeSBkaXNtaW51aXIgbGEgaW5mbHVlbmNpYSBkZSBsYXMgdW5pZGFkZXMgc29icmVycmVwcmVzZW50YWRhcy4NCg0KUGFyYSBkaWNoYSB0YXJlYSBzZSB1dGlsaXphcsOhIGVsIHBhcXVldGUge2FuZXNyYWtlfSBxdWUgcGVybWl0ZSByZWFsaXphciBsYSBjYWxpYnJhY2nDs24gKG8gYWp1c3RlKSBkZSBsYXMgbXVlc3RyYXMgYSBwYXJ0aXIgZGUgb2JqZXRpdm9zIGRlIHBvYmxhY2nDs24gY29ub2NpZG9zIFtBcXXDrSBzZSBwdWVkZSBhY2NlZGVyIGEgbGEgZnVlbnRlXShodHRwczovL3phY2hhcnlsaGVydHouZ2l0aHViLmlvL3Bvc3RzLzIwMjIvMDUvd2VpZ2h0aW5nLXN1cnZleXMpLiBTZSB0cmF0YSBkZSB1bmEgZnVuY2nDs24gcXVlIGltcGxlbWVudGEgZWwgbcOpdG9kbyBkZSBjYWxpYnJhY2nDs24gaXRlcmF0aXZhLg0KDQpFbCBtw6l0b2RvIGRlIGNhbGlicmFjacOzbiBpdGVyYXRpdmEgc2UgcmVwaXRlIHZhcmlhcyB2ZWNlcyBoYXN0YSBxdWUgc2UgYWxjYW56YSBsYSBjb252ZXJnZW5jaWEuIEVuIGNhZGEgaXRlcmFjacOzbiwgbG9zIHBlc29zIGRlIGxhIG11ZXN0cmEgc2UgYWp1c3RhbiBwYXJhIHF1ZSBsYXMgcHJvcG9yY2lvbmVzIGRlIGxhcyB2YXJpYWJsZXMgY2FsaWJyYWRhcyBzZSBhY2VycXVlbiBhIGxhcyBwcm9wb3JjaW9uZXMgZGUgbGEgcG9ibGFjacOzbiBvYmpldGl2by4gTHVlZ28sIHNlIHV0aWxpemFuIGVzdG9zIG51ZXZvcyBwZXNvcyBhanVzdGFkb3MgcGFyYSBjYWxjdWxhciBsYXMgcHJvcG9yY2lvbmVzIG51ZXZhbWVudGUsIHkgZWwgcHJvY2VzbyBzZSByZXBpdGUgaGFzdGEgcXVlIGxhcyBwcm9wb3JjaW9uZXMgY29udmVyZ2VuIGEgbG9zIHZhbG9yZXMgZGVzZWFkb3MNCg0KQSBkaWZlcmVuY2lhIGRlIHBhcXVldGVzIGNvbW8ge3N1cnZleX0gY29uIHthbmVzcmFrZX0gbm8gZXMgbmVjZXNhcmlvIHRlbmVyIHVuIGRpc2XDsW8gZGUgbXVlc3RyZW8gY3JlYWRvIHByZXZpYW1lbnRlIHBhcmEgdXRpbGl6YXJsbyBzaW5vIHF1ZSBwdWVkZSByZWFsaXphcnNlIGRpcmVjdGFtZW50ZSBjb24gbGEgYmFzZSBkZSBlbmN1ZXN0YXMgeSBkZWZpbmlyIGxvcyBvYmpldGl2b3MgZGUgY2FsaWJyYWNpw7NuIGVuIGZvcm1hIGRlIHVuYSBsaXN0YS4NCg0KUGFyYSBkaWNoYSB0YXJlYSBzZSB1dGlsaXphcsOhbiBsYXMgdmFyaWFibGVzIGBzZXhvYCwgYGVkYWRgIHkgYG5pdl9lZHVjYXRpdm9gIC4gQSBjb250aW51YWNpw7NuIHNlIG9idGllbmVuIGxvcyB2YWxvcmVzIHBvYmxhY2lvbmFsZXMgZGUgbGEgKipFbmN1ZXN0YSBQZXJtYW5lbnRlIGRlIEhvZ2FyZXMgLSBFUEgqKiBkZWwgYcOxbyAyMDE1IGVuIGZ1bmNpw7NuIGRlIGVzdGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzDQoNCmBgYHtyfQ0KDQojIGNhcmdvIGFyY2hpdm9zIA0KDQpwb25kZXJhZG9yX3NleG8gPC0gcmVhZF94bHN4KCJDb25zaWduYSB5IG1hdGVyaWFsZXMgVFAxL01hdGVyaWFsZXMgZGUgcmVmZXJlbmNpYS9Tb2Npb2RlbW9ncmFmaWNvcy54bHN4IixzaGVldCA9ICJzZXhvIikNCnBvbmRlcmFkb3JfZWRhZCA8LSByZWFkX3hsc3goIkNvbnNpZ25hIHkgbWF0ZXJpYWxlcyBUUDEvTWF0ZXJpYWxlcyBkZSByZWZlcmVuY2lhL1NvY2lvZGVtb2dyYWZpY29zLnhsc3giLHNoZWV0ID0gImVkYWQiKQ0KcG9uZGVyYWRvcl9lZHVjYSA8LSByZWFkX3hsc3goIkNvbnNpZ25hIHkgbWF0ZXJpYWxlcyBUUDEvTWF0ZXJpYWxlcyBkZSByZWZlcmVuY2lhL1NvY2lvZGVtb2dyYWZpY29zLnhsc3giLHNoZWV0ID0gImVkdWNhIikNCmBgYA0KDQojIyAqKkJ1ZW5vcyBBaXJlcyoqDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBQb25kZXJhZG9yZXMgZGUgc2V4bw0KcG9uX3NleG9fYmFpcmVzIDwtIHBvbmRlcmFkb3Jfc2V4byAgfD4gDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCdjb2wnKSAgfD4gDQogIHNlbGVjdChzZXhvLCBHQkEpIHw+IA0KICBtdXRhdGUocHJvcCA9IEdCQSkgIHw+IA0KICBzZWxlY3Qoc2V4bywgcHJvcCkgfD4gDQogIGFzLmRhdGEuZnJhbWUoKSAgfD4gDQogIHB1bGwocHJvcCkgfD4gDQogIGFzLm51bWVyaWMoKSANCg0KbmFtZXMocG9uX3NleG9fYmFpcmVzKSA8LSBjKCJWYXLDs24iLCJNdWplciIpDQoNCiMgUG9uZGVyYWRvciBkZSBlZGFkDQpwb25fZWRhZF9iYWlyZXMgPC0gcG9uZGVyYWRvcl9lZGFkIHw+IA0KICBmaWx0ZXIoZWRhZCAhPTE4KSB8PiANCiAgbXV0YXRlKGVkYWQgPSBjYXNlX3doZW4oZWRhZCA8PTI5IH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA8PTQ5IH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA8PTY1IH4gMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWRhZCA+NjUgfiA0KSkgfD4NCiAgbXV0YXRlIChlZGFkID0gZmFjdG9yKGVkYWQsDQogICAgICAgICAgICAgICAgbGV2ZWxzID0gYygxOjQpLCANCiAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCIxOC0yOSIsIjMwLTQ5IiwiNTAtNjUiLCI+NjUiKSwNCiAgICAgICAgICAgICAgICBvcmRlcmVkID0gVCkpIHw+IA0KICBzZWxlY3QoJ2VkYWQnLCdnYmEnKSB8PiANCiAgZ3JvdXBfYnkoZWRhZCkgfD4gDQogIHN1bW1hcmlzZShuID0gc3VtKGdiYSkpIHw+IA0KICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSB8PiANCiAgc2VsZWN0KGVkYWQsIHByb3ApfD4gDQogIGFzLmRhdGEuZnJhbWUoKSB8PiANCiAgcHVsbChwcm9wKSB8PiANCiAgYXMubnVtZXJpYygpIA0KICANCm5hbWVzKHBvbl9lZGFkX2JhaXJlcykgPC0gYygiMTgtMjkiLCIzMC00OSIsIjUwLTY1IiwiPjY1IikNCg0KIyBOaXZlbCBlZHVjYXRpdm8NCnBvbl9lZHVjX2JhaXJlcyA8LSBwb25kZXJhZG9yX2VkdWNhICU+JQ0KICBtdXRhdGUobmVfYnNhcyA9IGZhY3RvcihuaXZlbF9lZHVjYXRpdm8sDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiU2luIGluc3RydWNjacOzbiIsICJQcmltYXJpYSBJbmNvbXBsZXRhIChpbmNsdXllIGVkdWNhY2nDs24gZXNwZWNpYWwpIiwgIlByaW1hcmlhIENvbXBsZXRhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWN1bmRhcmlhIEluY29tcGxldGEiLCAiU2VjdW5kYXJpYSBDb21wbGV0YSIsICJTdXBlcmlvciBVbml2ZXJzaXRhcmlhIEluY29tcGxldGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1cGVyaW9yIFVuaXZlcnNpdGFyaWEgQ29tcGxldGEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJQLiBDb21wbGV0YSIsICJQLiBDb21wbGV0YSIsICJQLiBDb21wbGV0YSIsICJTZWMuIENvbXAtVGVyYy4gSW5jIiwgIlNlYy4gQ29tcC1UZXJjLiBJbmMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlcmMvVW5pdi4gQ29tcGxldG8iLCAiVGVyYy9Vbml2LiBDb21wbGV0byIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyZWQgPSBUUlVFKSkgfD4gDQogIHNlbGVjdChuZV9ic2FzLGdiYSkgfD4gDQogIGdyb3VwX2J5KG5lX2JzYXMpIHw+IA0KICBzdW1tYXJpc2Uobj0gc3VtKGdiYSkpIHw+IA0KICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSB8PiANCiAgc2VsZWN0KCFuKSB8PiANCiAgcHVsbChwcm9wKSB8PiANCiAgYXMubnVtZXJpYygpDQoNCm5hbWVzKHBvbl9lZHVjX2JhaXJlcykgPC0gYygiUC4gQ29tcGxldGEiLCAiU2VjLiBDb21wLVRlcmMuIEluYyIsICJUZXJjL1VuaXYuIENvbXBsZXRvIikNCg0KDQpgYGANCg0KYGBge3J9DQojIGxpc3RhZG8gZGUgcG9uZGVyYWRvcmVzDQp0YXJnZXRzX2JhaXJlcyA8LSBsaXN0KHBvbl9zZXhvX2JhaXJlcyxwb25fZWRhZF9iYWlyZXMscG9uX2VkdWNfYmFpcmVzKQ0KDQojIG5vbWJyZXMgZGVsIGRmDQpuYW1lcyh0YXJnZXRzX2JhaXJlcykgPC0gYygic2V4byIsImVkYWQiLCJuZV9ic2FzIikNCg0KIyBtdWVzdHJvIGxvcyBwb25kZXJhZG9yZXMNCnRhcmdldHNfYmFpcmVzDQoNCg0KYmFzZV9iYWlyZXMgPC0gIGFzLmRhdGEuZnJhbWUoZGZfZ2JhX3Npbl9OQSkNCg0KDQojIGNyZW8gcG9uZGVyYWNpb25fZXBoIGNvbiBhbmVzcmFrZQ0Kd2VpZ2h0c19iYWlyZXMgPC0gYW5lc3Jha2UoaW5wdXR0ZXIgPSB0YXJnZXRzX2JhaXJlcywgZGF0YWZyYW1lID0gYmFzZV9iYWlyZXMsIGNhc2VpZCA9IGJhc2VfYmFpcmVzJHVhLCB0eXBlID0gIm5vbGltIikgDQoNCiMgdW5pbW9zDQpiYXNlX2JhaXJlcyRwb25kZXJhY2lvbl9lcGggIDwtIHVubGlzdCh3ZWlnaHRzX2JhaXJlc1sxXSkNCg0KcHJpbnQocGFzdGUoImxhIGNhbnRpZGFkIGRlIGl0ZXJhY2lvbmVzIG5lY2VzYXJpYXMgcGFyYSByZWFsaXphciBsYSBwb25kZXJhY2nDs24gZGUgbGEgbXVlc3RyYSBmdWUgZGUiLCB3ZWlnaHRzX2JhaXJlcyRpdGVyYXRpb25zLCAiaXRlcmFjaW9uZXMiKSkNCg0KYGBgDQoNCkxhIGBiYXNlX2JhaXJlc2AgZnVlIHBvbmRlcmFkYSBlbiAzMSBpdGVyYWNpb25lcy4gT2JzZXJ2YW1vcyBsYSBkaXN0cmlidWNpw7NuIGVuIGZ1bmNpw7NuIGRlIGxhIHZhcmlhYmxlIGB2b3RvX2Fjb3RhZG9gDQoNCmBgYHtyfQ0KZGZfZ2JhX3N1bW1hcnkgPC0gYmFzZV9iYWlyZXMgJT4lDQogIGdyb3VwX2J5KHZvdG9fYWNvdGFkbykgJT4lDQogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdCh1YSksDQogICAgICAgICAgICBuX3BvbmQgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgJT4lDQogIG11dGF0ZShwcm9wX24gPSAobiAvIHN1bShuKSkqMTAwLA0KICAgICAgICAgcHJvcF9wb25kID0gKG5fcG9uZCAvIHN1bShuX3BvbmQpKSoxMDApICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMocHJvcF9uLCBwcm9wX3BvbmQpLCBuYW1lc190byA9ICJUaXBvIGRlIHBvbmRlcmFjacOzbiIsIHZhbHVlc190byA9ICJQb3JjZW50YWplIikgJT4lDQogIG11dGF0ZShgVGlwbyBkZSBwb25kZXJhY2nDs25gID0gaWZlbHNlKGBUaXBvIGRlIHBvbmRlcmFjacOzbmAgPT0gInByb3BfbiIsICJObyBQb25kZXJhZG8iLCAiUG9uZGVyYWRvIikpDQoNCiMgR3JhZmljYW1vcw0KDQpnZ3Bsb3QoZGZfZ2JhX3N1bW1hcnksIGFlcyh4ID0gdm90b19hY290YWRvLCB5ID0gUG9yY2VudGFqZSwgZmlsbCA9IGBUaXBvIGRlIHBvbmRlcmFjacOzbmApKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgbGFicyh0aXRsZSA9ICJWb3RvIGFjb3RhZG8gcG9uZGVyYWRvIHkgc2luIHBvbmRlcmFyIiwNCiAgICAgICB4ID0gIlZvdG8gYWNvdGFkbyIsDQogICAgICAgeSA9ICJQb3JjZW50YWplIiwNCiAgICAgICBmaWxsID0gIlRpcG8gZGUgbXVlc3RyYSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoc2NhbGUgPSAxKSkgKyBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkFjY2VudCIpICsgDQogIHRoZW1lX2xpZ2h0KCkgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiU2V0MyIpDQpgYGANCg0KIyMgKipDw7NyZG9iYSoqDQoNClJlcGV0aW1vcyBlbCBwcm9jZWRpbWllbnRvIGNvbiBlbCBkZiBkZSAqQ8OzcmRvYmEqOg0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0KDQojVHJhbnNmb3JtYW1vcyBsYXMgdmFyaWFibGVzIGRlIGxvcyBwb25kZXJhZG9yZXMgcGFyYSBxdWUgY29pbmNpZGFuIGNvbiBsYSBiYXNlDQojIFBvbmRlcmFkb3IgZGUgc2V4byBlcGgNCnBvbl9zZXhvX2NvcmRvYmEgPC0gcG9uZGVyYWRvcl9zZXhvICB8PiANCiAgYWRvcm5fcGVyY2VudGFnZXMoJ2NvbCcpICB8PiANCiAgc2VsZWN0KHNleG8sIGNiYSkgfD4gDQogIG11dGF0ZShwcm9wID0gY2JhKSAgfD4gDQogIHNlbGVjdChzZXhvLCBwcm9wKSB8PiANCiAgYXMuZGF0YS5mcmFtZSgpICB8PiANCiAgcHVsbChwcm9wKSB8PiANCiAgYXMubnVtZXJpYygpIA0KDQpuYW1lcyhwb25fc2V4b19jb3Jkb2JhKSA8LSBjKCJWYXLDs24iLCJNdWplciIpDQoNCiMgcG9uZGVyYWRvciBkZSBlZGFkDQpwb25fZWRhZF9jb3Jkb2JhIDwtIHBvbmRlcmFkb3JfZWRhZCB8PiANCiAgZmlsdGVyKGVkYWQgIT0xOCkgfD4gDQogIG11dGF0ZShlZGFkID0gY2FzZV93aGVuKGVkYWQgPD0yOSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPD00OSB+IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPD02NSB+IDMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGVkYWQgPjY1IH4gNCkpIHw+DQogIG11dGF0ZSAoZWRhZCA9IGZhY3RvcihlZGFkLA0KICAgICAgICAgICAgICAgIGxldmVscyA9IGMoMTo0KSwgDQogICAgICAgICAgICAgICAgbGFiZWxzID0gYygiMTgtMjkiLCIzMC00OSIsIjUwLTY1IiwiPjY1IiksDQogICAgICAgICAgICAgICAgb3JkZXJlZCA9IFQpKSB8PiANCiAgc2VsZWN0KCdlZGFkJywnY2JhJykgfD4gDQogIGdyb3VwX2J5KGVkYWQpIHw+IA0KICBzdW1tYXJpc2UobiA9IHN1bShjYmEpKSB8PiANCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgfD4gDQogIHNlbGVjdChlZGFkLCBwcm9wKXw+IA0KICBhcy5kYXRhLmZyYW1lKCkgfD4gDQogIHB1bGwocHJvcCkgfD4gDQogIGFzLm51bWVyaWMoKSANCiAgDQpuYW1lcyhwb25fZWRhZF9jb3Jkb2JhKSA8LSBjKCIxOC0yOSIsIjMwLTQ5IiwiNTAtNjUiLCI+NjUiKQ0KDQojIHBvbmRlcmFkb3IgZGVsIG5pdmVsIGVkdWNhdGl2bw0KcG9uX2VkdWNfY29yZG9iYSA8LSBwb25kZXJhZG9yX2VkdWNhICU+JQ0KICBtdXRhdGUobmVfY2JhID0gZmFjdG9yKG5pdmVsX2VkdWNhdGl2bywNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJTaW4gaW5zdHJ1Y2Npw7NuIiwgIlByaW1hcmlhIEluY29tcGxldGEgKGluY2x1eWUgZWR1Y2FjacOzbiBlc3BlY2lhbCkiLCAiUHJpbWFyaWEgQ29tcGxldGEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlY3VuZGFyaWEgSW5jb21wbGV0YSIsICJTZWN1bmRhcmlhIENvbXBsZXRhIiwgIlN1cGVyaW9yIFVuaXZlcnNpdGFyaWEgSW5jb21wbGV0YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJpb3IgVW5pdmVyc2l0YXJpYSBDb21wbGV0YSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIlAuIENvbXBsZXRhIiwgIlAuIENvbXBsZXRhIiwgIlAuIENvbXBsZXRhIiwgIlNlYy4gQ29tcC1UZXJjLiBJbmMiLCAiU2VjLiBDb21wLVRlcmMuIEluYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVyYy9Vbml2LiBDb21wbGV0byIsICJUZXJjL1VuaXYuIENvbXBsZXRvIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJlZCA9IFRSVUUpKSB8PiANCiAgc2VsZWN0KG5lX2NiYSxjYmEpIHw+IA0KICBncm91cF9ieShuZV9jYmEpIHw+IA0KICBzdW1tYXJpc2Uobj0gc3VtKGNiYSkpIHw+IA0KICBtdXRhdGUocHJvcCA9IG4vc3VtKG4pKSB8PiANCiAgc2VsZWN0KCFuKSB8PiANCiAgcHVsbChwcm9wKSB8PiANCiAgYXMubnVtZXJpYygpDQoNCg0KbmFtZXMocG9uX2VkdWNfY29yZG9iYSkgPC0gYygiUC4gQ29tcGxldGEiLCAiU2VjLiBDb21wLVRlcmMuIEluYyIsICJUZXJjL1VuaXYuIENvbXBsZXRvIikNCg0KDQpgYGANCg0KYGBge3J9DQojIGNyZW8gbGEgbGlzdGEgZGUgcG9uZGVyYWRvcmVzDQp0YXJnZXRzX2NvcmRvYmEgPC0gbGlzdChwb25fc2V4b19jb3Jkb2JhLHBvbl9lZGFkX2NvcmRvYmEscG9uX2VkdWNfY29yZG9iYSkNCg0KIyBwb25nbyBsb3MgbWlzbW9zIG5vbWJyZXMgZGUgbGFzIHZhcmlhYmxlcyBkZWwgZGYNCm5hbWVzKHRhcmdldHNfY29yZG9iYSkgPC0gYygic2V4byIsImVkYWQiLCJuZV9jYmEiKQ0KDQojIGxvcyBwb25kZXJhZG9yZXMgcGFyYSBpdGVyYXINCnRhcmdldHNfY29yZG9iYQ0KDQpiYXNlX2NvcmRvYmEgPC0gIGFzLmRhdGEuZnJhbWUoZGZfY29yZG9iYV9zaW5fTkEpDQoNCiMgY3JlbyBwb25kZXJhY2lvbl9lcGggY29uIGFuZXNyYWtlDQp3ZWlnaHRzX2NvcmRvYmEgPC0gYW5lc3Jha2UoaW5wdXR0ZXIgPSB0YXJnZXRzX2NvcmRvYmEsIGRhdGFmcmFtZSA9IGJhc2VfY29yZG9iYSwgY2FzZWlkID0gYmFzZV9jb3Jkb2JhJHVhLCB0eXBlID0gIm5vbGltIikgDQoNCnByaW50KHBhc3RlKCJsYSBjYW50aWRhZCBkZSBpdGVyYWNpb25lcyBuZWNlc2FyaWFzIHBhcmEgcmVhbGl6YXIgbGEgcG9uZGVyYWNpw7NuIGRlIGxhIG11ZXN0cmEgZnVlIGRlIiwgd2VpZ2h0c19jb3Jkb2JhJGl0ZXJhdGlvbnMsICJpdGVyYWNpb25lcyIpKQ0KIyB1bmltb3MNCmJhc2VfY29yZG9iYSRwb25kZXJhY2lvbl9lcGggIDwtIHVubGlzdCh3ZWlnaHRzX2NvcmRvYmFbMV0pDQpgYGANCg0KVmVtb3MgcXVlIHNlIG5lY2VzaXRhcm9uIDIzIGl0ZXJhY2lvbmVzIHBhcmEgcG9uZGVyYXIgbnVlc3RyYSBtdWVzdHJhLiBBIGNvbnRpbnVhY2nDs24gc2UgbXVlc3RyYSBsYSBudWV2YSBkaXN0cmlidWNpw7NuIHBvYmxhY2nDs24gZW4gZnVuY2nDs24gZGUgbGEgdmFyaWFibGUgYHZvdG9fYWNvdGFkb2ANCg0KYGBge3J9DQpkZl9jYmFfc3VtbWFyeSA8LSBiYXNlX2NvcmRvYmEgJT4lDQogIGdyb3VwX2J5KHZvdG9fYWNvdGFkbykgJT4lDQogIHN1bW1hcmlzZShuID0gbl9kaXN0aW5jdCh1YSksDQogICAgICAgICAgICBuX3BvbmQgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgJT4lDQogIG11dGF0ZShwcm9wX24gPSAobiAvIHN1bShuKSkqMTAwLA0KICAgICAgICAgcHJvcF9wb25kID0gKG5fcG9uZCAvIHN1bShuX3BvbmQpKSoxMDApICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IGMocHJvcF9uLCBwcm9wX3BvbmQpLCBuYW1lc190byA9ICJUaXBvIGRlIHBvbmRlcmFjacOzbiIsIHZhbHVlc190byA9ICJQb3JjZW50YWplIikgJT4lDQogIG11dGF0ZShgVGlwbyBkZSBwb25kZXJhY2nDs25gID0gaWZlbHNlKGBUaXBvIGRlIHBvbmRlcmFjacOzbmAgPT0gInByb3BfbiIsICJObyBQb25kZXJhZG8iLCAiUG9uZGVyYWRvIikpDQoNCiMgR3JhZmljYW1vcw0KZ2dwbG90KGRmX2NiYV9zdW1tYXJ5LCBhZXMoeCA9IHZvdG9fYWNvdGFkbywgeSA9IFBvcmNlbnRhamUsIGZpbGwgPSBgVGlwbyBkZSBwb25kZXJhY2nDs25gKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIGVudHJlIGVsIFZvdG8gQWNvdGFkbyBwb25kZXJhZG8geSBzaW4gcG9uZGVyYXIiLA0KICAgICAgIHggPSAiVm90byBhY290YWRvIiwNCiAgICAgICB5ID0gIlBvcmNlbnRhamUiLA0KICAgICAgIGZpbGwgPSAiVGlwbyBkZSBtdWVzdHJhIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50X2Zvcm1hdChzY2FsZSA9IDEpKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikNCg0KDQpgYGANCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0KIyBFbGltaW5hbW9zIGxvIHF1ZSB5YSBubyB1c2Ftb3MNCnJtKENPUkRPQkEsIEdCQSwgZGZfYnNhcywgZGZfY29yZG9iYSwgbWljZV9vYmplY3QsIGRmX2NhdGVnb3JpY2FzLGRmX2NiYV9zdW1tYXJ5LCBmcmVjdWVuY2lhcywgZ3JhZmljb19iYXJyYXNfYXBpbGFkb3MsIGdyaWxsYXMsIGxpc3RhX2dyYWZpY29zLCByZXN1bWVuX2NiYSwgdGFyZ2V0c19jb3Jkb2JhLCB3ZWlnaHRzX2NvcmRvYmEsZGZfY29yZG9iYV9zaW5fTkEsIHBvbl9lZGFkX2NvcmRvYmEsIHBvbl9zZXhvX2NvcmRvYmEsIHBvbl9lZHVjX2NvcmRvYmEsIHJlc3VtZW5fZ2JhLCBkZl9nYmFfc2luX05BLCBwb25kZXJhZG9yX2VkYWQscG9uZGVyYWRvcl9lZHVjYSwgcG9uZGVyYWRvcl9zZXhvLHRhcmdldHNfYmFpcmVzLCB3ZWlnaHRzX2NvcmRvYmEsIHBvbl9lZGFkX2JhaXJlcywgcG9uX3NleG9fYmFpcmVzLCBwb25fZWR1Y19iYWlyZXMsbnVtX2dyaWxsYXMsY29sLCB3ZWlnaHRzX2JhaXJlcywgZGZfZ2JhX3N1bW1hcnkpDQpgYGANCg0KIyBQb3RlbmNpYWwgRWxlY3RvcmFsDQoNCkVuIGVzdGUgYXBhcnRhZG8gc2UgYnVzY2Fyw6EgZXZhbHVhciBlbCBwb3RlbmNpYWwgZWxlY3RvcmFsIGRlIGxvcyBwcmluY2lwYWxlcyBjYW5kaWRhdG9zIGEgUHJlc2lkZW50ZSAoTWFjcmkgeSBTY2lvbGkpIG1lZGlhbnRlIGxhIHTDqWNuaWNhIGRlICoqcGlzb3MqKiB5ICoqdGVjaG9zKiouDQoNCiMjIEPDoWxjdWxvIGRlbCB2b3RvIFBvdGVuY2lhbA0KDQpTZSBlbnRpZW5kZSBwb3IgKip2b3RvIHBvdGVuY2lhbCoqIGEgbGEgZXN0aW1hY2nDs24gZGVsIHBvcmNlbnRhamUgbcOheGltbyBkZSB2b3RvcyBxdWUgdW4gY2FuZGlkYXRvIHBvZHLDrWEgb2J0ZW5lciBlbiB1bmEgZWxlY2Npw7NuLiBQYXJhIGNhbGN1bGFyIGVsIHZvdG8gcG90ZW5jaWFsLCBzZSBjb25zaWRlcmFuIHRyZXMgZ3J1cG9zIGRlIHZvdGFudGVzOg0KDQotICAgKipWb3RhbnRlcyBTZWd1cm9zKio6IFNvbiBhcXVlbGxvcyBxdWUgeWEgaGFuIG1hbmlmZXN0YWRvIHN1IGludGVuY2nDs24gZGUgdm90YXIgcG9yIHVuIGNhbmRpZGF0byBlc3BlY8OtZmljbyB5IG5vIGNhbWJpYXLDoW4gc3UgZWxlY2Npw7NuLiBQYXJhIGNhbGN1bGFyIGVzdG8gc2UgdXRpbGl6YXLDoW4gbGFzIHZhcmlhYmxlcyBgdm90b19hY290YWRvYCB5IGB2b3RvX2NhbnRpZGF0b2ANCg0KLSAgICoqVm90YW50ZXMgSW5kZWNpc29zKio6IFNvbiBhcXVlbGxvcyBxdWUgYcO6biBubyBoYW4gZGVjaWRpZG8gcG9yIHF1acOpbiB2b3RhciB5IGVzdMOhbiBjb25zaWRlcmFuZG8gZGlmZXJlbnRlcyBvcGNpb25lcy4NCg0KLSAgICoqVm90YW50ZXMgcXVlIE5vIFZvdGFyw61hbioqOiBTb24gYXF1ZWxsb3MgcXVlIGhhbiBtYW5pZmVzdGFkbyBxdWUgbm8gdm90YXLDrWFuIHBvciB1biBjYW5kaWRhdG8gZXNwZWPDrWZpY28gYmFqbyBuaW5ndW5hIGNpcmN1bnN0YW5jaWEuIFBhcmEgZWxsbywgc2UgdXRpbGl6YXLDoSBsYSB2YXJpYWJsZSBgamFtYXNfdm90YXLDrWFgDQoNCkVsIHZvdG8gcG90ZW5jaWFsIHNlIGNhbGN1bGEgcmVzdGFuZG8gZWwgcG9yY2VudGFqZSBkZSB2b3RhbnRlcyBxdWUgbm8gdm90YXLDrWFuIGRlbCAxMDAlIHkgbHVlZ28gcmVzdGFuZG8gZWwgcG9yY2VudGFqZSBkZSB2b3RhbnRlcyBzZWd1cm9zLiBFcyBkZWNpcjoNCg0KfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKipWb3RvIFBvdGVuY2lhbCA9IDEwMCUgLSBQb3JjZW50YWplIGRlIFZvdGFudGVzIE5vIFZvdGFyw61hbiAtIFBvcmNlbnRhamUgZGUgVm90YW50ZXMgU2VndXJvcyoqIHwNCg0KRWwgcmVzdWx0YWRvIGVzIGVsIHBvcmNlbnRhamUgbcOheGltbyBkZSB2b3RvcyBxdWUgdW4gY2FuZGlkYXRvIHBvZHLDrWEgb2J0ZW5lciBzaSBsb2dyYXJhIGF0cmFlciBhIHRvZG9zIGxvcyB2b3RhbnRlcyBpbmRlY2lzb3MuIC4NCg0KIyMjICoqQnVlbm9zIEFpcmVzKioNCg0KRW4gcHJpbWVyIGx1Z2FyLCBzZSBjcmVhIGxhIHZhcmlhYmxlIGB2b3RvX2ZpbmFsYCBpbXB1dGFuZG8gbG9zIHZhbG9yZXMgZGUgYHZvdG9fYWNvdGFkb2AgcGFyYSBhcXVlbGxvcyBjYXNvcyBlbiBkb25kZSBlbCBlbmN1ZXN0YWRvICpObyBzYWJlKg0KDQpgYGB7cn0NCiN1bmlxdWUoYmFzZV9iYWlyZXMkdm90b19jYW5kaWRhdG8pDQpkZl9wb3RlbmNpYWxfYmEgPC0gYmFzZV9iYWlyZXMgfD4gDQogIG11dGF0ZSh2b3RvX2ZpbmFsID0gaWZlbHNlKHZvdG9fY2FuZGlkYXRvID09ICJObyBTYWJlIiwgdm90b19hY290YWRvLCB2b3RvX2NhbmRpZGF0byksDQogICAgICAgICB2b3RvX2ZpbmFsID0gY2FzZV93aGVuKA0KICAgICAgICAgICB2b3RvX2ZpbmFsID09IDEgfiAiRGFuaWVsIFNjaW9saSIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gMiB+ICJNYXVyaWNpbyBNYWNyaSIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gMyB+ICJTZXJnaW8gTWFzc2EiLA0KICAgICAgICAgICB2b3RvX2ZpbmFsID09IDQgfiAiTWFyZ2FyaXRhIFN0b2xiaXplciIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gNSB+ICJOaWNvbGFzIERlbCBDYcOxbyIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gNiB+ICJBZG9sZm8gUm9kcmlndWV6IFNhYSIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gOCB+ICJOaW5ndW5vIC8gRW4gQmxhbmNvIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSA5IH4gIk5vIFNhYmUiKSkNCg0KIyBDYWxjdWxhbW9zIGxhIGludGVuY2nDs24gZGUgdm90bw0KDQojcGlzbw0KZGZfYmFpcmVzX2ludGVuY2lvbiA8LSBkZl9wb3RlbmNpYWxfYmEgJT4lDQogIGdyb3VwX2J5KHZvdG9fZmluYWwpICU+JQ0KICBzdW1tYXJpc2UodG90ID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+DQogIG11dGF0ZShwb3JjZW50YWplX3ZvdGFyaWEgPSAodG90L3N1bShkZl9wb3RlbmNpYWxfYmEkcG9uZGVyYWNpb25fZXBoKSkqMTAwKSAlPiUNCiAgYXJyYW5nZShkZXNjKHBvcmNlbnRhamVfdm90YXJpYSkpIHw+IA0KICByZW5hbWUoImNhbmRpZGF0byIgPSB2b3RvX2ZpbmFsKSB8PiANCiAgc2VsZWN0KC10b3QpDQoNCg0KI3RlY2hvDQpkZl9iYWlyZXNfdGVjaG8gPC0gZGZfcG90ZW5jaWFsX2JhICU+JQ0KICBncm91cF9ieShqYW1hc192b3RhcmlhKSAlPiUNCiAgc3VtbWFyaXNlKHRvdCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8Pg0KICBtdXRhdGUocG9yY2VudGFqZV9udW5jYV92b3RhcmlhID0gKHRvdC9zdW0oZGZfcG90ZW5jaWFsX2JhJHBvbmRlcmFjaW9uX2VwaCkpKjEwMCkgfD4gDQogIHJlbmFtZSgiY2FuZGlkYXRvIiA9IGphbWFzX3ZvdGFyaWEpfD4gDQogIHNlbGVjdCgtdG90KQ0KDQoNCiN1bmltb3MNCmRmX3BlX2diYSA8LSBsZWZ0X2pvaW4oZGZfYmFpcmVzX3RlY2hvLCBkZl9iYWlyZXNfaW50ZW5jaW9uLCBieSA9ICJjYW5kaWRhdG8iKQ0KDQojcG90ZW5jaWFsDQoNCmRmX3BlX2diYSA8LWRmX3BlX2diYSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamVfcG90ZW5jaWFsID0gMTAwLShwb3JjZW50YWplX3ZvdGFyaWErcG9yY2VudGFqZV9udW5jYV92b3RhcmlhKSkNCg0KIyBGaWx0cmFtb3MgcG9yIGxvcyBjYW5kaWRhdG9zIHNvbGljaXRhZG9zDQpkZl9wZV9nYmEgPC0gZGZfcGVfZ2JhICU+JQ0KICBmaWx0ZXIoY2FuZGlkYXRvICVpbiUgYygiRGFuaWVsIFNjaW9saSIsICJNYXVyaWNpbyBNYWNyaSIpKQ0KDQojIFNlbGVjY2lvbmFyIGNvbHVtbmFzIHJlbGV2YW50ZXMgcGFyYSBlbCBncsOhZmljbw0KY29scyA8LSBjKCJwb3JjZW50YWplX3ZvdGFyaWEiLCAicG9yY2VudGFqZV9wb3RlbmNpYWwiLCAicG9yY2VudGFqZV9udW5jYV92b3RhcmlhIikNCg0KIyBHcmFmaWNhbW9zIA0KZGZfcGVfZ2JhIHw+IA0KICBwaXZvdF9sb25nZXIoY29scywgbmFtZXNfdG8gPSAidGlwb192b3RvIix2YWx1ZXNfdG8gPSAicHJvcCIpIHw+IGdncGxvdCgpICsNCiBhZXMoeCA9IGNhbmRpZGF0bywgeSA9IHByb3AsIGZpbGwgPSB0aXBvX3ZvdG8sbGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcCwgMSksICIlIikpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKHBvcmNlbnRhamVfbnVuY2Ffdm90YXJpYSA9ICIjOUUwMTQyIiwgDQpwb3JjZW50YWplX3BvdGVuY2lhbCA9ICIjODFDQkE2IiwgcG9yY2VudGFqZV92b3RhcmlhID0gIiM1RTRGQTIiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIgIiwgdGl0bGUgPSAiUG90ZW5jaWFsIGVsZWN0b3JhbCBCdWVub3MgQWlyZXMiLCANCiBzdWJ0aXRsZSA9ICJNYXVyaWNpbyBNYWNyaSB5IERhbmllbCBTY2lvbGkgLSAyMDE1IiwgZmlsbCA9ICJUaXBvIGRlIHZvdG8iKSArDQogY29vcmRfZmxpcCgpICsNCiB0aGVtZV9saWdodCgpICsNCiB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLCBoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzTCwgDQogZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKSArDQogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIikgDQpgYGANCg0KIyMjICoqQ8OzcmRvYmEqKg0KDQpgYGB7cn0NCiN1bmlxdWUoYmFzZV9iYWlyZXMkdm90b19jYW5kaWRhdG8pDQpkZl9wb3RlbmNpYWxfY2JhIDwtIGJhc2VfY29yZG9iYSB8PiANCiAgbXV0YXRlKHZvdG9fZmluYWwgPSBpZmVsc2Uodm90b19jYW5kaWRhdG8gPT0gIk5vIFNhYmUiLCB2b3RvX2Fjb3RhZG8sIHZvdG9fY2FuZGlkYXRvKSwNCiAgICAgICAgIHZvdG9fZmluYWwgPSBjYXNlX3doZW4oDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gMSB+ICJEYW5pZWwgU2Npb2xpIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSAyIH4gIk1hdXJpY2lvIE1hY3JpIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSAzIH4gIlNlcmdpbyBNYXNzYSIsDQogICAgICAgICAgIHZvdG9fZmluYWwgPT0gNCB+ICJNYXJnYXJpdGEgU3RvbGJpemVyIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSA1IH4gIk5pY29sYXMgRGVsIENhw7FvIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSA2IH4gIkFkb2xmbyBSb2RyaWd1ZXogU2FhIiwNCiAgICAgICAgICAgdm90b19maW5hbCA9PSA4IH4gIk5pbmd1bm8gLyBFbiBCbGFuY28iLA0KICAgICAgICAgICB2b3RvX2ZpbmFsID09IDkgfiAiTm8gU2FiZSIpKQ0KDQojIENhbGN1bGFtb3MgbGEgaW50ZW5jacOzbiBkZSB2b3RvDQoNCiNwaXNvDQpkZl9jb3Jkb2JhX2ludGVuY2lvbiA8LSBkZl9wb3RlbmNpYWxfY2JhICU+JQ0KICBncm91cF9ieSh2b3RvX2ZpbmFsKSAlPiUNCiAgc3VtbWFyaXNlKHRvdCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8Pg0KICBtdXRhdGUocG9yY2VudGFqZV92b3RhcmlhID0gKHRvdC9zdW0oZGZfcG90ZW5jaWFsX2NiYSRwb25kZXJhY2lvbl9lcGgpKSoxMDApICU+JQ0KICBhcnJhbmdlKGRlc2MocG9yY2VudGFqZV92b3RhcmlhKSkgfD4gDQogIHJlbmFtZSgiY2FuZGlkYXRvIiA9IHZvdG9fZmluYWwpIHw+IA0KICBzZWxlY3QoLXRvdCkNCg0KDQojdGVjaG8NCmRmX2NvcmRvYmFfdGVjaG8gPC0gZGZfcG90ZW5jaWFsX2NiYSAlPiUNCiAgZ3JvdXBfYnkoamFtYXNfdm90YXJpYSkgJT4lDQogIHN1bW1hcmlzZSh0b3QgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4NCiAgbXV0YXRlKHBvcmNlbnRhamVfbnVuY2Ffdm90YXJpYSA9ICh0b3Qvc3VtKGRmX3BvdGVuY2lhbF9iYSRwb25kZXJhY2lvbl9lcGgpKSoxMDApIHw+IA0KICByZW5hbWUoImNhbmRpZGF0byIgPSBqYW1hc192b3RhcmlhKXw+IA0KICBzZWxlY3QoLXRvdCkNCg0KDQojdW5pbW9zDQpkZl9wZV9jYmEgPC0gbGVmdF9qb2luKGRmX2NvcmRvYmFfdGVjaG8sIGRmX2NvcmRvYmFfaW50ZW5jaW9uLCBieSA9ICJjYW5kaWRhdG8iKQ0KDQojcG90ZW5jaWFsDQoNCmRmX3BlX2NiYSA8LWRmX3BlX2NiYSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamVfcG90ZW5jaWFsID0gMTAwLShwb3JjZW50YWplX3ZvdGFyaWErcG9yY2VudGFqZV9udW5jYV92b3RhcmlhKSkNCg0KIyBGaWx0cmFtb3MgcG9yIGxvcyBjYW5kaWRhdG9zIHNvbGljaXRhZG9zDQpkZl9wZV9jYmEgPC0gZGZfcGVfY2JhICU+JQ0KICBmaWx0ZXIoY2FuZGlkYXRvICVpbiUgYygiRGFuaWVsIFNjaW9saSIsICJNYXVyaWNpbyBNYWNyaSIpKQ0KDQojIFNlbGVjY2lvbmFyIGNvbHVtbmFzIHJlbGV2YW50ZXMgcGFyYSBlbCBncsOhZmljbw0KY29scyA8LSBjKCJwb3JjZW50YWplX3ZvdGFyaWEiLCAicG9yY2VudGFqZV9wb3RlbmNpYWwiLCAicG9yY2VudGFqZV9udW5jYV92b3RhcmlhIikNCg0KIyBHcmFmaWNhbW9zIA0KZGZfcGVfY2JhIHw+IA0KICBwaXZvdF9sb25nZXIoY29scywgbmFtZXNfdG8gPSAidGlwb192b3RvIix2YWx1ZXNfdG8gPSAicHJvcCIpIHw+IGdncGxvdCgpICsNCiBhZXMoeCA9IGNhbmRpZGF0bywgeSA9IHByb3AsIGZpbGwgPSB0aXBvX3ZvdG8sbGFiZWwgPSBwYXN0ZTAocm91bmQocHJvcCwgMSksICIlIikpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKHBvcmNlbnRhamVfbnVuY2Ffdm90YXJpYSA9ICIjOUUwMTQyIiwgDQpwb3JjZW50YWplX3BvdGVuY2lhbCA9ICIjODFDQkE2IiwgcG9yY2VudGFqZV92b3RhcmlhID0gIiM1RTRGQTIiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIgIiwgdGl0bGUgPSAiUG90ZW5jaWFsIGVsZWN0b3JhbCBDw7NyZG9iYSIsIA0KIHN1YnRpdGxlID0gIk1hdXJpY2lvIE1hY3JpIHkgRGFuaWVsIFNjaW9saSAtIDIwMTUiLCBmaWxsID0gIlRpcG8gZGUgdm90byIpICsNCiBjb29yZF9mbGlwKCkgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTNMLCANCiBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpICsNCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNCwgY29sb3IgPSAiYmxhY2siKSANCmBgYA0KDQojIyBQb3RlbmNpYWwgRWxlY3RvcmFsIENydXphZG8NCg0KQSBjb250aW51YWNpw7NuIHNlIHJlYWxpemEgb3RyYSBmb3JtYSBkZSBhbmFsaXphciBlbCBwb3RlbmNpYWwgZWxlY3RvcmFsIHkgZXMgdGVuaWVuZG8gZW4gY3VlbnRhIGxvcyB2b3RvcyAiKmVuIGRpc3B1dGEiKg0KDQotICAgKipWb3RhcsOtYSBhbCBjYW5kaWRhdG8qKjogUmVwcmVzZW50YSBlbCBwb3JjZW50YWplIGRlIHBlcnNvbmFzIHF1ZSB0aWVuZW4gbGEgaW50ZW5jacOzbiBkZSB2b3RhciBwb3IgZWwgY2FuZGlkYXRvIGVuIGN1ZXN0acOzbi4NCg0KLSAgICoqRW4gZGlzcHV0YSoqOiBSZXByZXNlbnRhIGVsIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgcXVlIHRvZGF2w61hIG5vIGhhbiBkZWNpZGlkbyBzdSB2b3RvIChpbmRlY2lzb3MpDQoNCi0gICAqKkphbcOhcyB2b3RhcsOtYSBhbCBjYW5kaWRhdG8qKjogUmVwcmVzZW50YSBlbCBwb3JjZW50YWplIGRlIHBlcnNvbmFzIHF1ZSBoYW4gbWFuaWZlc3RhZG8gcXVlIG51bmNhIHZvdGFyw61hbiBwb3IgZWwgY2FuZGlkYXRvLg0KDQpFbiBlc3RlIHB1bnRvIGxvIHF1ZSBzZSByZWFsaXphIGVzIGVuIGxvcyBjYXNvcyBlbiBkb25kZSBubyBzZSB2b3RhIGEgbmluZ3VubyBkZSBsb3MgY2FuZGlkYXRvcyBwcmluY2lwYWxlcyBlbiBgdm90b19maW5hbGAgc2UgaW1wdXRhIGVsIHZhbG9yICJpbmRlY2lzbyIgeSwgcGFyYSBsb3MgY2Fzb3MgZW4gZG9uZGUgZW4gYGphbcOhc192b3RhcsOtYWAgc2UgZWxpZ2llcm9uIGNhbmRpZGF0b3MgcXVlIG5vIHNvbiBuaSAqTWF1cmljaW8gTWFjcmkqIHkgKkRhbmllbCBTY2lvbGkqIHNlIGltcHV0YSBlbCB2YWxvciAiaW5kZWNpc28iDQoNCiMjIyAqKkJ1ZW5vcyBBaXJlcyoqDQoNCmBgYHtyfQ0KDQpkZl9wb3RlbmNpYWxfYmFfY3J1eiA8LSBkZl9wb3RlbmNpYWxfYmEgJT4lDQogIGZpbHRlcighIHZvdG9fZmluYWwgPT0gIk5pbmd1bm8gLyBFbiBCbGFuY28iKSB8PiANCiAgbXV0YXRlKHZvdG9fZmluYWwgPSBpZmVsc2UoDQogICAgISh2b3RvX2ZpbmFsID09ICJEYW5pZWwgU2Npb2xpIiAmIHZvdG9fZmluYWwgPT0gIk1hdXJpY2lvIE1hY3JpIiksICJJbmRlY2lzbyIsIHZvdG9fZmluYWwpLCAjIGluZGVjaXNvOiB2b3RvIGZpbmFsIG5vIGVzIG5pIE1NIG5pIERTDQogICAgbnVuY2FfZmluYWwgPSBpZmVsc2UoamFtYXNfdm90YXJpYSA9PSAiRGFuaWVsIFNjaW9saSIgfCBqYW1hc192b3RhcmlhID09ICJNYXVyaWNpbyBNYWNyaSIsamFtYXNfdm90YXJpYSwgIkVuIGRpc3B1dGEiKSwNCiAgICBudW5jYV9maW5hbCA9IGlmZWxzZShudW5jYV9maW5hbCA9PSAxLCAiRGFuaWVsIFNjaW9saSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShudW5jYV9maW5hbCA9PSAyLCAiTWF1cmljaW8gTWFjcmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW5jYV9maW5hbCkpKSMgRW4gZGlzcHV0YSBsb3MgcXVlIG5vIGVsaWplbiBhIE1NIHkgRFMgY29tbyBqYW1hcyB2b3RhcmlhDQoNCiMgQ2FsY3VsbyB0b3RhbGVzDQpiYV9jcnV6YWRvIDwtIGRmX3BvdGVuY2lhbF9iYV9jcnV6ICU+JQ0KICBncm91cF9ieSh2b3RvX2ZpbmFsLCBudW5jYV9maW5hbCkgJT4lDQogIHN1bW1hcmlzZSh0b3QgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4NCiAgbXV0YXRlKHBvcmNlbnRhamVfcG90ZW5jaWFsID0gcm91bmQodG90L3N1bShkZl9wb3RlbmNpYWxfYmEkcG9uZGVyYWNpb25fZXBoKSoxMDAsMikpIHw+DQogIHNlbGVjdCgtdG90KSB8PiANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IG51bmNhX2ZpbmFsLCB2YWx1ZXNfZnJvbSA9IHBvcmNlbnRhamVfcG90ZW5jaWFsKQ0KDQoNCiMgbW9zdHJhbW9zDQpiYV9jcnV6YWRvICAlPiUNCiAga2FibGVFeHRyYTo6a2FibGUoY2FwdGlvbiA9ICJQb3RlbmNpYWwgRWxlY3RvcmFsIENydXphZG8gLSBNYXVyaWNpbyBNYWNyaSB5IERhbmllbCBTY2lvbGkgKDIwMTUpIC0gQnVlbm9zIEFpcmVzIikgJT4lDQogIGthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSAicmVzcG9uc2l2ZSIpDQoNCmBgYA0KDQojIyMgKipDw7NyZG9iYSoqDQoNCmBgYHtyfQ0KZGZfcG90ZW5jaWFsX2NiYV9jcnV6IDwtIGRmX3BvdGVuY2lhbF9jYmEgJT4lDQogIGZpbHRlcighIHZvdG9fZmluYWwgPT0gIk5pbmd1bm8gLyBFbiBCbGFuY28iKSB8PiANCiAgbXV0YXRlKHZvdG9fZmluYWwgPSBpZmVsc2UoDQogICAgdm90b19maW5hbCAhPSAiRGFuaWVsIFNjaW9saSIgJiB2b3RvX2ZpbmFsICE9ICJNYXVyaWNpbyBNYWNyaSIsICJJbmRlY2lzbyIsIHZvdG9fZmluYWwpLCAjIGluZGVjaXNvOiB2b3RvIGZpbmFsIG5vIGVzIG5pIE1NIG5pIERTDQogICAgbnVuY2FfZmluYWwgPSBpZmVsc2UoamFtYXNfdm90YXJpYSA9PSAiRGFuaWVsIFNjaW9saSIgfCBqYW1hc192b3RhcmlhID09ICJNYXVyaWNpbyBNYWNyaSIsamFtYXNfdm90YXJpYSwgIkVuIGRpc3B1dGEiKSwNCiAgICBudW5jYV9maW5hbCA9IGlmZWxzZShudW5jYV9maW5hbCA9PSAxLCAiRGFuaWVsIFNjaW9saSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShudW5jYV9maW5hbCA9PSAyLCAiTWF1cmljaW8gTWFjcmkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW5jYV9maW5hbCkpKSMgRW4gZGlzcHV0YSBsb3MgcXVlIG5vIGVsaWplbiBhIE1NIHkgRFMgY29tbyBqYW1hcyB2b3RhcmlhDQoNCiMgQ2FsY3VsbyB0b3RhbGVzDQpjYmFfY3J1emFkbyA8LSBkZl9wb3RlbmNpYWxfY2JhX2NydXogJT4lDQogIGdyb3VwX2J5KHZvdG9fZmluYWwsIG51bmNhX2ZpbmFsKSAlPiUNCiAgc3VtbWFyaXNlKHRvdCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8Pg0KICBtdXRhdGUocG9yY2VudGFqZV9wb3RlbmNpYWwgPSByb3VuZCh0b3Qvc3VtKGRmX3BvdGVuY2lhbF9iYSRwb25kZXJhY2lvbl9lcGgpKjEwMCwyKSkgfD4NCiAgc2VsZWN0KC10b3QpIHw+IA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gbnVuY2FfZmluYWwsIHZhbHVlc19mcm9tID0gcG9yY2VudGFqZV9wb3RlbmNpYWwpDQoNCg0KIyBtb3N0cmFtb3MNCg0KY2JhX2NydXphZG8gICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZShjYXB0aW9uID0gIlBvdGVuY2lhbCBFbGVjdG9yYWwgQ3J1emFkbyAtIE1hdXJpY2lvIE1hY3JpIHkgRGFuaWVsIFNjaW9saSAoMjAxNSkgLSBDw7NyZG9iYSIpICU+JQ0KICBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gInJlc3BvbnNpdmUiKQ0KYGBgDQoNCiMgQ29tcG9ydGFtaWVudG8gZWxlY3RvcmFsDQoNCkVuIGVzdGUgYXBhcnRhZG8gc2UgYnVzY2Fyw6Egc2VsZWNjaW9uYXIgdW4gY29uanVudG8gZGUgaW5kaWNhZG9yZXMgcXVlIGRlbiBjdWVudGEgZGUgZG9zIGRlIGxhcyBwZXJzcGVjdGl2YXMgdGXDs3JpY2FzIHZpc3RhcyBlbiBsYSBiaWJsaW9ncmFmw61hIHNvYnJlIGNvbXBvcnRhbWllbnRvIGVsZWN0b3JhbCB5IGV2YWx1YXIgZWwgaW1wYWN0byBkZSBkaWNob3MgaW5kaWNhZG9yZXMgZW4gbGEgZGVjaXNpw7NuIGRlIHZvdG8gdXRpbGl6YW5kbyBhbCBtZW5vcyBkb3MgaGVycmFtaWVudGFzIGRlIGFuw6FsaXNpcyBjb21wYXJhbmRvIGxvcyByZXN1bHRhZG9zIGVudHJlIGFtYmFzIGNpdWRhZGVzDQoNCkV4aXN0ZW4gdHJlcyBtb2RlbG9zIGRlbnRybyBkZSBsYSB0ZW9yw61hIGRlbCBjb21wb3J0YW1pZW50byBlbGVjdG9yYWw6IEVsIG1vZGVsbyBzb2Npb2zDs2dpY28sIGVsIG1vZGVsbyBwc2ljby1zb2NpYWwgeSwgZWwgbW9kZWxvIHJhY2lvbmFsLWVjb27Ds21pY28uIFBhcmEgZWwgZGVzYXJyb2xsbyBkZSBlc3RlIGFwYXJ0YWRvIHNlIHNlbGVjY2lvbsOzIGVsICoqbW9kZWxvIHJhY2lvbmFsKiogeSwgZWwgKiptb2RlbG8gc29jaW9sw7NnaWNvKioNCg0KIyMgTW9kZWxvIFJhY2lvbmFsDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0NCg0KIyBCb3JybyBsbyBxdWUgbm8gdm95IGEgdXNhciBtw6FzDQpybShkZl9yZXN1bHRhZG9zLCBkZl9wZV9nYmEsIGRmX3BlX2NiYSwgZGZfY29yZG9iYV9pbnRlbmNpb24sIGRmX2NvcmRvYmFfdGVjaG8sIGRmX2JhaXJlc19pbnRlbmNpb24sIGRmX2JhaXJlc190ZWNobywgY2JhX2NydXphZG8sIGJhX2NydXphZG8sIGNvbHMpDQpgYGANCg0KRWwgKipNb2RlbG8gUmFjaW9uYWwqKiBkZSBjb21wb3J0YW1pZW50byBlbGVjdG9yYWwgc2UgYmFzYSBlbiBsYSBpZGVhIGRlIHF1ZSBsb3Mgdm90YW50ZXMgKnRvbWFuIGRlY2lzaW9uZXMgZWxlY3RvcmFsZXMgZGUgbWFuZXJhIHJhY2lvbmFsIHkgbWF4aW1pemFuIHN1cyBpbnRlcmVzZXMgcGVyc29uYWxlcyB5IHByZWZlcmVuY2lhcyBhbCBlbGVnaXIgYSBxdcOpIGNhbmRpZGF0byBvIHBhcnRpZG8gdm90YXIqLiBFc3RlIGVuZm9xdWUgc2UgZGVyaXZhIGRlIGxhIHRlb3LDrWEgZWNvbsOzbWljYSB5IHNlIGNlbnRyYSBlbiBsYSBpZGVhIGRlIHF1ZSBsb3MgaW5kaXZpZHVvcyBhY3TDumFuIGNvbW8gImhvbW8gZWNvbm9taWN1cyIsIGVzIGRlY2lyLCBjb21vIHNlcmVzIHJhY2lvbmFsZXMgeSBlZ2/DrXN0YXMgcXVlIGJ1c2NhbiBtYXhpbWl6YXIgc3UgYmllbmVzdGFyIHBlcnNvbmFsLiBFbiBlbCBjb250ZXh0byBlbGVjdG9yYWwsIGVsIG1vZGVsbyByYWNpb25hbCBhc3VtZSBxdWUgbG9zIHZvdGFudGVzIGV2YWzDumFuIGN1aWRhZG9zYW1lbnRlIGxhcyBvcGNpb25lcyBwb2zDrXRpY2FzIGRpc3BvbmlibGVzIHkgdG9tYW4gZGVjaXNpb25lcyBlbiBmdW5jacOzbiBkZSBjw7NtbyBjcmVlbiBxdWUgY2FkYSBjYW5kaWRhdG8gbyBwYXJ0aWRvIGN1bXBsaXLDoSBjb24gc3VzIHByZWZlcmVuY2lhcyB5IG5lY2VzaWRhZGVzLiBFbiBlc3RlIG1vZGVsbywgKiplbCBlbGVjdG9yYWRvIHJlc3BvbnNhYmlsaXphIGEgbG9zIGFjdG9yZXMgcG9sw610aWNvcyBkZWwgRXN0YWRvIGRlIGxhIGVjb25vbcOtYSB5IHZvdGFuIGVuIGZ1bmNpw7NuIGRlIGxhIGV2YWx1YWNpw7NuIHF1ZSByZWFsaXphbiBhbCByZXNwZWN0byoqDQoNCkVuIGVzdGUgbWFyY28sIHNlIHJlYWxpemFyw6EgdW5hIGNsdXN0ZXJpemFjacOzbiBjb24ga21lYW5zIGRlIGxhIG11ZXN0cmEgcGFyYSBhbmFsaXphciBsYSByZWxhY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBlY29uw7NtaWNhcyBlbiBlbCB2b3RvIGFsICoqRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEgKEZQVikqKi4gU2UgZWxpZ2UgZXN0ZSBwYXJ0aWRvIGNvbiBlbCBvYmpldGl2byBkZSBldmFsdWFyIHNpLCBlbiBmdW5jacOzbiBkZSBsYXMgdmFyaWFibGVzIGVjb27Ds21pY2FzIHkgZGUgZ2VzdGnDs24sIGVsIGVsZWN0b3JhZG8gZWxpZ2UgY29udGludWFyIGNvbiBlbCBnb2JpZXJubyBvZmljaWFsaXN0YSBvIHByZWZpZXJlIGNhbWJpYXIsIHkgcXXDqSB2YXJpYWJsZXMgaW5mbHV5ZW4gZW4gZGljaGEgZGVjaXNpw7NuLiBQYXJhIGRpY2hvIGFuw6FsaXNpcyBzZSB1dGlsaXphcsOhbiBsYXMgdmFyaWFibGVzIGBnZXN0aW9uX2NyaXN0aW5hYCwgYGVjb25vbWlhX3BhaXNfMl9hbm9zYCwgYGVjb25vbWlhX2ZsaWFyXzJfYW5vc2AsIGBjb250aW51aWRhZF9vX2NhbWJpb2AsIGB2b3RvX2Fjb3RhZG9gIHkgYHBvbmRlcmFjaW9uX2VwaGANCg0KIyMjICoqQnVlbm9zIEFpcmVzKioNCg0KRW4gcHJpbWVyIGx1Z2FyLCBzZSBjcmVhIHVuIGRmIGNvbiBsYXMgdmFyaWFibGVzIHF1ZSBwb2Ryw61hbiBleHBsaWNhciBlbCB2b3RvIGFsIEZyZW50ZSBwYXJhIGxhIFZpY3RvcmlhIGVuIGZ1bmNpw7NuIGRlbCBtb2RlbG8gcmVsYWNpb25hbC4gU2UgY29uc3RydWlyw6EgdW5hIHZhcmlhYmxlIGJpbmFyaWEgcXVlIHNlYSDCv1ZvdGEgYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEgKEZQVik/ICJTw60sIE5vIiBhIHBhcnRpciBkZSBsYSB2YXJpYWJsZSBgdm90b19hY290YWRvYA0KDQpgYGB7cn0NCiMgT2JzZXJ2YW1vcyBsYXMgdmFyaWFibGVzIHkgc3UgcmVsYWNpw7NuIA0KY29tcF9lbGVjdF9ic2FzIDwtIGRmX3BvdGVuY2lhbF9iYSB8PiANCiAgbXV0YXRlKHZvdG9fb2ZpY2lhbGlzdGEgPSBpZmVsc2Uodm90b19hY290YWRvID09ICJEYW5pZWwgU2Npb2xpIiAsICJTaSIsICJObyIpKSB8PiANCiAgc2VsZWN0KGdlc3Rpb25fY3Jpc3RpbmEsIGVjb25vbWlhX2ZsaWFyXzJfYW5vcywgZWNvbm9taWFfcGFpc18yX2Fub3MsIGNvbnRpbnVpZGFkX29fY2FtYmlvLHZvdG9fb2ZpY2lhbGlzdGEsIHVhLCBwb25kZXJhY2lvbl9lcGgsIHZvdG9fZmluYWwpDQpgYGANCg0KQW5hbGl6YW1vcyBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyB5IGB2b3RvX29maWNpYWxpc3RhYA0KDQpgYGB7cn0NCmNvbXBfZWxlY3RfYnNhcyB8PiANCiAgZ3JvdXBfYnkodm90b19vZmljaWFsaXN0YSwgZ2VzdGlvbl9jcmlzdGluYSkgfD4gDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamUgPSB0b3RhbC9zdW0oY29tcF9lbGVjdF9ic2FzJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApIHw+IA0KICBnZ3Bsb3QoKSArDQogYWVzKHggPSBnZXN0aW9uX2NyaXN0aW5hLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiNDRTI3NkMiLCBTaSA9ICIjNEZBMjkyIikpICsNCiBsYWJzKHggPSAiICIsIHkgPSAiICIsIHRpdGxlID0gIlZhbG9yYWNpw7NuIGRlIGxhIGdlc3Rpw7NuIGRlIENGSyBzZWfDum4gdm90byBhbCBGcmVudGUgcGFyYSBsYSBWaWN0b3JpYSIsIA0KIHN1YnRpdGxlID0gIkJ1ZW5vcyBBaXJlcyAtIFBvbmRlcmFkbyBlbiBmdW5jacOzbiBkZSBsYSBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBGUFY/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLCANCiBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBxdWllbmVzIHZvdGFuIGFsIEZQViBlbiBgdm90b19hY290YWRvYCwgZWwgMzIlIGFwcnVlYmEgbGEgZ2VzdGnDs24gZGUgY3Jpc3RpbmEgMjAwNy0yMDE1LiBZLCBlbCA0NCw4JSBxdWUgbm8gYXBydWViYSBlbCBkZXNlbXBlw7FvIGVuIGxhIGdlc3Rpw7NuIG5vIHZvdGFyw6EgYWwgRlBWDQoNCmBgYHtyfQ0KY29tcF9lbGVjdF9ic2FzIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBlY29ub21pYV9mbGlhcl8yX2Fub3MpIHw+IA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4gDQogIG11dGF0ZShwb3JjZW50YWplID0gdG90YWwvc3VtKGNvbXBfZWxlY3RfYnNhcyRwb25kZXJhY2lvbl9lcGgpLA0KICAgICAgICAgcG9yY2VudGFqZSA9IHBvcmNlbnRhamUqMTAwKSB8PiANCiAgZ2dwbG90KCkgKw0KIGFlcyh4ID0gcmVvcmRlcihlY29ub21pYV9mbGlhcl8yX2Fub3MscG9yY2VudGFqZSksIHkgPSBwb3JjZW50YWplLCBmaWxsID0gdm90b19vZmljaWFsaXN0YSkgKw0KIGdlb21fY29sKCkgKw0KIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoTm8gPSAiI2VhZmQxNyIsIFNpID0gIiNmZDE3NzciKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIgIiwgdGl0bGUgPSAiVmFsb3JhY2nDs24gZGUgbGEgZWNvbm9tw61hIGZhbWlsaWFyIGVuIGxvcyDDumx0aW1vcyBkb3MgXG4gYcOxb3Mgc2Vnw7puIHZvdG8gYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEiLCANCiBzdWJ0aXRsZSA9ICJCdWVub3MgQWlyZXMgLSBQb25kZXJhZG8gZW4gZnVuY2nDs24gZGUgbGEgZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgRlBWPyIpICsNCiB0aGVtZV9saWdodCgpICsNCiB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgDQogcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwgDQogZmFjZSA9ICJpdGFsaWMiLCBoanVzdCA9IDAuNSkpDQpgYGANCg0KRW4gbGEgbWlzbWEgbGluZWEsIGxhIG1heW9yw61hIGRlIGxvcyBxdWUgY29uc2lkZXJhIHF1ZSBlbXBlb3LDsyBzdSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgZmFtaWxpYXIgbm8gdm90YXLDoSBhbCBGUFYNCg0KYGBge3J9DQpjb21wX2VsZWN0X2JzYXMgfD4gDQogIGdyb3VwX2J5KHZvdG9fb2ZpY2lhbGlzdGEsIGVjb25vbWlhX3BhaXNfMl9hbm9zKSB8PiANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+IA0KICBtdXRhdGUocG9yY2VudGFqZSA9IHRvdGFsL3N1bShjb21wX2VsZWN0X2JzYXMkcG9uZGVyYWNpb25fZXBoKSwNCiAgICAgICAgIHBvcmNlbnRhamUgPSBwb3JjZW50YWplKjEwMCkgfD4gDQogIGdncGxvdCgpICsNCiBhZXMoeCA9IHJlb3JkZXIoZWNvbm9taWFfcGFpc18yX2Fub3MscG9yY2VudGFqZSksIHkgPSBwb3JjZW50YWplLCBmaWxsID0gdm90b19vZmljaWFsaXN0YSkgKw0KIGdlb21fY29sKCkgKw0KIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoTm8gPSAiIzE3ZmQ5ZCIsIFNpID0gIiM5ZDE3ZmQiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIgIiwgDQogICAgICB0aXRsZSA9ICJWYWxvcmFjacOzbiBkZSBsYSBlY29ub23DrWEgZW4gbG9zIMO6bHRpbW9zIGRvcyBcbiBhw7FvcyBzZWfDum4gdm90byBhbCBGcmVudGUgcGFyYSBsYSBWaWN0b3JpYSIsIA0KIHN1YnRpdGxlID0gIkJ1ZW5vcyBBaXJlcyAtIFBvbmRlcmFkbyBlbiBmdW5jacOzbiBkZSBsYSBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBGUFY/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLCANCiBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbiBlc3RlIGNhc28sIHN1Y2VkZSBpZ3VhbCBxdWUgY29uIGxhIHZhcmlhYmxlIGFudGVyaW9yLCBlbnRyZSBxdWllbmVzIHZvdGFyw6FuIGFsIEZQViBoYXkgdmFsb3JhY2lvbmVzIG3DoXMgcG9zaXRpdmFzIGRlIGxhIHNpdHVhY2nDs24gZWNvbsOzbWljYSBkZSBsb3Mgw7psdGltb3MgZG9zIGHDsW9zDQoNCmBgYHtyfQ0KY29tcF9lbGVjdF9ic2FzIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBjb250aW51aWRhZF9vX2NhbWJpbykgfD4gDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamUgPSB0b3RhbC9zdW0oY29tcF9lbGVjdF9ic2FzJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApIHw+IA0KICBnZ3Bsb3QoKSArDQogYWVzKHggPSByZW9yZGVyKGNvbnRpbnVpZGFkX29fY2FtYmlvLHBvcmNlbnRhamUpLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiM5ZGZkMTciLCBTaSA9ICIjNzcxN2ZkIikpICsNCiBsYWJzKHggPSAiICIsIHkgPSAiICIsIA0KICAgICAgdGl0bGUgPSAiVmFsb3JhY2nDs24gZGUgbGEgZWNvbm9tw61hIGVuIGxvcyDDumx0aW1vcyBkb3MgXG4gYcOxb3Mgc2Vnw7puIHZvdG8gYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEiLCANCiBzdWJ0aXRsZSA9ICJCdWVub3MgQWlyZXMgLSBQb25kZXJhZG8gZW4gZnVuY2nDs24gZGUgbGEgZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgRlBWPyIpICsNCiB0aGVtZV9saWdodCgpICsNCiB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgDQogcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTVMLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSksIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyTCwgDQogZmFjZSA9ICJpdGFsaWMiLCBoanVzdCA9IDAuNSkpDQpgYGANCg0KRW4gZXN0ZSBncsOhZmljbyB2ZW1vcyBxdWUgbG9zIHF1ZSB2b3RhcsOtYW4gYWwgRlBWIGNvbnNpZGVyYW4gcXVlIHNlIGRlYmVuIG1hbnRlbmVyIGxhcyBwb2zDrXRpY2FzIGFjdHVhbGVzIHkgbWFudGVuZXIgYWxndW5hcyB5IGNhbWJpYXIgb3RyYXMgYSBkaWZlcmVuY2lhIGRlIHF1aWVuZXMgbm8gbG9zIHZvdGFyw61hbg0KDQpgYGB7cn0NCiN1bmlxdWUoZGZfcG90ZW5jaWFsX2JhJHZvdG9fZmluYWwpIA0KY29tcF9lbGVjdF9ic2FzIDwtIGRmX3BvdGVuY2lhbF9iYSB8PiANCiAgbXV0YXRlKHZvdG9fb2ZpY2lhbGlzdGEgPSBpZmVsc2Uodm90b19hY290YWRvID09ICJEYW5pZWwgU2Npb2xpIiAsIDEsIDApKSANCg0KIyBhcm1vIGRmIHBhcmEgY3JlYXIgZHVtbXlzDQpkZl9kdW1teXMgPC0gZGZfcG90ZW5jaWFsX2JhIHw+IA0KICBkcGx5cjo6c2VsZWN0KGdlc3Rpb25fY3Jpc3RpbmEsIGVjb25vbWlhX2ZsaWFyXzJfYW5vcywgZWNvbm9taWFfcGFpc18yX2Fub3MsIGNvbnRpbnVpZGFkX29fY2FtYmlvKQ0KDQojQ3JlbyB2YXJpYWJsZXMgZHVtbXlzDQpkdW1teTwtIGRhdGEuZnJhbWUoc2FwcGx5KGRmX2R1bW15cyxmdW5jdGlvbih4KSBkYXRhLmZyYW1lKG1vZGVsLm1hdHJpeCh+eC0xLGRhdGEgPWRmX2R1bW15cykpWywtMV0pKSB8PiANCiAgY2xlYW5fbmFtZXMoKQ0KDQojIHVubyBkZnMNCmNvbXBfZWxlY3RfYnNhcyA8LSBjb21wX2VsZWN0X2JzYXN8PiANCiAgZHBseXI6OnNlbGVjdCh1YSwgdm90b19vZmljaWFsaXN0YSwgcG9uZGVyYWNpb25fZXBoKXw+IA0KICAgY2JpbmQoZHVtbXkpDQoNCmBgYA0KDQpDw7NtbyBubyBlcyBwb3NpYmxlIHBvbmRlcmFyIGRlc2RlIGxhIHByb3BpYSBmdW5jacOzbiBkZSBrbWVhbnMsIHNlIHJlcGxpY2Fyw6FuIGxhcyBmaWxhcyBkZSBsYSBiYXNlIGVuIGZ1bmNpw7NuIGRlIGxhIHBvbmRlcmFjacOzbi4gQWRlbcOhcyBzZSBjcmVhcm9uICoqdmFyaWFibGVzIGR1bW15KiogY29uIGxhcyB5YSBtZW5jaW9uYWRhcyBwYXJhIHBvZGVyIHJlYWxpemFyIGVsIGFuw6FsaXNpcy4NCg0KYGBge3J9DQpkZl9jbHVzdGVyIDwtIGNvbXBfZWxlY3RfYnNhcw0KDQojIHJlcGxpY2Ftb3MNCmRmX2NsdXN0ZXIgPC0gZGZfY2x1c3RlcltyZXAoc2VxX2xlbihucm93KGRmX2NsdXN0ZXIpKSwgZGZfY2x1c3RlciRwb25kZXJhY2lvbl9lcGgpLCBdDQoNCiMgbW9zdHJhbW9zDQpkZl9jbHVzdGVyIHw+IA0KICBoZWFkKCkgfD4gDQogIGthYmxlKCkNCg0KDQpkZl9jbHVzdGVyIDwtIGRmX2NsdXN0ZXIgfD4gDQogIGRwbHlyOjpzZWxlY3QoLXBvbmRlcmFjaW9uX2VwaCwgLXVhKQ0KDQojIGFybWFtb3MgZWwgcGxvdA0Ka192YWx1ZXMgPC0gMjoxMA0Kd3NzIDwtIG51bWVyaWMobGVuZ3RoKGtfdmFsdWVzKSkNCg0KZm9yIChrIGluIGtfdmFsdWVzKSB7DQogIGttIDwtIGttZWFucyhkZl9jbHVzdGVyLGNlbnRlcnMgPSBrLCBuc3RhcnQgPSAxMCkNCiAgd3NzW2stMV0gPC0gc3VtKGttJHdpdGhpbnNzKQ0KfQ0KDQojIFJlYWxpem8gZWwgbcOpdG9kbyBkZSBFbGJvdyBwYXJhIHNhYmVyIGN1YW50b3MgY2x1c3RlcnMgcmVhbGl6YXINCmVsYm93X3Bsb3QgPC0gZGF0YS5mcmFtZShLID0ga192YWx1ZXMsIFdTUyA9IHdzcykgJT4lDQogIGdncGxvdChhZXMoeCA9IEssIHkgPSBXU1MpKSArDQogIGdlb21fbGluZShjb2xvdXIgPSAiIzQ0MDE1NCIpICsNCiAgZ2VvbV9wb2ludChjb2xvdXIgPSAiIzAxNDQ1NCIpICsNCiAgbGFicyh4ID0gIk7Dum1lcm8gZGUgY2zDunN0ZXJlcyAoSykiLCB5ID0gIlN1bWEgZGUgY3VhZHJhZG9zIGRlbnRybyBkZWwgY2zDunN0ZXIgKFdTUykiLA0KICAgICAgIHRpdGxlID0gIk3DqXRvZG8gZGVsIENvZG8gcGFyYSBkZXRlcm1pbmFyIFxuIGVsIG7Dum1lcm8gw7NwdGltbyBkZSBjbMO6c3RlcmVzIikgKw0KICB0aGVtZV9saWdodCgpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTZMLA0KICAgIGZhY2UgPSAiYm9sZCIsDQogICAgaGp1c3QgPSAwLjUpLA0KICAgIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJpdGFsaWMiLA0KICAgIGhqdXN0ID0gMC41KQ0KICApDQoNCmVsYm93X3Bsb3QNCmBgYA0KDQpWYW1vcyBhIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBjb24gMyBjbHVzdGVycw0KDQpgYGB7cn0NCiMgc2VtaWxsYQ0Kc2V0LnNlZWQoMTIzKQ0KDQojIHJlYWxpemFtb3MgZWwgY2x1c3Rlcg0Ka21lYW5zX3Jlc3VsdCA8LSBrbWVhbnMoZGZfY2x1c3RlciwgY2VudGVycyA9IDMgKSANCg0KIyBsbyBhZ3JlZ2Ftb3MgYWwgZGF0YXNldCANCmRmX2NsdXN0ZXIkY2x1c3RlciA8LSBrbWVhbnNfcmVzdWx0JGNsdXN0ZXINCg0KIyByZXN1bWVuDQphZ2dyZWdhdGUoLiB+IGNsdXN0ZXIsIGRhdGEgPSBkZl9jbHVzdGVyLCBGVU4gPSBtZWFuKSB8PiANCiAga2FibGUoKQ0KYGBgDQoNClF1ZWRhIGFzw60gbG9zIGVuY3Vlc3RhZG9zIGRpdmlkaWRvcyBlbiB0cmVzIGdydXBvczoNCg0KKlVuIHByaW1lciBncnVwbyBkZSBlbmN1ZXN0YWRvcyogYWwgcXVlIHBvZHLDrWFtb3MgbGxhbWFyICoqTG9zIEVzY8OpcHRpY29zKiouIEVuIGVzdGUgY2x1c3RlciBzb2xvIHVuIDMlIGVuIHByb21lZGlvIHRpZW5lIGxhIGludGVuY2nDs24gZGUgdm90YXIgYWwgRlBWLiBFbiBlc3RlIHNlbnRpZG8sIGVzdGUgZ3J1cG8gdGllbmUgdW5hIGJhamEgcHJvcG9yY2nDs24gZGUgYXByb2JhY2nDs24gZGUgbGEgZ2VzdGnDs24gZGUgY3Jpc3RpbmEgKGBnZXN0aW9uX2NyaXN0aW5hX3hfYXBydWViYWApIHkgdW5hIGFsdGEgcHJvcG9yY2nDs24gZGUgYGdlc3Rpb25fY3Jpc3RpbmFfeF9ub19zYWJlYC4gRW4gY3VhbnRvIGEgbGEgcGVyY2VwY2nDs24gZWNvbsOzbWljYSwgdGllbmVuIHVuYSBiYWphIHByb3BvcmNpw7NuIGRlIGBlY29ub21pYV9mbGlhcl8yX2Fub3NfeF9lbXBlb3JvYCB5IGBlY29ub21pYV9wYWlzXzJfYW5vc194X2VtcGVvcm9gLCBsbyBxdWUgc3VnaWVyZSBxdWUgbm8gY3JlZW4gcXVlIGxhIGVjb25vbcOtYSBmYW1pbGlhciBvIGxhIGRlbCBwYcOtcyBoYXlhIGVtcGVvcmFkbyBlbiBsb3MgYcOxb3MgcHJldmlvcy4gRW4gdMOpcm1pbm9zIGRlIHByZWZlcmVuY2lhIHBvciBsYSBjb250aW51aWRhZCBvIGNhbWJpbywgdGllbmVuIHVuYSBhbHRhIHByb3BvcmNpw7NuIGRlIGBjb250aW51aWRhZF9vX2NhbWJpb194X21hbnRlbmVyX2FsZ3VuYXNfeV9jYW1iaWFyX290cmFzYC4gRXN0byBpbmRpY2EgcXVlIHByZWZpZXJlbiBtYW50ZW5lciBhbGd1bmFzIHBvbMOtdGljYXMgeSBjYW1iaWFyIG90cmFzLg0KDQoqVW4gc2VndW5kbyBjbHVzdGVyKiBhbCBxdWUgZGVub21pbmFyZW1vcyAqKkxvcyBMZWFsZXMqKiBjb24gdW4gOTIlIGRlIGludGVuY2nDs24gZGUgdm90YXIgYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEuIEVzdGUgZ3J1cG8gc2UgY2FyYWN0ZXJpemEgcG9yIHRlbmVyIHVuYSBhbHRhIHByb3BvcmNpw7NuIGRlIGFwcm9iYWNpw7NuIGRlIGxhIGdlc3Rpw7NuIGRlbCBnb2JpZXJubyBkZSBDRkssdW5hIGJhamEgcHJvcG9yY2nDs24gZGUgYGVjb25vbWlhX2ZsaWFyXzJfYW5vc194X2VtcGVvcm9gIHkgYGVjb25vbWlhX3BhaXNfMl9hbm9zX3hfZW1wZW9yb2AgbG8gcXVlIHN1Z2llcmUgcXVlIG5vIGNyZWVuIHF1ZSBsYSBlY29ub23DrWEgZmFtaWxpYXIgbyBsYSBkZWwgcGHDrXMgaGF5YW4gZW1wZW9yYWRvIGVuIGxvcyDDumx0aW1vcyAyIGHDsW9zLiBFbiB0w6lybWlub3MgZGUgcHJlZmVyZW5jaWEgcG9yIGxhIGNvbnRpbnVpZGFkIG8gY2FtYmlvLCB0aWVuZW4gdW5hIGJhamEgcHJvcG9yY2nDs24gZGUgYGNvbnRpbnVpZGFkX29fY2FtYmlvX3hfbWFudGVuZXJfYWxndW5hc195X2NhbWJpYXJfb3RyYXNgIHkgYGNvbnRpbnVpZGFkX29fY2FtYmlvX3hfY2FtYmlhcl90b2Rhc2AsIGxvIHF1ZSBpbmRpY2EgcXVlIHByZWZpZXJlbiBtYW50ZW5lciBsYXMgcG9sw610aWNhcyBhY3R1YWxlcw0KDQpZLCBwb3Igw7psdGltbywgKlVuIHRlcmNlciBncnVwbyogZGUgKipMb3MgZGVzZW5jYW50YWRvcyoqIHF1ZSBubyB2b3RhcsOhIHBvciBlbCBGUFYgY29uIHVuYSBiYWphIHByb3BvcmNpw7NuIGRlIGBnZXN0aW9uX2NyaXN0aW5hX3hfYXBydWViYWAgeSBgZ2VzdGlvbl9jcmlzdGluYV94X25vX3NhYmVgLCBsbyBxdWUgaW5kaWNhIHF1ZSBkZXNhcHJ1ZWJhbiBsYSBnZXN0acOzbiBkZSBDRksuIFJlc3BlY3RvIGEgbGEgcGVyY2VwY2nDs24gZWNvbsOzbWljYSwgdGllbmVuIHVuYSBhbHRhIHByb3BvcmNpw7NuIGRlIGBlY29ub21pYV9mbGlhcl8yX2Fub3NfeF9lbXBlb3JvYCB5IGBlY29ub21pYV9wYWlzXzJfYW5vc194X2VtcGVvcm9gLCBsbyBxdWUgc3VnaWVyZSBxdWUgY3JlZW4gcXVlIGxhIGVjb25vbcOtYSBmYW1pbGlhciB5IGxhIGRlbCBwYcOtcyBlbXBlb3LDsyBlbiBsb3Mgw7psdGltb3MgYcOxb3MuIFJlc3BlY3RvIGEgbGFzIHBvbMOtdGljYXMsIHRpZW5lbiB1bmEgYWx0YSBwcm9wb3JjacOzbiBkZSBgY29udGludWlkYWRfb19jYW1iaW9feF9jYW1iaWFyX3RvZGFzYA0KDQpgYGB7cn0NCg0KIyBMZSBwb25lbW9zIGxvcyBub21icmVzIGEgbG9zIGNsdXN0ZXJzDQpjbHVzdGVyX25hbWVzIDwtIGMoIjEtRXNjZXB0aWNvcyIsICIyLUxlYWxlcyIsICIzLURlc2VuY2FudGFkb3MiKQ0KDQprbWVhbnNfcmVzdWx0JGNsdXN0ZXIgPC0gY2x1c3Rlcl9uYW1lc1trbWVhbnNfcmVzdWx0JGNsdXN0ZXJdDQoNCiMgVmlzdWFsaXphbW9zDQpmdml6X2NsdXN0ZXIoa21lYW5zX3Jlc3VsdCwgZGF0YSA9IGRmX2NsdXN0ZXIsIGdlb20gPSAicG9pbnQiKSArDQogIHRoZW1lX2xpZ2h0KCkgKyAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsNCiAgbGFicyh0aXRsZSA9ICJSZXN1bHRhZG9zIGNsdXN0ZXJpbmcgSy1tZWFucyAtIEJ1ZW5vcyBBaXJlcyIpDQoNCmBgYA0KDQpgYGB7ciBpbmNsdWRlPUZBTFNFfQ0Kcm0oY29tcF9lbGVjdF9ic2FzLCBkZl9jbHVzdGVyLCBkZl9kdW1teXMsIGRmX3BvdGVuY2lhbF9iYV9jcnV6LCBkZl9wb3RlbmNpYWxfY2JhX2NydXosIGR1bW15LCBlbGJvd19wbG90LCBmaW5hbF9tb2RlbCwgZ2VzdGlvbl9jcmlzdGluYSxrbSwgaywga192YWx1ZXMsIG51bV9jbHVzdGVycyx2YXJpYWJsZSx2YXJpYWJsZXNfZWNvbm9taWEsIHdzcykNCmBgYA0KDQojIyMgKipDw7NyZG9iYSoqDQoNClNlIHJlYWxpemFyw6EgZWwgbWlzbW8gcHJvY2VkaW1pZW50byBxdWUgY29uIGVsIGRmIGRlICoqQnVlbm9zIEFpcmVzKiouIEVuIHByaW1lciBsdWdhciBzZSBjcmVhIHVuIGRmIGNvbiBsYXMgdmFyaWFibGVzIHF1ZSBwb2Ryw61hbiBleHBsaWNhciBlbCB2b3RvIGFsICoqRlBWKiogZW4gZnVuY2nDs24gZGVsIG1vZGVsbyByYWNpb25hbC4gU2UgY29uc3RydWlyw6EgdW5hIHZhcmlhYmxlIGJpbmFyaWEgcXVlIHNlYSDCv1ZvdGEgYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEgKEZQVik/ICJTw60sIE5vIiBhIHBhcnRpciBkZSBsYSB2YXJpYWJsZSBgdm90b19hY290YWRvYA0KDQpgYGB7cn0NCiMgT2JzZXJ2YW1vcyBsYXMgdmFyaWFibGVzIHkgc3UgcmVsYWNpw7NuIA0KY29tcF9lbGVjdF9jYmEgPC0gZGZfcG90ZW5jaWFsX2NiYSB8PiANCiAgbXV0YXRlKHZvdG9fb2ZpY2lhbGlzdGEgPSBpZmVsc2Uodm90b19hY290YWRvID09ICJEYW5pZWwgU2Npb2xpIiAsICJTaSIsICJObyIpKSB8PiANCiAgc2VsZWN0KGdlc3Rpb25fY3Jpc3RpbmEsIGVjb25vbWlhX2ZsaWFyXzJfYW5vcywgZWNvbm9taWFfcGFpc18yX2Fub3MsIGNvbnRpbnVpZGFkX29fY2FtYmlvLHZvdG9fb2ZpY2lhbGlzdGEsIHVhLCBwb25kZXJhY2lvbl9lcGgsIHZvdG9fZmluYWwpDQpgYGANCg0KQW5hbGl6YW1vcyBsYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcyB5IGB2b3RvX29maWNpYWxpc3RhYA0KDQpgYGB7cn0NCmNvbXBfZWxlY3RfY2JhIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBnZXN0aW9uX2NyaXN0aW5hKSB8PiANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+IA0KICBtdXRhdGUocG9yY2VudGFqZSA9IHRvdGFsL3N1bShjb21wX2VsZWN0X2NiYSRwb25kZXJhY2lvbl9lcGgpLA0KICAgICAgICAgcG9yY2VudGFqZSA9IHBvcmNlbnRhamUqMTAwKSB8PiANCiAgZ2dwbG90KCkgKw0KIGFlcyh4ID0gZ2VzdGlvbl9jcmlzdGluYSwgeSA9IHBvcmNlbnRhamUsIGZpbGwgPSB2b3RvX29maWNpYWxpc3RhKSArDQogZ2VvbV9jb2woKSArDQogc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhObyA9ICIjQ0UyNzZDIiwgU2kgPSAiIzRGQTI5MiIpKSArDQogbGFicyh4ID0gIiAiLCB5ID0gIiAiLCB0aXRsZSA9ICJWYWxvcmFjacOzbiBkZSBsYSBnZXN0acOzbiBkZSBDRksgc2Vnw7puIHZvdG8gYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEiLCANCiBzdWJ0aXRsZSA9ICJDw7NyZG9iYSAtIFBvbmRlcmFkbyBlbiBmdW5jacOzbiBkZSBsYSBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBGUFY/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLCANCiBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpTZSBvYnNlcnZhIHF1ZSBxdWllbmVzIHZvdGFuIGFsIEZQViBlbiBgdm90b19hY290YWRvYCwgZWwgMTklIGFwcnVlYmEgbGEgZ2VzdGnDs24gZGUgY3Jpc3RpbmEgMjAwNy0yMDE1LiBZLCBlbCA1OSUgcXVlIG5vIGFwcnVlYmEgZWwgZGVzZW1wZcOxbyBlbiBsYSBnZXN0acOzbiBubyB2b3RhcsOhIGFsIEZQVg0KDQpgYGB7cn0NCmNvbXBfZWxlY3RfY2JhIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBlY29ub21pYV9mbGlhcl8yX2Fub3MpIHw+IA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4gDQogIG11dGF0ZShwb3JjZW50YWplID0gdG90YWwvc3VtKGNvbXBfZWxlY3RfY2JhJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApIHw+IA0KICBnZ3Bsb3QoKSArDQogYWVzKHggPSByZW9yZGVyKGVjb25vbWlhX2ZsaWFyXzJfYW5vcyxwb3JjZW50YWplKSwgeSA9IHBvcmNlbnRhamUsIGZpbGwgPSB2b3RvX29maWNpYWxpc3RhKSArDQogZ2VvbV9jb2woKSArDQogc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhObyA9ICIjZWFmZDE3IiwgU2kgPSAiI2ZkMTc3NyIpKSArDQogbGFicyh4ID0gIiAiLCB5ID0gIiAiLCB0aXRsZSA9ICJWYWxvcmFjacOzbiBkZSBsYSBlY29ub23DrWEgZmFtaWxpYXIgZW4gbG9zIMO6bHRpbW9zIGRvcyBcbiBhw7FvcyBzZWfDum4gdm90byBhbCBGcmVudGUgcGFyYSBsYSBWaWN0b3JpYSIsIA0KIHN1YnRpdGxlID0gIkPDs3Jkb2JhIC0gUG9uZGVyYWRvIGVuIGZ1bmNpw7NuIGRlIGxhIGVwaCIsIGZpbGwgPSAiwr9Wb3RhIGFsIEZQVj8iKSArDQogdGhlbWVfbGlnaHQoKSArDQogdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIA0KIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1TCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLCBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMkwsIA0KIGZhY2UgPSAiaXRhbGljIiwgaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCkVuIGVzdGUgaXRlbSwgaGF5IHVuYSBhbHRhIHByb3BvcmNpw7NuIHF1ZSBjb25zaWRlcmEgcXVlIHN1IHNpdHVhY2nDs24gZWNvbsOzbWljYSBmYW1pbGlhciBlbXBlb3LDsyA0MyUgeSBubyB2b3RhcsOhIGFsIG9maWNpYWxpc21vDQoNCmBgYHtyfQ0KY29tcF9lbGVjdF9jYmEgfD4gDQogIGdyb3VwX2J5KHZvdG9fb2ZpY2lhbGlzdGEsIGVjb25vbWlhX3BhaXNfMl9hbm9zKSB8PiANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+IA0KICBtdXRhdGUocG9yY2VudGFqZSA9IHRvdGFsL3N1bShjb21wX2VsZWN0X2NiYSRwb25kZXJhY2lvbl9lcGgpLA0KICAgICAgICAgcG9yY2VudGFqZSA9IHBvcmNlbnRhamUqMTAwKSB8PiANCiAgZ2dwbG90KCkgKw0KIGFlcyh4ID0gcmVvcmRlcihlY29ub21pYV9wYWlzXzJfYW5vcyxwb3JjZW50YWplKSwgeSA9IHBvcmNlbnRhamUsIGZpbGwgPSB2b3RvX29maWNpYWxpc3RhKSArDQogZ2VvbV9jb2woKSArDQogc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhObyA9ICIjMTdmZDlkIiwgU2kgPSAiIzlkMTdmZCIpKSArDQogbGFicyh4ID0gIiAiLCB5ID0gIiAiLCANCiAgICAgIHRpdGxlID0gIlZhbG9yYWNpw7NuIGRlIGxhIGVjb25vbcOtYSBlbiBsb3Mgw7psdGltb3MgZG9zIFxuIGHDsW9zIHNlZ8O6biB2b3RvIGFsIEZyZW50ZSBwYXJhIGxhIFZpY3RvcmlhIiwgDQogc3VidGl0bGUgPSAiQ8OzcmRvYmEtIFBvbmRlcmFkbyBlbiBmdW5jacOzbiBkZSBsYSBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBGUFY/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLCANCiBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbiBlc3RlIGNhc28gc3VjZWRlIGlndWFsIHF1ZSBjb24gbGEgdmFyaWFibGUgYW50ZXJpb3IsIGVudHJlIHF1aWVuZXMgdm90YXLDoW4gYWwgRlBWIGhheSB2YWxvcmFjaW9uZXMgbcOhcyBwb3NpdGl2YXMgZGUgbGEgc2l0dWFjacOzbiBlY29uw7NtaWNhIGRlIGxvcyDDumx0aW1vcyBkb3MgYcOxb3MNCg0KYGBge3J9DQpjb21wX2VsZWN0X2NiYSB8PiANCiAgZ3JvdXBfYnkodm90b19vZmljaWFsaXN0YSwgY29udGludWlkYWRfb19jYW1iaW8pIHw+IA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4gDQogIG11dGF0ZShwb3JjZW50YWplID0gdG90YWwvc3VtKGNvbXBfZWxlY3RfY2JhJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApIHw+IA0KICBnZ3Bsb3QoKSArDQogYWVzKHggPSByZW9yZGVyKGNvbnRpbnVpZGFkX29fY2FtYmlvLHBvcmNlbnRhamUpLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiM5ZGZkMTciLCBTaSA9ICIjNzcxN2ZkIikpICsNCiBsYWJzKHggPSAiICIsIHkgPSAiICIsIA0KICAgICAgdGl0bGUgPSAiVmFsb3JhY2nDs24gZGUgbGEgZWNvbm9tw61hIGVuIGxvcyDDumx0aW1vcyBkb3MgXG4gYcOxb3Mgc2Vnw7puIHZvdG8gYWwgRnJlbnRlIHBhcmEgbGEgVmljdG9yaWEiLCANCiBzdWJ0aXRsZSA9ICJDw7NyZG9iYSAtIFBvbmRlcmFkbyBlbiBmdW5jacOzbiBkZSBsYSBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBGUFY/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCANCiBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNUwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTJMLCANCiBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbiBlc3RlIGdyw6FmaWNvIHZlbW9zIHF1ZSBzaSBiaWVuIGhheSB1biBhbHRvIHBvcmNlbnRhamUgZW50cmUgbG9zIHF1ZSBubyB2b3RhcsOtYW4gYWwgRlBWIHF1ZSBkZXNlYSBjYW1iaWFyIGxhcyBwb2zDrXRpY2FzICgyNCUpIGxhIG1heW9yw61hIHByZWRpZXJlIG1hbnRlbmVyIGFsZ3VuYXMgeSBjYW1iaWFyIG90cmFzLg0KDQpgYGB7cn0NCiN1bmlxdWUoZGZfcG90ZW5jaWFsX2JhJHZvdG9fZmluYWwpIA0KY29tcF9lbGVjdF9jYmEgPC0gZGZfcG90ZW5jaWFsX2NiYSB8PiANCiAgbXV0YXRlKHZvdG9fb2ZpY2lhbGlzdGEgPSBpZmVsc2Uodm90b19hY290YWRvID09ICJEYW5pZWwgU2Npb2xpIiAsIDEsIDApKSANCg0KIyBhcm1vIGRmIHBhcmEgY3JlYXIgZHVtbXlzDQpkZl9kdW1teXMgPC0gY29tcF9lbGVjdF9jYmEgfD4gDQogIGRwbHlyOjpzZWxlY3QoZ2VzdGlvbl9jcmlzdGluYSwgZWNvbm9taWFfZmxpYXJfMl9hbm9zLCBlY29ub21pYV9wYWlzXzJfYW5vcywgY29udGludWlkYWRfb19jYW1iaW8pDQoNCiNDcmVvIGxhcyB2YXJpYWJsZXMgZHVtbXlzDQpkdW1teTwtIGRhdGEuZnJhbWUoc2FwcGx5KGRmX2R1bW15cyxmdW5jdGlvbih4KSBkYXRhLmZyYW1lKG1vZGVsLm1hdHJpeCh+eC0xLGRhdGEgPWRmX2R1bW15cykpWywtMV0pKSB8PiANCiAgY2xlYW5fbmFtZXMoKQ0KDQojIHVubyBkZnMNCmNvbXBfZWxlY3RfY2JhIDwtIGNvbXBfZWxlY3RfY2JhfD4gDQogIGRwbHlyOjpzZWxlY3QodWEsIHZvdG9fb2ZpY2lhbGlzdGEsIHBvbmRlcmFjaW9uX2VwaCl8PiANCiAgIGNiaW5kKGR1bW15KQ0KDQoNCg0KYGBgDQoNCkFsIGlndWFsIHF1ZSBjb24gbGEgYmFzZSBkZSBCdWVub3MgQWlyZXMsIGPDs21vIG5vIGVzIHBvc2libGUgcG9uZGVyYXIgZGVzZGUgbGEgcHJvcGlhIGZ1bmNpw7NuIGRlIGttZWFucywgc2UgcmVwbGljYXLDoW4gbGFzIGZpbGFzIGRlIGxhIGJhc2UgZW4gZnVuY2nDs24gZGUgbGEgcG9uZGVyYWNpw7NuLiBBZGVtw6FzIHNlIGNyZWFyb24gKip2YXJpYWJsZXMgZHVtbXkqKiBjb24gbGFzIHlhIG1lbmNpb25hZGFzIHBhcmEgcG9kZXIgcmVhbGl6YXIgZWwgYW7DoWxpc2lzLg0KDQpgYGB7cn0NCmRmX2NsdXN0ZXIgPC0gY29tcF9lbGVjdF9jYmENCg0KIyByZXBsaWNhbW9zDQpkZl9jbHVzdGVyIDwtIGRmX2NsdXN0ZXJbcmVwKHNlcV9sZW4obnJvdyhkZl9jbHVzdGVyKSksIGRmX2NsdXN0ZXIkcG9uZGVyYWNpb25fZXBoKSwgXQ0KDQojIG1vc3RyYW1vcw0KZGZfY2x1c3RlciB8PiANCiAgaGVhZCgpIHw+IA0KICBrYWJsZSgpDQoNCg0KYGBgDQoNCkFsIGlndWFsIHF1ZSBjb24gZWwgZGYgZGUgQnVlbm9zIEFpcmVzLCB2ZW1vcyBxdWUgYWwgcmVwbGljYXIgY29uIGVsIHBvbmRlcmFkb3IgaHVibyB1bmEgZGlzbWludWNpw7NuIGVuIGxhIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcw0KDQpgYGB7cn0NCg0KZGZfY2x1c3RlciA8LSBkZl9jbHVzdGVyIHw+IA0KICBkcGx5cjo6c2VsZWN0KC1wb25kZXJhY2lvbl9lcGgsIC11YSkNCg0KIyBhcm1hbW9zIGVsIHBsb3QNCmtfdmFsdWVzIDwtIDI6MTANCndzcyA8LSBudW1lcmljKGxlbmd0aChrX3ZhbHVlcykpDQoNCmZvciAoayBpbiBrX3ZhbHVlcykgew0KICBrbSA8LSBrbWVhbnMoZGZfY2x1c3RlcixjZW50ZXJzID0gaywgbnN0YXJ0ID0gMTApDQogIHdzc1trLTFdIDwtIHN1bShrbSR3aXRoaW5zcykNCn0NCg0KIyBSZWFsaXpvIGVsIG3DqXRvZG8gZGUgRWxib3cgcGFyYSBzYWJlciBjdWFudG9zIGNsdXN0ZXJzIHJlYWxpemFyDQplbGJvd19wbG90IDwtIGRhdGEuZnJhbWUoSyA9IGtfdmFsdWVzLCBXU1MgPSB3c3MpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBLLCB5ID0gV1NTKSkgKw0KICBnZW9tX2xpbmUoY29sb3VyID0gIiM0NDAxNTQiKSArDQogIGdlb21fcG9pbnQoY29sb3VyID0gIiMwMTQ0NTQiKSArDQogIGxhYnMoeCA9ICJOw7ptZXJvIGRlIGNsw7pzdGVyZXMgKEspIiwgeSA9ICJTdW1hIGRlIGN1YWRyYWRvcyBkZW50cm8gZGVsIGNsw7pzdGVyIChXU1MpIiwNCiAgICAgICB0aXRsZSA9ICJNw6l0b2RvIGRlbCBDb2RvIHBhcmEgZGV0ZXJtaW5hciBcbiBlbCBuw7ptZXJvIMOzcHRpbW8gZGUgY2zDunN0ZXJlcyIpICsNCiAgdGhlbWVfbGlnaHQoKSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2TCwNCiAgICBmYWNlID0gImJvbGQiLA0KICAgIGhqdXN0ID0gMC41KSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiaXRhbGljIiwNCiAgICBoanVzdCA9IDAuNSkNCiAgKQ0KDQplbGJvd19wbG90DQpgYGANCg0KVmFtb3MgYSByZWFsaXphciBlbCBhbsOhbGlzaXMgY29uIDQgY2x1c3RlcnMNCg0KYGBge3J9DQojIHNlbWlsbGENCnNldC5zZWVkKDEyMykNCg0KIyByZWFsaXphbW9zIGVsIGNsdXN0ZXINCmttZWFuc19yZXN1bHQgPC0ga21lYW5zKGRmX2NsdXN0ZXIsIGNlbnRlcnMgPSA0ICkgDQoNCg0KIyBsbyBhZ3JlZ2Ftb3MgYWwgZGF0YXNldCANCmRmX2NsdXN0ZXIkY2x1c3RlciA8LSBrbWVhbnNfcmVzdWx0JGNsdXN0ZXINCg0KIyByZXN1bWVuDQphZ2dyZWdhdGUoLiB+IGNsdXN0ZXIsIGRhdGEgPSBkZl9jbHVzdGVyLCBGVU4gPSBtZWFuKSB8PiANCiAga2FibGUoKQ0KYGBgDQoNClF1ZWRhIGFzw60gbG9zIGVuY3Vlc3RhZG9zIGRpdmlkaWRvcyBlbiBjdWF0cm8gZ3J1cG9zOg0KDQoqQ2x1c3RlciAxOiogKipMb3MgZGVzZW5jYW50YWRvcyoqIEVzdGUgZ3J1cG8gdGllbmUgdW4gYmFqbyB2b3RvIHBvciBlbCBGUFYgY29uIHVuIHZhbG9yIHByb21lZGlvIGNlcmNhbm8gYSAwLiBFbCBhcG95byBhIGxhIGdlc3Rpw7NuIGRlIENyaXN0aW5hIGVzIG11eSBiYWpvLCBjYXNpIG51bG8uIExhIHBlcmNlcGNpw7NuIGRlIGxhIGVjb25vbcOtYSBmYW1pbGlhciBlbiBsb3Mgw7psdGltb3MgZG9zIGHDsW9zIGVzIG1heW9yaXRhcmlhbWVudGUgbmVnYXRpdmEgKDcxJSkgeSBjb25zaWRlcmFuIHF1ZSBlbXBlb3LDsy4gVGFtYmnDqW4gdGllbmVuIHVuYSBwZXJjZXBjacOzbiBhbWJpZ8O8YSBkZSBsYSBlY29ub23DrWEgZGVsIHBhw61zLCBjb24gdW4gOTIlIHF1ZSBubyBzYWJlIHNpIG1lam9yw7MgbyBlbXBlb3LDsy4gQWRlbcOhcywgdW4gNzgkIG5vIHNhYmUgc2kgZGViZXJpYW4gY29udGludWFyIG8gY2FtYmlhciBsYXMgcG9sw610aWNhcw0KDQoqQ2x1c3RlciAyKjogKipMb3MgTW9kZXJhZG9zKiogRW4gZXN0ZSBncnVwbywgZWwgdm90byBwb3IgZWwgRlBWIGVzIG3DoXMgYWx0bywgY29uIHVuIHZhbG9yIHByb21lZGlvIGRlIGFwcm94aW1hZGFtZW50ZSAwLjY2LiBUaWVuZW4gdW5hIHBlcmNlcGNpw7NuIG1peHRhIHNvYnJlIGxhIGdlc3Rpw7NuIGRlIENyaXN0aW5hLCBjb24gdW4gNTMlIHF1ZSBhcHJ1ZWJhIHN1IGdlc3Rpw7NuLiBMYSBwZXJjZXBjacOzbiBkZSBsYSBlY29ub23DrWEgZmFtaWxpYXIgZW4gbG9zIMO6bHRpbW9zIGRvcyBhw7FvcyBlcyB2YXJpYWRhLCBjb24gYXByb3hpbWFkYW1lbnRlIGVsIDU2JSBxdWUgY3JlZSBxdWUgc2UgbWFudHV2byBpZ3VhbCB5IGVsIDMxJSBxdWUgcGllbnNhIHF1ZSBlbXBlb3LDsy4gUmVzcGVjdG8gYSBsYSBlY29ub23DrWEgZGVsIHBhw61zLCBsYSBtYXlvcsOtYSAoOTclKSBjcmVlIHF1ZSBzZSBtYW50dXZvIGlndWFsLiBMYSBhY3RpdHVkIGhhY2lhIGVsIGNhbWJpbyBlcyBtZW5vcyBwcm9udW5jaWFkYSBlbiBlc3RlIGdydXBvLg0KDQoqQ2x1c3RlciAzKjogKipMb3MgTGVhbGVzKiogRXN0ZSBncnVwbyBtdWVzdHJhIHVuIGFwb3lvIGNvbXBsZXRvIGFsIEZQViwgY29uIHVuIHZvdG8gcHJvbWVkaW8gY2VyY2FubyBhIDEsIGxvIHF1ZSBpbmRpY2EgdW4gYWx0byBhcG95byBhIGVzdGUgcGFydGlkbyBwb2zDrXRpY28uIFRvZG9zIGVuIGVzdGUgZ3J1cG8gYXBydWViYW4gbGEgZ2VzdGnDs24gZGUgQ3Jpc3RpbmEuIEVuIGN1YW50byBhIGxhIGVjb25vbcOtYSwgbGEgcGVyY2VwY2nDs24gc29icmUgbGEgZWNvbm9tw61hIGZhbWlsaWFyIGVzIHByZWRvbWluYW50ZW1lbnRlIHBvc2l0aXZhLCBjb24gc29sbyBlbCAxMCUgcXVlIGNyZWUgcXVlIHNlIGVuY3VlbnRyYSBpZ3VhbCBBZGVtw6FzLCBjcmVlbiBxdWUgbGEgZWNvbm9tw61hIGRlbCBwYcOtcyB0YW1iacOpbiBoYSBtZWpvcmFkbyBlbiBzdSBtYXlvcsOtYS4gTW9zdHJhcm9uIHVuYSBmdWVydGUgcHJlZmVyZW5jaWEgcG9yIG1hbnRlbmVyIGFsZ3VuYXMgcG9sw610aWNhcyBhY3R1YWxlcyB5IGNhbWJpYXIgb3RyYXMuDQoNCipDbHVzdGVyIDQqOiAqKkxvcyBlc2NlcHRpY29zKiogRW4gZXN0ZSBncnVwbywgZWwgdm90byBwb3IgZWwgRlBWIGVzIGJham8sIGNvbiB1biB2YWxvciBwcm9tZWRpbyBkZSBhcHJveGltYWRhbWVudGUgMC4wMi4gTGEgYXByb2JhY2nDs24gZGUgbGEgZ2VzdGnDs24gZGUgQ3Jpc3RpbmEgZXMgYmFqYSwgY29uIHNvbG8gZWwgNCUgcXVlIGFwcnVlYmEuIExhIHBlcmNlcGNpw7NuIGRlIGxhIGVjb25vbcOtYSBmYW1pbGlhciBlbiBsb3Mgw7psdGltb3MgZG9zIGHDsW9zIGVzIG1heW9yaXRhcmlhbWVudGUgbmVnYXRpdmEsIGNvbiB1biA3MyUgcXVlIGNyZWUgcXVlIGVtcGVvcsOzLiBUYW1iacOpbiBjb25zaWRlcmFuIHF1ZSBsYSBlY29ub23DrWEgZGVsIHBhw61zIGVtcGVvcsOzIGVuIHVuIDkyJS4gVGllbmVuIHVuYSBwcmVmZXJlbmNpYSBwb3IgY2FtYmlhciBhbGd1bmFzIHBvbMOtdGljYXMgYWN0dWFsZXMgeSBtYW50ZW5lciBvdHJhcy4NCg0KYGBge3J9DQoNCiMgTGUgcG9uZW1vcyBsb3Mgbm9tYnJlcyBhIGxvcyBjbHVzdGVycw0KY2x1c3Rlcl9uYW1lcyA8LSBjKCIxLURlc2VuY2FudGFkb3MiLCAiMi1Nb2RlcmFkb3MiLCAiMy1MZWFsZXMiLCAiNC1Fc2NlcHRpY29zIikNCg0Ka21lYW5zX3Jlc3VsdCRjbHVzdGVyIDwtIGNsdXN0ZXJfbmFtZXNba21lYW5zX3Jlc3VsdCRjbHVzdGVyXQ0KDQojIFZpc3VhbGl6YW1vcw0KZnZpel9jbHVzdGVyKGttZWFuc19yZXN1bHQsIGRhdGEgPSBkZl9jbHVzdGVyLCBnZW9tID0gInBvaW50IikgKw0KICB0aGVtZV9saWdodCgpICsgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArDQogIGxhYnModGl0bGUgPSAiUmVzdWx0YWRvcyBjbHVzdGVyaW5nIEstbWVhbnMgLSBDw7NyZG9iYSIpDQoNCmBgYA0KDQoNCmBgYHtyIGluY2x1ZGUgPSBGQUxTRSB9DQpybShkZl9jbHVzdGVyLCBkZl9kdW1teXMsIGR1bW15LCBlbGJvd19wbG90LGttLGttZWFuc19yZXN1bHQsIGNsdXN0ZXJfbmFtZXMsIGssIGtfdmFsdWVzLHdzcyxjb21wX2VsZWN0X2NiYSwgYmFzZV9iYWlyZXMsIGJhc2VfY29yZG9iYSkNCmBgYA0KDQojIyMgQ29uY2x1c2lvbmVzDQoNClNlIHB1ZWRlIGFmaXJtYXIgZW50b25jZXMgcXVlIGVuIGVsIGNhc28gZGUgbGEgUHJvdmluY2lhIGRlIEJ1ZW5vcyBBaXJlcyB5IEPDs3Jkb2JhICpoYXkgdW5hIHJlbGFjacOzbiBlbnRyZSBsYSBwZXJjZXBjacOzbiBkZSBsYSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgeSBlbCB2b3RvIG8gbm8gcG9yIGxhIGNvbnRpbnVpZGFkIGRlbCBnb2JpZXJubyBvZmljaWFsaXN0YSouIEVzIGRlY2lyLCBxdWllbmVzIGNvbnNpZGVyYW4gcXVlIHN1IHNpdHVhY2nDs24gZWNvbsOzbWljYSBlbXBlb3LDsyBlbiBsaW5lYXMgZ2VuZXJhbGVzIGVsaWdlbiB2b3RhciBjYW5kaWRhdG9zIGRlIG90cm9zIGZyZW50ZXMgeSBwcmVmaWVyZW4gY2FtYmlvcyBlbiBsYXMgcG9sw610aWNhcyBww7pibGljYXMgZWxhYm9yYWRhcy4gUG9yIG90cm8gbGFkbywgYSBkaWZlcmVuY2lhIGRlIEJ1ZW5vcyBBaXJlcyBkb25kZSBoYXkgZ3J1cG9zIG3DoXMgbWFyY2Fkb3MgcXVlIHZvdGFyw61hbiB5IG5vIHZvdGFyw61hbiBhbCBGUFYsIGVuIGVsIGNhc28gZGUgY8OzcmRvYmEgZXhpc3RlIHVuIGN1YXJ0byBncnVwbyBtw6FzIG1vZGVyYWRvIHF1ZSBtdWVzdHJhIHVuIHZvdG8gcmVsYXRpdmFtZW50ZSBhbHRvIHBvciBlbCBGUFYgeSB1bmEgcGVyY2VwY2nDs24gbWl4dGEgc29icmUgbGEgZ2VzdGnDs24gZGUgQ3Jpc3RpbmEuDQoNCiMjIE1vZGVsbyBzb2Npb2zDs2dpY28NCg0KRWwgKipNb2RlbG8gU29jaW9sw7NnaWNvKiogcG9yIG90cm8gbGFkbyAgc2UgZW5mb2NhIGVuIGPDs21vIGZhY3RvcmVzIHNvY2lhbGVzIHkgZGVtb2dyw6FmaWNvcyBpbmZsdXllbiBlbiBsYXMgZGVjaXNpb25lcyBkZSB2b3RvIGRlIGxvcyBjaXVkYWRhbm9zIEVzdGEgdGVvcsOtYSBjb25zaWRlcmEgcXVlIGxvcyBjb250ZXh0b3Mgc29jaWFsZXMgeSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsb3Mgdm90YW50ZXMgdGllbmVuIHVuIGltcGFjdG8gc2lnbmlmaWNhdGl2byBlbiBzdXMgcHJlZmVyZW5jaWFzIHBvbMOtdGljYXMgeSBlbiBzdSBjb21wb3J0YW1pZW50byBlbGVjdG9yYWwuIERlIGVzdGEgbWFuZXJhLCAqZWwgZWxlY3RvciBmb3JtYSBzdXMgb3BpbmlvbmVzIHkgb3BjaW9uZXMgcG9sw610aWNhcyBlbiBmdW5jacOzbiBkZSBsYXMgcG9zaWNpb25lcyB5IGNhcmFjdGVyw61zdGljYXMgZGUgc3UgZ3J1cG8gZGUgcGVydGVuZW5jaWEgZW4gbGEgc29jaWVkYWQgZW4gZ2VuZXJhbCoNCg0KUGFyYSBhbmFsaXphciBsYSBpbnRlbmNpw7NuIGRlIHZvdG8gZW4gZnVuY2nDs24gZGUgbGEgdGVvcsOtYSBkZSBjb21wb3J0YW1pZW50byBlbGVjdG9yYWwgc29jaW9sw7NnaWNhIHNlIHV0aWxpemFyw6FuIGxhcyB2YXJpYWJsZXMgYGVkYWRgLCBgc2V4b2AsYG5pdl9lZHVjYXRpdm9gLiBTZSBsbGV2YXLDoSBhIGNhYm8gdW5hICoqcmVncmVzacOzbiBsb2fDrXN0aWNhKiogY29uIGVsIG9iamV0aXZvIGRlIGFuYWxpemFyIGxhIHJlbGFjacOzbiBlbnRyZSBlc3RhcyB2YXJpYWJsZXMgcHJlZGljdG9yYXMgeSBsYSB2YXJpYWJsZSBkZSByZXN1bHRhZG8gKGB2b3RvX29maWNpYWxpc3RhYCkgeSBkZXRlcm1pbmFyIHNpIGV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBlbGxhcy4NCg0KIyMjICoqQnVlbm9zIEFpcmVzKioNCg0KYGBge3J9DQojY29sbmFtZXMoZGZfcG90ZW5jaWFsX2JhKQ0KZGZfc29jaW9fcGJhIDwtICBkZl9wb3RlbmNpYWxfYmEgfD4gDQogIHNlbGVjdCh1YSxlZGFkLHNleG8sbml2X2VkdWNhdGl2byxwb25kZXJhY2lvbl9lcGgsIHZvdG9fYWNvdGFkbykgfD4gDQogIG11dGF0ZSh2b3RvX29maWNpYWxpc3RhID0gaWZlbHNlKHZvdG9fYWNvdGFkbyA9PSAiRGFuaWVsIFNjaW9saSIsICJTaSIsIk5vIikpIHw+IA0KICBzZWxlY3QoLXZvdG9fYWNvdGFkbykNCg0Kcm93bmFtZXMoZGZfc29jaW9fcGJhKSA8LSBkZl9zb2Npb19wYmEkdWENCg0KIyBHcmFmaWNhbW9zDQpkZl9zb2Npb19wYmEgfD4gDQogIGdyb3VwX2J5KHZvdG9fb2ZpY2lhbGlzdGEsIGVkYWQpIHw+ICANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+IA0KICBtdXRhdGUocG9yY2VudGFqZSA9IHRvdGFsL3N1bShkZl9zb2Npb19wYmEkcG9uZGVyYWNpb25fZXBoKSwNCiAgICAgICAgIHBvcmNlbnRhamUgPSBwb3JjZW50YWplKjEwMCkgICU+JQ0KIGdncGxvdCgpICsNCiBhZXMoeCA9IGVkYWQsIHkgPSBwb3JjZW50YWplLCBmaWxsID0gdm90b19vZmljaWFsaXN0YSkgKw0KIGdlb21fY29sKCkgKw0KIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoTm8gPSAiIzY2QzJBNSIsIA0KU2kgPSAiIzlGMTNDNSIpKSArDQogbGFicyh4ID0gIiAiLCB5ID0gIiUiLCB0aXRsZSA9ICJWb3RvIGFsIG9maWNpYWxpc21vIHNlZ8O6biBsYSBlZGFkIGRlIGxvcyBlbmN1ZXN0YWRvcyIsIA0KIHN1YnRpdGxlID0gIkJ1ZW5vcyBBaXJlcyAtIFBvbmRlcmFkbyBjb24gZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgb2ZpY2lhbGlzbW8/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNkwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgDQogcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbnRyZSBsb3MgcXVlIHZvdGFuIGFsIG9maWNpYWxpc21vIGVsIHJhbmdvIGV0YXJpbyBzZSBlbmN1ZW50cmEgbcOhcyBkaXN0cmlidWlkbyBlbnRyZSBsb3MgMTggeSA2NSBhw7Fvcy4gUG9yIGVsIG90cm8gbGFkbywgbG9zIHZvdGFudGVzIGRlIGxhIG9wb3NpY2nDs24gc2UgY29uY2VudHJhbiBlbnRyZSBsb3MgMzAtNDkgZW4gbWF5b3IgbWVkaWRhDQoNCmBgYHtyfQ0KZGZfc29jaW9fcGJhIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBzZXhvKSB8PiAgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamUgPSB0b3RhbC9zdW0oZGZfc29jaW9fcGJhJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApICU+JQ0KIGdncGxvdCgpICsNCiBhZXMoeCA9IHNleG8sIHkgPSBwb3JjZW50YWplLCBmaWxsID0gdm90b19vZmljaWFsaXN0YSkgKw0KIGdlb21fY29sKCkgKw0KIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoTm8gPSAiIzdlYzQ5MiIsIA0KU2kgPSAiI2M0N2U5MiIpKSArDQogbGFicyh4ID0gIiAiLCB5ID0gIiUiLCB0aXRsZSA9ICJWb3RvIGFsIG9maWNpYWxpc21vIHNlZ8O6biBlbCBzZXhvIGRlIGxvcyBlbmN1ZXN0YWRvcyIsIA0KIHN1YnRpdGxlID0gIkJ1ZW5vcyBBaXJlcyAtIFBvbmRlcmFkbyBjb24gZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgb2ZpY2lhbGlzbW8/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNkwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgDQogcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbnRyZSBsb3Mgdm90YW50ZXMgZGVsIEZEVCBoYXkgbWF5b3IgcHJvcG9yY2nDs24gZGUgbXVqZXJlcy4gRW4gY2FtYmlvIGVuIGVsIHZvdG8gbm8gb2ZpY2lhbGlzdGEgbGEgZGlzdHJpYnVjacOzbiBzZSBlbmN1ZW50cmEgbcOhcyBwYXJlamENCg0KYGBge3J9DQpkZl9zb2Npb19wYmEgfD4gDQogIGdyb3VwX2J5KHZvdG9fb2ZpY2lhbGlzdGEsIG5pdl9lZHVjYXRpdm8pIHw+ICANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKHBvbmRlcmFjaW9uX2VwaCkpIHw+IA0KICBtdXRhdGUocG9yY2VudGFqZSA9IHRvdGFsL3N1bShkZl9zb2Npb19wYmEkcG9uZGVyYWNpb25fZXBoKSwNCiAgICAgICAgIHBvcmNlbnRhamUgPSBwb3JjZW50YWplKjEwMCkgJT4lDQogZ2dwbG90KCkgKw0KIGFlcyh4ID0gbml2X2VkdWNhdGl2bywgeSA9IHBvcmNlbnRhamUsIGZpbGwgPSB2b3RvX29maWNpYWxpc3RhKSArDQogZ2VvbV9jb2woKSArDQogc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYyhObyA9ICIjZmZjZTFjIiwgDQpTaSA9ICIjMWNjZWZmIikpICsNCiBsYWJzKHggPSAiICIsIHkgPSAiJSIsIHRpdGxlID0gIlZvdG8gYWwgb2ZpY2lhbGlzbW8gc2Vnw7puIGVsIG5pdmVsIFxuIGVkdWNhdGl2byBkZSBsb3MgZW5jdWVzdGFkb3MiLCANCiBzdWJ0aXRsZSA9ICJCdWVub3MgQWlyZXMgLSBQb25kZXJhZG8gY29uIGVwaCIsIGZpbGwgPSAiwr9Wb3RhIGFsIG9maWNpYWxpc21vPyIpICsNCiB0aGVtZV9saWdodCgpICsNCiB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTZMLCBmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSksIA0KIHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE0TCwgZmFjZSA9ICJpdGFsaWMiLCBoanVzdCA9IDAuNSkpICsNCiAgY29vcmRfZmxpcCgpDQpgYGANCg0KRWwgdm90byBubyBvZmljaWFsaXN0YSBzZSBjb25jZW50cmEgbWF5b3JtZW50ZSBlbnRyZSBxdWllbmVzIHRpZW5lbiBwcmltYXJpbyBjb21wbGV0byB5IHNlY3VuZGFyaW8uIFksIGVsIHZvdG8gb2ZpY2lhbGlzdGEgZW50cmUgcXVpZW5lcyB0aWVuZW4gc2VjdW5kYXJpbywgcHJpbWFyaW8geSB0ZXJjaWFyaW8uDQoNClJlYWxpemFtb3MgbGEgKipyZWdyZXNpw7NuIGxvZ8Otc3RpY2EqKiBwYXJhIGFuYWxpemFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzIHkgZWwgdm90byBhbCBvZmljaWFsaXNtbw0KDQpgYGB7cn0NCg0KIyBDcmVvIHZhcmlhYmxlcyBkdW1teXMNCg0KIyBhcm1vIGRmIHBhcmEgY3JlYXIgZHVtbXlzDQpkZl9kdW1teXMgPC0gZGZfc29jaW9fcGJhIHw+IGRwbHlyOjpzZWxlY3QoLXBvbmRlcmFjaW9uX2VwaCwgLXVhLCAtdm90b19vZmljaWFsaXN0YSwtc2V4bykNCg0KI0NyZWF0aW5nIER1bW15IFZhcmlhYmxlcw0KZHVtbXk8LSBkYXRhLmZyYW1lKHNhcHBseShkZl9kdW1teXMsZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShtb2RlbC5tYXRyaXgofngtMSxkYXRhID1kZl9kdW1teXMpKVssLTFdKSkgfD4gDQogIGNsZWFuX25hbWVzKCkNCg0KIyB1bm8gZGZzDQpkZl9sb2dpdF9iYSA8LSBkZl9zb2Npb19wYmF8PiANCiAgZHBseXI6OnNlbGVjdChwb25kZXJhY2lvbl9lcGgsIHNleG8sIHZvdG9fb2ZpY2lhbGlzdGEpfD4NCiAgbXV0YXRlKHNleG8gPSBpZmVsc2Uoc2V4byA9PSAiTXVqZXIiLCAxLCAwKSwNCiAgICAgICAgIHZvdG9fb2ZpY2lhbGlzdGEgPSBpZmVsc2Uodm90b19vZmljaWFsaXN0YSA9PSAiU2kiLCAxLCAwKSkgfD4gDQogICBjYmluZChkdW1teSkgDQoNCiNjb2xuYW1lcyhkZl9sb2dpdF9iYSkNCg0KIyBNb2RlbG8gY29uIHRvZGFzIGxhcyB2YXJpYWJsZXMNCm1vZGVsbyA8LSBnbG0odm90b19vZmljaWFsaXN0YSB+IGVkYWRfeDMwXzQ5ICsgZWRhZF94NTBfNjUgKyBlZGFkX3hfNjUgK3NleG8gKyBuaXZfZWR1Y2F0aXZvX3hfc2VjdW5kYXJpb19pbmNvbXBsZXRvX29fY29tcGxldG8gKyBuaXZfZWR1Y2F0aXZvX3hfdGVyY2lhcmlvX25vX3VuaXZfaW5jb21wbGV0byArIG5pdl9lZHVjYXRpdm9feF90ZXJjaWFyaW9fbm9fdW5pdl9jb21wbGV0byArIG5pdl9lZHVjYXRpdm9feF91bml2ZXJzaXRhcmlvX2luY29tcGxldG9fb19jb21wbGV0byArIHZvdG9fb2ZpY2lhbGlzdGEgLCBkYXRhID0gZGZfbG9naXRfYmEsIGZhbWlseSA9IGJpbm9taWFsLCB3ZWlnaHRzID0gcG9uZGVyYWNpb25fZXBoKQ0KDQpzdW1tYXJ5KG1vZGVsbykNCg0KYGBgDQoNCg0KDQpVdGlsaXphbmRvIHRvZGFzIGxhcyB2YXJpYWJsZXMgc29jaW9kZW1vZ3LDoWZpY2FzIHNlIG9ic2VydmEgcXVlIGVsICoqbml2ZWwgZWR1Y2F0aXZvKiogZXMgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2byBwYXJhIHByZWRlY2lyIGVsIHZvdG8gYWwgb2ZpY2lhbGlzbW8gcGFyYSBsb3Mgbml2ZWxlcyB1bml2ZXJzaXRhcmlvIHkgdGVyY2lhcmlvLiBFcyBkZWNpciBxdWUsIGEgbWF5b3Igbml2ZWwgZWR1Y2F0aXZvIG1heW9yIGVzIGVsIHZvdG8gcG9yIGVsIEZQVi4gRWwgc2V4bywgcG9yIG90cm8gbGFkbyBjb24gdW4gcC12YWx1ZSBkZSAwLjAxODYgaW5kaWNhIHF1ZSBtYW50ZW5pZW5kbyBjb25zdGFudGVzIGxhcyBkZW3DoXMgdmFyaWFibGVzIGVuIGVsIG1vZGVsbywgbGFzIG11amVyZXMgKDEpIHRpZW5lbiBtw6FzIHByb2JhYmlsaWRhZGVzIGRlIHZvdGFyIHBvciBlbCBvZmljaWFsaXNtbyBlbiBjb21wYXJhY2nDs24gY29uIGxvcyBob21icmVzLiBBIGxhIGludmVyc2Egb2N1cnJlIGNvbiBgZWRhZF94MzBfNDlgDQoNCkEgY29udGludWFjacOzbiwgc2UgdXRpbGl6YXLDoSBlbCBtw6l0b2RvIFNURVBBSUMgcXVlIHBlcm1pdGUgcmVhbGl6YXIgZWwgcHJvY2VzbyBkZSBzZWxlY2Npw7NuIGRlIHZhcmlhYmxlcyBtZWRpYW50ZSBlbCBBa2Fpa2UgKEFJQykuIEVsIEFJQyBlcyB1bmEgbcOpdHJpY2EgcXVlIHNlIHV0aWxpemEgcGFyYSBvY21wYXJhciBkaWZlcmVudGVzIG1vZGVsb3MgeSBzZWxlY2Npb25hciBlbCBtZWpvciBhanVzdGFkbyBwYXJhIGxvcyBkYXRvcw0KDQpgYGB7cn0NCiNVc2Ftb3Mgc3RlcEFJQyBwYXJhIGdlbmVyYXIgZWwgbWVqb3IgbW9kZWxvDQpmaW5hbF9tb2RlbCA8LSBNQVNTOjpzdGVwQUlDKG1vZGVsbykNCg0KICMgbW9zdHJhbW9zDQpzdW1tYXJ5KGZpbmFsX21vZGVsKQ0KYGBgDQoNClBhcmEgZXN0ZSBtb2RlbG8gbGEgdmFyaWFibGUgbml2ZWwgZWR1Y2F0aXZvICh1bml2ZXJzaXRhcmlvIHkgdGVyY2lhcmlvKSBlcyBsYSBxdWUgbcOhcyBwb2Ryw61hIHByZWRlY2lyIGVsIHZvdG8gYWwgb2ZpY2lhbGlzbW8ganVudG8gY29uIGVsIHJhbmdvIGRlIGVkYWQgZGUgMzAtNDkgKGEgbGEgaW52ZXJzYSkuIEVzIGRlY2lyLCBxdWllbmVzIHNlIGVuY3VlbnRyYW4gZW4gZXNlIHJhbmdvIGRlIGVkYWQgdGllbmVuIG1lbm9zIHByb2JhYmlsaWRhZCBkZSB2b3RhciBhbCBGUFYNCg0KYGBge3IgaW5jbHVkZSA9IEZBTFNFfQ0Kcm0obW9kZWxvLCBmaW5hbF9tb2RlbCwgZWRhZCwgZHVtbXksIGRmX3NvY2lvX3BiYSwgZGZfbG9naXRfYmEsZGZfZHVtbXlzKQ0KYGBgDQoNCiMjIyAqKkPDs3Jkb2JhKioNCg0KUmVwZXRpbW9zIGVsIHByb2NlZGltaWVudG8gcGFyYSBsYSBiYXNlIGRlICoqQ8OzcmRvYmEqKg0KDQpgYGB7cn0NCiNjb2xuYW1lcyhkZl9wb3RlbmNpYWxfY2JhKQ0KZGZfc29jaW9fY2JhIDwtICBkZl9wb3RlbmNpYWxfY2JhIHw+IA0KICBzZWxlY3QodWEsZWRhZCxzZXhvLG5pdl9lZHVjYXRpdm8scG9uZGVyYWNpb25fZXBoLCB2b3RvX2Fjb3RhZG8pIHw+IA0KICBtdXRhdGUodm90b19vZmljaWFsaXN0YSA9IGlmZWxzZSh2b3RvX2Fjb3RhZG8gPT0gIkRhbmllbCBTY2lvbGkiLCAiU2kiLCJObyIpKSB8PiANCiAgc2VsZWN0KC12b3RvX2Fjb3RhZG8pDQoNCg0Kcm93bmFtZXMoZGZfc29jaW9fY2JhKSA8LSBkZl9zb2Npb19jYmEkdWENCg0KZGZfc29jaW9fY2JhIHw+IA0KICBncm91cF9ieSh2b3RvX29maWNpYWxpc3RhLCBlZGFkKSB8PiAgDQogIHN1bW1hcmlzZSh0b3RhbCA9IHN1bShwb25kZXJhY2lvbl9lcGgpKSB8PiANCiAgbXV0YXRlKHBvcmNlbnRhamUgPSB0b3RhbC9zdW0oZGZfc29jaW9fY2JhJHBvbmRlcmFjaW9uX2VwaCksDQogICAgICAgICBwb3JjZW50YWplID0gcG9yY2VudGFqZSoxMDApICAlPiUNCiBnZ3Bsb3QoKSArDQogYWVzKHggPSBlZGFkLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiM2NkMyQTUiLCANClNpID0gIiM5RjEzQzUiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIlIiwgdGl0bGUgPSAiVm90byBhbCBvZmljaWFsaXNtbyBzZWfDum4gbGEgZWRhZCBkZSBsb3MgZW5jdWVzdGFkb3MiLCANCiBzdWJ0aXRsZSA9ICJDw7NyZG9iYSAtIFBvbmRlcmFkbyBjb24gZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgb2ZpY2lhbGlzbW8/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNkwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgDQogcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbnRyZSBsb3MgcXVlIHZvdGFuIGFsIG9maWNpYWxpc21vIGVsIHJhbmdvIGV0YXJpbyBjb24gbWF5b3IgcHJvcG9yY2nDs24gZXMgZWwgZGUgMzAtNDkgYcOxb3MuIFBvciBlbCBvdHJvIGxhZG8sIGxvcyB2b3RhbnRlcyBkZSBsYSBvcG9zaWNpw7NuIHNlIGNvbmNlbnRyYW4gZW50cmUgbG9zIDE4LTY1IGVuIG1heW9yIG1lZGlkYQ0KDQpgYGB7cn0NCmRmX3NvY2lvX2NiYSB8PiANCiAgZ3JvdXBfYnkodm90b19vZmljaWFsaXN0YSwgc2V4bykgfD4gIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4gDQogIG11dGF0ZShwb3JjZW50YWplID0gdG90YWwvc3VtKGRmX3NvY2lvX2NiYSRwb25kZXJhY2lvbl9lcGgpLA0KICAgICAgICAgcG9yY2VudGFqZSA9IHBvcmNlbnRhamUqMTAwKSAlPiUNCiBnZ3Bsb3QoKSArDQogYWVzKHggPSBzZXhvLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiM3ZWM0OTIiLCANClNpID0gIiNjNDdlOTIiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIlIiwgdGl0bGUgPSAiVm90byBhbCBvZmljaWFsaXNtbyBzZWfDum4gZWwgc2V4byBkZSBsb3MgZW5jdWVzdGFkb3MiLCANCiBzdWJ0aXRsZSA9ICJDw7NyZG9iYSAtIFBvbmRlcmFkbyBjb24gZXBoIiwgZmlsbCA9ICLCv1ZvdGEgYWwgb2ZpY2lhbGlzbW8/IikgKw0KIHRoZW1lX2xpZ2h0KCkgKw0KIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNkwsIGZhY2UgPSAiYm9sZCIsIGhqdXN0ID0gMC41KSwgDQogcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTRMLCBmYWNlID0gIml0YWxpYyIsIGhqdXN0ID0gMC41KSkNCmBgYA0KDQpFbiBhbWJvcyB0aXBvcyBkZSB2b3RhbnRlcyAob2ZpY2lhbGlzdGFzIHkgbm8gb2ZpY2lhbGlzdGFzKSBoYXkgdW5hIGRpc3RyaWJ1Y2nDs24gYmFzdGFudGUgcGFyZWphIGVudHJlIGxvcyBnw6luZXJvcw0KDQpgYGB7cn0NCmRmX3NvY2lvX2NiYSB8PiANCiAgZ3JvdXBfYnkodm90b19vZmljaWFsaXN0YSwgbml2X2VkdWNhdGl2bykgfD4gIA0KICBzdW1tYXJpc2UodG90YWwgPSBzdW0ocG9uZGVyYWNpb25fZXBoKSkgfD4gDQogIG11dGF0ZShwb3JjZW50YWplID0gdG90YWwvc3VtKGRmX3NvY2lvX2NiYSRwb25kZXJhY2lvbl9lcGgpLA0KICAgICAgICAgcG9yY2VudGFqZSA9IHBvcmNlbnRhamUqMTAwKSB8PiANCiAgc2VsZWN0KC10b3RhbCklPiUNCiBnZ3Bsb3QoKSArDQogYWVzKHggPSBuaXZfZWR1Y2F0aXZvLCB5ID0gcG9yY2VudGFqZSwgZmlsbCA9IHZvdG9fb2ZpY2lhbGlzdGEpICsNCiBnZW9tX2NvbCgpICsNCiBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKE5vID0gIiNmZmNlMWMiLCANClNpID0gIiMxY2NlZmYiKSkgKw0KIGxhYnMoeCA9ICIgIiwgeSA9ICIlIiwgdGl0bGUgPSAiVm90byBhbCBvZmljaWFsaXNtbyBzZWfDum4gZWwgbml2ZWwgXG4gZWR1Y2F0aXZvIGRlIGxvcyBlbmN1ZXN0YWRvcyIsIA0KIHN1YnRpdGxlID0gIkPDs3Jkb2JhIC0gUG9uZGVyYWRvIGNvbiBlcGgiLCBmaWxsID0gIsK/Vm90YSBhbCBvZmljaWFsaXNtbz8iKSArDQogdGhlbWVfbGlnaHQoKSArDQogdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE2TCwgZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpLCANCiBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNEwsIGZhY2UgPSAiaXRhbGljIiwgaGp1c3QgPSAwLjUpKSArDQogIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCkVsIHZvdG8gb2ZpY2lhbGlzdGEgc2UgY29uY2VudHJhIG1heW9ybWVudGUgZW50cmUgcXVpZW5lcyB0aWVuZW4gcHJpbWFyaW8gY29tcGxldG8geSB1bml2ZXJzaXRhcmlvIFksIGVsIHZvdG8gbm8gb2ZpY2lhbGlzdGEgZW50cmUgcXVpZW5lcyB0aWVuZW4gc2VjdW5kYXJpbywgcHJpbWFyaW8geSB0ZXJjaWFyaW8uDQoNClJlYWxpemFtb3MgbGEgKipyZWdyZXNpw7NuIGxvZ8Otc3RpY2EqKiBwYXJhIGFuYWxpemFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgdmFyaWFibGVzDQoNCmBgYHtyfQ0KDQojIENyZW8gdmFyaWFibGVzIGR1bW15cw0KIyBhcm1vIGRmIHBhcmEgY3JlYXIgZHVtbXlzDQpkZl9kdW1teXMgPC0gZGZfc29jaW9fY2JhIHw+IGRwbHlyOjpzZWxlY3QoLXBvbmRlcmFjaW9uX2VwaCwgLXVhLCAtdm90b19vZmljaWFsaXN0YSwtc2V4bykNCg0KIyBjcmVvIGR1bW15cw0KZHVtbXk8LSBkYXRhLmZyYW1lKHNhcHBseShkZl9kdW1teXMsZnVuY3Rpb24oeCkgZGF0YS5mcmFtZShtb2RlbC5tYXRyaXgofngtMSxkYXRhID1kZl9kdW1teXMpKVssLTFdKSkgfD4gDQogIGNsZWFuX25hbWVzKCkNCg0KIyB1bm8gZGZzDQpkZl9sb2dpdF9jYmEgPC0gZGZfc29jaW9fY2JhfD4gDQogIGRwbHlyOjpzZWxlY3QocG9uZGVyYWNpb25fZXBoLCBzZXhvLCB2b3RvX29maWNpYWxpc3RhKXw+DQogIG11dGF0ZShzZXhvID0gaWZlbHNlKHNleG8gPT0gIk11amVyIiwgMSwgMCksDQogICAgICAgICB2b3RvX29maWNpYWxpc3RhID0gaWZlbHNlKHZvdG9fb2ZpY2lhbGlzdGEgPT0gIlNpIiwgMSwgMCkpIHw+IA0KICAgY2JpbmQoZHVtbXkpIA0KDQojY29sbmFtZXMoZGZfbG9naXRfYmEpDQoNCg0KIyBNb2RlbG8gY29uIHRvZGFzIGxhcyB2YXJpYWJsZXMNCm1vZGVsbyA8LSBnbG0odm90b19vZmljaWFsaXN0YSB+IGVkYWRfeDMwXzQ5ICsgZWRhZF94NTBfNjUgKyBlZGFkX3hfNjUgK3NleG8gKyBuaXZfZWR1Y2F0aXZvX3hfc2VjdW5kYXJpb19pbmNvbXBsZXRvX29fY29tcGxldG8gKyBuaXZfZWR1Y2F0aXZvX3hfdGVyY2lhcmlvX25vX3VuaXZfaW5jb21wbGV0byArIG5pdl9lZHVjYXRpdm9feF90ZXJjaWFyaW9fbm9fdW5pdl9jb21wbGV0byArIG5pdl9lZHVjYXRpdm9feF91bml2ZXJzaXRhcmlvX2luY29tcGxldG9fb19jb21wbGV0byArIHZvdG9fb2ZpY2lhbGlzdGEgLCBkYXRhID0gZGZfbG9naXRfY2JhLCBmYW1pbHkgPSBiaW5vbWlhbCwgd2VpZ2h0cyA9IHBvbmRlcmFjaW9uX2VwaCkNCg0Kc3VtbWFyeShtb2RlbG8pDQoNCmBgYA0KDQpVdGlsaXphbmRvIHRvZGFzIGxhcyB2YXJpYWJsZXMgc29jaW9kZW1vZ3LDoWZpY2FzLCBhIGRpZmVyZW5jaWEgZGVsIGFuw6FsaXNpcyBlbiAqKkJ1ZW5vcyBBaXJlcyoqIHNlIG9ic2VydmEgcXVlLCBlbiBlc3RlIHByaW1lciBtb2RlbG8sIGVsICpzZXhvKiBubyBlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZvIHBhcmEgcHJlZGVjaXIgZWwgdm90byBhbCBvZmljaWFsaXNtby4gRWwgYG5pdl9lZHVjYXRpdm9feF9zZWN1bmRhcmlvX2luY29tcGxldG9fb19jb21wbGV0b2AsIHBvciBvdHJvIGxhZG8gY29uIHVuIHAtdmFsdWUgZGUgMC4wMDk0OCBpbmRpY2EgcXVlIG1hbnRlbmllbmRvIGNvbnN0YW50ZXMgbGFzIGRlbcOhcyB2YXJpYWJsZXMgZW4gZWwgbW9kZWxvLCBsYXMgcGVyc29uYXMgY29uIHNlY3VuZGFyaW8gdGllbmVuIG1lbm9zIHByb2JhYmlsaWRhZGVzIGRlIHZvdGFyIHBvciBlbCBvZmljaWFsaXNtbyBlbiBjb21wYXJhY2nDs24gY29uIGVsIHJlc3RvLiBEZSBsYSBtaXNtYSBtYW5lcmEgb2N1cnJlIGNvbiBgZWRhZF94XzY1YCB5IGBlZGFkX3g1MF82NWAgLg0KDQpBIGNvbnRpbnVhY2nDs24gc2UgdXRpbGl6YXLDoSBlbCBtw6l0b2RvIFNURVBBSUMgcXVlIHBlcm1pdGUgcmVhbGl6YXIgZWwgcHJvY2VzbyBkZSBzZWxlY2Npw7NuIGRlIHZhcmlhYmxlcyBtZWRpYW50ZSBlbCBBa2Fpa2UgKEFJQykuDQoNCmBgYHtyfQ0KI1VzYW1vcyBzdGVwQUlDIHBhcmEgZ2VuZXJhciBlbCBtZWpvciBtb2RlbG8NCmZpbmFsX21vZGVsIDwtIE1BU1M6OnN0ZXBBSUMobW9kZWxvKQ0KDQojIG1vc3RyYW1vcw0Kc3VtbWFyeShmaW5hbF9tb2RlbCkNCmBgYA0KDQpFbiBsw61uZWEgY29uIGVsIG1vZGVsbyBhbnRlcmlvciwgbGFzIHZhcmlhYmxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcyBzb246IGBuaXZfZWR1Y2F0aXZvX3hfc2VjdW5kYXJpb19pbmNvbXBsZXRvX29fY29tcGxldG9gIHkgYG5pdl9lZHVjYXRpdm9feF90ZXJjaWFyaW9fbm9fdW5pdl9pbmNvbXBsZXRvYCBsbyBxdWUgaW5kaWNhIHF1ZSBhIG1lZGlkYSBxdWUgYXVtZW50YSBlbCBuaXZlbCBlZHVjYXRpdm8gKGhhc3RhIGVsIG5pdmVsIHVuaXZlcnNpdGFyaW8pLCBsYSBwcm9iYWJpbGlkYWQgZGUgdm90YXIgYWwgb2ZpY2lhbGlzbW8gZGlzbWludXllLiBSZXNwZWN0byBhIGxhIGVkYWQsIGEgbWVkaWRhIHF1ZSBhdW1lbnRhIGxhIGVkYWQgYSBwYXJ0aXIgZGUgbG9zIDUwIGHDsW9zIGVzIG1lbm9zIHByb2JhYmxlIHF1ZSBzZSB2b3RlIGFsIEZQVi4NCg0KIyMjIENvbmNsdXNpb25lcw0KDQpMb3MgcmVzdWx0YWRvcyBxdWUgYXJyb2phbiBsb3MgbW9kZWxvcyBwYXJhICpCdWVub3MgQWlyZXMqIHkgKkPDs3Jkb2JhKiBzb24gcGFyZWNpZG9zIHJlc3BlY3RvIGEgbGFzIHZhcmlhYmxlcyBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhcy4gRW4gZXN0ZSBzZW50aWRvLCBzb24gbGEgZWRhZCB5IGVsIG5pdmVsIGVkdWNhdGl2byBsYXMgdmFyaWFibGVzIHF1ZSBwb2Ryw61hbiBleHBsaWNhciBlbCB2b3RvIGFsIG9maWNpYWxpc21vLiBFbiBCdWVub3MgQWlyZXMgYSBtYXlvciBuaXZlbCBlZHVjYXRpdm8gbWF5b3Igdm90byBhbCBvZmljaWFsaXNtbywgeSBlbCByYW5nbyBldGFyaW8gcXVlIGluZmx1eWUgaW52ZXJzYW1lbnRlIGVzIGVsIGRlIDMwLTQ5LiBFbiBjYW1iaW8sIGVuIGPDs3Jkb2JhIHN1Y2VkZSBhbCByZXbDqXMsIGEgcGFydGlyIGRlIGxvcyA1MCBhw7FvcyBhIG1lZGlkYSBxdWUgYXVtZW50YSBsYSBlZGFkIGRpc21pbnV5ZSBsYSBwcm9iYWJpbGlkYWQgZGUgdm90YXIgYWwgRlBWLCB5IGxvIG1pc21vIG9jdXJyZSBjb24gZWwgbml2ZWwgZWR1Y2F0aXZvLg0K