Equipo No: 13

Integrantes

Por medio de un conjunto de datos, conformado por las calificaciones obtenidas de los estudiantes en asignaturas como matemáticas, lectura y escritura, determinar si diferentes factores que incluye el conjunto de datos influyen en el resultado de los exámenes.

Los factores son:

El conjunto de datos fue obtenido de Kaggle

Para esto, realizaremos una serie de preguntas con respecto a los factores mencionados anteriormente para la formulación de hipótesis

1. ¿Existe una influencia del nivel educativo de los padres en las calificaciones del alumno?

2. ¿Existe una diferencia significativa de las calificaciones entre los alumnos que tomaron el curso de preparación y los que no?

3. ¿Existe una relación en el desempeños de las calificaciones de los alumnos el tipo de lunch?

4. ¿Influye el tipo de raza de los alumnos en el desempeño de los alumnos?

Iniciamos nuestro código cargando las librerias que necesitaremos, así como nuestro conjunto de datos

#Cargamos la libreria para leer el dataset
library(readxl)
library(ggplot2)
#Asignamos a la variable df la lectura de nuestro archivo exams.xls
df<-read_excel(file.choose())
#Observamos el dataset
head(df)

Análisis de los datos

ggplot(df,aes(gender) )+
  geom_bar(width= 0.5,colour="red", fill="skyblue")+
  scale_y_continuous(limits = c(0,600),
                     breaks = seq(0,1000,1000))+
  labs(title = "Distribución de estudiantes Hombres y Mujeres",
       x="Genero",
       y= "Alunmos")+
  theme_bw(base_size = 12)+
  
  geom_text(aes(label=..count..), stat='count', 
            position=position_dodge(0.9), 
            vjust=-0.5, 
            size=5.0
            ) 

# Gráfico de barras para comparar el desempeño en matemáticas según el nivel de educación de los padres
ggplot(df, aes(x = parental_level_of_education, y = math_score)) +
  geom_bar(stat = "summary", fun = "mean") +
  labs(title = "Desempeño en Matemáticas según Nivel de Educación de los Padres", x = "Nivel de Educación de los Padres", y = "Calificación Promedio en Matemáticas")

# Gráfico de barras apiladas con facetas por nivel de educación de los padres
ggplot(df, aes(x = gender, y = math_score, fill = lunch)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución de Calificaciones de Matemáticas por Género, Tipo de Almuerzo y Nivel de Educación de los Padres", 
       x = "Género", y = "Calificaciones de Matemáticas", fill = "Tipo de Almuerzo") +
  facet_wrap(~ parental_level_of_education, scales = "free_y", ncol = 2)  # Facetas por nivel de educación de los padres

