Introducción

En este documento se explicará cómo introducir el factor de expansión en los cálculos estadísticos usando los datos del Barómetro de las Américas. Seguiremos lo que se trabajó en el documento de “Manejo de datos”, disponible aquí.

Sobre la base de datos

Los datos que vamos a usar deben citarse de la siguiente manera: Fuente: Barómetro de las Américas por el Proyecto de Opinión Pública de América Latina (LAPOP), wwww.LapopSurveys.org. Para poder reproducir estos cálculos, este documento empieza desde el inicio, cargando nuevamente la base de datos recortada desde el repositorio “materials_edu” de la cuenta de LAPOP en GitHub. Se sugiere que se limpie el Environment de cualquier otro dataframe anterior. Esto se puede hacer con la escoba (Clear objects from the workspace).

Mediante la librería rio y el comando import se puede importar nuevamente desde el inicio esta base de datos desde este repositorio, usando el siguiente código. Eliminamos las observaciones de Estados Unidos y Canadá con el comando subset.

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

También cargamos la base de datos de la ronda 2021.

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

Sobre el uso de los factores de expansión

Cuando un investigador abre una base de datos en cualquier programa estadístico, el software asume que los datos provienen de un muestro simple aleatorio. Cuando se trabaja con datos de opinión pública, como los datos del Barómetro de las Américas, el diseño muestral generalmente no es un muestreo simple aleatorio, sino un diseño complejo, con estratificaciones, segmentaciones, cuotas, en diferentes etapas. Como indica el reporte técnico de la ronda 2018/19 del Barómetro de las Américas, disponible aquí, las muestras en cada país fueron diseñadas usando un diseño probabilístico multietapa (con cuotas al nivel de hogares para la mayoría de países), y fueron estratificadas por regiones principales en el país, tamaño de la municipalidad y por áreas urbanas y rurales dentro de las municipalidades. Este diseño muestral complejo se tiene que incorporar generalmente en los cálculos. En ciertas ocasiones, si no se incorpora, puede llevar a diferencias en los resultados. Una explicación más detallada sobre el uso de los factores de expansión y las potenciales consecuencias de no usarlos con los datos del Barómetro de las Américas puede ser leída en la Nota Metodológica 007 (Castorena, 2021), disponible aquí. Esta Nota Metodológica describe tres escenarios de usos de factores de expansión:

  1. Ajuste post estratificación: cuando la muestra no es autoponderada y se desvía de ciertas características sociodemográficas importantes. En la base de datos, esta característica se ajusta con la variable “estratopri”.
  2. Ajuste por sobremuestreo: cuando la muestra incluye una sobremuestra de subpoblaciones de interés. En la base de datos, esta característica se ajusta con la variable “wt”.
  3. Ajuste de múltiples encuestas: cuando se analiza datos de varios países o diferentes rondas. La variable ponderadora en la base de datos es “weight1500”, que estandariza las muestras de cada país a 1,500 observaciones.

Consecuencias de no usar factores de expansión

Como indica la Nota metodológica, “los análisis sin ponderar pueden resultar en estimaciones sesgadas” (p.9). Por ejemplo, en el documento sobre manejo de datos replicamos los resultados sobre el apoyo a la democracia en Honduras (45%) y Uruguay (76.2%), para lo que se calculó la variable recodificada y se describió.

library(car)
lapop18$ing4rec = car::recode(lapop18$ing4, "1:4=0; 5:7=1")
table(lapop18$ing4rec)
## 
##     0     1 
## 11463 15623

En este dataframe se puede calcular la distribución del apoyo a la democracia en estos dos países y se puede reportar los porcentajes redondeado.

round(prop.table(table(lapop18$ing4rec[lapop18$pais==4]))*100, 1)
## 
##  0  1 
## 55 45
round(prop.table(table(lapop18$ing4rec[lapop18$pais==14]))*100, 1)
## 
##    0    1 
## 23.8 76.2

Se observa que estos resultados son iguales a los que aparecen en el Gráfico 1.2 del reporte “El Pulso de la Democracia” (p.12), disponible aquí. Esto es esperable porque, como indica la Tabla 5 de la Nota Metodológica, ambos países tienen un diseño muestral autoponderado, por lo que estos cálculos, que no incluyen el diseño, coinciden con los del reporte, que sí incluyen el factor de expansión.

Un caso diferente es el de Brasil que, según la Nota Metodológica, tiene un diseño muestral ponderado, por lo que sí requeriría usar el factor de expansión para ajustar la sobremuestra en el diseño. Si se calcula el descriptivo del apoyo a la democracia en Brasil sin incluir el factor de expansión se obtiene un resultado distinto al del reporte.

round(prop.table(table(lapop18$ing4rec[lapop18$pais==15]))*100, 1)
## 
##    0    1 
## 40.2 59.8

En este cálculo obtenemos 59.8%, mientras que en el Gráfico 1.2 del reporte se observa 60.0%. Esta diferencia es debida a que el comando table, y luego prop.table, no incluyen el factor de expansión.

Incluyendo el factor de expansión

Algunas librarías y comandos en R permiten la inclusión de una variable de expansión en los cálculos. El paquete descr, por ejemplo, incluye varios comandos, como compmeans o crosstab que permiten esta inclusión del factor de expansión. Para reproducir los datos que se observan en el Gráfico 1.2 del reporte, se puede usar el comando compmeans que permite calcular la media de una variable (como ing4rec, cuya media es igual a la proporción) por grupos de una variable factor, como “pais”, ponderando los resultados por una variable, como “weight1500”. Se agrega la especificación plot=FALSE para desactivar la producción del gráfico.

