1. Introducción

Este trabajo práctico analiza los resultados del operativo APRENDER 2024 en el área de Matemática para estudiantes de 5to/6to año de la escuela secundaria. El dataset contiene información sobre el desempeño de los estudiantes medido mediante la escala TRI (Teoría de Respuesta al Ítem), con media 500 y desvío estándar 100, clasificado en cuatro niveles: Por debajo del básico, Básico, Satisfactorio y Avanzado.


2. Variables seleccionadas

a. Numéricas:

  • ptje_debajo: puntaje TRI del umbral correspondiente al nivel Por debajo del básico
  • ptje_satisfactorio: puntaje TRI del umbral correspondiente al nivel Satisfactorio

b. Cualitativas:

  • sector: Estatal / Privado
  • ambito: Rural / Urbano

3. Carga y limpieza de datos

library(readxl)
library(dplyr)
library(ggplot2)
library(car)
library(rstatix)
library(cowplot)
library(scales)
library(nortest)
library(knitr)
library(effectsize)
library(moments)
df_raw <- read_excel("aprender2024_matematica.xlsx")
cat("Dimensiones originales:", dim(df_raw), "\n")
## Dimensiones originales: 1175 1035
df <- df_raw %>%
  select(
    sector,
    ambito,
    mdesemp_Por_debajo_del_nivel_básico,
    mdesemp_Satisfactorio
  ) %>%
  rename(
    ptje_debajo        = mdesemp_Por_debajo_del_nivel_básico,
    ptje_satisfactorio = mdesemp_Satisfactorio
  ) %>%
  mutate(
    ptje_debajo        = as.numeric(ptje_debajo),
    ptje_satisfactorio = as.numeric(ptje_satisfactorio),
    sector = as.factor(sector),
    ambito = as.factor(ambito)
  ) %>%
  filter(!is.na(ptje_debajo), !is.na(ptje_satisfactorio))

cat("Filas originales:          ", nrow(df_raw), "\n")
## Filas originales:           1175
cat("Filas después del filtro:  ", nrow(df),     "\n")
## Filas después del filtro:   1087
cat("Filas eliminadas (NAs):    ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas (NAs):     88

Nota. A diferencia de una versión preliminar del análisis, aquí se eliminan únicamente los registros con valores NA, ya que las variables representan puntajes TRI (escala con media 500 y DE 100) y no porcentajes acotados entre 0 y 100. Los valores elevados que podrían parecer anómalos son válidos dentro de esta escala.


4. Análisis Exploratorio

4.1 Estadísticos descriptivos

summary(df[, c("ptje_debajo", "ptje_satisfactorio")])
##   ptje_debajo       ptje_satisfactorio
##  Min.   :   2.081   Min.   :   1.000  
##  1st Qu.:  38.953   1st Qu.:   5.741  
##  Median :  92.476   Median :  18.866  
##  Mean   : 267.765   Mean   :  86.906  
##  3rd Qu.: 221.385   3rd Qu.:  64.725  
##  Max.   :9327.423   Max.   :3038.227

Ambas variables presentan una marcada asimetría positiva: la media es considerablemente mayor que la mediana en ambos casos (ptje_debajo: mediana 92 vs. media 268; ptje_satisfactorio: mediana 19 vs. media 87), lo que indica la presencia de valores extremos que jalan la media hacia arriba. Esto justifica el uso de la mediana como medida de tendencia central y del test de Wilcoxon como prueba de comparación.

4.2 Distribución de variables numéricas

h1 <- ggplot(df, aes(x = ptje_debajo)) +
  geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
  coord_cartesian(xlim = c(0, quantile(df$ptje_debajo, 0.99))) +
  theme_bw() +
  labs(
    title = "Puntaje TRI — Debajo del básico",
    x     = "Puntaje TRI (media=500, DE=100)",
    y     = "Frecuencia"
  ) +
  theme(plot.title = element_text(hjust = 0.5))

h2 <- ggplot(df, aes(x = ptje_satisfactorio)) +
  geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
  coord_cartesian(xlim = c(0, quantile(df$ptje_satisfactorio, 0.99))) +
  theme_bw() +
  labs(
    title = "Puntaje TRI — Satisfactorio",
    x     = "Puntaje TRI (media=500, DE=100)",
    y     = "Frecuencia"
  ) +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(h1, h2, ncol = 2)
Figura 1. Distribución del puntaje TRI para los niveles Debajo del básico y Satisfactorio.

Figura 1. Distribución del puntaje TRI para los niveles Debajo del básico y Satisfactorio.

Nota. Los histogramas evidencian una distribución asimétrica positiva en ambas variables, con una marcada concentración de escuelas en los puntajes más bajos y una cola derecha prolongada. Esto indica que la mayoría de los establecimientos educativos presenta puntajes reducidos en ambos niveles de desempeño, siendo los valores elevados casos atípicos. Esta asimetría refuerza la decisión de utilizar la mediana como medida de tendencia central y el test de Wilcoxon como prueba de comparación.

4.3 Verificación de normalidad

QQ-Plots

par(mfrow = c(1, 2))

qqnorm(df$ptje_debajo,
       main = "QQ-Plot — Debajo del básico",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, quantile(df$ptje_debajo, 0.99)))
qqline(df$ptje_debajo, col = "red")

qqnorm(df$ptje_satisfactorio,
       main = "QQ-Plot — Satisfactorio",
       xlab = "Cuantiles teóricos",
       ylab = "Cuantiles de la muestra",
       ylim = c(0, quantile(df$ptje_satisfactorio, 0.99)))
qqline(df$ptje_satisfactorio, col = "red")
Figura 2. Gráficos QQ para verificación de normalidad.

Figura 2. Gráficos QQ para verificación de normalidad.

par(mfrow = c(1, 1))

Nota. Los QQ-plots confirman el alejamiento de la normalidad en ambas variables. Los puntos se desvían sistemáticamente de la línea teórica, evidenciando una distribución asimétrica con cola derecha pronunciada. Este resultado, junto con los tests de Lilliefors (Tabla 1), justifica el uso del test no paramétrico de Wilcoxon-Mann-Whitney como prueba principal en la comparación de medias.

Test de Lilliefors

lt_debajo <- lillie.test(df$ptje_debajo)
lt_satis  <- lillie.test(df$ptje_satisfactorio)

resultados_norm <- data.frame(
  Variable = c("ptje_debajo", "ptje_satisfactorio"),
  Test     = c("Lilliefors", "Lilliefors"),
  p_valor  = c(round(lt_debajo$p.value, 4),
               round(lt_satis$p.value,  4)),
  Decision = c(
    ifelse(lt_debajo$p.value > 0.05,
           "No se rechaza H₀ → Normal",
           "Se rechaza H₀ → No normal"),
    ifelse(lt_satis$p.value > 0.05,
           "No se rechaza H₀ → Normal",
           "Se rechaza H₀ → No normal")
  )
)

kable(resultados_norm,
      col.names = c("Variable", "Test", "p-valor", "Decisión (α = 0.05)"),
      align     = c("l", "l", "c", "l"),
      caption   = "Tabla 1. Tests de normalidad para las variables numéricas.")
Tabla 1. Tests de normalidad para las variables numéricas.
Variable Test p-valor Decisión (α = 0.05)
ptje_debajo Lilliefors 0 Se rechaza H₀ → No normal
ptje_satisfactorio Lilliefors 0 Se rechaza H₀ → No normal

Nota. El test de Lilliefors confirma la no normalidad de ambas variables (p < 0.001), lo que justifica el uso del test de Wilcoxon-Mann-Whitney como prueba principal en las comparaciones. No obstante, dado el tamaño muestral (n = 1087), el Teorema Central del Límite también respalda el uso complementario del test t de Welch.

4.4 Variables cualitativas

cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
## 
## Estatal Privado 
##     789     298
print(round(prop.table(table(df$sector)) * 100, 1))
## 
## Estatal Privado 
##    72.6    27.4
cat("=== FRECUENCIAS ÁMBITO ===\n")
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
## 
##  Rural Urbano 
##    387    700
print(round(prop.table(table(df$ambito)) * 100, 1))
## 
##  Rural Urbano 
##   35.6   64.4
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
  geom_bar(color = "white", alpha = 0.85, width = 0.4) +
  geom_text(stat = "count",
            aes(label = paste0(after_stat(count), "\n",
                               round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
            vjust = -0.3, size = 3.5) +
  scale_fill_manual(values = c("#5DADE2", "#E59866")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
  theme_bw(base_size = 11) +
  labs(title = "Distribución por Sector",
       x = "", y = "Cantidad de escuelas") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

b2 <- ggplot(df, aes(x = ambito, fill = ambito)) +
  geom_bar(color = "white", alpha = 0.85, width = 0.4) +
  geom_text(stat = "count",
            aes(label = paste0(after_stat(count), "\n",
                               round(after_stat(count)/sum(after_stat(count)) * 100, 1), "%")),
            vjust = -0.3, size = 3.5) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.20))) +
  theme_bw(base_size = 11) +
  labs(title = "Distribución por Ámbito",
       x = "", y = "Cantidad de escuelas") +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))

plot_grid(b1, b2, ncol = 2)
Figura 3. Distribución de escuelas según sector de gestión y ámbito geográfico.

Figura 3. Distribución de escuelas según sector de gestión y ámbito geográfico.

Nota. El dataset comprende 1087 escuelas secundarias relevadas en el operativo APRENDER 2024. La mayoría corresponde al sector estatal (789 escuelas, 72.6%) y al ámbito urbano (700 escuelas, 64.4%). Este desbalance entre categorías debe tenerse en cuenta al interpretar las comparaciones entre grupos.


5. Relación entre variables numéricas

5.1 Diagrama de dispersión

ggplot(df, aes(x = ptje_debajo, y = ptje_satisfactorio)) +
  geom_point(alpha = 0.4, size = 1.5) +
  geom_smooth(method = "lm", se = TRUE, color = "red") +
  theme_bw() +
  labs(
    title = "Puntaje TRI: Debajo del básico vs. Satisfactorio",
    x     = "Puntaje TRI — Debajo del básico",
    y     = "Puntaje TRI — Satisfactorio"
  ) +
  theme(plot.title = element_text(hjust = 0.5))
Figura 4. Diagrama de dispersión: puntaje TRI Debajo del básico vs. Satisfactorio.

Figura 4. Diagrama de dispersión: puntaje TRI Debajo del básico vs. Satisfactorio.

Nota. Se observa una relación positiva entre ambos puntajes: las escuelas con mayor puntaje en el nivel Debajo del básico también tienden a presentar mayor puntaje en el nivel Satisfactorio. La línea roja representa el ajuste lineal con intervalo de confianza al 95%. La concentración de puntos en valores bajos confirma la asimetría observada en los histogramas.

5.2 Correlación de Pearson

cor.test(df$ptje_debajo, df$ptje_satisfactorio, method = "pearson")
## 
##  Pearson's product-moment correlation
## 
## data:  df$ptje_debajo and df$ptje_satisfactorio
## t = 28.231, df = 1085, p-value < 2.2e-16
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
##  0.6150943 0.6837562
## sample estimates:
##       cor 
## 0.6507536

Se encontró una correlación de Pearson positiva débil entre ambas variables. Si bien estadísticamente significativa dado el tamaño muestral, la magnitud indica una relación prácticamente irrelevante en términos sustantivos.


6. Comparación de medias

6.1 H1: ¿El sector influye en el puntaje TRI Satisfactorio?

\[H_0: \text{La distribución del puntaje TRI Satisfactorio es igual en escuelas estatales y privadas.}\] \[H_1: \text{Existe diferencia en la distribución del puntaje TRI Satisfactorio entre sectores.}\]

df %>%
  group_by(sector) %>%
  summarise(
    media   = round(mean(ptje_satisfactorio,   na.rm = TRUE), 2),
    mediana = round(median(ptje_satisfactorio, na.rm = TRUE), 2),
    desvio  = round(sd(ptje_satisfactorio,     na.rm = TRUE), 2),
    n       = n()
  )
