Fase 1 [Descripciones Multivariantes]
1.1 Objetivos Globales
El objetivo principal de este estudio es realizar un análisis
exhaustivo de un conjunto de datos que contiene diagnósticos de
enfermedades cardiovasculares en países de Latinoamérica, utilizando
herramientas de estadística descriptiva multivariante. Este análisis se
enfocará en llevar a cabo cálculos, crear visualizaciones y realizar
interpretaciones con el propósito de comprender más profundamente la
prevalencia y distribución de estas enfermedades en la región.
Se espera que este análisis proporcione una comprensión más profunda
de la situación de las enfermedades cardiovasculares en Latinoamérica,
lo que permitirá identificar áreas con mayor prevalencia, factores
asociados y posibles disparidades regionales. Estos resultados tendrán
aplicaciones prácticas importantes, ya que podrían utilizarse para
informar políticas de salud pública y dirigir futuras investigaciones en
este ámbito.
1.2 Descripción de los
datos
Fuente del conjunto de datos
El conjunto de datos de trabajo se obtuvo totalmente de
Kaggle: https://www.kaggle.com/.Es conveniente anotar que
Kaggle es una compañía subsidiaria de Google LLC que
mantiene una comunidad online de científicos de datos y profesionales
del aprendizaje automático. Esta empresa permite a sus usuarios a
encontrar y publicar conjuntos de datos, explorar y crear modelos en un
entorno de ciencia de datos basado en la web, trabajar con otros
científicos de datos e ingenieros de aprendizaje automático y participar
en concursos para resolver desafíos de ciencia de datos
Contexto del Conjunto de Datos
El conjunto de datos proporciona información detallada sobre los
niveles de obesidad en individuos de países como México, Perú y
Colombia, abarcando un rango de edades comprendido entre los 14 y 61
años. Estos datos son especialmente valiosos ya que incluyen una amplia
variedad de hábitos alimentarios y condiciones físicas de los
encuestados. La recolección de datos se realizó a través de encuestas
anónimas vía web, lo que garantiza la confidencialidad de los
participantes y la integridad de los datos recopilados. Este contexto
del conjunto de datos proporciona una base sólida para llevar a cabo un
análisis exhaustivo de los factores relacionados con la presencia de
enfermedades cardiovasculares en estos países latinoamericanos.
Descripción del conjunto de datos
El conjunto de datos contiene 18 campos y 2000 registros. Uno de los
campos es una variable nominal dicotómica que determina si el agua es
apta para el consumo humano. De los registros; tres son de naturaleza
cualitativa, que brindan la ubicación espacial donde se levantó el
resgistro; el resto son numéricos estrictamente positivos. La lista
siguiente los describe de izquierdda a derecha, como aparecen en el
conjunto de datos que los contiene. Se establece para cada campo: tipo
de variable y escala de medición con base en la nomenclatura
(tipo_de_variable::escala_de_medición[ordenamiento]):
-SEXO: Cualitativa[Nominal]: Esta variable registra
el sexo de cada individuo en el conjunto de datos. Se representa
mediante dos categorías:
• M: Masculino • F: Femenino.
-EDAD Cuantitativa[razón]: Esta variable registra la
edad de cada individuo en el conjunto de datos. Se expresa en años y
abarca un rango que va desde los 14 hasta los 61 años.
-ALTURA Cuantitativa[razón]: Esta variable registra
la altura del individuo en el conjunto de datos. Se expresa en metros y
representa la medida desde la cabeza hasta los pies de cada
individuo.
-PESO Cuantitativa[razón]: Esta variable registra el
peso del individuo en el conjunto de datos. Se expresa en kilogramos y
representa la masa corporal de cada individuo.
-HISTORIAL_FAMILIAR_SOBREPESO Cualitativa[Nominal]:
Esta variable registra si el individuo tiene antecedentes familiares de
sobrepeso. Se representa mediante dos categorías:
• SI: Individuos que tienen familiares diagnosticados con sobrepeso.
• NO: Individuos que no tienen familiares diagnosticados con
sobrepeso.
-FAVC Cualitativa[Nominal]: Esta variable registra
si el individuo tiene un consumo frecuente de alimentos ricos en
calorías. Se representa mediante dos categorías:
• SI: Individuos que tienen un consumo frecuente de alimentos ricos
en calorías. • NO: Individuos que no tienen un consumo frecuente de
alimentos ricos en calorías.
-FCVCCualitativo[Ordinal]: Esta variable registra la
frecuencia con la que cada individuo consume vegetales en un día típico.
Se representa mediante tres categorías numéricas:
• 1: Indica que el individuo consume vegetales una vez al día. • 2:
Indica que el individuo consume vegetales dos veces al día. • 3: Indica
que el individuo consume vegetales tres o más veces al día.
-NCP Cualitativa[Ordinal]: Esta variable registra el
número de comidas principales que el individuo consume en un día típico.
Se representa mediante cuatro categorías numéricas:
• 1: Indica que el individuo tiene una comida principal al día. • 2:
Indica que el individuo tiene dos comidas principales al día. • 3:
Indica que el individuo tiene tres comidas principales al día. • 4:
Indica que el individuo tiene cuatro o más comidas principales al
día.
-CAEC Cualitativa[Ordinal]: Esta variable registra
el consumo de alimentos entre comidas de cada individuo. Se representa
mediante cuatro categorías:
• ALGUNAS VECES • SIEMPRE • FRECUENTEMENTE • NO
-FUMA Cualitativa[Nominal]: Esta variable registra
si el individuo fuma o no. Se representa mediante dos categorías:
• SI: Indica que el individuo fuma. • NO: Indica que el individuo no
fuma.
-H2O Cualitativa[Ordinal]: Esta variable registra la
cantidad de agua que el individuo consume en un día típico. Se
representa mediante tres categorías numéricas:
• 1: Indica que el individuo consume 1 litro de agua al día. • 2:
Indica que el individuo consume 2 litros de agua al día. • 3: Indica que
el individuo consume 3 o más litros de agua al día.
-SCC Cualitativa[Nominal]: Esta variable registra si
el individuo monitorea o no su consumo de calorías. Se representa
mediante dos categorías:
• SI: Indica que el individuo monitorea su consumo de calorías. • NO:
Indica que el individuo no monitorea su consumo de calorías.
-FAF Cualitativa[Ordinal]: Esta variable registra la
frecuencia de actividad física que cada individuo realiza en un día
típico, medida en horas por día. Se representa mediante cuatro
categorías numéricas:
• 0: Indica que el individuo no realiza actividad física en el día. •
1: Indica que el individuo realiza actividad física durante una hora al
día. • 2: Indica que el individuo realiza actividad física durante dos
horas al día. • 3: Indica que el individuo realiza actividad física
durante tres o más horas al día.
-TUE Cualitativa[Ordinal]: Esta variable registra el
tiempo de uso de dispositivos tecnológicos de cada individuo. Se
representa mediante tres categorías numéricas:
• Frecuentemente • Siempre • Nunca
-CALC Cualitativa[Ordinal]: Esta variable registra
el consumo de alcohol de cada individuo. Se representa mediante las
siguientes categorías:
• SI: Si consume Alcohol • NO: No consume Alcohol
-MEDIO_TRANS Cualitativa[Nominal]: Esta variable
registra el medio de transporte utilizado por el individuo. Se
representa mediante las siguientes categorías:
• TRANSPORTE_PUBLICO • CICLA • AUTOMÓVIL • CAMINANDO •
MOTOCICLETA
-IMC Cualitativa[Nominal]: Esta variable registra el
Índice de masa corporal de cada individuo Se representa mediante las
siguientes categorías:
• BAJO_PESO • PESO_NORMAL • SOBRE_PESO_NIVEL_I • SOBRE_PESO_NIVEL_II
• OBESIDAD_TIPO_I • OBESIDAD_TIPO_II
-ENFERMEDAD_CARDIACA Cualitativa[Nominal]: Esta
variable registra si el individuo padece o no de una enfermedad
cardiaca. Se representa mediante dos categorías no numéricas:
• SI: Si padece de una enfermedad cardiaca • NO: No padece de una
enfermedad cardiaca
Estructura del Conjunto de Datos
str(Obesity_Dataset)
## tibble [2,000 × 18] (S3: tbl_df/tbl/data.frame)
## $ SEXO : chr [1:2000] "F" "F" "M" "M" ...
## $ EDAD : num [1:2000] 21 21 23 27 22 29 23 22 24 22 ...
## $ ALTURA : num [1:2000] 1.62 1.52 1.8 1.8 1.78 1.62 1.5 1.64 1.78 1.72 ...
## $ PESO : num [1:2000] 64 56 77 87 89.8 53 55 53 64 68 ...
## $ HISTORIAL_FAMILIAR_SOBREPESO: chr [1:2000] "SI" "SI" "SI" "NO" ...
## $ FAVC : chr [1:2000] "NO" "NO" "NO" "NO" ...
## $ FCVC : num [1:2000] 2 3 2 3 2 2 3 2 3 2 ...
## $ NCP : num [1:2000] 3 3 3 3 1 3 3 3 3 3 ...
## $ CAEC : chr [1:2000] "ALGUNAS_VECES" "ALGUNAS_VECES" "ALGUNAS_VECES" "ALGUNAS_VECES" ...
## $ FUMAS : chr [1:2000] "NO" "SI" "NO" "NO" ...
## $ H2O : num [1:2000] 2 3 2 2 2 2 2 2 2 2 ...
## $ SCC : chr [1:2000] "NO" "SI" "NO" "NO" ...
## $ FAF : num [1:2000] 0 3 2 2 0 0 1 3 1 1 ...
## $ TUE : chr [1:2000] "SIEMPRE" "FRECUENTEMENTE" "SIEMPRE" "FRECUENTEMENTE" ...
## $ CALC : chr [1:2000] "NO" "SI" "SI" "SI" ...
## $ MEDIO_TRANS : chr [1:2000] "TRANSPORTE_PÚBLICO" "TRANSPORTE_PÚBLICO" "TRANSPORTE_PÚBLICO" "CAMINANDO" ...
## $ IMC : chr [1:2000] "PESO_NORMAL" "PESO_NORMAL" "PESO_NORMAL" "SOBRE _PESO_NIVEL_I" ...
## $ ENFERMEDAD_CARDIACA : chr [1:2000] "NO" "NO" "NO" "SI" ...
Visualización del Conjunto de Datos
Obesity_Dataset
## # A tibble: 2,000 × 18
## SEXO EDAD ALTURA PESO HISTORIAL_FAMILIAR_S…¹ FAVC FCVC NCP CAEC FUMAS
## <chr> <dbl> <dbl> <dbl> <chr> <chr> <dbl> <dbl> <chr> <chr>
## 1 F 21 1.62 64 SI NO 2 3 ALGU… NO
## 2 F 21 1.52 56 SI NO 3 3 ALGU… SI
## 3 M 23 1.8 77 SI NO 2 3 ALGU… NO
## 4 M 27 1.8 87 NO NO 3 3 ALGU… NO
## 5 M 22 1.78 89.8 NO NO 2 1 ALGU… NO
## 6 M 29 1.62 53 NO SI 2 3 ALGU… NO
## 7 F 23 1.5 55 SI SI 3 3 ALGU… NO
## 8 M 22 1.64 53 NO NO 2 3 ALGU… NO
## 9 M 24 1.78 64 SI SI 3 3 ALGU… NO
## 10 M 22 1.72 68 SI SI 2 3 ALGU… NO
## # ℹ 1,990 more rows
## # ℹ abbreviated name: ¹HISTORIAL_FAMILIAR_SOBREPESO
## # ℹ 8 more variables: H2O <dbl>, SCC <chr>, FAF <dbl>, TUE <chr>, CALC <chr>,
## # MEDIO_TRANS <chr>, IMC <chr>, ENFERMEDAD_CARDIACA <chr>
1.3 Estimaciones
Multivariadas
Como se menciona en [@AMEDAristizabal2017] la de media, varianza y
covarianza conforman un conjunto de medidas fundamentales para describir
describir el comportamiento posicional, dispersivo y correlacional de
variables aleatorias. En este sentido, el conjunto de datos de trabajo
que posee siete variables aleatorias numéricas, y que está representado
matricialmente, estima las medidas anteriores a partir de vectores y
matrices en el estudio descriptivo multivariable.
El vector de medias indica el comportamiento posicional en el sentido
de valor esperado o punto medio para cada variable en relación con todos
sus registros. La matriz de varianzas-covarianzas estima las
dispersiones, en su diagonal principal, de cada variable del conjunto de
datos respecto de cada media obtenida del vector de medias. Además, por
encima o por debajo de la diagonal principal, se estiman las covarianzas
entre las combinaciones de los posibles pares de variables del conjunto
de datos. Para más detalles se puede consultar a [@AMEDAristizabal2017].
Lo anterior, para el conjunto de datos de trabajo, se desarrolla en
la sección 3.2.
Planteamiento del Problema
Con base en el conjunto de datos descrito en la sección 2 se
calcularán e intepretarán, para las variables numéricas, el vector de
medias, la matriz de varianzas-covarianzas y la matriz de correlaciones.
Se recuerda que las variables numéricas (en escalada de medición de
razón) son: EDAD, ALTURA,
PESO,
FCVC,NCP,H2O Y
FAF
Desarrollo del Análisis
La navegación a través de las pestañas muestra el cálculo de los
siguientes objetos: Vector de Medias \(\bar x\), Matriz de
Varianzas-Covarianzas \(S\) y
Matriz de Correlaciones \(R\).•
El análisis de Vector de Medias y Boxplots nos
proporcionan una visión general de la distribución y los valores
centrales de cada variable en el conjunto de datos, lo que nos ayuda a
comprender mejor la naturaleza y la variabilidad de los datos:
•EDAD: La mediana de la edad es de aproximadamente
24.35 años. En el boxplot correspondiente, podemos ver que la
distribución de la edad parece estar centrada alrededor de este valor,
con la mayoría de las observaciones concentradas en torno a la mediana.
Hay algunas observaciones más dispersas hacia edades más altas, pero en
general, la distribución parece ser relativamente simétrica.
•ALTURA: La mediana de la altura es de
aproximadamente 1.70 metros. En el boxplot de la altura, vemos que la
distribución está centrada alrededor de este valor, con la mayoría de
las observaciones concentradas en torno a la mediana. Algunas
observaciones están dispersas tanto por encima como por debajo de la
mediana, pero la distribución parece ser relativamente simétrica.
•PESO: La mediana del peso es de aproximadamente
84.74 kilogramos. En el boxplot del peso, observamos que la distribución
está centrada alrededor de este valor, con la mayoría de las
observaciones concentradas en torno a la mediana. Hay algunas
observaciones dispersas tanto por encima como por debajo de la mediana,
pero en general, la distribución parece ser relativamente simétrica.
•FCVC: La mediana es de aproximadamente 2.39. En el
boxplot correspondiente, vemos que la distribución parece estar más
sesgada hacia valores más bajos, con la mayoría de las observaciones
concentradas en el extremo inferior de la distribución. Sin embargo,
también hay algunas observaciones dispersas hacia valores más altos,
aunque menos comunes.
•NCP: La mediana es de aproximadamente 2.67. En el
boxplot de NCP, vemos que la distribución parece estar más o menos
simétricamente distribuida alrededor de la mediana, con la mayoría de
las observaciones concentradas en torno a este valor. Hay algunas
observaciones dispersas tanto por encima como por debajo de la mediana,
pero en general, la distribución parece ser relativamente uniforme.
•H2O: La mediana es de aproximadamente 1.99 litros.
En el boxplot correspondiente, vemos que la distribución parece estar
más sesgada hacia valores más bajos, con la mayoría de las observaciones
concentradas en el extremo inferior de la distribución. Sin embargo,
también hay algunas observaciones dispersas hacia valores más altos.
•FAF: La mediana es de aproximadamente 1.03. En el
boxplot de FAF, observamos que la distribución está sesgada hacia
valores más bajos, con la mayoría de las observaciones concentradas en
el extremo inferior de la distribución. Hay algunas observaciones
dispersas hacia valores más altos, pero son menos comunes en comparación
con las observaciones de baja actividad física.
El análisis de la Matriz de Covarianza revela
importantes relaciones entre las variables estudiadas en el conjunto de
datos:
•EDAD y ALTURA: Ambas tienen
varianzas relativamente bajas, lo que indica que no varían mucho entre
los individuos en el conjunto de datos.
•PESO: Tiene una varianza mucho más alta en
comparación con la edad y la altura, lo que sugiere que el peso varía
considerablemente entre los individuos en el conjunto de datos.
•FCVC: Tiene una covarianza positiva débil con la
edad, lo que sugiere una relación leve pero positiva entre la edad y la
cantidad de verduras/frutas consumidas diariamente.
•NCP: Tiene una covarianza negativa con la edad, lo
que sugiere una relación inversa entre la edad y el número de comidas
principales al día. Esto indica que a medida que la edad aumenta, el
número de comidas principales al día tiende a disminuir.
•H2O: También tiene una covarianza negativa con la
edad, lo que sugiere una relación inversa entre la edad y la cantidad de
agua consumida diariamente. Similar al punto anterior, esto indica que a
medida que la edad aumenta, la cantidad de agua consumida tiende a
disminuir.
•FAF: Tiene una covarianza negativa fuerte con la
edad, lo que sugiere una relación inversa fuerte entre la edad y la
actividad física semanal. Esto indica que a medida que la edad aumenta,
la actividad física tiende a disminuir significativamente.
En resumen, el análisis sugiere que la edad está relacionada de
manera inversa con el número de comidas principales al día, la cantidad
de agua consumida diariamente y la actividad física, mientras que está
relacionada positivamente con la cantidad de verduras/frutas consumidas
diariamente. Además, el peso varía considerablemente entre los
individuos en el conjunto de datos.
El análisis de matriz de correlaciones proporciona
información sobre el grado y la dirección de la relación entre
diferentes variables en el conjunto de datos:
•EDAD, ALTURA y
PESO: Como era de esperar, la correlación de cada
variable consigo misma es 1, lo que indica una correlación perfecta
entre la variable y sí misma.
•FCVC: La correlación positiva débil
(aproximadamente 0.05) entre la edad y la cantidad de verduras/frutas
consumidas diariamente sugiere que, en general, a medida que las
personas envejecen, tienden a consumir ligeramente más
verduras/frutas.
•NCP: La correlación negativa débil (aproximadamente
-0.22) entre la edad y el número de comidas principales al día indica
que, en promedio, a medida que las personas envejecen, tienden a tener
un menor número de comidas principales al día.
•H2O: Similarmente, la correlación negativa débil
(aproximadamente -0.11) entre la edad y la cantidad de agua consumida
diariamente sugiere que, en promedio, a medida que las personas
envejecen, tienden a consumir ligeramente menos agua.
•FAF: La correlación negativa moderada a fuerte
(aproximadamente -0.72) entre la edad y la actividad física semanal
indica que hay una relación significativa entre estas dos variables, con
las personas mayores participando en menos actividad física semanal en
comparación con las personas más jóvenes.
En resumen,el análisis de la matriz de correlaciones refuerza las
conclusiones anteriores sobre la relación entre la edad y varios
aspectos de la salud y el estilo de vida, como los hábitos alimenticios
y la actividad física.
Matriz de Varianzas-Covarianzas
round(cov(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)]),2)
## EDAD ALTURA PESO FCVC NCP H2O FAF
## EDAD 42.22 -0.01 38.87 0.05 -0.22 -0.11 -0.72
## ALTURA -0.01 0.01 1.19 0.00 0.02 0.01 0.02
## PESO 38.87 1.19 648.63 1.77 1.70 2.90 -0.91
## FCVC 0.05 0.00 1.77 0.34 -0.01 0.02 0.02
## NCP -0.22 0.02 1.70 -0.01 0.69 0.03 0.11
## H2O -0.11 0.01 2.90 0.02 0.03 0.47 0.09
## FAF -0.72 0.02 -0.91 0.02 0.11 0.09 0.80
Matriz de Correlaciones
round(cor(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)]),2)
## EDAD ALTURA PESO FCVC NCP H2O FAF
## EDAD 1.00 -0.01 0.23 0.01 -0.04 -0.02 -0.12
## ALTURA -0.01 1.00 0.49 -0.04 0.25 0.19 0.27
## PESO 0.23 0.49 1.00 0.12 0.08 0.17 -0.04
## FCVC 0.01 -0.04 0.12 1.00 -0.01 0.04 0.04
## NCP -0.04 0.25 0.08 -0.01 1.00 0.06 0.14
## H2O -0.02 0.19 0.17 0.04 0.06 1.00 0.14
## FAF -0.12 0.27 -0.04 0.04 0.14 0.14 1.00
1.4 Gráficas
Multivariadas
En la guía de clase de [@AMEDAristizabal2017] se menciona que, en
general, los gráficos multivariados cumplen dos objetivos esenciales:
primero, ayudan a comparar el comportamiento de poblaciones de estudio
con base en variables categóricas y suavizan la comprensión de la
estructura de correlación entre varias variables. En este sentido, el
conjunto de datos de trabajo tendrá apoyo descritivo gráfico a través de
tres diagramas: uno conjunto que integra dispersión, distribución y
correlaciones; otro basado en la renderización de polígonos, y por
último, uno que recurre a las caras de Chernoff.
Planteamiento del Problema
Con base en el conjunto de datos descrito en la [sección 2] (#sec_2)
se calcularán e intepretarán, para las variables numéricas, las gráficas
multivariadas de diagrama de correlaciones, matriz de diagrama de
dispersión, diagrama de estrellas y caras de Chernoff. Se recuerda que
las variables numéricas (en escalada de medición de razón) son:
EDAD, ALTURA, PESO,
FCVC,NCP,H2O,FAF
Y TUE
Desarrollo del Análisis
La navegación a través de pestañas que nos permite RStudio mostrará
las gráficas multivariadas de: Diagrama Conjunto de Dispersión,
Distribución y Correlaciones (sin agrupación
SA y con agrupación CA; teniendo en
cuenta las 11 variables categóricas: SEXO, HISTORIAL_FAMILIAR_SOBREPESO:
HFS, FAVC, CAEC, FUMAS, SCC, TUE, CALC, MEDIO_TRANSPORTE: MT, IMC,
ENFERMEDAD_CARDIACA :EC) Diagrama de Estrellas y
Caras de Chernoff
Basándonos en la pestaña Diagrama Conjunto de Dispersión,
Distribución y Correlaciones [SA],INTERPRETAR
De manera complementaria, basándonos en las pestañas Diagrama
Conjunto de Dispersión, Distribución y Correlaciones [CA], pero
en sus versiones en grupos de las variables categóricas:
SEXO, HISTORIAL_FAMILIAR_SOBREPESO,
FAVC, CAEC,
FUMAS,SCC, TUE,
CALC, MEDIO_TRANSPORTE,
IMCy ENFERMEDAD_CARDIACA, se puede
apreciar INTERPRETAR
En base a la pestaña Diagrama de Estrellas, se puede
notar la presencia de la variable PESO en todas
estrellas con diferentes longitudes, esto sugiere que el peso es una
característica destacada y variable en tus datos. Las diferentes
longitudes indican una amplia variabilidad en los pesos entre las
personas encuestadas,ademas, la variable EDAD está
presente en casi todas las estrellas, pero su impacto en la forma de
estas es menor en comparación con otras variables, como
PESO. uno de los patrones que se observa es que a
medida que la variable PESO aumenta, la variable
H2O tiende a disminuir, y viceversa. Esto sugiere una
relación inversa entre ambas variables en los datos analizados. Es
decir, parece que hay una tendencia DE que las personas con mayor peso
tienden a consumir menos agua, y aquellas con menor peso tiendan a
consumir más.
La diversidad de características representadas por las caras
de Chernoff se ve reflejada la complejidad y la variabilidad
del conjunto de datos que estamos estudiando. La presencia de diferentes
expresiones faciales sugiere una amplia gama de perfiles demográficos y
de salud entre las personas encuestadas. Por ejemplo, las diferentes
formas de los ojos, la boca y la nariz representan variaciones en
variables como SEXO, EDAD,
ALTURA, PESO y factores de riesgo de
salud, como HISTORIAL_FAMILIAR_SOBREPESO,
FAVC y FAF. La distribución diversa de
estas características resalta la importancia de considerar múltiples
factores al estudiar la salud y el bienestar de la población
representada en los datos.
Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[SA]
ggpairs(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)])

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:SEXO]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = SEXO, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:HFS]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = HISTORIAL_FAMILIAR_SOBREPESO, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:FAVC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = FAVC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:CAEC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = CAEC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:FUMAS]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = FUMAS, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:SCC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = SCC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:TUE]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = TUE, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:CALC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = CALC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:MT]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = MEDIO_TRANS, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:IMC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = IMC, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero
## Warning in cor(x, y): the standard deviation is zero

