Introducción

En esta sección veremos los principales aspectos de los modelos de regresión de mínimos cuadrados ordinarios (MICO, en español u ordinary least square, OLS, en inglés). Esta es una extensión del tema de correlación visto en la sección anterior.

En esta sección se replicará los análisis del capítulo “Legitimidad democrática” del reporte El Pulso de la Democracia. En ese capítulo se analiza una medición de apoyo a la democracia.

Sobre la base de datos

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org. Pueden descargar los datos de manera libre aquí.

Se recomienda limpiar el Environment antes de iniciar esta sección. En este documento se carga una base de datos en formato RData. Este formato, nativo de R, es más eficiente en términos de espacio de almacenamiento lo que permite alojarlo en GitHub (que tiene restricciones de tamaño de archivos). Esta base contiene la información de la ronda 2018 para todas las variables. Esta base de datos se encuentra alojada en el repositorio”materials_edu” de la cuenta de LAPOP en GitHub. Mediante la librería rio y el comando import se puede importar esta base de datos desde este repositorio, usando el siguiente código.

library(rio)
#lapop18 <- import("lapop18.RData")
lapop18 <- import("https://raw.github.com/lapop-central/materials_edu/main/lapop18.RData")
lapop18 <- subset(lapop18, pais<=35)

Apoyo al sistema

Como vimos en la sección sobre manejo de datos, para calcular este índice de apoyo al sistema se trabaja con un conjunto de cinco variables:

B1. ¿Hasta qué punto cree usted que los tribunales de justicia de (país) garantizan un juicio justo? \[Sondee: Si usted cree que los tribunales no garantizan para nada la justicia escoja el número 1; si cree que los tribunales garantizan mucho la justicia, escoja el número 7 o escoja un puntaje intermedio\].

B2. ¿Hasta qué punto tiene usted respeto por las instituciones políticas de (país)?

B3. ¿Hasta qué punto cree usted que los derechos básicos del ciudadano están bien protegidos por el sistema político de (país)?

B4. ¿Hasta qué punto se siente orgulloso de vivir bajo el sistema político de (país)?

B6. ¿Hasta qué punto piensa usted que se debe apoyar al sistema político de (país)?

Como indica el reporte “Para cada pregunta, la escala original de 1 (”Nada”) a 7 (“Mucho”) se recodifica en una escala de 0 a 100, de tal forma que 0 indica el menor nivel de apoyo al sistema político y 100 es el nivel máximo de apoyo al sistema político. Esta nueva escala sigue la recodificación típica de LAPOP y puede ser interpretada como una medición del apoyo en unidades, o grados, en una escala continua que va de 0 a 100” (p.34).

Para crear el índice de apoyo a la democracia, se tiene que reescalar cada variable, originalmente medida en una escala de 1-7, a una nueva escala de 0-100.

lapop18$b1rec <- ((lapop18$b1-1)/6)*100
lapop18$b2rec <- ((lapop18$b2-1)/6)*100
lapop18$b3rec <- ((lapop18$b3-1)/6)*100
lapop18$b4rec <- ((lapop18$b4-1)/6)*100
lapop18$b6rec <- ((lapop18$b6-1)/6)*100

Con estas nuevas variables, se calcula la media por cada observación de la base de datos. Esto se puede hacer con el comando rowMeans, donde se indica las columnas que se quiere promediar con la especificación [, 1370:1374]. El promedio de las 5 variables recodificadas se guarda en un nuevo objeto “apoyo”.

Se puede asumir que esta nueva variable es numérica, por lo que se puede describir con el comando summary. El comando summary muestra que esta nueva variable tiene un mínimo de 0 y máximo de 100.

lapop18$apoyo <- rowMeans(lapop18[,1370:1374])
summary(lapop18$apoyo)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00   33.33   50.00   48.79   66.67  100.00    1761

Se comprueba que el promedio reportado es de 48.8 unidades, similar al que aparece en el Gráfico 2.1 para el 2018.

Determinantes de apoyo al sistema

El Gráfico 2.10 muestra la relación entre apoyo al sistema y cinco variables independientes, usadas como predictores de esta variable dependiente. Estas variables son:

  • Índice de tolerancia política, construida a partir de cuatro variables: D1, D2, D3 y D4.

  • Eficacia externa (EFF1): “A los que gobiernan el país les interesa lo que piensa la gente como usted- ¿Hasta qué punto está de acuerdo o en desacuerdo con esta frase?”.

  • Confianza en el ejecutivo (B21A): “¿Hasta qué punto tiene confianza en el presidente/primer ministro?”.

  • Confianza en el gobierno local (B32): “¿Hasta qué punto tiene usted confianza en su alcaldía?”.

  • Confianza en su comunidad (IT1): “Ahora, hablando de la gente de por aquí, ¿diría que la gente de su comunidad es muy confiable, algo confiable, poco confiable o nada confiable?”.

El gráfico muestra los resultados para estas cinco variables, pero el modelo de regresión incluye controles socioeconómicos y demográficos y efectos fijos por país. Los resultados se presentan en un tipo de gráfico que es común en los reportes del proyecto LAPOP y en la investigación académica.

El Gráfico 2.10 muestra los coeficientes de cada variable y el intervalo de confianza al 95% de este estimado. Se incluye una línea vertical en el punto 0. Si un intervalo de confianza cruza esta línea vertical, se puede decir que la variable independiente no tiene una relación estadísticamente significativa con la variable dependiente de apoyo al sistema. Los intervalos de confianza que no cruzan esta línea y que se encuentran a la derecha (izquierda) de esta línea tienen una relación positiva (negativa) con el apoyo al sistema, es decir, cuando aumenta esta variable, el apoyo al sistema promedio aumenta (disminuye). En este ejemplo, las cinco variables son estadísticamente significativas y muestran una relación positiva con el apoyo al sistema.

También se muestra el valor del coeficiente de determinación \(R^2\). Este coeficiente indica la bondad de ajuste de un modelo a la variable dependiente. Mire la proporción de la varianza total de la variable dependiente explicada por el modelo de regresión lineal. Este coeficiente varía entre 0 y 1.

Finalmente el Gráfico 2.10 muestra el N con el que se calcula el modelo. Este N no necesariamente es igual al tamaño de muestra, debido a que los valores perdidos en cualquiera de las variables incluidas en el modelo disminuye este total de observaciones.

Modelo de regresión lineal simple

En primer lugar, empezaremos por la relación entre una variable independiente y una dependiente. Para esto, usaremos el apoyo al sistema como variable dependiente y a la confianza en el ejecutivo como variable independiente. Este es un ejercicio parcial al que se encuentra en el Gráfico 2.10, donde se usan 5 variables independientes como predictores del apoyo al sistema en un modelo de regresión multivariado.

En la sección anterior se calculó la variable dependiente. Luego de calcular la variable dependiente, se procede a calcular la principal variable independiente, la confianza en el ejecutivo. Esta variable es la B21A. ¿Hasta qué punto tiene usted confianza en presidente/primer ministro?. Esta variable está medida en una escala de 1-7 y debe ser recodificada a una escala de 0-100.

lapop18$ejec <- ((lapop18$b21a-1)/6)*100
summary(lapop18$ejec)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##    0.00    0.00   50.00   42.88   66.67  100.00     390

Para evaluar la relación entre la variable de confianza en el ejecutivo y el apoyo al sistema se puede calcular un modelo de regresión lineal. El modelo se calcula con el comando lm (de linear model) donde se indica la variable Y y luego la X. Este modelo de guarda en un objeto “modelo1” el que se puede describir con el comando summary.