library(descr)
compmeans(lapop18$ing4rec, lapop18$pais, lapop18$weight1500, plot=FALSE)
## Mean value of "La democracia es mejor que cualquier otra forma de gobierno" 
## according to "País"
##            Mean     N Std. Dev.
## 1     0.6272307  1436 0.4837099
## 2     0.4888451  1432 0.5000501
## 3     0.5856655  1454 0.4927762
## 4     0.4501005  1436 0.4976772
## 5     0.5153743  1451 0.4999359
## 6     0.7235940  1457 0.4473736
## 7     0.5380612  1479 0.4987179
## 8     0.5978999  1460 0.4904899
## 9     0.5443122  1479 0.4982010
## 10    0.4914110  1454 0.5000983
## 11    0.4926471  1475 0.5001155
## 12    0.5121786  1463 0.5000225
## 13    0.6387097  1419 0.4805438
## 14    0.7619359  1451 0.4260454
## 15    0.5999750  1470 0.4900697
## 17    0.7110368  1468 0.4534353
## 21    0.5922659  1458 0.4915818
## 23    0.5118871  1334 0.5000461
## 40    0.7173120  1496 0.4504565
## 41    0.7430692  1497 0.4370869
## Total 0.5928825 29072 0.4913055

De acuerdo a estos resultados, vemos que Brasil (pais=15), tiene un apoyo a la democracia de 0.599975. Si transformamos este número en porcentaje, aproximando a 1 decimal, reproducimos el valor de 60% que se observa en el Gráfico 1.2 del reporte. No solo eso, además, se observa que para el resto de países, los datos se replican. Por ejemplo, para México (país=1), esta tabla muestra un apoyo a la democracia de 0.6272307, o, en porcentaje aproximado a 1 decimal, 62.7%, igual al dato del reporte.

Otra forma de replicar los resultados incorporando el efecto de diseño es usando el paquete survey, paquete especialmente desarrollado para trabajar con diseños muestrales complejos. La Nota Metodológica incluye un apéndice con el código de STATA para usar los factores de expansión en los datos del Barómetro de las Américas. Aquí haremos lo mismo en R, para lo cual usaremos el comando svydesign (similar al comando svyset en STATA). Con este comando se crea un nuevo objeto llamado “diseno18”, que guarda la información de las variables contenidas en el dataframe, incluyendo en los cálculos el factor de expansión. Por tanto, si luego se creara una nueva variable, se tendría que correr nuevamente esté comando para que este objeto “diseno18” incluya esta nueva variable.

Este diseño no solo depende de la variable de ponderación “weight1500”, sino también de la variable que define el estrato “estratopri” y de la variable que define la unidad primaria de muestreo “upm”.

#install.packages("survey") Para instalar el paquete se debe usar este código
library(survey)
diseno18 = svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop18)

Una vez creado los datos con el factor de expansión en el objeto “diseno18”, se puede usar los comandos nativos del paquete survey para realizar cálculos. Por ejemplo, para calcular la media de la variable “ing4rec” (apoyo a la democracia) en toda la base de datos de la ronda 2018/19, se puede usar el comando svymean.

svymean(~ing4rec, diseno18, na.rm=T)
##            mean     SE
## ing4rec 0.57712 0.0032

De esta manera se reproduce el valor de la última fila de resultados del comando compmeans, que corresponde al promedio de toda la muestra. Es decir, de ambas maneras se está encontrando el mismo resultado. Para reproducir los resultados por país, se puede usar el comando svyby que permite hallar resultados (como la media, usando svymean) de una variable (“ing4rec”), por valores de otra variable (“pais”).

svyby(~ing4rec, ~pais, design=diseno18, svymean, na.rm=T)
##    pais   ing4rec         se
## 1     1 0.6272307 0.01245940
## 2     2 0.4888451 0.01358318
## 3     3 0.5856655 0.01267273
## 4     4 0.4501005 0.01197688
## 5     5 0.5153743 0.01419558
## 6     6 0.7235940 0.01512205
## 7     7 0.5380612 0.01372306
## 8     8 0.5978999 0.01212261
## 9     9 0.5443122 0.01357881
## 10   10 0.4914110 0.01374835
## 11   11 0.4926471 0.01337323
## 12   12 0.5121786 0.01624846
## 13   13 0.6387097 0.01161029
## 14   14 0.7619359 0.01240878
## 15   15 0.5999750 0.01556882
## 17   17 0.7110368 0.01415857
## 21   21 0.5922659 0.01050698
## 23   23 0.5118871 0.01325745

En este caso, vemos que esta tabla es exactamente igual a la reportada con compmeans, pues ambas usan el factor de expansión.

De la misma manera, los resultados del gráfico 1.1 del reporte El Pulso de la Democracia de la ronda 2021 no son iguales a los que se obtuvieron en el módulo anterior. Por ejemplo, los datos de apoyo a la democracia por país sin usar el factor de expansión nos indica que en México se tiene 65.2% de encuestados que apoyan a la democracia, mientras que el gráfico del reporte se indica un 63%. Uruguay muestra un 80% de apoyo a la democracia en el reporte, mientras que los resultados sin ponderar indican 84.5%.

Para replicar los resultados del gráfico 1.1 se sigue un procedimiento similar al que se mostró en la ronda 2018/19. Primero recodificamos la variable y usamos el comando compmeans.

lapop21$ing4rec = car::recode(lapop21$ing4, "1:4=0; 5:7=1")
compmeans(lapop21$ing4rec, lapop21$pais, lapop21$weight1500, plot=FALSE)
## Mean value of "La democracia es mejor que cualquier otra forma de gobierno" 
## according to "País"
##            Mean     N Std. Dev.
## 1     0.6319034  1450 0.4824541
## 2     0.5194371  1397 0.4998009
## 3     0.7251405  1460 0.4465964
## 4     0.4876840  1425 0.5000237
## 5     0.6269484  1464 0.4837809
## 6     0.7142359  1476 0.4519307
## 7     0.6120172  1471 0.4874563
## 8     0.5299566  1471 0.4992716
## 9     0.6317680  1483 0.4824875
## 10    0.6097236  1462 0.4879791
## 11    0.4992388  1490 0.5001672
## 12    0.4997591  1453 0.5001720
## 13    0.6758364  1469 0.4682209
## 14    0.7997897  1479 0.4002930
## 15    0.6666251  1479 0.4715787
## 17    0.6885568  1479 0.4632402
## 21    0.6151482  1450 0.4867282
## 22    0.4551642   903 0.4982617
## 23    0.5699446  1324 0.4952707
## 24    0.6583942   680 0.4745972
## Total 0.6134003 27766 0.4869794

