0. Definición del ambiente de trabajo.
Al comenzar siempre es importante establecer el idioma adecuado para
que el programa reconozca caracteres especiales. En el caso de definir
al idioma español, la instrucción a utilizar es:
Sys.setlocale("LC_ALL", "es_ES") #alternativa 1
## [1] "es_ES/es_ES/es_ES/C/es_ES/C"
Sys.setenv(LANG = "es") #alternativa 2
También es importante instalar las librerías que se utilizarán
posteriormente:
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.3 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(DescTools)
library(haven)
Además es muy relevante establecer la ubicación del directorio de
trabajo, con el fin que el programa identifique la carpeta de la que
extraerá y, también, donde guardará la información solicitada.
getwd() ##directorio actual
## [1] "/Users/gustavo/Dropbox/R/Rmarkdown"
setwd("~/Dropbox/R") ##Esta permite cambiar y definir el directorio deseado
list.files() ##Esta permite enlistar los archivos dentro del directorio
## [1] "~$datos_morena_frag.xlsx"
## [2] "~$ia_ponencia_morena.docx"
## [3] "~$morena_nueva_encuesta_2020.xlsx"
## [4] "1-Estudio-Berumen-30mayo-6junio.PDF"
## [5] "200613COVID19MEXICO.csv"
## [6] "alumnos_political_compass.csv"
## [7] "autoestima.csv"
## [8] "Base Voto x Mujeres Experimento 1 copia.csv"
## [9] "base_alternancias.csv"
## [10] "Base_datos_Informe_Pais.xlsx"
## [11] "base_municipios_final_datos_01.csv"
## [12] "base_voto_mujeres_2012_2018.csv"
## [13] "base_votos_2015_2018.csv"
## [14] "Bertrand_data.dta"
## [15] "berumen_encuesta_6_junio.sav"
## [16] "Clase 2 DGAPA.xlsx"
## [17] "Clase 4 DGAPA.xlsx"
## [18] "Componente principal SPP.jpeg"
## [19] "Concentrado_Elecciones_Federales_1976_2018 copia.csv"
## [20] "conejos.csv"
## [21] "confidence_intervals_Coursera.rmd"
## [22] "Copia de factorial 3x2x2.csv"
## [23] "copia_semillas.csv"
## [24] "cuadro_latino.csv"
## [25] "Curso Intro a R I y II"
## [26] "data_clientelismo.csv"
## [27] "data_clientelismo.dta"
## [28] "datos_2_fac_aleat.csv"
## [29] "datos_computos_distritos_diputado.txt"
## [30] "datos_covid1.txt"
## [31] "datos_covid2.csv"
## [32] "datos_covid3.xlsx"
## [33] "datos_gc.csv"
## [34] "datos_morena_frag.xlsx"
## [35] "datos_pp1.csv"
## [36] "datos_pp2.csv"
## [37] "datos_repeticiones.csv"
## [38] "datos_telas.csv"
## [39] "diccionario_datos_covid19"
## [40] "Diferencia_votos_DIP_FED_2015.csv"
## [41] "diminish.txt"
## [42] "encuesta_abierta_morena_2020.xlsx"
## [43] "encuesta_abierta_morena.csv"
## [44] "Encuesta_Gea.dta"
## [45] "encuesta_nina_w_ 2016"
## [46] "encuesta_nueva_morena.csv"
## [47] "enpol_sec_5_6.csv"
## [48] "enpol_sec7_1.csv"
## [49] "enpol_sec8_9_10.csv"
## [50] "experim_azucar.csv"
## [51] "guia_ponencia_morena.docx"
## [52] "ICI_2018.xlsx"
## [53] "idh_mpio_2000_2005.csv"
## [54] "idh_mpio_2000_2005.xls"
## [55] "indices_spp_subnacional_1980_2018.xlsx"
## [56] "intro_to_data_Coursera.html"
## [57] "jerarquico_cruzado.csv"
## [58] "Latinobarometro_2018_Esp_Spss_v20190303.sav"
## [59] "Latinobarometro_2018_Esp_Stata_v20190303.dta"
## [60] "Latinobarometro_2020_Esp_Rdata_v1_0.rdata"
## [61] "mediciones_repetidas.csv"
## [62] "Mi_Exportación.xlsx"
## [63] "modelo_jerarquico.csv"
## [64] "morena_nueva_encuesta_2020.xlsx"
## [65] "morena-basedatos-integrada-vf-1.csv"
## [66] "morena-bd-integrada-estimación-empresas.xlsx"
## [67] "partylevel_20130907.csv"
## [68] "presid06computo.dta"
## [69] "Principal Component Analysis R Program and Output.pdf"
## [70] "resultados_diputadosfederales_2018.csv"
## [71] "Rmarkdown"
## [72] "scripts"
## [73] "SDEMT319_10.dta"
## [74] "sdemt319_10.sav"
## [75] "SDEMT319.dta"
## [76] "syllabus.log"
## [77] "syllabus.Rmd"
## [78] "syllabus.tex"
## [79] "Tabasco_votos_dip_loc_2018_dif.csv"
## [80] "tarea_hipertension.csv"
## [81] "TiposErrores.png"
## [82] "V-Dem-CY-Core-v12.csv"
## [83] "voto_cand_socioec_2012.csv"
## [84] "voto_cand_socioec_2015.csv"
## [85] "voto_cand_socioec_2018.csv"
## [86] "votos_diputados_2015.csv"
## [87] "votos_mujeres_2012_2018_copia.csv"
## [88] "votos_mujeres_2012_2018.csv"
Una vez establecido el directorio de trabajo, se debe cargar la base
de datos o data frame en el ambiente del programa, de la que se
analizará la información. Para ello habrá que “cargar” la información
sobre los pacientes infectados por COVID-19 reportados por la Secretaría
de Salud del gobierno federal mexicano.
datos_covid <- read.csv("~/Dropbox/R/200613COVID19MEXICO.csv", header = TRUE) #ruta de acceso a los datos, 'header = TRUE' en caso de que el archivo cuente con nombres de las variables.
1. Inferencia por intervalos.
Los Intervalos de Confianza (IC) son otra
técnica de estimación dentro del ámbito de la estadística inferencial.
Estos corresponden a un rango de valores generados a partir de datos de
una muestra y dentro del que se estima que se encontrará el “verdadero”
valor de la población. A diferencia del proceso de estimación puntual,
el cual compara un valor específico (un estadístico como, por ej., la
media de una variable) a partir de un valor calculado frente a un valor
crítico, evaluado a partir de sus probabilidades correspondientes, el IC
asume que dentro del conjunto de valores que abarca, una parte se
integra por un Margen de Error (ME) en torno al valor
puntual del estadístico puntual. Y de la unión de ambos
(ME y estadístico puntual, por ej. la media, mediana o proporción), se
cuenta con un Nivel de Confianza que permite inferir
que en su interior se contendrá al parámetro de interés.
Debido a la naturales del IC (un rango), este permite incluir en su
interior a un conjunto de probabilidades asociadas a los valores
puntuales que lo integran. Esto aumenta la probabilidad de, a su vez,
inferir el valor del parámetro de interés a diferencia de la técnica de
estimación puntual.
Fórmula de un IC a partir del estadístico puntual de la
media de una muestra: \[ \bar{x} \pm
ME \]
Por su parte, el ME se construye a partir de dos
elementos:
- Un Nivel de Confianza (definido en unidades \(Z\)) que se corresponde con la proporción o
probabilidad que el analista considera (arbitrariamente) pertinente para
aceptar que en el rango de interés se incluye al parámetro de interés y,
además, fuera de ello se encuentra el tamaño de error esperado y
aceptado.
- El segundo elemento consiste en el Error Estándar (ES), que
se refiere a la variación de una muestra respecto de una distribución
muestral, donde se asume que las muestras de ésta última son del mismo
tamaño que la primera.
Donde el ME es igual a: \[ME =
z^\star \frac{s}{\sqrt{n}}\]
A partir de los elementos que integran al IC: un
estimador puntual de interés para el análisis del
comportamiento de una población, un Nivel de Confianza definido
por el analista y el Error Estándar de la muestra, se calculan
dos valores aleatorios que definen los límites del rango de
valores del IC: su valor mínimo y su valor máximo.
De manera que el IC, calculado a partir del valor de la media de una
muestra, es igual al valor mínimo y al valor máximo derivado de: \[\bar{x} \pm z^\star
\frac{s}{\sqrt{n}}\]
1.1. Muestra e Intervalos de Confianza.
Para comenzar la demostración sobre la construcción de los IC y su
utilidad, a continuación se trabajará sobre una submuestra obtenida de
la base de datos sobre pacientes infectados con COVID-19 que elaboró la
Secretaría de Salud del Gobierno Federal de México. Esto con el fin de
establecer, primero, que un analista suele trabajar con muestras de
poblaciones en la gran mayoría de los casos, y esto supone que, segundo,
cada muestra puede mostrar variaciones en cuanto a los valores
calculados para un mismo estadístico. Lo que supone un reto para
aproximarse al estimar el valor del parámetro de interés en la población
-esto es lo último que se desea conocer en los análisis
cuantitativos.
A continuación se comenzará con la construcción de una submuestra,
para lo que se deberá, inicialmente, establecer el valor de “arranque” o
“semilla” en R, y a partir del que se integrarán los casos
aleatoriamente. Definir dicho valor inicial permite que los análisis
sean posteriormente reproducibles y arriben al mismo resultado.
1.1.1. Integración de una muestra aleatoria.
Dicho valor “semilla” es un número completamente arbitrario que es
definido por el analista, y su utilidad está en definir el valor inicial
que servirá para el proceso de aleatorización posterior. Esto permitirá
que las submuestras que se construyen, posteriormente, registrarán los
mismos casos y valores entre sí.
set.seed(54321)
A partir de los datos sobre los pacientes infectados con COVID-19 que
ha elaborado la SSA del gobierno federal mexicano, se deberá integrar
una submuestra con 10,000 casos. Para ello se usará el script
sample_n () de la paquetería dplyr, por lo que
deberá ser instalada previamente. Esta librería se incluye dentro del
paquete de otra librería más amplia, que es
tidyverse().
n_muestra <- 10000 #objeto que define el tamaño de la muestra
muestra <- sample_n(datos_covid, n_muestra) #script para integrar la muestra.
De esta manera, en el recuadro del “ambiente” de R Studio ahora
aparecen nuevos datos con el nombre de “muestra”, que se acaba de
integrar de manera aleatoria.
Pregunta: Describe la distribución de la variable EDAD en la muestra
recién integrada. ¿Cuál es el valor promedio y cuánto se desvían el
resto de los casos?
1.1.2. Elementos del Intervalo de Confianza.
Los valores de los estadísticos obtenidos de una muestra suelen ser
nuestro “mejor”, o en ocasiones el único, estimador para conocer un
parámetro de interés en una población. De esta manera, a partir de las
diversas técnicas de la estadística inferencial, dichos estadísticos
sirven como estimadores puntuales del parámetro
poblacional.
Por ejemplo, el estadístico de la media (\(\bar{x}\)) de una variable en una muestra
nos permite acercarnos al valor de la media en la población (\(\mu\)). Sin embargo el valor del
estadístico solo tiene asociado un solo valor de probabilidad,
y a partir de comparar su valor correspondiente en una distribución
muestral (el cuantil correspondiente según el estadístico
de prueba utilizado para evaluar su posición) con respecto
al valor crítico determinado a partir del mismo estadístico
de prueba, es que se puede determinar si dicho valor muestral se
aproxima probabilísticamente al valor poblacional.
Este proceso de comparación, que se denomina prueba de
significancia, se reporta a partir de un solo valor (que en
ocasiones se reduce al p-valor del valor obtenido o
calculado del estadístico muestral), y no necesariamente permite
identificar el tamaño de la incertidumbre que contiene el valor
calculado.
La utilidad de los IC radica en que, partiendo de un punto de
referencia -a partir del valor del estadístico de interés-
se puede estimar un rango de valores posibles que puede adoptar
el parámetro de interés a la vez que se incluye el grado de
incertidumbre en la estimación misma. De manera que el IC ofrece mayor
información al analista sobre el proceso de estimación:
- presenta el valor de estimación puntual y,
- el tamaño de incertidumbre contenida en la estimación.
Dicho tamaño de incertidumbre contenida en el rango establecido por
el IC también permite incluir una mayor cantidad de valores posibles que
puede adoptar el parámetro de interés y, a su vez, incorporar una
cantidad mayor de probabilidades asociadas a estos valores posibles.
Como se vio arriba, los elementos que integran a un IC son:
- estimador puntual que puede ser algún momento o
medida de tendencia central (media, mediana, proporción),
- margen de error, que supone la variación que existirá en
torno al estimador puntual.
El margen de error -como también se describió arriba- se
integra con dos elementos:
- el error estándar o típico de la muestra con respecto a la
distribución muestral, y
- el nivel de confianza establecido por el analista
previamente, y que depende del tipo de distribución de
probabilidades del estadístico de prueba utilizado para el
análisis (\(z, t, F, \chi^2, r\)).
1.1.2.1. Cálculo del estimador puntual para una variable
continua.
En el caso de trabajar con una variable del tipo
continua y con una distribución parecida a una
normal, la media suele ser el estimador puntual más pertinente.
Para ello se calculará la media de la variable EDAD de los pacientes en
la submuestra construida previamente.
x_barra <- mean(muestra $ EDAD)
x_barra
## [1] 42.4318
1.1.2.2. Determinación del Nivel de Confianza y su cuantil
correspondiente.
El Nivel de Confianza es una proporción definida
previamente por el analista, mediante la que define cuál es el
porcentaje de casos, y probabilidades, que desea incluir en el rango de
valores que busca estimar. Este nivel de confianza se determina a partir
de identificar el valor crítico asociado al Nivel de
Confianza deseado. Para ello se utilizará el script
qnorm().
El Nivel de Confianza no es lo mismo que un
percentil al momento de definir el valor crítico del
IC. El percentil se refiere al acumulado de probabilidades
ubicados a la izquierda del valor crítico mientras que el
Nivel de Confianza define el tamaño del rango de
valores, y sus probabilidades asociadas, en torno a (a su izquierda y
derecha) del estimador puntual seleccionado. De manera que el
Nivel de Confianza se refiere a un porcentaje de casos
ubicados al centro de la distribución.
Por ejemplo, un Nivel de Confianza del 95% se
refiere al 95% de los casos ubicados en torno al centro de la
distribución, mientras que un valor crítico asociado con esta área se
corresponde con el percentil 0.975 pues a la derecha de dicho valor
crítico quedará el 2.5% de los casos y, simétricamente, quedará el 2.5%
a la izquierda de la distribución. En total, la suma de estos valores
extremos será de 5% o una proporción de 0.05 (alfa).
La manera de identificar el valor del cuantil correspondiente a un
Nivel de Confianza del 95% para el IC es la
siguiente:
z_95 <- qnorm(0.975) #se usa la proporción 0.975 por que a su derecha se excluye al 0.025 de los casos y, de manera simétrica también se excluirá al 0.025 de los casos a la izquierda del rango.
z_95 #unidades de desviación estándar o "Z"
## [1] 1.959964
En el caso de trabajar con un Nivel de Confianza del
99%, se refiere al 99% de los casos ubicados en torno al centro de la
distribución, y su valor crítico correspondiente consiste en el
percentil 0.995 pues a la derecha de dicho valor crítico quedará el 0.5%
de los casos y, simétricamente, quedará el 0.5% a la izquierda de la
distribución. En toral, la suma de estos valores extremos será de 1% o
una proporción de 0.01 (alfa).
z_99 <- qnorm(0.995) #se usa la proporción 0.975 por que a su derecha se excluye al 0.025 de los casos y, de manera simétrica también se excluirá al 0.025 de los casos a la izquierda del rango.
z_99 #unidades de desviación estándar o "Z"
## [1] 2.575829
1.1.2.3. Cálculo del Error Estándar de la muestra.
El error estándar permite identificar la variación
que existe en la muestra analizada con respecto de la distribución
muestral de otras muestras (hipotéticas) del mismo tamaño (\(n\)) que la muestra original. Este valor
ayuda a establecer si el estimador utilizado (\(\bar{x}\)) es un buen estimador para
acercarse al parámetro poblacional de interés.
La manera de calcular el error estándar consiste en
dividir la desviación estándar de la variable analizada entre
la raíz cuadrada del tamaño de la muestra utilizada (\(\frac{s}{\sqrt{n}}\)).
error_std<-(sd(muestra$EDAD) / #desviación estándar de la variable EDAD en la muestra
sqrt(n_muestra)) #raíz cuadrada del tamaño de la muestra
error_std
## [1] 0.1655911
Otra manera de calcular el Error Estándar bajo la liberaría
DescTools() es:
SE <- MeanSE(muestra $ EDAD, sd = NULL, na.rm = TRUE)
SE
## [1] 0.1655911
1.3. Niveles de confianza.
A partir del uso de R y sus herramientas se pueden construir diversas
muestras aleatorias para, también, entender la manera en que pueden
variar los valores de la media y los IC entre sí.
Los pasos básicos a seguir son:
- Construir una muestra.
- Calcular la muestra y la desviación estándar para dicha muestra y
guardarlas para calcular, posteriormente, los límites inferior y
superior de los IC.
- Repetir estos 50 veces.
Para llevarlo a cabo se usa el script rep_sample_n para
construir 50 muestras aleatorias de tamaño n = 60 de una
población y, posteriormente, se calcularán los límites inferiores y
superiores de los IC. Con la siguiente fórmula se puede activar dicha
función.
rep_sample_n <- function(tbl, size, replace = FALSE, reps = 1)
{
n <- nrow(tbl)
i <- unlist(replicate(reps, sample.int(n, size, replace = replace),
simplify = FALSE))
rep_tbl <- cbind(replicate = rep(1:reps,rep(size,reps)), tbl[i,])
dplyr::group_by(rep_tbl, replicate)
} #Activación de la función "rep_sample_n()"
set.seed(1234)
ci <- datos_covid %>%
rep_sample_n(size = 60, reps = 50, replace = TRUE) ##creación de 50 muestras de n = 60, esto da un tamaño de muestra de 3000 (= 60 casos x 50 muestras)
Ahora se calculan los límites inferior y superior de cada una de las
50 muestras para, así, construir sus Intervalos de Confianza
respectivos:
ci <- ci %>% #Esta opción servirá para guardar a los IC como un nuevo objeto de formato 'tabla'
summarise(lim_inferior=mean(EDAD) - (z_95*(sd(EDAD) / sqrt(3000))), #límite inferior
lim_superior=mean(EDAD) + (z_95*(sd(EDAD) / sqrt(3000)))) #límite superior
Ahora se puede hacer una revisión “rápida” a los primeros cinco
IC:
ci %>%
slice(1:5)
## # A tibble: 5 × 3
## replicate lim_inferior lim_superior
## <int> <dbl> <dbl>
## 1 1 38.3 39.4
## 2 2 42.5 43.5
## 3 3 42.5 43.7
## 4 4 41.6 42.8
## 5 5 39.3 40.3
A partir del objeto que reúne los límites inferiores y superiores de
IC para 50 muestras se puede crear una gráfica que ayude a su
visualización y comparación.
El primer paso para la construcción de dicha gráfica consiste en
crear una variable nueva en el objeto ci recién creado, que
indique si el intervalo captura o no a la media poblacional. Hay que
notar que “capturar” dicho valor significa que el límite inferior del IC
se ubicará por debajo del valor del parámetro y el límite superior del
IC se encontrará por arriba de dicho valor poblacional.
Para crear la variable nueva se usará el script mutate()
de la librería dplyr.
ci <- ci %>%
mutate(captura_mu = ifelse(lim_inferior < param $ mu & lim_superior > param $ mu, "si", "no"))
Vistazo a las primeras cinco filas:
ci %>%
slice(1:5)
## # A tibble: 5 × 4
## replicate lim_inferior lim_superior captura_mu
## <int> <dbl> <dbl> <chr>
## 1 1 38.3 39.4 no
## 2 2 42.5 43.5 si
## 3 3 42.5 43.7 si
## 4 4 41.6 42.8 si
## 5 5 39.3 40.3 no
La función ifelse es un script alternativo para realizar
la transformación de una nueva variable a partir de una previamente
existente. Dicha función requiere tres argumentos: el primero consiste
en un argumento lógico, el segundo es el valor deseado si el argumento
lógico corresponde a un resultado verdadero y, el tercer argumento
corresponde al nuevo valor residual que se desea asignar en caso de que
el argumento lógico sea un resultado falso.
Ahora se cuenta con la información necesaria para crear el gráfico,
pero se deben re organizar los datos para facilitar su visualización.
Específicamente se necesita organizar los datos en un nuevo data frame
donde cada fila o renglón represente un límite, en contraposición a un
intervalo.
De manera que se desean manipular estos datos:
| 1 |
41.21044 |
41.95623 |
no |
| 2 |
46.93813 |
47.52854 |
no |
| 3 |
46.91318 |
47.55349 |
no |
Para que se re ordenen de la siguiente manera:
| 1 |
1 |
inferior |
41.21044 |
no |
| 2 |
2 |
inferior |
46.93813 |
no |
| 3 |
3 |
inferior |
46.91318 |
no |
| 4 |
1 |
superior |
41.95623 |
no |
| 5 |
2 |
superior |
47.52854 |
no |
| 6 |
3 |
superior |
47.55349 |
no |
Esto se logra a partir del siguiente script:
ci_data <- gather(ci, type, bound, lim_inferior : lim_superior)
Finalmente se construye el gráfico de los IC usando la librería
ggplot:
ggplot(data = ci_data, aes(x = bound, y = replicate,
group = replicate, color = captura_mu)) +
geom_point(size = 2) + # añade puntos al final de cada recta, de tamaño = 2
geom_line() + # conecta los puntos mediante líneas
geom_vline(xintercept = param $ mu, color = "darkgray") # dibuja una línea vertical en el valor del parámetro "mu"

