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 clasificado en cuatro niveles:
Por debajo del básico, Básico, Satisfactorio
y Avanzado.
Variables seleccionadas:
- Numéricas:
pct_debajo (% por debajo
del nivel básico) y pct_satisfactorio (% con nivel
satisfactorio)
- Cualitativas:
sector (Estatal /
Privado) y ambito (Rural / Urbano)
1. Carga y limpieza de datos
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(
pct_debajo = mdesemp_Por_debajo_del_nivel_básico,
pct_satisfactorio = mdesemp_Satisfactorio
) %>%
mutate(
pct_debajo = as.numeric(pct_debajo),
pct_satisfactorio = as.numeric(pct_satisfactorio),
sector = as.factor(sector),
ambito = as.factor(ambito)
) %>%
filter(pct_debajo <= 100, pct_satisfactorio <= 100)
cat("Filas originales: ", nrow(df_raw), "\n")
## Filas originales: 1175
cat("Filas después del filtro: ", nrow(df), "\n")
## Filas después del filtro: 564
cat("Filas eliminadas: ", nrow(df_raw) - nrow(df), "\n")
## Filas eliminadas: 611
Nota: Se eliminaron los registros con valores
superiores a 100%, considerados errores de carga en el dataset original.
Esta decisión redujo el dataset en 611 observaciones y constituye una
limitación del análisis.
2. Análisis Exploratorio
2.1 Estadísticos descriptivos
summary(df[, c("pct_debajo", "pct_satisfactorio")])
## pct_debajo pct_satisfactorio
## Min. : 2.081 Min. : 1.000
## 1st Qu.:23.887 1st Qu.: 3.236
## Median :40.043 Median : 7.085
## Mean :44.906 Mean :13.684
## 3rd Qu.:64.555 3rd Qu.:17.983
## Max. :99.975 Max. :99.315
2.2 Distribución de variables numéricas
h1 <- ggplot(df, aes(x = pct_debajo)) +
geom_histogram(fill = "#E74C3C", color = "white", bins = 30) +
theme_bw() +
labs(title = "Distribución del % por debajo del nivel básico",
x = "Porcentaje de estudiantes (%)", y = "Frecuencia") +
theme(plot.title = element_text(hjust = 0.5))
h2 <- ggplot(df, aes(x = pct_satisfactorio)) +
geom_histogram(fill = "#2ECC71", color = "white", bins = 30) +
theme_bw() +
labs(title = "Distribución del % con nivel satisfactorio",
x = "Porcentaje de estudiantes (%)", y = "Frecuencia") +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(h1, h2, ncol = 2)

Ambas distribuciones presentan un marcado sesgo positivo, con la
mayor concentración de escuelas en valores bajos de % satisfactorio y
una distribución más uniforme del % debajo del básico.
2.3 Verificación de normalidad (QQplots)
par(mfrow = c(1, 2))
qqnorm(df$pct_debajo,
main = "QQplot — % Debajo del básico",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, 100))
qqline(df$pct_debajo, col = "red")
qqnorm(df$pct_satisfactorio,
main = "QQplot — % Satisfactorio",
xlab = "Cuantiles teóricos",
ylab = "Cuantiles de la muestra",
ylim = c(0, 100))
qqline(df$pct_satisfactorio, col = "red")

par(mfrow = c(1, 1))
Los QQplots confirman la no normalidad de ambas
variables. El % debajo del básico presenta colas pesadas, mientras que
el % satisfactorio muestra un sesgo positivo marcado. Estos hallazgos
justifican el uso del test de Wilcoxon-Mann-Whitney como prueba
principal de comparación.
2.4 Variables cualitativas
cat("=== FRECUENCIAS SECTOR ===\n")
## === FRECUENCIAS SECTOR ===
print(table(df$sector))
##
## Estatal Privado
## 420 144
print(round(prop.table(table(df$sector)) * 100, 1))
##
## Estatal Privado
## 74.5 25.5
cat("\n=== FRECUENCIAS ÁMBITO ===\n")
##
## === FRECUENCIAS ÁMBITO ===
print(table(df$ambito))
##
## Rural Urbano
## 332 232
print(round(prop.table(table(df$ambito)) * 100, 1))
##
## Rural Urbano
## 58.9 41.1
b1 <- ggplot(df, aes(x = sector, fill = sector)) +
geom_bar(color = "white", alpha = 0.85, width = 0.4) +
geom_text(stat = "count", aes(label = after_stat(count)),
vjust = -0.5, size = 3.5) +
scale_fill_manual(values = c("#5DADE2", "#E59866")) +
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 = after_stat(count)),
vjust = -0.5, size = 3.5) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
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)

El dataset presenta un desbalance notable: 74% de escuelas
estatales y 59% de escuelas rurales, lo que
debe considerarse al interpretar los resultados.
3. Relación entre variables numéricas
3.1 Diagrama de dispersión
ggplot(df, aes(x = pct_debajo, y = pct_satisfactorio)) +
geom_point(alpha = 0.4, size = 1.5) +
geom_smooth(method = "lm", se = TRUE, color = "red") +
theme_bw() +
labs(title = "% Debajo del básico vs. % Satisfactorio",
x = "% Debajo del básico", y = "% Satisfactorio") +
theme(plot.title = element_text(hjust = 0.5))