Diagrama Conjunto de Dispersión, Distribución y
Correlaciones[CA:EC]
ggpairs(Obesity_Dataset, columns = c(2,3,4,7,8,11,13), aes(color = ENFERMEDAD_CARDIACA, alpha = 0.5), upper = list(continuous = wrap("cor", size = 2.5)))

Diagrama de Estrellas
set.seed(780728)
Obesity_Dataset_Muestreado = Obesity_Dataset[sample(1:nrow(Obesity_Dataset),23),-c(1,5,6,9,10,12,14,15,16,17,18)]
stars(Obesity_Dataset_Muestreado, len = 1, cex = 0.4, key.loc = c(10, 2), draw.segments = TRUE)

Caras de Chernoff
set.seed(780728)
Obesity_Dataset_Muestreado = Obesity_Dataset[sample(1:nrow(Obesity_Dataset),23),-c(1,5,6,9,10,12,14,15,16,17,18)]
faces(Obesity_Dataset_Muestreado)

## effect of variables:
## modified item Var
## "height of face " "EDAD"
## "width of face " "ALTURA"
## "structure of face" "PESO"
## "height of mouth " "FCVC"
## "width of mouth " "NCP"
## "smiling " "H2O"
## "height of eyes " "FAF"
## "width of eyes " "EDAD"
## "height of hair " "ALTURA"
## "width of hair " "PESO"
## "style of hair " "FCVC"
## "height of nose " "NCP"
## "width of nose " "H2O"
## "width of ear " "FAF"
## "height of ear " "EDAD"
1.5 Normalidad
Multivariada
Como menciona [@CPEMPorras2016] para
indagar o establecer el tipo de distribución multivariada de un conjunto
de datos se puede recurrir a procedimientos descriptivos, como los
gráficos, o a procedimientos inferenciales, como las pruebas
estadísticas. En este sentido, se alcanza generalización de resultados
al usar las estos últimos, si bien los primeros apoyan a las
interpretaciones.
En este apartado se contempla el uso de procedimientos inferenciales
para determinar si el conjunto de datos de trabajo, en relación con sus
variables numéricas, se distribuye normal multivariado (DNM). Las
pruebas de normalidad multivariada (PNM) a las que será sometido son:
Mardia, Henze-Zirkler, Doornik-Hansen y Royston. Para estas pruebas de
normalidad los test obedecen a un nivel de significancia \(\alpha = 0.05\) y a las hipótesis:\[H_0: \text {Las variables tienen una
DNM}\] \[H_1: \text {Las variables NO
tienen una DNM}\]
La prueba de Mardia se basa en extensiones de asimetría y curtosis,
el cuadrado de la distancia de Mahalanobis, la cantidad de variables
\(p\) por tratar y la cantidad de
registros \(n\). Además, considera que
la prueba estadística para la asimetría tiene una distribución \(\chi^2\) y la prueba estadística para la
curtosis se distirbuye aproximadamente normal. Los detalles sobre los
parámetros de las distribuciones pueden consultarse en el trabajo de
[@CPEMPorras2016].
La prueba de Henze-Zirkler se basa en la distancia funcional, dado
que si el conjunto de datos presenta una distribución normal
multivariada, el estadístico de la prueba se distribuye aproximadamente
como una lognormal, cuyos parámetros de media \(\mu\) y varianza \(\sigma^2\) pueden ser consultados en [@CPEMPorras2016].
La prueba de Doornik-Hansen está basada en la asimetría y la curtosis
de un conjunto de datos multivariados, que se transforma para garantizar
la independencia. Es considerada más potente que la prueba de
Shapiro-Wilk para casos multivariados. Su estadístico de prueba está
definido como la suma de las transformaciones al cuadrado de la
asimetría y la curtosis, y sigue, aproximadamente, una distribución
\(\chi^2\). Los detalles de la prueba
pueden ser consultados en [@OTUMNDoornik_Hansen2008].
La prueba de Royston recurre a las pruebas Shapiro-Wilk o
Shapiro-Francia para probar la normalidad multivariada. Así, si la
curtosis es mayor que 3, la prueba de Royston usa Shapiro-Francia para
distribuciones leptocurticas. Mientras que para distribuciones
platicurticas usa Shapiro-Wilk. En ella los parámetros son obtenidos por
aproximaciones polinomiales, esto puede ser consultado en [@CPEMPorras2016].
Planteamiento del Problema
Con base en el conjunto de datos descrito en la sección 2 se hará una prueba estadística de normalidad
multivariada, con un nivel de significancia \(\alpha=0.05\), para establecer si sus datos
métricos provienen de una población normal multivariada. Se recuerda que
las variables numéricas del conjunto de datos (en escalada de medición
de razón) son:EDAD, ALTURA,
PESO,
FCVC,NCP,H2O,FAFY
TUE.
Se utilizará una de las pruebas de normalidad multivariada
mencionadas anteriormente, como la prueba de Mardia, Henze-Zirkler,
Doornik-Hansen o Royston, dependiendo de la distribución de las
variables y la curtosis observada. El objetivo es evaluar si estas
variables siguen una distribución normal conjunta en el espacio
multivariado.
El procedimiento implicará calcular el estadístico de prueba
específico (por ejemplo, basado en asimetría y curtosis) y compararlo
con su distribución teórica bajo la hipótesis nula de normalidad
multivariada. Se establecerá un criterio de rechazo de la hipótesis nula
si el valor \(p-value\) asociado al
estadístico de prueba es menor que \(\alpha\).
Una conclusión positiva (no rechazo de la hipótesis nula) indicaría
evidencia de que las variables analizadas siguen una distribución normal
multivariada. Por el contrario, un rechazo de la hipótesis nula
sugeriría que al menos una de las variables no sigue una distribución
normal, lo que podría tener implicaciones en el análisis posterior de
los datos.
Desarrollo del Análisis
La exploración a través de las diferentes pruebas de normalidad
multivariada indica que el conjunto de datos, considerando sus variables
numéricas, no sigue una distribución normal multivariada. Aquí están los
hallazgos clave de cada prueba:
Prueba de Mardia:Después de realizar un análisis
exhaustivo de los resultados obtenidos, se destaca que los valores \(p\) asociados con las pruebas de asimetría
(Skewness) y curtosis (Kurtosis) son claramente inferiores al nivel de
significancia predeterminado de \(\alpha =
0.05\). Este hallazgo revela una discrepancia significativa entre
las distribuciones observadas y la hipótesis de normalidad multivariante
propuesta para las variables examinadas en el conjunto de datos.
Prueba de Henze-Zirkler:Basándonos en los resultados
de la Prueba de Henze-Zirkler, observamos que el valor \(p\) asociado es menor, lo que indica que es
significativamente menor que el nivel de significancia de \(\alpha = 0.05\). Este resultado nos lleva a
concluir que no hay suficiente evidencia para respaldar la hipótesis de
normalidad multivariante para las variables del conjunto de datos segun
la prueba.
Prueba de Doornik-Hansen:Basándonos en los
resultados de la Prueba de Doornik-Hansen, donde se obtuvo un valor
\(p\) menor al nivel de significancia
de \(\alpha = 0.05\), se evidencia una
discrepancia significativa con respecto a la hipótesis de normalidad
multivariante para las variables examinadas en el conjunto de datos.
Prueba de Royston: Después de realizar un análisis
de los resultados de la prueba de normalidad multivariada de Royston
indica una falta significativa de normalidad multivariada, por lo tanto,
se rechaza la hipótesis nula de normalidad para todas las variables,
incluyendo EDAD, ALTURA, PESO, FCVC, NCP, H2O y FAF, ya que el valor de
\(p\) de la prueba es inferior al nivel
de significancia de \(\alpha = 0.05\).
Se asume que los datos pueden no ser adecuados para técnicas
estadísticas que asumen normalidad.
En resumen los resultados de las pruebas de normalidad multivariante,
incluyendo la Prueba de Mardia, la Prueba de Henze-Zirkler, la Prueba de
Doornik-Hansen y la Prueba de Royston, indican una falta de evidencia
para respaldar la hipótesis de normalidad en los datos. Esto sugiere que
las variables analizadas no siguen una distribución multivariante
normal, lo que podría comprometer la validez de los análisis
estadísticos posteriores que asumen normalidad. Esta falta de normalidad
multivariante resalta la importancia de interpretar los resultados
subsiguientes con precaución.
PNM Mardia
mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="mardia")
## $multivariateNormality
## Test Statistic p value Result
## 1 Mardia Skewness 2254.11905818491 0 NO
## 2 Mardia Kurtosis -2.57805049523411 0.00993594774014772 NO
## 3 MVN <NA> <NA> NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Anderson-Darling EDAD 81.2363 <0.001 NO
## 2 Anderson-Darling ALTURA 4.1077 <0.001 NO
## 3 Anderson-Darling PESO 12.8635 <0.001 NO
## 4 Anderson-Darling FCVC 254.3557 <0.001 NO
## 5 Anderson-Darling NCP 300.7671 <0.001 NO
## 6 Anderson-Darling H2O 175.0430 <0.001 NO
## 7 Anderson-Darling FAF 119.4207 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## EDAD 2000 24.352500 6.49748816 23.000000 14.00 61.00 20.00 26.000000
## ALTURA 2000 1.702794 0.09467057 1.701994 1.45 1.98 1.63 1.770625
## PESO 2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC 2000 2.391500 0.58343633 2.000000 1.00 3.00 2.00 3.000000
## NCP 2000 2.670500 0.82841589 3.000000 1.00 4.00 3.00 3.000000
## H2O 2000 1.997500 0.68390614 2.000000 1.00 3.00 2.00 2.000000
## FAF 2000 1.029000 0.89641552 1.000000 0.00 3.00 0.00 2.000000
## Skew Kurtosis
## EDAD 1.490467061 2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO 0.317450528 -0.5932652
## FCVC -0.342917405 -0.7235588
## NCP -0.991495771 0.1614442
## H2O 0.003145596 -0.8630781
## FAF 0.438831169 -0.7121633
PNM Henze-Zirkler
mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="hz")
## $multivariateNormality
## Test HZ p value MVN
## 1 Henze-Zirkler 9.579415 0 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Anderson-Darling EDAD 81.2363 <0.001 NO
## 2 Anderson-Darling ALTURA 4.1077 <0.001 NO
## 3 Anderson-Darling PESO 12.8635 <0.001 NO
## 4 Anderson-Darling FCVC 254.3557 <0.001 NO
## 5 Anderson-Darling NCP 300.7671 <0.001 NO
## 6 Anderson-Darling H2O 175.0430 <0.001 NO
## 7 Anderson-Darling FAF 119.4207 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## EDAD 2000 24.352500 6.49748816 23.000000 14.00 61.00 20.00 26.000000
## ALTURA 2000 1.702794 0.09467057 1.701994 1.45 1.98 1.63 1.770625
## PESO 2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC 2000 2.391500 0.58343633 2.000000 1.00 3.00 2.00 3.000000
## NCP 2000 2.670500 0.82841589 3.000000 1.00 4.00 3.00 3.000000
## H2O 2000 1.997500 0.68390614 2.000000 1.00 3.00 2.00 2.000000
## FAF 2000 1.029000 0.89641552 1.000000 0.00 3.00 0.00 2.000000
## Skew Kurtosis
## EDAD 1.490467061 2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO 0.317450528 -0.5932652
## FCVC -0.342917405 -0.7235588
## NCP -0.991495771 0.1614442
## H2O 0.003145596 -0.8630781
## FAF 0.438831169 -0.7121633
PNM Doornik-Hansen
mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="dh")
## $multivariateNormality
## Test E df p value MVN
## 1 Doornik-Hansen 17404.04 14 0 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Anderson-Darling EDAD 81.2363 <0.001 NO
## 2 Anderson-Darling ALTURA 4.1077 <0.001 NO
## 3 Anderson-Darling PESO 12.8635 <0.001 NO
## 4 Anderson-Darling FCVC 254.3557 <0.001 NO
## 5 Anderson-Darling NCP 300.7671 <0.001 NO
## 6 Anderson-Darling H2O 175.0430 <0.001 NO
## 7 Anderson-Darling FAF 119.4207 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## EDAD 2000 24.352500 6.49748816 23.000000 14.00 61.00 20.00 26.000000
## ALTURA 2000 1.702794 0.09467057 1.701994 1.45 1.98 1.63 1.770625
## PESO 2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC 2000 2.391500 0.58343633 2.000000 1.00 3.00 2.00 3.000000
## NCP 2000 2.670500 0.82841589 3.000000 1.00 4.00 3.00 3.000000
## H2O 2000 1.997500 0.68390614 2.000000 1.00 3.00 2.00 2.000000
## FAF 2000 1.029000 0.89641552 1.000000 0.00 3.00 0.00 2.000000
## Skew Kurtosis
## EDAD 1.490467061 2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO 0.317450528 -0.5932652
## FCVC -0.342917405 -0.7235588
## NCP -0.991495771 0.1614442
## H2O 0.003145596 -0.8630781
## FAF 0.438831169 -0.7121633
PNM ROYSTON
mvn(Obesity_Dataset[,-c(1,5,6,9,10,12,14,15,16,17,18)], mvnTest="royston")
## $multivariateNormality
## Test H p value MVN
## 1 Royston 1087.789 1.410348e-230 NO
##
## $univariateNormality
## Test Variable Statistic p value Normality
## 1 Anderson-Darling EDAD 81.2363 <0.001 NO
## 2 Anderson-Darling ALTURA 4.1077 <0.001 NO
## 3 Anderson-Darling PESO 12.8635 <0.001 NO
## 4 Anderson-Darling FCVC 254.3557 <0.001 NO
## 5 Anderson-Darling NCP 300.7671 <0.001 NO
## 6 Anderson-Darling H2O 175.0430 <0.001 NO
## 7 Anderson-Darling FAF 119.4207 <0.001 NO
##
## $Descriptives
## n Mean Std.Dev Median Min Max 25th 75th
## EDAD 2000 24.352500 6.49748816 23.000000 14.00 61.00 20.00 26.000000
## ALTURA 2000 1.702794 0.09467057 1.701994 1.45 1.98 1.63 1.770625
## PESO 2000 84.741886 25.46828311 82.000000 39.00 173.00 65.00 104.974220
## FCVC 2000 2.391500 0.58343633 2.000000 1.00 3.00 2.00 3.000000
## NCP 2000 2.670500 0.82841589 3.000000 1.00 4.00 3.00 3.000000
## H2O 2000 1.997500 0.68390614 2.000000 1.00 3.00 2.00 2.000000
## FAF 2000 1.029000 0.89641552 1.000000 0.00 3.00 0.00 2.000000
## Skew Kurtosis
## EDAD 1.490467061 2.5553126
## ALTURA -0.040133674 -0.5936325
## PESO 0.317450528 -0.5932652
## FCVC -0.342917405 -0.7235588
## NCP -0.991495771 0.1614442
## H2O 0.003145596 -0.8630781
## FAF 0.438831169 -0.7121633
##Fase 2 [Componentes Principales]
###2.1. Objetivos ###2.2. Selección de Componentes ###2.3. Calidad de
Representación ###2.4. Contribuciones ###2.5. Interpretación de
Componentes
##Fase 3 [Correspondencias]
###3.1. Objetivos ###3.1. Correspondencias Simples ###3.2.
Correspondencias Múltiples
##Fase 4 [Análisis de Regresión]
###4.1. Objetivos ###4.1. Regresión Lineal Simple ###4.2. Regresión
Lineal Múltiple ###4.3. Regresión Logística
LS0tDQp0aXRsZTogPGNlbnRlcj4gIkVzdHVkaW8gRGVzY3JpcHRpdm8gTXVsdGl2YXJpYW50ZSBiYXNhZG8gZW4gdW4gQ29uanVudG8gZGUgRGF0b3MgcXVlIHJlZ2lzdHJhIERpYWduw7NzdGljb3MgZGUgRW5mZXJtZWRhZGVzIENhcmRpb3Zhc2N1bGFyZXMgZW4gcGFpc2VzIGRlIExhdGlub2FtZXJpY2EiPC9jZW50ZXI+DQphdXRob3I6ICJQb3I6IEc3OjprZXZpbi5zYW50aWFnby5jcnV6OjplbWVyc29uLnphc2lwYTo6YXJpYWRuYS52aWxsYTo6QGNvcnJlb3VuaXZhbGxlLmVkdS5jbyINCmRhdGU6ICIyOS0wNC0yMDI0Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCiAgICB0aGVtZTogdW5pdGVkDQotLS0NCjwhLS0gQ29uZmlndXJhY2nDs24gR2xvYmFsIGRlIFIgLS0+DQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkocmVhZHIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KEdHYWxseSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoYW5kcmV3cykNCmxpYnJhcnkodGNsdGspDQpsaWJyYXJ5KGFwbHBhY2spDQpsaWJyYXJ5KGdyYXBoaWNzKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoTVZOKQ0KbGlicmFyeShyZXNoYXBlMikNCmxpYnJhcnkoRmFjdG9NaW5lUikNCmxpYnJhcnkoZmFjdG9leHRyYSkNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KEZhY3RvQ2xhc3MpDQpsaWJyYXJ5KGNsdXN0ZXIpDQpsaWJyYXJ5KGRlbmRleHRlbmQpDQpsaWJyYXJ5KG1hZ3JpdHRyKQ0KbGlicmFyeShOYkNsdXN0KQ0KDQoNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCg0KT2Jlc2l0eV9EYXRhc2V0IDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2FyaWFkL0Rvd25sb2Fkcy9EQVRPU19PQkVTSURBRF9HNy54bHN4IikNClZpZXcoT2Jlc2l0eV9EYXRhc2V0KQ0KDQpgYGANCg0KIyBGYXNlIDEgW0Rlc2NyaXBjaW9uZXMgTXVsdGl2YXJpYW50ZXNdDQoNCiMjICoqMS4xIE9iamV0aXZvcyBHbG9iYWxlcyoqDQoNCkVsIG9iamV0aXZvIHByaW5jaXBhbCBkZSBlc3RlIGVzdHVkaW8gZXMgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGV4aGF1c3Rpdm8gZGUgdW4gY29uanVudG8gZGUgZGF0b3MgcXVlIGNvbnRpZW5lIGRpYWduw7NzdGljb3MgZGUgZW5mZXJtZWRhZGVzIGNhcmRpb3Zhc2N1bGFyZXMgZW4gcGHDrXNlcyBkZSBMYXRpbm9hbcOpcmljYSwgdXRpbGl6YW5kbyBoZXJyYW1pZW50YXMgZGUgZXN0YWTDrXN0aWNhIGRlc2NyaXB0aXZhIG11bHRpdmFyaWFudGUuIEVzdGUgYW7DoWxpc2lzIHNlIGVuZm9jYXLDoSBlbiBsbGV2YXIgYSBjYWJvIGPDoWxjdWxvcywgY3JlYXIgdmlzdWFsaXphY2lvbmVzIHkgcmVhbGl6YXIgaW50ZXJwcmV0YWNpb25lcyBjb24gZWwgcHJvcMOzc2l0byBkZSBjb21wcmVuZGVyIG3DoXMgcHJvZnVuZGFtZW50ZSBsYSBwcmV2YWxlbmNpYSB5IGRpc3RyaWJ1Y2nDs24gZGUgZXN0YXMgZW5mZXJtZWRhZGVzIGVuIGxhIHJlZ2nDs24uDQoNClNlIGVzcGVyYSBxdWUgZXN0ZSBhbsOhbGlzaXMgcHJvcG9yY2lvbmUgdW5hIGNvbXByZW5zacOzbiBtw6FzIHByb2Z1bmRhIGRlIGxhIHNpdHVhY2nDs24gZGUgbGFzIGVuZmVybWVkYWRlcyBjYXJkaW92YXNjdWxhcmVzIGVuIExhdGlub2Ftw6lyaWNhLCBsbyBxdWUgcGVybWl0aXLDoSBpZGVudGlmaWNhciDDoXJlYXMgY29uIG1heW9yIHByZXZhbGVuY2lhLCBmYWN0b3JlcyBhc29jaWFkb3MgeSBwb3NpYmxlcyBkaXNwYXJpZGFkZXMgcmVnaW9uYWxlcy4gRXN0b3MgcmVzdWx0YWRvcyB0ZW5kcsOhbiBhcGxpY2FjaW9uZXMgcHLDoWN0aWNhcyBpbXBvcnRhbnRlcywgeWEgcXVlIHBvZHLDrWFuIHV0aWxpemFyc2UgcGFyYSBpbmZvcm1hciBwb2zDrXRpY2FzIGRlIHNhbHVkIHDDumJsaWNhIHkgZGlyaWdpciBmdXR1cmFzIGludmVzdGlnYWNpb25lcyBlbiBlc3RlIMOhbWJpdG8uDQoNCiMjICoqMS4yIERlc2NyaXBjacOzbiBkZSBsb3MgZGF0b3MqKiB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpGdWVudGUgZGVsIGNvbmp1bnRvIGRlIGRhdG9zDQoNCkVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gc2Ugb2J0dXZvIHRvdGFsbWVudGUgZGUgKipLYWdnbGUqKjogPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vPi5FcyBjb252ZW5pZW50ZSBhbm90YXIgcXVlICoqS2FnZ2xlKiogZXMgdW5hIGNvbXBhw7HDrWEgc3Vic2lkaWFyaWEgZGUgR29vZ2xlIExMQyBxdWUgbWFudGllbmUgdW5hIGNvbXVuaWRhZCBvbmxpbmUgZGUgY2llbnTDrWZpY29zIGRlIGRhdG9zIHkgcHJvZmVzaW9uYWxlcyBkZWwgYXByZW5kaXphamUgYXV0b23DoXRpY28uIEVzdGEgZW1wcmVzYSBwZXJtaXRlIGEgc3VzIHVzdWFyaW9zIGEgZW5jb250cmFyIHkgcHVibGljYXIgY29uanVudG9zIGRlIGRhdG9zLCBleHBsb3JhciB5IGNyZWFyIG1vZGVsb3MgZW4gdW4gZW50b3JubyBkZSBjaWVuY2lhIGRlIGRhdG9zIGJhc2FkbyBlbiBsYSB3ZWIsIHRyYWJhamFyIGNvbiBvdHJvcyBjaWVudMOtZmljb3MgZGUgZGF0b3MgZSBpbmdlbmllcm9zIGRlIGFwcmVuZGl6YWplIGF1dG9tw6F0aWNvIHkgcGFydGljaXBhciBlbiBjb25jdXJzb3MgcGFyYSByZXNvbHZlciBkZXNhZsOtb3MgZGUgY2llbmNpYSBkZSBkYXRvcw0KDQpDb250ZXh0byBkZWwgQ29uanVudG8gZGUgRGF0b3MNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgcHJvcG9yY2lvbmEgaW5mb3JtYWNpw7NuIGRldGFsbGFkYSBzb2JyZSBsb3Mgbml2ZWxlcyBkZSBvYmVzaWRhZCBlbiBpbmRpdmlkdW9zIGRlIHBhw61zZXMgY29tbyBNw6l4aWNvLCBQZXLDuiB5IENvbG9tYmlhLCBhYmFyY2FuZG8gdW4gcmFuZ28gZGUgZWRhZGVzIGNvbXByZW5kaWRvIGVudHJlIGxvcyAxNCB5IDYxIGHDsW9zLiBFc3RvcyBkYXRvcyBzb24gZXNwZWNpYWxtZW50ZSB2YWxpb3NvcyB5YSBxdWUgaW5jbHV5ZW4gdW5hIGFtcGxpYSB2YXJpZWRhZCBkZSBow6FiaXRvcyBhbGltZW50YXJpb3MgeSBjb25kaWNpb25lcyBmw61zaWNhcyBkZSBsb3MgZW5jdWVzdGFkb3MuIExhIHJlY29sZWNjacOzbiBkZSBkYXRvcyBzZSByZWFsaXrDsyBhIHRyYXbDqXMgZGUgZW5jdWVzdGFzIGFuw7NuaW1hcyB2w61hIHdlYiwgbG8gcXVlIGdhcmFudGl6YSBsYSBjb25maWRlbmNpYWxpZGFkIGRlIGxvcyBwYXJ0aWNpcGFudGVzIHkgbGEgaW50ZWdyaWRhZCBkZSBsb3MgZGF0b3MgcmVjb3BpbGFkb3MuIEVzdGUgY29udGV4dG8gZGVsIGNvbmp1bnRvIGRlIGRhdG9zIHByb3BvcmNpb25hIHVuYSBiYXNlIHPDs2xpZGEgcGFyYSBsbGV2YXIgYSBjYWJvIHVuIGFuw6FsaXNpcyBleGhhdXN0aXZvIGRlIGxvcyBmYWN0b3JlcyByZWxhY2lvbmFkb3MgY29uIGxhIHByZXNlbmNpYSBkZSBlbmZlcm1lZGFkZXMgY2FyZGlvdmFzY3VsYXJlcyBlbiBlc3RvcyBwYcOtc2VzIGxhdGlub2FtZXJpY2Fub3MuDQoNCkRlc2NyaXBjacOzbiBkZWwgY29uanVudG8gZGUgZGF0b3MNCg0KRWwgY29uanVudG8gZGUgZGF0b3MgY29udGllbmUgMTggY2FtcG9zIHkgMjAwMCByZWdpc3Ryb3MuIFVubyBkZSBsb3MgY2FtcG9zIGVzIHVuYSB2YXJpYWJsZSBub21pbmFsIGRpY290w7NtaWNhIHF1ZSBkZXRlcm1pbmEgc2kgZWwgYWd1YSBlcyBhcHRhIHBhcmEgZWwgY29uc3VtbyBodW1hbm8uIERlIGxvcyByZWdpc3Ryb3M7IHRyZXMgc29uIGRlIG5hdHVyYWxlemEgY3VhbGl0YXRpdmEsIHF1ZSBicmluZGFuIGxhIHViaWNhY2nDs24gZXNwYWNpYWwgZG9uZGUgc2UgbGV2YW50w7MgZWwgcmVzZ2lzdHJvOyBlbCByZXN0byBzb24gbnVtw6lyaWNvcyBlc3RyaWN0YW1lbnRlIHBvc2l0aXZvcy4gTGEgbGlzdGEgc2lndWllbnRlIGxvcyBkZXNjcmliZSBkZSBpenF1aWVyZGRhIGEgZGVyZWNoYSwgY29tbyBhcGFyZWNlbiBlbiBlbCBjb25qdW50byBkZSBkYXRvcyBxdWUgbG9zIGNvbnRpZW5lLiBTZSBlc3RhYmxlY2UgcGFyYSBjYWRhIGNhbXBvOiB0aXBvIGRlIHZhcmlhYmxlIHkgZXNjYWxhIGRlIG1lZGljacOzbiBjb24gYmFzZSBlbiBsYSBub21lbmNsYXR1cmEgKHRpcG9fZGVfdmFyaWFibGU6OmVzY2FsYV9kZV9tZWRpY2nDs25bb3JkZW5hbWllbnRvXSk6DQoNCi0qKlNFWE8qKjogQ3VhbGl0YXRpdmFbTm9taW5hbF06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgc2V4byBkZSBjYWRhIGluZGl2aWR1byBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6DQoNCuKAoiBNOiBNYXNjdWxpbm8gDQrigKIgRjogRmVtZW5pbm8uIA0KDQotKipFREFEKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgbGEgZWRhZCBkZSBjYWRhIGluZGl2aWR1byBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gU2UgZXhwcmVzYSBlbiBhw7FvcyB5IGFiYXJjYSB1biByYW5nbyBxdWUgdmEgZGVzZGUgbG9zIDE0IGhhc3RhIGxvcyA2MSBhw7Fvcy4NCg0KLSoqQUxUVVJBKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgbGEgYWx0dXJhIGRlbCBpbmRpdmlkdW8gZW4gZWwgY29uanVudG8gZGUgZGF0b3MuIFNlIGV4cHJlc2EgZW4gbWV0cm9zIHkgcmVwcmVzZW50YSBsYSBtZWRpZGEgZGVzZGUgbGEgY2FiZXphIGhhc3RhIGxvcyBwaWVzIGRlIGNhZGEgaW5kaXZpZHVvLg0KDQotKipQRVNPKiogQ3VhbnRpdGF0aXZhW3JhesOzbl06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgcGVzbyBkZWwgaW5kaXZpZHVvIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLiBTZSBleHByZXNhIGVuIGtpbG9ncmFtb3MgeSByZXByZXNlbnRhIGxhIG1hc2EgY29ycG9yYWwgZGUgY2FkYSBpbmRpdmlkdW8uDQoNCi0qKkhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08qKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gdGllbmUgYW50ZWNlZGVudGVzIGZhbWlsaWFyZXMgZGUgc29icmVwZXNvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGRvcyBjYXRlZ29yw61hczogDQoNCuKAoiBTSTogSW5kaXZpZHVvcyBxdWUgdGllbmVuIGZhbWlsaWFyZXMgZGlhZ25vc3RpY2Fkb3MgY29uIHNvYnJlcGVzby4NCuKAoiBOTzogSW5kaXZpZHVvcyBxdWUgbm8gdGllbmVuIGZhbWlsaWFyZXMgZGlhZ25vc3RpY2Fkb3MgY29uIHNvYnJlcGVzby4gDQoNCi0qKkZBVkMqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gdGllbmUgdW4gY29uc3VtbyBmcmVjdWVudGUgZGUgYWxpbWVudG9zIHJpY29zIGVuIGNhbG9yw61hcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6IA0KDQrigKIgU0k6IEluZGl2aWR1b3MgcXVlIHRpZW5lbiB1biBjb25zdW1vIGZyZWN1ZW50ZSBkZSBhbGltZW50b3Mgcmljb3MgZW4gY2Fsb3LDrWFzLg0K4oCiIE5POiBJbmRpdmlkdW9zIHF1ZSBubyB0aWVuZW4gdW4gY29uc3VtbyBmcmVjdWVudGUgZGUgYWxpbWVudG9zIHJpY29zIGVuIGNhbG9yw61hcy4gDQoNCi0qKkZDVkMqKkN1YWxpdGF0aXZvW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGxhIGZyZWN1ZW5jaWEgY29uIGxhIHF1ZSBjYWRhIGluZGl2aWR1byBjb25zdW1lIHZlZ2V0YWxlcyBlbiB1biBkw61hIHTDrXBpY28uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgdHJlcyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSB2ZWdldGFsZXMgdW5hIHZleiBhbCBkw61hLg0K4oCiIDI6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgdmVnZXRhbGVzIGRvcyB2ZWNlcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgdmVnZXRhbGVzIHRyZXMgbyBtw6FzIHZlY2VzIGFsIGTDrWEuDQoNCi0qKk5DUCoqIEN1YWxpdGF0aXZhW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGVsIG7Dum1lcm8gZGUgY29taWRhcyBwcmluY2lwYWxlcyBxdWUgZWwgaW5kaXZpZHVvIGNvbnN1bWUgZW4gdW4gZMOtYSB0w61waWNvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGN1YXRybyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gdGllbmUgdW5hIGNvbWlkYSBwcmluY2lwYWwgYWwgZMOtYS4NCuKAoiAyOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byB0aWVuZSBkb3MgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHRpZW5lIHRyZXMgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0K4oCiIDQ6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHRpZW5lIGN1YXRybyBvIG3DoXMgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hLg0KDQotKipDQUVDKiogQ3VhbGl0YXRpdmFbT3JkaW5hbF06IEVzdGEgdmFyaWFibGUgcmVnaXN0cmEgZWwgY29uc3VtbyBkZSBhbGltZW50b3MgZW50cmUgY29taWRhcyBkZSBjYWRhIGluZGl2aWR1by4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBjdWF0cm8gY2F0ZWdvcsOtYXM6DQoNCuKAoglBTEdVTkFTIFZFQ0VTDQrigKIJU0lFTVBSRQ0K4oCiCUZSRUNVRU5URU1FTlRFIA0K4oCiCU5PDQoNCi0qKkZVTUEqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBzaSBlbCBpbmRpdmlkdW8gZnVtYSBvIG5vLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIGRvcyBjYXRlZ29yw61hczoNCg0K4oCiIFNJOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBmdW1hLg0K4oCiIE5POiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyBmdW1hLg0KDQotKipIMk8qKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBsYSBjYW50aWRhZCBkZSBhZ3VhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSBlbiB1biBkw61hIHTDrXBpY28uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgdHJlcyBjYXRlZ29yw61hcyBudW3DqXJpY2FzOg0KDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gY29uc3VtZSAxIGxpdHJvIGRlIGFndWEgYWwgZMOtYS4NCuKAoiAyOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBjb25zdW1lIDIgbGl0cm9zIGRlIGFndWEgYWwgZMOtYS4NCuKAoiAzOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBjb25zdW1lIDMgbyBtw6FzIGxpdHJvcyBkZSBhZ3VhIGFsIGTDrWEuDQoNCi0qKlNDQyoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIHNpIGVsIGluZGl2aWR1byBtb25pdG9yZWEgbyBubyBzdSBjb25zdW1vIGRlIGNhbG9yw61hcy4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXM6DQoNCuKAoiBTSTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gbW9uaXRvcmVhIHN1IGNvbnN1bW8gZGUgY2Fsb3LDrWFzLg0K4oCiIE5POiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyBtb25pdG9yZWEgc3UgY29uc3VtbyBkZSBjYWxvcsOtYXMuDQoNCi0qKkZBRioqIEN1YWxpdGF0aXZhW09yZGluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGxhIGZyZWN1ZW5jaWEgZGUgYWN0aXZpZGFkIGbDrXNpY2EgcXVlIGNhZGEgaW5kaXZpZHVvIHJlYWxpemEgZW4gdW4gZMOtYSB0w61waWNvLCBtZWRpZGEgZW4gaG9yYXMgcG9yIGTDrWEuIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgY3VhdHJvIGNhdGVnb3LDrWFzIG51bcOpcmljYXM6DQoNCuKAoiAwOiBJbmRpY2EgcXVlIGVsIGluZGl2aWR1byBubyByZWFsaXphIGFjdGl2aWRhZCBmw61zaWNhIGVuIGVsIGTDrWEuDQrigKIgMTogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gcmVhbGl6YSBhY3RpdmlkYWQgZsOtc2ljYSBkdXJhbnRlIHVuYSBob3JhIGFsIGTDrWEuDQrigKIgMjogSW5kaWNhIHF1ZSBlbCBpbmRpdmlkdW8gcmVhbGl6YSBhY3RpdmlkYWQgZsOtc2ljYSBkdXJhbnRlIGRvcyBob3JhcyBhbCBkw61hLg0K4oCiIDM6IEluZGljYSBxdWUgZWwgaW5kaXZpZHVvIHJlYWxpemEgYWN0aXZpZGFkIGbDrXNpY2EgZHVyYW50ZSB0cmVzIG8gbcOhcyBob3JhcyBhbCBkw61hLg0KDQotKipUVUUqKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCB0aWVtcG8gZGUgdXNvIGRlIGRpc3Bvc2l0aXZvcyB0ZWNub2zDs2dpY29zIGRlIGNhZGEgaW5kaXZpZHVvLiBTZSByZXByZXNlbnRhIG1lZGlhbnRlIHRyZXMgY2F0ZWdvcsOtYXMgbnVtw6lyaWNhczoNCg0K4oCiIEZyZWN1ZW50ZW1lbnRlDQrigKIgU2llbXByZQ0K4oCiIE51bmNhDQoNCi0qKkNBTEMqKiBDdWFsaXRhdGl2YVtPcmRpbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCBjb25zdW1vIGRlIGFsY29ob2wgZGUgY2FkYSBpbmRpdmlkdW8uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgbGFzIHNpZ3VpZW50ZXMgY2F0ZWdvcsOtYXM6DQoNCuKAoglTSTogU2kgY29uc3VtZSBBbGNvaG9sDQrigKIgTk86IE5vIGNvbnN1bWUgQWxjb2hvbA0KDQotKipNRURJT19UUkFOUyoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIGVsIG1lZGlvIGRlIHRyYW5zcG9ydGUgdXRpbGl6YWRvIHBvciBlbCBpbmRpdmlkdW8uIFNlIHJlcHJlc2VudGEgbWVkaWFudGUgbGFzIHNpZ3VpZW50ZXMgY2F0ZWdvcsOtYXM6DQoNCuKAoiBUUkFOU1BPUlRFX1BVQkxJQ08NCuKAoiBDSUNMQQ0K4oCiIEFVVE9Nw5NWSUwNCuKAoiBDQU1JTkFORE8NCuKAoiBNT1RPQ0lDTEVUQQ0KDQotKipJTUMqKiBDdWFsaXRhdGl2YVtOb21pbmFsXTogRXN0YSB2YXJpYWJsZSByZWdpc3RyYSBlbCDDjW5kaWNlIGRlIG1hc2EgY29ycG9yYWwgZGUgY2FkYSBpbmRpdmlkdW8gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBsYXMgc2lndWllbnRlcyBjYXRlZ29yw61hczoNCg0K4oCiCUJBSk9fUEVTTw0K4oCiCVBFU09fTk9STUFMDQrigKIJU09CUkVfUEVTT19OSVZFTF9JDQrigKIJU09CUkVfUEVTT19OSVZFTF9JSQ0K4oCiCU9CRVNJREFEX1RJUE9fSQ0K4oCiCU9CRVNJREFEX1RJUE9fSUkNCg0KLSoqRU5GRVJNRURBRF9DQVJESUFDQSoqIEN1YWxpdGF0aXZhW05vbWluYWxdOiBFc3RhIHZhcmlhYmxlIHJlZ2lzdHJhIHNpIGVsIGluZGl2aWR1byBwYWRlY2UgbyBubyBkZSB1bmEgZW5mZXJtZWRhZCBjYXJkaWFjYS4gU2UgcmVwcmVzZW50YSBtZWRpYW50ZSBkb3MgY2F0ZWdvcsOtYXMgbm8gbnVtw6lyaWNhczoNCg0K4oCiIFNJOiBTaSBwYWRlY2UgZGUgdW5hIGVuZmVybWVkYWQgY2FyZGlhY2ENCuKAoiBOTzogTm8gcGFkZWNlIGRlIHVuYSBlbmZlcm1lZGFkIGNhcmRpYWNhDQoNCg0KIyMjIEVzdHJ1Y3R1cmEgZGVsIENvbmp1bnRvIGRlIERhdG9zDQpgYGB7ciBFc3RydWN0dXRhX0Nvbmp1bnRvX2RlX0RhdG9zLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnN0cihPYmVzaXR5X0RhdGFzZXQpDQpgYGANCiMjIyBWaXN1YWxpemFjacOzbiBkZWwgQ29uanVudG8gZGUgRGF0b3MNCmBgYHtyIFZpc3VhbGl6YWNpb25fQ29uanVudG9fZGVfRGF0b3N9DQpPYmVzaXR5X0RhdGFzZXQNCmBgYA0KDQojIyAqKjEuMyBFc3RpbWFjaW9uZXMgTXVsdGl2YXJpYWRhcyoqIHsudGFic2V0IC50YWJzZXQtcGlsbHN9DQoNCkNvbW8gc2UgbWVuY2lvbmEgZW4gW0BBTUVEQXJpc3RpemFiYWwyMDE3XSBsYSBkZSBtZWRpYSwgdmFyaWFuemEgeSBjb3ZhcmlhbnphIGNvbmZvcm1hbiB1biBjb25qdW50byBkZSBtZWRpZGFzIGZ1bmRhbWVudGFsZXMgcGFyYSBkZXNjcmliaXIgZGVzY3JpYmlyIGVsIGNvbXBvcnRhbWllbnRvCXBvc2ljaW9uYWwsIGRpc3BlcnNpdm8geSBjb3JyZWxhY2lvbmFsIGRlCXZhcmlhYmxlcwlhbGVhdG9yaWFzLiBFbiBlc3RlIHNlbnRpZG8sIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8gcXVlIHBvc2VlIHNpZXRlIHZhcmlhYmxlcyBhbGVhdG9yaWFzIG51bcOpcmljYXMsIHkgcXVlIGVzdMOhIHJlcHJlc2VudGFkbyBtYXRyaWNpYWxtZW50ZSwgZXN0aW1hIGxhcyBtZWRpZGFzIGFudGVyaW9yZXMgYSBwYXJ0aXIgZGUgdmVjdG9yZXMgeSBtYXRyaWNlcyBlbiBlbCBlc3R1ZGlvIGRlc2NyaXB0aXZvIG11bHRpdmFyaWFibGUuDQoNCkVsIHZlY3RvciBkZSBtZWRpYXMgaW5kaWNhIGVsIGNvbXBvcnRhbWllbnRvIHBvc2ljaW9uYWwgZW4gZWwgc2VudGlkbyBkZSB2YWxvciBlc3BlcmFkbyBvIHB1bnRvIG1lZGlvIHBhcmEgY2FkYSB2YXJpYWJsZSBlbiByZWxhY2nDs24gY29uIHRvZG9zIHN1cyByZWdpc3Ryb3MuIExhIG1hdHJpeiBkZSB2YXJpYW56YXMtY292YXJpYW56YXMgZXN0aW1hIGxhcyBkaXNwZXJzaW9uZXMsIGVuIHN1IGRpYWdvbmFsIHByaW5jaXBhbCwgZGUgY2FkYSB2YXJpYWJsZSBkZWwgY29uanVudG8gZGUgZGF0b3MgcmVzcGVjdG8gZGUgY2FkYSBtZWRpYSBvYnRlbmlkYSBkZWwgdmVjdG9yIGRlIG1lZGlhcy4gQWRlbcOhcywgcG9yIGVuY2ltYSBvIHBvciBkZWJham8gZGUgbGEgZGlhZ29uYWwgcHJpbmNpcGFsLCBzZSBlc3RpbWFuIGxhcyBjb3ZhcmlhbnphcyBlbnRyZSBsYXMgY29tYmluYWNpb25lcyBkZSBsb3MgcG9zaWJsZXMgcGFyZXMgZGUgdmFyaWFibGVzIGRlbCBjb25qdW50byBkZSBkYXRvcy4gUGFyYSBtw6FzIGRldGFsbGVzIHNlIHB1ZWRlIGNvbnN1bHRhciBhIFtAQU1FREFyaXN0aXphYmFsMjAxN10uDQoNCkxvIGFudGVyaW9yLCBwYXJhIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8sIHNlIGRlc2Fycm9sbGEgZW4gbGEgW3NlY2Npw7NuIDMuMi5dKCNzZWMzXzIpDQoNClBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIHNlY2Npw7NuIDIgc2UgY2FsY3VsYXLDoW4gZSBpbnRlcHJldGFyw6FuLCBwYXJhIGxhcyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgZWwgdmVjdG9yIGRlIG1lZGlhcywgbGEgbWF0cml6IGRlIHZhcmlhbnphcy1jb3ZhcmlhbnphcyB5IGxhIG1hdHJpeiBkZSBjb3JyZWxhY2lvbmVzLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIChlbiBlc2NhbGFkYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICAqKkVEQUQqKiwgKipBTFRVUkEqKiwgKipQRVNPKiosICoqRkNWQyoqLCoqTkNQKiosKipIMk8qKiBZICoqRkFGKiogDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgbGFzIHBlc3Rhw7FhcyBtdWVzdHJhIGVsIGPDoWxjdWxvIGRlIGxvcyBzaWd1aWVudGVzIG9iamV0b3M6ICoqVmVjdG9yIGRlIE1lZGlhcyoqICRcYmFyIHgkLCAqKk1hdHJpeiBkZSBWYXJpYW56YXMtQ292YXJpYW56YXMqKiAkUyQgeSAqKk1hdHJpeiBkZSBDb3JyZWxhY2lvbmVzKiogJFIkLuKAogkNCg0KRWwgYW7DoWxpc2lzIGRlICoqVmVjdG9yIGRlIE1lZGlhcyB5IEJveHBsb3RzKiogIG5vcyBwcm9wb3JjaW9uYW4gdW5hIHZpc2nDs24gZ2VuZXJhbCBkZSBsYSBkaXN0cmlidWNpw7NuIHkgbG9zIHZhbG9yZXMgY2VudHJhbGVzIGRlIGNhZGEgdmFyaWFibGUgZW4gZWwgY29uanVudG8gZGUgZGF0b3MsIGxvIHF1ZSBub3MgYXl1ZGEgYSBjb21wcmVuZGVyIG1lam9yIGxhIG5hdHVyYWxlemEgeSBsYSB2YXJpYWJpbGlkYWQgZGUgbG9zIGRhdG9zOg0KDQrigKIqKkVEQUQqKjogTGEgbWVkaWFuYSBkZSBsYSBlZGFkIGVzIGRlIGFwcm94aW1hZGFtZW50ZSAyNC4zNSBhw7Fvcy4gRW4gZWwgYm94cGxvdCBjb3JyZXNwb25kaWVudGUsIHBvZGVtb3MgdmVyIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhIGVkYWQgcGFyZWNlIGVzdGFyIGNlbnRyYWRhIGFscmVkZWRvciBkZSBlc3RlIHZhbG9yLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIHRvcm5vIGEgbGEgbWVkaWFuYS4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBtw6FzIGRpc3BlcnNhcyBoYWNpYSBlZGFkZXMgbcOhcyBhbHRhcywgcGVybyBlbiBnZW5lcmFsLCBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBzZXIgcmVsYXRpdmFtZW50ZSBzaW3DqXRyaWNhLg0KDQrigKIqKkFMVFVSQSoqOiBMYSBtZWRpYW5hIGRlIGxhIGFsdHVyYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMS43MCBtZXRyb3MuIEVuIGVsIGJveHBsb3QgZGUgbGEgYWx0dXJhLCB2ZW1vcyBxdWUgbGEgZGlzdHJpYnVjacOzbiBlc3TDoSBjZW50cmFkYSBhbHJlZGVkb3IgZGUgZXN0ZSB2YWxvciwgY29uIGxhIG1heW9yw61hIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGNvbmNlbnRyYWRhcyBlbiB0b3JubyBhIGxhIG1lZGlhbmEuIEFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBlc3TDoW4gZGlzcGVyc2FzIHRhbnRvIHBvciBlbmNpbWEgY29tbyBwb3IgZGViYWpvIGRlIGxhIG1lZGlhbmEsIHBlcm8gbGEgZGlzdHJpYnVjacOzbiBwYXJlY2Ugc2VyIHJlbGF0aXZhbWVudGUgc2ltw6l0cmljYS4NCg0K4oCiKipQRVNPKio6IExhIG1lZGlhbmEgZGVsIHBlc28gZXMgZGUgYXByb3hpbWFkYW1lbnRlIDg0Ljc0IGtpbG9ncmFtb3MuIEVuIGVsIGJveHBsb3QgZGVsIHBlc28sIG9ic2VydmFtb3MgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gZXN0w6EgY2VudHJhZGEgYWxyZWRlZG9yIGRlIGVzdGUgdmFsb3IsIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMgb2JzZXJ2YWNpb25lcyBjb25jZW50cmFkYXMgZW4gdG9ybm8gYSBsYSBtZWRpYW5hLiBIYXkgYWxndW5hcyBvYnNlcnZhY2lvbmVzIGRpc3BlcnNhcyB0YW50byBwb3IgZW5jaW1hIGNvbW8gcG9yIGRlYmFqbyBkZSBsYSBtZWRpYW5hLCBwZXJvIGVuIGdlbmVyYWwsIGxhIGRpc3RyaWJ1Y2nDs24gcGFyZWNlIHNlciByZWxhdGl2YW1lbnRlIHNpbcOpdHJpY2EuDQoNCuKAoioqRkNWQyoqOiBMYSBtZWRpYW5hIGVzIGRlIGFwcm94aW1hZGFtZW50ZSAyLjM5LiBFbiBlbCBib3hwbG90IGNvcnJlc3BvbmRpZW50ZSwgdmVtb3MgcXVlIGxhIGRpc3RyaWJ1Y2nDs24gcGFyZWNlIGVzdGFyIG3DoXMgc2VzZ2FkYSBoYWNpYSB2YWxvcmVzIG3DoXMgYmFqb3MsIGNvbiBsYSBtYXlvcsOtYSBkZSBsYXMgb2JzZXJ2YWNpb25lcyBjb25jZW50cmFkYXMgZW4gZWwgZXh0cmVtbyBpbmZlcmlvciBkZSBsYSBkaXN0cmlidWNpw7NuLiBTaW4gZW1iYXJnbywgdGFtYmnDqW4gaGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgaGFjaWEgdmFsb3JlcyBtw6FzIGFsdG9zLCBhdW5xdWUgbWVub3MgY29tdW5lcy4NCg0K4oCiKipOQ1AqKjogTGEgbWVkaWFuYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMi42Ny4gRW4gZWwgYm94cGxvdCBkZSBOQ1AsIHZlbW9zIHF1ZSBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBlc3RhciBtw6FzIG8gbWVub3Mgc2ltw6l0cmljYW1lbnRlIGRpc3RyaWJ1aWRhIGFscmVkZWRvciBkZSBsYSBtZWRpYW5hLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIHRvcm5vIGEgZXN0ZSB2YWxvci4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgdGFudG8gcG9yIGVuY2ltYSBjb21vIHBvciBkZWJham8gZGUgbGEgbWVkaWFuYSwgcGVybyBlbiBnZW5lcmFsLCBsYSBkaXN0cmlidWNpw7NuIHBhcmVjZSBzZXIgcmVsYXRpdmFtZW50ZSB1bmlmb3JtZS4NCg0K4oCiKipIMk8qKjogTGEgbWVkaWFuYSBlcyBkZSBhcHJveGltYWRhbWVudGUgMS45OSBsaXRyb3MuIEVuIGVsIGJveHBsb3QgY29ycmVzcG9uZGllbnRlLCB2ZW1vcyBxdWUgbGEgZGlzdHJpYnVjacOzbiBwYXJlY2UgZXN0YXIgbcOhcyBzZXNnYWRhIGhhY2lhIHZhbG9yZXMgbcOhcyBiYWpvcywgY29uIGxhIG1heW9yw61hIGRlIGxhcyBvYnNlcnZhY2lvbmVzIGNvbmNlbnRyYWRhcyBlbiBlbCBleHRyZW1vIGluZmVyaW9yIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIFNpbiBlbWJhcmdvLCB0YW1iacOpbiBoYXkgYWxndW5hcyBvYnNlcnZhY2lvbmVzIGRpc3BlcnNhcyBoYWNpYSB2YWxvcmVzIG3DoXMgYWx0b3MuDQoNCuKAoioqRkFGKio6IExhIG1lZGlhbmEgZXMgZGUgYXByb3hpbWFkYW1lbnRlIDEuMDMuIEVuIGVsIGJveHBsb3QgZGUgRkFGLCBvYnNlcnZhbW9zIHF1ZSBsYSBkaXN0cmlidWNpw7NuIGVzdMOhIHNlc2dhZGEgaGFjaWEgdmFsb3JlcyBtw6FzIGJham9zLCBjb24gbGEgbWF5b3LDrWEgZGUgbGFzIG9ic2VydmFjaW9uZXMgY29uY2VudHJhZGFzIGVuIGVsIGV4dHJlbW8gaW5mZXJpb3IgZGUgbGEgZGlzdHJpYnVjacOzbi4gSGF5IGFsZ3VuYXMgb2JzZXJ2YWNpb25lcyBkaXNwZXJzYXMgaGFjaWEgdmFsb3JlcyBtw6FzIGFsdG9zLCBwZXJvIHNvbiBtZW5vcyBjb211bmVzIGVuIGNvbXBhcmFjacOzbiBjb24gbGFzIG9ic2VydmFjaW9uZXMgZGUgYmFqYSBhY3RpdmlkYWQgZsOtc2ljYS4NCg0KRWwgYW7DoWxpc2lzIGRlIGxhICoqTWF0cml6IGRlIENvdmFyaWFuemEqKiByZXZlbGEgaW1wb3J0YW50ZXMgcmVsYWNpb25lcyBlbnRyZSBsYXMgdmFyaWFibGVzIGVzdHVkaWFkYXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3M6DQoNCuKAoioqRURBRCoqIHkgKipBTFRVUkEqKjogQW1iYXMgdGllbmVuIHZhcmlhbnphcyByZWxhdGl2YW1lbnRlIGJhamFzLCBsbyBxdWUgaW5kaWNhIHF1ZSBubyB2YXLDrWFuIG11Y2hvIGVudHJlIGxvcyBpbmRpdmlkdW9zIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zLg0KDQrigKIqKlBFU08qKjogVGllbmUgdW5hIHZhcmlhbnphIG11Y2hvIG3DoXMgYWx0YSBlbiBjb21wYXJhY2nDs24gY29uIGxhIGVkYWQgeSBsYSBhbHR1cmEsIGxvIHF1ZSBzdWdpZXJlIHF1ZSBlbCBwZXNvIHZhcsOtYSBjb25zaWRlcmFibGVtZW50ZSBlbnRyZSBsb3MgaW5kaXZpZHVvcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0K4oCiKipGQ1ZDKio6IFRpZW5lIHVuYSBjb3ZhcmlhbnphIHBvc2l0aXZhIGTDqWJpbCBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBsZXZlIHBlcm8gcG9zaXRpdmEgZW50cmUgbGEgZWRhZCB5IGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlLg0KDQrigKIqKk5DUCoqOiBUaWVuZSB1bmEgY292YXJpYW56YSBuZWdhdGl2YSBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGxhIGVkYWQgeSBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYS4gRXN0byBpbmRpY2EgcXVlIGEgbWVkaWRhIHF1ZSBsYSBlZGFkIGF1bWVudGEsIGVsIG7Dum1lcm8gZGUgY29taWRhcyBwcmluY2lwYWxlcyBhbCBkw61hIHRpZW5kZSBhIGRpc21pbnVpci4NCg0K4oCiKipIMk8qKjogVGFtYmnDqW4gdGllbmUgdW5hIGNvdmFyaWFuemEgbmVnYXRpdmEgY29uIGxhIGVkYWQsIGxvIHF1ZSBzdWdpZXJlIHVuYSByZWxhY2nDs24gaW52ZXJzYSBlbnRyZSBsYSBlZGFkIHkgbGEgY2FudGlkYWQgZGUgYWd1YSBjb25zdW1pZGEgZGlhcmlhbWVudGUuIFNpbWlsYXIgYWwgcHVudG8gYW50ZXJpb3IsIGVzdG8gaW5kaWNhIHF1ZSBhIG1lZGlkYSBxdWUgbGEgZWRhZCBhdW1lbnRhLCBsYSBjYW50aWRhZCBkZSBhZ3VhIGNvbnN1bWlkYSB0aWVuZGUgYSBkaXNtaW51aXIuDQoNCuKAoioqRkFGKio6IFRpZW5lIHVuYSBjb3ZhcmlhbnphIG5lZ2F0aXZhIGZ1ZXJ0ZSBjb24gbGEgZWRhZCwgbG8gcXVlIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGZ1ZXJ0ZSBlbnRyZSBsYSBlZGFkIHkgbGEgYWN0aXZpZGFkIGbDrXNpY2Egc2VtYW5hbC4gRXN0byBpbmRpY2EgcXVlIGEgbWVkaWRhIHF1ZSBsYSBlZGFkIGF1bWVudGEsIGxhIGFjdGl2aWRhZCBmw61zaWNhIHRpZW5kZSBhIGRpc21pbnVpciBzaWduaWZpY2F0aXZhbWVudGUuDQoNCkVuIHJlc3VtZW4sIGVsIGFuw6FsaXNpcyBzdWdpZXJlIHF1ZSBsYSBlZGFkIGVzdMOhIHJlbGFjaW9uYWRhIGRlIG1hbmVyYSBpbnZlcnNhIGNvbiBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYSwgbGEgY2FudGlkYWQgZGUgYWd1YSBjb25zdW1pZGEgZGlhcmlhbWVudGUgeSBsYSBhY3RpdmlkYWQgZsOtc2ljYSwgbWllbnRyYXMgcXVlIGVzdMOhIHJlbGFjaW9uYWRhIHBvc2l0aXZhbWVudGUgY29uIGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlLiBBZGVtw6FzLCBlbCBwZXNvIHZhcsOtYSBjb25zaWRlcmFibGVtZW50ZSBlbnRyZSBsb3MgaW5kaXZpZHVvcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4NCg0KRWwgYW7DoWxpc2lzIGRlICoqbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMqKiBwcm9wb3JjaW9uYSBpbmZvcm1hY2nDs24gc29icmUgZWwgZ3JhZG8geSBsYSBkaXJlY2Npw7NuIGRlIGxhIHJlbGFjacOzbiBlbnRyZSBkaWZlcmVudGVzIHZhcmlhYmxlcyBlbiBlbCBjb25qdW50byBkZSBkYXRvczoNCg0K4oCiKipFREFEKiosICoqQUxUVVJBKiogeSAqKlBFU08qKjogQ29tbyBlcmEgZGUgZXNwZXJhciwgbGEgY29ycmVsYWNpw7NuIGRlIGNhZGEgdmFyaWFibGUgY29uc2lnbyBtaXNtYSBlcyAxLCBsbyBxdWUgaW5kaWNhIHVuYSBjb3JyZWxhY2nDs24gcGVyZmVjdGEgZW50cmUgbGEgdmFyaWFibGUgeSBzw60gbWlzbWEuDQoNCuKAoioqRkNWQyoqOiBMYSBjb3JyZWxhY2nDs24gcG9zaXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgMC4wNSkgZW50cmUgbGEgZWRhZCB5IGxhIGNhbnRpZGFkIGRlIHZlcmR1cmFzL2ZydXRhcyBjb25zdW1pZGFzIGRpYXJpYW1lbnRlIHN1Z2llcmUgcXVlLCBlbiBnZW5lcmFsLCBhIG1lZGlkYSBxdWUgbGFzIHBlcnNvbmFzIGVudmVqZWNlbiwgdGllbmRlbiBhIGNvbnN1bWlyIGxpZ2VyYW1lbnRlIG3DoXMgdmVyZHVyYXMvZnJ1dGFzLg0KDQrigKIqKk5DUCoqOiBMYSBjb3JyZWxhY2nDs24gbmVnYXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgLTAuMjIpIGVudHJlIGxhIGVkYWQgeSBlbCBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYSBpbmRpY2EgcXVlLCBlbiBwcm9tZWRpbywgYSBtZWRpZGEgcXVlIGxhcyBwZXJzb25hcyBlbnZlamVjZW4sIHRpZW5kZW4gYSB0ZW5lciB1biBtZW5vciBuw7ptZXJvIGRlIGNvbWlkYXMgcHJpbmNpcGFsZXMgYWwgZMOtYS4NCg0K4oCiKipIMk8qKjogU2ltaWxhcm1lbnRlLCBsYSBjb3JyZWxhY2nDs24gbmVnYXRpdmEgZMOpYmlsIChhcHJveGltYWRhbWVudGUgLTAuMTEpIGVudHJlIGxhIGVkYWQgeSBsYSBjYW50aWRhZCBkZSBhZ3VhIGNvbnN1bWlkYSBkaWFyaWFtZW50ZSBzdWdpZXJlIHF1ZSwgZW4gcHJvbWVkaW8sIGEgbWVkaWRhIHF1ZSBsYXMgcGVyc29uYXMgZW52ZWplY2VuLCB0aWVuZGVuIGEgY29uc3VtaXIgbGlnZXJhbWVudGUgbWVub3MgYWd1YS4NCg0K4oCiKipGQUYqKjogTGEgY29ycmVsYWNpw7NuIG5lZ2F0aXZhIG1vZGVyYWRhIGEgZnVlcnRlIChhcHJveGltYWRhbWVudGUgLTAuNzIpIGVudHJlIGxhIGVkYWQgeSBsYSBhY3RpdmlkYWQgZsOtc2ljYSBzZW1hbmFsIGluZGljYSBxdWUgaGF5IHVuYSByZWxhY2nDs24gc2lnbmlmaWNhdGl2YSBlbnRyZSBlc3RhcyBkb3MgdmFyaWFibGVzLCBjb24gbGFzIHBlcnNvbmFzIG1heW9yZXMgcGFydGljaXBhbmRvIGVuIG1lbm9zIGFjdGl2aWRhZCBmw61zaWNhIHNlbWFuYWwgZW4gY29tcGFyYWNpw7NuIGNvbiBsYXMgcGVyc29uYXMgbcOhcyBqw7N2ZW5lcy4NCg0KRW4gcmVzdW1lbixlbCBhbsOhbGlzaXMgZGUgbGEgbWF0cml6IGRlIGNvcnJlbGFjaW9uZXMgcmVmdWVyemEgbGFzIGNvbmNsdXNpb25lcyBhbnRlcmlvcmVzIHNvYnJlIGxhIHJlbGFjacOzbiBlbnRyZSBsYSBlZGFkIHkgdmFyaW9zIGFzcGVjdG9zIGRlIGxhIHNhbHVkIHkgZWwgZXN0aWxvIGRlIHZpZGEsIGNvbW8gbG9zIGjDoWJpdG9zIGFsaW1lbnRpY2lvcyB5IGxhIGFjdGl2aWRhZCBmw61zaWNhLg0KDQojIyMgVmVjdG9yIGRlIE1lZGlhcyB5IEJveHBsb3RzDQpgYGB7ciBWZWN0b3JfZGVfTWVkaWFzX3lfQm94cGxvdHMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KYXBwbHkoT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIDIsIG1lYW4pDQpPYmVzaXR5X0RhdGFzZXRfUmVkdWNpZG8gPSBPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXQ0KcGFyKG1mcm93ID0gYygxLCBuY29sKE9iZXNpdHlfRGF0YXNldF9SZWR1Y2lkbykpKQ0KaW52aXNpYmxlKGxhcHBseSgxOm5jb2woT2Jlc2l0eV9EYXRhc2V0X1JlZHVjaWRvKSwgZnVuY3Rpb24oaSkgYm94cGxvdChPYmVzaXR5X0RhdGFzZXRfUmVkdWNpZG9bLCBpXSkpKQ0KYGBgDQoNCiMjIyBNYXRyaXogZGUgVmFyaWFuemFzLUNvdmFyaWFuemFzDQpgYGB7ciBtYXRyaXpfZGVfVmFyaWFuemFzX0NvdmFyaWFuemFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvdihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSksMikNCmBgYA0KDQojIyMgTWF0cml6IGRlIENvcnJlbGFjaW9uZXMNCmBgYHtyIG1hdHJpel9kZV9Db3JyZWxhY2lvbmVzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnJvdW5kKGNvcihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSksMikNCmBgYA0KDQojIyAqKjEuNCBHcsOhZmljYXMgTXVsdGl2YXJpYWRhcyoqICB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KDQpFbiBsYSBndcOtYSBkZSBjbGFzZSBkZSBbQEFNRURBcmlzdGl6YWJhbDIwMTddIHNlIG1lbmNpb25hIHF1ZSwgZW4gZ2VuZXJhbCwgbG9zIGdyw6FmaWNvcyBtdWx0aXZhcmlhZG9zIGN1bXBsZW4gZG9zIG9iamV0aXZvcyBlc2VuY2lhbGVzOiBwcmltZXJvLCBheXVkYW4gYSBjb21wYXJhcgllbAljb21wb3J0YW1pZW50bwlkZQlwb2JsYWNpb25lcyBkZSBlc3R1ZGlvIGNvbiBiYXNlIGVuIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgeSBzdWF2aXphbiBsYSBjb21wcmVuc2nDs24gZGUgbGEgZXN0cnVjdHVyYSBkZSBjb3JyZWxhY2nDs24gZW50cmUJdmFyaWFzIHZhcmlhYmxlcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBjb25qdW50byBkZSBkYXRvcyBkZSB0cmFiYWpvIHRlbmRyw6EgYXBveW8gZGVzY3JpdGl2byBncsOhZmljbyBhIHRyYXbDqXMgZGUgdHJlcyBkaWFncmFtYXM6IHVubyBjb25qdW50byBxdWUgaW50ZWdyYSBkaXNwZXJzacOzbiwgZGlzdHJpYnVjacOzbiB5IGNvcnJlbGFjaW9uZXM7IG90cm8gYmFzYWRvIGVuIGxhIHJlbmRlcml6YWNpw7NuIGRlIHBvbMOtZ29ub3MsIHkgcG9yIMO6bHRpbW8sIHVubyBxdWUgcmVjdXJyZSBhIGxhcyBjYXJhcyBkZSBDaGVybm9mZi4NCg0KUGxhbnRlYW1pZW50byBkZWwgUHJvYmxlbWENCg0KQ29uIGJhc2UgZW4gZWwgY29uanVudG8gZGUgZGF0b3MgZGVzY3JpdG8gZW4gbGEgW3NlY2Npw7NuIDJdICgjc2VjXzIpIHNlIGNhbGN1bGFyw6FuIGUgaW50ZXByZXRhcsOhbiwgcGFyYSBsYXMgdmFyaWFibGVzIG51bcOpcmljYXMsIGxhcyBncsOhZmljYXMgbXVsdGl2YXJpYWRhcyBkZSBkaWFncmFtYSBkZSBjb3JyZWxhY2lvbmVzLCBtYXRyaXogZGUgZGlhZ3JhbWEgZGUgZGlzcGVyc2nDs24sIGRpYWdyYW1hIGRlIGVzdHJlbGxhcyB5IGNhcmFzIGRlIENoZXJub2ZmLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIChlbiBlc2NhbGFkYSBkZSBtZWRpY2nDs24gZGUgcmF6w7NuKSBzb246ICoqRURBRCoqLCAqKkFMVFVSQSoqLCAqKlBFU08qKiwgKipGQ1ZDKiosKipOQ1AqKiwqKkgyTyoqLCoqRkFGKiogWSAqKlRVRSoqDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBuYXZlZ2FjacOzbiBhIHRyYXbDqXMgZGUgcGVzdGHDsWFzIHF1ZSBub3MgcGVybWl0ZSBSU3R1ZGlvIG1vc3RyYXLDoSBsYXMgZ3LDoWZpY2FzIG11bHRpdmFyaWFkYXMgZGU6ICoqRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzKiogKHNpbiBhZ3J1cGFjacOzbiAqKlNBKiogeSBjb24gYWdydXBhY2nDs24gKipDQSoqOyB0ZW5pZW5kbyBlbiBjdWVudGEgbGFzIDExIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXM6IFNFWE8sIEhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU086IEhGUywgRkFWQywgQ0FFQywgRlVNQVMsIFNDQywgVFVFLCBDQUxDLCBNRURJT19UUkFOU1BPUlRFOiBNVCwgSU1DLCBFTkZFUk1FREFEX0NBUkRJQUNBIDpFQykgKipEaWFncmFtYSBkZSBFc3RyZWxsYXMqKiB5ICoqQ2FyYXMgZGUgQ2hlcm5vZmYqKg0KDQpCYXPDoW5kb25vcyBlbiBsYSBwZXN0YcOxYSAqKkRpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lcyBbU0FdKiosSU5URVJQUkVUQVINCg0KRGUgbWFuZXJhIGNvbXBsZW1lbnRhcmlhLCBiYXPDoW5kb25vcyBlbiBsYXMgcGVzdGHDsWFzICoqRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzIFtDQV0qKiwgcGVybyBlbiBzdXMgdmVyc2lvbmVzIGVuIGdydXBvcyBkZSBsYXMgdmFyaWFibGVzIGNhdGVnw7NyaWNhczogICoqU0VYTyoqLCAqKkhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08qKiwgKipGQVZDKiosICoqQ0FFQyoqLCAqKkZVTUFTKiosKipTQ0MqKiwgKipUVUUqKiwgKipDQUxDKiosICoqTUVESU9fVFJBTlNQT1JURSoqLCAqKklNQyoqeSAqKkVORkVSTUVEQURfQ0FSRElBQ0EqKiwgc2UgcHVlZGUgYXByZWNpYXIgSU5URVJQUkVUQVINCg0KRW4gYmFzZSBhIGxhIHBlc3Rhw7FhICoqRGlhZ3JhbWEgZGUgRXN0cmVsbGFzKiosIHNlIHB1ZWRlIG5vdGFyIGxhIHByZXNlbmNpYSBkZSBsYSB2YXJpYWJsZSAqKlBFU08qKiBlbiB0b2RhcyBlc3RyZWxsYXMgY29uIGRpZmVyZW50ZXMgbG9uZ2l0dWRlcywgZXN0byBzdWdpZXJlIHF1ZSBlbCBwZXNvIGVzIHVuYSBjYXJhY3RlcsOtc3RpY2EgZGVzdGFjYWRhIHkgdmFyaWFibGUgZW4gdHVzIGRhdG9zLiBMYXMgZGlmZXJlbnRlcyBsb25naXR1ZGVzIGluZGljYW4gdW5hIGFtcGxpYSB2YXJpYWJpbGlkYWQgZW4gbG9zIHBlc29zIGVudHJlIGxhcyBwZXJzb25hcyBlbmN1ZXN0YWRhcyxhZGVtYXMsIGxhIHZhcmlhYmxlICoqRURBRCoqIGVzdMOhIHByZXNlbnRlIGVuIGNhc2kgdG9kYXMgbGFzIGVzdHJlbGxhcywgcGVybyBzdSBpbXBhY3RvIGVuIGxhIGZvcm1hIGRlIGVzdGFzIGVzIG1lbm9yIGVuIGNvbXBhcmFjacOzbiBjb24gb3RyYXMgdmFyaWFibGVzLCBjb21vICoqUEVTTyoqLiB1bm8gZGUgbG9zIHBhdHJvbmVzIHF1ZSBzZSBvYnNlcnZhIGVzIHF1ZSBhIG1lZGlkYSBxdWUgbGEgdmFyaWFibGUgKipQRVNPKiogYXVtZW50YSwgbGEgdmFyaWFibGUgKipIMk8qKiB0aWVuZGUgYSBkaXNtaW51aXIsIHkgdmljZXZlcnNhLiBFc3RvIHN1Z2llcmUgdW5hIHJlbGFjacOzbiBpbnZlcnNhIGVudHJlIGFtYmFzIHZhcmlhYmxlcyBlbiBsb3MgZGF0b3MgYW5hbGl6YWRvcy4gRXMgZGVjaXIsIHBhcmVjZSBxdWUgaGF5IHVuYSB0ZW5kZW5jaWEgREUgcXVlIGxhcyBwZXJzb25hcyBjb24gbWF5b3IgcGVzbyB0aWVuZGVuIGEgY29uc3VtaXIgbWVub3MgYWd1YSwgeSBhcXVlbGxhcyBjb24gbWVub3IgcGVzbyB0aWVuZGFuIGEgY29uc3VtaXIgbcOhcy4gDQoNCkxhIGRpdmVyc2lkYWQgZGUgY2FyYWN0ZXLDrXN0aWNhcyByZXByZXNlbnRhZGFzIHBvciBsYXMgKipjYXJhcyBkZSBDaGVybm9mZioqIHNlIHZlIHJlZmxlamFkYSBsYSBjb21wbGVqaWRhZCB5IGxhIHZhcmlhYmlsaWRhZCBkZWwgY29uanVudG8gZGUgZGF0b3MgcXVlIGVzdGFtb3MgZXN0dWRpYW5kby4gTGEgcHJlc2VuY2lhIGRlIGRpZmVyZW50ZXMgZXhwcmVzaW9uZXMgZmFjaWFsZXMgc3VnaWVyZSB1bmEgYW1wbGlhIGdhbWEgZGUgcGVyZmlsZXMgZGVtb2dyw6FmaWNvcyB5IGRlIHNhbHVkIGVudHJlIGxhcyBwZXJzb25hcyBlbmN1ZXN0YWRhcy4gUG9yIGVqZW1wbG8sIGxhcyBkaWZlcmVudGVzIGZvcm1hcyBkZSBsb3Mgb2pvcywgbGEgYm9jYSB5IGxhIG5hcml6IHJlcHJlc2VudGFuIHZhcmlhY2lvbmVzIGVuIHZhcmlhYmxlcyBjb21vICoqU0VYTyoqLCAqKkVEQUQqKiwgKipBTFRVUkEqKiwgKipQRVNPKiogeSBmYWN0b3JlcyBkZSByaWVzZ28gZGUgc2FsdWQsIGNvbW8gKipISVNUT1JJQUxfRkFNSUxJQVJfU09CUkVQRVNPKiosICoqRkFWQyoqIHkgKipGQUYqKi4gTGEgZGlzdHJpYnVjacOzbiBkaXZlcnNhIGRlIGVzdGFzIGNhcmFjdGVyw61zdGljYXMgcmVzYWx0YSBsYSBpbXBvcnRhbmNpYSBkZSBjb25zaWRlcmFyIG3Dumx0aXBsZXMgZmFjdG9yZXMgYWwgZXN0dWRpYXIgbGEgc2FsdWQgeSBlbCBiaWVuZXN0YXIgZGUgbGEgcG9ibGFjacOzbiByZXByZXNlbnRhZGEgZW4gbG9zIGRhdG9zLg0KDQojIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzW1NBXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX1NBLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0pDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpTRVhPXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX1NFWCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gU0VYTywgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgQ29uanVudG8gZGUgRGlzcGVyc2nDs24sIERpc3RyaWJ1Y2nDs24geSBDb3JyZWxhY2lvbmVzW0NBOkhGU10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9IRlMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IEhJU1RPUklBTF9GQU1JTElBUl9TT0JSRVBFU08sIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpGQVZDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0ZBVkMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IEZBVkMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpDQUVDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0NBRUMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IENBRUMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpGVU1BU10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9GVU1BUywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gRlVNQVMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpTQ0NdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfU0NDLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBTQ0MsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpUVUVdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfVFVFLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBUVUUsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpDQUxDXQ0KYGBge3IgRGlhZ3JhbWFfQ29uanVudG9fRERDX0NBX0NBTEMsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0KZ2dwYWlycyhPYmVzaXR5X0RhdGFzZXQsIGNvbHVtbnMgPSBjKDIsMyw0LDcsOCwxMSwxMyksIGFlcyhjb2xvciA9IENBTEMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpNVF0NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9NVCwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gTUVESU9fVFJBTlMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpJTUNdDQpgYGB7ciBEaWFncmFtYV9Db25qdW50b19ERENfQ0FfSU1DLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCmdncGFpcnMoT2Jlc2l0eV9EYXRhc2V0LCBjb2x1bW5zID0gYygyLDMsNCw3LDgsMTEsMTMpLCBhZXMoY29sb3IgPSBJTUMsIGFscGhhID0gMC41KSwgdXBwZXIgPSBsaXN0KGNvbnRpbnVvdXMgPSB3cmFwKCJjb3IiLCBzaXplID0gMi41KSkpDQpgYGANCg0KIyMjIERpYWdyYW1hIENvbmp1bnRvIGRlIERpc3BlcnNpw7NuLCBEaXN0cmlidWNpw7NuIHkgQ29ycmVsYWNpb25lc1tDQTpFQ10NCmBgYHtyIERpYWdyYW1hX0Nvbmp1bnRvX0REQ19DQV9FQywgZmlnLmFsaWduID0gJ2NlbnRlcid9DQpnZ3BhaXJzKE9iZXNpdHlfRGF0YXNldCwgY29sdW1ucyA9IGMoMiwzLDQsNyw4LDExLDEzKSwgYWVzKGNvbG9yID0gRU5GRVJNRURBRF9DQVJESUFDQSwgYWxwaGEgPSAwLjUpLCB1cHBlciA9IGxpc3QoY29udGludW91cyA9IHdyYXAoImNvciIsIHNpemUgPSAyLjUpKSkNCmBgYA0KDQojIyMgRGlhZ3JhbWEgZGUgRXN0cmVsbGFzIA0KYGBge3IgZGlhZ3JhbWFfZGVfRXN0cmVsbGFzLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCnNldC5zZWVkKDc4MDcyOCkNCk9iZXNpdHlfRGF0YXNldF9NdWVzdHJlYWRvID0gT2Jlc2l0eV9EYXRhc2V0W3NhbXBsZSgxOm5yb3coT2Jlc2l0eV9EYXRhc2V0KSwyMyksLWMoMSw1LDYsOSwxMCwxMiwxNCwxNSwxNiwxNywxOCldDQpzdGFycyhPYmVzaXR5X0RhdGFzZXRfTXVlc3RyZWFkbywgbGVuID0gMSwgY2V4ID0gMC40LCBrZXkubG9jID0gYygxMCwgMiksIGRyYXcuc2VnbWVudHMgPSBUUlVFKQ0KYGBgDQoNCiMjIyBDYXJhcyBkZSBDaGVybm9mZg0KYGBge3IgY2FyYXNfZGVfQ2hlcm5vZmYsIGZpZy5hbGlnbiA9ICdjZW50ZXInfQ0Kc2V0LnNlZWQoNzgwNzI4KQ0KT2Jlc2l0eV9EYXRhc2V0X011ZXN0cmVhZG8gPSBPYmVzaXR5X0RhdGFzZXRbc2FtcGxlKDE6bnJvdyhPYmVzaXR5X0RhdGFzZXQpLDIzKSwtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0NCmZhY2VzKE9iZXNpdHlfRGF0YXNldF9NdWVzdHJlYWRvKQ0KYGBgDQoNCiMjICoqMS41IE5vcm1hbGlkYWQgTXVsdGl2YXJpYWRhKiogey50YWJzZXQgLnRhYnNldC1waWxsc30NCg0KQ29tbyBtZW5jaW9uYSBbQENQRU1Qb3JyYXMyMDE2XSBwYXJhIGluZGFnYXIgbyBlc3RhYmxlY2VyIGVsIHRpcG8gZGUgZGlzdHJpYnVjacOzbiBtdWx0aXZhcmlhZGEgZGUgdW4gY29uanVudG8gZGUgZGF0b3Mgc2UgcHVlZGUgcmVjdXJyaXIgYSBwcm9jZWRpbWllbnRvcyBkZXNjcmlwdGl2b3MsIGNvbW8gbG9zIGdyw6FmaWNvcywgbyBhIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMsIGNvbW8gbGFzIHBydWViYXMgZXN0YWTDrXN0aWNhcy4gRW4gZXN0ZSBzZW50aWRvLCBzZSBhbGNhbnphIGdlbmVyYWxpemFjacOzbiBkZSByZXN1bHRhZG9zIGFsIHVzYXIgbGFzIGVzdG9zIMO6bHRpbW9zLCBzaSBiaWVuIGxvcyBwcmltZXJvcyBhcG95YW4gYSBsYXMgaW50ZXJwcmV0YWNpb25lcy4NCg0KRW4gZXN0ZSBhcGFydGFkbyBzZSBjb250ZW1wbGEgZWwgdXNvIGRlIHByb2NlZGltaWVudG9zIGluZmVyZW5jaWFsZXMgcGFyYSBkZXRlcm1pbmFyIHNpIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIHRyYWJham8sIGVuIHJlbGFjacOzbiBjb24gc3VzIHZhcmlhYmxlcyBudW3DqXJpY2FzLCBzZSBkaXN0cmlidXllIG5vcm1hbCBtdWx0aXZhcmlhZG8gKEROTSkuIExhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIChQTk0pIGEgbGFzIHF1ZSBzZXLDoSBzb21ldGlkbyBzb246IE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4geSBSb3lzdG9uLiBQYXJhIGVzdGFzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBsb3MgdGVzdCBvYmVkZWNlbiBhIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgJFxhbHBoYSA9IDAuMDUkIHkgYSBsYXMgaGlww7N0ZXNpczokJEhfMDogXHRleHQge0xhcyB2YXJpYWJsZXMgdGllbmVuIHVuYSBETk19JCQgJCRIXzE6IFx0ZXh0IHtMYXMgdmFyaWFibGVzIE5PIHRpZW5lbiB1bmEgRE5NfSQkIA0KDQpMYSBwcnVlYmEgZGUgTWFyZGlhIHNlIGJhc2EgZW4gZXh0ZW5zaW9uZXMgZGUgYXNpbWV0csOtYSB5IGN1cnRvc2lzLCBlbCBjdWFkcmFkbyBkZSBsYSBkaXN0YW5jaWEgZGUgTWFoYWxhbm9iaXMsIGxhIGNhbnRpZGFkIGRlIHZhcmlhYmxlcyAkcCQgcG9yIHRyYXRhciB5IGxhIGNhbnRpZGFkIGRlIHJlZ2lzdHJvcyAkbiQuIEFkZW3DoXMsIGNvbnNpZGVyYSBxdWUgbGEgcHJ1ZWJhIGVzdGFkw61zdGljYSBwYXJhIGxhIGFzaW1ldHLDrWEgdGllbmUgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQgeSBsYSBwcnVlYmEgZXN0YWTDrXN0aWNhIHBhcmEgbGEgY3VydG9zaXMgc2UgZGlzdGlyYnV5ZSBhcHJveGltYWRhbWVudGUgbm9ybWFsLiBMb3MgZGV0YWxsZXMgc29icmUgbG9zIHBhcsOhbWV0cm9zIGRlIGxhcyBkaXN0cmlidWNpb25lcyBwdWVkZW4gY29uc3VsdGFyc2UgZW4gZWwgdHJhYmFqbyBkZSBbQENQRU1Qb3JyYXMyMDE2XS4NCg0KTGEgcHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIgc2UgYmFzYSBlbiBsYSBkaXN0YW5jaWEgZnVuY2lvbmFsLCBkYWRvIHF1ZSBzaSBlbCBjb25qdW50byBkZSBkYXRvcyBwcmVzZW50YSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLCBlbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHNlIGRpc3RyaWJ1eWUgYXByb3hpbWFkYW1lbnRlIGNvbW8gdW5hIGxvZ25vcm1hbCwgY3V5b3MgcGFyw6FtZXRyb3MgZGUgbWVkaWEgJFxtdSQgeSB2YXJpYW56YSAkXHNpZ21hXjIkIHB1ZWRlbiBzZXIgY29uc3VsdGFkb3MgZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNCkxhIHBydWViYSBkZSBEb29ybmlrLUhhbnNlbiBlc3TDoSBiYXNhZGEgZW4gbGEgYXNpbWV0csOtYSB5IGxhIGN1cnRvc2lzIGRlIHVuIGNvbmp1bnRvIGRlIGRhdG9zIG11bHRpdmFyaWFkb3MsIHF1ZSBzZSB0cmFuc2Zvcm1hIHBhcmEgZ2FyYW50aXphciBsYSBpbmRlcGVuZGVuY2lhLiBFcyBjb25zaWRlcmFkYSBtw6FzIHBvdGVudGUgcXVlIGxhIHBydWViYSBkZSBTaGFwaXJvLVdpbGsgcGFyYSBjYXNvcyBtdWx0aXZhcmlhZG9zLiBTdSBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzdMOhIGRlZmluaWRvIGNvbW8gbGEgc3VtYSBkZSBsYXMgdHJhbnNmb3JtYWNpb25lcyBhbCBjdWFkcmFkbyBkZSBsYSBhc2ltZXRyw61hIHkgbGEgY3VydG9zaXMsIHkgc2lndWUsIGFwcm94aW1hZGFtZW50ZSwgdW5hIGRpc3RyaWJ1Y2nDs24gJFxjaGleMiQuIExvcyBkZXRhbGxlcyBkZSBsYSBwcnVlYmEgcHVlZGVuIHNlciBjb25zdWx0YWRvcyBlbiBbQE9UVU1ORG9vcm5pa19IYW5zZW4yMDA4XS4NCg0KTGEgcHJ1ZWJhIGRlIFJveXN0b24gcmVjdXJyZSBhIGxhcyBwcnVlYmFzIFNoYXBpcm8tV2lsayBvIFNoYXBpcm8tRnJhbmNpYSBwYXJhIHByb2JhciBsYSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYS4gQXPDrSwgc2kgIGxhIGN1cnRvc2lzIGVzIG1heW9yIHF1ZSAzLCBsYSBwcnVlYmEgZGUgUm95c3RvbiB1c2EgU2hhcGlyby1GcmFuY2lhIHBhcmEgZGlzdHJpYnVjaW9uZXMgbGVwdG9jdXJ0aWNhcy4gTWllbnRyYXMgcXVlIHBhcmEgZGlzdHJpYnVjaW9uZXMgcGxhdGljdXJ0aWNhcyB1c2EgU2hhcGlyby1XaWxrLiBFbiBlbGxhIGxvcyBwYXLDoW1ldHJvcyBzb24gb2J0ZW5pZG9zIHBvciBhcHJveGltYWNpb25lcyBwb2xpbm9taWFsZXMsIGVzdG8gcHVlZGUgc2VyIGNvbnN1bHRhZG8gZW4gW0BDUEVNUG9ycmFzMjAxNl0uDQoNClBsYW50ZWFtaWVudG8gZGVsIFByb2JsZW1hDQoNCkNvbiBiYXNlIGVuIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlc2NyaXRvIGVuIGxhIFtzZWNjacOzbiAyXSgjc2VjMikgc2UgaGFyw6EgdW5hIHBydWViYSBlc3RhZMOtc3RpY2EgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEsIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhICRcYWxwaGE9MC4wNSQsIHBhcmEgZXN0YWJsZWNlciBzaSBzdXMgZGF0b3MgbcOpdHJpY29zIHByb3ZpZW5lbiBkZSB1bmEgcG9ibGFjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLiBTZSByZWN1ZXJkYSBxdWUgbGFzIHZhcmlhYmxlcyBudW3DqXJpY2FzIGRlbCBjb25qdW50byBkZSBkYXRvcyAoZW4gZXNjYWxhZGEgZGUgbWVkaWNpw7NuIGRlIHJhesOzbikgc29uOioqRURBRCoqLCAqKkFMVFVSQSoqLCAqKlBFU08qKiwgKipGQ1ZDKiosKipOQ1AqKiwqKkgyTyoqLCoqRkFGKipZICoqVFVFKiouDQoNClNlIHV0aWxpemFyw6EgdW5hIGRlIGxhcyBwcnVlYmFzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhIG1lbmNpb25hZGFzIGFudGVyaW9ybWVudGUsIGNvbW8gbGEgcHJ1ZWJhIGRlIE1hcmRpYSwgSGVuemUtWmlya2xlciwgRG9vcm5pay1IYW5zZW4gbyBSb3lzdG9uLCBkZXBlbmRpZW5kbyBkZSBsYSBkaXN0cmlidWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgeSBsYSBjdXJ0b3NpcyBvYnNlcnZhZGEuIEVsIG9iamV0aXZvIGVzIGV2YWx1YXIgc2kgZXN0YXMgdmFyaWFibGVzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgY29uanVudGEgZW4gZWwgZXNwYWNpbyBtdWx0aXZhcmlhZG8uDQoNCkVsIHByb2NlZGltaWVudG8gaW1wbGljYXLDoSBjYWxjdWxhciBlbCBlc3RhZMOtc3RpY28gZGUgcHJ1ZWJhIGVzcGVjw61maWNvIChwb3IgZWplbXBsbywgYmFzYWRvIGVuIGFzaW1ldHLDrWEgeSBjdXJ0b3NpcykgeSBjb21wYXJhcmxvIGNvbiBzdSBkaXN0cmlidWNpw7NuIHRlw7NyaWNhIGJham8gbGEgaGlww7N0ZXNpcyBudWxhIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYWRhLiBTZSBlc3RhYmxlY2Vyw6EgdW4gY3JpdGVyaW8gZGUgcmVjaGF6byBkZSBsYSBoaXDDs3Rlc2lzIG51bGEgc2kgZWwgdmFsb3IgJHAtdmFsdWUkIGFzb2NpYWRvIGFsIGVzdGFkw61zdGljbyBkZSBwcnVlYmEgZXMgbWVub3IgcXVlICRcYWxwaGEkLg0KDQpVbmEgY29uY2x1c2nDs24gcG9zaXRpdmEgKG5vIHJlY2hhem8gZGUgbGEgaGlww7N0ZXNpcyBudWxhKSBpbmRpY2Fyw61hIGV2aWRlbmNpYSBkZSBxdWUgbGFzIHZhcmlhYmxlcyBhbmFsaXphZGFzIHNpZ3VlbiB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwgbXVsdGl2YXJpYWRhLiBQb3IgZWwgY29udHJhcmlvLCB1biByZWNoYXpvIGRlIGxhIGhpcMOzdGVzaXMgbnVsYSBzdWdlcmlyw61hIHF1ZSBhbCBtZW5vcyB1bmEgZGUgbGFzIHZhcmlhYmxlcyBubyBzaWd1ZSB1bmEgZGlzdHJpYnVjacOzbiBub3JtYWwsIGxvIHF1ZSBwb2Ryw61hIHRlbmVyIGltcGxpY2FjaW9uZXMgZW4gZWwgYW7DoWxpc2lzIHBvc3RlcmlvciBkZSBsb3MgZGF0b3MuDQoNCkRlc2Fycm9sbG8gZGVsIEFuw6FsaXNpcw0KDQpMYSBleHBsb3JhY2nDs24gYSB0cmF2w6lzIGRlIGxhcyBkaWZlcmVudGVzIHBydWViYXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhZGEgaW5kaWNhIHF1ZSBlbCBjb25qdW50byBkZSBkYXRvcywgY29uc2lkZXJhbmRvIHN1cyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgbm8gc2lndWUgdW5hIGRpc3RyaWJ1Y2nDs24gbm9ybWFsIG11bHRpdmFyaWFkYS4gQXF1w60gZXN0w6FuIGxvcyBoYWxsYXpnb3MgY2xhdmUgZGUgY2FkYSBwcnVlYmE6DQoNCioqUHJ1ZWJhIGRlIE1hcmRpYSoqOkRlc3B1w6lzIGRlIHJlYWxpemFyIHVuIGFuw6FsaXNpcyBleGhhdXN0aXZvIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcywgc2UgZGVzdGFjYSBxdWUgbG9zIHZhbG9yZXMgJHAkIGFzb2NpYWRvcyBjb24gbGFzIHBydWViYXMgZGUgYXNpbWV0csOtYSAoU2tld25lc3MpIHkgY3VydG9zaXMgKEt1cnRvc2lzKSBzb24gY2xhcmFtZW50ZSBpbmZlcmlvcmVzIGFsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgcHJlZGV0ZXJtaW5hZG8gZGUgJFxhbHBoYSA9IDAuMDUkLiBFc3RlIGhhbGxhemdvIHJldmVsYSB1bmEgZGlzY3JlcGFuY2lhIHNpZ25pZmljYXRpdmEgZW50cmUgbGFzIGRpc3RyaWJ1Y2lvbmVzIG9ic2VydmFkYXMgeSBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYW50ZSBwcm9wdWVzdGEgcGFyYSBsYXMgdmFyaWFibGVzIGV4YW1pbmFkYXMgZW4gZWwgY29uanVudG8gZGUgZGF0b3MuDQoNCioqUHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIqKjpCYXPDoW5kb25vcyBlbiBsb3MgcmVzdWx0YWRvcyBkZSBsYSBQcnVlYmEgZGUgSGVuemUtWmlya2xlciwgb2JzZXJ2YW1vcyBxdWUgZWwgdmFsb3IgJHAkIGFzb2NpYWRvIGVzIG1lbm9yLCBsbyBxdWUgaW5kaWNhIHF1ZSBlcyBzaWduaWZpY2F0aXZhbWVudGUgbWVub3IgcXVlIGVsIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgJFxhbHBoYSA9IDAuMDUkLiBFc3RlIHJlc3VsdGFkbyBub3MgbGxldmEgYSBjb25jbHVpciBxdWUgbm8gaGF5IHN1ZmljaWVudGUgZXZpZGVuY2lhIHBhcmEgcmVzcGFsZGFyIGxhIGhpcMOzdGVzaXMgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhbnRlIHBhcmEgbGFzIHZhcmlhYmxlcyBkZWwgY29uanVudG8gZGUgZGF0b3Mgc2VndW4gbGEgcHJ1ZWJhLg0KDQoqKlBydWViYSBkZSBEb29ybmlrLUhhbnNlbioqOkJhc8OhbmRvbm9zIGVuIGxvcyByZXN1bHRhZG9zIGRlIGxhIFBydWViYSBkZSBEb29ybmlrLUhhbnNlbiwgZG9uZGUgc2Ugb2J0dXZvIHVuIHZhbG9yICRwJCBtZW5vciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICRcYWxwaGEgPSAwLjA1JCwgc2UgZXZpZGVuY2lhIHVuYSBkaXNjcmVwYW5jaWEgc2lnbmlmaWNhdGl2YSBjb24gcmVzcGVjdG8gYSBsYSBoaXDDs3Rlc2lzIGRlIG5vcm1hbGlkYWQgbXVsdGl2YXJpYW50ZSBwYXJhIGxhcyB2YXJpYWJsZXMgZXhhbWluYWRhcyBlbiBlbCBjb25qdW50byBkZSBkYXRvcy4gDQoNCioqUHJ1ZWJhIGRlIFJveXN0b24qKjogRGVzcHXDqXMgZGUgcmVhbGl6YXIgdW4gYW7DoWxpc2lzIGRlIGxvcyByZXN1bHRhZG9zIGRlIGxhIHBydWViYSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSBkZSBSb3lzdG9uIGluZGljYSB1bmEgZmFsdGEgc2lnbmlmaWNhdGl2YSBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFkYSwgcG9yIGxvIHRhbnRvLCBzZSByZWNoYXphIGxhIGhpcMOzdGVzaXMgbnVsYSBkZSBub3JtYWxpZGFkIHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlcywgaW5jbHV5ZW5kbyBFREFELCBBTFRVUkEsIFBFU08sIEZDVkMsIE5DUCwgSDJPIHkgRkFGLCB5YSBxdWUgZWwgdmFsb3IgZGUgJHAkIGRlIGxhIHBydWViYSBlcyBpbmZlcmlvciBhbCBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlICRcYWxwaGEgPSAwLjA1JC4gU2UgYXN1bWUgcXVlIGxvcyBkYXRvcyBwdWVkZW4gbm8gc2VyIGFkZWN1YWRvcyBwYXJhIHTDqWNuaWNhcyBlc3RhZMOtc3RpY2FzIHF1ZSBhc3VtZW4gbm9ybWFsaWRhZC4NCg0KRW4gcmVzdW1lbiBsb3MgcmVzdWx0YWRvcyBkZSBsYXMgcHJ1ZWJhcyBkZSBub3JtYWxpZGFkIG11bHRpdmFyaWFudGUsIGluY2x1eWVuZG8gbGEgUHJ1ZWJhIGRlIE1hcmRpYSwgbGEgUHJ1ZWJhIGRlIEhlbnplLVppcmtsZXIsIGxhIFBydWViYSBkZSBEb29ybmlrLUhhbnNlbiB5IGxhIFBydWViYSBkZSBSb3lzdG9uLCBpbmRpY2FuIHVuYSBmYWx0YSBkZSBldmlkZW5jaWEgcGFyYSByZXNwYWxkYXIgbGEgaGlww7N0ZXNpcyBkZSBub3JtYWxpZGFkIGVuIGxvcyBkYXRvcy4gRXN0byBzdWdpZXJlIHF1ZSBsYXMgdmFyaWFibGVzIGFuYWxpemFkYXMgbm8gc2lndWVuIHVuYSBkaXN0cmlidWNpw7NuIG11bHRpdmFyaWFudGUgbm9ybWFsLCBsbyBxdWUgcG9kcsOtYSBjb21wcm9tZXRlciBsYSB2YWxpZGV6IGRlIGxvcyBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvcyBwb3N0ZXJpb3JlcyBxdWUgYXN1bWVuIG5vcm1hbGlkYWQuIEVzdGEgZmFsdGEgZGUgbm9ybWFsaWRhZCBtdWx0aXZhcmlhbnRlIHJlc2FsdGEgbGEgaW1wb3J0YW5jaWEgZGUgaW50ZXJwcmV0YXIgbG9zIHJlc3VsdGFkb3Mgc3Vic2lndWllbnRlcyBjb24gcHJlY2F1Y2nDs24uDQoNCiMjIyBQTk0gTWFyZGlhDQpgYGB7ciBQTk1fTWFyZGlhLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSwgbXZuVGVzdD0ibWFyZGlhIikNCmBgYA0KDQojIyMgUE5NIEhlbnplLVppcmtsZXINCmBgYHtyIFBOTV9IZW56ZV9aaXJrbGVyLCBmaWcuYWxpZ24gPSAnY2VudGVyJ30NCm12bihPYmVzaXR5X0RhdGFzZXRbLC1jKDEsNSw2LDksMTAsMTIsMTQsMTUsMTYsMTcsMTgpXSwgbXZuVGVzdD0iaHoiKQ0KYGBgDQoNCiMjIyBQTk0gRG9vcm5pay1IYW5zZW4NCmBgYHtyIFBOTV9Eb29ybmlrX0hhbnNlbiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIG12blRlc3Q9ImRoIikNCmBgYA0KDQojIyMgUE5NIFJPWVNUT04gDQpgYGB7ciBQTk1fUm95c3RvbiwgZmlnLmFsaWduID0gJ2NlbnRlcid9DQptdm4oT2Jlc2l0eV9EYXRhc2V0WywtYygxLDUsNiw5LDEwLDEyLDE0LDE1LDE2LDE3LDE4KV0sIG12blRlc3Q9InJveXN0b24iKQ0KYGBgDQoNCiMjRmFzZSAyIFtDb21wb25lbnRlcyBQcmluY2lwYWxlc10NCg0KIyMjMi4xLiBPYmpldGl2b3MNCiMjIzIuMi4gU2VsZWNjacOzbiBkZSBDb21wb25lbnRlcw0KIyMjMi4zLiBDYWxpZGFkIGRlIFJlcHJlc2VudGFjacOzbg0KIyMjMi40LiBDb250cmlidWNpb25lcw0KIyMjMi41LiBJbnRlcnByZXRhY2nDs24gZGUgQ29tcG9uZW50ZXMNCg0KIyNGYXNlIDMgW0NvcnJlc3BvbmRlbmNpYXNdDQoNCiMjIzMuMS4gT2JqZXRpdm9zDQojIyMzLjEuIENvcnJlc3BvbmRlbmNpYXMgU2ltcGxlcw0KIyMjMy4yLiBDb3JyZXNwb25kZW5jaWFzIE3Dumx0aXBsZXMNCg0KIyNGYXNlIDQgW0Fuw6FsaXNpcyBkZSBSZWdyZXNpw7NuXQ0KDQojIyM0LjEuIE9iamV0aXZvcw0KIyMjNC4xLiBSZWdyZXNpw7NuIExpbmVhbCBTaW1wbGUNCiMjIzQuMi4gUmVncmVzacOzbiBMaW5lYWwgTcO6bHRpcGxlDQojIyM0LjMuIFJlZ3Jlc2nDs24gTG9nw61zdGljYQ0K