Pregunta:
¿Cuál proporción de los IC construidos incluye al valor del
parámetro? ¿Esta proporción es exactamente igual al Nivel de Confianza
de los intervalos? Si no lo es, explica las razones.
2. Intervalos de confianza para una proporción.
En el caso de trabajar con una variable categórica, la construcción
de un Intervalo de Confianza se realiza a partir de la proporción de la
categoría de interés sobre la que se desea realizar la estimación hacia
la población.
Para realizar la construcción de los IC, a continuación se utilizará
la matriz de datos de la encuesta Latinobarómetro, en la ola para el año
2018 y que está disponible en su página web. Latinobarómetro
Esta se importa desde un formato ‘.sav’ para lo que se utiliza la
librería haven().
datos_lb <- haven::read_sav("~/Dropbox/R/Latinobarometro_2018_Esp_Spss_v20190303.sav")
Y ahora se solicitan las dimensiones del data frame para conocer su
tamaño:
dim(datos_lb)
## [1] 20204 395
De esta manera se sabe que se cuentan con 20204 filas y 395 columnas
o variables.
Además se solicita un listado de los nombres de la variables que
integran al data frame. Aquí se pide un vistazo a los primero 6 valores,
de las 395 columnas.
head(names(datos_lb))
## [1] "NUMINVES" "IDENPA" "NUMENTRE" "REG" "CIUDAD" "TAMCIUD"
A partir de este listado se identifica que los nombres de las
variables están codificados, y para conocer sus significados se debe
consultar del Libro de Códigos de la base de datos, que viene
incluido en el paquete de datos que se descarga desde la página de
Latinobarómetro.
En el libro de códigos se puede observar que la mayoría de las
variables que la integran son de tipo categóricas, y a su vez se
reconoce que no todas son de tipo binomial (cuentan con solo
dos categorías o valores posibles).
Al realizar el análisis para calcular los IC se debe reconocer,
inicialmente la distribución de los valores categóricos que integran a
cada variable. A continuación se realiza un primer acercamiento a la
exploración de la variable P12STGBS que corresponde al ítem de
Apoyo a la Democracia, y sus valores posibles son 3
categorías:
- La democracia es preferible a cualquier otra forma de gobierno.
- En algunas circunstancias, un gobierno autoritario puede ser
preferible.
- A la gente como uno, nos da lo mismo un régimen democrático que uno
no democrático.
Tabla de frecuencias absolutas:
table(datos_lb $ P12STGBS)
##
## 1 2 3
## 9723 2950 5654
Tabla de frecuencias relativas:
prop.table(table(datos_lb $ P12STGBS))
##
## 1 2 3
## 0.5305287 0.1609647 0.3085066
La librería DescTools() cuenta con distintas funciones
para construir IC para variables categóricas binominales y
multinomiales que facilitan el trabajo analítico.
En el caso de una variable categórica binominal, en donde se desea
estimar el IC primero se debe identificar la categoría de interés. En el
caso de la variable P12STGBS se considera que la categoría de interés
consiste en aquella codificada con el valor de “1”, que corresponde a la
etiqueta “1.- La democracia es preferible a cualquier otra forma de
gobierno.”
La función para solicitar el IC para esta categoría es:
BinomCI(x = 9723, #frecuencia absoluta para la categoría de interés
n = 18327,#casos válidos
conf.level = 0.95, #nivel de confianza
method = "clopper-pearson") ##Intervalo de confianza para una categoría
## est lwr.ci upr.ci
## [1,] 0.5305287 0.5232717 0.5377761
De esta manera se sabe que la proporción de encuestados que apoyan a
la democracia es del 53.05% en la muestra, y esta es nuestra mejor
estimación puntual para el apoyo a la democracia que se espera encontrar
en la población latinoamericana. Pero también se espera, con un 95% de
confianza, que el promedio de la población de ciudadanos
latinoamericanos que apoyan a la democracia se encuentre entre un 52.32%
y 53.77%.
En el caso de una variable categórica multinomial, la librería
DescTools()también cuenta con una función específica para
calcular el IC para cada una de las diversas categorías. Esta función
esMultinomCI(x =, conf.level =, sides =, method =), y se
aplicará a las 3 categorías que integran a la variable P12STGBS
observados <- c(9723, 2950, 5654) #se crea un objeto con las frecuencias absolutas para las 3 categorías
MultinomCI(observados, #se llama al objeto con las frecuencias absolutas para 3 categorías
conf.level = 0.95, # definición del nivel de confianza
method = "sisonglaz") # método para el cálculo del IC multinomial
## est lwr.ci upr.ci
## [1,] 0.5305287 0.5228352 0.5382768
## [2,] 0.1609647 0.1532711 0.1687127
## [3,] 0.3085066 0.3008130 0.3162546
3. Ejercicios.
¿La distribución de los datos en una muestra aleatoria deben
iguales a otras distribuciones en otras muestras que se recolectaron de
la misma población: Verdadero o Falso?
¿Qué significa una confianza del 95%?
- 95% de las veces el promedio de la población se encontrará dentro
del intervalo.
- 95% de las muestras aleatorias del mismo tamaño generarán IC que
contengan al valor verdadero de la población.
- 95% de la población tendrá el mismo IC.
- Se está 95% confidente de que la media muestral se encuentra dentro
del IC.
- ¿Cuál es el valor crítico apropiado para un Nivel de Confianza del
99%?
- 0.01
- 0.99
- 1.96
- 2.33
- 2.58
Calcula 50 IC con un Nivel de Confianza del 99%. No se necesita
generar nuevas muestras, solamente se requiere calcular nuevos IC
basados en las medias y desviaciones estándar de las muestras
previamente generadas. Grafica todos los intervalos y calcula la
proporción de IC que incluyen al valor del parámetro de la media
poblacional.
A partir del ejercicio anterior, ¿se esperaría que el 99% de los
intervalos contengan el valor del parámetro estimado?
- Cierto
- Falso
LS0tCnRpdGxlOiAiSW50ZXJ2YWxvcyBkZSBjb25maWFuemEgcGFyYSB1biBlc3RhZMOtc3RpY28iCmF1dGhvcjogIkd1c3Rhdm8gTWFydMOtbmV6IFZhbGRlcyIKZGF0ZTogIjIwMjMtMTAtMjUiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZGVwdGg6IDUKICAgIHRvY19mbG9hdDogVFJVRQogICAgbnVtYmVyX3NlY3Rpb246IEZBTFNFCiAgICB0aGVtZTogImNvc21vIgogICAgY29kZV9kb3dubG9hZDogVFJVRQogICAgY29kZV9mb2xkaW5nOiBzaG93CmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKIyMgMC4gRGVmaW5pY2nDs24gZGVsIGFtYmllbnRlIGRlIHRyYWJham8uCgpBbCBjb21lbnphciBzaWVtcHJlIGVzIGltcG9ydGFudGUgZXN0YWJsZWNlciBlbCBpZGlvbWEgYWRlY3VhZG8gcGFyYSBxdWUgZWwgcHJvZ3JhbWEgcmVjb25vemNhIGNhcmFjdGVyZXMgZXNwZWNpYWxlcy4gRW4gZWwgY2FzbyBkZSBkZWZpbmlyIGFsIGlkaW9tYSBlc3Bhw7FvbCwgbGEgaW5zdHJ1Y2Npw7NuIGEgdXRpbGl6YXIgZXM6CgpgYGB7ciBpZGlvbWF9ClN5cy5zZXRsb2NhbGUoIkxDX0FMTCIsICJlc19FUyIpICNhbHRlcm5hdGl2YSAxClN5cy5zZXRlbnYoTEFORyA9ICJlcyIpICNhbHRlcm5hdGl2YSAyCmBgYAoKVGFtYmnDqW4gZXMgaW1wb3J0YW50ZSBpbnN0YWxhciBsYXMgbGlicmVyw61hcyBxdWUgc2UgdXRpbGl6YXLDoW4gcG9zdGVyaW9ybWVudGU6CgpgYGB7ciBsaWJyZXJpYX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoRGVzY1Rvb2xzKQpsaWJyYXJ5KGhhdmVuKQpgYGAKCkFkZW3DoXMgZXMgbXV5IHJlbGV2YW50ZSBlc3RhYmxlY2VyIGxhIHViaWNhY2nDs24gZGVsIGRpcmVjdG9yaW8gZGUgdHJhYmFqbywgY29uIGVsIGZpbiBxdWUgZWwgcHJvZ3JhbWEgaWRlbnRpZmlxdWUgbGEgY2FycGV0YSBkZSBsYSBxdWUgZXh0cmFlcsOhIHksIHRhbWJpw6luLCBkb25kZSBndWFyZGFyw6EgbGEgaW5mb3JtYWNpw7NuIHNvbGljaXRhZGEuCgpgYGB7ciBkaXJlY3RvcmlvfQpnZXR3ZCgpICMjZGlyZWN0b3JpbyBhY3R1YWwKc2V0d2QoIn4vRHJvcGJveC9SIikgIyNFc3RhIHBlcm1pdGUgY2FtYmlhciB5IGRlZmluaXIgZWwgZGlyZWN0b3JpbyBkZXNlYWRvCmxpc3QuZmlsZXMoKSAjI0VzdGEgcGVybWl0ZSBlbmxpc3RhciBsb3MgYXJjaGl2b3MgZGVudHJvIGRlbCBkaXJlY3RvcmlvCmBgYAoKVW5hIHZleiBlc3RhYmxlY2lkbyBlbCBkaXJlY3RvcmlvIGRlIHRyYWJham8sIHNlIGRlYmUgY2FyZ2FyIGxhIGJhc2UgZGUgZGF0b3MgbyBkYXRhIGZyYW1lIGVuIGVsIGFtYmllbnRlIGRlbCBwcm9ncmFtYSwgZGUgbGEgcXVlIHNlIGFuYWxpemFyw6EgbGEgaW5mb3JtYWNpw7NuLiBQYXJhIGVsbG8gaGFicsOhIHF1ZSAiY2FyZ2FyIiBsYSBpbmZvcm1hY2nDs24gc29icmUgbG9zIHBhY2llbnRlcyBpbmZlY3RhZG9zIHBvciBDT1ZJRC0xOSByZXBvcnRhZG9zIHBvciBsYSBTZWNyZXRhcsOtYSBkZSBTYWx1ZCBkZWwgZ29iaWVybm8gZmVkZXJhbCBtZXhpY2Fuby4KCmBgYHtyIGNhcmdhX2RhdG9zfQpkYXRvc19jb3ZpZCA8LSByZWFkLmNzdigifi9Ecm9wYm94L1IvMjAwNjEzQ09WSUQxOU1FWElDTy5jc3YiLCBoZWFkZXIgPSBUUlVFKSAjcnV0YSBkZSBhY2Nlc28gYSBsb3MgZGF0b3MsICdoZWFkZXIgPSBUUlVFJyBlbiBjYXNvIGRlIHF1ZSBlbCBhcmNoaXZvIGN1ZW50ZSBjb24gbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzLgpgYGAKCgojIyAxLiBJbmZlcmVuY2lhIHBvciBpbnRlcnZhbG9zLgoKTG9zICoqKkludGVydmFsb3MgZGUgQ29uZmlhbnphKioqIChJQykgc29uIG90cmEgdMOpY25pY2EgZGUgZXN0aW1hY2nDs24gZGVudHJvIGRlbCDDoW1iaXRvIGRlIGxhIGVzdGFkw61zdGljYSBpbmZlcmVuY2lhbC4gRXN0b3MgY29ycmVzcG9uZGVuIGEgdW4gcmFuZ28gZGUgdmFsb3JlcyBnZW5lcmFkb3MgYSBwYXJ0aXIgZGUgZGF0b3MgZGUgdW5hIG11ZXN0cmEgeSBkZW50cm8gZGVsIHF1ZSBzZSBlc3RpbWEgcXVlIHNlIGVuY29udHJhcsOhIGVsICJ2ZXJkYWRlcm8iIHZhbG9yIGRlIGxhIHBvYmxhY2nDs24uIApBIGRpZmVyZW5jaWEgZGVsIHByb2Nlc28gZGUgZXN0aW1hY2nDs24gcHVudHVhbCwgZWwgY3VhbCBjb21wYXJhIHVuIHZhbG9yIGVzcGVjw61maWNvICh1biBlc3RhZMOtc3RpY28gY29tbywgcG9yIGVqLiwgbGEgbWVkaWEgZGUgdW5hIHZhcmlhYmxlKSBhIHBhcnRpciBkZSB1biB2YWxvciBjYWxjdWxhZG8gZnJlbnRlIGEgdW4gdmFsb3IgY3LDrXRpY28sIGV2YWx1YWRvIGEgcGFydGlyIGRlIHN1cyBwcm9iYWJpbGlkYWRlcyBjb3JyZXNwb25kaWVudGVzLCBlbCBJQyBhc3VtZSBxdWUgZGVudHJvIGRlbCBjb25qdW50byBkZSB2YWxvcmVzIHF1ZSBhYmFyY2EsIHVuYSBwYXJ0ZSBzZSBpbnRlZ3JhIHBvciB1biAqKk1hcmdlbiBkZSBFcnJvcioqIChNRSkgZW4gdG9ybm8gYWwgdmFsb3IgcHVudHVhbCBkZWwgKiplc3RhZMOtc3RpY28gcHVudHVhbCoqLiAgWSBkZSBsYSB1bmnDs24gZGUgYW1ib3MgKE1FIHkgZXN0YWTDrXN0aWNvIHB1bnR1YWwsIHBvciBlai4gbGEgbWVkaWEsIG1lZGlhbmEgbyBwcm9wb3JjacOzbiksIHNlIGN1ZW50YSBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBxdWUgcGVybWl0ZSBpbmZlcmlyIHF1ZSBlbiBzdSBpbnRlcmlvciBzZSBjb250ZW5kcsOhIGFsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMuCgpEZWJpZG8gYSBsYSBuYXR1cmFsZXMgZGVsIElDICh1biByYW5nbyksIGVzdGUgcGVybWl0ZSBpbmNsdWlyIGVuIHN1IGludGVyaW9yIGEgdW4gY29uanVudG8gZGUgcHJvYmFiaWxpZGFkZXMgYXNvY2lhZGFzIGEgbG9zIHZhbG9yZXMgcHVudHVhbGVzIHF1ZSBsbyBpbnRlZ3Jhbi4gRXN0byBhdW1lbnRhIGxhIHByb2JhYmlsaWRhZCBkZSwgYSBzdSB2ZXosIGluZmVyaXIgZWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgYSBkaWZlcmVuY2lhIGRlIGxhIHTDqWNuaWNhIGRlIGVzdGltYWNpw7NuIHB1bnR1YWwuCgpGw7NybXVsYSBkZSB1biBJQyBhIHBhcnRpciBkZWwgZXN0YWTDrXN0aWNvIHB1bnR1YWwgZGUgbGEgKm1lZGlhKiBkZSB1bmEgbXVlc3RyYToKJCQgXGJhcnt4fSBccG0gTUUgJCQKClBvciBzdSBwYXJ0ZSwgZWwgKipNRSoqIHNlIGNvbnN0cnV5ZSBhIHBhcnRpciBkZSBkb3MgZWxlbWVudG9zOiAKCiAgaS4gVW4gKk5pdmVsIGRlIENvbmZpYW56YSogKGRlZmluaWRvIGVuIHVuaWRhZGVzICRaJCkgcXVlIHNlIGNvcnJlc3BvbmRlIGNvbiBsYSBwcm9wb3JjacOzbiBvIHByb2JhYmlsaWRhZCBxdWUgZWwgYW5hbGlzdGEgY29uc2lkZXJhIChhcmJpdHJhcmlhbWVudGUpIHBlcnRpbmVudGUgcGFyYSBhY2VwdGFyIHF1ZSBlbiBlbCByYW5nbyBkZSBpbnRlcsOpcyBzZSBpbmNsdXllIGFsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgeSwgYWRlbcOhcywgZnVlcmEgZGUgZWxsbyBzZSBlbmN1ZW50cmEgZWwgdGFtYcOxbyBkZSBlcnJvciBlc3BlcmFkbyB5IGFjZXB0YWRvLiAKICBpaS4gRWwgc2VndW5kbyBlbGVtZW50byBjb25zaXN0ZSBlbiBlbCAqRXJyb3IgRXN0w6FuZGFyKiAoRVMpLCBxdWUgc2UgcmVmaWVyZSBhIGxhIHZhcmlhY2nDs24gZGUgdW5hIG11ZXN0cmEgcmVzcGVjdG8gZGUgdW5hIGRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwsIGRvbmRlIHNlIGFzdW1lIHF1ZSBsYXMgbXVlc3RyYXMgZGUgw6lzdGEgw7psdGltYSBzb24gZGVsIG1pc21vIHRhbWHDsW8gcXVlIGxhIHByaW1lcmEuCgpEb25kZSBlbCAqTUUqIGVzIGlndWFsIGE6ICQkTUUgPSB6XlxzdGFyIFxmcmFje3N9e1xzcXJ0e259fSQkCgpBIHBhcnRpciBkZSBsb3MgZWxlbWVudG9zIHF1ZSBpbnRlZ3JhbiBhbCAqKklDKio6IHVuICplc3RpbWFkb3IgcHVudHVhbCogZGUgaW50ZXLDqXMgcGFyYSBlbCBhbsOhbGlzaXMgZGVsIGNvbXBvcnRhbWllbnRvIGRlIHVuYSBwb2JsYWNpw7NuLCB1biAqTml2ZWwgZGUgQ29uZmlhbnphKiBkZWZpbmlkbyBwb3IgZWwgYW5hbGlzdGEgeSBlbCAqRXJyb3IgRXN0w6FuZGFyKiBkZSBsYSBtdWVzdHJhLCBzZSBjYWxjdWxhbiBkb3MgdmFsb3JlcyAqYWxlYXRvcmlvcyogcXVlIGRlZmluZW4gbG9zIGzDrW1pdGVzIGRlbCByYW5nbyBkZSB2YWxvcmVzIGRlbCBJQzogc3UgdmFsb3IgbcOtbmltbyB5IHN1IHZhbG9yIG3DoXhpbW8uCgpEZSBtYW5lcmEgcXVlIGVsIElDLCBjYWxjdWxhZG8gYSBwYXJ0aXIgZGVsIHZhbG9yIGRlIGxhIG1lZGlhIGRlIHVuYSBtdWVzdHJhLCBlcyBpZ3VhbCBhbCB2YWxvciBtw61uaW1vIHkgYWwgdmFsb3IgbcOheGltbyBkZXJpdmFkbyBkZTogJCRcYmFye3h9IFxwbSB6XlxzdGFyIFxmcmFje3N9e1xzcXJ0e259fSQkCgoKIyMjIDEuMS4gTXVlc3RyYSBlIEludGVydmFsb3MgZGUgQ29uZmlhbnphLgoKUGFyYSBjb21lbnphciBsYSBkZW1vc3RyYWNpw7NuIHNvYnJlIGxhIGNvbnN0cnVjY2nDs24gZGUgbG9zIElDIHkgc3UgdXRpbGlkYWQsIGEgY29udGludWFjacOzbiBzZSB0cmFiYWphcsOhIHNvYnJlIHVuYSBzdWJtdWVzdHJhIG9idGVuaWRhIGRlIGxhIGJhc2UgZGUgZGF0b3Mgc29icmUgcGFjaWVudGVzIGluZmVjdGFkb3MgY29uIENPVklELTE5IHF1ZSBlbGFib3LDsyBsYSBTZWNyZXRhcsOtYSBkZSBTYWx1ZCBkZWwgR29iaWVybm8gRmVkZXJhbCBkZSBNw6l4aWNvLiBFc3RvIGNvbiBlbCBmaW4gZGUgZXN0YWJsZWNlciwgcHJpbWVybywgcXVlIHVuIGFuYWxpc3RhIHN1ZWxlIHRyYWJhamFyIGNvbiBtdWVzdHJhcyBkZSBwb2JsYWNpb25lcyBlbiBsYSBncmFuIG1heW9yw61hIGRlIGxvcyBjYXNvcywgeSBlc3RvIHN1cG9uZSBxdWUsIHNlZ3VuZG8sIGNhZGEgbXVlc3RyYSBwdWVkZSBtb3N0cmFyIHZhcmlhY2lvbmVzIGVuIGN1YW50byBhIGxvcyB2YWxvcmVzIGNhbGN1bGFkb3MgcGFyYSB1biBtaXNtbyBlc3RhZMOtc3RpY28uIExvIHF1ZSBzdXBvbmUgdW4gcmV0byBwYXJhIGFwcm94aW1hcnNlIGFsIGVzdGltYXIgZWwgdmFsb3IgZGVsIHBhcsOhbWV0cm8gZGUgaW50ZXLDqXMgZW4gbGEgcG9ibGFjacOzbiAtZXN0byBlcyBsbyDDumx0aW1vIHF1ZSBzZSBkZXNlYSBjb25vY2VyIGVuIGxvcyBhbsOhbGlzaXMgY3VhbnRpdGF0aXZvcy4KCkEgY29udGludWFjacOzbiBzZSBjb21lbnphcsOhIGNvbiBsYSBjb25zdHJ1Y2Npw7NuIGRlIHVuYSBzdWJtdWVzdHJhLCBwYXJhIGxvIHF1ZSBzZSBkZWJlcsOhLCBpbmljaWFsbWVudGUsIGVzdGFibGVjZXIgZWwgdmFsb3IgZGUgImFycmFucXVlIiBvICJzZW1pbGxhIiBlbiBSLCB5IGEgcGFydGlyIGRlbCBxdWUgc2UgaW50ZWdyYXLDoW4gbG9zIGNhc29zIGFsZWF0b3JpYW1lbnRlLiBEZWZpbmlyIGRpY2hvIHZhbG9yIGluaWNpYWwgcGVybWl0ZSBxdWUgbG9zIGFuw6FsaXNpcyBzZWFuIHBvc3Rlcmlvcm1lbnRlIHJlcHJvZHVjaWJsZXMgeSBhcnJpYmVuIGFsIG1pc21vIHJlc3VsdGFkby4KCgojIyMjIDEuMS4xLiBJbnRlZ3JhY2nDs24gZGUgdW5hIG11ZXN0cmEgYWxlYXRvcmlhLgoKRGljaG8gdmFsb3IgInNlbWlsbGEiIGVzIHVuIG7Dum1lcm8gY29tcGxldGFtZW50ZSBhcmJpdHJhcmlvIHF1ZSBlcyBkZWZpbmlkbyBwb3IgZWwgYW5hbGlzdGEsIHkgc3UgdXRpbGlkYWQgZXN0w6EgZW4gZGVmaW5pciBlbCB2YWxvciBpbmljaWFsIHF1ZSBzZXJ2aXLDoSBwYXJhIGVsIHByb2Nlc28gZGUgYWxlYXRvcml6YWNpw7NuIHBvc3Rlcmlvci4gRXN0byBwZXJtaXRpcsOhIHF1ZSBsYXMgc3VibXVlc3RyYXMgcXVlIHNlIGNvbnN0cnV5ZW4sIHBvc3Rlcmlvcm1lbnRlLCByZWdpc3RyYXLDoW4gbG9zIG1pc21vcyBjYXNvcyB5IHZhbG9yZXMgZW50cmUgc8OtLgoKYGBge3Igc2VlZH0Kc2V0LnNlZWQoNTQzMjEpCmBgYAoKQSBwYXJ0aXIgZGUgbG9zIGRhdG9zIHNvYnJlIGxvcyBwYWNpZW50ZXMgaW5mZWN0YWRvcyBjb24gQ09WSUQtMTkgcXVlIGhhIGVsYWJvcmFkbyBsYSBTU0EgZGVsIGdvYmllcm5vIGZlZGVyYWwgbWV4aWNhbm8sIHNlIGRlYmVyw6EgaW50ZWdyYXIgdW5hIHN1Ym11ZXN0cmEgY29uIDEwLDAwMCBjYXNvcy4gUGFyYSBlbGxvIHNlIHVzYXLDoSBlbCBzY3JpcHQgYHNhbXBsZV9uICgpYCBkZSBsYSBwYXF1ZXRlcsOtYSBgZHBseXJgLCBwb3IgbG8gcXVlIGRlYmVyw6Egc2VyIGluc3RhbGFkYSBwcmV2aWFtZW50ZS4gRXN0YSBsaWJyZXLDrWEgc2UgaW5jbHV5ZSBkZW50cm8gZGVsIHBhcXVldGUgZGUgb3RyYSBsaWJyZXLDrWEgbcOhcyBhbXBsaWEsIHF1ZSBlcyBgdGlkeXZlcnNlKClgLgoKYGBge3Igc3VibXVlc3RyYX0Kbl9tdWVzdHJhIDwtIDEwMDAwICNvYmpldG8gcXVlIGRlZmluZSBlbCB0YW1hw7FvIGRlIGxhIG11ZXN0cmEKbXVlc3RyYSA8LSBzYW1wbGVfbihkYXRvc19jb3ZpZCwgbl9tdWVzdHJhKSAjc2NyaXB0IHBhcmEgaW50ZWdyYXIgbGEgbXVlc3RyYS4KYGBgCgpEZSBlc3RhIG1hbmVyYSwgZW4gZWwgcmVjdWFkcm8gZGVsICJhbWJpZW50ZSIgZGUgUiBTdHVkaW8gYWhvcmEgYXBhcmVjZW4gbnVldm9zIGRhdG9zIGNvbiBlbCBub21icmUgZGUgIm11ZXN0cmEiLCBxdWUgc2UgYWNhYmEgZGUgaW50ZWdyYXIgZGUgbWFuZXJhIGFsZWF0b3JpYS4KCgpQcmVndW50YToKRGVzY3JpYmUgbGEgZGlzdHJpYnVjacOzbiBkZSBsYSB2YXJpYWJsZSBFREFEIGVuIGxhIG11ZXN0cmEgcmVjacOpbiBpbnRlZ3JhZGEuIMK/Q3XDoWwgZXMgZWwgdmFsb3IgcHJvbWVkaW8geSBjdcOhbnRvIHNlIGRlc3bDrWFuIGVsIHJlc3RvIGRlIGxvcyBjYXNvcz8KCgojIyMjIDEuMS4yLiBFbGVtZW50b3MgZGVsIEludGVydmFsbyBkZSBDb25maWFuemEuCgpMb3MgdmFsb3JlcyBkZSBsb3MgZXN0YWTDrXN0aWNvcyBvYnRlbmlkb3MgZGUgdW5hIG11ZXN0cmEgc3VlbGVuIHNlciBudWVzdHJvICJtZWpvciIsIG8gZW4gb2Nhc2lvbmVzIGVsIMO6bmljbywgZXN0aW1hZG9yIHBhcmEgY29ub2NlciB1biBwYXLDoW1ldHJvIGRlIGludGVyw6lzIGVuIHVuYSBwb2JsYWNpw7NuLiBEZSBlc3RhIG1hbmVyYSwgYSBwYXJ0aXIgZGUgbGFzIGRpdmVyc2FzIHTDqWNuaWNhcyBkZSBsYSBlc3RhZMOtc3RpY2EgaW5mZXJlbmNpYWwsIGRpY2hvcyBlc3RhZMOtc3RpY29zIHNpcnZlbiBjb21vICplc3RpbWFkb3JlcyBwdW50dWFsZXMqIGRlbCBwYXLDoW1ldHJvIHBvYmxhY2lvbmFsLgoKUG9yIGVqZW1wbG8sIGVsIGVzdGFkw61zdGljbyBkZSBsYSBtZWRpYSAoJFxiYXJ7eH0kKSBkZSB1bmEgdmFyaWFibGUgZW4gdW5hIG11ZXN0cmEgbm9zIHBlcm1pdGUgYWNlcmNhcm5vcyBhbCB2YWxvciBkZSBsYSBtZWRpYSBlbiBsYSBwb2JsYWNpw7NuICgkXG11JCkuIFNpbiBlbWJhcmdvIGVsIHZhbG9yIGRlbCAqZXN0YWTDrXN0aWNvKiBzb2xvIHRpZW5lIGFzb2NpYWRvIHVuIHNvbG8gdmFsb3IgZGUgcHJvYmFiaWxpZGFkLCB5IGEgcGFydGlyIGRlIGNvbXBhcmFyIHN1IHZhbG9yIGNvcnJlc3BvbmRpZW50ZSBlbiB1bmEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCAoZWwgKmN1YW50aWwqIGNvcnJlc3BvbmRpZW50ZSBzZWfDum4gZWwgKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqIHV0aWxpemFkbyBwYXJhIGV2YWx1YXIgc3UgKnBvc2ljacOzbiopIGNvbiByZXNwZWN0byBhbCAqdmFsb3IgY3LDrXRpY28qIGRldGVybWluYWRvIGEgcGFydGlyIGRlbCBtaXNtbyAqZXN0YWTDrXN0aWNvIGRlIHBydWViYSosIGVzIHF1ZSBzZSBwdWVkZSBkZXRlcm1pbmFyIHNpIGRpY2hvIHZhbG9yIG11ZXN0cmFsIHNlIGFwcm94aW1hIHByb2JhYmlsw61zdGljYW1lbnRlIGFsIHZhbG9yIHBvYmxhY2lvbmFsLgoKRXN0ZSBwcm9jZXNvIGRlIGNvbXBhcmFjacOzbiwgcXVlIHNlIGRlbm9taW5hICoqcHJ1ZWJhIGRlIHNpZ25pZmljYW5jaWEqKiwgc2UgcmVwb3J0YSBhIHBhcnRpciBkZSB1biBzb2xvIHZhbG9yIChxdWUgZW4gb2Nhc2lvbmVzIHNlIHJlZHVjZSBhbCAqcC12YWxvciogZGVsICp2YWxvciBvYnRlbmlkbyBvIGNhbGN1bGFkbyogZGVsIGVzdGFkw61zdGljbyBtdWVzdHJhbCksIHkgbm8gbmVjZXNhcmlhbWVudGUgcGVybWl0ZSBpZGVudGlmaWNhciBlbCB0YW1hw7FvIGRlIGxhIGluY2VydGlkdW1icmUgcXVlIGNvbnRpZW5lIGVsIHZhbG9yIGNhbGN1bGFkby4KCkxhIHV0aWxpZGFkIGRlIGxvcyBJQyByYWRpY2EgZW4gcXVlLCBwYXJ0aWVuZG8gZGUgdW4gKnB1bnRvIGRlIHJlZmVyZW5jaWEqIC1hIHBhcnRpciBkZWwgdmFsb3IgZGVsICplc3RhZMOtc3RpY28gZGUgaW50ZXLDqXMqLSBzZSBwdWVkZSBlc3RpbWFyIHVuICpyYW5nbyogZGUgdmFsb3JlcyBwb3NpYmxlcyBxdWUgcHVlZGUgYWRvcHRhciBlbCAqcGFyw6FtZXRybyBkZSBpbnRlcsOpcyogYSBsYSB2ZXogcXVlIHNlIGluY2x1eWUgZWwgZ3JhZG8gZGUgaW5jZXJ0aWR1bWJyZSBlbiBsYSBlc3RpbWFjacOzbiBtaXNtYS4gIERlIG1hbmVyYSBxdWUgZWwgSUMgb2ZyZWNlIG1heW9yIGluZm9ybWFjacOzbiBhbCBhbmFsaXN0YSBzb2JyZSBlbCBwcm9jZXNvIGRlIGVzdGltYWNpw7NuOiAKCiAgaS4gcHJlc2VudGEgZWwgdmFsb3IgZGUgZXN0aW1hY2nDs24gcHVudHVhbCB5LCAKICBpaS4gZWwgdGFtYcOxbyBkZSBpbmNlcnRpZHVtYnJlIGNvbnRlbmlkYSBlbiBsYSBlc3RpbWFjacOzbi4gCgpEaWNobyB0YW1hw7FvIGRlIGluY2VydGlkdW1icmUgY29udGVuaWRhIGVuIGVsIHJhbmdvIGVzdGFibGVjaWRvIHBvciBlbCBJQyB0YW1iacOpbiBwZXJtaXRlIGluY2x1aXIgdW5hIG1heW9yIGNhbnRpZGFkIGRlIHZhbG9yZXMgcG9zaWJsZXMgcXVlIHB1ZWRlIGFkb3B0YXIgZWwgcGFyw6FtZXRybyBkZSBpbnRlcsOpcyB5LCBhIHN1IHZleiwgaW5jb3Jwb3JhciB1bmEgY2FudGlkYWQgbWF5b3IgZGUgcHJvYmFiaWxpZGFkZXMgYXNvY2lhZGFzIGEgZXN0b3MgdmFsb3JlcyBwb3NpYmxlcy4KCkNvbW8gc2UgdmlvIGFycmliYSwgbG9zIGVsZW1lbnRvcyBxdWUgaW50ZWdyYW4gYSB1biBJQyBzb246IAoKICAxLiAqZXN0aW1hZG9yIHB1bnR1YWwqIHF1ZSBwdWVkZSBzZXIgYWxnw7puICptb21lbnRvKiBvICptZWRpZGEgZGUgdGVuZGVuY2lhIGNlbnRyYWwqIChtZWRpYSwgbWVkaWFuYSwgcHJvcG9yY2nDs24pLCAKICAyLiAqbWFyZ2VuIGRlIGVycm9yKiwgcXVlIHN1cG9uZSBsYSB2YXJpYWNpw7NuIHF1ZSBleGlzdGlyw6EgZW4gdG9ybm8gYWwgKmVzdGltYWRvciBwdW50dWFsKi4KCkVsICptYXJnZW4gZGUgZXJyb3IqIC1jb21vIHRhbWJpw6luIHNlIGRlc2NyaWJpw7MgYXJyaWJhLSBzZSBpbnRlZ3JhIGNvbiBkb3MgZWxlbWVudG9zOiAKCiAgaS4gZWwgKmVycm9yIGVzdMOhbmRhciBvIHTDrXBpY28qIGRlIGxhIG11ZXN0cmEgY29uIHJlc3BlY3RvIGEgbGEgZGlzdHJpYnVjacOzbiBtdWVzdHJhbCwgeSAKICBpaS4gZWwgKm5pdmVsIGRlIGNvbmZpYW56YSogZXN0YWJsZWNpZG8gcG9yIGVsIGFuYWxpc3RhIHByZXZpYW1lbnRlLCB5IHF1ZSBkZXBlbmRlIGRlbCB0aXBvIGRlICpkaXN0cmlidWNpw7NuIGRlIHByb2JhYmlsaWRhZGVzKiBkZWwgKmVzdGFkw61zdGljbyBkZSBwcnVlYmEqIHV0aWxpemFkbyBwYXJhIGVsIGFuw6FsaXNpcyAoJHosIHQsIEYsIFxjaGleMiwgciQpLgoKCiMjIyMjIDEuMS4yLjEuIEPDoWxjdWxvIGRlbCBlc3RpbWFkb3IgcHVudHVhbCBwYXJhIHVuYSB2YXJpYWJsZSBjb250aW51YS4KCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBkZWwgdGlwbyAqKmNvbnRpbnVhKiogeSBjb24gdW5hIGRpc3RyaWJ1Y2nDs24gcGFyZWNpZGEgYSB1bmEgKm5vcm1hbCosIGxhIG1lZGlhIHN1ZWxlIHNlciBlbCBlc3RpbWFkb3IgcHVudHVhbCBtw6FzIHBlcnRpbmVudGUuIFBhcmEgZWxsbyBzZSBjYWxjdWxhcsOhIGxhIG1lZGlhIGRlIGxhIHZhcmlhYmxlIEVEQUQgZGUgbG9zIHBhY2llbnRlcyBlbiBsYSBzdWJtdWVzdHJhIGNvbnN0cnVpZGEgcHJldmlhbWVudGUuCgpgYGB7ciBtZWRpYX0KeF9iYXJyYSA8LSBtZWFuKG11ZXN0cmEgJCBFREFEKQp4X2JhcnJhCmBgYAoKCiMjIyMjIDEuMS4yLjIuIERldGVybWluYWNpw7NuIGRlbCAqTml2ZWwgZGUgQ29uZmlhbnphKiB5IHN1IGN1YW50aWwgY29ycmVzcG9uZGllbnRlLgoKRWwgKipOaXZlbCBkZSBDb25maWFuemEqKiBlcyB1bmEgcHJvcG9yY2nDs24gZGVmaW5pZGEgcHJldmlhbWVudGUgcG9yIGVsIGFuYWxpc3RhLCBtZWRpYW50ZSBsYSBxdWUgZGVmaW5lIGN1w6FsIGVzIGVsIHBvcmNlbnRhamUgZGUgY2Fzb3MsIHkgcHJvYmFiaWxpZGFkZXMsIHF1ZSBkZXNlYSBpbmNsdWlyIGVuIGVsIHJhbmdvIGRlIHZhbG9yZXMgcXVlIGJ1c2NhIGVzdGltYXIuIEVzdGUgbml2ZWwgZGUgY29uZmlhbnphIHNlIGRldGVybWluYSBhIHBhcnRpciBkZSBpZGVudGlmaWNhciBlbCAqdmFsb3IgY3LDrXRpY28qIGFzb2NpYWRvIGFsICpOaXZlbCBkZSBDb25maWFuemEqIGRlc2VhZG8uIFBhcmEgZWxsbyBzZSB1dGlsaXphcsOhIGVsIHNjcmlwdCBgcW5vcm0oKWAuCgpFbCAqKk5pdmVsIGRlIENvbmZpYW56YSoqIG5vIGVzIGxvIG1pc21vIHF1ZSB1biAqcGVyY2VudGlsKiBhbCBtb21lbnRvIGRlIGRlZmluaXIgZWwgKnZhbG9yIGNyw610aWNvKiBkZWwgSUMuIEVsICpwZXJjZW50aWwqIHNlIHJlZmllcmUgYWwgYWN1bXVsYWRvIGRlIHByb2JhYmlsaWRhZGVzIHViaWNhZG9zIGEgbGEgaXpxdWllcmRhIGRlbCAqdmFsb3IgY3LDrXRpY28qIG1pZW50cmFzIHF1ZSBlbCAqKk5pdmVsIGRlIENvbmZpYW56YSoqIGRlZmluZSBlbCB0YW1hw7FvIGRlbCByYW5nbyBkZSB2YWxvcmVzLCB5IHN1cyBwcm9iYWJpbGlkYWRlcyBhc29jaWFkYXMsIGVuIHRvcm5vIGEgKGEgc3UgaXpxdWllcmRhIHkgZGVyZWNoYSkgZGVsICplc3RpbWFkb3IgcHVudHVhbCogc2VsZWNjaW9uYWRvLiBEZSBtYW5lcmEgcXVlIGVsICoqTml2ZWwgZGUgQ29uZmlhbnphKiogc2UgcmVmaWVyZSBhIHVuIHBvcmNlbnRhamUgZGUgY2Fzb3MgdWJpY2Fkb3MgYWwgY2VudHJvIGRlIGxhIGRpc3RyaWJ1Y2nDs24uCgpQb3IgZWplbXBsbywgdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIHNlIHJlZmllcmUgYWwgOTUlIGRlIGxvcyBjYXNvcyB1YmljYWRvcyBlbiB0b3JubyBhbCBjZW50cm8gZGUgbGEgZGlzdHJpYnVjacOzbiwgbWllbnRyYXMgcXVlIHVuIHZhbG9yIGNyw610aWNvIGFzb2NpYWRvIGNvbiBlc3RhIMOhcmVhIHNlIGNvcnJlc3BvbmRlIGNvbiBlbCBwZXJjZW50aWwgMC45NzUgcHVlcyBhIGxhIGRlcmVjaGEgZGUgZGljaG8gdmFsb3IgY3LDrXRpY28gcXVlZGFyw6EgZWwgMi41JSBkZSBsb3MgY2Fzb3MgeSwgc2ltw6l0cmljYW1lbnRlLCBxdWVkYXLDoSBlbCAyLjUlIGEgbGEgaXpxdWllcmRhIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIEVuIHRvdGFsLCBsYSBzdW1hIGRlIGVzdG9zIHZhbG9yZXMgZXh0cmVtb3Mgc2Vyw6EgZGUgNSUgbyB1bmEgcHJvcG9yY2nDs24gZGUgMC4wNSAoYWxmYSkuCgpMYSBtYW5lcmEgZGUgaWRlbnRpZmljYXIgZWwgdmFsb3IgZGVsIGN1YW50aWwgY29ycmVzcG9uZGllbnRlIGEgdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIHBhcmEgZWwgSUMgZXMgbGEgc2lndWllbnRlOgoKYGBge3IgY3VhbnRpbF85NzV9CnpfOTUgPC0gcW5vcm0oMC45NzUpICNzZSB1c2EgbGEgcHJvcG9yY2nDs24gMC45NzUgcG9yIHF1ZSBhIHN1IGRlcmVjaGEgc2UgZXhjbHV5ZSBhbCAwLjAyNSBkZSBsb3MgY2Fzb3MgeSwgZGUgbWFuZXJhIHNpbcOpdHJpY2EgdGFtYmnDqW4gc2UgZXhjbHVpcsOhIGFsIDAuMDI1IGRlIGxvcyBjYXNvcyBhIGxhIGl6cXVpZXJkYSBkZWwgcmFuZ28uCnpfOTUgI3VuaWRhZGVzIGRlIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBvICJaIgpgYGAKCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuICoqTml2ZWwgZGUgQ29uZmlhbnphKiogZGVsIDk5JSwgc2UgcmVmaWVyZSBhbCA5OSUgZGUgbG9zIGNhc29zIHViaWNhZG9zIGVuIHRvcm5vIGFsIGNlbnRybyBkZSBsYSBkaXN0cmlidWNpw7NuLCB5IHN1IHZhbG9yIGNyw610aWNvIGNvcnJlc3BvbmRpZW50ZSBjb25zaXN0ZSBlbiBlbCBwZXJjZW50aWwgMC45OTUgcHVlcyBhIGxhIGRlcmVjaGEgZGUgZGljaG8gdmFsb3IgY3LDrXRpY28gcXVlZGFyw6EgZWwgMC41JSBkZSBsb3MgY2Fzb3MgeSwgc2ltw6l0cmljYW1lbnRlLCBxdWVkYXLDoSBlbCAwLjUlIGEgbGEgaXpxdWllcmRhIGRlIGxhIGRpc3RyaWJ1Y2nDs24uIEVuIHRvcmFsLCBsYSBzdW1hIGRlIGVzdG9zIHZhbG9yZXMgZXh0cmVtb3Mgc2Vyw6EgZGUgMSUgbyB1bmEgcHJvcG9yY2nDs24gZGUgMC4wMSAoYWxmYSkuCgpgYGB7ciBjdWFudGlsXzk5NX0Kel85OSA8LSBxbm9ybSgwLjk5NSkgI3NlIHVzYSBsYSBwcm9wb3JjacOzbiAwLjk3NSBwb3IgcXVlIGEgc3UgZGVyZWNoYSBzZSBleGNsdXllIGFsIDAuMDI1IGRlIGxvcyBjYXNvcyB5LCBkZSBtYW5lcmEgc2ltw6l0cmljYSB0YW1iacOpbiBzZSBleGNsdWlyw6EgYWwgMC4wMjUgZGUgbG9zIGNhc29zIGEgbGEgaXpxdWllcmRhIGRlbCByYW5nby4Kel85OSAjdW5pZGFkZXMgZGUgZGVzdmlhY2nDs24gZXN0w6FuZGFyIG8gIloiCmBgYAoKCiMjIyMjIDEuMS4yLjMuIEPDoWxjdWxvIGRlbCAqRXJyb3IgRXN0w6FuZGFyKiBkZSBsYSBtdWVzdHJhLgoKRWwgKiplcnJvciBlc3TDoW5kYXIqKiBwZXJtaXRlIGlkZW50aWZpY2FyIGxhIHZhcmlhY2nDs24gcXVlIGV4aXN0ZSBlbiBsYSBtdWVzdHJhIGFuYWxpemFkYSBjb24gcmVzcGVjdG8gZGUgbGEgKmRpc3RyaWJ1Y2nDs24gbXVlc3RyYWwqIGRlIG90cmFzIG11ZXN0cmFzIChoaXBvdMOpdGljYXMpIGRlbCBtaXNtbyB0YW1hw7FvICgkbiQpIHF1ZSBsYSBtdWVzdHJhIG9yaWdpbmFsLiBFc3RlIHZhbG9yIGF5dWRhIGEgZXN0YWJsZWNlciBzaSBlbCBlc3RpbWFkb3IgdXRpbGl6YWRvICgkXGJhcnt4fSQpIGVzIHVuIGJ1ZW4gZXN0aW1hZG9yIHBhcmEgYWNlcmNhcnNlIGFsIHBhcsOhbWV0cm8gcG9ibGFjaW9uYWwgZGUgaW50ZXLDqXMuCgpMYSBtYW5lcmEgZGUgY2FsY3VsYXIgZWwgKiplcnJvciBlc3TDoW5kYXIqKiBjb25zaXN0ZSBlbiBkaXZpZGlyIGxhICpkZXN2aWFjacOzbiBlc3TDoW5kYXIqIGRlIGxhIHZhcmlhYmxlIGFuYWxpemFkYSBlbnRyZSBsYSByYcOteiBjdWFkcmFkYSBkZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhIHV0aWxpemFkYSAoJFxmcmFje3N9e1xzcXJ0e259fSQpLgoKYGBge3IgZXJyb3Jfc3RkfQplcnJvcl9zdGQ8LShzZChtdWVzdHJhJEVEQUQpIC8gI2Rlc3ZpYWNpw7NuIGVzdMOhbmRhciBkZSBsYSB2YXJpYWJsZSBFREFEIGVuIGxhIG11ZXN0cmEKICAgICAgICAgICAgICBzcXJ0KG5fbXVlc3RyYSkpICNyYcOteiBjdWFkcmFkYSBkZWwgdGFtYcOxbyBkZSBsYSBtdWVzdHJhCmVycm9yX3N0ZApgYGAKCk90cmEgbWFuZXJhIGRlIGNhbGN1bGFyIGVsIEVycm9yIEVzdMOhbmRhciBiYWpvIGxhIGxpYmVyYXLDrWEgYERlc2NUb29scygpYCBlczoKCmBgYHtyfQpTRSA8LSBNZWFuU0UobXVlc3RyYSAkIEVEQUQsIHNkID0gTlVMTCwgbmEucm0gPSBUUlVFKQpTRQpgYGAKCgojIyMgMS4yLiBJbnRlZ3JhY2nDs24gZGVsIEludGVydmFsbyBkZSBDb25maWFuemEgYSBwYXJ0aXIgZGUgbGEgbWVkaWEuCgpVbmEgdmV6IGNhbGN1bGFkb3MgbG9zIGVsZW1lbnRvcyBkZWwgSUMsIHNlIHB1ZWRlIGludGVncmFyIGVsIHJhbmdvIGRlIHZhbG9yZXMgcXVlIGxvIGludGVncmFyw6FuLiBEZWJpZG8gYSBxdWUgZWwgSUMgZXMgdW4gKnJhbmdvKiwgZXN0ZSBzZSBkZWZpbmUgcG9yIGRvcyAqdmFsb3JlcyBhbGVhdG9yaW9zKjogCgogIGkuIGVsICpsw61taXRlIGluZmVyaW9yKiBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlLCBzZSBwdWVkZW4gY2FsY3VsYXIgbWFudWFsbWVudGUgZGUgbGEgc2lndWllbnRlIGZvcm1hOgoKYGBge3IgbGltX2luZn0KbGltX2luZiA8LSB4X2JhcnJhIC0gKHpfOTUgKiBlcnJvcl9zdGQpCmxpbV9pbmYKYGBgCgogIGlpLiBMYSBtYW5lcmEgZGUgY2FsY3VsYXIgZWwgbMOtbWl0ZSBzdXBlcmlvciBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlIGVzOgoKYGBge3IgbGltX3N1cH0KbGltX3N1cCA8LSB4X2JhcnJhICsgKHpfOTUgKiBlcnJvcl9zdGQpCmxpbV9zdXAKYGBgCgogIGlpaS4gSW50ZWdyYWNpw7NuIGRlbCAqKkludGVydmFsbyBkZSBDb25maWFuemEqKjoKCkEgcGFydGlyIGRlIGFtYm9zIGzDrW1pdGVzIGNhbGN1bGFkb3Mgc2UgcHVlZGUgZXN0YWJsZWNlciBxdWUgZWwgcmFuZ28gZGUgdmFsb3JlcyBkZW50cm8gZGVsIHF1ZSBzZSBlc3BlcmEgcXVlIHNlIGVuY3VlbnRyZSBsYSBtZWRpYSBkZSBlZGFkIHBhcmEgbGEgcG9ibGFjacOzbiBkZSBpbnRlcsOpcyBzZSB1YmlxdWUgZW50cmUgZWwgbMOtbWl0ZSBpbmZlcmlvciBkZSBgciBsaW1faW5mYCB5IGVsIGzDrW1pdGUgc3VwZXJpb3IgY2FsY3VsYWRvIGRlIGByIGxpbV9zdXBgLCBjb24gdW4gKipOaXZlbCBkZSBDb25maWFuemEqKiBkZWwgOTUlLgoKT3RyYSBtYW5lcmEgZGUgY2FsY3VsYXIgdW4gSUMgZXMgYSBwYXJ0aXIgZGVsIHNjcmlwdCBgTWVhbkNJKClgcXVlIGVzIHBhcnRlIGRlIGxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzYDsgcGFyYSBlbGxvIHNlIGRlYmUgY2FyZ2FyIGVzdGEgw7psdGltYSBsaWJyZXLDrWEgeSBjb3JyZXIgZWwgc2NyaXB0IHBvc3Rlcmlvcm1lbnRlLgoKYGBge3IgSUN9CklDX0VEQUQgPC0gTWVhbkNJKHggPSBtdWVzdHJhICQgRURBRCwgIyBWYXJpYWJsZSBkZSBsYSBxdWUgc2UgY2FsY3VsYSBzdSBtZWRpYSAoZXN0aW1hZG9yIHB1bnR1YWwpCiAgICAgICAgICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1LCAjIE5pdmVsIGRlIGNvbmZpYW56YQogICAgICAgICAgICAgICAgICBuYS5ybSA9IEZBTFNFKSAjIEFyZ3VtZW50byBwYXJhIHJlbW92ZXIgbG9zIHZhbG9yZXMgcGVyZGlkb3MKSUNfRURBRApgYGAKCgpDb24gZWwgZmluIGRlIGV2YWx1YXIgbGEgcGVydGluZW5jaWEgZGVsIElDIGNvbnN0cnVpZG8sIHNlIHB1ZWRlIGNvbXBhcmFyIGNvbiBsb3MgZGF0b3Mgb3JpZ2luYWxlcywgc3Vwb25pZW5kbyBxdWUgc29uIGxvcyBkYXRvcyBkZSB1bmEgcG9ibGFjacOzbiBlbnRlcmEuIFBhcmEgZWxsbyBzZSBjYWxjdWxhIGVsIHZhbG9yIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsIHBhcmEgZGV0ZXJtaW5hciBzaSBlbCBJQyBjb25zdHJ1aWRvIGxvZ3JhIGNhcHR1cmFyIGRpY2hvIHBhcsOhbWV0cm8uIEVzdGUgdmFsb3Igc2UgZGViZXLDoSBndWFyZGFyIGNvbW8gdW4gb2JqZXRvIGBwYXJhbWAsIHkgc2UgbGUgZGVub21pbmFyw6EgYG11YC4KCgpgYGB7ciBwb2JfbWVhbn0KcGFyYW0gPC0gZGF0b3NfY292aWQgJT4lCiAgc3VtbWFyaXNlKG11ID0gbWVhbihFREFEKSkKcGFyYW0KYGBgCgpQcmVndW50YToKwr9FbCBJQyBjb25zdHJ1aWRvIGxvZ3JhIGNhcHR1cmFyIGVsIHByb21lZGlvIGRlIGVkYWQgZGUgbG9zIHBhY2llbnRlcyBlbiBsYSBwb2JsYWNpw7NuIGVuIE3DqXhpY28/CgoKIyMjIDEuMy4gTml2ZWxlcyBkZSBjb25maWFuemEuCgpBIHBhcnRpciBkZWwgdXNvIGRlIFIgeSBzdXMgaGVycmFtaWVudGFzIHNlIHB1ZWRlbiBjb25zdHJ1aXIgZGl2ZXJzYXMgbXVlc3RyYXMgYWxlYXRvcmlhcyBwYXJhLCB0YW1iacOpbiwgZW50ZW5kZXIgbGEgbWFuZXJhIGVuIHF1ZSBwdWVkZW4gdmFyaWFyIGxvcyB2YWxvcmVzIGRlIGxhIG1lZGlhIHkgbG9zIElDIGVudHJlIHPDrS4KCkxvcyBwYXNvcyBiw6FzaWNvcyBhIHNlZ3VpciBzb246CgogICogQ29uc3RydWlyIHVuYSBtdWVzdHJhLgogICogQ2FsY3VsYXIgbGEgbXVlc3RyYSB5IGxhIGRlc3ZpYWNpw7NuIGVzdMOhbmRhciBwYXJhIGRpY2hhIG11ZXN0cmEgeSBndWFyZGFybGFzIHBhcmEgY2FsY3VsYXIsIHBvc3Rlcmlvcm1lbnRlLCBsb3MgbMOtbWl0ZXMgaW5mZXJpb3IgeSBzdXBlcmlvciBkZSBsb3MgSUMuCiAgKiBSZXBldGlyIGVzdG9zIDUwIHZlY2VzLgoKUGFyYSBsbGV2YXJsbyBhIGNhYm8gc2UgdXNhIGVsIHNjcmlwdCBgcmVwX3NhbXBsZV9uYCBwYXJhIGNvbnN0cnVpciA1MCBtdWVzdHJhcyBhbGVhdG9yaWFzIGRlIHRhbWHDsW8gYG4gPSA2MGAgZGUgdW5hIHBvYmxhY2nDs24geSwgcG9zdGVyaW9ybWVudGUsIHNlIGNhbGN1bGFyw6FuIGxvcyBsw61taXRlcyBpbmZlcmlvcmVzIHkgc3VwZXJpb3JlcyBkZSBsb3MgSUMuIENvbiBsYSBzaWd1aWVudGUgZsOzcm11bGEgc2UgcHVlZGUgYWN0aXZhciBkaWNoYSBmdW5jacOzbi4KCmBgYHtyIGNhbGN1bGF0ZV81MF9jaXN9CnJlcF9zYW1wbGVfbiA8LSBmdW5jdGlvbih0YmwsIHNpemUsIHJlcGxhY2UgPSBGQUxTRSwgcmVwcyA9IDEpCnsKICBuIDwtIG5yb3codGJsKQogIGkgPC0gdW5saXN0KHJlcGxpY2F0ZShyZXBzLCBzYW1wbGUuaW50KG4sIHNpemUsIHJlcGxhY2UgPSByZXBsYWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxpZnkgPSBGQUxTRSkpCiAgcmVwX3RibCA8LSBjYmluZChyZXBsaWNhdGUgPSByZXAoMTpyZXBzLHJlcChzaXplLHJlcHMpKSwgdGJsW2ksXSkKICBkcGx5cjo6Z3JvdXBfYnkocmVwX3RibCwgcmVwbGljYXRlKQp9ICNBY3RpdmFjacOzbiBkZSBsYSBmdW5jacOzbiAicmVwX3NhbXBsZV9uKCkiCgpzZXQuc2VlZCgxMjM0KQpjaSA8LSBkYXRvc19jb3ZpZCAlPiUgCiAgcmVwX3NhbXBsZV9uKHNpemUgPSA2MCwgcmVwcyA9IDUwLCByZXBsYWNlID0gVFJVRSkgIyNjcmVhY2nDs24gZGUgNTAgbXVlc3RyYXMgZGUgbiA9IDYwLCBlc3RvIGRhIHVuIHRhbWHDsW8gZGUgbXVlc3RyYSBkZSAzMDAwICg9IDYwIGNhc29zIHggNTAgbXVlc3RyYXMpCmBgYAoKQWhvcmEgc2UgY2FsY3VsYW4gbG9zIGzDrW1pdGVzIGluZmVyaW9yIHkgc3VwZXJpb3IgZGUgY2FkYSB1bmEgZGUgbGFzIDUwIG11ZXN0cmFzIHBhcmEsIGFzw60sIGNvbnN0cnVpciBzdXMgSW50ZXJ2YWxvcyBkZSBDb25maWFuemEgcmVzcGVjdGl2b3M6CgpgYGB7ciBJQ181MF9tdWVzdHJhc30KY2kgPC0gY2kgJT4lICNFc3RhIG9wY2nDs24gc2Vydmlyw6EgcGFyYSBndWFyZGFyIGEgbG9zIElDIGNvbW8gdW4gbnVldm8gb2JqZXRvIGRlIGZvcm1hdG8gJ3RhYmxhJwogIHN1bW1hcmlzZShsaW1faW5mZXJpb3I9bWVhbihFREFEKSAtICh6Xzk1KihzZChFREFEKSAvIHNxcnQoMzAwMCkpKSwgI2zDrW1pdGUgaW5mZXJpb3IKICAgICAgICAgICAgbGltX3N1cGVyaW9yPW1lYW4oRURBRCkgKyAoel85NSooc2QoRURBRCkgLyBzcXJ0KDMwMDApKSkpICNsw61taXRlIHN1cGVyaW9yCmBgYAoKCkFob3JhIHNlIHB1ZWRlIGhhY2VyIHVuYSByZXZpc2nDs24gInLDoXBpZGEiIGEgbG9zIHByaW1lcm9zIGNpbmNvIElDOgoKYGBge3IgZmlyc3RfZml2ZV9pbnRlcnZhbHN9CmNpICU+JQogIHNsaWNlKDE6NSkKYGBgCgoKQSBwYXJ0aXIgZGVsIG9iamV0byBxdWUgcmXDum5lIGxvcyBsw61taXRlcyBpbmZlcmlvcmVzIHkgc3VwZXJpb3JlcyBkZSBJQyBwYXJhIDUwIG11ZXN0cmFzIHNlIHB1ZWRlIGNyZWFyIHVuYSBncsOhZmljYSBxdWUgYXl1ZGUgYSBzdSB2aXN1YWxpemFjacOzbiB5IGNvbXBhcmFjacOzbi4KCkVsIHByaW1lciBwYXNvIHBhcmEgbGEgY29uc3RydWNjacOzbiBkZSBkaWNoYSBncsOhZmljYSBjb25zaXN0ZSBlbiBjcmVhciB1bmEgdmFyaWFibGUgbnVldmEgZW4gZWwgb2JqZXRvIGBjaWAgcmVjacOpbiBjcmVhZG8sIHF1ZSBpbmRpcXVlIHNpIGVsIGludGVydmFsbyBjYXB0dXJhIG8gbm8gYSBsYSBtZWRpYSBwb2JsYWNpb25hbC4gSGF5IHF1ZSBub3RhciBxdWUgImNhcHR1cmFyIiBkaWNobyB2YWxvciBzaWduaWZpY2EgcXVlIGVsIGzDrW1pdGUgaW5mZXJpb3IgZGVsIElDIHNlIHViaWNhcsOhIHBvciBkZWJham8gZGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIHkgZWwgbMOtbWl0ZSBzdXBlcmlvciBkZWwgSUMgc2UgZW5jb250cmFyw6EgcG9yIGFycmliYSBkZSBkaWNobyB2YWxvciBwb2JsYWNpb25hbC4KClBhcmEgY3JlYXIgbGEgdmFyaWFibGUgbnVldmEgc2UgdXNhcsOhIGVsIHNjcmlwdCBgbXV0YXRlKClgIGRlIGxhIGxpYnJlcsOtYSBgZHBseXJgLgoKCmBgYHtyIGNhcHR1cmFfbXV9CmNpIDwtIGNpICU+JQogIG11dGF0ZShjYXB0dXJhX211ID0gaWZlbHNlKGxpbV9pbmZlcmlvciA8IHBhcmFtICQgbXUgJiBsaW1fc3VwZXJpb3IgPiBwYXJhbSAkIG11LCAic2kiLCAibm8iKSkKYGBgCgpWaXN0YXpvIGEgbGFzIHByaW1lcmFzIGNpbmNvIGZpbGFzOgoKYGBge3Igc2xpY2VfY2l9CmNpICU+JQogIHNsaWNlKDE6NSkKYGBgCgpMYSBmdW5jacOzbiBgaWZlbHNlYCBlcyB1biBzY3JpcHQgYWx0ZXJuYXRpdm8gcGFyYSByZWFsaXphciBsYSB0cmFuc2Zvcm1hY2nDs24gZGUgdW5hIG51ZXZhIHZhcmlhYmxlIGEgcGFydGlyIGRlIHVuYSBwcmV2aWFtZW50ZSBleGlzdGVudGUuIERpY2hhIGZ1bmNpw7NuIHJlcXVpZXJlIHRyZXMgYXJndW1lbnRvczogZWwgcHJpbWVybyBjb25zaXN0ZSBlbiB1biBhcmd1bWVudG8gbMOzZ2ljbywgZWwgc2VndW5kbyBlcyBlbCB2YWxvciBkZXNlYWRvIHNpIGVsIGFyZ3VtZW50byBsw7NnaWNvIGNvcnJlc3BvbmRlIGEgdW4gcmVzdWx0YWRvIHZlcmRhZGVybyB5LCBlbCB0ZXJjZXIgYXJndW1lbnRvIGNvcnJlc3BvbmRlIGFsIG51ZXZvIHZhbG9yIHJlc2lkdWFsIHF1ZSBzZSBkZXNlYSBhc2lnbmFyIGVuIGNhc28gZGUgcXVlIGVsIGFyZ3VtZW50byBsw7NnaWNvIHNlYSB1biByZXN1bHRhZG8gZmFsc28uCgpBaG9yYSBzZSBjdWVudGEgY29uIGxhIGluZm9ybWFjacOzbiBuZWNlc2FyaWEgcGFyYSBjcmVhciBlbCBncsOhZmljbywgcGVybyBzZSBkZWJlbiByZSBvcmdhbml6YXIgbG9zIGRhdG9zIHBhcmEgZmFjaWxpdGFyIHN1IHZpc3VhbGl6YWNpw7NuLiBFc3BlY8OtZmljYW1lbnRlIHNlIG5lY2VzaXRhIG9yZ2FuaXphciBsb3MgZGF0b3MgZW4gdW4gbnVldm8gZGF0YSBmcmFtZSBkb25kZSBjYWRhIGZpbGEgbyByZW5nbMOzbiByZXByZXNlbnRlIHVuIGzDrW1pdGUsIGVuIGNvbnRyYXBvc2ljacOzbiBhIHVuIGludGVydmFsby4KCkRlIG1hbmVyYSBxdWUgc2UgZGVzZWFuIG1hbmlwdWxhciBlc3RvcyBkYXRvczoKCnwgcmVwbGljYXRlIHwgbGltX2luZmVyaW9yIHwgbGltX3N1cGVyaW9yIHwgY2FwdHVyYV9tdSB8Cnw6LS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLS0tOnw6LS0tLS0tLS0tLTp8CnwgMSAgICAgICAgIHwgNDEuMjEwNDQgICAgIHwgNDEuOTU2MjMgICAgIHwgbm8gICAgICAgICB8CnwgMiAgICAgICAgIHwgNDYuOTM4MTMgICAgIHwgNDcuNTI4NTQgICAgIHwgbm8gICAgICAgICB8CnwgMyAgICAgICAgIHwgNDYuOTEzMTggICAgIHwgNDcuNTUzNDkgICAgIHwgbm8gICAgICAgICB8CgpQYXJhIHF1ZSBzZSByZSBvcmRlbmVuIGRlIGxhIHNpZ3VpZW50ZSBtYW5lcmE6Cgp8IGlkIHwgcmVwbGljYXRlIHwgdGlwbyAgICAgfCBsaW1pdGUgICB8IGNhcHR1cmFfbXUgfAp8Oi0tOnw6LS0tLS0tLS0tOnw6LS0tLS0tLS06fDotLS0tLS0tLTp8Oi0tLS0tLS0tLS06fAp8IDEgIHwgMSAgICAgICAgIHwgaW5mZXJpb3IgfCA0MS4yMTA0NCB8IG5vICAgICAgICAgfAp8IDIgIHwgMiAgICAgICAgIHwgaW5mZXJpb3IgfCA0Ni45MzgxMyB8IG5vICAgICAgICAgfAp8IDMgIHwgMyAgICAgICAgIHwgaW5mZXJpb3IgfCA0Ni45MTMxOCB8IG5vICAgICAgICAgfAp8IDQgIHwgMSAgICAgICAgIHwgc3VwZXJpb3IgfCA0MS45NTYyMyB8IG5vICAgICAgICAgfAp8IDUgIHwgMiAgICAgICAgIHwgc3VwZXJpb3IgfCA0Ny41Mjg1NCB8IG5vICAgICAgICAgfAp8IDYgIHwgMyAgICAgICAgIHwgc3VwZXJpb3IgfCA0Ny41NTM0OSB8IG5vICAgICAgICAgfAoKCkVzdG8gc2UgbG9ncmEgYSBwYXJ0aXIgZGVsIHNpZ3VpZW50ZSBzY3JpcHQ6CgpgYGB7ciBjaV9ncmFmaWNhfQpjaV9kYXRhIDwtIGdhdGhlcihjaSwgdHlwZSwgYm91bmQsIGxpbV9pbmZlcmlvciA6IGxpbV9zdXBlcmlvcikKYGBgCgoKRmluYWxtZW50ZSBzZSBjb25zdHJ1eWUgZWwgZ3LDoWZpY28gZGUgbG9zIElDIHVzYW5kbyBsYSBsaWJyZXLDrWEgYGdncGxvdGA6CgoKYGBge3IgZ3JhZmljYV9jaX0KZ2dwbG90KGRhdGEgPSBjaV9kYXRhLCBhZXMoeCA9IGJvdW5kLCB5ID0gcmVwbGljYXRlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSByZXBsaWNhdGUsIGNvbG9yID0gY2FwdHVyYV9tdSkpICsKICBnZW9tX3BvaW50KHNpemUgPSAyKSArICAjIGHDsWFkZSBwdW50b3MgYWwgZmluYWwgZGUgY2FkYSByZWN0YSwgZGUgdGFtYcOxbyA9IDIKICBnZW9tX2xpbmUoKSArICAgICAgICAgICAjIGNvbmVjdGEgbG9zIHB1bnRvcyBtZWRpYW50ZSBsw61uZWFzCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gcGFyYW0gJCBtdSwgY29sb3IgPSAiZGFya2dyYXkiKSAjIGRpYnVqYSB1bmEgbMOtbmVhIHZlcnRpY2FsIGVuIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvICJtdSIKYGBgCgoKUHJlZ3VudGE6CgrCv0N1w6FsIHByb3BvcmNpw7NuIGRlIGxvcyBJQyBjb25zdHJ1aWRvcyBpbmNsdXllIGFsIHZhbG9yIGRlbCBwYXLDoW1ldHJvPwrCv0VzdGEgcHJvcG9yY2nDs24gZXMgZXhhY3RhbWVudGUgaWd1YWwgYWwgTml2ZWwgZGUgQ29uZmlhbnphIGRlIGxvcyBpbnRlcnZhbG9zPyBTaSBubyBsbyBlcywgZXhwbGljYSBsYXMgcmF6b25lcy4KCgojIyAyLiBJbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBwYXJhIHVuYSBwcm9wb3JjacOzbi4KCkVuIGVsIGNhc28gZGUgdHJhYmFqYXIgY29uIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSwgbGEgY29uc3RydWNjacOzbiBkZSB1biBJbnRlcnZhbG8gZGUgQ29uZmlhbnphIHNlIHJlYWxpemEgYSBwYXJ0aXIgZGUgbGEgcHJvcG9yY2nDs24gZGUgbGEgY2F0ZWdvcsOtYSBkZSBpbnRlcsOpcyBzb2JyZSBsYSBxdWUgc2UgZGVzZWEgcmVhbGl6YXIgbGEgZXN0aW1hY2nDs24gaGFjaWEgbGEgcG9ibGFjacOzbi4KClBhcmEgcmVhbGl6YXIgbGEgY29uc3RydWNjacOzbiBkZSBsb3MgSUMsIGEgY29udGludWFjacOzbiBzZSB1dGlsaXphcsOhIGxhIG1hdHJpeiBkZSBkYXRvcyBkZSBsYSBlbmN1ZXN0YSBMYXRpbm9iYXLDs21ldHJvLCBlbiBsYSBvbGEgcGFyYSBlbCBhw7FvIDIwMTggeSBxdWUgZXN0w6EgZGlzcG9uaWJsZSBlbiBzdSBww6FnaW5hIHdlYi4gW0xhdGlub2JhcsOzbWV0cm9dKDxodHRwczovL3d3dy5sYXRpbm9iYXJvbWV0cm8ub3JnL2xhdENvbnRlbnRzLmpzcD4pIEVzdGEgc2UgaW1wb3J0YSBkZXNkZSB1biBmb3JtYXRvICcuc2F2JyBwYXJhIGxvIHF1ZSBzZSB1dGlsaXphIGxhIGxpYnJlcsOtYSBgaGF2ZW4oKWAuCgpgYGB7ciBjYXJnYV9kYXRvc19sYn0KZGF0b3NfbGIgPC0gaGF2ZW46OnJlYWRfc2F2KCJ+L0Ryb3Bib3gvUi9MYXRpbm9iYXJvbWV0cm9fMjAxOF9Fc3BfU3Bzc192MjAxOTAzMDMuc2F2IikKYGBgCgpZIGFob3JhIHNlIHNvbGljaXRhbiBsYXMgZGltZW5zaW9uZXMgZGVsIGRhdGEgZnJhbWUgcGFyYSBjb25vY2VyIHN1IHRhbWHDsW86CmBgYHtyIGRpbV9sYn0KZGltKGRhdG9zX2xiKQpgYGAKCkRlIGVzdGEgbWFuZXJhIHNlIHNhYmUgcXVlIHNlIGN1ZW50YW4gY29uIDIwMjA0IGZpbGFzIHkgMzk1IGNvbHVtbmFzIG8gdmFyaWFibGVzLgoKQWRlbcOhcyBzZSBzb2xpY2l0YSB1biBsaXN0YWRvIGRlIGxvcyBub21icmVzIGRlIGxhIHZhcmlhYmxlcyBxdWUgaW50ZWdyYW4gYWwgZGF0YSBmcmFtZS4gQXF1w60gc2UgcGlkZSB1biB2aXN0YXpvIGEgbG9zIHByaW1lcm8gNiB2YWxvcmVzLCBkZSBsYXMgMzk1IGNvbHVtbmFzLgoKYGBge3J9CmhlYWQobmFtZXMoZGF0b3NfbGIpKQpgYGAKCkEgcGFydGlyIGRlIGVzdGUgbGlzdGFkbyBzZSBpZGVudGlmaWNhIHF1ZSBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGVzdMOhbiBjb2RpZmljYWRvcywgeSBwYXJhIGNvbm9jZXIgc3VzIHNpZ25pZmljYWRvcyBzZSBkZWJlIGNvbnN1bHRhciBkZWwgKkxpYnJvIGRlIEPDs2RpZ29zKiBkZSBsYSBiYXNlIGRlIGRhdG9zLCBxdWUgdmllbmUgaW5jbHVpZG8gZW4gZWwgcGFxdWV0ZSBkZSBkYXRvcyBxdWUgc2UgZGVzY2FyZ2EgZGVzZGUgbGEgcMOhZ2luYSBkZSBMYXRpbm9iYXLDs21ldHJvLgoKRW4gZWwgbGlicm8gZGUgY8OzZGlnb3Mgc2UgcHVlZGUgb2JzZXJ2YXIgcXVlIGxhIG1heW9yw61hIGRlIGxhcyB2YXJpYWJsZXMgcXVlIGxhIGludGVncmFuIHNvbiBkZSB0aXBvIGNhdGVnw7NyaWNhcywgeSBhIHN1IHZleiBzZSByZWNvbm9jZSBxdWUgbm8gdG9kYXMgc29uIGRlIHRpcG8gKmJpbm9taWFsKiAoY3VlbnRhbiBjb24gc29sbyBkb3MgY2F0ZWdvcsOtYXMgbyB2YWxvcmVzIHBvc2libGVzKS4KCkFsIHJlYWxpemFyIGVsIGFuw6FsaXNpcyBwYXJhIGNhbGN1bGFyIGxvcyBJQyBzZSBkZWJlIHJlY29ub2NlciwgaW5pY2lhbG1lbnRlIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIHZhbG9yZXMgY2F0ZWfDs3JpY29zIHF1ZSBpbnRlZ3JhbiBhIGNhZGEgdmFyaWFibGUuIEEgY29udGludWFjacOzbiBzZSByZWFsaXphIHVuIHByaW1lciBhY2VyY2FtaWVudG8gYSBsYSBleHBsb3JhY2nDs24gZGUgbGEgdmFyaWFibGUgKlAxMlNUR0JTKiBxdWUgY29ycmVzcG9uZGUgYWwgw610ZW0gZGUgKkFwb3lvIGEgbGEgRGVtb2NyYWNpYSosIHkgc3VzIHZhbG9yZXMgcG9zaWJsZXMgc29uIDMgY2F0ZWdvcsOtYXM6CgogIDEuIExhIGRlbW9jcmFjaWEgZXMgcHJlZmVyaWJsZSBhIGN1YWxxdWllciBvdHJhIGZvcm1hIGRlIGdvYmllcm5vLgogIDIuIEVuIGFsZ3VuYXMgY2lyY3Vuc3RhbmNpYXMsIHVuIGdvYmllcm5vIGF1dG9yaXRhcmlvIHB1ZWRlIHNlciBwcmVmZXJpYmxlLgogIDMuIEEgbGEgZ2VudGUgY29tbyB1bm8sIG5vcyBkYSBsbyBtaXNtbyB1biByZcyBZ2ltZW4gZGVtb2NyYcyBdGljbyBxdWUgdW5vIG5vIGRlbW9jcmHMgXRpY28uCgpUYWJsYSBkZSBmcmVjdWVuY2lhcyBhYnNvbHV0YXM6CgpgYGB7ciB0YWJsZV9sYn0KdGFibGUoZGF0b3NfbGIgJCBQMTJTVEdCUykKYGBgCgpUYWJsYSBkZSBmcmVjdWVuY2lhcyByZWxhdGl2YXM6CgpgYGB7ciBwcm9wX3RhYmxlX2xifQpwcm9wLnRhYmxlKHRhYmxlKGRhdG9zX2xiICQgUDEyU1RHQlMpKQpgYGAKCkxhIGxpYnJlcsOtYSBgRGVzY1Rvb2xzKClgIGN1ZW50YSBjb24gZGlzdGludGFzIGZ1bmNpb25lcyBwYXJhIGNvbnN0cnVpciBJQyBwYXJhIHZhcmlhYmxlcyBjYXRlZ8OzcmljYXMgKmJpbm9taW5hbGVzKiB5ICptdWx0aW5vbWlhbGVzKiBxdWUgZmFjaWxpdGFuIGVsIHRyYWJham8gYW5hbMOtdGljby4KCkVuIGVsIGNhc28gZGUgdW5hIHZhcmlhYmxlIGNhdGVnw7NyaWNhIGJpbm9taW5hbCwgZW4gZG9uZGUgc2UgZGVzZWEgZXN0aW1hciBlbCBJQyBwcmltZXJvIHNlIGRlYmUgaWRlbnRpZmljYXIgbGEgY2F0ZWdvcsOtYSBkZSBpbnRlcsOpcy4gRW4gZWwgY2FzbyBkZSBsYSB2YXJpYWJsZSBQMTJTVEdCUyBzZSBjb25zaWRlcmEgcXVlIGxhIGNhdGVnb3LDrWEgZGUgaW50ZXLDqXMgY29uc2lzdGUgZW4gYXF1ZWxsYSBjb2RpZmljYWRhIGNvbiBlbCB2YWxvciBkZSAiMSIsIHF1ZSBjb3JyZXNwb25kZSBhIGxhIGV0aXF1ZXRhICIxLi0gTGEgZGVtb2NyYWNpYSBlcyBwcmVmZXJpYmxlIGEgY3VhbHF1aWVyIG90cmEgZm9ybWEgZGUgZ29iaWVybm8uIgoKTGEgZnVuY2nDs24gcGFyYSBzb2xpY2l0YXIgZWwgSUMgcGFyYSBlc3RhIGNhdGVnb3LDrWEgZXM6CmBgYHtyIENJX2Jpbm9taWFsfQpCaW5vbUNJKHggPSA5NzIzLCAjZnJlY3VlbmNpYSBhYnNvbHV0YSBwYXJhIGxhIGNhdGVnb3LDrWEgZGUgaW50ZXLDqXMKICAgICAgICBuID0gMTgzMjcsI2Nhc29zIHbDoWxpZG9zCiAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUsICNuaXZlbCBkZSBjb25maWFuemEKICAgICAgICBtZXRob2QgPSAiY2xvcHBlci1wZWFyc29uIikgIyNJbnRlcnZhbG8gZGUgY29uZmlhbnphIHBhcmEgdW5hIGNhdGVnb3LDrWEKYGBgCgpEZSBlc3RhIG1hbmVyYSBzZSBzYWJlIHF1ZSBsYSBwcm9wb3JjacOzbiBkZSBlbmN1ZXN0YWRvcyBxdWUgYXBveWFuIGEgbGEgZGVtb2NyYWNpYSBlcyBkZWwgNTMuMDUlIGVuIGxhIG11ZXN0cmEsIHkgZXN0YSBlcyBudWVzdHJhIG1lam9yIGVzdGltYWNpw7NuIHB1bnR1YWwgcGFyYSBlbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgcXVlIHNlIGVzcGVyYSBlbmNvbnRyYXIgZW4gbGEgcG9ibGFjacOzbiBsYXRpbm9hbWVyaWNhbmEuIFBlcm8gdGFtYmnDqW4gc2UgZXNwZXJhLCBjb24gdW4gOTUlIGRlIGNvbmZpYW56YSwgcXVlIGVsIHByb21lZGlvIGRlIGxhIHBvYmxhY2nDs24gZGUgY2l1ZGFkYW5vcyBsYXRpbm9hbWVyaWNhbm9zIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhIHNlIGVuY3VlbnRyZSBlbnRyZSB1biA1Mi4zMiUgeSA1My43NyUuCgpFbiBlbCBjYXNvIGRlIHVuYSB2YXJpYWJsZSBjYXRlZ8OzcmljYSBtdWx0aW5vbWlhbCwgbGEgbGlicmVyw61hIGBEZXNjVG9vbHMoKWB0YW1iacOpbiBjdWVudGEgY29uIHVuYSBmdW5jacOzbiBlc3BlY8OtZmljYSBwYXJhIGNhbGN1bGFyIGVsIElDIHBhcmEgY2FkYSB1bmEgZGUgbGFzIGRpdmVyc2FzIGNhdGVnb3LDrWFzLiBFc3RhIGZ1bmNpw7NuIGVzYE11bHRpbm9tQ0koeCA9LCBjb25mLmxldmVsID0sIHNpZGVzID0sIG1ldGhvZCA9KWAsIHkgc2UgYXBsaWNhcsOhIGEgbGFzIDMgY2F0ZWdvcsOtYXMgcXVlIGludGVncmFuIGEgbGEgdmFyaWFibGUgUDEyU1RHQlMKCmBgYHtyfQpvYnNlcnZhZG9zIDwtIGMoOTcyMywgMjk1MCwgNTY1NCkgI3NlIGNyZWEgdW4gb2JqZXRvIGNvbiBsYXMgZnJlY3VlbmNpYXMgYWJzb2x1dGFzIHBhcmEgbGFzIDMgY2F0ZWdvcsOtYXMKCk11bHRpbm9tQ0kob2JzZXJ2YWRvcywgI3NlIGxsYW1hIGFsIG9iamV0byBjb24gbGFzIGZyZWN1ZW5jaWFzIGFic29sdXRhcyBwYXJhIDMgY2F0ZWdvcsOtYXMKICAgICAgICAgICBjb25mLmxldmVsID0gMC45NSwgIyBkZWZpbmljacOzbiBkZWwgbml2ZWwgZGUgY29uZmlhbnphCiAgICAgICAgICAgbWV0aG9kID0gInNpc29uZ2xheiIpICMgbcOpdG9kbyBwYXJhIGVsIGPDoWxjdWxvIGRlbCBJQyBtdWx0aW5vbWlhbApgYGAKCgojIyAzLiBFamVyY2ljaW9zLgoxLiDCv0xhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGRhdG9zIGVuIHVuYSBtdWVzdHJhIGFsZWF0b3JpYSBkZWJlbiBpZ3VhbGVzIGEgb3RyYXMgZGlzdHJpYnVjaW9uZXMgZW4gb3RyYXMgbXVlc3RyYXMgcXVlIHNlIHJlY29sZWN0YXJvbiBkZSBsYSBtaXNtYSBwb2JsYWNpw7NuOiBWZXJkYWRlcm8gbyBGYWxzbz8KCjIuIMK/UXXDqSBzaWduaWZpY2EgdW5hIGNvbmZpYW56YSBkZWwgOTUlPwphLiA5NSUgZGUgbGFzIHZlY2VzIGVsIHByb21lZGlvIGRlIGxhIHBvYmxhY2nDs24gc2UgZW5jb250cmFyw6EgZGVudHJvIGRlbCBpbnRlcnZhbG8uCmIuIDk1JSBkZSBsYXMgbXVlc3RyYXMgYWxlYXRvcmlhcyBkZWwgbWlzbW8gdGFtYcOxbyBnZW5lcmFyw6FuIElDIHF1ZSBjb250ZW5nYW4gYWwgdmFsb3IgdmVyZGFkZXJvIGRlIGxhIHBvYmxhY2nDs24uCmMuIDk1JSBkZSBsYSBwb2JsYWNpw7NuIHRlbmRyw6EgZWwgbWlzbW8gSUMuCmQuIFNlIGVzdMOhIDk1JSBjb25maWRlbnRlIGRlIHF1ZSBsYSBtZWRpYSBtdWVzdHJhbCBzZSBlbmN1ZW50cmEgZGVudHJvIGRlbCBJQy4KCjMuIMK/Q3XDoWwgZXMgZWwgdmFsb3IgY3LDrXRpY28gYXByb3BpYWRvIHBhcmEgdW4gTml2ZWwgZGUgQ29uZmlhbnphIGRlbCA5OSU/CmEuIDAuMDEgCmIuIDAuOTkgIApjLiAxLjk2IApkLiAyLjMzIAplLiAyLjU4IAoKNC4gQ2FsY3VsYSA1MCBJQyBjb24gdW4gTml2ZWwgZGUgQ29uZmlhbnphIGRlbCA5OSUuIE5vIHNlIG5lY2VzaXRhIGdlbmVyYXIgbnVldmFzIG11ZXN0cmFzLCBzb2xhbWVudGUgc2UgcmVxdWllcmUgY2FsY3VsYXIgbnVldm9zIElDIGJhc2Fkb3MgZW4gbGFzIG1lZGlhcyB5IGRlc3ZpYWNpb25lcyBlc3TDoW5kYXIgZGUgbGFzIG11ZXN0cmFzIHByZXZpYW1lbnRlIGdlbmVyYWRhcy4gR3JhZmljYSB0b2RvcyBsb3MgaW50ZXJ2YWxvcyB5IGNhbGN1bGEgbGEgcHJvcG9yY2nDs24gZGUgSUMgcXVlIGluY2x1eWVuIGFsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIGRlIGxhIG1lZGlhIHBvYmxhY2lvbmFsLgoKNS4gQSBwYXJ0aXIgZGVsIGVqZXJjaWNpbyBhbnRlcmlvciwgwr9zZSBlc3BlcmFyw61hIHF1ZSBlbCA5OSUgZGUgbG9zIGludGVydmFsb3MgY29udGVuZ2FuIGVsIHZhbG9yIGRlbCBwYXLDoW1ldHJvIGVzdGltYWRvPwphLiBDaWVydG8KYi4gRmFsc28K