modelo1 <- lm(apoyo ~ ejec, data=lapop18)
summary(modelo1)
## 
## Call:
## lm(formula = apoyo ~ ejec, data = lapop18)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -68.834 -13.785   1.166  13.707  66.215 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 33.78463    0.19029   177.5   <2e-16 ***
## ejec         0.35049    0.00342   102.5   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.7 on 26141 degrees of freedom
##   (1899 observations deleted due to missingness)
## Multiple R-squared:  0.2866, Adjusted R-squared:  0.2866 
## F-statistic: 1.05e+04 on 1 and 26141 DF,  p-value: < 2.2e-16

Estos resultados pueden ser presentados de una manera más formal mediante diferentes comandos. Aquí proponemos usar el comando summ de la librería jtools.

library(jtools)
summ(modelo1)
## MODEL INFO:
## Observations: 26143 (1899 missing obs. deleted)
## Dependent Variable: apoyo
## Type: OLS linear regression 
## 
## MODEL FIT:
## F(1,26141) = 10503.71, p = 0.00
## R² = 0.29
## Adj. R² = 0.29 
## 
## Standard errors: OLS
## ------------------------------------------------
##                      Est.   S.E.   t val.      p
## ----------------- ------- ------ -------- ------
## (Intercept)         33.78   0.19   177.55   0.00
## ejec                 0.35   0.00   102.49   0.00
## ------------------------------------------------

En la información básica del modelo se encuentra que se ha calculado este modelo bivariado sobre 26,143 observaciones. Es decir, del total de observaciones de la base de datos 1,899 se han perdido debido a valores perdidos en alguna de las variables, por lo que esas observaciones no se incluyen en el modelo.

Para evaluar una relación entre dos variables numéricas, tenemos que responder las siguientes preguntas

¿Existe asociación?

La variable confianza en el ejecutivo tiene un coeficiente de 0.35. Los resultados para esta variable muestran además los datos de la prueba de significancia, con el correspondiente p-value. Esta prueba de significancia plantea

\(H0: \beta_1 = 0\)

El p-value se puede interpretar como la probabilidad de observar un coeficiente como el observado (0.35) si el valor del parámetro poblacional fuera cero, que indicaría que no hay relación entre las variables. En nuestro ejemplo bivariado, el p-value encontrado es muy pequeño (2.2e-16). Si planteamos un valor crítico convencional de 0.05, valores de p-value por debajo de este valor nos llevaría a rechazar la H0 y a afirmar que el coeficiente de la variable es diferente de cero, que implica afirmar que existe una relación entre las variables.

Dirección de la relación

El signo del coeficiente nos indica la dirección de la relación. Si el signo es positivo, la relación es positiva entre las variables (a mayor X, mayor Y). Si el signo es negativo, la relación es negativa entre las variables (a mayor X, menor Y).

En nuestro ejemplo bivariado el signo del coeficiente es positivo (aunque está implícito), lo que indica que un aumento en la confianza en el ejecutivo lleva a un aumento promedio en el apoyo al sistema.

Coeficiente de determinación \(R^2\)

El coeficiente de determinación se interpreta como qué tan bien X predice Y y se interpreta como la reducción proporcional en el error al usar la recta de predicción, en lugar de sólo usar \(\bar{Y}\) (el promedio de Y) para predecir Y.

Se tiene que recordar que los errores (o residuos) son las distancias de cada punto a la recta. Cada punto tiene una distancia a la recta de \(\bar{Y}\) y también una distancia a la recta de predicción.

En la imagen de la izquierda, se muestran las distancias de los puntos a la recta de \(\bar{Y}\). Todas estas distancias al cuadrado se pueden sumar. Esta suma es E1.

En la imagen de la derecha, se muestran las distancias de los puntos a la recta de predicción \(\hat{Y}\). Todas estas distancias al cuadrado se pueden sumar. Esa suma es E2.

Entonces, \(R^2 = \frac{E1-E2}{E1}\). Este cálculo es igual al cuadrado del valor de la correlación. Por lo tanto:

  • \(R^2\) varía entre 0 y 1.

  • \(R^2=1\) implica que E2 = 0, es decir que todos los puntos caen en la recta.

  • \(R^2=0\) si la pendiente es cero.

En nuestro ejemplo, \(R^2=0.29\). Es decir, el modelo reduce un 29% el error de usar solamente el promedio para estimar Y.

Ecuación de la recta y predicción

Con los datos del modelo se puede construir la ecuación del modelo para valores predichos de la variable dependiente. En nuestro ejemplo tenemos:

\[\hat{Y} = 33.78 + 0.35*X\]

Con esta ecuación se puede calcular el valor predicho de apoyo al sistema para cualquier valor de confianza en el ejecutivo. Por ejemplo, la variable de confianza en el ejecutivo la recodificamos para que varíe entre 0 y 100. De esta manera, se puede calcular que para un valor mínimo de confianza en el ejecutivo (X=0), el apoyo al sistema estimado sería 33.78 puntos. Para un valor máximo de confianza en el ejecutivo (X=100), el apoyo al sistema estimado sería 33.78 + 35 = 68.78 puntos.

Validez del modelo

Los datos de ajuste del modelo también presentan los resultados de una prueba de significancia F. Este test de significancia pone a prueba si los coeficientes en conjunto son iguales a cero. En este caso, esos resultados son iguales a la prueba de significancia del coeficiente de la única variable independiente del modelo.

Esta prueba es más pertinente cuando se analiza un modelo de regresión lineal multivariado. En un análisis multivariado, este test de significancia sería el primer paso en el análisis sobre el modelo en su conjunto.

Resumen

En este documento se ha trabajado un modelo de regresión lineal simple, usando una variable independiente numérica para explicar una variable dependiente numérica. Luego se ha presentado los principales elementos del modelo de regresión lineal simple, como si existe relación, la dirección de la relación, el coeficiente de determinación, la ecuación de la recta y la predicción.

Incluyendo el efecto de diseño

Los cálculos realizados no incluyen el efecto de diseño muestral. Para hacer esto se debe considerar el factor de expansión. Se hizo una introducción al uso del factor de expansión aquí. En este parte usaremos la librería survey.

Usaremos el comando svydesign (similar al comando svyset en STATA). Con este comando se crea un nuevo objeto llamado “lapop.design”, que guarda la información de las variables contenidas en el dataframe, incluyendo en los cálculos el factor de expansión. Por tanto, si luego se creara una nueva variable, se tendría que calcular nuevamente esté comando para que este objeto “lapop.design” incluya esta nueva variable.

library(survey)
lapop.design<-svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop18)

La librería survey incluye el comando svyglm que permite calcular un modelo de regresión lineal. Las mismas variables usadas en el modelo 1 se pueden incluir en este comando. Se tiene que especificar el diseño que se utiliza y el tratamiento de los valores perdidos. Este cálculo se guarda en un objeto “modelo2”. Se usa el comando summary para describir el modelo.

modelo2 <- svyglm(apoyo~ejec, lapop.design)
summary(modelo2)
## 
## Call:
## svyglm(formula = apoyo ~ ejec, design = lapop.design)
## 
## Survey design:
## svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, 
##     nest = TRUE, data = lapop18)
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 33.780515   0.222170  152.05   <2e-16 ***
## ejec         0.350397   0.003722   94.15   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 389.4621)
## 
## Number of Fisher Scoring iterations: 2