También se puede crear un nuevo objeto llamado “diseno21”, que guarda la información de las variables contenidas en el dataframe, incluyendo en los cálculos el factor de expansión. El comando svydesign no acepta que las variables que definen el diseño tengan valores perdidos “NA”. La base de datos de la ronda 2021 tiene 10 NAs en la variable “weight1500” y 1426 NAs en la variable “estratopri”. Para poder crear el objeto de diseño que guarde las variables, se tiene que eliminar estas observaciones con los valores perdidos. La base de datos con estas observaciones eliminadas se guarda en un nuevo dataframe “lapop21a”. Es esta base de datos la que se usa con el comando svydesign.

lapop21a = subset(lapop21, !is.na(estratopri))
lapop21a = subset(lapop21a, !is.na(weight1500))
diseno21 = svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop21a)
svyby(~ing4rec, ~pais, design=diseno21, svymean, na.rm=T)
##    pais   ing4rec          se
## 1     1 0.6316272 0.010566603
## 2     2 0.5199516 0.011260850
## 3     3 0.7256456 0.009307515
## 4     4 0.4871786 0.011431643
## 5     5 0.6269559 0.011877269
## 6     6 0.7156601 0.009841549
## 7     7 0.6114910 0.010348017
## 8     8 0.5291314 0.011788637
## 9     9 0.6319269 0.010361710
## 10   10 0.6096981 0.010533582
## 11   11 0.4987885 0.011084079
## 12   12 0.4997387 0.011035268
## 13   13 0.6762073 0.010349583
## 14   14 0.7997897 0.009234862
## 15   15 0.6667058 0.012588648
## 17   17 0.6883720 0.010656950
## 21   21 0.6143721 0.011124695
## 22   22 0.4487836 0.015521089
## 23   23 0.5698944 0.010519540
## 24   24 0.6610324 0.017120055

De esta manera, hemos visto dos maneras de incorporar el efecto de diseño muestral en los cálculos básicos con los datos del Barómetro de las Américas. Más adelante, se verá la inclusión del factor de expansión en otros cálculos más complejos, como el cálculo de intervalos de confianza o de regresiones. En estos documentos se trabajará la versión simple, sin incluir estos efectos y con los comandos más básicos de R, y luego la versión compleja, incluyendo el factor de expansión en los cálculos.

