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==