Con el comando summ de la librería jtools se puede presentar el modelo, incluyendo el dato del \(R^2\) ponderado por el factor de expansión.

summ(modelo2)
## MODEL INFO:
## Observations: 26143
## Dependent Variable: apoyo
## Type: Survey-weighted linear regression 
## 
## MODEL FIT:
## R² = 0.29
## Adj. R² = 0.29 
## 
## Standard errors: Robust
## ------------------------------------------------
##                      Est.   S.E.   t val.      p
## ----------------- ------- ------ -------- ------
## (Intercept)         33.78   0.22   152.05   0.00
## ejec                 0.35   0.00    94.15   0.00
## ------------------------------------------------
## 
## Estimated dispersion parameter = 389.46
LS0tCnRpdGxlOiAiUmVncmVzaW9uIGxpbmVhbCBzaW1wbGUgdXNhbmRvIGRhdG9zIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGNvbGxhcHNlZDogZmFsc2UKICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UKICAgIHRvY19kZXB0aDogMQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGZsYXRseQogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBzZWxmX2NvbnRhaW5lZDogbm8KICAgIGtlZXBfbWQ6IHllcwplZGl0b3Jfb3B0aW9uczogCiAgbWFya2Rvd246IAogICAgd3JhcDogc2VudGVuY2UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkVuIGVzdGEgc2VjY2nDs24gdmVyZW1vcyBsb3MgcHJpbmNpcGFsZXMgYXNwZWN0b3MgZGUgbG9zIG1vZGVsb3MgZGUgcmVncmVzacOzbiBkZSBtw61uaW1vcyBjdWFkcmFkb3Mgb3JkaW5hcmlvcyAoTUlDTywgZW4gZXNwYcOxb2wgdSBvcmRpbmFyeSBsZWFzdCBzcXVhcmUsIE9MUywgZW4gaW5nbMOpcykuCkVzdGEgZXMgdW5hIGV4dGVuc2nDs24gZGVsIHRlbWEgZGUgW2NvcnJlbGFjacOzbl0oaHR0cHM6Ly9hcnR1cm9tYWxkb25hZG8uZ2l0aHViLmlvL0Jhcm9tZXRyb0VkdV9XZWIvY29ycmVsYWNpb24uaHRtbCkgdmlzdG8gZW4gbGEgc2VjY2nDs24gYW50ZXJpb3IuCgpFbiBlc3RhIHNlY2Npw7NuIHNlIHJlcGxpY2Fyw6EgbG9zIGFuw6FsaXNpcyBkZWwgY2Fww610dWxvICJMZWdpdGltaWRhZCBkZW1vY3LDoXRpY2EiIGRlbCByZXBvcnRlIFtFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMTgvMjAxOC0xOV9BbWVyaWNhc0Jhcm9tZXRlcl9SZWdpb25hbF9SZXBvcnRfU3BhbmlzaF9XXzAzLjI3LjIwLnBkZikuCkVuIGVzZSBjYXDDrXR1bG8gc2UgYW5hbGl6YSB1bmEgbWVkaWNpw7NuIGRlIGFwb3lvIGEgbGEgZGVtb2NyYWNpYS4KCiMgU29icmUgbGEgYmFzZSBkZSBkYXRvcwoKTG9zIGRhdG9zIHF1ZSB2YW1vcyBhIHVzYXIgZGViZW4gY2l0YXJzZSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiBGdWVudGU6IEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwb3IgZWwgUHJveWVjdG8gZGUgT3BpbmnDs24gUMO6YmxpY2EgZGUgQW3DqXJpY2EgTGF0aW5hIChMQVBPUCksIHd3d3cuTGFwb3BTdXJ2ZXlzLm9yZy4KUHVlZGVuIGRlc2NhcmdhciBsb3MgZGF0b3MgZGUgbWFuZXJhIGxpYnJlIFthcXXDrV0oaHR0cDovL2RhdGFzZXRzLmFtZXJpY2FzYmFyb21ldGVyLm9yZy9kYXRhYmFzZS9sb2dpbi5waHApLgoKU2UgcmVjb21pZW5kYSBsaW1waWFyIGVsIEVudmlyb25tZW50IGFudGVzIGRlIGluaWNpYXIgZXN0YSBzZWNjacOzbi4KRW4gZXN0ZSBkb2N1bWVudG8gc2UgY2FyZ2EgdW5hIGJhc2UgZGUgZGF0b3MgZW4gZm9ybWF0byBSRGF0YS4KRXN0ZSBmb3JtYXRvLCBuYXRpdm8gZGUgUiwgZXMgbcOhcyBlZmljaWVudGUgZW4gdMOpcm1pbm9zIGRlIGVzcGFjaW8gZGUgYWxtYWNlbmFtaWVudG8gbG8gcXVlIHBlcm1pdGUgYWxvamFybG8gZW4gR2l0SHViIChxdWUgdGllbmUgcmVzdHJpY2Npb25lcyBkZSB0YW1hw7FvIGRlIGFyY2hpdm9zKS4KRXN0YSBiYXNlIGNvbnRpZW5lIGxhIGluZm9ybWFjacOzbiBkZSBsYSByb25kYSAyMDE4IHBhcmEgdG9kYXMgbGFzIHZhcmlhYmxlcy4KRXN0YSBiYXNlIGRlIGRhdG9zIHNlIGVuY3VlbnRyYSBhbG9qYWRhIGVuIGVsIHJlcG9zaXRvcmlvIm1hdGVyaWFsc19lZHUiIGRlIGxhIGN1ZW50YSBkZSBMQVBPUCBlbiBHaXRIdWIuCk1lZGlhbnRlIGxhIGxpYnJlcsOtYSBgcmlvYCB5IGVsIGNvbWFuZG8gYGltcG9ydGAgc2UgcHVlZGUgaW1wb3J0YXIgZXN0YSBiYXNlIGRlIGRhdG9zIGRlc2RlIGVzdGUgcmVwb3NpdG9yaW8sIHVzYW5kbyBlbCBzaWd1aWVudGUgY8OzZGlnby4KCmBgYHtyIGJhc2UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkocmlvKQojbGFwb3AxOCA8LSBpbXBvcnQoImxhcG9wMTguUkRhdGEiKQpsYXBvcDE4IDwtIGltcG9ydCgiaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9sYXBvcC1jZW50cmFsL21hdGVyaWFsc19lZHUvbWFpbi9sYXBvcDE4LlJEYXRhIikKbGFwb3AxOCA8LSBzdWJzZXQobGFwb3AxOCwgcGFpczw9MzUpCmBgYAoKIyBBcG95byBhbCBzaXN0ZW1hCgpDb21vIHZpbW9zIGVuIGxhIHNlY2Npw7NuIHNvYnJlIFttYW5lam8gZGUgZGF0b3NdKGh0dHBzOi8vYXJ0dXJvbWFsZG9uYWRvLmdpdGh1Yi5pby9CYXJvbWV0cm9FZHVfV2ViL01hbmlwdWxhY2lvbi5odG1sI0NhbGN1bGFyX3VuYV92YXJpYWJsZSksIHBhcmEgY2FsY3VsYXIgZXN0ZSDDrW5kaWNlIGRlIGFwb3lvIGFsIHNpc3RlbWEgc2UgdHJhYmFqYSBjb24gdW4gY29uanVudG8gZGUgY2luY28gdmFyaWFibGVzOgoKKipCMS4qKiDCv0hhc3RhIHF1w6kgcHVudG8gY3JlZSB1c3RlZCBxdWUgbG9zIHRyaWJ1bmFsZXMgZGUganVzdGljaWEgZGUgKHBhw61zKSBnYXJhbnRpemFuIHVuIGp1aWNpbyBqdXN0bz8KJCRTb25kZWU6IFNpIHVzdGVkIGNyZWUgcXVlIGxvcyB0cmlidW5hbGVzIG5vIGdhcmFudGl6YW4gcGFyYSBuYWRhIGxhIGp1c3RpY2lhIGVzY29qYSBlbCBuw7ptZXJvIDE7IHNpIGNyZWUgcXVlIGxvcyB0cmlidW5hbGVzIGdhcmFudGl6YW4gbXVjaG8gbGEganVzdGljaWEsIGVzY29qYSBlbCBuw7ptZXJvIDcgbyBlc2NvamEgdW4gcHVudGFqZSBpbnRlcm1lZGlvJCQuCgoqKkIyLioqIMK/SGFzdGEgcXXDqSBwdW50byB0aWVuZSB1c3RlZCByZXNwZXRvIHBvciBsYXMgaW5zdGl0dWNpb25lcyBwb2zDrXRpY2FzIGRlIChwYcOtcyk/CgoqKkIzLioqIMK/SGFzdGEgcXXDqSBwdW50byBjcmVlIHVzdGVkIHF1ZSBsb3MgZGVyZWNob3MgYsOhc2ljb3MgZGVsIGNpdWRhZGFubyBlc3TDoW4gYmllbiBwcm90ZWdpZG9zIHBvciBlbCBzaXN0ZW1hIHBvbMOtdGljbyBkZSAocGHDrXMpPwoKKipCNC4qKiDCv0hhc3RhIHF1w6kgcHVudG8gc2Ugc2llbnRlIG9yZ3VsbG9zbyBkZSB2aXZpciBiYWpvIGVsIHNpc3RlbWEgcG9sw610aWNvIGRlIChwYcOtcyk/CgoqKkI2LioqIMK/SGFzdGEgcXXDqSBwdW50byBwaWVuc2EgdXN0ZWQgcXVlIHNlIGRlYmUgYXBveWFyIGFsIHNpc3RlbWEgcG9sw610aWNvIGRlIChwYcOtcyk/CgpDb21vIGluZGljYSBlbCByZXBvcnRlICJQYXJhIGNhZGEgcHJlZ3VudGEsIGxhIGVzY2FsYSBvcmlnaW5hbCBkZSAxICgiTmFkYSIpIGEgNyAoIk11Y2hvIikgc2UgcmVjb2RpZmljYSBlbiB1bmEgZXNjYWxhIGRlIDAgYSAxMDAsIGRlIHRhbCBmb3JtYSBxdWUgMCBpbmRpY2EgZWwgbWVub3Igbml2ZWwgZGUgYXBveW8gYWwgc2lzdGVtYSBwb2zDrXRpY28geSAxMDAgZXMgZWwgbml2ZWwgbcOheGltbyBkZSBhcG95byBhbCBzaXN0ZW1hIHBvbMOtdGljby4gRXN0YSBudWV2YSBlc2NhbGEgc2lndWUgbGEgcmVjb2RpZmljYWNpw7NuIHTDrXBpY2EgZGUgTEFQT1AgeSBwdWVkZSBzZXIgaW50ZXJwcmV0YWRhIGNvbW8gdW5hIG1lZGljacOzbiBkZWwgYXBveW8gZW4gdW5pZGFkZXMsIG8gZ3JhZG9zLCBlbiB1bmEgZXNjYWxhIGNvbnRpbnVhIHF1ZSB2YSBkZSAwIGEgMTAwIiAocC4zNCkuCgpQYXJhIGNyZWFyIGVsIMOtbmRpY2UgZGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhLCBzZSB0aWVuZSBxdWUgcmVlc2NhbGFyIGNhZGEgdmFyaWFibGUsIG9yaWdpbmFsbWVudGUgbWVkaWRhIGVuIHVuYSBlc2NhbGEgZGUgMS03LCBhIHVuYSBudWV2YSBlc2NhbGEgZGUgMC0xMDAuCgpgYGB7ciByZWNvfQpsYXBvcDE4JGIxcmVjIDwtICgobGFwb3AxOCRiMS0xKS82KSoxMDAKbGFwb3AxOCRiMnJlYyA8LSAoKGxhcG9wMTgkYjItMSkvNikqMTAwCmxhcG9wMTgkYjNyZWMgPC0gKChsYXBvcDE4JGIzLTEpLzYpKjEwMApsYXBvcDE4JGI0cmVjIDwtICgobGFwb3AxOCRiNC0xKS82KSoxMDAKbGFwb3AxOCRiNnJlYyA8LSAoKGxhcG9wMTgkYjYtMSkvNikqMTAwCmBgYAoKQ29uIGVzdGFzIG51ZXZhcyB2YXJpYWJsZXMsIHNlIGNhbGN1bGEgbGEgbWVkaWEgcG9yIGNhZGEgb2JzZXJ2YWNpw7NuIGRlIGxhIGJhc2UgZGUgZGF0b3MuCkVzdG8gc2UgcHVlZGUgaGFjZXIgY29uIGVsIGNvbWFuZG8gYHJvd01lYW5zYCwgZG9uZGUgc2UgaW5kaWNhIGxhcyBjb2x1bW5hcyBxdWUgc2UgcXVpZXJlIHByb21lZGlhciBjb24gbGEgZXNwZWNpZmljYWNpw7NuIGBbLCAxMzcwOjEzNzRdYC4KRWwgcHJvbWVkaW8gZGUgbGFzIDUgdmFyaWFibGVzIHJlY29kaWZpY2FkYXMgc2UgZ3VhcmRhIGVuIHVuIG51ZXZvIG9iamV0byAiYXBveW8iLgoKU2UgcHVlZGUgYXN1bWlyIHF1ZSBlc3RhIG51ZXZhIHZhcmlhYmxlIGVzIG51bcOpcmljYSwgcG9yIGxvIHF1ZSBzZSBwdWVkZSBkZXNjcmliaXIgY29uIGVsIGNvbWFuZG8gYHN1bW1hcnlgLgpFbCBjb21hbmRvIGBzdW1tYXJ5YCBtdWVzdHJhIHF1ZSBlc3RhIG51ZXZhIHZhcmlhYmxlIHRpZW5lIHVuIG3DrW5pbW8gZGUgMCB5IG3DoXhpbW8gZGUgMTAwLgoKYGBge3IgYXBveW99CmxhcG9wMTgkYXBveW8gPC0gcm93TWVhbnMobGFwb3AxOFssMTM3MDoxMzc0XSkKc3VtbWFyeShsYXBvcDE4JGFwb3lvKQpgYGAKClNlIGNvbXBydWViYSBxdWUgZWwgcHJvbWVkaW8gcmVwb3J0YWRvIGVzIGRlIDQ4LjggdW5pZGFkZXMsIHNpbWlsYXIgYWwgcXVlIGFwYXJlY2UgZW4gZWwgR3LDoWZpY28gMi4xIHBhcmEgZWwgMjAxOC4KCiFbXShHcmFmMi4xLnBuZyl7d2lkdGg9IjY1NCJ9CgojIERldGVybWluYW50ZXMgZGUgYXBveW8gYWwgc2lzdGVtYQoKRWwgR3LDoWZpY28gMi4xMCBtdWVzdHJhIGxhIHJlbGFjacOzbiBlbnRyZSBhcG95byBhbCBzaXN0ZW1hIHkgY2luY28gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzLCB1c2FkYXMgY29tbyBwcmVkaWN0b3JlcyBkZSBlc3RhIHZhcmlhYmxlIGRlcGVuZGllbnRlLgpFc3RhcyB2YXJpYWJsZXMgc29uOgoKLSAgIMONbmRpY2UgZGUgdG9sZXJhbmNpYSBwb2zDrXRpY2EsIGNvbnN0cnVpZGEgYSBwYXJ0aXIgZGUgY3VhdHJvIHZhcmlhYmxlczogRDEsIEQyLCBEMyB5IEQ0LgoKLSAgIEVmaWNhY2lhIGV4dGVybmEgKEVGRjEpOiAiQSBsb3MgcXVlIGdvYmllcm5hbiBlbCBwYcOtcyBsZXMgaW50ZXJlc2EgbG8gcXVlIHBpZW5zYSBsYSBnZW50ZSBjb21vIHVzdGVkLSDCv0hhc3RhIHF1w6kgcHVudG8gZXN0w6EgZGUgYWN1ZXJkbyBvIGVuIGRlc2FjdWVyZG8gY29uIGVzdGEgZnJhc2U/Ii4KCi0gICBDb25maWFuemEgZW4gZWwgZWplY3V0aXZvIChCMjFBKTogIsK/SGFzdGEgcXXDqSBwdW50byB0aWVuZSBjb25maWFuemEgZW4gZWwgcHJlc2lkZW50ZS9wcmltZXIgbWluaXN0cm8/Ii4KCi0gICBDb25maWFuemEgZW4gZWwgZ29iaWVybm8gbG9jYWwgKEIzMik6ICLCv0hhc3RhIHF1w6kgcHVudG8gdGllbmUgdXN0ZWQgY29uZmlhbnphIGVuIHN1IGFsY2FsZMOtYT8iLgoKLSAgIENvbmZpYW56YSBlbiBzdSBjb211bmlkYWQgKElUMSk6ICJBaG9yYSwgaGFibGFuZG8gZGUgbGEgZ2VudGUgZGUgcG9yIGFxdcOtLCDCv2RpcsOtYSBxdWUgbGEgZ2VudGUgZGUgc3UgY29tdW5pZGFkIGVzIG11eSBjb25maWFibGUsIGFsZ28gY29uZmlhYmxlLCBwb2NvIGNvbmZpYWJsZSBvIG5hZGEgY29uZmlhYmxlPyIuCgpFbCBncsOhZmljbyBtdWVzdHJhIGxvcyByZXN1bHRhZG9zIHBhcmEgZXN0YXMgY2luY28gdmFyaWFibGVzLCBwZXJvIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIGluY2x1eWUgY29udHJvbGVzIHNvY2lvZWNvbsOzbWljb3MgeSBkZW1vZ3LDoWZpY29zIHkgZWZlY3RvcyBmaWpvcyBwb3IgcGHDrXMuCkxvcyByZXN1bHRhZG9zIHNlIHByZXNlbnRhbiBlbiB1biB0aXBvIGRlIGdyw6FmaWNvIHF1ZSBlcyBjb23Dum4gZW4gbG9zIHJlcG9ydGVzIGRlbCBwcm95ZWN0byBMQVBPUCB5IGVuIGxhIGludmVzdGlnYWNpw7NuIGFjYWTDqW1pY2EuCgohW10oR3JhZjIuMTAucG5nKXt3aWR0aD0iNTA5In0KCkVsIEdyw6FmaWNvIDIuMTAgbXVlc3RyYSBsb3MgY29lZmljaWVudGVzIGRlIGNhZGEgdmFyaWFibGUgeSBlbCBpbnRlcnZhbG8gZGUgY29uZmlhbnphIGFsIDk1JSBkZSBlc3RlIGVzdGltYWRvLgpTZSBpbmNsdXllIHVuYSBsw61uZWEgdmVydGljYWwgZW4gZWwgcHVudG8gMC4KU2kgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBjcnV6YSBlc3RhIGzDrW5lYSB2ZXJ0aWNhbCwgc2UgcHVlZGUgZGVjaXIgcXVlIGxhIHZhcmlhYmxlIGluZGVwZW5kaWVudGUgbm8gdGllbmUgdW5hIHJlbGFjacOzbiBlc3RhZMOtc3RpY2FtZW50ZSBzaWduaWZpY2F0aXZhIGNvbiBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBkZSBhcG95byBhbCBzaXN0ZW1hLgpMb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcXVlIG5vIGNydXphbiBlc3RhIGzDrW5lYSB5IHF1ZSBzZSBlbmN1ZW50cmFuIGEgbGEgZGVyZWNoYSAoaXpxdWllcmRhKSBkZSBlc3RhIGzDrW5lYSB0aWVuZW4gdW5hIHJlbGFjacOzbiBwb3NpdGl2YSAobmVnYXRpdmEpIGNvbiBlbCBhcG95byBhbCBzaXN0ZW1hLCBlcyBkZWNpciwgY3VhbmRvIGF1bWVudGEgZXN0YSB2YXJpYWJsZSwgZWwgYXBveW8gYWwgc2lzdGVtYSBwcm9tZWRpbyBhdW1lbnRhIChkaXNtaW51eWUpLgpFbiBlc3RlIGVqZW1wbG8sIGxhcyBjaW5jbyB2YXJpYWJsZXMgc29uIGVzdGFkw61zdGljYW1lbnRlIHNpZ25pZmljYXRpdmFzIHkgbXVlc3RyYW4gdW5hIHJlbGFjacOzbiBwb3NpdGl2YSBjb24gZWwgYXBveW8gYWwgc2lzdGVtYS4KClRhbWJpw6luIHNlIG11ZXN0cmEgZWwgdmFsb3IgZGVsIGNvZWZpY2llbnRlIGRlIGRldGVybWluYWNpw7NuICRSXjIkLgpFc3RlIGNvZWZpY2llbnRlIGluZGljYSBsYSBib25kYWQgZGUgYWp1c3RlIGRlIHVuIG1vZGVsbyBhIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLgpNaXJlIGxhIHByb3BvcmNpw7NuIGRlIGxhIHZhcmlhbnphIHRvdGFsIGRlIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlIGV4cGxpY2FkYSBwb3IgZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsLgpFc3RlIGNvZWZpY2llbnRlIHZhcsOtYSBlbnRyZSAwIHkgMS4KCkZpbmFsbWVudGUgZWwgR3LDoWZpY28gMi4xMCBtdWVzdHJhIGVsIE4gY29uIGVsIHF1ZSBzZSBjYWxjdWxhIGVsIG1vZGVsby4KRXN0ZSBOIG5vIG5lY2VzYXJpYW1lbnRlIGVzIGlndWFsIGFsIHRhbWHDsW8gZGUgbXVlc3RyYSwgZGViaWRvIGEgcXVlIGxvcyB2YWxvcmVzIHBlcmRpZG9zIGVuIGN1YWxxdWllcmEgZGUgbGFzIHZhcmlhYmxlcyBpbmNsdWlkYXMgZW4gZWwgbW9kZWxvIGRpc21pbnV5ZSBlc3RlIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMuCgojIE1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBzaW1wbGUKCkVuIHByaW1lciBsdWdhciwgZW1wZXphcmVtb3MgcG9yIGxhIHJlbGFjacOzbiBlbnRyZSB1bmEgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSB5IHVuYSBkZXBlbmRpZW50ZS4KUGFyYSBlc3RvLCB1c2FyZW1vcyBlbCBhcG95byBhbCBzaXN0ZW1hIGNvbW8gdmFyaWFibGUgZGVwZW5kaWVudGUgeSBhIGxhIGNvbmZpYW56YSBlbiBlbCBlamVjdXRpdm8gY29tbyB2YXJpYWJsZSBpbmRlcGVuZGllbnRlLgpFc3RlIGVzIHVuIGVqZXJjaWNpbyBwYXJjaWFsIGFsIHF1ZSBzZSBlbmN1ZW50cmEgZW4gZWwgR3LDoWZpY28gMi4xMCwgZG9uZGUgc2UgdXNhbiA1IHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcyBjb21vIHByZWRpY3RvcmVzIGRlbCBhcG95byBhbCBzaXN0ZW1hIGVuIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIG11bHRpdmFyaWFkby4KCkVuIGxhIHNlY2Npw7NuIGFudGVyaW9yIHNlIGNhbGN1bMOzIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLgpMdWVnbyBkZSBjYWxjdWxhciBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSwgc2UgcHJvY2VkZSBhIGNhbGN1bGFyIGxhIHByaW5jaXBhbCB2YXJpYWJsZSBpbmRlcGVuZGllbnRlLCBsYSBjb25maWFuemEgZW4gZWwgZWplY3V0aXZvLgpFc3RhIHZhcmlhYmxlIGVzIGxhIEIyMUEuCsK/SGFzdGEgcXXDqSBwdW50byB0aWVuZSB1c3RlZCBjb25maWFuemEgZW4gcHJlc2lkZW50ZS9wcmltZXIgbWluaXN0cm8/LgpFc3RhIHZhcmlhYmxlIGVzdMOhIG1lZGlkYSBlbiB1bmEgZXNjYWxhIGRlIDEtNyB5IGRlYmUgc2VyIHJlY29kaWZpY2FkYSBhIHVuYSBlc2NhbGEgZGUgMC0xMDAuCgpgYGB7ciB2aX0KbGFwb3AxOCRlamVjIDwtICgobGFwb3AxOCRiMjFhLTEpLzYpKjEwMApzdW1tYXJ5KGxhcG9wMTgkZWplYykKYGBgCgpQYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIGVudHJlIGxhIHZhcmlhYmxlIGRlIGNvbmZpYW56YSBlbiBlbCBlamVjdXRpdm8geSBlbCBhcG95byBhbCBzaXN0ZW1hIHNlIHB1ZWRlIGNhbGN1bGFyIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbC4KRWwgbW9kZWxvIHNlIGNhbGN1bGEgY29uIGVsIGNvbWFuZG/CoGBsbWDCoChkZSBsaW5lYXIgbW9kZWwpIGRvbmRlIHNlIGluZGljYSBsYSB2YXJpYWJsZSBZIHkgbHVlZ28gbGEgWC4KRXN0ZSBtb2RlbG8gZGUgZ3VhcmRhIGVuIHVuIG9iamV0byAibW9kZWxvMSIgZWwgcXVlIHNlIHB1ZWRlIGRlc2NyaWJpciBjb24gZWwgY29tYW5kb8KgYHN1bW1hcnlgLgoKYGBge3IgbWx9Cm1vZGVsbzEgPC0gbG0oYXBveW8gfiBlamVjLCBkYXRhPWxhcG9wMTgpCnN1bW1hcnkobW9kZWxvMSkKYGBgCgpFc3RvcyByZXN1bHRhZG9zIHB1ZWRlbiBzZXIgcHJlc2VudGFkb3MgZGUgdW5hIG1hbmVyYSBtw6FzIGZvcm1hbCBtZWRpYW50ZSBkaWZlcmVudGVzIGNvbWFuZG9zLgpBcXXDrSBwcm9wb25lbW9zIHVzYXIgZWwgY29tYW5kbyBgc3VtbWAgZGUgbGEgbGlicmVyw61hIGBqdG9vbHNgLgoKYGBge3IgbWwyfQpsaWJyYXJ5KGp0b29scykKc3VtbShtb2RlbG8xKQpgYGAKCkVuIGxhIGluZm9ybWFjacOzbiBiw6FzaWNhIGRlbCBtb2RlbG8gc2UgZW5jdWVudHJhIHF1ZSBzZSBoYSBjYWxjdWxhZG8gZXN0ZSBtb2RlbG8gYml2YXJpYWRvIHNvYnJlIDI2LDE0MyBvYnNlcnZhY2lvbmVzLgpFcyBkZWNpciwgZGVsIHRvdGFsIGRlIG9ic2VydmFjaW9uZXMgZGUgbGEgYmFzZSBkZSBkYXRvcyAxLDg5OSBzZSBoYW4gcGVyZGlkbyBkZWJpZG8gYSB2YWxvcmVzIHBlcmRpZG9zIGVuIGFsZ3VuYSBkZSBsYXMgdmFyaWFibGVzLCBwb3IgbG8gcXVlIGVzYXMgb2JzZXJ2YWNpb25lcyBubyBzZSBpbmNsdXllbiBlbiBlbCBtb2RlbG8uCgpQYXJhIGV2YWx1YXIgdW5hIHJlbGFjacOzbiBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMsIHRlbmVtb3MgcXVlIHJlc3BvbmRlciBsYXMgc2lndWllbnRlcyBwcmVndW50YXMKCiMjIMK/RXhpc3RlIGFzb2NpYWNpw7NuPwoKTGEgdmFyaWFibGUgY29uZmlhbnphIGVuIGVsIGVqZWN1dGl2byB0aWVuZSB1biBjb2VmaWNpZW50ZSBkZSAwLjM1LgpMb3MgcmVzdWx0YWRvcyBwYXJhIGVzdGEgdmFyaWFibGUgbXVlc3RyYW4gYWRlbcOhcyBsb3MgZGF0b3MgZGUgbGEgcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEsIGNvbiBlbCBjb3JyZXNwb25kaWVudGUgcC12YWx1ZS4KRXN0YSBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYSBwbGFudGVhCgokSDA6IFxiZXRhXzEgPSAwJAoKRWwgcC12YWx1ZSBzZSBwdWVkZSBpbnRlcnByZXRhciBjb21vIGxhIHByb2JhYmlsaWRhZCBkZSBvYnNlcnZhciB1biBjb2VmaWNpZW50ZSBjb21vIGVsIG9ic2VydmFkbyAoMC4zNSkgc2kgZWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8gcG9ibGFjaW9uYWwgZnVlcmEgY2VybywgcXVlIGluZGljYXLDrWEgcXVlIG5vIGhheSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4KRW4gbnVlc3RybyBlamVtcGxvIGJpdmFyaWFkbywgZWwgcC12YWx1ZSBlbmNvbnRyYWRvIGVzIG11eSBwZXF1ZcOxbyAoMi4yZS0xNikuClNpIHBsYW50ZWFtb3MgdW4gdmFsb3IgY3LDrXRpY28gY29udmVuY2lvbmFsIGRlIDAuMDUsIHZhbG9yZXMgZGUgcC12YWx1ZSBwb3IgZGViYWpvIGRlIGVzdGUgdmFsb3Igbm9zIGxsZXZhcsOtYSBhIHJlY2hhemFyIGxhIEgwIHkgYSBhZmlybWFyIHF1ZSBlbCBjb2VmaWNpZW50ZSBkZSBsYSB2YXJpYWJsZSBlcyBkaWZlcmVudGUgZGUgY2VybywgcXVlIGltcGxpY2EgYWZpcm1hciBxdWUgZXhpc3RlIHVuYSByZWxhY2nDs24gZW50cmUgbGFzIHZhcmlhYmxlcy4KCiMjIERpcmVjY2nDs24gZGUgbGEgcmVsYWNpw7NuCgpFbCBzaWdubyBkZWwgY29lZmljaWVudGUgbm9zIGluZGljYSBsYSBkaXJlY2Npw7NuIGRlIGxhIHJlbGFjacOzbi4KU2kgZWwgc2lnbm8gZXMgcG9zaXRpdm8sIGxhIHJlbGFjacOzbiBlcyBwb3NpdGl2YSBlbnRyZSBsYXMgdmFyaWFibGVzIChhIG1heW9yIFgsIG1heW9yIFkpLgpTaSBlbCBzaWdubyBlcyBuZWdhdGl2bywgbGEgcmVsYWNpw7NuIGVzIG5lZ2F0aXZhIGVudHJlIGxhcyB2YXJpYWJsZXMgKGEgbWF5b3IgWCwgbWVub3IgWSkuCgpFbiBudWVzdHJvIGVqZW1wbG8gYml2YXJpYWRvIGVsIHNpZ25vIGRlbCBjb2VmaWNpZW50ZSBlcyBwb3NpdGl2byAoYXVucXVlIGVzdMOhIGltcGzDrWNpdG8pLCBsbyBxdWUgaW5kaWNhIHF1ZSB1biBhdW1lbnRvIGVuIGxhIGNvbmZpYW56YSBlbiBlbCBlamVjdXRpdm8gbGxldmEgYSB1biBhdW1lbnRvIHByb21lZGlvIGVuIGVsIGFwb3lvIGFsIHNpc3RlbWEuCgojIyBDb2VmaWNpZW50ZSBkZSBkZXRlcm1pbmFjacOzbiAkUl4yJAoKRWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24gc2UgaW50ZXJwcmV0YSBjb21vIHF1w6kgdGFuIGJpZW4gWCBwcmVkaWNlIFkgeSBzZSBpbnRlcnByZXRhIGNvbW8gbGEgcmVkdWNjacOzbiBwcm9wb3JjaW9uYWwgZW4gZWwgZXJyb3IgYWwgdXNhciBsYSByZWN0YSBkZSBwcmVkaWNjacOzbiwgZW4gbHVnYXIgZGUgc8OzbG8gdXNhciAkXGJhcntZfSQgKGVsIHByb21lZGlvIGRlIFkpIHBhcmEgcHJlZGVjaXIgWS4KClNlIHRpZW5lIHF1ZSByZWNvcmRhciBxdWUgbG9zIGVycm9yZXMgKG8gcmVzaWR1b3MpIHNvbiBsYXMgZGlzdGFuY2lhcyBkZSBjYWRhIHB1bnRvIGEgbGEgcmVjdGEuCkNhZGEgcHVudG8gdGllbmUgdW5hIGRpc3RhbmNpYSBhIGxhIHJlY3RhIGRlICRcYmFye1l9JCB5IHRhbWJpw6luIHVuYSBkaXN0YW5jaWEgYSBsYSByZWN0YSBkZSBwcmVkaWNjacOzbi4KCkVuIGxhIGltYWdlbiBkZSBsYSBpenF1aWVyZGEsIHNlIG11ZXN0cmFuIGxhcyBkaXN0YW5jaWFzIGRlIGxvcyBwdW50b3MgYSBsYSByZWN0YSBkZSAkXGJhcntZfSQuClRvZGFzIGVzdGFzIGRpc3RhbmNpYXMgYWwgY3VhZHJhZG8gc2UgcHVlZGVuIHN1bWFyLgpFc3RhIHN1bWEgZXMgRTEuCgpFbiBsYSBpbWFnZW4gZGUgbGEgZGVyZWNoYSwgc2UgbXVlc3RyYW4gbGFzIGRpc3RhbmNpYXMgZGUgbG9zIHB1bnRvcyBhIGxhIHJlY3RhIGRlIHByZWRpY2Npw7NuICRcaGF0e1l9JC4KVG9kYXMgZXN0YXMgZGlzdGFuY2lhcyBhbCBjdWFkcmFkbyBzZSBwdWVkZW4gc3VtYXIuCkVzYSBzdW1hIGVzIEUyLgoKIVtdKGRldGVybWluYWNpb24ucG5nKQoKRW50b25jZXMsICRSXjIgPSBcZnJhY3tFMS1FMn17RTF9JC4KRXN0ZSBjw6FsY3VsbyBlcyBpZ3VhbCBhbCBjdWFkcmFkbyBkZWwgdmFsb3IgZGUgbGEgY29ycmVsYWNpw7NuLgpQb3IgbG8gdGFudG86CgotICAgJFJeMiQgdmFyw61hIGVudHJlIDAgeSAxLgoKLSAgICRSXjI9MSQgaW1wbGljYSBxdWUgRTIgPSAwLCBlcyBkZWNpciBxdWUgdG9kb3MgbG9zIHB1bnRvcyBjYWVuIGVuIGxhIHJlY3RhLgoKLSAgICRSXjI9MCQgc2kgbGEgcGVuZGllbnRlIGVzIGNlcm8uCgpFbiBudWVzdHJvIGVqZW1wbG8sICRSXjI9MC4yOSQuCkVzIGRlY2lyLCBlbCBtb2RlbG8gcmVkdWNlIHVuIDI5JSBlbCBlcnJvciBkZSB1c2FyIHNvbGFtZW50ZSBlbCBwcm9tZWRpbyBwYXJhIGVzdGltYXIgWS4KCiMjIEVjdWFjacOzbiBkZSBsYSByZWN0YSB5IHByZWRpY2Npw7NuCgpDb24gbG9zIGRhdG9zIGRlbCBtb2RlbG8gc2UgcHVlZGUgY29uc3RydWlyIGxhIGVjdWFjacOzbiBkZWwgbW9kZWxvIHBhcmEgdmFsb3JlcyBwcmVkaWNob3MgZGUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuCkVuIG51ZXN0cm8gZWplbXBsbyB0ZW5lbW9zOgoKJCRcaGF0e1l9ID0gMzMuNzggKyAwLjM1KlgkJAoKQ29uIGVzdGEgZWN1YWNpw7NuIHNlIHB1ZWRlIGNhbGN1bGFyIGVsIHZhbG9yIHByZWRpY2hvIGRlIGFwb3lvIGFsIHNpc3RlbWEgcGFyYSBjdWFscXVpZXIgdmFsb3IgZGUgY29uZmlhbnphIGVuIGVsIGVqZWN1dGl2by4KUG9yIGVqZW1wbG8sIGxhIHZhcmlhYmxlIGRlIGNvbmZpYW56YSBlbiBlbCBlamVjdXRpdm8gbGEgcmVjb2RpZmljYW1vcyBwYXJhIHF1ZSB2YXLDrWUgZW50cmUgMCB5IDEwMC4KRGUgZXN0YSBtYW5lcmEsIHNlIHB1ZWRlIGNhbGN1bGFyIHF1ZSBwYXJhIHVuIHZhbG9yIG3DrW5pbW8gZGUgY29uZmlhbnphIGVuIGVsIGVqZWN1dGl2byAoWD0wKSwgZWwgYXBveW8gYWwgc2lzdGVtYSBlc3RpbWFkbyBzZXLDrWEgMzMuNzggcHVudG9zLgpQYXJhIHVuIHZhbG9yIG3DoXhpbW8gZGUgY29uZmlhbnphIGVuIGVsIGVqZWN1dGl2byAoWD0xMDApLCBlbCBhcG95byBhbCBzaXN0ZW1hIGVzdGltYWRvIHNlcsOtYSAzMy43OCArIDM1ID0gNjguNzggcHVudG9zLgoKIyMgVmFsaWRleiBkZWwgbW9kZWxvCgpMb3MgZGF0b3MgZGUgYWp1c3RlIGRlbCBtb2RlbG8gdGFtYmnDqW4gcHJlc2VudGFuIGxvcyByZXN1bHRhZG9zIGRlIHVuYSBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYSBGLgpFc3RlIHRlc3QgZGUgc2lnbmlmaWNhbmNpYSBwb25lIGEgcHJ1ZWJhIHNpIGxvcyBjb2VmaWNpZW50ZXMgZW4gY29uanVudG8gc29uIGlndWFsZXMgYSBjZXJvLgpFbiBlc3RlIGNhc28sIGVzb3MgcmVzdWx0YWRvcyBzb24gaWd1YWxlcyBhIGxhIHBydWViYSBkZSBzaWduaWZpY2FuY2lhIGRlbCBjb2VmaWNpZW50ZSBkZSBsYSDDum5pY2EgdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBkZWwgbW9kZWxvLgoKRXN0YSBwcnVlYmEgZXMgbcOhcyBwZXJ0aW5lbnRlIGN1YW5kbyBzZSBhbmFsaXphIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtdWx0aXZhcmlhZG8uCkVuIHVuIGFuw6FsaXNpcyBtdWx0aXZhcmlhZG8sIGVzdGUgdGVzdCBkZSBzaWduaWZpY2FuY2lhIHNlcsOtYSBlbCBwcmltZXIgcGFzbyBlbiBlbCBhbsOhbGlzaXMgc29icmUgZWwgbW9kZWxvIGVuIHN1IGNvbmp1bnRvLgoKIyBSZXN1bWVuCgpFbiBlc3RlIGRvY3VtZW50byBzZSBoYSB0cmFiYWphZG8gdW4gbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSwgdXNhbmRvIHVuYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIG51bcOpcmljYSBwYXJhIGV4cGxpY2FyIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBudW3DqXJpY2EuCkx1ZWdvIHNlIGhhIHByZXNlbnRhZG8gbG9zIHByaW5jaXBhbGVzIGVsZW1lbnRvcyBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHNpbXBsZSwgY29tbyBzaSBleGlzdGUgcmVsYWNpw7NuLCBsYSBkaXJlY2Npw7NuIGRlIGxhIHJlbGFjacOzbiwgZWwgY29lZmljaWVudGUgZGUgZGV0ZXJtaW5hY2nDs24sIGxhIGVjdWFjacOzbiBkZSBsYSByZWN0YSB5IGxhIHByZWRpY2Npw7NuLgoKIyBJbmNsdXllbmRvIGVsIGVmZWN0byBkZSBkaXNlw7FvCgpMb3MgY8OhbGN1bG9zIHJlYWxpemFkb3Mgbm8gaW5jbHV5ZW4gZWwgZWZlY3RvIGRlIGRpc2XDsW8gbXVlc3RyYWwuClBhcmEgaGFjZXIgZXN0byBzZSBkZWJlIGNvbnNpZGVyYXIgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uClNlIGhpem8gdW5hIGludHJvZHVjY2nDs24gYWwgdXNvIGRlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBbYXF1w61dKGh0dHBzOi8vYXJ0dXJvbWFsZG9uYWRvLmdpdGh1Yi5pby9CYXJvbWV0cm9FZHVfV2ViL0V4cGFuc2lvbi5odG1sKS4KRW4gZXN0ZSBwYXJ0ZSB1c2FyZW1vcyBsYSBsaWJyZXLDrWEgYHN1cnZleWAuCgpVc2FyZW1vcyBlbCBjb21hbmRvIGBzdnlkZXNpZ25gIChzaW1pbGFyIGFsIGNvbWFuZG8gc3Z5c2V0IGVuIFNUQVRBKS4KQ29uIGVzdGUgY29tYW5kbyBzZSBjcmVhIHVuIG51ZXZvIG9iamV0byBsbGFtYWRvICJsYXBvcC5kZXNpZ24iLCBxdWUgZ3VhcmRhIGxhIGluZm9ybWFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGNvbnRlbmlkYXMgZW4gZWwgZGF0YWZyYW1lLCBpbmNsdXllbmRvIGVuIGxvcyBjw6FsY3Vsb3MgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uClBvciB0YW50bywgc2kgbHVlZ28gc2UgY3JlYXJhIHVuYSBudWV2YSB2YXJpYWJsZSwgc2UgdGVuZHLDrWEgcXVlIGNhbGN1bGFyIG51ZXZhbWVudGUgZXN0w6kgY29tYW5kbyBwYXJhIHF1ZSBlc3RlIG9iamV0byAibGFwb3AuZGVzaWduIiBpbmNsdXlhIGVzdGEgbnVldmEgdmFyaWFibGUuCgpgYGB7ciBkaXNlbm8sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoc3VydmV5KQpsYXBvcC5kZXNpZ248LXN2eWRlc2lnbihpZHMgPSB+dXBtLCBzdHJhdGEgPSB+ZXN0cmF0b3ByaSwgd2VpZ2h0cyA9IH53ZWlnaHQxNTAwLCBuZXN0PVRSVUUsIGRhdGE9bGFwb3AxOCkKYGBgCgpMYSBsaWJyZXLDrWEgYHN1cnZleWAgaW5jbHV5ZSBlbCBjb21hbmRvIGBzdnlnbG1gIHF1ZSBwZXJtaXRlIGNhbGN1bGFyIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbC4KTGFzIG1pc21hcyB2YXJpYWJsZXMgdXNhZGFzIGVuIGVsIG1vZGVsbyAxIHNlIHB1ZWRlbiBpbmNsdWlyIGVuIGVzdGUgY29tYW5kby4KU2UgdGllbmUgcXVlIGVzcGVjaWZpY2FyIGVsIGRpc2XDsW8gcXVlIHNlIHV0aWxpemEgeSBlbCB0cmF0YW1pZW50byBkZSBsb3MgdmFsb3JlcyBwZXJkaWRvcy4KRXN0ZSBjw6FsY3VsbyBzZSBndWFyZGEgZW4gdW4gb2JqZXRvICJtb2RlbG8yIi4KU2UgdXNhIGVsIGNvbWFuZG8gYHN1bW1hcnlgIHBhcmEgZGVzY3JpYmlyIGVsIG1vZGVsby4KCmBgYHtyIG1vZGVsb3d9Cm1vZGVsbzIgPC0gc3Z5Z2xtKGFwb3lvfmVqZWMsIGxhcG9wLmRlc2lnbikKc3VtbWFyeShtb2RlbG8yKQpgYGAKCkNvbiBlbCBjb21hbmRvIGBzdW1tYCBkZSBsYSBsaWJyZXLDrWEgYGp0b29sc2Agc2UgcHVlZGUgcHJlc2VudGFyIGVsIG1vZGVsbywgaW5jbHV5ZW5kbyBlbCBkYXRvIGRlbCAkUl4yJCBwb25kZXJhZG8gcG9yIGVsIGZhY3RvciBkZSBleHBhbnNpw7NuLgoKYGBge3IgcmVzdW1lbnd9CnN1bW0obW9kZWxvMikKYGBgCg==