LS0tCnRpdGxlOiAiRmFjdG9yIGRlIGV4cGFuc2nDs24gdXNhbmRvIGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICAjY29kZV9mb2xkaW5nOiBoaWRlCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkVuIGVzdGUgZG9jdW1lbnRvIHNlIGV4cGxpY2Fyw6EgY8OzbW8gaW50cm9kdWNpciBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBlbiBsb3MgY8OhbGN1bG9zIGVzdGFkw61zdGljb3MgdXNhbmRvIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzLgpTZWd1aXJlbW9zIGxvIHF1ZSBzZSB0cmFiYWrDsyBlbiBlbCBkb2N1bWVudG8gZGUgIk1hbmVqbyBkZSBkYXRvcyIsIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL2FydHVyb21hbGRvbmFkby5naXRodWIuaW8vQmFyb21ldHJvRWR1X1dlYi9NYW5pcHVsYWNpb24uaHRtbCkuCgojIFNvYnJlIGxhIGJhc2UgZGUgZGF0b3MKCkxvcyBkYXRvcyBxdWUgdmFtb3MgYSB1c2FyIGRlYmVuIGNpdGFyc2UgZGUgbGEgc2lndWllbnRlIG1hbmVyYTogRnVlbnRlOiBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMgcG9yIGVsIFByb3llY3RvIGRlIE9waW5pw7NuIFDDumJsaWNhIGRlIEFtw6lyaWNhIExhdGluYSAoTEFQT1ApLCB3d3d3LkxhcG9wU3VydmV5cy5vcmcuClBhcmEgcG9kZXIgcmVwcm9kdWNpciBlc3RvcyBjw6FsY3Vsb3MsIGVzdGUgZG9jdW1lbnRvIGVtcGllemEgZGVzZGUgZWwgaW5pY2lvLCBjYXJnYW5kbyBudWV2YW1lbnRlIGxhIGJhc2UgZGUgZGF0b3MgcmVjb3J0YWRhIGRlc2RlIGVsIHJlcG9zaXRvcmlvICJtYXRlcmlhbHNfZWR1IiBkZSBsYSBjdWVudGEgZGUgTEFQT1AgZW4gR2l0SHViLgpTZSBzdWdpZXJlIHF1ZSBzZSBsaW1waWUgZWwgRW52aXJvbm1lbnQgZGUgY3VhbHF1aWVyIG90cm8gZGF0YWZyYW1lIGFudGVyaW9yLgpFc3RvIHNlIHB1ZWRlIGhhY2VyIGNvbiBsYSBlc2NvYmEgKENsZWFyIG9iamVjdHMgZnJvbSB0aGUgd29ya3NwYWNlKS4KCk1lZGlhbnRlIGxhIGxpYnJlcsOtYSBgcmlvYCB5IGVsIGNvbWFuZG8gYGltcG9ydGAgc2UgcHVlZGUgaW1wb3J0YXIgbnVldmFtZW50ZSBkZXNkZSBlbCBpbmljaW8gZXN0YSBiYXNlIGRlIGRhdG9zIGRlc2RlIGVzdGUgcmVwb3NpdG9yaW8sIHVzYW5kbyBlbCBzaWd1aWVudGUgY8OzZGlnby4KRWxpbWluYW1vcyBsYXMgb2JzZXJ2YWNpb25lcyBkZSBFc3RhZG9zIFVuaWRvcyB5IENhbmFkw6EgY29uIGVsIGNvbWFuZG8gYHN1YnNldGAuCgpgYGB7ciBiYXNlMTh9CmxpYnJhcnkocmlvKQpsYXBvcDE4ID0gaW1wb3J0KCJodHRwczovL3Jhdy5naXRodWIuY29tL2xhcG9wLWNlbnRyYWwvbWF0ZXJpYWxzX2VkdS9tYWluL0xBUE9QX0FCX01lcmdlXzIwMThfdjEuMC5zYXYiKQpsYXBvcDE4ID0gc3Vic2V0KGxhcG9wMTgsIHBhaXM8PTM1KQpgYGAKClRhbWJpw6luIGNhcmdhbW9zIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgcm9uZGEgMjAyMS4KCmBgYHtyIGJhc2UyMX0KbGFwb3AyMSA9IGltcG9ydCgiaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9sYXBvcC1jZW50cmFsL21hdGVyaWFsc19lZHUvbWFpbi9sYXBvcDIxLlJEYXRhIikKbGFwb3AyMSA9IHN1YnNldChsYXBvcDIxLCBwYWlzPD0zNSkKYGBgCgojIFNvYnJlIGVsIHVzbyBkZSBsb3MgZmFjdG9yZXMgZGUgZXhwYW5zacOzbgoKQ3VhbmRvIHVuIGludmVzdGlnYWRvciBhYnJlIHVuYSBiYXNlIGRlIGRhdG9zIGVuIGN1YWxxdWllciBwcm9ncmFtYSBlc3RhZMOtc3RpY28sIGVsIHNvZnR3YXJlIGFzdW1lIHF1ZSBsb3MgZGF0b3MgcHJvdmllbmVuIGRlIHVuIG11ZXN0cm8gc2ltcGxlIGFsZWF0b3Jpby4KQ3VhbmRvIHNlIHRyYWJhamEgY29uIGRhdG9zIGRlIG9waW5pw7NuIHDDumJsaWNhLCBjb21vIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzLCBlbCBkaXNlw7FvIG11ZXN0cmFsIGdlbmVyYWxtZW50ZSBubyBlcyB1biBtdWVzdHJlbyBzaW1wbGUgYWxlYXRvcmlvLCBzaW5vIHVuIGRpc2XDsW8gY29tcGxlam8sIGNvbiBlc3RyYXRpZmljYWNpb25lcywgc2VnbWVudGFjaW9uZXMsIGN1b3RhcywgZW4gZGlmZXJlbnRlcyBldGFwYXMuCkNvbW8gaW5kaWNhIGVsIHJlcG9ydGUgdMOpY25pY28gZGUgbGEgcm9uZGEgMjAxOC8xOSBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4L0FtZXJpY2FzQmFyb21ldGVyXzIwMTgtMTlfVGVjaG5pY2FsX1JlcG9ydF9XXzEwMjkxOS5wZGYpLCBsYXMgbXVlc3RyYXMgZW4gY2FkYSBwYcOtcyBmdWVyb24gZGlzZcOxYWRhcyB1c2FuZG8gdW4gZGlzZcOxbyBwcm9iYWJpbMOtc3RpY28gbXVsdGlldGFwYSAoY29uIGN1b3RhcyBhbCBuaXZlbCBkZSBob2dhcmVzIHBhcmEgbGEgbWF5b3LDrWEgZGUgcGHDrXNlcyksIHkgZnVlcm9uIGVzdHJhdGlmaWNhZGFzIHBvciByZWdpb25lcyBwcmluY2lwYWxlcyBlbiBlbCBwYcOtcywgdGFtYcOxbyBkZSBsYSBtdW5pY2lwYWxpZGFkIHkgcG9yIMOhcmVhcyB1cmJhbmFzIHkgcnVyYWxlcyBkZW50cm8gZGUgbGFzIG11bmljaXBhbGlkYWRlcy4KRXN0ZSBkaXNlw7FvIG11ZXN0cmFsIGNvbXBsZWpvIHNlIHRpZW5lIHF1ZSBpbmNvcnBvcmFyIGdlbmVyYWxtZW50ZSBlbiBsb3MgY8OhbGN1bG9zLgpFbiBjaWVydGFzIG9jYXNpb25lcywgc2kgbm8gc2UgaW5jb3Jwb3JhLCBwdWVkZSBsbGV2YXIgYSBkaWZlcmVuY2lhcyBlbiBsb3MgcmVzdWx0YWRvcy4KVW5hIGV4cGxpY2FjacOzbiBtw6FzIGRldGFsbGFkYSBzb2JyZSBlbCB1c28gZGUgbG9zIGZhY3RvcmVzIGRlIGV4cGFuc2nDs24geSBsYXMgcG90ZW5jaWFsZXMgY29uc2VjdWVuY2lhcyBkZSBubyB1c2FybG9zIGNvbiBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwdWVkZSBzZXIgbGXDrWRhIGVuIGxhIE5vdGEgTWV0b2RvbMOzZ2ljYSAwMDcgKENhc3RvcmVuYSwgMjAyMSksIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9pbnNpZ2h0cy9JTU4wMDdlcy5wZGYpLgpFc3RhIE5vdGEgTWV0b2RvbMOzZ2ljYSBkZXNjcmliZSB0cmVzIGVzY2VuYXJpb3MgZGUgdXNvcyBkZSBmYWN0b3JlcyBkZSBleHBhbnNpw7NuOgoKMS4gIEFqdXN0ZSBwb3N0IGVzdHJhdGlmaWNhY2nDs246IGN1YW5kbyBsYSBtdWVzdHJhIG5vIGVzIGF1dG9wb25kZXJhZGEgeSBzZSBkZXN2w61hIGRlIGNpZXJ0YXMgY2FyYWN0ZXLDrXN0aWNhcyBzb2Npb2RlbW9ncsOhZmljYXMgaW1wb3J0YW50ZXMuIEVuIGxhIGJhc2UgZGUgZGF0b3MsIGVzdGEgY2FyYWN0ZXLDrXN0aWNhIHNlIGFqdXN0YSBjb24gbGEgdmFyaWFibGUgImVzdHJhdG9wcmkiLgoyLiAgQWp1c3RlIHBvciBzb2JyZW11ZXN0cmVvOiBjdWFuZG8gbGEgbXVlc3RyYSBpbmNsdXllIHVuYSBzb2JyZW11ZXN0cmEgZGUgc3VicG9ibGFjaW9uZXMgZGUgaW50ZXLDqXMuIEVuIGxhIGJhc2UgZGUgZGF0b3MsIGVzdGEgY2FyYWN0ZXLDrXN0aWNhIHNlIGFqdXN0YSBjb24gbGEgdmFyaWFibGUgInd0Ii4KMy4gIEFqdXN0ZSBkZSBtw7psdGlwbGVzIGVuY3Vlc3RhczogY3VhbmRvIHNlIGFuYWxpemEgZGF0b3MgZGUgdmFyaW9zIHBhw61zZXMgbyBkaWZlcmVudGVzIHJvbmRhcy4gTGEgdmFyaWFibGUgcG9uZGVyYWRvcmEgZW4gbGEgYmFzZSBkZSBkYXRvcyBlcyAid2VpZ2h0MTUwMCIsIHF1ZSBlc3RhbmRhcml6YSBsYXMgbXVlc3RyYXMgZGUgY2FkYSBwYcOtcyBhIDEsNTAwIG9ic2VydmFjaW9uZXMuCgojIENvbnNlY3VlbmNpYXMgZGUgbm8gdXNhciBmYWN0b3JlcyBkZSBleHBhbnNpw7NuCgpDb21vIGluZGljYSBsYSBOb3RhIG1ldG9kb2zDs2dpY2EsICJsb3MgYW7DoWxpc2lzIHNpbiBwb25kZXJhciBwdWVkZW4gcmVzdWx0YXIgZW4gZXN0aW1hY2lvbmVzIHNlc2dhZGFzIiAocC45KS4KUG9yIGVqZW1wbG8sIGVuIGVsIGRvY3VtZW50byBzb2JyZSBtYW5lam8gZGUgZGF0b3MgcmVwbGljYW1vcyBsb3MgcmVzdWx0YWRvcyBzb2JyZSBlbCBhcG95byBhIGxhIGRlbW9jcmFjaWEgZW4gSG9uZHVyYXMgKDQ1JSkgeSBVcnVndWF5ICg3Ni4yJSksIHBhcmEgbG8gcXVlIHNlIGNhbGN1bMOzIGxhIHZhcmlhYmxlIHJlY29kaWZpY2FkYSB5IHNlIGRlc2NyaWJpw7MuCgpgYGB7ciBtYW5pcHVsYWNpb24sIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkoY2FyKQpsYXBvcDE4JGluZzRyZWMgPSBjYXI6OnJlY29kZShsYXBvcDE4JGluZzQsICIxOjQ9MDsgNTo3PTEiKQp0YWJsZShsYXBvcDE4JGluZzRyZWMpCmBgYAoKRW4gZXN0ZSBkYXRhZnJhbWUgc2UgcHVlZGUgY2FsY3VsYXIgbGEgZGlzdHJpYnVjacOzbiBkZWwgYXBveW8gYSBsYSBkZW1vY3JhY2lhIGVuIGVzdG9zIGRvcyBwYcOtc2VzIHkgc2UgcHVlZGUgcmVwb3J0YXIgbG9zIHBvcmNlbnRhamVzIHJlZG9uZGVhZG8uCgpgYGB7ciBIb25kdXJhcyB5IFVydWd1YXl9CnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09NF0pKSoxMDAsIDEpCnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09MTRdKSkqMTAwLCAxKQpgYGAKClNlIG9ic2VydmEgcXVlIGVzdG9zIHJlc3VsdGFkb3Mgc29uIGlndWFsZXMgYSBsb3MgcXVlIGFwYXJlY2VuIGVuIGVsIEdyw6FmaWNvIDEuMiBkZWwgcmVwb3J0ZSAiRWwgUHVsc28gZGUgbGEgRGVtb2NyYWNpYSIgKHAuMTIpLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4LzIwMTgtMTlfQW1lcmljYXNCYXJvbWV0ZXJfUmVnaW9uYWxfUmVwb3J0X1NwYW5pc2hfV18wMy4yNy4yMC5wZGYpLgpFc3RvIGVzIGVzcGVyYWJsZSBwb3JxdWUsIGNvbW8gaW5kaWNhIGxhIFRhYmxhIDUgZGUgbGEgTm90YSBNZXRvZG9sw7NnaWNhLCBhbWJvcyBwYcOtc2VzIHRpZW5lbiB1biBkaXNlw7FvIG11ZXN0cmFsIGF1dG9wb25kZXJhZG8sIHBvciBsbyBxdWUgZXN0b3MgY8OhbGN1bG9zLCBxdWUgbm8gaW5jbHV5ZW4gZWwgZGlzZcOxbywgY29pbmNpZGVuIGNvbiBsb3MgZGVsIHJlcG9ydGUsIHF1ZSBzw60gaW5jbHV5ZW4gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCgpVbiBjYXNvIGRpZmVyZW50ZSBlcyBlbCBkZSBCcmFzaWwgcXVlLCBzZWfDum4gbGEgTm90YSBNZXRvZG9sw7NnaWNhLCB0aWVuZSB1biBkaXNlw7FvIG11ZXN0cmFsIHBvbmRlcmFkbywgcG9yIGxvIHF1ZSBzw60gcmVxdWVyaXLDrWEgdXNhciBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBwYXJhIGFqdXN0YXIgbGEgc29icmVtdWVzdHJhIGVuIGVsIGRpc2XDsW8uClNpIHNlIGNhbGN1bGEgZWwgZGVzY3JpcHRpdm8gZGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiBCcmFzaWwgc2luIGluY2x1aXIgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24gc2Ugb2J0aWVuZSB1biByZXN1bHRhZG8gZGlzdGludG8gYWwgZGVsIHJlcG9ydGUuCgpgYGB7ciBCcmFzaWx9CnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09MTVdKSkqMTAwLCAxKQpgYGAKCkVuIGVzdGUgY8OhbGN1bG8gb2J0ZW5lbW9zIDU5LjglLCBtaWVudHJhcyBxdWUgZW4gZWwgR3LDoWZpY28gMS4yIGRlbCByZXBvcnRlIHNlIG9ic2VydmEgNjAuMCUuCkVzdGEgZGlmZXJlbmNpYSBlcyBkZWJpZGEgYSBxdWUgZWwgY29tYW5kbyBgdGFibGVgLCB5IGx1ZWdvIGBwcm9wLnRhYmxlYCwgbm8gaW5jbHV5ZW4gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCgojIEluY2x1eWVuZG8gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24KCkFsZ3VuYXMgbGlicmFyw61hcyB5IGNvbWFuZG9zIGVuIFIgcGVybWl0ZW4gbGEgaW5jbHVzacOzbiBkZSB1bmEgdmFyaWFibGUgZGUgZXhwYW5zacOzbiBlbiBsb3MgY8OhbGN1bG9zLgpFbCBwYXF1ZXRlIGBkZXNjcmAsIHBvciBlamVtcGxvLCBpbmNsdXllIHZhcmlvcyBjb21hbmRvcywgY29tbyBgY29tcG1lYW5zYCBvIGBjcm9zc3RhYmAgcXVlIHBlcm1pdGVuIGVzdGEgaW5jbHVzacOzbiBkZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uClBhcmEgcmVwcm9kdWNpciBsb3MgZGF0b3MgcXVlIHNlIG9ic2VydmFuIGVuIGVsIEdyw6FmaWNvIDEuMiBkZWwgcmVwb3J0ZSwgc2UgcHVlZGUgdXNhciBlbCBjb21hbmRvIGBjb21wbWVhbnNgIHF1ZSBwZXJtaXRlIGNhbGN1bGFyIGxhIG1lZGlhIGRlIHVuYSB2YXJpYWJsZSAoY29tbyBpbmc0cmVjLCBjdXlhIG1lZGlhIGVzIGlndWFsIGEgbGEgcHJvcG9yY2nDs24pIHBvciBncnVwb3MgZGUgdW5hIHZhcmlhYmxlIGZhY3RvciwgY29tbyAicGFpcyIsIHBvbmRlcmFuZG8gbG9zIHJlc3VsdGFkb3MgcG9yIHVuYSB2YXJpYWJsZSwgY29tbyAid2VpZ2h0MTUwMCIuClNlIGFncmVnYSBsYSBlc3BlY2lmaWNhY2nDs24gYHBsb3Q9RkFMU0VgIHBhcmEgZGVzYWN0aXZhciBsYSBwcm9kdWNjacOzbiBkZWwgZ3LDoWZpY28uCgpgYGB7ciBhcG95byBhIGxhIGRlbW9jcmFjaWEgcG9uZGVyYWRvLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRlc2NyKQpjb21wbWVhbnMobGFwb3AxOCRpbmc0cmVjLCBsYXBvcDE4JHBhaXMsIGxhcG9wMTgkd2VpZ2h0MTUwMCwgcGxvdD1GQUxTRSkKYGBgCgpEZSBhY3VlcmRvIGEgZXN0b3MgcmVzdWx0YWRvcywgdmVtb3MgcXVlIEJyYXNpbCAocGFpcz0xNSksIHRpZW5lIHVuIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBkZSAwLjU5OTk3NS4KU2kgdHJhbnNmb3JtYW1vcyBlc3RlIG7Dum1lcm8gZW4gcG9yY2VudGFqZSwgYXByb3hpbWFuZG8gYSAxIGRlY2ltYWwsIHJlcHJvZHVjaW1vcyBlbCB2YWxvciBkZSA2MCUgcXVlIHNlIG9ic2VydmEgZW4gZWwgR3LDoWZpY28gMS4yIGRlbCByZXBvcnRlLgpObyBzb2xvIGVzbywgYWRlbcOhcywgc2Ugb2JzZXJ2YSBxdWUgcGFyYSBlbCByZXN0byBkZSBwYcOtc2VzLCBsb3MgZGF0b3Mgc2UgcmVwbGljYW4uClBvciBlamVtcGxvLCBwYXJhIE3DqXhpY28gKHBhw61zPTEpLCBlc3RhIHRhYmxhIG11ZXN0cmEgdW4gYXBveW8gYSBsYSBkZW1vY3JhY2lhIGRlIDAuNjI3MjMwNywgbywgZW4gcG9yY2VudGFqZSBhcHJveGltYWRvIGEgMSBkZWNpbWFsLCA2Mi43JSwgaWd1YWwgYWwgZGF0byBkZWwgcmVwb3J0ZS4KCk90cmEgZm9ybWEgZGUgcmVwbGljYXIgbG9zIHJlc3VsdGFkb3MgaW5jb3Jwb3JhbmRvIGVsIGVmZWN0byBkZSBkaXNlw7FvIGVzIHVzYW5kbyBlbCBwYXF1ZXRlIGBzdXJ2ZXlgLCBwYXF1ZXRlIGVzcGVjaWFsbWVudGUgZGVzYXJyb2xsYWRvIHBhcmEgdHJhYmFqYXIgY29uIGRpc2XDsW9zIG11ZXN0cmFsZXMgY29tcGxlam9zLgpMYSBOb3RhIE1ldG9kb2zDs2dpY2EgaW5jbHV5ZSB1biBhcMOpbmRpY2UgY29uIGVsIGPDs2RpZ28gZGUgU1RBVEEgcGFyYSB1c2FyIGxvcyBmYWN0b3JlcyBkZSBleHBhbnNpw7NuIGVuIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzLgpBcXXDrSBoYXJlbW9zIGxvIG1pc21vIGVuIFIsIHBhcmEgbG8gY3VhbCB1c2FyZW1vcyBlbCBjb21hbmRvIGBzdnlkZXNpZ25gIChzaW1pbGFyIGFsIGNvbWFuZG8gc3Z5c2V0IGVuIFNUQVRBKS4KQ29uIGVzdGUgY29tYW5kbyBzZSBjcmVhIHVuIG51ZXZvIG9iamV0byBsbGFtYWRvICJkaXNlbm8xOCIsIHF1ZSBndWFyZGEgbGEgaW5mb3JtYWNpw7NuIGRlIGxhcyB2YXJpYWJsZXMgY29udGVuaWRhcyBlbiBlbCBkYXRhZnJhbWUsIGluY2x1eWVuZG8gZW4gbG9zIGPDoWxjdWxvcyBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbi4KUG9yIHRhbnRvLCBzaSBsdWVnbyBzZSBjcmVhcmEgdW5hIG51ZXZhIHZhcmlhYmxlLCBzZSB0ZW5kcsOtYSBxdWUgY29ycmVyIG51ZXZhbWVudGUgZXN0w6kgY29tYW5kbyBwYXJhIHF1ZSBlc3RlIG9iamV0byAiZGlzZW5vMTgiIGluY2x1eWEgZXN0YSBudWV2YSB2YXJpYWJsZS4KCkVzdGUgZGlzZcOxbyBubyBzb2xvIGRlcGVuZGUgZGUgbGEgdmFyaWFibGUgZGUgcG9uZGVyYWNpw7NuICJ3ZWlnaHQxNTAwIiwgc2lubyB0YW1iacOpbiBkZSBsYSB2YXJpYWJsZSBxdWUgZGVmaW5lIGVsIGVzdHJhdG8gImVzdHJhdG9wcmkiIHkgZGUgbGEgdmFyaWFibGUgcXVlIGRlZmluZSBsYSB1bmlkYWQgcHJpbWFyaWEgZGUgbXVlc3RyZW8gInVwbSIuCgpgYGB7ciBleHBhbnNpb24gY29uIHN1cnZleSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI2luc3RhbGwucGFja2FnZXMoInN1cnZleSIpIFBhcmEgaW5zdGFsYXIgZWwgcGFxdWV0ZSBzZSBkZWJlIHVzYXIgZXN0ZSBjw7NkaWdvCmxpYnJhcnkoc3VydmV5KQpkaXNlbm8xOCA9IHN2eWRlc2lnbihpZHMgPSB+dXBtLCBzdHJhdGEgPSB+ZXN0cmF0b3ByaSwgd2VpZ2h0cyA9IH53ZWlnaHQxNTAwLCBuZXN0PVRSVUUsIGRhdGE9bGFwb3AxOCkKYGBgCgpVbmEgdmV6IGNyZWFkbyBsb3MgZGF0b3MgY29uIGVsIGZhY3RvciBkZSBleHBhbnNpw7NuIGVuIGVsIG9iamV0byAiZGlzZW5vMTgiLCBzZSBwdWVkZSB1c2FyIGxvcyBjb21hbmRvcyBuYXRpdm9zIGRlbCBwYXF1ZXRlIGBzdXJ2ZXlgIHBhcmEgcmVhbGl6YXIgY8OhbGN1bG9zLgpQb3IgZWplbXBsbywgcGFyYSBjYWxjdWxhciBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSAiaW5nNHJlYyIgKGFwb3lvIGEgbGEgZGVtb2NyYWNpYSkgZW4gdG9kYSBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMTgvMTksIHNlIHB1ZWRlIHVzYXIgZWwgY29tYW5kbyBgc3Z5bWVhbmAuCgpgYGB7ciBtZWRpYSBjb24gc3VydmV5fQpzdnltZWFuKH5pbmc0cmVjLCBkaXNlbm8xOCwgbmEucm09VCkKYGBgCgpEZSBlc3RhIG1hbmVyYSBzZSByZXByb2R1Y2UgZWwgdmFsb3IgZGUgbGEgw7psdGltYSBmaWxhIGRlIHJlc3VsdGFkb3MgZGVsIGNvbWFuZG8gYGNvbXBtZWFuc2AsIHF1ZSBjb3JyZXNwb25kZSBhbCBwcm9tZWRpbyBkZSB0b2RhIGxhIG11ZXN0cmEuCkVzIGRlY2lyLCBkZSBhbWJhcyBtYW5lcmFzIHNlIGVzdMOhIGVuY29udHJhbmRvIGVsIG1pc21vIHJlc3VsdGFkby4KUGFyYSByZXByb2R1Y2lyIGxvcyByZXN1bHRhZG9zIHBvciBwYcOtcywgc2UgcHVlZGUgdXNhciBlbCBjb21hbmRvIGBzdnlieWAgcXVlIHBlcm1pdGUgaGFsbGFyIHJlc3VsdGFkb3MgKGNvbW8gbGEgbWVkaWEsIHVzYW5kbyBgc3Z5bWVhbmApIGRlIHVuYSB2YXJpYWJsZSAoImluZzRyZWMiKSwgcG9yIHZhbG9yZXMgZGUgb3RyYSB2YXJpYWJsZSAoInBhaXMiKS4KCmBgYHtyIG1lZGlhIHBvciBwYWlzIGNvbiBzdXJ2ZXl9CnN2eWJ5KH5pbmc0cmVjLCB+cGFpcywgZGVzaWduPWRpc2VubzE4LCBzdnltZWFuLCBuYS5ybT1UKQpgYGAKCkVuIGVzdGUgY2FzbywgdmVtb3MgcXVlIGVzdGEgdGFibGEgZXMgZXhhY3RhbWVudGUgaWd1YWwgYSBsYSByZXBvcnRhZGEgY29uIGBjb21wbWVhbnNgLCBwdWVzIGFtYmFzIHVzYW4gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCgpEZSBsYSBtaXNtYSBtYW5lcmEsIGxvcyByZXN1bHRhZG9zIGRlbCBncsOhZmljbyAxLjEgZGVsIHJlcG9ydGUgRWwgUHVsc28gZGUgbGEgRGVtb2NyYWNpYSBkZSBsYSByb25kYSAyMDIxIG5vIHNvbiBpZ3VhbGVzIGEgbG9zIHF1ZSBzZSBvYnR1dmllcm9uIGVuIGVsIG3Ds2R1bG8gYW50ZXJpb3IuClBvciBlamVtcGxvLCBsb3MgZGF0b3MgZGUgYXBveW8gYSBsYSBkZW1vY3JhY2lhIHBvciBwYcOtcyBzaW4gdXNhciBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBub3MgaW5kaWNhIHF1ZSBlbiBNw6l4aWNvIHNlIHRpZW5lIDY1LjIlIGRlIGVuY3Vlc3RhZG9zIHF1ZSBhcG95YW4gYSBsYSBkZW1vY3JhY2lhLCBtaWVudHJhcyBxdWUgZWwgZ3LDoWZpY28gZGVsIHJlcG9ydGUgc2UgaW5kaWNhIHVuIDYzJS4KVXJ1Z3VheSBtdWVzdHJhIHVuIDgwJSBkZSBhcG95byBhIGxhIGRlbW9jcmFjaWEgZW4gZWwgcmVwb3J0ZSwgbWllbnRyYXMgcXVlIGxvcyByZXN1bHRhZG9zIHNpbiBwb25kZXJhciBpbmRpY2FuIDg0LjUlLgoKUGFyYSByZXBsaWNhciBsb3MgcmVzdWx0YWRvcyBkZWwgZ3LDoWZpY28gMS4xIHNlIHNpZ3VlIHVuIHByb2NlZGltaWVudG8gc2ltaWxhciBhbCBxdWUgc2UgbW9zdHLDsyBlbiBsYSByb25kYSAyMDE4LzE5LgpQcmltZXJvIHJlY29kaWZpY2Ftb3MgbGEgdmFyaWFibGUgeSB1c2Ftb3MgZWwgY29tYW5kbyBgY29tcG1lYW5zYC4KCmBgYHtyIG1lZGlhIGFwb3lvIDIxfQpsYXBvcDIxJGluZzRyZWMgPSBjYXI6OnJlY29kZShsYXBvcDIxJGluZzQsICIxOjQ9MDsgNTo3PTEiKQpjb21wbWVhbnMobGFwb3AyMSRpbmc0cmVjLCBsYXBvcDIxJHBhaXMsIGxhcG9wMjEkd2VpZ2h0MTUwMCwgcGxvdD1GQUxTRSkKYGBgCgpUYW1iacOpbiBzZSBwdWVkZSBjcmVhciB1biBudWV2byBvYmpldG8gbGxhbWFkbyAiZGlzZW5vMjEiLCBxdWUgZ3VhcmRhIGxhIGluZm9ybWFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGNvbnRlbmlkYXMgZW4gZWwgZGF0YWZyYW1lLCBpbmNsdXllbmRvIGVuIGxvcyBjw6FsY3Vsb3MgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCkVsIGNvbWFuZG8gYHN2eWRlc2lnbmAgbm8gYWNlcHRhIHF1ZSBsYXMgdmFyaWFibGVzIHF1ZSBkZWZpbmVuIGVsIGRpc2XDsW8gdGVuZ2FuIHZhbG9yZXMgcGVyZGlkb3MgIk5BIi4KTGEgYmFzZSBkZSBkYXRvcyBkZSBsYSByb25kYSAyMDIxIHRpZW5lIDEwIE5BcyBlbiBsYSB2YXJpYWJsZSAid2VpZ2h0MTUwMCIgeSAxNDI2IE5BcyBlbiBsYSB2YXJpYWJsZSAiZXN0cmF0b3ByaSIuClBhcmEgcG9kZXIgY3JlYXIgZWwgb2JqZXRvIGRlIGRpc2XDsW8gcXVlIGd1YXJkZSBsYXMgdmFyaWFibGVzLCBzZSB0aWVuZSBxdWUgZWxpbWluYXIgZXN0YXMgb2JzZXJ2YWNpb25lcyBjb24gbG9zIHZhbG9yZXMgcGVyZGlkb3MuCkxhIGJhc2UgZGUgZGF0b3MgY29uIGVzdGFzIG9ic2VydmFjaW9uZXMgZWxpbWluYWRhcyBzZSBndWFyZGEgZW4gdW4gbnVldm8gZGF0YWZyYW1lICJsYXBvcDIxYSIuCkVzIGVzdGEgYmFzZSBkZSBkYXRvcyBsYSBxdWUgc2UgdXNhIGNvbiBlbCBjb21hbmRvIGBzdnlkZXNpZ25gLgoKYGBge3Igc3VydmV5IDIxfQpsYXBvcDIxYSA9IHN1YnNldChsYXBvcDIxLCAhaXMubmEoZXN0cmF0b3ByaSkpCmxhcG9wMjFhID0gc3Vic2V0KGxhcG9wMjFhLCAhaXMubmEod2VpZ2h0MTUwMCkpCmRpc2VubzIxID0gc3Z5ZGVzaWduKGlkcyA9IH51cG0sIHN0cmF0YSA9IH5lc3RyYXRvcHJpLCB3ZWlnaHRzID0gfndlaWdodDE1MDAsIG5lc3Q9VFJVRSwgZGF0YT1sYXBvcDIxYSkKYGBgCgpgYGB7ciBzdnlieSAyMX0Kc3Z5YnkofmluZzRyZWMsIH5wYWlzLCBkZXNpZ249ZGlzZW5vMjEsIHN2eW1lYW4sIG5hLnJtPVQpCmBgYAoKRGUgZXN0YSBtYW5lcmEsIGhlbW9zIHZpc3RvIGRvcyBtYW5lcmFzIGRlIGluY29ycG9yYXIgZWwgZWZlY3RvIGRlIGRpc2XDsW8gbXVlc3RyYWwgZW4gbG9zIGPDoWxjdWxvcyBiw6FzaWNvcyBjb24gbG9zIGRhdG9zIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMuCk3DoXMgYWRlbGFudGUsIHNlIHZlcsOhIGxhIGluY2x1c2nDs24gZGVsIGZhY3RvciBkZSBleHBhbnNpw7NuIGVuIG90cm9zIGPDoWxjdWxvcyBtw6FzIGNvbXBsZWpvcywgY29tbyBlbCBjw6FsY3VsbyBkZSBpbnRlcnZhbG9zIGRlIGNvbmZpYW56YSBvIGRlIHJlZ3Jlc2lvbmVzLgpFbiBlc3RvcyBkb2N1bWVudG9zIHNlIHRyYWJhamFyw6EgbGEgdmVyc2nDs24gc2ltcGxlLCBzaW4gaW5jbHVpciBlc3RvcyBlZmVjdG9zIHkgY29uIGxvcyBjb21hbmRvcyBtw6FzIGLDoXNpY29zIGRlIFIsIHkgbHVlZ28gbGEgdmVyc2nDs24gY29tcGxlamEsIGluY2x1eWVuZG8gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24gZW4gbG9zIGPDoWxjdWxvcy4K