3.2 Correlación de Pearson
cor.test(df$pct_debajo, df$pct_satisfactorio, method = "pearson")
##
## Pearson's product-moment correlation
##
## data: df$pct_debajo and df$pct_satisfactorio
## t = 5.6587, df = 562, p-value = 2.432e-08
## alternative hypothesis: true correlation is not equal to 0
## 95 percent confidence interval:
## 0.1525386 0.3088177
## sample estimates:
## cor
## 0.232176
Se encontró una correlación de Pearson positiva débil (r = 0.23, p
< 0.001). Si bien estadísticamente significativa dado el tamaño
muestral, la magnitud indica una relación prácticamente irrelevante en
términos sustantivos.
4. Comparación de medias
4.1 H1: ¿El sector influye en el % Satisfactorio?
H₀: La distribución del % satisfactorio es igual en
escuelas estatales y privadas
H₁: Existe diferencia en la distribución del %
satisfactorio entre sectores
df %>%
group_by(sector) %>%
summarise(
media = round(mean(pct_satisfactorio, na.rm = TRUE), 2),
mediana = round(median(pct_satisfactorio, na.rm = TRUE), 2),
desvio = round(sd(pct_satisfactorio, na.rm = TRUE), 2),
n = n()
)
cat("--- Test de Levene (homogeneidad de varianzas) ---\n")
## --- Test de Levene (homogeneidad de varianzas) ---
leveneTest(pct_satisfactorio ~ sector, data = df)
cat("--- Test de Wilcoxon - Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon - Mann-Whitney (principal) ---
wilcox.test(pct_satisfactorio ~ sector, data = df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: pct_satisfactorio by sector
## W = 9552, p-value < 2.2e-16
## alternative hypothesis: true location shift is not equal to 0
cat("\n--- Test t de Welch (complementario, válido por TCL con n grande) ---\n")
##
## --- Test t de Welch (complementario, válido por TCL con n grande) ---
t.test(pct_satisfactorio ~ sector, data = df, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: pct_satisfactorio by sector
## t = -11.289, df = 160.08, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group Estatal and group Privado is not equal to 0
## 95 percent confidence interval:
## -25.08332 -17.61390
## sample estimates:
## mean in group Estatal mean in group Privado
## 8.233259 29.581869
cat("\n--- Tamaño del efecto (Cohen's d) ---\n")
##
## --- Tamaño del efecto (Cohen's d) ---
cohens_d(pct_satisfactorio ~ sector, data = df)
ggplot(df, aes(x = sector, y = pct_satisfactorio, fill = sector)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
scale_fill_manual(values = c("#5DADE2", "#E59866")) +
theme_bw() +
labs(title = "% Satisfactorio según Sector", x = "", y = "% Satisfactorio") +
theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

Tanto el test de Wilcoxon-Mann-Whitney como el test de Welch
coinciden en rechazar H₀ (p < 0.001). Las escuelas
privadas presentan una mediana de % satisfactorio de 23.5% frente al
5.3% de las estatales. El tamaño del efecto es muy grande (d = -1.57),
lo que indica que la diferencia es sustantiva y no solo estadística.
4.2 H2: ¿El ámbito influye en el % Debajo del básico?
H₀: La distribución del % debajo del básico es igual
en escuelas rurales y urbanas
H₁: Existe diferencia en la distribución del % debajo
del básico entre ámbitos
df %>%
group_by(ambito) %>%
summarise(
media = round(mean(pct_debajo, na.rm = TRUE), 2),
mediana = round(median(pct_debajo, na.rm = TRUE), 2),
desvio = round(sd(pct_debajo, na.rm = TRUE), 2),
n = n()
)
cat("--- Test de Levene (homogeneidad de varianzas) ---\n")
## --- Test de Levene (homogeneidad de varianzas) ---
leveneTest(pct_debajo ~ ambito, data = df)
cat("--- Test de Wilcoxon - Mann-Whitney (principal) ---\n")
## --- Test de Wilcoxon - Mann-Whitney (principal) ---
wilcox.test(pct_debajo ~ ambito, data = df)
##
## Wilcoxon rank sum test with continuity correction
##
## data: pct_debajo by ambito
## W = 24070, p-value = 3.365e-14
## alternative hypothesis: true location shift is not equal to 0
cat("\n--- Test t de Welch (complementario, válido por TCL con n grande) ---\n")
##
## --- Test t de Welch (complementario, válido por TCL con n grande) ---
t.test(pct_debajo ~ ambito, data = df, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: pct_debajo by ambito
## t = -7.6159, df = 507.62, p-value = 1.29e-13
## alternative hypothesis: true difference in means between group Rural and group Urbano is not equal to 0
## 95 percent confidence interval:
## -19.98313 -11.78737
## sample estimates:
## mean in group Rural mean in group Urbano
## 38.37150 54.25675
cat("\n--- Tamaño del efecto (Cohen's d) ---\n")
##
## --- Tamaño del efecto (Cohen's d) ---
cohens_d(pct_debajo ~ ambito, data = df)
ggplot(df, aes(x = ambito, y = pct_debajo, fill = ambito)) +
geom_boxplot(outlier.color = "red", alpha = 0.7) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
theme_bw() +
labs(title = "% Debajo del básico según Ámbito", x = "", y = "% Debajo del básico") +
theme(legend.position = "none", plot.title = element_text(hjust = 0.5))

5. Prueba de independencia (Chi²)
H₀: Sector y Ámbito son independientes
H₁: Existe asociación entre Sector y Ámbito
tabla_cont <- table(df$sector, df$ambito)
print(tabla_cont)
##
## Rural Urbano
## Estatal 305 115
## Privado 27 117
cat("\n--- Proporciones por fila ---\n")
##
## --- Proporciones por fila ---
print(round(prop.table(tabla_cont, margin = 1) * 100, 1))
##
## Rural Urbano
## Estatal 72.6 27.4
## Privado 18.8 81.2
chi_test <- chisq.test(tabla_cont)
print(chi_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabla_cont
## X-squared = 126.3, df = 1, p-value < 2.2e-16
cat("\n--- Frecuencias esperadas ---\n")
##
## --- Frecuencias esperadas ---
print(round(chi_test$expected, 1))
##
## Rural Urbano
## Estatal 247.2 172.8
## Privado 84.8 59.2
if (any(chi_test$expected < 5)) {
cat("\nAlguna celda tiene frecuencia esperada < 5. Simulación de p-valor:\n")
print(chisq.test(tabla_cont, simulate.p.value = TRUE))
}
cat("\n--- Tamaño del efecto (V de Cramér) ---\n")
##
## --- Tamaño del efecto (V de Cramér) ---
cramer_v(tabla_cont)
## [1] 0.473213
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")) +
theme_bw() +
labs(title = "Frecuencia de Ámbito según Sector",
x = "Sector", 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) +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("#58D68D", "#A569BD")) +
theme_bw() +
labs(title = "Proporción de Ámbito según Sector",
x = "Sector", y = "Proporción", fill = "Ámbito") +
theme(plot.title = element_text(hjust = 0.5))
plot_grid(pc1, pc2, ncol = 2)

6. Conclusiones
El análisis de los datos del operativo APRENDER 2024 para Matemática
en el nivel secundario permite extraer las siguientes conclusiones:
Sobre la calidad de los datos El dataset original
presentó un 52% de registros con valores imposibles (superiores a 100%),
lo que representa una limitación importante y sugiere problemas en el
proceso de carga o codificación de los datos originales. El análisis se
realizó sobre las 564 observaciones válidas restantes.
Sobre la distribución del desempeño Ninguna de las
variables analizadas sigue una distribución normal, evidenciado por los
QQplots y la forma de los histogramas. El % por debajo del nivel básico
presenta una distribución aproximadamente uniforme entre 0 y 100%, lo
que refleja una gran heterogeneidad entre escuelas. El % satisfactorio
muestra un marcado sesgo positivo, con la mayoría de las escuelas
concentradas en valores bajos (mediana: 7%).
Sobre la relación entre variables numéricas Se
encontró una correlación de Pearson positiva débil entre el % debajo del
básico y el % 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.
H1 — Sector y % Satisfactorio Se rechaza H₀
(Wilcoxon: p < 0.001). Las escuelas privadas presentan una mediana de
% satisfactorio significativamente mayor (23.5%) que las estatales
(5.3%). El tamaño del efecto es muy grande (d = -1.57), indicando que la
diferencia entre sectores es sustantiva y no meramente estadística. Las
escuelas privadas muestran entre 17.6 y 25.1 puntos porcentuales más de
alumnos en nivel satisfactorio (IC 95%, Welch).
H2 — Ámbito y % Debajo del básico Se rechaza H₀
(Wilcoxon: p < 0.001). Las escuelas urbanas presentan una mediana de
% debajo del básico mayor (54.2%) que las rurales (31.8%), resultado
contraintuitivo que puede explicarse por la mayor concentración de
matrícula en contextos de vulnerabilidad social en zonas urbanas. El
tamaño del efecto es moderado (d = -0.65).
Chi² — Asociación entre Sector y Ámbito Se rechaza
H₀ (χ² = 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 (72.6%) mientras que las privadas son
mayoritariamente urbanas (81.2%). Esta asociación es relevante al
interpretar los resultados anteriores, ya que sector y ámbito no son
variables independientes.
Referencias
- Ministerio de Educación de la Nación Argentina (2024). Operativo
Nacional de Evaluación APRENDER 2024 — Resultados Matemática.
Buenos Aires: DiNIECE.
LS0tDQp0aXRsZTogJ0Z1bmRhbWVudG9zIGRlIEVzdGFkw61zdGljYTogQVBSRU5ERVIgMjAyNCAtIE1hdGVtw6F0aWNhJw0KYXV0aG9yOiB8DQogIENhc3RlbGxpIFJvbWluYSB8IENhcnJhemFuYSBKZXNpY2EgfCDDgXJuaWNhIEVkdWFyZG8NCmRhdGU6ICJFc3BlY2lhbGl6YWNpw7NuIGVuIENpZW5jaWEgZGUgRGF0b3MgLSBVTk8gfCBDb2hvcnRlIDIwMjYiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgdGhlbWU6IHVuaXRlZA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgcGRmX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBlY2hvICAgID0gVFJVRSwNCiAgbWVzc2FnZSA9IEZBTFNFLA0KICB3YXJuaW5nID0gRkFMU0UsDQogIGZpZy5hbGlnbiA9ICJjZW50ZXIiLA0KICBmaWcud2lkdGggPSA5LA0KICBmaWcuaGVpZ2h0ID0gNQ0KKQ0KDQpzZXR3ZCgiQzovVXNlcnMvdXNlci9EZXNrdG9wL0VzcC4gZW4gQ2llbmNpYSBkZSBEYXRvcy80LiBlc3RhZGlzdGljYS8iKQ0KDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkocnN0YXRpeCkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShlZmZlY3RzaXplKQ0KYGBgDQoNCjxjZW50ZXI+DQogIDxpbWcgc3JjPSJlc2N1ZG8ucG5nIiBhbHQ9IlVuaXZlcnNpZGFkIE5hY2lvbmFsIGRlbCBPZXN0ZSIgd2lkdGg9IjI1MHB4Ij4NCjwvY2VudGVyPg0KDQotLS0NCg0KIyMgSW50cm9kdWNjacOzbg0KDQpFc3RlIHRyYWJham8gcHLDoWN0aWNvIGFuYWxpemEgbG9zIHJlc3VsdGFkb3MgZGVsIG9wZXJhdGl2byAqKkFQUkVOREVSIDIwMjQqKiBlbiBlbCDDoXJlYSBkZSBNYXRlbcOhdGljYSBwYXJhIGVzdHVkaWFudGVzIGRlIDV0by82dG8gYcOxbyBkZSBsYSBlc2N1ZWxhIHNlY3VuZGFyaWEuIEVsIGRhdGFzZXQgY29udGllbmUgaW5mb3JtYWNpw7NuIHNvYnJlIGVsIGRlc2VtcGXDsW8gZGUgbG9zIGVzdHVkaWFudGVzIGNsYXNpZmljYWRvIGVuIGN1YXRybyBuaXZlbGVzOiAqUG9yIGRlYmFqbyBkZWwgYsOhc2ljbyosICpCw6FzaWNvKiwgKlNhdGlzZmFjdG9yaW8qIHkgKkF2YW56YWRvKi4NCg0KKipWYXJpYWJsZXMgc2VsZWNjaW9uYWRhczoqKg0KDQotICoqTnVtw6lyaWNhczoqKiBgcGN0X2RlYmFqb2AgKCUgcG9yIGRlYmFqbyBkZWwgbml2ZWwgYsOhc2ljbykgeSBgcGN0X3NhdGlzZmFjdG9yaW9gICglIGNvbiBuaXZlbCBzYXRpc2ZhY3RvcmlvKQ0KLSAqKkN1YWxpdGF0aXZhczoqKiBgc2VjdG9yYCAoRXN0YXRhbCAvIFByaXZhZG8pIHkgYGFtYml0b2AgKFJ1cmFsIC8gVXJiYW5vKQ0KDQotLS0NCg0KIyMgMS4gQ2FyZ2EgeSBsaW1waWV6YSBkZSBkYXRvcw0KDQpgYGB7ciBjYXJnYX0NCmRmX3JhdyA8LSByZWFkX2V4Y2VsKCJhcHJlbmRlcjIwMjRfbWF0ZW1hdGljYS54bHN4IikNCmNhdCgiRGltZW5zaW9uZXMgb3JpZ2luYWxlczoiLCBkaW0oZGZfcmF3KSwgIlxuIikNCmBgYA0KDQpgYGB7ciBsaW1waWV6YX0NCmRmIDwtIGRmX3JhdyAlPiUNCiAgc2VsZWN0KA0KICAgIHNlY3RvciwgYW1iaXRvLA0KICAgIG1kZXNlbXBfUG9yX2RlYmFqb19kZWxfbml2ZWxfYsOhc2ljbywNCiAgICBtZGVzZW1wX1NhdGlzZmFjdG9yaW8NCiAgKSAlPiUNCiAgcmVuYW1lKA0KICAgIHBjdF9kZWJham8gICAgICAgID0gbWRlc2VtcF9Qb3JfZGViYWpvX2RlbF9uaXZlbF9iw6FzaWNvLA0KICAgIHBjdF9zYXRpc2ZhY3RvcmlvID0gbWRlc2VtcF9TYXRpc2ZhY3RvcmlvDQogICkgJT4lDQogIG11dGF0ZSgNCiAgICBwY3RfZGViYWpvICAgICAgICA9IGFzLm51bWVyaWMocGN0X2RlYmFqbyksDQogICAgcGN0X3NhdGlzZmFjdG9yaW8gPSBhcy5udW1lcmljKHBjdF9zYXRpc2ZhY3RvcmlvKSwNCiAgICBzZWN0b3IgPSBhcy5mYWN0b3Ioc2VjdG9yKSwNCiAgICBhbWJpdG8gPSBhcy5mYWN0b3IoYW1iaXRvKQ0KICApICU+JQ0KICBmaWx0ZXIocGN0X2RlYmFqbyA8PSAxMDAsIHBjdF9zYXRpc2ZhY3RvcmlvIDw9IDEwMCkNCg0KY2F0KCJGaWxhcyBvcmlnaW5hbGVzOiAgICAgICAgICIsIG5yb3coZGZfcmF3KSwgIlxuIikNCmNhdCgiRmlsYXMgZGVzcHXDqXMgZGVsIGZpbHRybzogIiwgbnJvdyhkZiksICJcbiIpDQpjYXQoIkZpbGFzIGVsaW1pbmFkYXM6ICAgICAgICAgIiwgbnJvdyhkZl9yYXcpIC0gbnJvdyhkZiksICJcbiIpDQpgYGANCg0KPiAqKk5vdGE6KiogU2UgZWxpbWluYXJvbiBsb3MgcmVnaXN0cm9zIGNvbiB2YWxvcmVzIHN1cGVyaW9yZXMgYSAxMDAlLCBjb25zaWRlcmFkb3MgZXJyb3JlcyBkZSBjYXJnYSBlbiBlbCBkYXRhc2V0IG9yaWdpbmFsLiBFc3RhIGRlY2lzacOzbiByZWR1am8gZWwgZGF0YXNldCBlbiBgciBucm93KGRmX3JhdykgLSBucm93KGRmKWAgb2JzZXJ2YWNpb25lcyB5IGNvbnN0aXR1eWUgdW5hIGxpbWl0YWNpw7NuIGRlbCBhbsOhbGlzaXMuDQoNCi0tLQ0KDQojIyAyLiBBbsOhbGlzaXMgRXhwbG9yYXRvcmlvDQoNCiMjIyAyLjEgRXN0YWTDrXN0aWNvcyBkZXNjcmlwdGl2b3MNCg0KYGBge3IgZGVzY3JpcHRpdm9zfQ0Kc3VtbWFyeShkZlssIGMoInBjdF9kZWJham8iLCAicGN0X3NhdGlzZmFjdG9yaW8iKV0pDQpgYGANCg0KIyMjIDIuMiBEaXN0cmlidWNpw7NuIGRlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCmBgYHtyIGhpc3RvZ3JhbWFzfQ0KaDEgPC0gZ2dwbG90KGRmLCBhZXMoeCA9IHBjdF9kZWJham8pKSArDQogIGdlb21faGlzdG9ncmFtKGZpbGwgPSAiI0U3NEMzQyIsIGNvbG9yID0gIndoaXRlIiwgYmlucyA9IDMwKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGVsICUgcG9yIGRlYmFqbyBkZWwgbml2ZWwgYsOhc2ljbyIsDQogICAgICAgeCA9ICJQb3JjZW50YWplIGRlIGVzdHVkaWFudGVzICglKSIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmgyIDwtIGdncGxvdChkZiwgYWVzKHggPSBwY3Rfc2F0aXNmYWN0b3JpbykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbCA9ICIjMkVDQzcxIiwgY29sb3IgPSAid2hpdGUiLCBiaW5zID0gMzApICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZWwgJSBjb24gbml2ZWwgc2F0aXNmYWN0b3JpbyIsDQogICAgICAgeCA9ICJQb3JjZW50YWplIGRlIGVzdHVkaWFudGVzICglKSIsIHkgPSAiRnJlY3VlbmNpYSIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChoMSwgaDIsIG5jb2wgPSAyKQ0KYGBgDQoNCkFtYmFzIGRpc3RyaWJ1Y2lvbmVzIHByZXNlbnRhbiB1biBtYXJjYWRvIHNlc2dvIHBvc2l0aXZvLCBjb24gbGEgbWF5b3IgY29uY2VudHJhY2nDs24gZGUgZXNjdWVsYXMgZW4gdmFsb3JlcyBiYWpvcyBkZSAlIHNhdGlzZmFjdG9yaW8geSB1bmEgZGlzdHJpYnVjacOzbiBtw6FzIHVuaWZvcm1lIGRlbCAlIGRlYmFqbyBkZWwgYsOhc2ljby4NCg0KIyMjIDIuMyBWZXJpZmljYWNpw7NuIGRlIG5vcm1hbGlkYWQgKFFRcGxvdHMpDQoNCmBgYHtyIHFxcGxvdHMsIGZpZy5oZWlnaHQ9NX0NCnBhcihtZnJvdyA9IGMoMSwgMikpDQoNCnFxbm9ybShkZiRwY3RfZGViYWpvLA0KICAgICAgIG1haW4gPSAiUVFwbG90IOKAlCAlIERlYmFqbyBkZWwgYsOhc2ljbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCAxMDApKQ0KcXFsaW5lKGRmJHBjdF9kZWJham8sIGNvbCA9ICJyZWQiKQ0KDQpxcW5vcm0oZGYkcGN0X3NhdGlzZmFjdG9yaW8sDQogICAgICAgbWFpbiA9ICJRUXBsb3Qg4oCUICUgU2F0aXNmYWN0b3JpbyIsDQogICAgICAgeGxhYiA9ICJDdWFudGlsZXMgdGXDs3JpY29zIiwNCiAgICAgICB5bGFiID0gIkN1YW50aWxlcyBkZSBsYSBtdWVzdHJhIiwNCiAgICAgICB5bGltID0gYygwLCAxMDApKQ0KcXFsaW5lKGRmJHBjdF9zYXRpc2ZhY3RvcmlvLCBjb2wgPSAicmVkIikNCg0KcGFyKG1mcm93ID0gYygxLCAxKSkNCmBgYA0KDQpMb3MgUVFwbG90cyBjb25maXJtYW4gbGEgKipubyBub3JtYWxpZGFkKiogZGUgYW1iYXMgdmFyaWFibGVzLiBFbCAlIGRlYmFqbyBkZWwgYsOhc2ljbyBwcmVzZW50YSBjb2xhcyBwZXNhZGFzLCBtaWVudHJhcyBxdWUgZWwgJSBzYXRpc2ZhY3RvcmlvIG11ZXN0cmEgdW4gc2VzZ28gcG9zaXRpdm8gbWFyY2Fkby4gRXN0b3MgaGFsbGF6Z29zIGp1c3RpZmljYW4gZWwgdXNvIGRlbCB0ZXN0IGRlIFdpbGNveG9uLU1hbm4tV2hpdG5leSBjb21vIHBydWViYSBwcmluY2lwYWwgZGUgY29tcGFyYWNpw7NuLg0KDQojIyMgMi40IFZhcmlhYmxlcyBjdWFsaXRhdGl2YXMNCg0KYGBge3IgYmFycmFzfQ0KY2F0KCI9PT0gRlJFQ1VFTkNJQVMgU0VDVE9SID09PVxuIikNCnByaW50KHRhYmxlKGRmJHNlY3RvcikpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJHNlY3RvcikpICogMTAwLCAxKSkNCg0KY2F0KCJcbj09PSBGUkVDVUVOQ0lBUyDDgU1CSVRPID09PVxuIikNCnByaW50KHRhYmxlKGRmJGFtYml0bykpDQpwcmludChyb3VuZChwcm9wLnRhYmxlKHRhYmxlKGRmJGFtYml0bykpICogMTAwLCAxKSkNCmBgYA0KDQpgYGB7ciBiYXJyYXMtZ3JhZmljb3N9DQpiMSA8LSBnZ3Bsb3QoZGYsIGFlcyh4ID0gc2VjdG9yLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2Jhcihjb2xvciA9ICJ3aGl0ZSIsIGFscGhhID0gMC44NSwgd2lkdGggPSAwLjQpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzVEQURFMiIsICIjRTU5ODY2IikpICsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTEpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIHBvciBTZWN0b3IiLCB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCmIyIDwtIGdncGxvdChkZiwgYWVzKHggPSBhbWJpdG8sIGZpbGwgPSBhbWJpdG8pKSArDQogIGdlb21fYmFyKGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjg1LCB3aWR0aCA9IDAuNCkgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IGFmdGVyX3N0YXQoY291bnQpKSwNCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDMuNSkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNThENjhEIiwgIiNBNTY5QkQiKSkgKw0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMSkgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gcG9yIMOBbWJpdG8iLCB4ID0gIiIsIHkgPSAiQ2FudGlkYWQgZGUgZXNjdWVsYXMiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQoNCnBsb3RfZ3JpZChiMSwgYjIsIG5jb2wgPSAyKQ0KYGBgDQoNCkVsIGRhdGFzZXQgcHJlc2VudGEgdW4gZGVzYmFsYW5jZSBub3RhYmxlOiAqKjc0JSBkZSBlc2N1ZWxhcyBlc3RhdGFsZXMqKiB5ICoqNTklIGRlIGVzY3VlbGFzIHJ1cmFsZXMqKiwgbG8gcXVlIGRlYmUgY29uc2lkZXJhcnNlIGFsIGludGVycHJldGFyIGxvcyByZXN1bHRhZG9zLg0KDQotLS0NCg0KIyMgMy4gUmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBudW3DqXJpY2FzDQoNCiMjIyAzLjEgRGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24NCg0KYGBge3IgZGlzcGVyc2lvbn0NCmdncGxvdChkZiwgYWVzKHggPSBwY3RfZGViYWpvLCB5ID0gcGN0X3NhdGlzZmFjdG9yaW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjQsIHNpemUgPSAxLjUpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBUUlVFLCBjb2xvciA9ICJyZWQiKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHRpdGxlID0gIiUgRGViYWpvIGRlbCBiw6FzaWNvIHZzLiAlIFNhdGlzZmFjdG9yaW8iLA0KICAgICAgIHggPSAiJSBEZWJham8gZGVsIGLDoXNpY28iLCB5ID0gIiUgU2F0aXNmYWN0b3JpbyIpICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KIyMjIDMuMiBDb3JyZWxhY2nDs24gZGUgUGVhcnNvbg0KDQpgYGB7ciBjb3JyZWxhY2lvbn0NCmNvci50ZXN0KGRmJHBjdF9kZWJham8sIGRmJHBjdF9zYXRpc2ZhY3RvcmlvLCBtZXRob2QgPSAicGVhcnNvbiIpDQpgYGANCg0KU2UgZW5jb250csOzIHVuYSBjb3JyZWxhY2nDs24gZGUgUGVhcnNvbiBwb3NpdGl2YSBkw6liaWwgKHIgPSAwLjIzLCBwIDwgMC4wMDEpLiBTaSBiaWVuIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmEgZGFkbyBlbCB0YW1hw7FvIG11ZXN0cmFsLCBsYSBtYWduaXR1ZCBpbmRpY2EgdW5hIHJlbGFjacOzbiBwcsOhY3RpY2FtZW50ZSBpcnJlbGV2YW50ZSBlbiB0w6lybWlub3Mgc3VzdGFudGl2b3MuDQoNCi0tLQ0KDQojIyA0LiBDb21wYXJhY2nDs24gZGUgbWVkaWFzDQoNCiMjIyA0LjEgSDE6IMK/RWwgc2VjdG9yIGluZmx1eWUgZW4gZWwgJSBTYXRpc2ZhY3RvcmlvPw0KDQoqKkjigoA6KiogTGEgZGlzdHJpYnVjacOzbiBkZWwgJSBzYXRpc2ZhY3RvcmlvIGVzIGlndWFsIGVuIGVzY3VlbGFzIGVzdGF0YWxlcyB5IHByaXZhZGFzICANCioqSOKCgToqKiBFeGlzdGUgZGlmZXJlbmNpYSBlbiBsYSBkaXN0cmlidWNpw7NuIGRlbCAlIHNhdGlzZmFjdG9yaW8gZW50cmUgc2VjdG9yZXMNCg0KYGBge3IgaDEtZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KHNlY3RvcikgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwY3Rfc2F0aXNmYWN0b3JpbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgbWVkaWFuYSA9IHJvdW5kKG1lZGlhbihwY3Rfc2F0aXNmYWN0b3JpbywgbmEucm0gPSBUUlVFKSwgMiksDQogICAgZGVzdmlvICA9IHJvdW5kKHNkKHBjdF9zYXRpc2ZhY3RvcmlvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBuICAgICAgID0gbigpDQogICkNCmBgYA0KDQpgYGB7ciBoMS1sZXZlbmV9DQpjYXQoIi0tLSBUZXN0IGRlIExldmVuZSAoaG9tb2dlbmVpZGFkIGRlIHZhcmlhbnphcykgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgxLXdpbGNveG9ufQ0KY2F0KCItLS0gVGVzdCBkZSBXaWxjb3hvbiAtIE1hbm4tV2hpdG5leSAocHJpbmNpcGFsKSAtLS1cbiIpDQp3aWxjb3gudGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmKQ0KDQpjYXQoIlxuLS0tIFRlc3QgdCBkZSBXZWxjaCAoY29tcGxlbWVudGFyaW8sIHbDoWxpZG8gcG9yIFRDTCBjb24gbiBncmFuZGUpIC0tLVxuIikNCnQudGVzdChwY3Rfc2F0aXNmYWN0b3JpbyB+IHNlY3RvciwgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCg0KY2F0KCJcbi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKENvaGVuJ3MgZCkgLS0tXG4iKQ0KY29oZW5zX2QocGN0X3NhdGlzZmFjdG9yaW8gfiBzZWN0b3IsIGRhdGEgPSBkZikNCmBgYA0KDQpgYGB7ciBoMS1ncmFmaWNvfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHNlY3RvciwgeSA9IHBjdF9zYXRpc2ZhY3RvcmlvLCBmaWxsID0gc2VjdG9yKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5jb2xvciA9ICJyZWQiLCBhbHBoYSA9IDAuNykgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNURBREUyIiwgIiNFNTk4NjYiKSkgKw0KICB0aGVtZV9idygpICsNCiAgbGFicyh0aXRsZSA9ICIlIFNhdGlzZmFjdG9yaW8gc2Vnw7puIFNlY3RvciIsIHggPSAiIiwgeSA9ICIlIFNhdGlzZmFjdG9yaW8iKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KVGFudG8gZWwgdGVzdCBkZSBXaWxjb3hvbi1NYW5uLVdoaXRuZXkgY29tbyBlbCB0ZXN0IGRlIFdlbGNoIGNvaW5jaWRlbiBlbiAqKnJlY2hhemFyIEjigoAqKiAocCA8IDAuMDAxKS4gTGFzIGVzY3VlbGFzIHByaXZhZGFzIHByZXNlbnRhbiB1bmEgbWVkaWFuYSBkZSAlIHNhdGlzZmFjdG9yaW8gZGUgMjMuNSUgZnJlbnRlIGFsIDUuMyUgZGUgbGFzIGVzdGF0YWxlcy4gRWwgdGFtYcOxbyBkZWwgZWZlY3RvIGVzIG11eSBncmFuZGUgKGQgPSAtMS41NyksIGxvIHF1ZSBpbmRpY2EgcXVlIGxhIGRpZmVyZW5jaWEgZXMgc3VzdGFudGl2YSB5IG5vIHNvbG8gZXN0YWTDrXN0aWNhLg0KDQotLS0NCg0KIyMjIDQuMiBIMjogwr9FbCDDoW1iaXRvIGluZmx1eWUgZW4gZWwgJSBEZWJham8gZGVsIGLDoXNpY28/DQoNCioqSOKCgDoqKiBMYSBkaXN0cmlidWNpw7NuIGRlbCAlIGRlYmFqbyBkZWwgYsOhc2ljbyBlcyBpZ3VhbCBlbiBlc2N1ZWxhcyBydXJhbGVzIHkgdXJiYW5hcyAgDQoqKkjigoE6KiogRXhpc3RlIGRpZmVyZW5jaWEgZW4gbGEgZGlzdHJpYnVjacOzbiBkZWwgJSBkZWJham8gZGVsIGLDoXNpY28gZW50cmUgw6FtYml0b3MNCg0KYGBge3IgaDItZGVzY3JpcHRpdm9zfQ0KZGYgJT4lDQogIGdyb3VwX2J5KGFtYml0bykgJT4lDQogIHN1bW1hcmlzZSgNCiAgICBtZWRpYSAgID0gcm91bmQobWVhbihwY3RfZGViYWpvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBtZWRpYW5hID0gcm91bmQobWVkaWFuKHBjdF9kZWJham8sIG5hLnJtID0gVFJVRSksIDIpLA0KICAgIGRlc3ZpbyAgPSByb3VuZChzZChwY3RfZGViYWpvLCBuYS5ybSA9IFRSVUUpLCAyKSwNCiAgICBuICAgICAgID0gbigpDQogICkNCmBgYA0KDQpgYGB7ciBoMi1sZXZlbmV9DQpjYXQoIi0tLSBUZXN0IGRlIExldmVuZSAoaG9tb2dlbmVpZGFkIGRlIHZhcmlhbnphcykgLS0tXG4iKQ0KbGV2ZW5lVGVzdChwY3RfZGViYWpvIH4gYW1iaXRvLCBkYXRhID0gZGYpDQpgYGANCg0KYGBge3IgaDItd2lsY294b259DQpjYXQoIi0tLSBUZXN0IGRlIFdpbGNveG9uIC0gTWFubi1XaGl0bmV5IChwcmluY2lwYWwpIC0tLVxuIikNCndpbGNveC50ZXN0KHBjdF9kZWJham8gfiBhbWJpdG8sIGRhdGEgPSBkZikNCg0KY2F0KCJcbi0tLSBUZXN0IHQgZGUgV2VsY2ggKGNvbXBsZW1lbnRhcmlvLCB2w6FsaWRvIHBvciBUQ0wgY29uIG4gZ3JhbmRlKSAtLS1cbiIpDQp0LnRlc3QocGN0X2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmLCB2YXIuZXF1YWwgPSBGQUxTRSkNCg0KY2F0KCJcbi0tLSBUYW1hw7FvIGRlbCBlZmVjdG8gKENvaGVuJ3MgZCkgLS0tXG4iKQ0KY29oZW5zX2QocGN0X2RlYmFqbyB+IGFtYml0bywgZGF0YSA9IGRmKQ0KYGBgDQoNCmBgYHtyIGgyLWdyYWZpY299DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gYW1iaXRvLCB5ID0gcGN0X2RlYmFqbywgZmlsbCA9IGFtYml0bykpICsNCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuY29sb3IgPSAicmVkIiwgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiJSBEZWJham8gZGVsIGLDoXNpY28gc2Vnw7puIMOBbWJpdG8iLCB4ID0gIiIsIHkgPSAiJSBEZWJham8gZGVsIGLDoXNpY28iKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KLS0tDQoNCiMjIDUuIFBydWViYSBkZSBpbmRlcGVuZGVuY2lhIChDaGnCsikNCg0KKipI4oKAOioqIFNlY3RvciB5IMOBbWJpdG8gc29uIGluZGVwZW5kaWVudGVzICANCioqSOKCgToqKiBFeGlzdGUgYXNvY2lhY2nDs24gZW50cmUgU2VjdG9yIHkgw4FtYml0bw0KDQpgYGB7ciBjaGktdGFibGF9DQp0YWJsYV9jb250IDwtIHRhYmxlKGRmJHNlY3RvciwgZGYkYW1iaXRvKQ0KcHJpbnQodGFibGFfY29udCkNCg0KY2F0KCJcbi0tLSBQcm9wb3JjaW9uZXMgcG9yIGZpbGEgLS0tXG4iKQ0KcHJpbnQocm91bmQocHJvcC50YWJsZSh0YWJsYV9jb250LCBtYXJnaW4gPSAxKSAqIDEwMCwgMSkpDQpgYGANCg0KYGBge3IgY2hpLXRlc3R9DQpjaGlfdGVzdCA8LSBjaGlzcS50ZXN0KHRhYmxhX2NvbnQpDQpwcmludChjaGlfdGVzdCkNCg0KY2F0KCJcbi0tLSBGcmVjdWVuY2lhcyBlc3BlcmFkYXMgLS0tXG4iKQ0KcHJpbnQocm91bmQoY2hpX3Rlc3QkZXhwZWN0ZWQsIDEpKQ0KDQppZiAoYW55KGNoaV90ZXN0JGV4cGVjdGVkIDwgNSkpIHsNCiAgY2F0KCJcbkFsZ3VuYSBjZWxkYSB0aWVuZSBmcmVjdWVuY2lhIGVzcGVyYWRhIDwgNS4gU2ltdWxhY2nDs24gZGUgcC12YWxvcjpcbiIpDQogIHByaW50KGNoaXNxLnRlc3QodGFibGFfY29udCwgc2ltdWxhdGUucC52YWx1ZSA9IFRSVUUpKQ0KfQ0KDQpjYXQoIlxuLS0tIFRhbWHDsW8gZGVsIGVmZWN0byAoViBkZSBDcmFtw6lyKSAtLS1cbiIpDQpjcmFtZXJfdih0YWJsYV9jb250KQ0KYGBgDQoNCmBgYHtyIGNoaS1ncmFmaWNvc30NCmRmX2NvbnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsYV9jb250KQ0KbmFtZXMoZGZfY29udCkgPC0gYygiU2VjdG9yIiwgIkFtYml0byIsICJGcmVjdWVuY2lhIikNCg0KcGMxIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG9yID0gIndoaXRlIiwgYWxwaGEgPSAwLjg1KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBGcmVjdWVuY2lhKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCB2anVzdCA9IC0wLjUsIHNpemUgPSAzLjUpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiRnJlY3VlbmNpYSBkZSDDgW1iaXRvIHNlZ8O6biBTZWN0b3IiLA0KICAgICAgIHggPSAiU2VjdG9yIiwgeSA9ICJGcmVjdWVuY2lhIiwgZmlsbCA9ICLDgW1iaXRvIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCg0KcGMyIDwtIGdncGxvdChkZl9jb250LCBhZXMoeCA9IFNlY3RvciwgeSA9IEZyZWN1ZW5jaWEsIGZpbGwgPSBBbWJpdG8pKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJmaWxsIiwgY29sb3IgPSAid2hpdGUiLCBhbHBoYSA9IDAuODUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzU4RDY4RCIsICIjQTU2OUJEIikpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgw4FtYml0byBzZWfDum4gU2VjdG9yIiwNCiAgICAgICB4ID0gIlNlY3RvciIsIHkgPSAiUHJvcG9yY2nDs24iLCBmaWxsID0gIsOBbWJpdG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQ0KDQpwbG90X2dyaWQocGMxLCBwYzIsIG5jb2wgPSAyKQ0KYGBgDQoNCi0tLQ0KDQojIyA2LiBDb25jbHVzaW9uZXMNCg0KRWwgYW7DoWxpc2lzIGRlIGxvcyBkYXRvcyBkZWwgb3BlcmF0aXZvIEFQUkVOREVSIDIwMjQgcGFyYSBNYXRlbcOhdGljYSBlbg0KZWwgbml2ZWwgc2VjdW5kYXJpbyBwZXJtaXRlIGV4dHJhZXIgbGFzIHNpZ3VpZW50ZXMgY29uY2x1c2lvbmVzOg0KDQoqKlNvYnJlIGxhIGNhbGlkYWQgZGUgbG9zIGRhdG9zKioNCkVsIGRhdGFzZXQgb3JpZ2luYWwgcHJlc2VudMOzIHVuIDUyJSBkZSByZWdpc3Ryb3MgY29uIHZhbG9yZXMgaW1wb3NpYmxlcw0KKHN1cGVyaW9yZXMgYSAxMDAlKSwgbG8gcXVlIHJlcHJlc2VudGEgdW5hIGxpbWl0YWNpw7NuIGltcG9ydGFudGUgeSBzdWdpZXJlDQpwcm9ibGVtYXMgZW4gZWwgcHJvY2VzbyBkZSBjYXJnYSBvIGNvZGlmaWNhY2nDs24gZGUgbG9zIGRhdG9zIG9yaWdpbmFsZXMuDQpFbCBhbsOhbGlzaXMgc2UgcmVhbGl6w7Mgc29icmUgbGFzIDU2NCBvYnNlcnZhY2lvbmVzIHbDoWxpZGFzIHJlc3RhbnRlcy4NCg0KKipTb2JyZSBsYSBkaXN0cmlidWNpw7NuIGRlbCBkZXNlbXBlw7FvKioNCk5pbmd1bmEgZGUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlIHVuYSBkaXN0cmlidWNpw7NuIG5vcm1hbCwNCmV2aWRlbmNpYWRvIHBvciBsb3MgUVFwbG90cyB5IGxhIGZvcm1hIGRlIGxvcyBoaXN0b2dyYW1hcy4gRWwgJSBwb3IgZGViYWpvDQpkZWwgbml2ZWwgYsOhc2ljbyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBhcHJveGltYWRhbWVudGUgdW5pZm9ybWUgZW50cmUNCjAgeSAxMDAlLCBsbyBxdWUgcmVmbGVqYSB1bmEgZ3JhbiBoZXRlcm9nZW5laWRhZCBlbnRyZSBlc2N1ZWxhcy4gRWwgJQ0Kc2F0aXNmYWN0b3JpbyBtdWVzdHJhIHVuIG1hcmNhZG8gc2VzZ28gcG9zaXRpdm8sIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMNCmVzY3VlbGFzIGNvbmNlbnRyYWRhcyBlbiB2YWxvcmVzIGJham9zIChtZWRpYW5hOiA3JSkuDQoNCioqU29icmUgbGEgcmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcyBudW3DqXJpY2FzKioNClNlIGVuY29udHLDsyB1bmEgY29ycmVsYWNpw7NuIGRlIFBlYXJzb24gcG9zaXRpdmEgZMOpYmlsIGVudHJlIGVsICUgZGViYWpvDQpkZWwgYsOhc2ljbyB5IGVsICUgc2F0aXNmYWN0b3JpbyAociA9IDAuMjMsIHAgPCAwLjAwMSkuIExhIGJhamEgbWFnbml0dWQNCmluZGljYSBxdWUgYW1iYXMgdmFyaWFibGVzIG5vIHNvbiBjb21wbGVtZW50YXJpYXMgZGlyZWN0YXMgeSBxdWUgb3Ryb3MNCmZhY3RvcmVzIGV4cGxpY2FuIGxhIGRpc3RyaWJ1Y2nDs24gZGVsIGRlc2VtcGXDsW8gZXNjb2xhci4NCg0KKipIMSDigJQgU2VjdG9yIHkgJSBTYXRpc2ZhY3RvcmlvKioNClNlIHJlY2hhemEgSOKCgCAoV2lsY294b246IHAgPCAwLjAwMSkuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBwcmVzZW50YW4gdW5hDQptZWRpYW5hIGRlICUgc2F0aXNmYWN0b3JpbyBzaWduaWZpY2F0aXZhbWVudGUgbWF5b3IgKDIzLjUlKSBxdWUgbGFzDQplc3RhdGFsZXMgKDUuMyUpLiBFbCB0YW1hw7FvIGRlbCBlZmVjdG8gZXMgbXV5IGdyYW5kZSAoZCA9IC0xLjU3KSwNCmluZGljYW5kbyBxdWUgbGEgZGlmZXJlbmNpYSBlbnRyZSBzZWN0b3JlcyBlcyBzdXN0YW50aXZhIHkgbm8gbWVyYW1lbnRlDQplc3RhZMOtc3RpY2EuIExhcyBlc2N1ZWxhcyBwcml2YWRhcyBtdWVzdHJhbiBlbnRyZSAxNy42IHkgMjUuMSBwdW50b3MNCnBvcmNlbnR1YWxlcyBtw6FzIGRlIGFsdW1ub3MgZW4gbml2ZWwgc2F0aXNmYWN0b3JpbyAoSUMgOTUlLCBXZWxjaCkuDQoNCioqSDIg4oCUIMOBbWJpdG8geSAlIERlYmFqbyBkZWwgYsOhc2ljbyoqDQpTZSByZWNoYXphIEjigoAgKFdpbGNveG9uOiBwIDwgMC4wMDEpLiBMYXMgZXNjdWVsYXMgdXJiYW5hcyBwcmVzZW50YW4gdW5hDQptZWRpYW5hIGRlICUgZGViYWpvIGRlbCBiw6FzaWNvIG1heW9yICg1NC4yJSkgcXVlIGxhcyBydXJhbGVzICgzMS44JSksDQpyZXN1bHRhZG8gY29udHJhaW50dWl0aXZvIHF1ZSBwdWVkZSBleHBsaWNhcnNlIHBvciBsYSBtYXlvciBjb25jZW50cmFjacOzbg0KZGUgbWF0csOtY3VsYSBlbiBjb250ZXh0b3MgZGUgdnVsbmVyYWJpbGlkYWQgc29jaWFsIGVuIHpvbmFzIHVyYmFuYXMuIEVsDQp0YW1hw7FvIGRlbCBlZmVjdG8gZXMgbW9kZXJhZG8gKGQgPSAtMC42NSkuDQoNCioqQ2hpwrIg4oCUIEFzb2NpYWNpw7NuIGVudHJlIFNlY3RvciB5IMOBbWJpdG8qKg0KU2UgcmVjaGF6YSBI4oKAICjPh8KyID0gMTI2LjMsIHAgPCAwLjAwMSkuIEV4aXN0ZSB1bmEgYXNvY2lhY2nDs24gZnVlcnRlIGVudHJlDQpzZWN0b3IgeSDDoW1iaXRvIChWIGRlIENyYW3DqXIgPSAwLjQ3KS4gTGFzIGVzY3VlbGFzIGVzdGF0YWxlcyBzb24NCnByZWRvbWluYW50ZW1lbnRlIHJ1cmFsZXMgKDcyLjYlKSBtaWVudHJhcyBxdWUgbGFzIHByaXZhZGFzIHNvbg0KbWF5b3JpdGFyaWFtZW50ZSB1cmJhbmFzICg4MS4yJSkuIEVzdGEgYXNvY2lhY2nDs24gZXMgcmVsZXZhbnRlIGFsDQppbnRlcnByZXRhciBsb3MgcmVzdWx0YWRvcyBhbnRlcmlvcmVzLCB5YSBxdWUgc2VjdG9yIHkgw6FtYml0byBubyBzb24NCnZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcy4NCg0KLS0tDQoNCiMjIFJlZmVyZW5jaWFzDQoNCi0gTWluaXN0ZXJpbyBkZSBFZHVjYWNpw7NuIGRlIGxhIE5hY2nDs24gQXJnZW50aW5hICgyMDI0KS4gKk9wZXJhdGl2byBOYWNpb25hbCBkZSBFdmFsdWFjacOzbiBBUFJFTkRFUiAyMDI0IOKAlCBSZXN1bHRhZG9zIE1hdGVtw6F0aWNhKi4gQnVlbm9zIEFpcmVzOiBEaU5JRUNFLg0KDQo=