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