# Gráfico de barras apiladas con facetas por nivel de educación de los padres
ggplot(df, aes(x = gender, y = math_score, fill = lunch)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución de Calificaciones de Matemáticas por Género, Tipo de Almuerzo y Nivel d")

# Gráfico de barras apiladas con facetas por nivel de educación de los padres, género, y curso de preparación para el examen
ggplot(df, aes(x = gender, y = writing_score, fill = test_preparation_curse)) +
  geom_bar(stat = "identity") +
  labs(title = "Distribución de Calificaciones de Escritura por Género, Curso de Preparación y Nivel de Educación de los Padres", 
       x = "Género", y = "Calificaciones de Escritura", fill = "Curso de Preparación") +
  facet_wrap(~ parental_level_of_education_grouped, scales = "free_y", ncol = 2)  # Facetas por nivel de educación de los padres agrupado

Pruebas de hipótesis

1. ¿Existe una influencia del nivel educativo de los padres en las calificaciones del alumno?

Prueba de hipótesis ANOVA para evaluar la relación entre las calificaciones de la materia de matemáticas y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay relación significativa entre la calificación de Matemáticas y el grado de estudios de los padres.

  • Hipotesis alternativa (Ha) Existe una relación significativa entre la calificación de Matemáticas y el grado de estudios de los padres.

padres_matematicas <- aov(math_score ~ parental_level_of_education, data = df) #Realizamos nuestra prueba anova
summary(padres_matematicas) #Mostramos el resultado
                             Df Sum Sq Mean Sq F value   Pr(>F)    
parental_level_of_education   5   9562  1912.4    8.57 5.85e-08 ***
Residuals                   994 221815   223.2                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de Matemáticas y el grado de estudios de los padres

Prueba de hipótesis ANOVA para evaluar la relación entre las calificaciones de la materia de lectura y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay relación significativa entre la calificación de Lectura y el grado de estudios de los padres.

  • Hipotesis alternativa (Ha) Existe una relación significativa entre la calificación de Lectura y el grado de estudios de los padres.

padres_lectura <- aov(reading_score ~ parental_level_of_education, data = df) #Realizamos nuestra prueba anova
summary(padres_lectura) #Mostramos el resultado
                             Df Sum Sq Mean Sq F value   Pr(>F)    
parental_level_of_education   5  13332  2666.4   13.39 1.19e-12 ***
Residuals                   994 197983   199.2                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de Lectura y el grado de estudios de los padres

Prueba de hipótesis ANOVA para evaluar la relación entre las calificaciones de la materia de escritura y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay relación significativa entre la calificación de Escritura y el grado de estudios de los padres.

  • Hipotesis alternativa (Ha) Existe una relación significativa entre la calificación de Escritura y el grado de estudios de los padres.

padres_escritura <- aov(writing_score ~ parental_level_of_education, data = df) #Realizamos nuestra prueba anova
summary(padres_escritura) #mostramos el resultado
                             Df Sum Sq Mean Sq F value Pr(>F)    
parental_level_of_education   5  18731    3746   17.93 <2e-16 ***
Residuals                   994 207724     209                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de Escritura y el grado de estudios de los padres

2. ¿Existe una diferencia significativa de las calificaciones entre los alumnos que tomaron el curso de preparación y los que no?

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de matemáticas y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de matemáticas de los alumnos que tomaron el curso de preparación y los que no.

  • Hipótesis alternativa (Ha): Existe diferencia significativa en las calificaciones de matemáticas de los alumnos que tomaron el curso de preparación y los que no.

ttest_matematicas <- t.test(math_score ~ test_preparation_curse, data = df, conf.level= 0.99) #Realizamos nuestra prueba test
ttest_matematicas #mostramos el resultado

    Welch Two Sample t-test

data:  math_score by test_preparation_curse
t = 3.7917, df = 743.9, p-value = 0.0001617
alternative hypothesis: true difference in means between group completed and group none is not equal to 0
99 percent confidence interval:
 1.199237 6.321289
sample estimates:
mean in group completed      mean in group none 
               69.40113                65.64087 

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de Matemáticas con los alumnos que compleraron el curso de preparación

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de escritura y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de lectura de los alumnos que tomaron el curso de preparación y los que no.

  • Hipótesis alternativa (Ha): Existe diferencia significativa en las calificaciones de lectura de los alumnos que tomaron el curso de preparación y los que no.

ttest_lectura <- t.test(reading_score ~ test_preparation_curse, data = df, conf.level= 0.99) #Realizamos nuestra prueba test
ttest_lectura #mostramos el resultado

    Welch Two Sample t-test

data:  reading_score by test_preparation_curse
t = 7.2189, df = 761.03, p-value = 1.272e-12
alternative hypothesis: true difference in means between group completed and group none is not equal to 0
99 percent confidence interval:
 4.283536 9.054922
sample estimates:
mean in group completed      mean in group none 
               74.05932                67.39009 

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de lectura con los alumnos que compleraron el curso de preparación

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de escritura y el grado de estudios de los padres

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de escritura de los alumnos que tomaron el curso de preparación y los que no.

  • Hipótesis alternativa (Ha): Existe diferencia significativa en las calificaciones de escritura de los alumnos que tomaron el curso de preparación y los que no.

ttest_escritura <- t.test(writing_score ~ test_preparation_curse, data = df, conf.level= 0.99) #Realizamos nuestra prueba test
ttest_escritura #mostramos el resultado

    Welch Two Sample t-test

data:  writing_score by test_preparation_curse
t = 9.871, df = 755.35, p-value < 2.2e-16
alternative hypothesis: true difference in means between group completed and group none is not equal to 0
99 percent confidence interval:
  6.845514 11.696211
sample estimates:
mean in group completed      mean in group none 
               74.45198                65.18111 

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de escritura con los alumnos que compleraron el curso de preparación

3. ¿Existe una relación en el desempeños de las calificaciones de los alumnos el tipo de lunch?

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de matematicas y el tipo de lunch

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de matemáticas entre los tipos de lunch.

  • Hipótesis nula (Ha): Existe diferencia significativa en las calificaciones de matemáticas entre los tipos de lunch.

resultado_ttest <- t.test(math_score ~ lunch, data = df, conf.level= 0.99)
resultado_ttest

    Welch Two Sample t-test

data:  math_score by lunch
t = -13.648, df = 696.41, p-value < 2.2e-16
alternative hypothesis: true difference in means between group free/reduced and group standard is not equal to 0
99 percent confidence interval:
 -15.15555 -10.33192
sample estimates:
mean in group free/reduced     mean in group standard 
                  58.68857                   71.43231 

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de matemáticas con el tipo de lunch

Densidad de calificaciones de matemáticas con el tipo de lunch

# Gráfico de Densidad para Calificaciones de Matemáticas
ggplot(df, aes(x = math_score, fill = lunch)) +
  geom_density(alpha = 0.5) +
  labs(title = "Densidad de Calificaciones de Matemáticas",
       x = "Calificación de Matemáticas", y = "Densidad")

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de escritura y el tipo de lunch

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de escritura entre los tipos de lunch.

  • Hipótesis nula (Ha): Existe diferencia significativa en las calificaciones de escritura entre los tipos de lunch.

resultado_ttest <- t.test(writing_score ~ lunch, data = df, conf.level= 0.99)
resultado_ttest

    Welch Two Sample t-test

data:  writing_score by lunch
t = -9.3053, df = 708.08, p-value < 2.2e-16
alternative hypothesis: true difference in means between group free/reduced and group standard is not equal to 0
99 percent confidence interval:
 -11.422507  -6.459251
sample estimates:
mean in group free/reduced     mean in group standard 
                  62.65143                   71.59231 

Densidad de calificaciones de escritura con el tipo de lunch

# Gráfico de Densidad para Calificaciones de Escritura
ggplot(df, aes(x = writing_score, fill = lunch)) +
  geom_density(alpha = 0.5) +
  labs(title = "Densidad de Calificaciones de Escritura",
       x = "Calificación de Escritura", y = "Densidad")

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de escritura con el tipo de lunch

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de lectura y el tipo de lunch

  • Hipótesis nula (H0): No hay diferencia significativa en las calificaciones de lectura entre los tipos de lunch.

  • Hipótesis nula (Ha): Existe diferencia significativa en las calificaciones de lectura entre los tipos de lunch.

resultado_ttest <- t.test(reading_score ~ lunch, data = df, conf.level= 0.99)
resultado_ttest

    Welch Two Sample t-test

data:  reading_score by lunch
t = -8.9028, df = 690.31, p-value < 2.2e-16
alternative hypothesis: true difference in means between group free/reduced and group standard is not equal to 0
99 percent confidence interval:
 -10.78520  -5.93436
sample estimates:
mean in group free/reduced     mean in group standard 
                  64.31714                   72.67692 

Densidad de calificaciones de lectura con el tipo de lunch

# Gráfico de Densidad para Calificaciones de escritura
ggplot(df, aes(x = reading_score, fill = lunch)) +
  geom_density(alpha = 0.5) +
  labs(title = "Densidad de Calificaciones de Escritura",
       x = "Calificación de Español", y = "Densidad")

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de lectura con el tipo de lunch

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de lectura y el tipo de lunch y el genero

  • Hipótesis nula (H0): No hay relación significativa entre la calificación de lectura, el tipo de lunch y el genero..

  • Hipótesis nula (Ha): Existe relación significativa entre la calificación de lectura, el tipo de lunch y el genero.

resultado_anova <- aov(reading_score ~ lunch + gender, data = df)
summary(resultado_anova)
             Df Sum Sq Mean Sq F value   Pr(>F)    
lunch         1  15899   15899   86.25  < 2e-16 ***
gender        1  11627   11627   63.07 5.35e-15 ***
Residuals   997 183789     184                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de lectura con el tipo de lunch y el genero

Prueba de hipótesis ANOVA para evaluar la relación entre las calificaciones de la materia de lectura y el tipo de lunch y el curso de preparacion.

  • Hipótesis nula (H0): No hay relación significativa entre la calificación de lectura, el tipo de lunch y curso de preparacion..

  • Hipótesis nula (Ha): Existe relación significativa entre la calificación de lectura, el tipo de lunch y el curso de preparacion.

resultado_anova <- aov(reading_score ~ lunch + test_preparation_curse, data = df)
summary(resultado_anova)
                        Df Sum Sq Mean Sq F value   Pr(>F)    
lunch                    1  15899   15899   85.37  < 2e-16 ***
test_preparation_curse   1   9744    9744   52.32 9.37e-13 ***
Residuals              997 185672     186                     
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

La hipótesis nula se descarta y se acetpa la hipótesis alternativa. Existe una relación significativa entre la calificación de lectura con el tipo de lunch y el curso de preparacion

4. ¿Influye el tipo de raza de los alumnos en el desempeño de los alumnos?

Prueba de hipótesis para evaluar la relación entre las calificaciones de la materia de matematicas y el tipo de lunch

Conclusiones

De acuerdo con las distintas pruebas realizadas tanto la prueba….. y la prueba ANOVA se puede observar que si existe una influencia significativa entre los factores; “Nivel de educación de los padres”, “Curso de preparación para el examen”, “Tipo de almuerzo” y “Raza”

LS0tDQp0aXRsZTogIkRFU0VNUEXDkU8gREUgTE9TIEVTVFVESUFOVEVTIEVOIExPUyBFWEFNRU5FUyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoqKipFcXVpcG8gTm86IDEzKioqDQoNCioqKkludGVncmFudGVzKioqDQoNCisgT3NjYXIgRGFuaWVsIEJldGFuY291cnQNCg0KKyBEaWVnbyBJc2FpYXMgTMOzcGV6IFRhcGlhDQoNCisgSnVhbiBEYW5pZWwgQ2FycmlsbG8NCg0KKyBDYXJsb3MgZGUgbGEgUm9zYQ0KDQpQb3IgbWVkaW8gZGUgdW4gY29uanVudG8gZGUgZGF0b3MsIGNvbmZvcm1hZG8gcG9yIGxhcyBjYWxpZmljYWNpb25lcyBvYnRlbmlkYXMgZGUgbG9zIGVzdHVkaWFudGVzIGVuIGFzaWduYXR1cmFzIGNvbW8gbWF0ZW3DoXRpY2FzLCBsZWN0dXJhIHkgZXNjcml0dXJhLCBkZXRlcm1pbmFyIHNpIGRpZmVyZW50ZXMgZmFjdG9yZXMgcXVlIGluY2x1eWUgZWwgY29uanVudG8gZGUgZGF0b3MgaW5mbHV5ZW4gZW4gZWwgcmVzdWx0YWRvIGRlIGxvcyBleMOhbWVuZXMuIA0KDQpMb3MgZmFjdG9yZXMgc29uOg0KDQoqICoqTml2ZWwgZGUgZWR1Y2FjacOzbiBkZSBsb3MgcGFkcmVzLioqDQoNCiogKipDdXJzbyBkZSBwcmVwYXJhY2nDs24gcGFyYSBlbCBleGFtZW4qKg0KDQoqICoqVGlwbyBkZSBhbG11ZXJ6byoqDQoNCiogKipSYXphKioNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgZnVlIG9idGVuaWRvIGRlIFtLYWdnbGVdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvc3BzY2llbnRpc3Qvc3R1ZGVudHMtcGVyZm9ybWFuY2UtaW4tZXhhbXMpDQoNCiMjIyBQYXJhIGVzdG8sIHJlYWxpemFyZW1vcyB1bmEgc2VyaWUgZGUgcHJlZ3VudGFzIGNvbiByZXNwZWN0byBhIGxvcyBmYWN0b3JlcyBtZW5jaW9uYWRvcyBhbnRlcmlvcm1lbnRlIHBhcmEgbGEgZm9ybXVsYWNpw7NuIGRlIGhpcMOzdGVzaXMNCioqMS4gwr9FeGlzdGUgdW5hIGluZmx1ZW5jaWEgZGVsIG5pdmVsIGVkdWNhdGl2byBkZSBsb3MgcGFkcmVzIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZWwgYWx1bW5vPyoqDQoNCisgTWF0ZW3DoXRpY2FzDQorIExlY3R1cmENCisgRXNjcml0dXJhDQoNCioqMi4gwr9FeGlzdGUgdW5hIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBkZSBsYXMgY2FsaWZpY2FjaW9uZXMgZW50cmUgbG9zIGFsdW1ub3MgcXVlIHRvbWFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHkgbG9zIHF1ZSBubz8qKg0KDQorIE1hdGVtw6F0aWNhcw0KKyBMZWN0dXJhDQorIEVzY3JpdHVyYQ0KDQoqKjMuIMK/RXhpc3RlIHVuYSByZWxhY2nDs24gZW4gZWwgZGVzZW1wZcOxb3MgZGUgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxvcyBhbHVtbm9zIGVsIHRpcG8gZGUgbHVuY2g/ICoqDQoNCisgTWF0ZW3DoXRpY2FzDQorIExlY3R1cmENCisgRXNjcml0dXJhDQoNCioqNC4gwr9JbmZsdXllIGVsIHRpcG8gZGUgcmF6YSBkZSBsb3MgYWx1bW5vcyBlbiBlbCBkZXNlbXBlw7FvIGRlIGxvcyBhbHVtbm9zPyoqDQoNCisgTWF0ZW3DoXRpY2FzDQorIExlY3R1cmENCisgRXNjcml0dXJhDQoNCg0KSW5pY2lhbW9zIG51ZXN0cm8gY8OzZGlnbyBjYXJnYW5kbyBsYXMgbGlicmVyaWFzIHF1ZSBuZWNlc2l0YXJlbW9zLCBhc8OtIGNvbW8gbnVlc3RybyBjb25qdW50byBkZSBkYXRvcw0KYGBge3J9DQojQ2FyZ2Ftb3MgbGEgbGlicmVyaWEgcGFyYSBsZWVyIGVsIGRhdGFzZXQNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KI0FzaWduYW1vcyBhIGxhIHZhcmlhYmxlIGRmIGxhIGxlY3R1cmEgZGUgbnVlc3RybyBhcmNoaXZvIGV4YW1zLnhscw0KZGY8LXJlYWRfZXhjZWwoZmlsZS5jaG9vc2UoKSkNCiNPYnNlcnZhbW9zIGVsIGRhdGFzZXQNCmhlYWQoZGYpDQpgYGANCiogTGEgY29sdW1uYSBfZ2VuZGVyXyBtdWVzdHJhIGluZm9ybWFjacOzbiBkZWwgdGlwbyBkZSBnZW5lcm8gZGVsIGFsdW1ubw0KDQoqIExhIGNvbHVtbmEgX3JhY2VfZXRobmljaXR5XyBtdWVzdHJhIGxhIGluZm9ybWFjaW9uIGNsYXNpZmljYWRhIHBvciBncnVwbzoNCiAgDQogICsgX2dyb3VwXyBfQTpfIENsYXNlIGFsdGENCiAgDQogICsgX2dyb3VwXyBfQjpfIENsYXNlIG1lZGlhLWFsdGENCiAgDQogICsgX2dyb3VwXyBfQzpfIENsYXNlIG1lZGlhDQogIA0KICArIF9ncm91cF8gX0Q6XyBDbGFzZSBtZWRpYS1iYWphDQogIA0KICArIF9ncm91cF8gX0U6XyBDbGFzZSBiYWphDQoNCiogTGEgY29sdW1uYSBfcGFyZW50YWxfbGV2ZWxfb2ZfZWR1Y2F0aW9uXyBtdWVzdHJhIGluZm9ybWFjacOzbiBkZWwgZ3JhZG8gZGUgZXN0dWRpbyBkZSBsb3MgcGFkcmVzDQoNCiogTGEgY29sdW1uYSBfbHVuY2hfIG11ZXN0cmEgaW5mb3JtYWNpw7NuIGRlbCB0aXBvIGRlIGFsaW1lbnRhY2nDs24gZGUgbG9zIGFsdW1ub3MNCg0KKiBMYSBjb2x1bW5hIF90ZXN0X3ByZXBhcmF0aW9uX2N1cnNlXyBtdWVzdHJhIGluZm9ybWFjacOzbiBzaSBsb3MgYWx1bW5vcyB0b21hcm9uIGVsIGN1cnNvIGRlIHByZXBhcmFjacOzbg0KDQoqIExhcyBjYWxpZmljYWNpb25lcyBkZSBsYXMgbWF0ZXJpYXMgc2UgZW5jdWVudHJhbiBlbiB1biBlc3RhbmRhciBkZWwgMSBhbCAxMDANCg0KDQojIEFuw6FsaXNpcyBkZSBsb3MgZGF0b3MNCmBgYHtyfQ0KZ2dwbG90KGRmLGFlcyhnZW5kZXIpICkrDQogIGdlb21fYmFyKHdpZHRoPSAwLjUsY29sb3VyPSJyZWQiLCBmaWxsPSJza3libHVlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsNjAwKSwNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLDEwMDAsMTAwMCkpKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgZXN0dWRpYW50ZXMgSG9tYnJlcyB5IE11amVyZXMiLA0KICAgICAgIHg9IkdlbmVybyIsDQogICAgICAgeT0gIkFsdW5tb3MiKSsNCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpKw0KICANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD0uLmNvdW50Li4pLCBzdGF0PSdjb3VudCcsIA0KICAgICAgICAgICAgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgDQogICAgICAgICAgICB2anVzdD0tMC41LCANCiAgICAgICAgICAgIHNpemU9NS4wDQogICAgICAgICAgICApIA0KYGBgDQoNCmBgYHtyfQ0KIyBHcsOhZmljbyBkZSBiYXJyYXMgcGFyYSBjb21wYXJhciBlbCBkZXNlbXBlw7FvIGVuIG1hdGVtw6F0aWNhcyBzZWfDum4gZWwgbml2ZWwgZGUgZWR1Y2FjacOzbiBkZSBsb3MgcGFkcmVzDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcGFyZW50YWxfbGV2ZWxfb2ZfZWR1Y2F0aW9uLCB5ID0gbWF0aF9zY29yZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJzdW1tYXJ5IiwgZnVuID0gIm1lYW4iKSArDQogIGxhYnModGl0bGUgPSAiRGVzZW1wZcOxbyBlbiBNYXRlbcOhdGljYXMgc2Vnw7puIE5pdmVsIGRlIEVkdWNhY2nDs24gZGUgbG9zIFBhZHJlcyIsIHggPSAiTml2ZWwgZGUgRWR1Y2FjacOzbiBkZSBsb3MgUGFkcmVzIiwgeSA9ICJDYWxpZmljYWNpw7NuIFByb21lZGlvIGVuIE1hdGVtw6F0aWNhcyIpDQpgYGANCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIGJhcnJhcyBhcGlsYWRhcyBjb24gZmFjZXRhcyBwb3Igbml2ZWwgZGUgZWR1Y2FjacOzbiBkZSBsb3MgcGFkcmVzDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gZ2VuZGVyLCB5ID0gbWF0aF9zY29yZSwgZmlsbCA9IGx1bmNoKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1Y2nDs24gZGUgQ2FsaWZpY2FjaW9uZXMgZGUgTWF0ZW3DoXRpY2FzIHBvciBHw6luZXJvLCBUaXBvIGRlIEFsbXVlcnpvIHkgTml2ZWwgZGUgRWR1Y2FjacOzbiBkZSBsb3MgUGFkcmVzIiwgDQogICAgICAgeCA9ICJHw6luZXJvIiwgeSA9ICJDYWxpZmljYWNpb25lcyBkZSBNYXRlbcOhdGljYXMiLCBmaWxsID0gIlRpcG8gZGUgQWxtdWVyem8iKSArDQogIGZhY2V0X3dyYXAofiBwYXJlbnRhbF9sZXZlbF9vZl9lZHVjYXRpb24sIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gMikgICMgRmFjZXRhcyBwb3Igbml2ZWwgZGUgZWR1Y2FjacOzbiBkZSBsb3MgcGFkcmVzDQpgYGANCmBgYHtyfQ0KIyBHcsOhZmljbyBkZSBiYXJyYXMgYXBpbGFkYXMgY29uIGZhY2V0YXMgcG9yIG5pdmVsIGRlIGVkdWNhY2nDs24gZGUgbG9zIHBhZHJlcw0KZ2dwbG90KGRmLCBhZXMoeCA9IGdlbmRlciwgeSA9IG1hdGhfc2NvcmUsIGZpbGwgPSBsdW5jaCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidWNpw7NuIGRlIENhbGlmaWNhY2lvbmVzIGRlIE1hdGVtw6F0aWNhcyBwb3IgR8OpbmVybywgVGlwbyBkZSBBbG11ZXJ6byB5IE5pdmVsIGQiKQ0KYGBgDQpgYGB7cn0NCiMgR3LDoWZpY28gZGUgYmFycmFzIGFwaWxhZGFzIGNvbiBmYWNldGFzIHBvciBuaXZlbCBkZSBlZHVjYWNpw7NuIGRlIGxvcyBwYWRyZXMsIGfDqW5lcm8sIHkgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHBhcmEgZWwgZXhhbWVuDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gZ2VuZGVyLCB5ID0gd3JpdGluZ19zY29yZSwgZmlsbCA9IHRlc3RfcHJlcGFyYXRpb25fY3Vyc2UpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiRGlzdHJpYnVjacOzbiBkZSBDYWxpZmljYWNpb25lcyBkZSBFc2NyaXR1cmEgcG9yIEfDqW5lcm8sIEN1cnNvIGRlIFByZXBhcmFjacOzbiB5IE5pdmVsIGRlIEVkdWNhY2nDs24gZGUgbG9zIFBhZHJlcyIsIA0KICAgICAgIHggPSAiR8OpbmVybyIsIHkgPSAiQ2FsaWZpY2FjaW9uZXMgZGUgRXNjcml0dXJhIiwgZmlsbCA9ICJDdXJzbyBkZSBQcmVwYXJhY2nDs24iKSArDQogIGZhY2V0X3dyYXAofiBwYXJlbnRhbF9sZXZlbF9vZl9lZHVjYXRpb25fZ3JvdXBlZCwgc2NhbGVzID0gImZyZWVfeSIsIG5jb2wgPSAyKSAgIyBGYWNldGFzIHBvciBuaXZlbCBkZSBlZHVjYWNpw7NuIGRlIGxvcyBwYWRyZXMgYWdydXBhZG8NCmBgYA0KDQoNCiMjIFBydWViYXMgZGUgaGlww7N0ZXNpcw0KIyMjIDEuIMK/RXhpc3RlIHVuYSBpbmZsdWVuY2lhIGRlbCBuaXZlbCBlZHVjYXRpdm8gZGUgbG9zIHBhZHJlcyBlbiBsYXMgY2FsaWZpY2FjaW9uZXMgZGVsIGFsdW1ubz8NCioqKlBydWViYSBkZSBoaXDDs3Rlc2lzIEFOT1ZBIHBhcmEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxhIG1hdGVyaWEgZGUgbWF0ZW3DoXRpY2FzIHkgZWwgZ3JhZG8gZGUgZXN0dWRpb3MgZGUgbG9zIHBhZHJlcyoqKg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSDApOiBObyBoYXkgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBNYXRlbcOhdGljYXMgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzLg0KDQorIEhpcG90ZXNpcyBhbHRlcm5hdGl2YSAoSGEpIEV4aXN0ZSB1bmEgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBNYXRlbcOhdGljYXMgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzLg0KDQpgYGB7cn0NCnBhZHJlc19tYXRlbWF0aWNhcyA8LSBhb3YobWF0aF9zY29yZSB+IHBhcmVudGFsX2xldmVsX29mX2VkdWNhdGlvbiwgZGF0YSA9IGRmKSAjUmVhbGl6YW1vcyBudWVzdHJhIHBydWViYSBhbm92YQ0Kc3VtbWFyeShwYWRyZXNfbWF0ZW1hdGljYXMpICNNb3N0cmFtb3MgZWwgcmVzdWx0YWRvDQpgYGANCioqTGEgaGlww7N0ZXNpcyBudWxhIHNlIGRlc2NhcnRhIHkgc2UgYWNldHBhIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuKioNCioqRXhpc3RlIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIE1hdGVtw6F0aWNhcyB5IGVsIGdyYWRvIGRlIGVzdHVkaW9zIGRlIGxvcyBwYWRyZXMqKg0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBBTk9WQSBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIGxlY3R1cmEgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzKioqDQoNCisgSGlww7N0ZXNpcyBudWxhIChIMCk6IE5vIGhheSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIExlY3R1cmEgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzLg0KDQorIEhpcG90ZXNpcyBhbHRlcm5hdGl2YSAoSGEpIEV4aXN0ZSB1bmEgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBMZWN0dXJhIHkgZWwgZ3JhZG8gZGUgZXN0dWRpb3MgZGUgbG9zIHBhZHJlcy4NCg0KYGBge3J9DQpwYWRyZXNfbGVjdHVyYSA8LSBhb3YocmVhZGluZ19zY29yZSB+IHBhcmVudGFsX2xldmVsX29mX2VkdWNhdGlvbiwgZGF0YSA9IGRmKSAjUmVhbGl6YW1vcyBudWVzdHJhIHBydWViYSBhbm92YQ0Kc3VtbWFyeShwYWRyZXNfbGVjdHVyYSkgI01vc3RyYW1vcyBlbCByZXN1bHRhZG8NCmBgYA0KKipMYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGVzY2FydGEgeSBzZSBhY2V0cGEgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4qKg0KKipFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgTGVjdHVyYSB5IGVsIGdyYWRvIGRlIGVzdHVkaW9zIGRlIGxvcyBwYWRyZXMqKg0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBBTk9WQSBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIGVzY3JpdHVyYSB5IGVsIGdyYWRvIGRlIGVzdHVkaW9zIGRlIGxvcyBwYWRyZXMqKioNCg0KKyBIaXDDs3Rlc2lzIG51bGEgKEgwKTogTm8gaGF5IHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgRXNjcml0dXJhIHkgZWwgZ3JhZG8gZGUgZXN0dWRpb3MgZGUgbG9zIHBhZHJlcy4NCg0KKyBIaXBvdGVzaXMgYWx0ZXJuYXRpdmEgKEhhKSBFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgRXNjcml0dXJhIHkgZWwgZ3JhZG8gZGUgZXN0dWRpb3MgZGUgbG9zIHBhZHJlcy4NCmBgYHtyfQ0KcGFkcmVzX2VzY3JpdHVyYSA8LSBhb3Yod3JpdGluZ19zY29yZSB+IHBhcmVudGFsX2xldmVsX29mX2VkdWNhdGlvbiwgZGF0YSA9IGRmKSAjUmVhbGl6YW1vcyBudWVzdHJhIHBydWViYSBhbm92YQ0Kc3VtbWFyeShwYWRyZXNfZXNjcml0dXJhKSAjbW9zdHJhbW9zIGVsIHJlc3VsdGFkbw0KYGBgDQoqKkxhIGhpcMOzdGVzaXMgbnVsYSBzZSBkZXNjYXJ0YSB5IHNlIGFjZXRwYSBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhLioqDQoqKkV4aXN0ZSB1bmEgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBFc2NyaXR1cmEgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzKioNCg0KIyMjIDIuIMK/RXhpc3RlIHVuYSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZGUgbGFzIGNhbGlmaWNhY2lvbmVzIGVudHJlIGxvcyBhbHVtbm9zIHF1ZSB0b21hcm9uIGVsIGN1cnNvIGRlIHByZXBhcmFjacOzbiB5IGxvcyBxdWUgbm8/DQoNCioqKlBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxhIG1hdGVyaWEgZGUgbWF0ZW3DoXRpY2FzIHkgZWwgZ3JhZG8gZGUgZXN0dWRpb3MgZGUgbG9zIHBhZHJlcyoqKg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSDApOiBObyBoYXkgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZSBtYXRlbcOhdGljYXMgZGUgbG9zIGFsdW1ub3MgcXVlIHRvbWFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHkgbG9zIHF1ZSBuby4NCg0KKyBIaXDDs3Rlc2lzIGFsdGVybmF0aXZhIChIYSk6IEV4aXN0ZSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIG1hdGVtw6F0aWNhcyBkZSBsb3MgYWx1bW5vcyBxdWUgdG9tYXJvbiBlbCBjdXJzbyBkZSBwcmVwYXJhY2nDs24geSBsb3MgcXVlIG5vLg0KYGBge3J9DQp0dGVzdF9tYXRlbWF0aWNhcyA8LSB0LnRlc3QobWF0aF9zY29yZSB+IHRlc3RfcHJlcGFyYXRpb25fY3Vyc2UsIGRhdGEgPSBkZiwgY29uZi5sZXZlbD0gMC45OSkgI1JlYWxpemFtb3MgbnVlc3RyYSBwcnVlYmEgdGVzdA0KdHRlc3RfbWF0ZW1hdGljYXMgI21vc3RyYW1vcyBlbCByZXN1bHRhZG8NCmBgYA0KKipMYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGVzY2FydGEgeSBzZSBhY2V0cGEgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4qKg0KKipFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgTWF0ZW3DoXRpY2FzIGNvbiBsb3MgYWx1bW5vcyBxdWUgY29tcGxlcmFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuKioNCg0KKioqUHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSBldmFsdWFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbGEgbWF0ZXJpYSBkZSBlc2NyaXR1cmEgeSBlbCBncmFkbyBkZSBlc3R1ZGlvcyBkZSBsb3MgcGFkcmVzKioqDQoNCisgSGlww7N0ZXNpcyBudWxhIChIMCk6IE5vIGhheSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxlY3R1cmEgZGUgbG9zIGFsdW1ub3MgcXVlIHRvbWFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHkgbG9zIHF1ZSBuby4NCg0KKyBIaXDDs3Rlc2lzIGFsdGVybmF0aXZhIChIYSk6IEV4aXN0ZSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxlY3R1cmEgZGUgbG9zIGFsdW1ub3MgcXVlIHRvbWFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHkgbG9zIHF1ZSBuby4NCg0KYGBge3J9DQp0dGVzdF9sZWN0dXJhIDwtIHQudGVzdChyZWFkaW5nX3Njb3JlIH4gdGVzdF9wcmVwYXJhdGlvbl9jdXJzZSwgZGF0YSA9IGRmLCBjb25mLmxldmVsPSAwLjk5KSAjUmVhbGl6YW1vcyBudWVzdHJhIHBydWViYSB0ZXN0DQp0dGVzdF9sZWN0dXJhICNtb3N0cmFtb3MgZWwgcmVzdWx0YWRvDQpgYGANCioqTGEgaGlww7N0ZXNpcyBudWxhIHNlIGRlc2NhcnRhIHkgc2UgYWNldHBhIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuKioNCioqRXhpc3RlIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIGxlY3R1cmEgY29uIGxvcyBhbHVtbm9zIHF1ZSBjb21wbGVyYXJvbiBlbCBjdXJzbyBkZSBwcmVwYXJhY2nDs24qKg0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIGVzY3JpdHVyYSB5IGVsIGdyYWRvIGRlIGVzdHVkaW9zIGRlIGxvcyBwYWRyZXMqKioNCg0KKyBIaXDDs3Rlc2lzIG51bGEgKEgwKTogTm8gaGF5IGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBlbiBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgZXNjcml0dXJhIGRlIGxvcyBhbHVtbm9zIHF1ZSB0b21hcm9uIGVsIGN1cnNvIGRlIHByZXBhcmFjacOzbiB5IGxvcyBxdWUgbm8uDQoNCisgSGlww7N0ZXNpcyBhbHRlcm5hdGl2YSAoSGEpOiBFeGlzdGUgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZSBlc2NyaXR1cmEgZGUgbG9zIGFsdW1ub3MgcXVlIHRvbWFyb24gZWwgY3Vyc28gZGUgcHJlcGFyYWNpw7NuIHkgbG9zIHF1ZSBuby4NCg0KYGBge3J9DQp0dGVzdF9lc2NyaXR1cmEgPC0gdC50ZXN0KHdyaXRpbmdfc2NvcmUgfiB0ZXN0X3ByZXBhcmF0aW9uX2N1cnNlLCBkYXRhID0gZGYsIGNvbmYubGV2ZWw9IDAuOTkpICNSZWFsaXphbW9zIG51ZXN0cmEgcHJ1ZWJhIHRlc3QNCnR0ZXN0X2VzY3JpdHVyYSAjbW9zdHJhbW9zIGVsIHJlc3VsdGFkbw0KYGBgDQoqKkxhIGhpcMOzdGVzaXMgbnVsYSBzZSBkZXNjYXJ0YSB5IHNlIGFjZXRwYSBsYSBoaXDDs3Rlc2lzIGFsdGVybmF0aXZhLioqDQoqKkV4aXN0ZSB1bmEgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBlc2NyaXR1cmEgY29uIGxvcyBhbHVtbm9zIHF1ZSBjb21wbGVyYXJvbiBlbCBjdXJzbyBkZSBwcmVwYXJhY2nDs24qKg0KDQojIyMgMy4gwr9FeGlzdGUgdW5hIHJlbGFjacOzbiBlbiBlbCBkZXNlbXBlw7FvcyBkZSBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbG9zIGFsdW1ub3MgZWwgdGlwbyBkZSBsdW5jaD8NCiANCioqKlBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxhIG1hdGVyaWEgZGUgbWF0ZW1hdGljYXMgeSBlbCB0aXBvIGRlIGx1bmNoKioqDQoNCisgSGlww7N0ZXNpcyBudWxhIChIMCk6IE5vIGhheSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIG1hdGVtw6F0aWNhcyBlbnRyZSBsb3MgdGlwb3MgZGUgbHVuY2guDQoNCisgSGlww7N0ZXNpcyBudWxhIChIYSk6IEV4aXN0ZSBkaWZlcmVuY2lhIHNpZ25pZmljYXRpdmEgZW4gbGFzIGNhbGlmaWNhY2lvbmVzIGRlIG1hdGVtw6F0aWNhcyBlbnRyZSBsb3MgdGlwb3MgZGUgbHVuY2guDQpgYGB7cn0NCnJlc3VsdGFkb190dGVzdCA8LSB0LnRlc3QobWF0aF9zY29yZSB+IGx1bmNoLCBkYXRhID0gZGYsIGNvbmYubGV2ZWw9IDAuOTkpDQpyZXN1bHRhZG9fdHRlc3QNCmBgYA0KKipMYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGVzY2FydGEgeSBzZSBhY2V0cGEgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4qKg0KKipFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgbWF0ZW3DoXRpY2FzIGNvbiBlbCB0aXBvIGRlIGx1bmNoKioNCg0KIyMjIERlbnNpZGFkIGRlIGNhbGlmaWNhY2lvbmVzIGRlIG1hdGVtw6F0aWNhcyBjb24gZWwgdGlwbyBkZSBsdW5jaA0KDQpgYGB7cn0NCiMgR3LDoWZpY28gZGUgRGVuc2lkYWQgcGFyYSBDYWxpZmljYWNpb25lcyBkZSBNYXRlbcOhdGljYXMNCmdncGxvdChkZiwgYWVzKHggPSBtYXRoX3Njb3JlLCBmaWxsID0gbHVuY2gpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpZGFkIGRlIENhbGlmaWNhY2lvbmVzIGRlIE1hdGVtw6F0aWNhcyIsDQogICAgICAgeCA9ICJDYWxpZmljYWNpw7NuIGRlIE1hdGVtw6F0aWNhcyIsIHkgPSAiRGVuc2lkYWQiKQ0KYGBgDQoNCioqKlBydWViYSBkZSBoaXDDs3Rlc2lzIHBhcmEgZXZhbHVhciBsYSByZWxhY2nDs24gZW50cmUgbGFzIGNhbGlmaWNhY2lvbmVzIGRlIGxhIG1hdGVyaWEgZGUgZXNjcml0dXJhIHkgZWwgdGlwbyBkZSBsdW5jaCoqKg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSDApOiBObyBoYXkgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZSBlc2NyaXR1cmEgZW50cmUgbG9zIHRpcG9zIGRlIGx1bmNoLg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSGEpOiBFeGlzdGUgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZSBlc2NyaXR1cmEgZW50cmUgbG9zIHRpcG9zIGRlIGx1bmNoLg0KDQpgYGB7cn0NCnJlc3VsdGFkb190dGVzdCA8LSB0LnRlc3Qod3JpdGluZ19zY29yZSB+IGx1bmNoLCBkYXRhID0gZGYsIGNvbmYubGV2ZWw9IDAuOTkpDQpyZXN1bHRhZG9fdHRlc3QNCmBgYA0KIyMjIERlbnNpZGFkIGRlIGNhbGlmaWNhY2lvbmVzIGRlIGVzY3JpdHVyYSBjb24gZWwgdGlwbyBkZSBsdW5jaA0KDQpgYGB7cn0NCiMgR3LDoWZpY28gZGUgRGVuc2lkYWQgcGFyYSBDYWxpZmljYWNpb25lcyBkZSBFc2NyaXR1cmENCmdncGxvdChkZiwgYWVzKHggPSB3cml0aW5nX3Njb3JlLCBmaWxsID0gbHVuY2gpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpZGFkIGRlIENhbGlmaWNhY2lvbmVzIGRlIEVzY3JpdHVyYSIsDQogICAgICAgeCA9ICJDYWxpZmljYWNpw7NuIGRlIEVzY3JpdHVyYSIsIHkgPSAiRGVuc2lkYWQiKQ0KYGBgDQoNCg0KKipMYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGVzY2FydGEgeSBzZSBhY2V0cGEgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4qKg0KKipFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgZXNjcml0dXJhIGNvbiBlbCB0aXBvIGRlIGx1bmNoKioNCg0KKioqUHJ1ZWJhIGRlIGhpcMOzdGVzaXMgcGFyYSBldmFsdWFyIGxhIHJlbGFjacOzbiBlbnRyZSBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbGEgbWF0ZXJpYSBkZSBsZWN0dXJhIHkgZWwgdGlwbyBkZSBsdW5jaCoqKg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSDApOiBObyBoYXkgZGlmZXJlbmNpYSBzaWduaWZpY2F0aXZhIGVuIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsZWN0dXJhIGVudHJlIGxvcyB0aXBvcyBkZSBsdW5jaC4NCg0KKyBIaXDDs3Rlc2lzIG51bGEgKEhhKTogRXhpc3RlIGRpZmVyZW5jaWEgc2lnbmlmaWNhdGl2YSBlbiBsYXMgY2FsaWZpY2FjaW9uZXMgZGUgbGVjdHVyYSBlbnRyZSBsb3MgdGlwb3MgZGUgbHVuY2guDQpgYGB7cn0NCnJlc3VsdGFkb190dGVzdCA8LSB0LnRlc3QocmVhZGluZ19zY29yZSB+IGx1bmNoLCBkYXRhID0gZGYsIGNvbmYubGV2ZWw9IDAuOTkpDQpyZXN1bHRhZG9fdHRlc3QNCmBgYA0KIyMjIERlbnNpZGFkIGRlIGNhbGlmaWNhY2lvbmVzIGRlIGxlY3R1cmEgY29uIGVsIHRpcG8gZGUgbHVuY2gNCg0KYGBge3J9DQojIEdyw6FmaWNvIGRlIERlbnNpZGFkIHBhcmEgQ2FsaWZpY2FjaW9uZXMgZGUgbGVjdHVyYQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHJlYWRpbmdfc2NvcmUsIGZpbGwgPSBsdW5jaCkpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41KSArDQogIGxhYnModGl0bGUgPSAiRGVuc2lkYWQgZGUgQ2FsaWZpY2FjaW9uZXMgZGUgTGVjdHVyYSIsDQogICAgICAgeCA9ICJDYWxpZmljYWNpw7NuIGRlIEVzcGHDsW9sIiwgeSA9ICJEZW5zaWRhZCIpDQoNCmBgYA0KDQoNCioqTGEgaGlww7N0ZXNpcyBudWxhIHNlIGRlc2NhcnRhIHkgc2UgYWNldHBhIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuKioNCioqRXhpc3RlIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIGxlY3R1cmEgY29uIGVsIHRpcG8gZGUgbHVuY2gqKg0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIGxlY3R1cmEgeSBlbCB0aXBvIGRlIGx1bmNoIHkgZWwgZ2VuZXJvKioqDQoNCisgSGlww7N0ZXNpcyBudWxhIChIMCk6IE5vIGhheSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIGxlY3R1cmEsIGVsIHRpcG8gZGUgbHVuY2ggeSBlbCBnZW5lcm8uLg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSGEpOiBFeGlzdGUgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBsZWN0dXJhLCBlbCB0aXBvIGRlIGx1bmNoIHkgZWwgZ2VuZXJvLg0KYGBge3J9DQpyZXN1bHRhZG9fYW5vdmEgPC0gYW92KHJlYWRpbmdfc2NvcmUgfiBsdW5jaCArIGdlbmRlciwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShyZXN1bHRhZG9fYW5vdmEpDQpgYGANCioqTGEgaGlww7N0ZXNpcyBudWxhIHNlIGRlc2NhcnRhIHkgc2UgYWNldHBhIGxhIGhpcMOzdGVzaXMgYWx0ZXJuYXRpdmEuKioNCioqRXhpc3RlIHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBsYSBjYWxpZmljYWNpw7NuIGRlIGxlY3R1cmEgY29uIGVsIHRpcG8gZGUgbHVuY2ggeSBlbCBnZW5lcm8qKg0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBBTk9WQSBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIGxlY3R1cmEgeSBlbCB0aXBvIGRlIGx1bmNoIHkgIGVsIGN1cnNvIGRlIHByZXBhcmFjaW9uLioqKg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSDApOiBObyBoYXkgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBsZWN0dXJhLCBlbCB0aXBvIGRlIGx1bmNoIHkgY3Vyc28gZGUgcHJlcGFyYWNpb24uLg0KDQorIEhpcMOzdGVzaXMgbnVsYSAoSGEpOiBFeGlzdGUgcmVsYWNpw7NuIHNpZ25pZmljYXRpdmEgZW50cmUgbGEgY2FsaWZpY2FjacOzbiBkZSBsZWN0dXJhLCBlbCB0aXBvIGRlIGx1bmNoIHkgZWwgY3Vyc28gZGUgcHJlcGFyYWNpb24uDQoNCmBgYHtyfQ0KcmVzdWx0YWRvX2Fub3ZhIDwtIGFvdihyZWFkaW5nX3Njb3JlIH4gbHVuY2ggKyB0ZXN0X3ByZXBhcmF0aW9uX2N1cnNlLCBkYXRhID0gZGYpDQpzdW1tYXJ5KHJlc3VsdGFkb19hbm92YSkNCmBgYA0KKipMYSBoaXDDs3Rlc2lzIG51bGEgc2UgZGVzY2FydGEgeSBzZSBhY2V0cGEgbGEgaGlww7N0ZXNpcyBhbHRlcm5hdGl2YS4qKg0KKipFeGlzdGUgdW5hIHJlbGFjacOzbiBzaWduaWZpY2F0aXZhIGVudHJlIGxhIGNhbGlmaWNhY2nDs24gZGUgbGVjdHVyYSBjb24gZWwgdGlwbyBkZSBsdW5jaCB5IGVsIGN1cnNvIGRlIHByZXBhcmFjaW9uICoqDQoNCiMgNC4gwr9JbmZsdXllIGVsIHRpcG8gZGUgcmF6YSBkZSBsb3MgYWx1bW5vcyBlbiBlbCBkZXNlbXBlw7FvIGRlIGxvcyBhbHVtbm9zPw0KDQoqKipQcnVlYmEgZGUgaGlww7N0ZXNpcyBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhcyBjYWxpZmljYWNpb25lcyBkZSBsYSBtYXRlcmlhIGRlIG1hdGVtYXRpY2FzIHkgZWwgdGlwbyBkZSBsdW5jaCoqKg0KDQojIENvbmNsdXNpb25lcw0KDQpEZSBhY3VlcmRvIGNvbiBsYXMgZGlzdGludGFzIHBydWViYXMgcmVhbGl6YWRhcyB0YW50byBsYSBwcnVlYmEuLi4uLiB5IGxhIHBydWViYSBBTk9WQSBzZSBwdWVkZSBvYnNlcnZhciBxdWUgc2kgZXhpc3RlIHVuYSBpbmZsdWVuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgbG9zIGZhY3RvcmVzOyAiTml2ZWwgZGUgZWR1Y2FjacOzbiBkZSBsb3MgcGFkcmVzIiwgIkN1cnNvIGRlIHByZXBhcmFjacOzbiBwYXJhIGVsIGV4YW1lbiIsICJUaXBvIGRlIGFsbXVlcnpvIiB5ICJSYXphIg==