Análisis de regresión como método unificado
Hasta el momento se ha usado el método de regresión lineal para
analizar la relación entre dos variables numéricas, tanto la dependiente
como las independientes. Este método puede ampliarse y ser usado con una
diversidad de tipos de variables independientes, tanto numéricas, como
nominales y ordinales.
De esta manera, el método de regresión lineal puede entenderse como
un método general, que incluye tanto el análisis de la prueba t como la
prueba de ANOVA, dado que ambas usan una variable numérica como variable
dependiente.
En resumen, la única condición del análisis de regresión es que la
variable dependiente sea numérica, pero las variables independientes
pueden ser de diverso tipo.
Regresión lineal como prueba t de diferencia de medias
La prueba t de diferencia de medias se usaba cuando queríamos hacer
una inferencia acerca de las medias entre dos grupos. Es decir, para
comparar la medida de tendencia central (la media) de una variable
dependiente entre (dos) grupos de una variable independiente, que podría
ser nominal u ordinal.
Siguiendo con los datos de la elección presidencial de 2016, cargamos
la base de datos que hemos estado usando.
library(rio)
data16 = import("bases/datos2016_v3.sav")
Entonces, si queremos saber si existen diferencias estadísticas de la
votación a Verónika Mendoza entre los departamentos de la costa y los
departamentos que no están en la costa, se puede usar la prueba t de
diferencia de medias. Es decir, se quiere comparar la media de votación
a Mendoza, una variable cuantitativas, entre grupos de la variable
“costa”, variable dicotómica.
Lo primero es ver las medias de cada grupo.
library(dplyr)
data16 %>%
group_by(costa) %>%
summarise(Media = mean(Voto_VM_2016_1, na.rm = T))
## # A tibble: 2 × 2
## costa Media
## <dbl> <dbl>
## 1 0 29.5
## 2 1 17.9
Para analizar si la diferencia entre 29.5 y 17.9 es significativa, se
puede correr una prueba t de diferencias de medias.
t.test(Voto_VM_2016_1 ~ costa, data=data16, var.equal=T)
##
## Two Sample t-test
##
## data: Voto_VM_2016_1 by costa
## t = 2.1318, df = 23, p-value = 0.04393
## alternative hypothesis: true difference in means between group 0 and group 1 is not equal to 0
## 95 percent confidence interval:
## 0.3444177 22.9244711
## sample estimates:
## mean in group 0 mean in group 1
## 29.54000 17.90556
De estos resultados, vemos que se obtiene un p-value de 0.03, que es
menor a 0.05. Es decir, la diferencia en el voto a VM entre
departamentos de la costa y los que no son de la costa sería
significativa.
Para graficar la relación entre ambas variables antes se ha usado un
boxplot, que no muestra datos para la inferencia, solo datos
descriptivos. También se ha usado un gráfico de barras de error para
mostrar las medias de cada grupo con el respectivo intervalo de
confianza.
En esta sección, se produce un gráfico de dispersión entre la
variable “costa” y “voto a PPK”. Debido a que la variable “costa” es
dicotómica, solo tiene valores 0 y 1, por lo que los puntos, que
representan a cada departamento, se agrupan en dos líneas
verticales.
library(ggplot2)
ggplot(data16, aes(x=costa, y=Voto_VM_2016_1))+
geom_point()+
geom_smooth(method=lm, se=F)+ #agregar línea de tendencia
geom_text(data=data16, aes(label=Dpto),
cex=2, nudge_y = 1.1, check_overlap = T)+ #Pata etiquetar los puntos, darles un tamaño, ubicación y prevenir que se sobrepongan
labs(x="Costa",
y="Voto a VM (1era vuelta)")+ #para etiquetar los ejes
theme_light()
## `geom_smooth()` using formula =
## 'y ~ x'
En este gráfico también se puede pensar en una mejor recta de
predicción, que reduce la distancia de los puntos a la recta. Esta recta
atraviesa por la media de cada grupo.
Por lo tanto, un modelo de regresión que use el voto a VM en primera
vuelta en 2016 como variable dependiente y la variable dicotómica
“costa” como variable independiente nos daría los datos para la
construcción de esta recta de aproximación.
modelo1 = lm(data16$Voto_VM_2016_1 ~ data16$costa)
summary(modelo1)
##
## Call:
## lm(formula = data16$Voto_VM_2016_1 ~ data16$costa)
##
## Residuals:
## Min 1Q Median 3Q Max
## -19.360 -7.506 -5.876 9.030 23.520
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 29.540 3.275 9.021 5.15e-09 ***
## data16$costa -11.634 5.458 -2.132 0.0439 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 13.1 on 23 degrees of freedom
## Multiple R-squared: 0.165, Adjusted R-squared: 0.1287
## F-statistic: 4.544 on 1 and 23 DF, p-value: 0.04393
modelo2 = lm(data16$Voto_VM_2016_1 ~ data16$costa + data16$Analfabetismo_2014)
summary(modelo2)
##
## Call:
## lm(formula = data16$Voto_VM_2016_1 ~ data16$costa + data16$Analfabetismo_2014)
##
## Residuals:
## Min 1Q Median 3Q Max
## -26.042 -6.343 -1.668 6.964 26.004
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 9.9971 7.0373 1.421 0.16945
## data16$costa -0.8333 5.8893 -0.141 0.88877
## data16$Analfabetismo_2014 2.0173 0.6659 3.030 0.00616 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11.25 on 22 degrees of freedom
## Multiple R-squared: 0.4108, Adjusted R-squared: 0.3572
## F-statistic: 7.669 on 2 and 22 DF, p-value: 0.002971
Los resultados indican que la recta es \(\hat{Y} = 29.5 - 11.6*X\). Esta recta tiene
el valor de 29.5 cuando X=0. Es decir, para los departamentos que no son
de la costa, el promedio de voto a VM es 29.5, tal cual encontramos de
manera descriptiva. Cuando X=1, el promedio de voto a VM es 29.5 - 11.6
= 17.9, que es el promedio del voto para los departamentos de la costa,
el mismo valor que encontramos de manera descriptiva.
Es decir la recta de aproximación pasa por el promedio del voto a VM
para los departamentos que no son de la costa y para los que sí son de
la costa.
El modelo de regresión no solo replica los datos, sino también
replica la prueba de significancia. La hipótesis nula que se evalúa aquí
es: \(\mu_{costa} - \mu_{no
costa}\).
El estadístico de la prueba t es -2.13 y un p-value de 0.044. Estos
datos también se encuentran en la línea de la variable
independiente.
Regresión lineal para variables factor
Si quisiéremos evaluar las diferencias en el voto a Fujimori en 2016
entre las 3 regiones: costa, sierra y selva, podríamos usar una variable
dependiente numérica y una variable independiente nominal con 3
categorías.
Lo primero es ver las medias del voto a Fujimori para cada grupo.
tabla1 = data16 %>%
group_by(region) %>%
summarise(Media = mean(Voto_KF_2016_1, na.rm = T))
tabla1
## # A tibble: 3 × 2
## region Media
## <dbl> <dbl>
## 1 1 42.8
## 2 2 31.3
## 3 3 44.8
Para evaluar estas medias mediante el análisis de regresión, se tiene
que crear variables dummy por cada grupo de la variable “region”. Es
decir, 3 variables: “costa”, “sierra” y “selva”, En el modelo de
regresión, sin embargo, solo se debe incluir 2 de esas variables
dummy.
modelo2 = lm(data16$Voto_KF_2016_1 ~ data16$costa + data16$sierra+ data16$Analfabetismo_2014)
summary(modelo2)
##
## Call:
## lm(formula = data16$Voto_KF_2016_1 ~ data16$costa + data16$sierra +
## data16$Analfabetismo_2014)
##
## Residuals:
## Min 1Q Median 3Q Max
## -21.7582 -5.8871 -0.3482 6.6278 21.7204
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 44.83973 6.57127 6.824 9.55e-07 ***
## data16$costa -2.04553 5.86485 -0.349 0.7307
## data16$sierra -13.53433 5.73836 -2.359 0.0281 *
## data16$Analfabetismo_2014 0.00134 0.65773 0.002 0.9984
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 10.32 on 21 degrees of freedom
## Multiple R-squared: 0.2921, Adjusted R-squared: 0.1909
## F-statistic: 2.888 on 3 and 21 DF, p-value: 0.05971
Se excluye la tercera variable dummy debido a que los resultados para
este grupo se encuentran en el intercepto en el análisis de regresión.
Es decir, cuando costa=0 y sierra=0, el voto promedio a Fujimori es
44.85, mismo valor que se encontró en el análisis descriptivo. Cuando
costa=1 y sierra=0, el voto promedio a Fujimori es 44.85-2.05 = 42.8,
mismo valor que se encontró en el análisis descriptivo. Finalmente,
cuando costa=0 y sierra=1, el voto promedio a Fujimori es
44.85-13.53=31.32, mismo valor que se encontró en el análisis
descriptivo.
Vemos que los coeficientes de las 2 variables dummy son las
diferencias entre los grupos. Los valores de 2.05 y 13.53 son los mismos
que se evaluaron en el test de Tukey.
Conclusión
Hemos comenzado la explicación del análisis de regresión como una
forma para evaluar la relación entre dos variables numéricas. En esta
sección hemos expandido esta idea y hemos visto que el método de
regresión se puede usar con variables independientes de tipo categórico,
ya sea nominal u ordinal. El único requisito es que la variable
dependiente sea numérica.
De esta manera, el modelo de regresión se puede expresar
\[
\hat{Y} = \hat{\alpha} +
\hat{\beta_1}*X_1+\hat{\beta_2}*X_2+\hat{\beta_3}*X_3+...+\hat{\beta_n}*X_n
\]
Los requisitos son:
Y es una variable numérica
Xs pueden ser numéricas o categóricas. Si es categórica, se debe
incluir como dummy o serie de variables dummy
El número de variables independientes no puede ser mayor que el
número de observaciones menos 1 (N-1).
En este curso se ha presentado el análisis de regresión lineal como
técnica para evaluar la relación bivariada y para evaluar la relación
multivariada. Con la técnica de regresión multivariada se puede
analizar:
La validez del modelo.
La relación de cada predictor con la variable
dependiente.
La dirección de la relación entre cada predictor y la variable
dependiente.
La fuerza del modelo.
La predicción del modelo para diferentes valores de los
predictores.
Resumen
En esta sección presentamos un mapa de temas que hemos visto a lo
largo de todo el semestre. Como se ve en el esquema, las herramientas
que hemos visto en el curso dependen de un punto de partida inicial, que
es la distinción entre tipos de variables: cualitativas o categóricas y
cuantitativas o numéricas. Dependiendo de esta categorización, se
desprende el tipo de análisis descriptivo, tanto de la tendencia
central, como de la dispersión, así como las formas de graficar estas
variables.
Como paso previo a la inferencia, se construyeron intervalos de
confianza de la media (variables cuantitavitas) o de proporciones
(variables cualitativas). Se analizó que se podían construir intervalos
de confianza de medias o proporciones para grupos. Este es el primer
paso de la inferencia. Se evaluó si los intervalos de confianza se
traslapaban o no. Esto daba paso al análisis bivariado en la segunda
parte del curso.
En el libro de Ritchey se muestra este árbol de decisión. La rama
derecha de “Dos muestras o dos variables” muestra el resumen de la
segunda parte de este curso. Esta segunda parte ha estado dedicada a la
inferencia en el análisis bivariado. Como hemos avanzado en este curso,
se ha presentado la prueba de inferencia t, la prueba F de ANOVA, la
prueba de chi-cuadrado y la regresión bivariada. Luego, se dio el paso
al análisis multivariado.
Finalmente, el objetivo de este curso es presentar herramientas
iniciales para el análisis de datos sociales. Se espera que luego de
este curso los alumnos sean consumidores o productores capaces de
estadística. Como consumidores, los alumnos van a estar expuestos a
literatura especializada que use métodos estadísticos. Las herramientas
vistas en este curso permitirían que los alumnos puedan evaluar estos
artículos y los hallazgos de manera crítica.
Como productores, se espera que los alumnos utilicen evidencia
numérica y análisis estadístico en sus trabajos de cursos y en sus tesis
de pregrado. Ya sea para presentar análisis descriptivo o para realizar
análisis inferencial, los alumnos deberían estar en la capacidad de
recoger datos numéricos y trabajar con estos usando técnicas vistas en
este curso. Es completamente válido que los alumnos usen otros métodos,
por ejemplo cualitativos, pero si este curso y el siguiente logran que
algunos de ustedes se “atrevan” a usar métodos cuantitativos, ese será
el mayor logro de este curso. Gracias!!!
LS0tCnRpdGxlOiAiQ2xhc2UgMTMiCmF1dGhvcjogIkFydHVybyBNYWxkb25hZG8iCmRhdGU6ICIxOS8xMS8yMDI0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICB0b2NfZGVwdGg6IDEKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBjb3NtbwogICAgaGlnaGxpZ2h0OiB0ZXh0bWF0ZQplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IHNlbnRlbmNlCmJpYmxpb2dyYXBoeTogcmVmZXJlbmNlcy5iaWIKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCiMgQW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gY29tbyBtw6l0b2RvIHVuaWZpY2FkbwoKSGFzdGEgZWwgbW9tZW50byBzZSBoYSB1c2FkbyBlbCBtw6l0b2RvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIHBhcmEgYW5hbGl6YXIgbGEgcmVsYWNpw7NuIGVudHJlIGRvcyB2YXJpYWJsZXMgbnVtw6lyaWNhcywgdGFudG8gbGEgZGVwZW5kaWVudGUgY29tbyBsYXMgaW5kZXBlbmRpZW50ZXMuCkVzdGUgbcOpdG9kbyBwdWVkZSBhbXBsaWFyc2UgeSBzZXIgdXNhZG8gY29uIHVuYSBkaXZlcnNpZGFkIGRlIHRpcG9zIGRlIHZhcmlhYmxlcyBpbmRlcGVuZGllbnRlcywgdGFudG8gbnVtw6lyaWNhcywgY29tbyBub21pbmFsZXMgeSBvcmRpbmFsZXMuCgpEZSBlc3RhIG1hbmVyYSwgZWwgbcOpdG9kbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBwdWVkZSBlbnRlbmRlcnNlIGNvbW8gdW4gbcOpdG9kbyBnZW5lcmFsLCBxdWUgaW5jbHV5ZSB0YW50byBlbCBhbsOhbGlzaXMgZGUgbGEgcHJ1ZWJhIHQgY29tbyBsYSBwcnVlYmEgZGUgQU5PVkEsIGRhZG8gcXVlIGFtYmFzIHVzYW4gdW5hIHZhcmlhYmxlIG51bcOpcmljYSBjb21vIHZhcmlhYmxlIGRlcGVuZGllbnRlLgoKRW4gcmVzdW1lbiwgbGEgw7puaWNhIGNvbmRpY2nDs24gZGVsIGFuw6FsaXNpcyBkZSByZWdyZXNpw7NuIGVzIHF1ZSBsYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBzZWEgbnVtw6lyaWNhLCBwZXJvIGxhcyB2YXJpYWJsZXMgaW5kZXBlbmRpZW50ZXMgcHVlZGVuIHNlciBkZSBkaXZlcnNvIHRpcG8uCgojIFJlZ3Jlc2nDs24gbGluZWFsIGNvbW8gcHJ1ZWJhIHQgZGUgZGlmZXJlbmNpYSBkZSBtZWRpYXMKCkxhIHBydWViYSB0IGRlIGRpZmVyZW5jaWEgZGUgbWVkaWFzIHNlIHVzYWJhIGN1YW5kbyBxdWVyw61hbW9zIGhhY2VyIHVuYSBpbmZlcmVuY2lhIGFjZXJjYSBkZSBsYXMgbWVkaWFzIGVudHJlIGRvcyBncnVwb3MuCkVzIGRlY2lyLCBwYXJhIGNvbXBhcmFyIGxhIG1lZGlkYSBkZSB0ZW5kZW5jaWEgY2VudHJhbCAobGEgbWVkaWEpIGRlIHVuYSB2YXJpYWJsZSBkZXBlbmRpZW50ZSBlbnRyZSAoZG9zKSBncnVwb3MgZGUgdW5hIHZhcmlhYmxlIGluZGVwZW5kaWVudGUsIHF1ZSBwb2Ryw61hIHNlciBub21pbmFsIHUgb3JkaW5hbC4KClNpZ3VpZW5kbyBjb24gbG9zIGRhdG9zIGRlIGxhIGVsZWNjacOzbiBwcmVzaWRlbmNpYWwgZGUgMjAxNiwgY2FyZ2Ftb3MgbGEgYmFzZSBkZSBkYXRvcyBxdWUgaGVtb3MgZXN0YWRvIHVzYW5kby4KCmBgYHtyIGJhc2V9CmxpYnJhcnkocmlvKQpkYXRhMTYgPSBpbXBvcnQoImJhc2VzL2RhdG9zMjAxNl92My5zYXYiKQpgYGAKCkVudG9uY2VzLCBzaSBxdWVyZW1vcyBzYWJlciBzaSBleGlzdGVuIGRpZmVyZW5jaWFzIGVzdGFkw61zdGljYXMgZGUgbGEgdm90YWNpw7NuIGEgVmVyw7NuaWthIE1lbmRvemEgZW50cmUgbG9zIGRlcGFydGFtZW50b3MgZGUgbGEgY29zdGEgeSBsb3MgZGVwYXJ0YW1lbnRvcyBxdWUgbm8gZXN0w6FuIGVuIGxhIGNvc3RhLCBzZSBwdWVkZSB1c2FyIGxhIHBydWViYSB0IGRlIGRpZmVyZW5jaWEgZGUgbWVkaWFzLgpFcyBkZWNpciwgc2UgcXVpZXJlIGNvbXBhcmFyIGxhIG1lZGlhIGRlIHZvdGFjacOzbiBhIE1lbmRvemEsIHVuYSB2YXJpYWJsZSBjdWFudGl0YXRpdmFzLCBlbnRyZSBncnVwb3MgZGUgbGEgdmFyaWFibGUgImNvc3RhIiwgdmFyaWFibGUgZGljb3TDs21pY2EuCgpMbyBwcmltZXJvIGVzIHZlciBsYXMgbWVkaWFzIGRlIGNhZGEgZ3J1cG8uCgpgYGB7ciBtZWRpYXN9CmxpYnJhcnkoZHBseXIpCmRhdGExNiAlPiUKICBncm91cF9ieShjb3N0YSkgJT4lCiAgc3VtbWFyaXNlKE1lZGlhID0gbWVhbihWb3RvX1ZNXzIwMTZfMSwgbmEucm0gPSBUKSkKYGBgCgpQYXJhIGFuYWxpemFyIHNpIGxhIGRpZmVyZW5jaWEgZW50cmUgMjkuNSB5IDE3LjkgZXMgc2lnbmlmaWNhdGl2YSwgc2UgcHVlZGUgY29ycmVyIHVuYSBwcnVlYmEgdCBkZSBkaWZlcmVuY2lhcyBkZSBtZWRpYXMuCgpgYGB7ciBwcnVlYmEgdH0KdC50ZXN0KFZvdG9fVk1fMjAxNl8xIH4gY29zdGEsIGRhdGE9ZGF0YTE2LCB2YXIuZXF1YWw9VCkKYGBgCgpEZSBlc3RvcyByZXN1bHRhZG9zLCB2ZW1vcyBxdWUgc2Ugb2J0aWVuZSB1biBwLXZhbHVlIGRlIDAuMDMsIHF1ZSBlcyBtZW5vciBhIDAuMDUuCkVzIGRlY2lyLCBsYSBkaWZlcmVuY2lhIGVuIGVsIHZvdG8gYSBWTSBlbnRyZSBkZXBhcnRhbWVudG9zIGRlIGxhIGNvc3RhIHkgbG9zIHF1ZSBubyBzb24gZGUgbGEgY29zdGEgc2Vyw61hIHNpZ25pZmljYXRpdmEuCgpQYXJhIGdyYWZpY2FyIGxhIHJlbGFjacOzbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMgYW50ZXMgc2UgaGEgdXNhZG8gdW4gYm94cGxvdCwgcXVlIG5vIG11ZXN0cmEgZGF0b3MgcGFyYSBsYSBpbmZlcmVuY2lhLCBzb2xvIGRhdG9zIGRlc2NyaXB0aXZvcy4KVGFtYmnDqW4gc2UgaGEgdXNhZG8gdW4gZ3LDoWZpY28gZGUgYmFycmFzIGRlIGVycm9yIHBhcmEgbW9zdHJhciBsYXMgbWVkaWFzIGRlIGNhZGEgZ3J1cG8gY29uIGVsIHJlc3BlY3Rpdm8gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YS4KCkVuIGVzdGEgc2VjY2nDs24sIHNlIHByb2R1Y2UgdW4gZ3LDoWZpY28gZGUgZGlzcGVyc2nDs24gZW50cmUgbGEgdmFyaWFibGUgImNvc3RhIiB5ICJ2b3RvIGEgUFBLIi4KRGViaWRvIGEgcXVlIGxhIHZhcmlhYmxlICJjb3N0YSIgZXMgZGljb3TDs21pY2EsIHNvbG8gdGllbmUgdmFsb3JlcyAwIHkgMSwgcG9yIGxvIHF1ZSBsb3MgcHVudG9zLCBxdWUgcmVwcmVzZW50YW4gYSBjYWRhIGRlcGFydGFtZW50bywgc2UgYWdydXBhbiBlbiBkb3MgbMOtbmVhcyB2ZXJ0aWNhbGVzLgoKYGBge3IgZ3JhZmljb30KbGlicmFyeShnZ3Bsb3QyKQpnZ3Bsb3QoZGF0YTE2LCBhZXMoeD1jb3N0YSwgeT1Wb3RvX1ZNXzIwMTZfMSkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3Ntb290aChtZXRob2Q9bG0sIHNlPUYpKyAjYWdyZWdhciBsw61uZWEgZGUgdGVuZGVuY2lhCiAgZ2VvbV90ZXh0KGRhdGE9ZGF0YTE2LCBhZXMobGFiZWw9RHB0byksIAogICAgICAgICAgICBjZXg9MiwgbnVkZ2VfeSA9IDEuMSwgY2hlY2tfb3ZlcmxhcCA9IFQpKyAjUGF0YSBldGlxdWV0YXIgbG9zIHB1bnRvcywgZGFybGVzIHVuIHRhbWHDsW8sIHViaWNhY2nDs24geSBwcmV2ZW5pciBxdWUgc2Ugc29icmVwb25nYW4KICBsYWJzKHg9IkNvc3RhIiwgCiAgICAgICB5PSJWb3RvIGEgVk0gKDFlcmEgdnVlbHRhKSIpKyAjcGFyYSBldGlxdWV0YXIgbG9zIGVqZXMKICB0aGVtZV9saWdodCgpCmBgYAoKRW4gZXN0ZSBncsOhZmljbyB0YW1iacOpbiBzZSBwdWVkZSBwZW5zYXIgZW4gdW5hIG1lam9yIHJlY3RhIGRlIHByZWRpY2Npw7NuLCBxdWUgcmVkdWNlIGxhIGRpc3RhbmNpYSBkZSBsb3MgcHVudG9zIGEgbGEgcmVjdGEuCkVzdGEgcmVjdGEgYXRyYXZpZXNhIHBvciBsYSBtZWRpYSBkZSBjYWRhIGdydXBvLgoKUG9yIGxvIHRhbnRvLCB1biBtb2RlbG8gZGUgcmVncmVzacOzbiBxdWUgdXNlIGVsIHZvdG8gYSBWTSBlbiBwcmltZXJhIHZ1ZWx0YSBlbiAyMDE2IGNvbW8gdmFyaWFibGUgZGVwZW5kaWVudGUgeSBsYSB2YXJpYWJsZSBkaWNvdMOzbWljYSAiY29zdGEiIGNvbW8gdmFyaWFibGUgaW5kZXBlbmRpZW50ZSBub3MgZGFyw61hIGxvcyBkYXRvcyBwYXJhIGxhIGNvbnN0cnVjY2nDs24gZGUgZXN0YSByZWN0YSBkZSBhcHJveGltYWNpw7NuLgoKYGBge3IgbW9kZWxvMX0KbW9kZWxvMSA9IGxtKGRhdGExNiRWb3RvX1ZNXzIwMTZfMSB+IGRhdGExNiRjb3N0YSkKc3VtbWFyeShtb2RlbG8xKQpgYGAKCmBgYHtyfQptb2RlbG8yID0gbG0oZGF0YTE2JFZvdG9fVk1fMjAxNl8xIH4gZGF0YTE2JGNvc3RhICsgZGF0YTE2JEFuYWxmYWJldGlzbW9fMjAxNCkKc3VtbWFyeShtb2RlbG8yKQpgYGAKCkxvcyByZXN1bHRhZG9zIGluZGljYW4gcXVlIGxhIHJlY3RhIGVzICRcaGF0e1l9ID0gMjkuNSAtIDExLjYqWCQuCkVzdGEgcmVjdGEgdGllbmUgZWwgdmFsb3IgZGUgMjkuNSBjdWFuZG8gWD0wLgpFcyBkZWNpciwgcGFyYSBsb3MgZGVwYXJ0YW1lbnRvcyBxdWUgbm8gc29uIGRlIGxhIGNvc3RhLCBlbCBwcm9tZWRpbyBkZSB2b3RvIGEgVk0gZXMgMjkuNSwgdGFsIGN1YWwgZW5jb250cmFtb3MgZGUgbWFuZXJhIGRlc2NyaXB0aXZhLgpDdWFuZG8gWD0xLCBlbCBwcm9tZWRpbyBkZSB2b3RvIGEgVk0gZXMgMjkuNSAtIDExLjYgPSAxNy45LCBxdWUgZXMgZWwgcHJvbWVkaW8gZGVsIHZvdG8gcGFyYSBsb3MgZGVwYXJ0YW1lbnRvcyBkZSBsYSBjb3N0YSwgZWwgbWlzbW8gdmFsb3IgcXVlIGVuY29udHJhbW9zIGRlIG1hbmVyYSBkZXNjcmlwdGl2YS4KCkVzIGRlY2lyIGxhIHJlY3RhIGRlIGFwcm94aW1hY2nDs24gcGFzYSBwb3IgZWwgcHJvbWVkaW8gZGVsIHZvdG8gYSBWTSBwYXJhIGxvcyBkZXBhcnRhbWVudG9zIHF1ZSBubyBzb24gZGUgbGEgY29zdGEgeSBwYXJhIGxvcyBxdWUgc8OtIHNvbiBkZSBsYSBjb3N0YS4KCkVsIG1vZGVsbyBkZSByZWdyZXNpw7NuIG5vIHNvbG8gcmVwbGljYSBsb3MgZGF0b3MsIHNpbm8gdGFtYmnDqW4gcmVwbGljYSBsYSBwcnVlYmEgZGUgc2lnbmlmaWNhbmNpYS4KTGEgaGlww7N0ZXNpcyBudWxhIHF1ZSBzZSBldmFsw7phIGFxdcOtIGVzOiAkXG11X3tjb3N0YX0gLSBcbXVfe25vIGNvc3RhfSQuCgpFbCBlc3RhZMOtc3RpY28gZGUgbGEgcHJ1ZWJhIHQgZXMgLTIuMTMgeSB1biBwLXZhbHVlIGRlIDAuMDQ0LgpFc3RvcyBkYXRvcyB0YW1iacOpbiBzZSBlbmN1ZW50cmFuIGVuIGxhIGzDrW5lYSBkZSBsYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlLgoKIyBSZWdyZXNpw7NuIGxpbmVhbCBwYXJhIHZhcmlhYmxlcyBmYWN0b3IKClNpIHF1aXNpw6lyZW1vcyBldmFsdWFyIGxhcyBkaWZlcmVuY2lhcyBlbiBlbCB2b3RvIGEgRnVqaW1vcmkgZW4gMjAxNiBlbnRyZSBsYXMgMyByZWdpb25lczogY29zdGEsIHNpZXJyYSB5IHNlbHZhLCBwb2Ryw61hbW9zIHVzYXIgdW5hIHZhcmlhYmxlIGRlcGVuZGllbnRlIG51bcOpcmljYSB5IHVuYSB2YXJpYWJsZSBpbmRlcGVuZGllbnRlIG5vbWluYWwgY29uIDMgY2F0ZWdvcsOtYXMuCgpMbyBwcmltZXJvIGVzIHZlciBsYXMgbWVkaWFzIGRlbCB2b3RvIGEgRnVqaW1vcmkgcGFyYSBjYWRhIGdydXBvLgoKYGBge3IgbWVkaWFzMn0KdGFibGExID0gZGF0YTE2ICU+JQogIGdyb3VwX2J5KHJlZ2lvbikgJT4lCiAgc3VtbWFyaXNlKE1lZGlhID0gbWVhbihWb3RvX0tGXzIwMTZfMSwgbmEucm0gPSBUKSkKdGFibGExCmBgYAoKUGFyYSBldmFsdWFyIGVzdGFzIG1lZGlhcyBtZWRpYW50ZSBlbCBhbsOhbGlzaXMgZGUgcmVncmVzacOzbiwgc2UgdGllbmUgcXVlIGNyZWFyIHZhcmlhYmxlcyBkdW1teSBwb3IgY2FkYSBncnVwbyBkZSBsYSB2YXJpYWJsZSAicmVnaW9uIi4KRXMgZGVjaXIsIDMgdmFyaWFibGVzOiAiY29zdGEiLCAic2llcnJhIiB5ICJzZWx2YSIsIEVuIGVsIG1vZGVsbyBkZSByZWdyZXNpw7NuLCBzaW4gZW1iYXJnbywgc29sbyBzZSBkZWJlIGluY2x1aXIgMiBkZSBlc2FzIHZhcmlhYmxlcyBkdW1teS4KCmBgYHtyIG1vZGVsbyBhb3Z9Cm1vZGVsbzIgPSBsbShkYXRhMTYkVm90b19LRl8yMDE2XzEgfiAgZGF0YTE2JGNvc3RhICsgZGF0YTE2JHNpZXJyYSsgZGF0YTE2JEFuYWxmYWJldGlzbW9fMjAxNCkKc3VtbWFyeShtb2RlbG8yKQpgYGAKClNlIGV4Y2x1eWUgbGEgdGVyY2VyYSB2YXJpYWJsZSBkdW1teSBkZWJpZG8gYSBxdWUgbG9zIHJlc3VsdGFkb3MgcGFyYSBlc3RlIGdydXBvIHNlIGVuY3VlbnRyYW4gZW4gZWwgaW50ZXJjZXB0byBlbiBlbCBhbsOhbGlzaXMgZGUgcmVncmVzacOzbi4KRXMgZGVjaXIsIGN1YW5kbyBjb3N0YT0wIHkgc2llcnJhPTAsIGVsIHZvdG8gcHJvbWVkaW8gYSBGdWppbW9yaSBlcyA0NC44NSwgbWlzbW8gdmFsb3IgcXVlIHNlIGVuY29udHLDsyBlbiBlbCBhbsOhbGlzaXMgZGVzY3JpcHRpdm8uCkN1YW5kbyBjb3N0YT0xIHkgc2llcnJhPTAsIGVsIHZvdG8gcHJvbWVkaW8gYSBGdWppbW9yaSBlcyA0NC44NS0yLjA1ID0gNDIuOCwgbWlzbW8gdmFsb3IgcXVlIHNlIGVuY29udHLDsyBlbiBlbCBhbsOhbGlzaXMgZGVzY3JpcHRpdm8uCkZpbmFsbWVudGUsIGN1YW5kbyBjb3N0YT0wIHkgc2llcnJhPTEsIGVsIHZvdG8gcHJvbWVkaW8gYSBGdWppbW9yaSBlcyA0NC44NS0xMy41Mz0zMS4zMiwgbWlzbW8gdmFsb3IgcXVlIHNlIGVuY29udHLDsyBlbiBlbCBhbsOhbGlzaXMgZGVzY3JpcHRpdm8uCgpWZW1vcyBxdWUgbG9zIGNvZWZpY2llbnRlcyBkZSBsYXMgMiB2YXJpYWJsZXMgZHVtbXkgc29uIGxhcyBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgZ3J1cG9zLgpMb3MgdmFsb3JlcyBkZSAyLjA1IHkgMTMuNTMgc29uIGxvcyBtaXNtb3MgcXVlIHNlIGV2YWx1YXJvbiBlbiBlbCB0ZXN0IGRlIFR1a2V5LgoKIyBDb25jbHVzacOzbgoKSGVtb3MgY29tZW56YWRvIGxhIGV4cGxpY2FjacOzbiBkZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gY29tbyB1bmEgZm9ybWEgcGFyYSBldmFsdWFyIGxhIHJlbGFjacOzbiBlbnRyZSBkb3MgdmFyaWFibGVzIG51bcOpcmljYXMuCkVuIGVzdGEgc2VjY2nDs24gaGVtb3MgZXhwYW5kaWRvIGVzdGEgaWRlYSB5IGhlbW9zIHZpc3RvIHF1ZSBlbCBtw6l0b2RvIGRlIHJlZ3Jlc2nDs24gc2UgcHVlZGUgdXNhciBjb24gdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIGRlIHRpcG8gY2F0ZWfDs3JpY28sIHlhIHNlYSBub21pbmFsIHUgb3JkaW5hbC4KRWwgw7puaWNvIHJlcXVpc2l0byBlcyBxdWUgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUgc2VhIG51bcOpcmljYS4KCkRlIGVzdGEgbWFuZXJhLCBlbCBtb2RlbG8gZGUgcmVncmVzacOzbiBzZSBwdWVkZSBleHByZXNhcgoKJCQKXGhhdHtZfSA9IFxoYXR7XGFscGhhfSArIFxoYXR7XGJldGFfMX0qWF8xK1xoYXR7XGJldGFfMn0qWF8yK1xoYXR7XGJldGFfM30qWF8zKy4uLitcaGF0e1xiZXRhX259KlhfbgokJAoKTG9zIHJlcXVpc2l0b3Mgc29uOgoKLSAgIFkgZXMgdW5hIHZhcmlhYmxlIG51bcOpcmljYQoKLSAgIFhzIHB1ZWRlbiBzZXIgbnVtw6lyaWNhcyBvIGNhdGVnw7NyaWNhcy4KICAgIFNpIGVzIGNhdGVnw7NyaWNhLCBzZSBkZWJlIGluY2x1aXIgY29tbyBkdW1teSBvIHNlcmllIGRlIHZhcmlhYmxlcyBkdW1teQoKLSAgIEVsIG7Dum1lcm8gZGUgdmFyaWFibGVzIGluZGVwZW5kaWVudGVzIG5vIHB1ZWRlIHNlciBtYXlvciBxdWUgZWwgbsO6bWVybyBkZSBvYnNlcnZhY2lvbmVzIG1lbm9zIDEgKE4tMSkuCgpFbiBlc3RlIGN1cnNvIHNlIGhhIHByZXNlbnRhZG8gZWwgYW7DoWxpc2lzIGRlIHJlZ3Jlc2nDs24gbGluZWFsIGNvbW8gdMOpY25pY2EgcGFyYSBldmFsdWFyIGxhIHJlbGFjacOzbiBiaXZhcmlhZGEgeSBwYXJhIGV2YWx1YXIgbGEgcmVsYWNpw7NuIG11bHRpdmFyaWFkYS4KQ29uIGxhIHTDqWNuaWNhIGRlIHJlZ3Jlc2nDs24gbXVsdGl2YXJpYWRhIHNlIHB1ZWRlIGFuYWxpemFyOgoKLSAgIExhIHZhbGlkZXogZGVsIG1vZGVsby4KCi0gICBMYSByZWxhY2nDs24gZGUgY2FkYSBwcmVkaWN0b3IgY29uIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLgoKLSAgIExhIGRpcmVjY2nDs24gZGUgbGEgcmVsYWNpw7NuIGVudHJlIGNhZGEgcHJlZGljdG9yIHkgbGEgdmFyaWFibGUgZGVwZW5kaWVudGUuCgotICAgTGEgZnVlcnphIGRlbCBtb2RlbG8uCgotICAgTGEgcHJlZGljY2nDs24gZGVsIG1vZGVsbyBwYXJhIGRpZmVyZW50ZXMgdmFsb3JlcyBkZSBsb3MgcHJlZGljdG9yZXMuCgojIFJlc3VtZW4KCkVuIGVzdGEgc2VjY2nDs24gcHJlc2VudGFtb3MgdW4gbWFwYSBkZSB0ZW1hcyBxdWUgaGVtb3MgdmlzdG8gYSBsbyBsYXJnbyBkZSB0b2RvIGVsIHNlbWVzdHJlLgpDb21vIHNlIHZlIGVuIGVsIGVzcXVlbWEsIGxhcyBoZXJyYW1pZW50YXMgcXVlIGhlbW9zIHZpc3RvIGVuIGVsIGN1cnNvIGRlcGVuZGVuIGRlIHVuIHB1bnRvIGRlIHBhcnRpZGEgaW5pY2lhbCwgcXVlIGVzIGxhIGRpc3RpbmNpw7NuIGVudHJlIHRpcG9zIGRlIHZhcmlhYmxlczogY3VhbGl0YXRpdmFzIG8gY2F0ZWfDs3JpY2FzIHkgY3VhbnRpdGF0aXZhcyBvIG51bcOpcmljYXMuCkRlcGVuZGllbmRvIGRlIGVzdGEgY2F0ZWdvcml6YWNpw7NuLCBzZSBkZXNwcmVuZGUgZWwgdGlwbyBkZSBhbsOhbGlzaXMgZGVzY3JpcHRpdm8sIHRhbnRvIGRlIGxhIHRlbmRlbmNpYSBjZW50cmFsLCBjb21vIGRlIGxhIGRpc3BlcnNpw7NuLCBhc8OtIGNvbW8gbGFzIGZvcm1hcyBkZSBncmFmaWNhciBlc3RhcyB2YXJpYWJsZXMuCgpDb21vIHBhc28gcHJldmlvIGEgbGEgaW5mZXJlbmNpYSwgc2UgY29uc3RydXllcm9uIGludGVydmFsb3MgZGUgY29uZmlhbnphIGRlIGxhIG1lZGlhICh2YXJpYWJsZXMgY3VhbnRpdGF2aXRhcykgbyBkZSBwcm9wb3JjaW9uZXMgKHZhcmlhYmxlcyBjdWFsaXRhdGl2YXMpLgpTZSBhbmFsaXrDsyBxdWUgc2UgcG9kw61hbiBjb25zdHJ1aXIgaW50ZXJ2YWxvcyBkZSBjb25maWFuemEgZGUgbWVkaWFzIG8gcHJvcG9yY2lvbmVzIHBhcmEgZ3J1cG9zLgpFc3RlIGVzIGVsIHByaW1lciBwYXNvIGRlIGxhIGluZmVyZW5jaWEuClNlIGV2YWx1w7Mgc2kgbG9zIGludGVydmFsb3MgZGUgY29uZmlhbnphIHNlIHRyYXNsYXBhYmFuIG8gbm8uCkVzdG8gZGFiYSBwYXNvIGFsIGFuw6FsaXNpcyBiaXZhcmlhZG8gZW4gbGEgc2VndW5kYSBwYXJ0ZSBkZWwgY3Vyc28uCgohW10oUmVzdW1lbi5wbmcpCgpFbiBlbCBsaWJybyBkZSBSaXRjaGV5IHNlIG11ZXN0cmEgZXN0ZSDDoXJib2wgZGUgZGVjaXNpw7NuLgpMYSByYW1hIGRlcmVjaGEgZGUgIkRvcyBtdWVzdHJhcyBvIGRvcyB2YXJpYWJsZXMiIG11ZXN0cmEgZWwgcmVzdW1lbiBkZSBsYSBzZWd1bmRhIHBhcnRlIGRlIGVzdGUgY3Vyc28uCkVzdGEgc2VndW5kYSBwYXJ0ZSBoYSBlc3RhZG8gZGVkaWNhZGEgYSBsYSBpbmZlcmVuY2lhIGVuIGVsIGFuw6FsaXNpcyBiaXZhcmlhZG8uCkNvbW8gaGVtb3MgYXZhbnphZG8gZW4gZXN0ZSBjdXJzbywgc2UgaGEgcHJlc2VudGFkbyBsYSBwcnVlYmEgZGUgaW5mZXJlbmNpYSB0LCBsYSBwcnVlYmEgRiBkZSBBTk9WQSwgbGEgcHJ1ZWJhIGRlIGNoaS1jdWFkcmFkbyB5IGxhIHJlZ3Jlc2nDs24gYml2YXJpYWRhLgpMdWVnbywgc2UgZGlvIGVsIHBhc28gYWwgYW7DoWxpc2lzIG11bHRpdmFyaWFkby4KCiFbXShhcmJvbC5wbmcpCgpGaW5hbG1lbnRlLCBlbCBvYmpldGl2byBkZSBlc3RlIGN1cnNvIGVzIHByZXNlbnRhciBoZXJyYW1pZW50YXMgaW5pY2lhbGVzIHBhcmEgZWwgYW7DoWxpc2lzIGRlIGRhdG9zIHNvY2lhbGVzLgpTZSBlc3BlcmEgcXVlIGx1ZWdvIGRlIGVzdGUgY3Vyc28gbG9zIGFsdW1ub3Mgc2VhbiBjb25zdW1pZG9yZXMgbyBwcm9kdWN0b3JlcyBjYXBhY2VzIGRlIGVzdGFkw61zdGljYS4KQ29tbyBjb25zdW1pZG9yZXMsIGxvcyBhbHVtbm9zIHZhbiBhIGVzdGFyIGV4cHVlc3RvcyBhIGxpdGVyYXR1cmEgZXNwZWNpYWxpemFkYSBxdWUgdXNlIG3DqXRvZG9zIGVzdGFkw61zdGljb3MuCkxhcyBoZXJyYW1pZW50YXMgdmlzdGFzIGVuIGVzdGUgY3Vyc28gcGVybWl0aXLDrWFuIHF1ZSBsb3MgYWx1bW5vcyBwdWVkYW4gZXZhbHVhciBlc3RvcyBhcnTDrWN1bG9zIHkgbG9zIGhhbGxhemdvcyBkZSBtYW5lcmEgY3LDrXRpY2EuCgpDb21vIHByb2R1Y3RvcmVzLCBzZSBlc3BlcmEgcXVlIGxvcyBhbHVtbm9zIHV0aWxpY2VuIGV2aWRlbmNpYSBudW3DqXJpY2EgeSBhbsOhbGlzaXMgZXN0YWTDrXN0aWNvIGVuIHN1cyB0cmFiYWpvcyBkZSBjdXJzb3MgeSBlbiBzdXMgdGVzaXMgZGUgcHJlZ3JhZG8uCllhIHNlYSBwYXJhIHByZXNlbnRhciBhbsOhbGlzaXMgZGVzY3JpcHRpdm8gbyBwYXJhIHJlYWxpemFyIGFuw6FsaXNpcyBpbmZlcmVuY2lhbCwgbG9zIGFsdW1ub3MgZGViZXLDrWFuIGVzdGFyIGVuIGxhIGNhcGFjaWRhZCBkZSByZWNvZ2VyIGRhdG9zIG51bcOpcmljb3MgeSB0cmFiYWphciBjb24gZXN0b3MgdXNhbmRvIHTDqWNuaWNhcyB2aXN0YXMgZW4gZXN0ZSBjdXJzby4KRXMgY29tcGxldGFtZW50ZSB2w6FsaWRvIHF1ZSBsb3MgYWx1bW5vcyB1c2VuIG90cm9zIG3DqXRvZG9zLCBwb3IgZWplbXBsbyBjdWFsaXRhdGl2b3MsIHBlcm8gc2kgZXN0ZSBjdXJzbyB5IGVsIHNpZ3VpZW50ZSBsb2dyYW4gcXVlIGFsZ3Vub3MgZGUgdXN0ZWRlcyBzZSAiYXRyZXZhbiIgYSB1c2FyIG3DqXRvZG9zIGN1YW50aXRhdGl2b3MsIGVzZSBzZXLDoSBlbCBtYXlvciBsb2dybyBkZSBlc3RlIGN1cnNvLgpHcmFjaWFzISEhCg==