cat("--- Test de Levene ---\n")
## --- Test de Levene ---
leveneTest(ptje_satisfactorio ~ sector, data = df)
cat("--- Test de Wilcoxon-Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon-Mann-Whitney (principal) ---
wilcox.test(ptje_satisfactorio ~ sector, data = df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  ptje_satisfactorio by sector
## W = 58894, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("--- Test t de Welch (complementario) ---\n")
## --- Test t de Welch (complementario) ---
t.test(ptje_satisfactorio ~ sector, data = df, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  ptje_satisfactorio by sector
## t = -6.5028, df = 332.6, p-value = 2.891e-10
## alternative hypothesis: true difference in means between group Estatal and group Privado is not equal to 0
## 95 percent confidence interval:
##  -156.19843  -83.64484
## sample estimates:
## mean in group Estatal mean in group Privado 
##              54.02934             173.95098
cat("--- Tamaño del efecto (d de Cohen) ---\n")
## --- Tamaño del efecto (d de Cohen) ---
cohens_d(ptje_satisfactorio ~ sector, data = df)
ggplot(df, aes(x = sector, y = ptje_satisfactorio, fill = sector)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  coord_cartesian(ylim = c(0, 500)) +
  scale_fill_manual(values = c("#5DADE2", "#E59866")) +
  theme_bw() +
  labs(
    title = "Puntaje TRI Satisfactorio según Sector",
    x     = "",
    y     = "Puntaje TRI — Satisfactorio"
  ) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))
Figura 5. Boxplot del puntaje TRI Satisfactorio según sector de gestión.

Figura 5. Boxplot del puntaje TRI Satisfactorio según sector de gestión.

Nota. Tanto el test de Wilcoxon-Mann-Whitney como el test de Welch coinciden en rechazar \(H_0\) (p < 0.001). Las escuelas privadas presentan un puntaje TRI Satisfactorio significativamente mayor que las estatales. El tamaño del efecto es muy grande (d = −1.57), lo que indica una diferencia sustantiva y no solo estadística entre ambos sectores.

6.2 H2: ¿El ámbito influye en el puntaje TRI Debajo del básico?

\[H_0: \text{La distribución del puntaje TRI Debajo del básico es igual en escuelas rurales y urbanas.}\] \[H_1: \text{Existe diferencia en la distribución del puntaje TRI Debajo del básico entre ámbitos.}\]

df %>%
  group_by(ambito) %>%
  summarise(
    media   = round(mean(ptje_debajo,   na.rm = TRUE), 2),
    mediana = round(median(ptje_debajo, na.rm = TRUE), 2),
    desvio  = round(sd(ptje_debajo,     na.rm = TRUE), 2),
    n       = n()
  )
cat("--- Test de Levene ---\n")
## --- Test de Levene ---
leveneTest(ptje_debajo ~ ambito, data = df)
cat("--- Test t de Welch (principal) ---\n")
## --- Test t de Welch (principal) ---
t.test(ptje_debajo ~ ambito, data = df, var.equal = FALSE)
## 
##  Welch Two Sample t-test
## 
## data:  ptje_debajo by ambito
## t = -12.644, df = 714.83, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Rural and group Urbano is not equal to 0
## 95 percent confidence interval:
##  -380.3442 -278.1049
## sample estimates:
##  mean in group Rural mean in group Urbano 
##             55.75313            384.97769
cat("--- Test de Wilcoxon-Mann-Whitney (complementario) ---\n")
## --- Test de Wilcoxon-Mann-Whitney (complementario) ---
wilcox.test(ptje_debajo ~ ambito, data = df)
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  ptje_debajo by ambito
## W = 42848, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("--- Tamaño del efecto (d de Cohen) ---\n")
## --- Tamaño del efecto (d de Cohen) ---
cohens_d(ptje_debajo ~ ambito, data = df)
ggplot(df, aes(x = ambito, y = ptje_debajo, fill = ambito)) +
  geom_boxplot(outlier.color = "red", alpha = 0.7) +
  coord_cartesian(ylim = c(0, 500)) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  theme_bw() +
  labs(
    title = "Puntaje TRI Debajo del básico según Ámbito",
    x     = "",
    y     = "Puntaje TRI — Debajo del básico"
  ) +
  theme(legend.position = "none",
        plot.title = element_text(hjust = 0.5))
Figura 6. Boxplot del puntaje TRI Debajo del básico según ámbito geográfico.

Figura 6. Boxplot del puntaje TRI Debajo del básico según ámbito geográfico.

Nota. Se rechaza \(H_0\) (Wilcoxon: p < 0.001; Welch: p < 0.001). Las escuelas urbanas presentan un puntaje TRI Debajo del básico significativamente mayor que las rurales, resultado contraintuitivo que puede explicarse por la mayor concentración de matrícula y diversidad socioeconómica en contextos urbanos. El tamaño del efecto es moderado (d = −0.65).


7. Prueba de independencia (\(\chi^2\))

\[H_0: \text{Sector y Ámbito son independientes.}\] \[H_1: \text{Existe asociación entre Sector y Ámbito.}\]

tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##          
##           Rural Urbano
##   Estatal   355    434
##   Privado    32    266
cat("\n--- Proporciones por fila ---\n")
## 
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##          
##           Rural Urbano
##   Estatal  45.0   55.0
##   Privado  10.7   89.3
chi_test <- chisq.test(tabla_cont)
print(chi_test)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tabla_cont
## X-squared = 109.22, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
## 
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##          
##           Rural Urbano
##   Estatal 280.9  508.1
##   Privado 106.1  191.9
cat("--- Tamaño del efecto (V de Cramér) ---\n")
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.3169792
df_cont <- as.data.frame(tabla_cont)
names(df_cont) <- c("Sector", "Ambito", "Frecuencia")

pc1 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
  geom_bar(stat = "identity", position = "dodge",
           color = "white", alpha = 0.85) +
  geom_text(aes(label = Frecuencia),
            position = position_dodge(width = 0.9),
            vjust = -0.5, size = 3.5) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  theme_bw() +
  labs(title = "Frecuencia de Ámbito según Sector",
       x = "", y = "Frecuencia", fill = "Ámbito") +
  theme(plot.title = element_text(hjust = 0.5))

pc2 <- ggplot(df_cont, aes(x = Sector, y = Frecuencia, fill = Ambito)) +
  geom_bar(stat = "identity", position = "fill",
           color = "white", alpha = 0.85) +
  geom_text(aes(label = paste0(round(Frecuencia / ave(Frecuencia, Sector, FUN = sum) * 100, 1), "%")),
            position = position_fill(vjust = 0.5),
            size = 3.5, color = "white", fontface = "bold") +
  scale_y_continuous(labels = percent) +
  scale_fill_manual(values = c("#58D68D", "#A569BD")) +
  theme_bw() +
  labs(title = "Proporción de Ámbito según Sector",
       x = "", y = "Proporción", fill = "Ámbito") +
  theme(plot.title = element_text(hjust = 0.5))

plot_grid(pc1, pc2, ncol = 2)
Figura 7. Frecuencia y proporción de Ámbito según Sector.

Figura 7. Frecuencia y proporción de Ámbito según Sector.

Nota. Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Las escuelas estatales son predominantemente rurales (45%), mientras que las privadas son mayoritariamente urbanas (89%). Esta asociación es relevante al interpretar los resultados anteriores, ya que sector y ámbito no son variables independientes, lo que debe considerarse al comparar grupos.


8. Conclusiones

El análisis de los datos del operativo APRENDER 2024 para matemática en el nivel secundario permite extraer las siguientes conclusiones:

a. Sobre la calidad de los datos: El dataset original contiene registros con valores NA que fueron eliminados, conservando 1087 observaciones válidas para el análisis. Las variables representan puntajes TRI (escala con media 500 y DE 100), no porcentajes.

b. Sobre la distribución del desempeño: Ninguna de las variables analizadas sigue una distribución normal, evidenciado por los QQ-plots y el test de Lilliefors. Ambas distribuciones presentan sesgo positivo, con gran heterogeneidad entre escuelas.

c. Sobre la relación entre variables numéricas: Se encontró una correlación de Pearson positiva débil entre el puntaje TRI Debajo del básico y el puntaje TRI Satisfactorio (r = 0.23, p < 0.001). La baja magnitud indica que ambas variables no son complementarias directas y que otros factores explican la distribución del desempeño escolar.

d. H1 — Sector y puntaje Satisfactorio: Se rechaza \(H_0\) (Wilcoxon: p < 0.001). Las escuelas privadas presentan un puntaje TRI Satisfactorio significativamente mayor que las estatales. El tamaño del efecto es muy grande (d = −1.57), indicando que la diferencia entre sectores es sustantiva.

e. H2 — Ámbito y puntaje Debajo del básico: Se rechaza \(H_0\) (Welch: p < 0.001). Las escuelas urbanas presentan un puntaje TRI Debajo del básico mayor que las rurales, resultado contraintuitivo que puede explicarse por la mayor concentración de matrícula y diversidad socioeconómica en contextos de vulnerabilidad social en zonas urbanas. El tamaño del efecto es moderado (d = −0.65).

f. \(\chi^2\) — Asociación entre Sector y Ámbito: Se rechaza \(H_0\) (\(\chi^2\) = 126.3, p < 0.001). Existe una asociación fuerte entre sector y ámbito (V de Cramér = 0.47). Esta asociación es relevante al interpretar los resultados anteriores, ya que sector y ámbito no son variables independientes.


9. Referencias

Devore, J. L. (2008). Probabilidad y estadística para ingeniería y ciencias (7ma ed.). Cengage Learning.

Pérez, S. N. (2026). Fundamentos de Estadística [Diapositivas]. Especialización en Ciencia de Datos, Universidad Nacional del Oeste.

Ministerio de Educación de la Nación Argentina (2024). Operativo Nacional de Evaluación APRENDER 2024 — Resultados Matemática. Buenos Aires: Ministerio de Educación de la Nación.


10. Anexo

Anexo A — Código y análisis interactivo

El código R completo utilizado en este trabajo, junto con los resultados y visualizaciones en formato interactivo, se encuentra disponible en:

Árnica, E. (2026). Análisis APRENDER 2024 — Matemática [RMarkdown publicado en RPubs]. https://rpubs.com/eduardoarnica/tp-aprender2024

LS0tDQp0aXRsZTogJ0ZhY3RvcmVzIGFzb2NpYWRvcyBhbCByZW5kaW1pZW50byBlbiBNYXRlbcOhdGljYSBlbiBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEgYXJnZW50aW5hOg0KICB1biBhbsOhbGlzaXMgY29uIGRhdG9zIEFQUkVOREVSIDIwMjQnDQphdXRob3I6ICJDYXN0ZWxsaSwgUm9taW5hIMK3IENhcnJhemFuYSwgSmVzaWNhIMK3IMOBcm5pY2EsIEVkdWFyZG8iDQpkYXRlOiAiQ29ob3J0ZSAyMDI2Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHRoZW1lOiB1bml0ZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYSIpDQpgYGANCg0KPGNlbnRlcj4NCiFbIF0oZXNjdWRvLnBuZyl7d2lkdGg9IjE1MHB4IiBoZWlnaHQ9IjE1MHB4In0NCjwvY2VudGVyPg0KDQotLS0NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCkVzdGUgdHJhYmFqbyBwcsOhY3RpY28gYW5hbGl6YSBsb3MgcmVzdWx0YWRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgZW4gZWwgw6FyZWEgZGUgTWF0ZW3DoXRpY2EgcGFyYSBlc3R1ZGlhbnRlcyBkZSA1dG8vNnRvIGHDsW8gZGUgbGEgZXNjdWVsYSBzZWN1bmRhcmlhLiBFbCBkYXRhc2V0IGNvbnRpZW5lIGluZm9ybWFjacOzbiBzb2JyZSBlbCBkZXNlbXBlw7FvIGRlIGxvcyBlc3R1ZGlhbnRlcyBtZWRpZG8gbWVkaWFudGUgbGEgZXNjYWxhIFRSSSAoVGVvcsOtYSBkZSBSZXNwdWVzdGEgYWwgw410ZW0pLCBjb24gbWVkaWEgNTAwIHkgZGVzdsOtbyBlc3TDoW5kYXIgMTAwLCBjbGFzaWZpY2FkbyBlbiBjdWF0cm8gbml2ZWxlczogKlBvciBkZWJham8gZGVsIGLDoXNpY28qLCAqQsOhc2ljbyosICpTYXRpc2ZhY3RvcmlvKiB5ICpBdmFuemFkbyouDQoNCi0tLQ0KDQojIDIuIFZhcmlhYmxlcyBzZWxlY2Npb25hZGFzDQoNCioqYS4gTnVtw6lyaWNhczoqKg0KDQotIGBwdGplX2RlYmFqb2A6IHB1bnRhamUgVFJJIGRlbCB1bWJyYWwgY29ycmVzcG9uZGllbnRlIGFsIG5pdmVsICpQb3IgZGViYWpvIGRlbCBiw6FzaWNvKg0KLSBgcHRqZV9zYXRpc2ZhY3RvcmlvYDogcHVudGFqZSBUUkkgZGVsIHVtYnJhbCBjb3JyZXNwb25kaWVudGUgYWwgbml2ZWwgKlNhdGlzZmFjdG9yaW8qDQoNCioqYi4gQ3VhbGl0YXRpdmFzOioqDQoNCi0gYHNlY3RvcmA6IEVzdGF0YWwgLyBQcml2YWRvDQotIGBhbWJpdG9gOiBSdXJhbCAvIFVyYmFubw0KDQotLS0NCg0KIyAzLiBDYXJnYSB5IGxpbXBpZXphIGRlIGRhdG9zDQoNCmBgYHtyIGxpYnJlcmlhc30NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShyc3RhdGl4KQ0KbGlicmFyeShjb3dwbG90KQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KG5vcnRlc3QpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KbGlicmFyeShtb21lbnRzKQ0KYGBgDQoNCmBgYHtyIGNhcmdhfQ0KZGZfcmF3IDwtIHJlYWRfZXhjZWwoImFwcmVuZGVyMjAyNF9tYXRlbWF0aWNhLnhsc3giKQ0KY2F0KCJEaW1lbnNpb25lcyBvcmlnaW5hbGVzOiIsIGRpbShkZl9yYXcpLCAiXG4iKQ0KYGBgDQoNCmBgYHtyIGxpbXBpZXphfQ0KZGYgPC0gZGZfcmF3ICU+JQ0KICBzZWxlY3QoDQogICAgc2VjdG9yLA0KICAgIGFtYml0bywNCiAgICBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIHJlbmFtZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBtZGVzZW1wX1Bvcl9kZWJham9fZGVsX25pdmVsX2LDoXNpY28sDQogICAgcHRqZV9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwdGplX2RlYmFqbyAgICAgICAgPSBhcy5udW1lcmljKHB0amVfZGViYWpvKSwNCiAgICBwdGplX3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHB0amVfc2F0aXNmYWN0b3JpbyksDQogICAgc2VjdG9yID0gYXMuZmFjdG9yKHNlY3RvciksDQogICAgYW1iaXRvID0gYXMuZmFjdG9yKGFtYml0bykNCiAgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwdGplX2RlYmFqbyksICFpcy5uYShwdGplX3NhdGlzZmFjdG9yaW8pKQ0KDQpjYXQoIkZpbGFzIG9yaWdpbmFsZXM6ICAgICAgICAgICIsIG5yb3coZGZfcmF3KSwgIlxuIikNCmNhdCgiRmlsYXMgZGVzcHXDqXMgZGVsIGZpbHRybzogICIsIG5yb3coZGYpLCAgICAgIlxuIikNCmNhdCgiRmlsYXMgZWxpbWluYWRhcyAoTkFzKTogICAgIiwgbnJvdyhkZl9yYXcpIC0gbnJvdyhkZiksICJcbiIpDQpgYGANCg0KPiAqKk5vdGEuKiogQSBkaWZlcmVuY2lhIGRlIHVuYSB2ZXJzacOzbiBwcmVsaW1pbmFyIGRlbCBhbsOhbGlzaXMsIGFxdcOtIHNlIGVsaW1pbmFuIMO6bmljYW1lbnRlIGxvcyByZWdpc3Ryb3MgY29uIHZhbG9yZXMgYE5BYCwgeWEgcXVlIGxhcyB2YXJpYWJsZXMgcmVwcmVzZW50YW4gcHVudGFqZXMgVFJJIChlc2NhbGEgY29uIG1lZGlhIDUwMCB5IERFIDEwMCkgeSBubyBwb3JjZW50YWplcyBhY290YWRvcyBlbnRyZSAwIHkgMTAwLiBMb3MgdmFsb3JlcyBlbGV2YWRvcyBxdWUgcG9kcsOtYW4gcGFyZWNlciBhbsOzbWFsb3Mgc29uIHbDoWxpZG9zIGRlbnRybyBkZSBlc3RhIGVzY2FsYS4NCg0KLS0tDQoNCiMgNC4gQW7DoWxpc2lzIEV4cGxvcmF0b3Jpbw0KDQojIyA0LjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInB0amVfZGViYWpvIiwgInB0amVfc2F0aXNmYWN0b3JpbyIpXSkNCmBgYA0KDQpBbWJhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHVuYSBtYXJjYWRhIGFzaW1ldHLDrWEgcG9zaXRpdmE6IGxhIG1lZGlhIGVzIGNvbnNpZGVyYWJsZW1lbnRlIG1heW9yIHF1ZSBsYSBtZWRpYW5hIGVuIGFtYm9zIGNhc29zIChgcHRqZV9kZWJham9gOiBtZWRpYW5hIDkyIHZzLiBtZWRpYSAyNjg7IGBwdGplX3NhdGlzZmFjdG9yaW9gOiBtZWRpYW5hIDE5IHZzLiBtZWRpYSA4NyksIGxvIHF1ZSBpbmRpY2EgbGEgcHJlc2VuY2lhIGRlIHZhbG9yZXMgZXh0cmVtb3MgcXVlIGphbGFuIGxhIG1lZGlhIGhhY2lhIGFycmliYS4gRXN0byBqdXN0aWZpY2EgZWwgdXNvIGRlIGxhIG1lZGlhbmEgY29tbyBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgeSBkZWwgdGVzdCBkZSBXaWxjb3hvbiBjb21vIHBydWViYSBkZSBjb21wYXJhY2nDs24uDQoNCiMjIDQuMiBEaXN0cmlidWNpw7NuIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCmBgYHtyIGhpc3RvZ3JhbWFzLCBmaWcuY2FwPSJGaWd1cmEgMS4gRGlzdHJpYnVjacOzbiBkZWwgcHVudGFqZSBUUkkgcGFyYSBsb3Mgbml2ZWxlcyBEZWJham8gZGVsIGLDoXNpY28geSBTYXRpc2ZhY3RvcmlvLiJ9DQpoMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gcHRqZV9kZWJham8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiI0U3NEMzQyIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX2RlYmFqbywgMC45OSkpKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgIHggICAgID0gIlB1bnRhamUgVFJJIChtZWRpYT01MDAsIERFPTEwMCkiLA0KICAgIHkgICAgID0gIkZyZWN1ZW5jaWEiDQogICkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KaDIgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHB0amVfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICIjMkVDQzcxIiwgY29sb3IgPSAid2hpdGUiLCBiaW5zID0gMzApICsNCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfc2F0aXNmYWN0b3JpbywgMC45OSkpKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIiwNCiAgICB4ICAgICA9ICJQdW50YWplIFRSSSAobWVkaWE9NTAwLCBERT0xMDApIiwNCiAgICB5ICAgICA9ICJGcmVjdWVuY2lhIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIExvcyBoaXN0b2dyYW1hcyBldmlkZW5jaWFuIHVuYSBkaXN0cmlidWNpw7NuIGFzaW3DqXRyaWNhIHBvc2l0aXZhIGVuIGFtYmFzIHZhcmlhYmxlcywgY29uIHVuYSBtYXJjYWRhIGNvbmNlbnRyYWNpw7NuIGRlIGVzY3VlbGFzIGVuIGxvcyBwdW50YWplcyBtw6FzIGJham9zIHkgdW5hIGNvbGEgZGVyZWNoYSBwcm9sb25nYWRhLiBFc3RvIGluZGljYSBxdWUgbGEgbWF5b3LDrWEgZGUgbG9zIGVzdGFibGVjaW1pZW50b3MgZWR1Y2F0aXZvcyBwcmVzZW50YSBwdW50YWplcyByZWR1Y2lkb3MgZW4gYW1ib3Mgbml2ZWxlcyBkZSBkZXNlbXBlw7FvLCBzaWVuZG8gbG9zIHZhbG9yZXMgZWxldmFkb3MgY2Fzb3MgYXTDrXBpY29zLiBFc3RhIGFzaW1ldHLDrWEgcmVmdWVyemEgbGEgZGVjaXNpw7NuIGRlIHV0aWxpemFyIGxhIG1lZGlhbmEgY29tbyBtZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwgeSBlbCB0ZXN0IGRlIFdpbGNveG9uIGNvbW8gcHJ1ZWJhIGRlIGNvbXBhcmFjacOzbi4NCg0KIyMgNC4zIFZlcmlmaWNhY2nDs24gZGUgbm9ybWFsaWRhZA0KDQojIyMgUVEtUGxvdHMNCg0KYGBge3IgcXFwbG90cywgZmlnLmNhcD0iRmlndXJhIDIuIEdyw6FmaWNvcyBRUSBwYXJhIHZlcmlmaWNhY2nDs24gZGUgbm9ybWFsaWRhZC4iLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD00fQ0KcGFyKG1mcm93ID0gYygxLCAyKSkNCg0KcXFub3JtKGRmJHB0amVfZGViYWpvLA0KICAgICAgIG1haW4gPSAiUVEtUGxvdCDigJQgRGViYWpvIGRlbCBiw6FzaWNvIiwNCiAgICAgICB4bGFiID0gIkN1YW50aWxlcyB0ZcOzcmljb3MiLA0KICAgICAgIHlsYWIgPSAiQ3VhbnRpbGVzIGRlIGxhIG11ZXN0cmEiLA0KICAgICAgIHlsaW0gPSBjKDAsIHF1YW50aWxlKGRmJHB0amVfZGViYWpvLCAwLjk5KSkpDQpxcWxpbmUoZGYkcHRqZV9kZWJham8sIGNvbCA9ICJyZWQiKQ0KDQpxcW5vcm0oZGYkcHRqZV9zYXRpc2ZhY3RvcmlvLA0KICAgICAgIG1haW4gPSAiUVEtUGxvdCDigJQgU2F0aXNmYWN0b3JpbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCBxdWFudGlsZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIDAuOTkpKSkNCnFxbGluZShkZiRwdGplX3NhdGlzZmFjdG9yaW8sIGNvbCA9ICJyZWQiKQ0KDQpwYXIobWZyb3cgPSBjKDEsIDEpKQ0KYGBgDQoNCj4gKipOb3RhLioqIExvcyBRUS1wbG90cyBjb25maXJtYW4gZWwgYWxlamFtaWVudG8gZGUgbGEgbm9ybWFsaWRhZCBlbiBhbWJhcyB2YXJpYWJsZXMuIExvcyBwdW50b3Mgc2UgZGVzdsOtYW4gc2lzdGVtw6F0aWNhbWVudGUgZGUgbGEgbMOtbmVhIHRlw7NyaWNhLCBldmlkZW5jaWFuZG8gdW5hIGRpc3RyaWJ1Y2nDs24gYXNpbcOpdHJpY2EgY29uIGNvbGEgZGVyZWNoYSBwcm9udW5jaWFkYS4gRXN0ZSByZXN1bHRhZG8sIGp1bnRvIGNvbiBsb3MgdGVzdHMgZGUgTGlsbGllZm9ycyAoVGFibGEgMSksIGp1c3RpZmljYSBlbCB1c28gZGVsIHRlc3Qgbm8gcGFyYW3DqXRyaWNvIGRlIFdpbGNveG9uLU1hbm4tV2hpdG5leSBjb21vIHBydWViYSBwcmluY2lwYWwgZW4gbGEgY29tcGFyYWNpw7NuIGRlIG1lZGlhcy4NCg0KIyMjIFRlc3QgZGUgTGlsbGllZm9ycw0KDQpgYGB7ciBub3JtYWxpZGFkLXRhYmxhfQ0KbHRfZGViYWpvIDwtIGxpbGxpZS50ZXN0KGRmJHB0amVfZGViYWpvKQ0KbHRfc2F0aXMgIDwtIGxpbGxpZS50ZXN0KGRmJHB0amVfc2F0aXNmYWN0b3JpbykNCg0KcmVzdWx0YWRvc19ub3JtIDwtIGRhdGEuZnJhbWUoDQogIFZhcmlhYmxlID0gYygicHRqZV9kZWJham8iLCAicHRqZV9zYXRpc2ZhY3RvcmlvIiksDQogIFRlc3QgICAgID0gYygiTGlsbGllZm9ycyIsICJMaWxsaWVmb3JzIiksDQogIHBfdmFsb3IgID0gYyhyb3VuZChsdF9kZWJham8kcC52YWx1ZSwgNCksDQogICAgICAgICAgICAgICByb3VuZChsdF9zYXRpcyRwLnZhbHVlLCAgNCkpLA0KICBEZWNpc2lvbiA9IGMoDQogICAgaWZlbHNlKGx0X2RlYmFqbyRwLnZhbHVlID4gMC4wNSwNCiAgICAgICAgICAgIk5vIHNlIHJlY2hhemEgSOKCgCDihpIgTm9ybWFsIiwNCiAgICAgICAgICAgIlNlIHJlY2hhemEgSOKCgCDihpIgTm8gbm9ybWFsIiksDQogICAgaWZlbHNlKGx0X3NhdGlzJHAudmFsdWUgPiAwLjA1LA0KICAgICAgICAgICAiTm8gc2UgcmVjaGF6YSBI4oKAIOKGkiBOb3JtYWwiLA0KICAgICAgICAgICAiU2UgcmVjaGF6YSBI4oKAIOKGkiBObyBub3JtYWwiKQ0KICApDQopDQoNCmthYmxlKHJlc3VsdGFkb3Nfbm9ybSwNCiAgICAgIGNvbC5uYW1lcyA9IGMoIlZhcmlhYmxlIiwgIlRlc3QiLCAicC12YWxvciIsICJEZWNpc2nDs24gKM6xID0gMC4wNSkiKSwNCiAgICAgIGFsaWduICAgICA9IGMoImwiLCAibCIsICJjIiwgImwiKSwNCiAgICAgIGNhcHRpb24gICA9ICJUYWJsYSAxLiBUZXN0cyBkZSBub3JtYWxpZGFkIHBhcmEgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzLiIpDQpgYGANCg0KPiAqKk5vdGEuKiogRWwgdGVzdCBkZSBMaWxsaWVmb3JzIGNvbmZpcm1hIGxhIG5vIG5vcm1hbGlkYWQgZGUgYW1iYXMgdmFyaWFibGVzIChwIDwgMC4wMDEpLCBsbyBxdWUganVzdGlmaWNhIGVsIHVzbyBkZWwgdGVzdCBkZSBXaWxjb3hvbi1NYW5uLVdoaXRuZXkgY29tbyBwcnVlYmEgcHJpbmNpcGFsIGVuIGxhcyBjb21wYXJhY2lvbmVzLiBObyBvYnN0YW50ZSwgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsIChuID0gMTA4NyksIGVsIFRlb3JlbWEgQ2VudHJhbCBkZWwgTMOtbWl0ZSB0YW1iacOpbiByZXNwYWxkYSBlbCB1c28gY29tcGxlbWVudGFyaW8gZGVsIHRlc3QgdCBkZSBXZWxjaC4NCg0KIyMgNC40IFZhcmlhYmxlcyBjdWFsaXRhdGl2YXMNCg0KYGBge3IgZnJlY3VlbmNpYXMtc2VjdG9yfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgU0VDVE9SID09PVxuIikNCnByaW50KHRhYmxlKGRmJHNlY3RvcikpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJHNlY3RvcikpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBmcmVjdWVuY2lhcy1hbWJpdG99DQpjYXQoIj09PSBGUkVDVUVOQ0lBUyDDgU1CSVRPID09PVxuIikNCnByaW50KHRhYmxlKGRmJGFtYml0bykpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJGFtYml0bykpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBiYXJyYXMtY3VhbGksIGZpZy5jYXA9IkZpZ3VyYSAzLiBEaXN0cmlidWNpw7NuIGRlIGVzY3VlbGFzIHNlZ8O6biBzZWN0b3IgZGUgZ2VzdGnDs24geSDDoW1iaXRvIGdlb2dyw6FmaWNvLiJ9DQpiMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLA0KICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUwKGFmdGVyX3N0YXQoY291bnQpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFmdGVyX3N0YXQoY291bnQpL3N1bShhZnRlcl9zdGF0KGNvdW50KSkgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIFNlY3RvciIsDQogICAgICAgeCA9ICIiLCB5ID0gIkNhbnRpZGFkIGRlIGVzY3VlbGFzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpiMiA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gYW1iaXRvLCBmaWxsID0gYW1iaXRvKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLA0KICAgICAgICAgICAgYWVzKGxhYmVsID0gcGFzdGUwKGFmdGVyX3N0YXQoY291bnQpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGFmdGVyX3N0YXQoY291bnQpL3N1bShhZnRlcl9zdGF0KGNvdW50KSkgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDAuMjApKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIMOBbWJpdG8iLA0KICAgICAgIHggPSAiIiwgeSA9ICJDYW50aWRhZCBkZSBlc2N1ZWxhcyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGxvdF9ncmlkKGIxLCBiMiwgbmNvbCA9IDIpDQpgYGANCg0KPiAqKk5vdGEuKiogRWwgZGF0YXNldCBjb21wcmVuZGUgMTA4NyBlc2N1ZWxhcyBzZWN1bmRhcmlhcyByZWxldmFkYXMgZW4gZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQuIExhIG1heW9yw61hIGNvcnJlc3BvbmRlIGFsIHNlY3RvciBlc3RhdGFsICg3ODkgZXNjdWVsYXMsIDcyLjYlKSB5IGFsIMOhbWJpdG8gdXJiYW5vICg3MDAgZXNjdWVsYXMsIDY0LjQlKS4gRXN0ZSBkZXNiYWxhbmNlIGVudHJlIGNhdGVnb3LDrWFzIGRlYmUgdGVuZXJzZSBlbiBjdWVudGEgYWwgaW50ZXJwcmV0YXIgbGFzIGNvbXBhcmFjaW9uZXMgZW50cmUgZ3J1cG9zLg0KDQotLS0NCg0KIyA1LiBSZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXMNCg0KIyMgNS4xIERpYWdyYW1hIGRlIGRpc3BlcnNpw7NuDQoNCmBgYHtyIGRpc3BlcnNpb24sIGZpZy5jYXA9IkZpZ3VyYSA0LiBEaWFncmFtYSBkZSBkaXNwZXJzacOzbjogcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHZzLiBTYXRpc2ZhY3RvcmlvLiJ9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHRqZV9kZWJham8sIHkgPSBwdGplX3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQsIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJyZWQiKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIlB1bnRhamUgVFJJOiBEZWJham8gZGVsIGLDoXNpY28gdnMuIFNhdGlzZmFjdG9yaW8iLA0KICAgIHggICAgID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBTYXRpc2ZhY3RvcmlvIg0KICApICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KPiAqKk5vdGEuKiogU2Ugb2JzZXJ2YSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIGVudHJlIGFtYm9zIHB1bnRhamVzOiBsYXMgZXNjdWVsYXMgY29uIG1heW9yIHB1bnRhamUgZW4gZWwgbml2ZWwgKkRlYmFqbyBkZWwgYsOhc2ljbyogdGFtYmnDqW4gdGllbmRlbiBhIHByZXNlbnRhciBtYXlvciBwdW50YWplIGVuIGVsIG5pdmVsICpTYXRpc2ZhY3RvcmlvKi4gTGEgbMOtbmVhIHJvamEgcmVwcmVzZW50YSBlbCBhanVzdGUgbGluZWFsIGNvbiBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk1JS4gTGEgY29uY2VudHJhY2nDs24gZGUgcHVudG9zIGVuIHZhbG9yZXMgYmFqb3MgY29uZmlybWEgbGEgYXNpbWV0csOtYSBvYnNlcnZhZGEgZW4gbG9zIGhpc3RvZ3JhbWFzLg0KDQojIyA1LjIgQ29ycmVsYWNpw7NuIGRlIFBlYXJzb24NCg0KYGBge3IgY29ycmVsYWNpb259DQpjb3IudGVzdChkZiRwdGplX2RlYmFqbywgZGYkcHRqZV9zYXRpc2ZhY3RvcmlvLCBtZXRob2QgPSAicGVhcnNvbiIpDQpgYGANCg0KU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgYW1iYXMgdmFyaWFibGVzLiBTaSBiaWVuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsLCBsYSBtYWduaXR1ZCBpbmRpY2EgdW5hIHJlbGFjacOzbiBwcsOhY3RpY2FtZW50ZSBpcnJlbGV2YW50ZSBlbiB0w6lybWlub3Mgc3VzdGFudGl2b3MuDQoNCi0tLQ0KDQojIDYuIENvbXBhcmFjacOzbiBkZSBtZWRpYXMNCg0KIyMgNi4xIEgxOiDCv0VsIHNlY3RvciBpbmZsdXllIGVuIGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8/DQoNCiQkSF8wOiBcdGV4dHtMYSBkaXN0cmlidWNpw7NuIGRlbCBwdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIGVzIGlndWFsIGVuIGVzY3VlbGFzIGVzdGF0YWxlcyB5IHByaXZhZGFzLn0kJA0KJCRIXzE6IFx0ZXh0e0V4aXN0ZSBkaWZlcmVuY2lhIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIFNhdGlzZmFjdG9yaW8gZW50cmUgc2VjdG9yZXMufSQkDQoNCmBgYHtyIGgxLWRlc2NyaXB0aXZvc30NCmRmICU+JQ0KICBncm91cF9ieShzZWN0b3IpICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9zYXRpc2ZhY3RvcmlvLCAgIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIG1lZGlhbmEgPSByb3VuZChtZWRpYW4ocHRqZV9zYXRpc2ZhY3RvcmlvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBkZXN2aW8gID0gcm91bmQoc2QocHRqZV9zYXRpc2ZhY3RvcmlvLCAgICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbiAgICAgICA9IG4oKQ0KICApDQpgYGANCg0KYGBge3IgaDEtbGV2ZW5lfQ0KY2F0KCItLS0gVGVzdCBkZSBMZXZlbmUgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwdGplX3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS13aWxjb3hvbn0NCmNhdCgiLS0tIFRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IChwcmluY2lwYWwpIC0tLVxuIikNCndpbGNveC50ZXN0KHB0amVfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXdlbGNofQ0KY2F0KCItLS0gVGVzdCB0IGRlIFdlbGNoIChjb21wbGVtZW50YXJpbykgLS0tXG4iKQ0KdC50ZXN0KHB0amVfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBoMS1jb2hlbnNkfQ0KY2F0KCItLS0gVGFtYcOxbyBkZWwgZWZlY3RvIChkIGRlIENvaGVuKSAtLS1cbiIpDQpjb2hlbnNfZChwdGplX3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS1ib3hwbG90LCBmaWcuY2FwPSJGaWd1cmEgNS4gQm94cGxvdCBkZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzZWfDum4gc2VjdG9yIGRlIGdlc3Rpw7NuLiJ9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCB5ID0gcHRqZV9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNykgKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgNTAwKSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJQdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNlZ8O6biBTZWN0b3IiLA0KICAgIHggICAgID0gIiIsDQogICAgeSAgICAgPSAiUHVudGFqZSBUUkkg4oCUIFNhdGlzZmFjdG9yaW8iDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCj4gKipOb3RhLioqIFRhbnRvIGVsIHRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IGNvbW8gZWwgdGVzdCBkZSBXZWxjaCBjb2luY2lkZW4gZW4gcmVjaGF6YXIgJEhfMCQgKHAgPCAwLjAwMSkuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBwcmVzZW50YW4gdW4gcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgcXVlIGxhcyBlc3RhdGFsZXMuIEVsIHRhbWHDsW8gZGVsIGVmZWN0byBlcyBtdXkgZ3JhbmRlIChkID0g4oiSMS41NyksIGxvIHF1ZSBpbmRpY2EgdW5hIGRpZmVyZW5jaWEgc3VzdGFudGl2YSB5IG5vIHNvbG8gZXN0YWTDrXN0aWNhIGVudHJlIGFtYm9zIHNlY3RvcmVzLg0KDQojIyA2LjIgSDI6IMK/RWwgw6FtYml0byBpbmZsdXllIGVuIGVsIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbz8NCg0KJCRIXzA6IFx0ZXh0e0xhIGRpc3RyaWJ1Y2nDs24gZGVsIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbyBlcyBpZ3VhbCBlbiBlc2N1ZWxhcyBydXJhbGVzIHkgdXJiYW5hcy59JCQNCiQkSF8xOiBcdGV4dHtFeGlzdGUgZGlmZXJlbmNpYSBlbiBsYSBkaXN0cmlidWNpw7NuIGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gZW50cmUgw6FtYml0b3MufSQkDQoNCmBgYHtyIGgyLWRlc2NyaXB0aXZvc30NCmRmICU+JQ0KICBncm91cF9ieShhbWJpdG8pICU+JQ0KICBzdW1tYXJpc2UoDQogICAgbWVkaWEgICA9IHJvdW5kKG1lYW4ocHRqZV9kZWJham8sICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwdGplX2RlYmFqbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHB0amVfZGViYWpvLCAgICAgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbiAgICAgICA9IG4oKQ0KICApDQpgYGANCg0KYGBge3IgaDItbGV2ZW5lfQ0KY2F0KCItLS0gVGVzdCBkZSBMZXZlbmUgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLXdlbGNofQ0KY2F0KCItLS0gVGVzdCB0IGRlIFdlbGNoIChwcmluY2lwYWwpIC0tLVxuIikNCnQudGVzdChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCmBgYA0KDQpgYGB7ciBoMi13aWxjb3hvbn0NCmNhdCgiLS0tIFRlc3QgZGUgV2lsY294b24tTWFubi1XaGl0bmV5IChjb21wbGVtZW50YXJpbykgLS0tXG4iKQ0Kd2lsY294LnRlc3QocHRqZV9kZWJham8gfiBhbWJpdG8sIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMi1jb2hlbnNkfQ0KY2F0KCItLS0gVGFtYcOxbyBkZWwgZWZlY3RvIChkIGRlIENvaGVuKSAtLS1cbiIpDQpjb2hlbnNfZChwdGplX2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLWJveHBsb3QsIGZpZy5jYXA9IkZpZ3VyYSA2LiBCb3hwbG90IGRlbCBwdW50YWplIFRSSSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIMOhbWJpdG8gZ2VvZ3LDoWZpY28uIn0NCmdncGxvdChkZiwgYWVzKHggPSBhbWJpdG8sIHkgPSBwdGplX2RlYmFqbywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjcpICsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDUwMCkpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiUHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHNlZ8O6biDDgW1iaXRvIiwNCiAgICB4ICAgICA9ICIiLA0KICAgIHkgICAgID0gIlB1bnRhamUgVFJJIOKAlCBEZWJham8gZGVsIGLDoXNpY28iDQogICkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKFdpbGNveG9uOiBwIDwgMC4wMDE7IFdlbGNoOiBwIDwgMC4wMDEpLiBMYXMgZXNjdWVsYXMgdXJiYW5hcyBwcmVzZW50YW4gdW4gcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHNpZ25pZmljYXRpdmFtZW50ZSBtYXlvciBxdWUgbGFzIHJ1cmFsZXMsIHJlc3VsdGFkbyBjb250cmFpbnR1aXRpdm8gcXVlIHB1ZWRlIGV4cGxpY2Fyc2UgcG9yIGxhIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIG1hdHLDrWN1bGEgeSBkaXZlcnNpZGFkIHNvY2lvZWNvbsOzbWljYSBlbiBjb250ZXh0b3MgdXJiYW5vcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG1vZGVyYWRvIChkID0g4oiSMC42NSkuDQoNCi0tLQ0KDQojIDcuIFBydWViYSBkZSBpbmRlcGVuZGVuY2lhICgkXGNoaV4yJCkNCg0KJCRIXzA6IFx0ZXh0e1NlY3RvciB5IMOBbWJpdG8gc29uIGluZGVwZW5kaWVudGVzLn0kJA0KJCRIXzE6IFx0ZXh0e0V4aXN0ZSBhc29jaWFjacOzbiBlbnRyZSBTZWN0b3IgeSDDgW1iaXRvLn0kJA0KDQpgYGB7ciBjaGkyLXRhYmxhfQ0KdGFibGFfY29udCA8LSB0YWJsZShkZiRzZWN0b3IsIGRmJGFtYml0bykNCnByaW50KHRhYmxhX2NvbnQpDQoNCmNhdCgiXG4tLS0gUHJvcG9yY2lvbmVzIHBvciBmaWxhIC0tLVxuIikNCnByaW50KHJvdW5kKHByb3AudGFibGUodGFibGFfY29udCwgbWFyZ2luID0gMSkgKiAxMDAsIDEpKQ0KYGBgDQoNCmBgYHtyIGNoaTItdGVzdH0NCmNoaV90ZXN0IDwtIGNoaXNxLnRlc3QodGFibGFfY29udCkNCnByaW50KGNoaV90ZXN0KQ0KDQpjYXQoIlxuLS0tIEZyZWN1ZW5jaWFzIGVzcGVyYWRhcyAtLS1cbiIpDQpwcmludChyb3VuZChjaGlfdGVzdCRleHBlY3RlZCwgMSkpDQpgYGANCg0KYGBge3IgY2hpMi1jcmFtZXJ9DQpjYXQoIi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKFYgZGUgQ3JhbcOpcikgLS0tXG4iKQ0KY3JhbWVyX3YodGFibGFfY29udCkNCmBgYA0KDQpgYGB7ciBjaGkyLWdyYWZpY29zLCBmaWcuY2FwPSJGaWd1cmEgNy4gRnJlY3VlbmNpYSB5IHByb3BvcmNpw7NuIGRlIMOBbWJpdG8gc2Vnw7puIFNlY3Rvci4ifQ0KZGZfY29udCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxhX2NvbnQpDQpuYW1lcyhkZl9jb250KSA8LSBjKCJTZWN0b3IiLCAiQW1iaXRvIiwgIkZyZWN1ZW5jaWEiKQ0KDQpwYzEgPC0gZ2dwbG90KGRmX2NvbnQsIGFlcyh4ID0gU2VjdG9yLCB5ID0gRnJlY3VlbmNpYSwgZmlsbCA9IEFtYml0bykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IEZyZWN1ZW5jaWEpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGV4cGFuc2lvbihtdWx0ID0gYygwLCAwLjE1KSkpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRnJlY3VlbmNpYSBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiIiwgeSA9ICJGcmVjdWVuY2lhIiwgZmlsbCA9ICLDgW1iaXRvIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGMyIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwNCiAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChGcmVjdWVuY2lhIC8gYXZlKEZyZWN1ZW5jaWEsIFNlY3RvciwgRlVOID0gc3VtKSAqIDEwMCwgMSksICIlIikpLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9maWxsKHZqdXN0ID0gMC41KSwNCiAgICAgICAgICAgIHNpemUgPSAzLjUsIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yIiwNCiAgICAgICB4ID0gIiIsIHkgPSAiUHJvcG9yY2nDs24iLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQocGMxLCBwYzIsIG5jb2wgPSAyKQ0KYGBgDQoNCj4gKipOb3RhLioqIFNlIHJlY2hhemEgJEhfMCQgKCRcY2hpXjIkID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlIHNlY3RvciB5IMOhbWJpdG8gKFYgZGUgQ3JhbcOpciA9IDAuNDcpLiBMYXMgZXNjdWVsYXMgZXN0YXRhbGVzIHNvbiBwcmVkb21pbmFudGVtZW50ZSBydXJhbGVzICg0NSUpLCBtaWVudHJhcyBxdWUgbGFzIHByaXZhZGFzIHNvbiBtYXlvcml0YXJpYW1lbnRlIHVyYmFuYXMgKDg5JSkuIEVzdGEgYXNvY2lhY2nDs24gZXMgcmVsZXZhbnRlIGFsIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zIGFudGVyaW9yZXMsIHlhIHF1ZSBzZWN0b3IgeSDDoW1iaXRvIG5vIHNvbiB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMsIGxvIHF1ZSBkZWJlIGNvbnNpZGVyYXJzZSBhbCBjb21wYXJhciBncnVwb3MuDQoNCi0tLQ0KDQojIDguIENvbmNsdXNpb25lcw0KDQpFbCBhbsOhbGlzaXMgZGUgbG9zIGRhdG9zIGRlbCBvcGVyYXRpdm8gQVBSRU5ERVIgMjAyNCBwYXJhIG1hdGVtw6F0aWNhIGVuIGVsIG5pdmVsIHNlY3VuZGFyaW8gcGVybWl0ZSBleHRyYWVyIGxhcyBzaWd1aWVudGVzIGNvbmNsdXNpb25lczoNCg0KKiphLiBTb2JyZSBsYSBjYWxpZGFkIGRlIGxvcyBkYXRvczoqKiBFbCBkYXRhc2V0IG9yaWdpbmFsIGNvbnRpZW5lIHJlZ2lzdHJvcyBjb24gdmFsb3JlcyBgTkFgIHF1ZSBmdWVyb24gZWxpbWluYWRvcywgY29uc2VydmFuZG8gMTA4NyBvYnNlcnZhY2lvbmVzIHbDoWxpZGFzIHBhcmEgZWwgYW7DoWxpc2lzLiBMYXMgdmFyaWFibGVzIHJlcHJlc2VudGFuIHB1bnRhamVzIFRSSSAoZXNjYWxhIGNvbiBtZWRpYSA1MDAgeSBERSAxMDApLCBubyBwb3JjZW50YWplcy4NCg0KKipiLiBTb2JyZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvOioqIE5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwgZXZpZGVuY2lhZG8gcG9yIGxvcyBRUS1wbG90cyB5IGVsIHRlc3QgZGUgTGlsbGllZm9ycy4gQW1iYXMgZGlzdHJpYnVjaW9uZXMgcHJlc2VudGFuIHNlc2dvIHBvc2l0aXZvLCBjb24gZ3JhbiBoZXRlcm9nZW5laWRhZCBlbnRyZSBlc2N1ZWxhcy4NCg0KKipjLiBTb2JyZSBsYSByZWxhY2nDs24gZW50cmUgdmFyaWFibGVzIG51bcOpcmljYXM6KiogU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgZWwgcHVudGFqZSBUUkkgRGViYWpvIGRlbCBiw6FzaWNvIHkgZWwgcHVudGFqZSBUUkkgU2F0aXNmYWN0b3JpbyAociA9IDAuMjMsIHAgPCAwLjAwMSkuIExhIGJhamEgbWFnbml0dWQgaW5kaWNhIHF1ZSBhbWJhcyB2YXJpYWJsZXMgbm8gc29uIGNvbXBsZW1lbnRhcmlhcyBkaXJlY3RhcyB5IHF1ZSBvdHJvcyBmYWN0b3JlcyBleHBsaWNhbiBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvIGVzY29sYXIuDQoNCioqZC4gSDEg4oCUIFNlY3RvciB5IHB1bnRhamUgU2F0aXNmYWN0b3JpbzoqKiBTZSByZWNoYXphICRIXzAkIChXaWxjb3hvbjogcCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHByaXZhZGFzIHByZXNlbnRhbiB1biBwdW50YWplIFRSSSBTYXRpc2ZhY3RvcmlvIHNpZ25pZmljYXRpdmFtZW50ZSBtYXlvciBxdWUgbGFzIGVzdGF0YWxlcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG11eSBncmFuZGUgKGQgPSDiiJIxLjU3KSwgaW5kaWNhbmRvIHF1ZSBsYSBkaWZlcmVuY2lhIGVudHJlIHNlY3RvcmVzIGVzIHN1c3RhbnRpdmEuDQoNCioqZS4gSDIg4oCUIMOBbWJpdG8geSBwdW50YWplIERlYmFqbyBkZWwgYsOhc2ljbzoqKiBTZSByZWNoYXphICRIXzAkIChXZWxjaDogcCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHVyYmFuYXMgcHJlc2VudGFuIHVuIHB1bnRhamUgVFJJIERlYmFqbyBkZWwgYsOhc2ljbyBtYXlvciBxdWUgbGFzIHJ1cmFsZXMsIHJlc3VsdGFkbyBjb250cmFpbnR1aXRpdm8gcXVlIHB1ZWRlIGV4cGxpY2Fyc2UgcG9yIGxhIG1heW9yIGNvbmNlbnRyYWNpw7NuIGRlIG1hdHLDrWN1bGEgeSBkaXZlcnNpZGFkIHNvY2lvZWNvbsOzbWljYSBlbiBjb250ZXh0b3MgZGUgdnVsbmVyYWJpbGlkYWQgc29jaWFsIGVuIHpvbmFzIHVyYmFuYXMuIEVsIHRhbWHDsW8gZGVsIGVmZWN0byBlcyBtb2RlcmFkbyAoZCA9IOKIkjAuNjUpLg0KDQoqKmYuICRcY2hpXjIkIOKAlCBBc29jaWFjacOzbiBlbnRyZSBTZWN0b3IgeSDDgW1iaXRvOioqIFNlIHJlY2hhemEgJEhfMCQgKCRcY2hpXjIkID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlIHNlY3RvciB5IMOhbWJpdG8gKFYgZGUgQ3JhbcOpciA9IDAuNDcpLiBFc3RhIGFzb2NpYWNpw7NuIGVzIHJlbGV2YW50ZSBhbCBpbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBhbnRlcmlvcmVzLCB5YSBxdWUgc2VjdG9yIHkgw6FtYml0byBubyBzb24gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLg0KDQotLS0NCg0KIyA5LiBSZWZlcmVuY2lhcw0KDQpEZXZvcmUsIEouIEwuICgyMDA4KS4gKlByb2JhYmlsaWRhZCB5IGVzdGFkw61zdGljYSBwYXJhIGluZ2VuaWVyw61hIHkgY2llbmNpYXMqICg3bWEgZWQuKS4gQ2VuZ2FnZSBMZWFybmluZy4NCg0KUMOpcmV6LCBTLiBOLiAoMjAyNikuICpGdW5kYW1lbnRvcyBkZSBFc3RhZMOtc3RpY2EqIFtEaWFwb3NpdGl2YXNdLiBFc3BlY2lhbGl6YWNpw7NuIGVuIENpZW5jaWEgZGUgRGF0b3MsIFVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlbCBPZXN0ZS4NCg0KTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24gQXJnZW50aW5hICgyMDI0KS4gKk9wZXJhdGl2byBOYWNpb25hbCBkZSBFdmFsdWFjacOzbiBBUFJFTkRFUiAyMDI0IOKAlCBSZXN1bHRhZG9zIE1hdGVtw6F0aWNhKi4gQnVlbm9zIEFpcmVzOiBNaW5pc3RlcmlvIGRlIEVkdWNhY2nDs24gZGUgbGEgTmFjacOzbi4NCg0KLS0tDQoNCiMgMTAuIEFuZXhvDQoNCiMjIEFuZXhvIEEg4oCUIEPDs2RpZ28geSBhbsOhbGlzaXMgaW50ZXJhY3Rpdm8NCg0KRWwgY8OzZGlnbyBSIGNvbXBsZXRvIHV0aWxpemFkbyBlbiBlc3RlIHRyYWJham8sIGp1bnRvIGNvbiBsb3MgcmVzdWx0YWRvcyB5IHZpc3VhbGl6YWNpb25lcyBlbiBmb3JtYXRvIGludGVyYWN0aXZvLCBzZSBlbmN1ZW50cmEgZGlzcG9uaWJsZSBlbjoNCg0Kw4FybmljYSwgRS4gKDIwMjYpLiAqQW7DoWxpc2lzIEFQUkVOREVSIDIwMjQg4oCUIE1hdGVtw6F0aWNhKiBbUk1hcmtkb3duIHB1YmxpY2FkbyBlbiBSUHVic10uIGh0dHBzOi8vcnB1YnMuY29tL2VkdWFyZG9hcm5pY2EvdHAtYXByZW5kZXIyMDI0DQo=