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 “diseño18”, 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 “lapop.design” 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)
diseño18<-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
“lapop.design”, 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, diseño18, 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=diseño18, 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 “diseño21”, 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))
diseño21<-svydesign(ids = ~upm, strata = ~estratopri, weights = ~weight1500, nest=TRUE, data=lapop21a)
svyby(~ing4rec, ~pais, design=diseño21, 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.
 
LS0tCnRpdGxlOiAiRmFjdG9yIGRlIGV4cGFuc2nDs24gdXNhbmRvIGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29sbGFwc2VkOiBmYWxzZQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQogICAgdG9jX2RlcHRoOiAxCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0aGVtZTogZmxhdGx5CiAgICAjY29kZV9mb2xkaW5nOiBoaWRlCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiBzZW50ZW5jZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQobWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFKQpgYGAKCmBgYHtjc3MgY29sb3IsIGVjaG89RkFMU0V9Ci5jb2x1bW5zIHtkaXNwbGF5OiBmbGV4O30KaDEge2NvbG9yOiAjMzM2NkNDO30KYGBgCgojIEludHJvZHVjY2nDs24KCkVuIGVzdGUgZG9jdW1lbnRvIHNlIGV4cGxpY2Fyw6EgY8OzbW8gaW50cm9kdWNpciBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiB5IGxhcyBwb25kZXJhY2lvbmVzIGVuIGxvcyBjw6FsY3Vsb3MgZXN0YWTDrXN0aWNvcyB1c2FuZG8gbG9zIGRhdG9zIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMuClNlZ3VpcmVtb3MgbG8gcXVlIHNlIHRyYWJhasOzIGVuIGVsIGRvY3VtZW50byBkZSAiTWFuZWpvIGRlIGRhdG9zIiwgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vYXJ0dXJvbWFsZG9uYWRvLmdpdGh1Yi5pby9CYXJvbWV0cm9FZHVfV2ViL01hbmlwdWxhY2lvbi5odG1sKS4KCiMgU29icmUgbGEgYmFzZSBkZSBkYXRvcwoKTG9zIGRhdG9zIHF1ZSB2YW1vcyBhIHVzYXIgZGViZW4gY2l0YXJzZSBkZSBsYSBzaWd1aWVudGUgbWFuZXJhOiBGdWVudGU6IEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcyBwb3IgZWwgUHJveWVjdG8gZGUgT3BpbmnDs24gUMO6YmxpY2EgZGUgQW3DqXJpY2EgTGF0aW5hIChMQVBPUCksIHd3d3cuTGFwb3BTdXJ2ZXlzLm9yZy4KUGFyYSBwb2RlciByZXByb2R1Y2lyIGVzdG9zIGPDoWxjdWxvcywgZXN0ZSBkb2N1bWVudG8gZW1waWV6YSBkZXNkZSBlbCBpbmljaW8sIGNhcmdhbmRvIG51ZXZhbWVudGUgbGEgYmFzZSBkZSBkYXRvcyByZWNvcnRhZGEgZGVzZGUgZWwgcmVwb3NpdG9yaW8gIm1hdGVyaWFsc19lZHUiIGRlIGxhIGN1ZW50YSBkZSBMQVBPUCBlbiBHaXRIdWIuClNlIHN1Z2llcmUgcXVlIHNlIGxpbXBpZSBlbCBFbnZpcm9ubWVudCBkZSBjdWFscXVpZXIgb3RybyBkYXRhZnJhbWUgYW50ZXJpb3IuCkVzdG8gc2UgcHVlZGUgaGFjZXIgY29uIGxhIGVzY29iYSAoQ2xlYXIgb2JqZWN0cyBmcm9tIHRoZSB3b3Jrc3BhY2UpLgoKTWVkaWFudGUgbGEgbGlicmVyw61hIGByaW9gIHkgZWwgY29tYW5kbyBgaW1wb3J0YCBzZSBwdWVkZSBpbXBvcnRhciBudWV2YW1lbnRlIGRlc2RlIGVsIGluaWNpbyBlc3RhIGJhc2UgZGUgZGF0b3MgZGVzZGUgZXN0ZSByZXBvc2l0b3JpbywgdXNhbmRvIGVsIHNpZ3VpZW50ZSBjw7NkaWdvLgoKYGBge3IgYmFzZTE4fQpsaWJyYXJ5KHJpbykKbGFwb3AxOCA8LSBpbXBvcnQoImh0dHBzOi8vcmF3LmdpdGh1Yi5jb20vbGFwb3AtY2VudHJhbC9tYXRlcmlhbHNfZWR1L21haW4vTEFQT1BfQUJfTWVyZ2VfMjAxOF92MS4wLnNhdiIpCmxhcG9wMTggPC0gc3Vic2V0KGxhcG9wMTgsIHBhaXM8PTM1KQpgYGAKClRhbWJpw6luIGNhcmdhbW9zIGxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgcm9uZGEgMjAyMS4KCmBgYHtyIGJhc2UyMX0KbGFwb3AyMSA9IGltcG9ydCgibGFwb3AyMS5SRGF0YSIpCmxhcG9wMjEgPC0gc3Vic2V0KGxhcG9wMjEsIHBhaXM8PTM1KQpgYGAKCiMgU29icmUgZWwgdXNvIGRlIGxvcyBmYWN0b3JlcyBkZSBleHBhbnNpw7NuCgpDdWFuZG8gdW4gaW52ZXN0aWdhZG9yIGFicmUgdW5hIGJhc2UgZGUgZGF0b3MgZW4gY3VhbHF1aWVyIHByb2dyYW1hIGVzdGFkw61zdGljbywgZWwgc29mdHdhcmUgYXN1bWUgcXVlIGxvcyBkYXRvcyBwcm92aWVuZW4gZGUgdW4gbXVlc3RybyBzaW1wbGUgYWxlYXRvcmlvLgpDdWFuZG8gc2UgdHJhYmFqYSBjb24gZGF0b3MgZGUgb3BpbmnDs24gcMO6YmxpY2EsIGNvbW8gbG9zIGRhdG9zIGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMsIGVsIGRpc2XDsW8gbXVlc3RyYWwgZ2VuZXJhbG1lbnRlIG5vIGVzIHVuIG11ZXN0cmVvIHNpbXBsZSBhbGVhdG9yaW8sIHNpbm8gdW4gZGlzZcOxbyBjb21wbGVqbywgY29uIGVzdHJhdGlmaWNhY2lvbmVzLCBzZWdtZW50YWNpb25lcywgY3VvdGFzLCBlbiBkaWZlcmVudGVzIGV0YXBhcy4KQ29tbyBpbmRpY2EgZWwgcmVwb3J0ZSB0w6ljbmljbyBkZSBsYSByb25kYSAyMDE4LzE5IGRlbCBCYXLDs21ldHJvIGRlIGxhcyBBbcOpcmljYXMsIGRpc3BvbmlibGUgW2FxdcOtXShodHRwczovL3d3dy52YW5kZXJiaWx0LmVkdS9sYXBvcC9hYjIwMTgvQW1lcmljYXNCYXJvbWV0ZXJfMjAxOC0xOV9UZWNobmljYWxfUmVwb3J0X1dfMTAyOTE5LnBkZiksIGxhcyBtdWVzdHJhcyBlbiBjYWRhIHBhw61zIGZ1ZXJvbiBkaXNlw7FhZGFzIHVzYW5kbyB1biBkaXNlw7FvIHByb2JhYmlsw61zdGljbyBtdWx0aWV0YXBhIChjb24gY3VvdGFzIGFsIG5pdmVsIGRlIGhvZ2FyZXMgcGFyYSBsYSBtYXlvcsOtYSBkZSBwYcOtc2VzKSwgeSBmdWVyb24gZXN0cmF0aWZpY2FkYXMgcG9yIHJlZ2lvbmVzIHByaW5jaXBhbGVzIGVuIGVsIHBhw61zLCB0YW1hw7FvIGRlIGxhIG11bmljaXBhbGlkYWQgeSBwb3Igw6FyZWFzIHVyYmFuYXMgeSBydXJhbGVzIGRlbnRybyBkZSBsYXMgbXVuaWNpcGFsaWRhZGVzLgpFc3RlIGRpc2XDsW8gbXVlc3RyYWwgY29tcGxlam8gc2UgdGllbmUgcXVlIGluY29ycG9yYXIgZ2VuZXJhbG1lbnRlIGVuIGxvcyBjw6FsY3Vsb3MuCkVuIGNpZXJ0YXMgb2Nhc2lvbmVzLCBzaSBubyBzZSBpbmNvcnBvcmEsIHB1ZWRlIGxsZXZhciBhIGRpZmVyZW5jaWFzIGVuIGxvcyByZXN1bHRhZG9zLgpVbmEgZXhwbGljYWNpw7NuIG3DoXMgZGV0YWxsYWRhIHNvYnJlIGVsIHVzbyBkZSBsb3MgZmFjdG9yZXMgZGUgZXhwYW5zacOzbiB5IGxhcyBwb3RlbmNpYWxlcyBjb25zZWN1ZW5jaWFzIGRlIG5vIHVzYXJsb3MgY29uIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzIHB1ZWRlIHNlciBsZcOtZGEgZW4gbGEgTm90YSBNZXRvZG9sw7NnaWNhIDAwNyAoQ2FzdG9yZW5hLCAyMDIxKSwgZGlzcG9uaWJsZSBbYXF1w61dKGh0dHBzOi8vd3d3LnZhbmRlcmJpbHQuZWR1L2xhcG9wL2luc2lnaHRzL0lNTjAwN2VzLnBkZikuCkVzdGEgTm90YSBNZXRvZG9sw7NnaWNhIGRlc2NyaWJlIHRyZXMgZXNjZW5hcmlvcyBkZSB1c29zIGRlIGZhY3RvcmVzIGRlIGV4cGFuc2nDs246CgoxLiAgQWp1c3RlIHBvc3QgZXN0cmF0aWZpY2FjacOzbjogY3VhbmRvIGxhIG11ZXN0cmEgbm8gZXMgYXV0b3BvbmRlcmFkYSB5IHNlIGRlc3bDrWEgZGUgY2llcnRhcyBjYXJhY3RlcsOtc3RpY2FzIHNvY2lvZGVtb2dyw6FmaWNhcyBpbXBvcnRhbnRlcy4gRW4gbGEgYmFzZSBkZSBkYXRvcywgZXN0YSBjYXJhY3RlcsOtc3RpY2Egc2UgYWp1c3RhIGNvbiBsYSB2YXJpYWJsZSAiZXN0cmF0b3ByaSIuCjIuICBBanVzdGUgcG9yIHNvYnJlbXVlc3RyZW86IGN1YW5kbyBsYSBtdWVzdHJhIGluY2x1eWUgdW5hIHNvYnJlbXVlc3RyYSBkZSBzdWJwb2JsYWNpb25lcyBkZSBpbnRlcsOpcy4gRW4gbGEgYmFzZSBkZSBkYXRvcywgZXN0YSBjYXJhY3RlcsOtc3RpY2Egc2UgYWp1c3RhIGNvbiBsYSB2YXJpYWJsZSAid3QiLgozLiAgQWp1c3RlIGRlIG3Dumx0aXBsZXMgZW5jdWVzdGFzOiBjdWFuZG8gc2UgYW5hbGl6YSBkYXRvcyBkZSB2YXJpb3MgcGHDrXNlcyBvIGRpZmVyZW50ZXMgcm9uZGFzLiBMYSB2YXJpYWJsZSBwb25kZXJhZG9yYSBlbiBsYSBiYXNlIGRlIGRhdG9zIGVzICJ3ZWlnaHQxNTAwIiwgcXVlIGVzdGFuZGFyaXphIGxhcyBtdWVzdHJhcyBkZSBjYWRhIHBhw61zIGEgMSw1MDAgb2JzZXJ2YWNpb25lcy4KCiMgQ29uc2VjdWVuY2lhcyBkZSBubyB1c2FyIGZhY3RvcmVzIGRlIGV4cGFuc2nDs24KCkNvbW8gaW5kaWNhIGxhIE5vdGEgbWV0b2RvbMOzZ2ljYSwgImxvcyBhbsOhbGlzaXMgc2luIHBvbmRlcmFyIHB1ZWRlbiByZXN1bHRhciBlbiBlc3RpbWFjaW9uZXMgc2VzZ2FkYXMiIChwLjkpLgpQb3IgZWplbXBsbywgZW4gZWwgZG9jdW1lbnRvIHNvYnJlIG1hbmVqbyBkZSBkYXRvcyByZXBsaWNhbW9zIGxvcyByZXN1bHRhZG9zIHNvYnJlIGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiBIb25kdXJhcyAoNDUlKSB5IFVydWd1YXkgKDc2LjIlKSwgcGFyYSBsbyBxdWUgc2UgY2FsY3Vsw7MgbGEgdmFyaWFibGUgcmVjb2RpZmljYWRhIHkgc2UgZGVzY3JpYmnDsy4KCmBgYHtyIG1hbmlwdWxhY2lvbiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeShjYXIpCmxhcG9wMTgkaW5nNHJlYyA8LSBjYXI6OnJlY29kZShsYXBvcDE4JGluZzQsICIxOjQ9MDsgNTo3PTEiKQp0YWJsZShsYXBvcDE4JGluZzRyZWMpCmBgYAoKRW4gZXN0ZSBkYXRhZnJhbWUgc2UgcHVlZGUgY2FsY3VsYXIgbGEgZGlzdHJpYnVjacOzbiBkZWwgYXBveW8gYSBsYSBkZW1vY3JhY2lhIGVuIGVzdG9zIGRvcyBwYcOtc2VzIHkgc2UgcHVlZGUgcmVwb3J0YXIgbG9zIHBvcmNlbnRhamVzIHJlZG9uZGVhZG8uCgpgYGB7ciBIb25kdXJhcyB5IFVydWd1YXl9CnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09NF0pKSoxMDAsIDEpCnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09MTRdKSkqMTAwLCAxKQpgYGAKClNlIG9ic2VydmEgcXVlIGVzdG9zIHJlc3VsdGFkb3Mgc29uIGlndWFsZXMgYSBsb3MgcXVlIGFwYXJlY2VuIGVuIGVsIEdyw6FmaWNvIDEuMiBkZWwgcmVwb3J0ZSAiRWwgUHVsc28gZGUgbGEgRGVtb2NyYWNpYSIgKHAuMTIpLCBkaXNwb25pYmxlIFthcXXDrV0oaHR0cHM6Ly93d3cudmFuZGVyYmlsdC5lZHUvbGFwb3AvYWIyMDE4LzIwMTgtMTlfQW1lcmljYXNCYXJvbWV0ZXJfUmVnaW9uYWxfUmVwb3J0X1NwYW5pc2hfV18wMy4yNy4yMC5wZGYpLgpFc3RvIGVzIGVzcGVyYWJsZSBwb3JxdWUsIGNvbW8gaW5kaWNhIGxhIFRhYmxhIDUgZGUgbGEgTm90YSBNZXRvZG9sw7NnaWNhLCBhbWJvcyBwYcOtc2VzIHRpZW5lbiB1biBkaXNlw7FvIG11ZXN0cmFsIGF1dG9wb25kZXJhZG8sIHBvciBsbyBxdWUgZXN0b3MgY8OhbGN1bG9zLCBxdWUgbm8gaW5jbHV5ZW4gZWwgZGlzZcOxbywgY29pbmNpZGVuIGNvbiBsb3MgZGVsIHJlcG9ydGUsIHF1ZSBzw60gaW5jbHV5ZW4gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCgpVbiBjYXNvIGRpZmVyZW50ZSBlcyBlbCBkZSBCcmFzaWwgcXVlLCBzZWfDum4gbGEgTm90YSBNZXRvZG9sw7NnaWNhLCB0aWVuZSB1biBkaXNlw7FvIG11ZXN0cmFsIHBvbmRlcmFkbywgcG9yIGxvIHF1ZSBzw60gcmVxdWVyaXLDrWEgdXNhciBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBwYXJhIGFqdXN0YXIgbGEgc29icmVtdWVzdHJhIGVuIGVsIGRpc2XDsW8uClNpIHNlIGNhbGN1bGEgZWwgZGVzY3JpcHRpdm8gZGVsIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiBCcmFzaWwgc2luIGluY2x1aXIgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24gc2Ugb2J0aWVuZSB1biByZXN1bHRhZG8gZGlzdGludG8gYWwgZGVsIHJlcG9ydGUuCgpgYGB7ciBCcmFzaWx9CnJvdW5kKHByb3AudGFibGUodGFibGUobGFwb3AxOCRpbmc0cmVjW2xhcG9wMTgkcGFpcz09MTVdKSkqMTAwLCAxKQpgYGAKCkVuIGVzdGUgY8OhbGN1bG8gb2J0ZW5lbW9zIDU5LjglLCBtaWVudHJhcyBxdWUgZW4gZWwgR3LDoWZpY28gMS4yIGRlbCByZXBvcnRlIHNlIG9ic2VydmEgNjAuMCUuCkVzdGEgZGlmZXJlbmNpYSBlcyBkZWJpZGEgYSBxdWUgZWwgY29tYW5kbyBgdGFibGVgLCB5IGx1ZWdvIGBwcm9wLnRhYmxlYCwgbm8gaW5jbHV5ZW4gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uCgojIEluY2x1eWVuZG8gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24KCkFsZ3VuYXMgbGlicmFyw61hcyB5IGNvbWFuZG9zIGVuIFIgcGVybWl0ZW4gbGEgaW5jbHVzacOzbiBkZSB1bmEgdmFyaWFibGUgZGUgZXhwYW5zacOzbiBlbiBsb3MgY8OhbGN1bG9zLgpFbCBwYXF1ZXRlIGBkZXNjcmAsIHBvciBlamVtcGxvLCBpbmNsdXllIHZhcmlvcyBjb21hbmRvcywgY29tbyBgY29tcG1lYW5zYCBvIGBjcm9zc3RhYmAgcXVlIHBlcm1pdGVuIGVzdGEgaW5jbHVzacOzbiBkZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uClBhcmEgcmVwcm9kdWNpciBsb3MgZGF0b3MgcXVlIHNlIG9ic2VydmFuIGVuIGVsIEdyw6FmaWNvIDEuMiBkZWwgcmVwb3J0ZSwgc2UgcHVlZGUgdXNhciBlbCBjb21hbmRvIGBjb21wbWVhbnNgIHF1ZSBwZXJtaXRlIGNhbGN1bGFyIGxhIG1lZGlhIGRlIHVuYSB2YXJpYWJsZSAoY29tbyBpbmc0cmVjLCBjdXlhIG1lZGlhIGVzIGlndWFsIGEgbGEgcHJvcG9yY2nDs24pIHBvciBncnVwb3MgZGUgdW5hIHZhcmlhYmxlIGZhY3RvciwgY29tbyAicGFpcyIsIHBvbmRlcmFuZG8gbG9zIHJlc3VsdGFkb3MgcG9yIHVuYSB2YXJpYWJsZSwgY29tbyAid2VpZ2h0MTUwMCIuClNlIGFncmVnYSBsYSBlc3BlY2lmaWNhY2nDs24gYHBsb3Q9RkFMU0VgIHBhcmEgZGVzYWN0aXZhciBsYSBwcm9kdWNjacOzbiBkZWwgZ3LDoWZpY28uCgpgYGB7ciBhcG95byBhIGxhIGRlbW9jcmFjaWEgcG9uZGVyYWRvLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaWJyYXJ5KGRlc2NyKQpjb21wbWVhbnMobGFwb3AxOCRpbmc0cmVjLCBsYXBvcDE4JHBhaXMsIGxhcG9wMTgkd2VpZ2h0MTUwMCwgcGxvdD1GQUxTRSkKYGBgCgpEZSBhY3VlcmRvIGEgZXN0b3MgcmVzdWx0YWRvcywgdmVtb3MgcXVlIEJyYXNpbCAocGFpcz0xNSksIHRpZW5lIHVuIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBkZSAwLjU5OTk3NS4KU2kgdHJhbnNmb3JtYW1vcyBlc3RlIG7Dum1lcm8gZW4gcG9yY2VudGFqZSwgYXByb3hpbWFuZG8gYSAxIGRlY2ltYWwsIHJlcHJvZHVjaW1vcyBlbCB2YWxvciBkZSA2MCUgcXVlIHNlIG9ic2VydmEgZW4gZWwgR3LDoWZpY28gMS4yIGRlbCByZXBvcnRlLgpObyBzb2xvIGVzbywgYWRlbcOhcywgc2Ugb2JzZXJ2YSBxdWUgcGFyYSBlbCByZXN0byBkZSBwYcOtc2VzLCBsb3MgZGF0b3Mgc2UgcmVwbGljYW4uClBvciBlamVtcGxvLCBwYXJhIE3DqXhpY28gKHBhw61zPTEpLCBlc3RhIHRhYmxhIG11ZXN0cmEgdW4gYXBveW8gYSBsYSBkZW1vY3JhY2lhIGRlIDAuNjI3MjMwNywgbywgZW4gcG9yY2VudGFqZSBhcHJveGltYWRvIGEgMSBkZWNpbWFsLCA2Mi43JSwgaWd1YWwgYWwgZGF0byBkZWwgcmVwb3J0ZS4KCk90cmEgZm9ybWEgZGUgcmVwbGljYXIgbG9zIHJlc3VsdGFkb3MgaW5jb3Jwb3JhbmRvIGVsIGVmZWN0byBkZSBkaXNlw7FvIGVzIHVzYW5kbyBlbCBwYXF1ZXRlIGBzdXJ2ZXlgLCBwYXF1ZXRlIGVzcGVjaWFsbWVudGUgZGVzYXJyb2xsYWRvIHBhcmEgdHJhYmFqYXIgY29uIGRpc2XDsW9zIG11ZXN0cmFsZXMgY29tcGxlam9zLgpMYSBOb3RhIE1ldG9kb2zDs2dpY2EgaW5jbHV5ZSB1biBhcMOpbmRpY2UgY29uIGVsIGPDs2RpZ28gZGUgU1RBVEEgcGFyYSB1c2FyIGxvcyBmYWN0b3JlcyBkZSBleHBhbnNpw7NuIGVuIGxvcyBkYXRvcyBkZWwgQmFyw7NtZXRybyBkZSBsYXMgQW3DqXJpY2FzLgpBcXXDrSBoYXJlbW9zIGxvIG1pc21vIGVuIFIsIHBhcmEgbG8gY3VhbCB1c2FyZW1vcyBlbCBjb21hbmRvIGBzdnlkZXNpZ25gIChzaW1pbGFyIGFsIGNvbWFuZG8gc3Z5c2V0IGVuIFNUQVRBKS4KQ29uIGVzdGUgY29tYW5kbyBzZSBjcmVhIHVuIG51ZXZvIG9iamV0byBsbGFtYWRvICJkaXNlw7FvMTgiLCBxdWUgZ3VhcmRhIGxhIGluZm9ybWFjacOzbiBkZSBsYXMgdmFyaWFibGVzIGNvbnRlbmlkYXMgZW4gZWwgZGF0YWZyYW1lLCBpbmNsdXllbmRvIGVuIGxvcyBjw6FsY3Vsb3MgZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24uClBvciB0YW50bywgc2kgbHVlZ28gc2UgY3JlYXJhIHVuYSBudWV2YSB2YXJpYWJsZSwgc2UgdGVuZHLDrWEgcXVlIGNvcnJlciBudWV2YW1lbnRlIGVzdMOpIGNvbWFuZG8gcGFyYSBxdWUgZXN0ZSBvYmpldG8gImxhcG9wLmRlc2lnbiIgaW5jbHV5YSBlc3RhIG51ZXZhIHZhcmlhYmxlLgoKRXN0ZSBkaXNlw7FvIG5vIHNvbG8gZGVwZW5kZSBkZSBsYSB2YXJpYWJsZSBkZSBwb25kZXJhY2nDs24gIndlaWdodDE1MDAiLCBzaW5vIHRhbWJpw6luIGRlIGxhIHZhcmlhYmxlIHF1ZSBkZWZpbmUgZWwgZXN0cmF0byAiZXN0cmF0b3ByaSIgeSBkZSBsYSB2YXJpYWJsZSBxdWUgZGVmaW5lIGxhIHVuaWRhZCBwcmltYXJpYSBkZSBtdWVzdHJlbyAidXBtIi4KCmBgYHtyIGV4cGFuc2lvbiBjb24gc3VydmV5LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojaW5zdGFsbC5wYWNrYWdlcygic3VydmV5IikgUGFyYSBpbnN0YWxhciBlbCBwYXF1ZXRlIHNlIGRlYmUgdXNhciBlc3RlIGPDs2RpZ28KbGlicmFyeShzdXJ2ZXkpCmRpc2XDsW8xODwtc3Z5ZGVzaWduKGlkcyA9IH51cG0sIHN0cmF0YSA9IH5lc3RyYXRvcHJpLCB3ZWlnaHRzID0gfndlaWdodDE1MDAsIG5lc3Q9VFJVRSwgZGF0YT1sYXBvcDE4KQpgYGAKClVuYSB2ZXogY3JlYWRvIGxvcyBkYXRvcyBjb24gZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24gZW4gZWwgb2JqZXRvICJsYXBvcC5kZXNpZ24iLCBzZSBwdWVkZSB1c2FyIGxvcyBjb21hbmRvcyBuYXRpdm9zIGRlbCBwYXF1ZXRlIGBzdXJ2ZXlgIHBhcmEgcmVhbGl6YXIgY8OhbGN1bG9zLgpQb3IgZWplbXBsbywgcGFyYSBjYWxjdWxhciBsYSBtZWRpYSBkZSBsYSB2YXJpYWJsZSAiaW5nNHJlYyIgKGFwb3lvIGEgbGEgZGVtb2NyYWNpYSkgZW4gdG9kYSBsYSBiYXNlIGRlIGRhdG9zIGRlIGxhIHJvbmRhIDIwMTgvMTksIHNlIHB1ZWRlIHVzYXIgZWwgY29tYW5kbyBgc3Z5bWVhbmAuCgpgYGB7ciBtZWRpYSBjb24gc3VydmV5fQpzdnltZWFuKH5pbmc0cmVjLCBkaXNlw7FvMTgsIG5hLnJtPVQpCmBgYAoKRGUgZXN0YSBtYW5lcmEgc2UgcmVwcm9kdWNlIGVsIHZhbG9yIGRlIGxhIMO6bHRpbWEgZmlsYSBkZSByZXN1bHRhZG9zIGRlbCBjb21hbmRvIGBjb21wbWVhbnNgLCBxdWUgY29ycmVzcG9uZGUgYWwgcHJvbWVkaW8gZGUgdG9kYSBsYSBtdWVzdHJhLgpFcyBkZWNpciwgZGUgYW1iYXMgbWFuZXJhcyBzZSBlc3TDoSBlbmNvbnRyYW5kbyBlbCBtaXNtbyByZXN1bHRhZG8uClBhcmEgcmVwcm9kdWNpciBsb3MgcmVzdWx0YWRvcyBwb3IgcGHDrXMsIHNlIHB1ZWRlIHVzYXIgZWwgY29tYW5kbyBgc3Z5YnlgIHF1ZSBwZXJtaXRlIGhhbGxhciByZXN1bHRhZG9zIChjb21vIGxhIG1lZGlhLCB1c2FuZG8gYHN2eW1lYW5gKSBkZSB1bmEgdmFyaWFibGUgKCJpbmc0cmVjIiksIHBvciB2YWxvcmVzIGRlIG90cmEgdmFyaWFibGUgKCJwYWlzIikuCgpgYGB7ciBtZWRpYSBwb3IgcGFpcyBjb24gc3VydmV5fQpzdnlieSh+aW5nNHJlYywgfnBhaXMsIGRlc2lnbj1kaXNlw7FvMTgsIHN2eW1lYW4sIG5hLnJtPVQpCmBgYAoKRW4gZXN0ZSBjYXNvLCB2ZW1vcyBxdWUgZXN0YSB0YWJsYSBlcyBleGFjdGFtZW50ZSBpZ3VhbCBhIGxhIHJlcG9ydGFkYSBjb24gYGNvbXBtZWFuc2AsIHB1ZXMgYW1iYXMgdXNhbiBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbi4KCkRlIGxhIG1pc21hIG1hbmVyYSwgbG9zIHJlc3VsdGFkb3MgZGVsIGdyw6FmaWNvIDEuMSBkZWwgcmVwb3J0ZSBFbCBQdWxzbyBkZSBsYSBEZW1vY3JhY2lhIGRlIGxhIHJvbmRhIDIwMjEgbm8gc29uIGlndWFsZXMgYSBsb3MgcXVlIHNlIG9idHV2aWVyb24gZW4gZWwgbcOzZHVsbyBhbnRlcmlvci4KUG9yIGVqZW1wbG8sIGxvcyBkYXRvcyBkZSBhcG95byBhIGxhIGRlbW9jcmFjaWEgcG9yIHBhw61zIHNpbiB1c2FyIGVsIGZhY3RvciBkZSBleHBhbnNpw7NuIG5vcyBpbmRpY2EgcXVlIGVuIE3DqXhpY28gc2UgdGllbmUgNjUuMiUgZGUgZW5jdWVzdGFkb3MgcXVlIGFwb3lhbiBhIGxhIGRlbW9jcmFjaWEsIG1pZW50cmFzIHF1ZSBlbCBncsOhZmljbyBkZWwgcmVwb3J0ZSBzZSBpbmRpY2EgdW4gNjMlLgpVcnVndWF5IG11ZXN0cmEgdW4gODAlIGRlIGFwb3lvIGEgbGEgZGVtb2NyYWNpYSBlbiBlbCByZXBvcnRlLCBtaWVudHJhcyBxdWUgbG9zIHJlc3VsdGFkb3Mgc2luIHBvbmRlcmFyIGluZGljYW4gODQuNSUuCgpQYXJhIHJlcGxpY2FyIGxvcyByZXN1bHRhZG9zIGRlbCBncsOhZmljbyAxLjEgc2Ugc2lndWUgdW4gcHJvY2VkaW1pZW50byBzaW1pbGFyIGFsIHF1ZSBzZSBtb3N0csOzIGVuIGxhIHJvbmRhIDIwMTgvMTkuClByaW1lcm8gcmVjb2RpZmljYW1vcyBsYSB2YXJpYWJsZSB5IHVzYW1vcyBlbCBjb21hbmRvIGBjb21wbWVhbnNgLgoKYGBge3IgbWVkaWEgYXBveW8gMjF9CmxhcG9wMjEkaW5nNHJlYyA8LSBjYXI6OnJlY29kZShsYXBvcDIxJGluZzQsICIxOjQ9MDsgNTo3PTEiKQpjb21wbWVhbnMobGFwb3AyMSRpbmc0cmVjLCBsYXBvcDIxJHBhaXMsIGxhcG9wMjEkd2VpZ2h0MTUwMCwgcGxvdD1GQUxTRSkKYGBgCgpUYW1iacOpbiBzZSBwdWVkZSBjcmVhciB1biBudWV2byBvYmpldG8gbGxhbWFkbyAiZGlzZcOxbzIxIiwgcXVlIGd1YXJkYSBsYSBpbmZvcm1hY2nDs24gZGUgbGFzIHZhcmlhYmxlcyBjb250ZW5pZGFzIGVuIGVsIGRhdGFmcmFtZSwgaW5jbHV5ZW5kbyBlbiBsb3MgY8OhbGN1bG9zIGVsIGZhY3RvciBkZSBleHBhbnNpw7NuLgpFbCBjb21hbmRvIGBzdnlkZXNpZ25gIG5vIGFjZXB0YSBxdWUgbGFzIHZhcmlhYmxlcyBxdWUgZGVmaW5lbiBlbCBkaXNlw7FvIHRlbmdhbiB2YWxvcmVzIHBlcmRpZG9zICJOQSIuCkxhIGJhc2UgZGUgZGF0b3MgZGUgbGEgcm9uZGEgMjAyMSB0aWVuZSAxMCBOQXMgZW4gbGEgdmFyaWFibGUgIndlaWdodDE1MDAiIHkgMTQyNiBOQXMgZW4gbGEgdmFyaWFibGUgImVzdHJhdG9wcmkiLgpQYXJhIHBvZGVyIGNyZWFyIGVsIG9iamV0byBkZSBkaXNlw7FvIHF1ZSBndWFyZGUgbGFzIHZhcmlhYmxlcywgc2UgdGllbmUgcXVlIGVsaW1pbmFyIGVzdGFzIG9ic2VydmFjaW9uZXMgY29uIGxvcyB2YWxvcmVzIHBlcmRpZG9zLgpMYSBiYXNlIGRlIGRhdG9zIGNvbiBlc3RhcyBvYnNlcnZhY2lvbmVzIGVsaW1pbmFkYXMgc2UgZ3VhcmRhIGVuIHVuIG51ZXZvIGRhdGFmcmFtZSAibGFwb3AyMWEiLgpFcyBlc3RhIGJhc2UgZGUgZGF0b3MgbGEgcXVlIHNlIHVzYSBjb24gZWwgY29tYW5kbyBgc3Z5ZGVzaWduYC4KCmBgYHtyIHN1cnZleSAyMX0KbGFwb3AyMWEgPSBzdWJzZXQobGFwb3AyMSwgIWlzLm5hKGVzdHJhdG9wcmkpKQpsYXBvcDIxYSA9IHN1YnNldChsYXBvcDIxYSwgIWlzLm5hKHdlaWdodDE1MDApKQpkaXNlw7FvMjE8LXN2eWRlc2lnbihpZHMgPSB+dXBtLCBzdHJhdGEgPSB+ZXN0cmF0b3ByaSwgd2VpZ2h0cyA9IH53ZWlnaHQxNTAwLCBuZXN0PVRSVUUsIGRhdGE9bGFwb3AyMWEpCmBgYAoKYGBge3Igc3Z5YnkgMjF9CnN2eWJ5KH5pbmc0cmVjLCB+cGFpcywgZGVzaWduPWRpc2XDsW8yMSwgc3Z5bWVhbiwgbmEucm09VCkKYGBgCgpEZSBlc3RhIG1hbmVyYSwgaGVtb3MgdmlzdG8gZG9zIG1hbmVyYXMgZGUgaW5jb3Jwb3JhciBlbCBlZmVjdG8gZGUgZGlzZcOxbyBtdWVzdHJhbCBlbiBsb3MgY8OhbGN1bG9zIGLDoXNpY29zIGNvbiBsb3MgZGF0b3MgZGVsIEJhcsOzbWV0cm8gZGUgbGFzIEFtw6lyaWNhcy4KTcOhcyBhZGVsYW50ZSwgc2UgdmVyw6EgbGEgaW5jbHVzacOzbiBkZWwgZmFjdG9yIGRlIGV4cGFuc2nDs24gZW4gb3Ryb3MgY8OhbGN1bG9zIG3DoXMgY29tcGxlam9zLCBjb21vIGVsIGPDoWxjdWxvIGRlIGludGVydmFsb3MgZGUgY29uZmlhbnphIG8gZGUgcmVncmVzaW9uZXMuCkVuIGVzdG9zIGRvY3VtZW50b3Mgc2UgdHJhYmFqYXLDoSBsYSB2ZXJzacOzbiBzaW1wbGUsIHNpbiBpbmNsdWlyIGVzdG9zIGVmZWN0b3MgeSBjb24gbG9zIGNvbWFuZG9zIG3DoXMgYsOhc2ljb3MgZGUgUiwgeSBsdWVnbyBsYSB2ZXJzacOzbiBjb21wbGVqYSwgaW5jbHV5ZW5kbyBlbCBmYWN0b3IgZGUgZXhwYW5zacOzbiBlbiBsb3MgY8OhbGN1bG9zLgo=