Presentación

En este informe se presentan una serie de indicadores sociales, desagregados por sexo, calculados con bases públicas de la EPH (Encuesta Permanente de Hogares - INDEC - Argentina). El objetivo de esta presentación es visibilizar la desigualdad de género en la composición del mercado de trabajo, la percepción de ingresos, entre otras cuestiones, en un formato amigable.
Quienes estén interesados en reproducir los cálculos necesarios para obtener la información que aquí se presenta, pueden descargar la sintaxis en lenguaje R.2
Todos los datos refieren a los 31 aglomerados urbanos relevados en la EPH y en esta ocasión corresponden al 1er trimestre 2018.


Composición del Mercado de Trabajo

Inserción laboral

En primer lugar se presentan algunos indicadores clásicos (utilizados a nivel internacional) que caracterizan la composición del mercado de trabajo, desagregados según el sexo.
La tasa de Actividad es la relación entre aquellos que participan en el mercado de trabajo (ya sea como ocupados o como desocupados) y la población total. En este caso, dicha tasa es ampliamente mayor entre los varones (la diferencia supera los 20 puntos porcentuales). Esto sucede porque existe una importante porción de las mujeres en edad laboral que dedican su tiempo a realizar tareas domésticas, hacia el interior de sus hogares, en lugar de tener una actividad en el mercado de trabajo.
La tasa de Empleo exhibe la proporción de ocupados entre la población total. La diferencia entre varones y mujeres en este caso también supera los 20 puntos, denotando el mismo fenómeno anteriormente mencionado.
A diferencia de las tasas anteriores, las tasas de desocupación y subocupación expresan la proporción que estos grupos representan en la Población Económicamente Activa. En este caso, ambas tasas son mayores para las mujeres que para los varones. Esto expresa que, incluso siendo minoría en el mercado de trabajo, las mujeres tienen más dificultades para conseguir trabajo y/o para trabajar una jornada completa.
En su conjunto, estos cuatro indicadores nos presentan una primera imagen de la masculinización del mercado de trabajo argentino.

Gráfico 1. Población de 14 años y más. Tasas de Actividad y de Empleo por sexo. Total de aglomerados urbanos. 1er trimestre 2018.

Gráfico 2. Población de 14 años y más. Tasas de Desocupación y de Subocupación por sexo. Total de aglomerados urbanos. 1er trimestre 2018.


Por grupos de edad y sexo

Asimismo se exponen las mismas tasas, pero desagregadas por grupos de edad además de por sexo. En este caso, llama la atención que son las mujeres más jóvenes las que presentan menores tasas de Actividad y Empleo, en simultáneo con las mayores tasas de Desocupación y Subocupación.
Para dar un ejemplo, un 20,9% de las mujeres de 14 a 29 años está desocupada, es decir que, no teniendo ocupación, están buscando activamente un trabajo y no lo consiguen.

Cuadro 1. Población de 14 a 64 años. Principales Tasas del Mercado de Trabajo, por grupos de edad y sexo. En porcentajes. Total de aglomerados urbanos. 1er trimestre 2018.

de 14 a 29 años
de 30 a 64 años
Indicadores Mujeres Varones Mujeres Varones
Tasa Actividad 41,3 56,0 66,2 91,4
Tasa Empleo 32,7 47,5 61,6 86,6
Tasa Desocupación 20,9 15,3 6,9 5,2
Tasa Subocupación 13,2 11,7 11,0 7,5


Empleo no registrado

A su vez, las ocupadas asalariadas están expuestas a una tasa de empleo no registrado mayor que la de sus compañeros varones. Hay un 36,4% de las asalariadas a quienes sus empleadores no inscriben en la seguridad social, mientras que para los asalariados varones esta tasa de no registro es del 31,9%.

Cuadro 2. Ocupadas/os asalariadas/os. Tasas de empleo no registrado por sexo. Total de aglomerados urbanos. 1er trimestre 2018.

Sexo Proporción de no Registrados
Mujeres 36,4
Varones 31,9


Acceso a Cargos jerárquicos

Además de tener una participación más restringida en el mercado de trabajo, las ocupadas encuentran más obstáculos para acceder a cargos jerárquicos: mientras que un 8,1% de los ocupados varones tienen cargos de dirección o son jefes, un 4,7% de las ocupadas ejercen puestos de esas características. Al mismo tiempo, las ocupadas se encuentran más concentradas en los puestos asalariados, es decir, en relación de dependencia.

Gráfico 3. Ocupadas/os. Mujeres y Varones según Jerarquía de la ocupación, en porcentaje (escalas libres). Total de aglomerados urbanos. 1er trimestre 2018.


Brechas de ingresos mensuales

A continuación se hace foco en las diferencias de montos de ingresos que perciben los varones y las mujeres. Estos ingresos pueden provenir de diversas fuentes y al mismo tiempo pueden desagregarse según características adicionales de las personas o los puestos que desempeñan. Incluso pueden distinguirse los ingresos mensuales y los ingresos horarios.
Para dimensionar estas diferencias hacemos uso del concepto de “brecha”, que en este caso se calcula como la diferencia entre los ingresos promedios de los varones y las mujeres, expresada en términos del ingreso más alto. Es decir, que puede leerse como “las mujeres perciben ingresos que, en promedio, son un …% menores que los de los varones”.


Brecha de ingresos totales mensuales

Observando los ingresos totales individuales de toda la población, se observa que la brecha entre varones y mujeres en este caso es de 28,2 puntos porcentuales. Es decir, contemplando todos los ingresos que se perciben, sean de origen laboral o no laboral (como jubilaciones y pensiones, cuotas alimentarias, subsidios, etc.), las mujeres perciben ingresos que, en promedio, son un 28,2% menores que los de los varones.

Cuadro 3. Población perceptora de ingresos. Media de ingresos totales individuales y brecha de ingresos (en porcentaje) por sexo. Total de aglomerados urbanos. 1er trimestre 2018.

Media de ingresos de las Mujeres Media de ingresos de los Varones Brecha del Ingreso Total Individual
$14.096,40 $19.631,00 28,2


Brecha de ingresos mensuales de las/os ocupadas/os

Simultáneamente, en el mercado de trabajo, las mujeres ganan en promedio un 25,4% menos que los varones ($12.824,70 vs. $17.195,60 ). Estos datos corresponden a la totalidad de ocupadas/os, cualquiera sea su categoría ocupacional, calificación o jerarquía, y observando en este caso los ingresos provenientes de la ocupación principal.

Cuadro 4. Ocupadas/os. Media de ingresos de la ocupación principal y brecha de ingresos (en porcentaje) por sexo. Total de aglomerados urbanos. 1er trimestre 2018.

Media de ingresos de las Mujeres Media de ingresos de los Varones Brecha de ingresos de la ocupación principal
$12.824,70 $17.195,60 25,4


Brecha de ingresos mensuales entre asalariadas/os no registrados

Anteriormente se observó que las asalariadas están expuestas a una tasa de no registro más alta que la que presentan los asalariados varones. Pero además, las asalariadas de este sector, el no registrado, ganan en promedio un 34,0% menos que sus pares. Es decir que la brecha de ingresos de las/os ocupadas/os se amplía cuando vemos a aquellas/os asalariadas/os que tienen peores condiciones de trabajo.

Cuadro 5. Ocupadas/os Asalariadas/os no registrados. Media de ingresos de la ocupación principal y brecha de ingresos (en porcentaje) por sexo. Total de aglomerados urbanos. 1er trimestre 2018.

Media de ingresos de las Mujeres Media de ingresos de los Varones Brecha de ingresos de la ocupación principal
$6.535,20 $9.897,80 34,0


Brecha de ingresos mensuales por calificación del puesto de trabajo

La brecha de ingresos mensuales de las/os ocupadas/os se mantiene incluso a iguales niveles de calificación del puesto de trabajo. Por ejemplo, mientras que los varones que trabajan en ocupaciones profesionales tienen un ingreso medio de $34.375, las mujeres ocupadas en ese mismo segmento perciben un ingreso medio de $26.672, es decir, un 22,4% menos que los varones.
En los puestos no calificados, los varones ganan $10.465 en promedio, al tiempo que las mujeres ganan alrededor de $6.819. Esta brecha es del 34,8%.

Gráfico 4. Ocupadas/os. Brecha de ingresos mensuales de la ocupación principal, por sexo y calificación ocupacional. Total de aglomerados urbanos. 1er trimestre 2018.


Brecha de ingresos mensuales por nivel educativo

Las mujeres ocupadas están en promedio más formadas que los varones que participan en el mercado de trabajo (hay una mayor proporción de mujeres con niveles educativos más altos). Sin embargo, a igual nivel educativo, los ingresos laborales de las mujeres trabajadoras son inferiores a los de los varones. Esta diferencia de ingresos es del 25,8% para las de nivel universitario/superior, y del 47,4% para las que cuentan con nivel primario.

Cuadro 6. Ocupadas/os. Mujeres y Varones según nivel educativo (Porcentaje por columnas). Total de aglomerados urbanos. 1er trimestre 2018.

Nivel Educativo % de Mujeres % de Varones
Sin Instrucción 0,3 0,4
Primaria 24,0 37,4
Secundaria 44,2 43,6
Superior 31,4 18,6

Gráfico 5. Ocupadas/os. Brecha de ingresos mensuales de la ocupación principal, por sexo y nivel educativo. Total de aglomerados urbanos. 1er trimestre 2018.


Brechas de ingresos horarios

Brecha de ingresos horarios por calificación del puesto de trabajo

Si en lugar de comparar ingresos mensuales tomamos el ingreso por hora de las personas, la historia es un poco diferente. Al recalcular el gráfico 4 (por calificación del puesto de trabajo) la brecha, excepto para profesionales, prácticamente se anula.

Gráfico 6. Ocupadas/os. Brecha de ingresos horarios de la ocupación principal, por sexo y calificación ocupacional. Total de aglomerados urbanos. 1er trimestre 2018.


Brecha de ingresos horarios por nivel educativo

Si esos mismos ingresos horarios de las/os ocupadas/os se comparan según su nivel educativo, la brecha se mantiene, aunque a niveles más bajos, para la mayoría de los niveles. Sin embargo, cabe señalar que en el informe correspondiente al 4to trimestre 2017, este mismo indicador presentaba brechas menores en valor absoluto. Esto puede deberse a cierta volatilidad en las horas de trabajo captadas en la encuesta.

Gráfico 7. Ocupadas/os. Brecha de ingresos horarios de la ocupación principal, por sexo y nivel educativo. Total de aglomerados urbanos. 1er trimestre 2018.

Al incorporar la extensión de las jornadas laborales al análisis, la magnitud de la brecha disminuye notablemente. De aquí se desprende que, en promedio, las mujeres trabajan menos horas que los varones, y esto explica una parte importante de la brecha de ingresos mensuales. Cabe cuestionarse respecto al porqué de la diferencia de horas trabajadas por mujeres y por hombres. ¿Existe una falta de voluntad de las mujeres para trabajar? ¿son más holgazanas? ¿o en realidad existe otro motivo por el cual las mujeres deben relegar sus trabajos, del cual los hombres están exentos?


Distribución de las tareas del hogar

Generalmente, las mujeres deben además dedicar su tiempo al trabajo doméstico. Es decir, realizan tareas de cuidado y reproducción para otros miembros de su hogar. Este trabajo no se comercia en el mercado y por tanto no es remunerado. A modo ilustrativo, se señala que: del total de personas que realizan las tareas de la casa, un 74% son mujeres y un 26% son varones. Este reparto desigual de las tareas domésticas entre varones y mujeres puede asociarse a las desigualdades vistas en la composición del mercado de trabajo y la diferencia de la extensión de la jornada laboral.

Gráfico 8. Personas que realizan las tareas domésticas del hogar, según sexo (no incluye trabajadoras de servicio doméstico). Total de aglomerados urbanos. 1er trimestre 2018.

A esto se suma el hecho de que prácticamente todas las personas que se dedican al servicio doméstico (es decir, que sí venden este trabajo en el mercado) son mujeres, un 98,4%. Asimismo, del total de mujeres ocupadas, un 16% se dedica a esta ocupación, conformando entonces una salida laboral popular.

Gráfico 9. Ocupadas, según si prestan o no servicios domésticos en hogares particulares. Total de aglomerados urbanos. 1er trimestre 2018.


Distribución del ingreso

Por último, podemos ver el efecto de estas diferencias en la distribución de los ingresos. En primer lugar, se separa a la población en deciles según el ingreso total individual. Es decir, se forman diez grupos de igual tamaño, ordenados según el nivel de ingresos que percibe cada individuo. Puede verse que los deciles más bajos de ingresos están compuestos mayoritariamente por mujeres y, en paralelo, los deciles de mayores ingresos se componen mayoritariamente por varones. Los estratos de menores ingresos están entonces feminizados, al tiempo que los estratos de mayores ingresos se encuentran masculinizados.

Gráfico 10. Población perceptora de ingresos. Composición según sexo de los deciles de ingresos totales individuales. Total de aglomerados urbanos. 1er trimestre 2018.

En segundo lugar se ordena por deciles a los hogares (no a los individuos), de acuerdo al ingreso per cápita familiar. Este es el ingreso total del hogar, dividido por la cantidad de personas que lo componen. En el gráfico 11 se puede observar la proporción de mujeres y de varones que componen cada decil.
En este caso, no hay diferencias destacables más allá de una leve preponderancia de las mujeres en todos los deciles, explicable por cuestiones demográficas (hay más mujeres que varones en la población general). ¿Cuál es la diferencia respecto del gráfico anterior?
Los ingresos que en aquel gráfico se distinguían según el sexo de quién los percibía, en este último gráfico se encuentran distribuídos entre todos los miembros del hogar. De esta forma, la composición por sexo de los estratos de menores ingresos no tiene mayores diferencias respecto a la de los estratos de mayores ingresos. La unidad familiar parece resolver la diferencia entre sexos que se veía en el gráfico anterior, pero es dentro de ésta que se mantiene la diferencia: de acuerdo a todo lo visto anteriormente, los varones tienen más probabilidades de ganar más que las mujeres del hogar. La distribución de los ingresos de las mujeres, sesgada hacia los menores ingresos, se compensa en la estructura familiar con la distribución de los ingresos de los varones, sesgada hacia los mayores ingresos. Entonces, la unidad familiar esconde y resuelve debajo de la superficie (la distribución aparentemente equitativa según los ingresos per cápita) la inequitativa distribución de las tareas de reproducción y las dificultades asociadas que tienen las mujeres para participar de forma plena en el mercado de trabajo.

Gráfico 11. Total de la población. Composición según sexo de los deciles del ingreso per cápita familiar. Total de aglomerados urbanos. 1er trimestre 2018.


  1. Casi Economista (FCE-UBA). Me dedico al análisis de datos y la realización de estudios metodológicos en el área de Pobreza e Ingresos de la Dirección de la Encuesta Permanente de Hogares (EPH-INDEC), aunque este informe lo realizo a título personal. También formo parte de Economía Femini(s)ta y RLadies Buenos Aires. Contacto: natsumi.shokida@gmail.com

  2. Presionando en Code > Download Rmd se accede a la descarga de la sintaxis completa de este informe, que incluye la descarga automática de las bases de la EPH utilizadas, una serie de funciones útiles y la elaboración de cuadros y gráficos con el lenguaje R.

LS0tCnRpdGxlOiAiTGEgZGVzaWd1YWxkYWQgZGUgZ8OpbmVybyBzZSBwdWVkZSBtZWRpciIKc3VidGl0bGU6ICJEYXRvcyBkZSBsYSBFbmN1ZXN0YSBQZXJtYW5lbnRlIGRlIEhvZ2FyZXMuIDFlciB0cmltZXN0cmUgZGUgMjAxOC4iCmF1dGhvcjogIk5hdHN1bWkgUy4gU2hva2lkYSAoQE5hdHN1U2gpXlsgX0Nhc2kgRWNvbm9taXN0YSAoRkNFLVVCQSkuIE1lIGRlZGljbyBhbCBhbsOhbGlzaXMgZGUgZGF0b3MgeSBsYSByZWFsaXphY2nDs24gZGUgZXN0dWRpb3MgbWV0b2RvbMOzZ2ljb3MgZW4gZWwgw6FyZWEgZGUgUG9icmV6YSBlIEluZ3Jlc29zIGRlIGxhIERpcmVjY2nDs24gZGUgbGEgRW5jdWVzdGEgUGVybWFuZW50ZSBkZSBIb2dhcmVzIChFUEgtSU5ERUMpLCBhdW5xdWUgZXN0ZSBpbmZvcm1lIGxvIHJlYWxpem8gYSB0w610dWxvIHBlcnNvbmFsLiBUYW1iacOpbiBmb3JtbyBwYXJ0ZSBkZV8gW0Vjb25vbcOtYSBGZW1pbmkocyl0YV0oaHR0cDovL2Vjb25vbWlhZmVtaW5pdGEuY29tLykgX3lfIFtSTGFkaWVzIEJ1ZW5vcyBBaXJlc10oaHR0cHM6Ly93d3cubWVldHVwLmNvbS9lcy9ybGFkaWVzLWJ1ZW5vcy1haXJlcy8pLiBfQ29udGFjdG9fOiBuYXRzdW1pLnNob2tpZGFAZ21haWwuY29tXSIKZGF0ZTogIlNlcHRpZW1icmUgZGUgMjAxOCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIGRlcHRoOiA0Ci0tLQogICAgCjxicj4KICAgICAKIyMgUHJlc2VudGFjacOzbgoKYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgU2UgbGltcGlhIGxhIG1lbW9yaWEgeSBzZSBjYXJnYW4gbGlicmVyw61hcyDDunRpbGVzCm9wdGlvbnMocnB1YnMudXBsb2FkLm1ldGhvZCA9ICJpbnRlcm5hbCIpCnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShodHRyKQpsaWJyYXJ5KHN0cmluZ3IpCmxpYnJhcnkoeGxzeCkKbGlicmFyeShoYXZlbikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZ2d0aGVtZXMpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdnYWx0KQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoZm9ybWF0dGFibGUpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZGF0ZSA8LSAiMWVyIHRyaW1lc3RyZSAyMDE4IgpgYGAKCkVuIGVzdGUgaW5mb3JtZSBzZSBwcmVzZW50YW4gdW5hIHNlcmllIGRlIGluZGljYWRvcmVzIHNvY2lhbGVzLCBkZXNhZ3JlZ2Fkb3MgcG9yIHNleG8sIGNhbGN1bGFkb3MgY29uIGJhc2VzIHDDumJsaWNhcyBkZSBsYSBFUEggKEVuY3Vlc3RhIFBlcm1hbmVudGUgZGUgSG9nYXJlcyAtIElOREVDIC0gQXJnZW50aW5hKS4gRWwgb2JqZXRpdm8gZGUgZXN0YSBwcmVzZW50YWNpw7NuIGVzIHZpc2liaWxpemFyIGxhIGRlc2lndWFsZGFkIGRlIGfDqW5lcm8gZW4gbGEgY29tcG9zaWNpw7NuIGRlbCBtZXJjYWRvIGRlIHRyYWJham8sIGxhIHBlcmNlcGNpw7NuIGRlIGluZ3Jlc29zLCBlbnRyZSBvdHJhcyBjdWVzdGlvbmVzLCBlbiB1biBmb3JtYXRvIGFtaWdhYmxlLiAgICAgICAgClF1aWVuZXMgZXN0w6luIGludGVyZXNhZG9zIGVuIHJlcHJvZHVjaXIgbG9zIGPDoWxjdWxvcyBuZWNlc2FyaW9zIHBhcmEgb2J0ZW5lciBsYSBpbmZvcm1hY2nDs24gcXVlIGFxdcOtIHNlIHByZXNlbnRhLCBwdWVkZW4gZGVzY2FyZ2FyIGxhIHNpbnRheGlzIGVuIGxlbmd1YWplIFIuW14xXSAgICAgICAgICAgClRvZG9zIGxvcyBkYXRvcyByZWZpZXJlbiBhIGxvcyAzMSBhZ2xvbWVyYWRvcyB1cmJhbm9zIHJlbGV2YWRvcyBlbiBsYSBFUEggeSBlbiBlc3RhIG9jYXNpw7NuIGNvcnJlc3BvbmRlbiBhbCBgciBkYXRlYC4gCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBGdW5jaW9uZXMgw7p0aWxlcwoKIyBGdW5jacOzbiBxdWUgZGVzY2FyZ2EgYmFzZXMgZGUgbGEgcMOhZ2luYSBkZSBpbmRlYywgc2Vnw7puIGVsIG5vbWJyZSBxdWUgbGUgcHVzaWVyb24gYWwgYXJjaGl2byBjb21wcmltaWRvIChwYXLDoW1ldHJvICJiYXNlIikuCmRlc2NhcmdhX3VsdGltYV9iYXNlIDwtIGZ1bmN0aW9uKGJhc2UgPSAnRVBIX3VzdV8yX1RyaW1fMjAxN190eHQuemlwJywgaW5kaXZpZHVhbCA9IEZBTFNFLCBob2dhciA9IEZBTFNFKXsKICAKICBsaW5rID0gcGFzdGUwKCdodHRwczovL3d3dy5pbmRlYy5nb2IuYXIvZnRwL2N1YWRyb3MvbWVudXN1cGVyaW9yL2VwaC8nLCBiYXNlKQogIHRlbXAgPC0gdGVtcGZpbGUoKQogIGRvd25sb2FkLmZpbGUobGluayx0ZW1wKQogIG5vbWJyZXMgPC0gYXNfdmVjdG9yKHVuemlwKHRlbXAsIGxpc3QgPSBUUlVFKVsnTmFtZSddKQogIGJhc2VfaG9nYXJfbmFtZSA8LSBub21icmVzW3N0cl9kZXRlY3Qobm9tYnJlcyxyZWdleCgnaG9nJywgaWdub3JlX2Nhc2UgPSBUKSldCiAgYmFzZV9pbmRpdmlkdWFsX25hbWUgPC0gbm9tYnJlc1tzdHJfZGV0ZWN0KG5vbWJyZXMsIHJlZ2V4KCdpbmQnLCBpZ25vcmVfY2FzZSA9IFQpKV0KICAKICBpZiAoaW5kaXZpZHVhbCkgewogICAgYmFzZV9pbmRpdmlkdWFsIDw8LSByZWFkLnRhYmxlKHVueih0ZW1wLGJhc2VfaW5kaXZpZHVhbF9uYW1lKSwgc2VwPSI7IiwgZGVjPSIsIiwgaGVhZGVyID0gVFJVRSwgZmlsbCA9IFRSVUUpCiAgfQogIAogIGlmIChob2dhcikgewogICAgYmFzZV9ob2dhciA8PC0gcmVhZC50YWJsZSh1bnoodGVtcCxiYXNlX2hvZ2FyX25hbWUpLCBzZXA9IjsiLCBkZWM9IiwiLCBoZWFkZXIgPSBUUlVFLCBmaWxsID0gVFJVRSkgCiAgfQogIAogIHVubGluayh0ZW1wKQp9CgojIEZ1bmNpb24gZGUgcmVkb25kZW8gcGFyYSBwcmVzZW50YWNpw7NuIChxdWVkYSBjb21vIGNoYXJhY3RlcikKZm9ybWF0b19wb3JjIDwtIGZ1bmN0aW9uKG51bWVybywgZGVjID0gMSl7CiAgZm9ybWF0KHJvdW5kKG51bWVybywgZGlnaXRzID0gZGVjKSwgbnNtYWxsID0gZGVjLCBkZWNpbWFsLm1hcmsgPSAiLCIpCn0KCmZvcm1hdG9fcGVzb3MgPC0gZnVuY3Rpb24obnVtZXJvLCBkZWMgPSAyKXsKICBwYXN0ZTAoIiQiLCBmb3JtYXQocm91bmQobnVtZXJvLCBkaWdpdHMgPSBkZWMpLCBuc21hbGwgPSBkZWMsIGJpZy5tYXJrID0gIi4iLCBkZWNpbWFsLm1hcmsgPSAiLCIpKQp9Cgpmb3JtYXRvX2NhbnRpZGFkIDwtIGZ1bmN0aW9uKG51bWVybywgZGVjID0gMCl7CiAgZm9ybWF0KHJvdW5kKG51bWVybywgZGlnaXRzID0gZGVjKSwgbnNtYWxsID0gZGVjLCBiaWcubWFyayA9ICIuIiwgZGVjaW1hbC5tYXJrID0gIiwiKQp9CgpgYGAKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CiMgU2UgbGV2YW50YW4gbGFzIGJhc2VzIHVzdWFyaWFzIGRlIGxhIEVQSCBkZWwgdHJpbWVzdHJlIGNvcnJlc3BvbmRpZW50ZQpkZXNjYXJnYV91bHRpbWFfYmFzZShiYXNlID0gIkVQSF91c3VfMV9UcmltXzIwMThfdHh0LnppcCIsIGluZGl2aWR1YWwgPSBUUlVFKQpkZXNjYXJnYV91bHRpbWFfYmFzZShiYXNlID0gIkVQSF91c3VfMV9UcmltXzIwMThfdHh0LnppcCIsIGhvZ2FyID0gVFJVRSkKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBNb2RpZmljYWNpb25lcyBlbiBsYSBiYXNlCmJhc2VfaW5kaXZpZHVhbCA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIG11dGF0ZShTZXhvID0gYXMuY2hhcmFjdGVyKENIMDQpLAogICAgICAgICBTZXhvID0gY2FzZV93aGVuKFNleG89PSIxIiB+ICJWYXJvbmVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBTZXhvPT0iMiIgfiAiTXVqZXJlcyIpLAogICAgICAgICBQUDA0RF9DT0QgPSBhcy5jaGFyYWN0ZXIoUFAwNERfQ09EKSwKICAgICAgICAgUFAwNERfQ09EID0gY2FzZV93aGVuKG5jaGFyKFBQMDREX0NPRCkgPT0gNSB+IFBQMDREX0NPRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKFBQMDREX0NPRCkgPT0gNCB+IHBhc3RlMCgiMCIsIFBQMDREX0NPRCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2hhcihQUDA0RF9DT0QpID09IDMgfiBwYXN0ZTAoIjAwIiwgUFAwNERfQ09EKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKFBQMDREX0NPRCkgPT0gMiB+IHBhc3RlMCgiMDAwIiwgUFAwNERfQ09EKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKFBQMDREX0NPRCkgPT0gMSB+IHBhc3RlMCgiMDAwMCIsIFBQMDREX0NPRCkpLAogICAgICAgICBDQUxJRklDQUNJT04gPSBzdWJzdHIoUFAwNERfQ09ELCA1LCA1KSwKICAgICAgICAgQ0FMSUZJQ0FDSU9OID0gY2FzZV93aGVuKENBTElGSUNBQ0lPTj09IjEiIH4gIlByb2Zlc2lvbmFsZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUZJQ0FDSU9OPT0iMiIgfiAiVMOpY25pY29zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTElGSUNBQ0lPTj09IjMiIH4gIk9wZXJhdGl2b3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUZJQ0FDSU9OPT0iNCIgfiAiTm8gQ2FsaWZpY2Fkb3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICIwIiksCiAgICAgICAgIENBTElGSUNBQ0lPTiA9IGZhY3RvcihDQUxJRklDQUNJT04sIGMoIlByb2Zlc2lvbmFsZXMiLCAiVMOpY25pY29zIiwgIk9wZXJhdGl2b3MiLCAiTm8gQ2FsaWZpY2Fkb3MiKSksCiAgICAgICAgIEpFUkFSUVVJQSA9IHN1YnN0cihQUDA0RF9DT0QsIDMsIDMpLAogICAgICAgICBKRVJBUlFVSUEgPSBjYXNlX3doZW4oSkVSQVJRVUlBPT0iMCIgfiAiRGlyZWNjacOzbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRVJBUlFVSUE9PSIxIiB+ICJDdWVudGFwcm9waWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkVSQVJRVUlBPT0iMiIgfiAiSmVmZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkVSQVJRVUlBPT0iMyIgfiAiVHJhYmFqYWRvcmVzIEFzYWxhcmlhZG9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiMCIpLAogICAgICAgICBKRVJBUlFVSUEgPSBmYWN0b3IoSkVSQVJRVUlBLCBjKCJKZWZlcyIsICJEaXJlY2Npw7NuIiwgIlRyYWJhamFkb3JlcyBBc2FsYXJpYWRvcyIsICJDdWVudGFwcm9waWEiKSksCiAgICAgICAgIE5JVkVMX0VEVUNBVElWTyA9IGNhc2Vfd2hlbihOSVZFTF9FRD09MSB+ICJTaW4gaW5zdHJ1Y2Npw7NuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEPT0yIH4gIlByaW1hcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEPT0zIH4gIlByaW1hcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEPT00IH4gIlNlY3VuZGFyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQ9PTUgfiAiU2VjdW5kYXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRD09NiB+ICJTdXBlcmlvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRD09NyB+ICJTaW4gSW5zdHJ1Y2Npw7NuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEPT05IH4gIk5TL05SIiksCiAgICAgICAgIE5JVkVMX0VEVUNBVElWTyA9IGZhY3RvcihOSVZFTF9FRFVDQVRJVk8sIGxldmVscyA9IGMoIlNpbiBJbnN0cnVjY2nDs24iLCAiUHJpbWFyaWEiLCAiU2VjdW5kYXJpYSIsICJTdXBlcmlvciIpKSwKICAgICAgICAgR1JVUE9fRURBRCA9IGNhc2Vfd2hlbihDSDA2ID49IDE0ICYgQ0gwNiA8PSAyOSB+ICJkZSAxNCBhIDI5IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDMwICYgQ0gwNiA8PSA2NCB+ICJkZSAzMCBhIDY0IGHDsW9zIikpCgojIGNvbG9yZXMgPSBjKCIjYWExNjVhIiwiIzE2YWE2NiIpCmNvbG9yZXMgPSBjKCIjRkUxNzY0IiwgIiMwMEJERDYiKQpgYGAKCjxicj4KCiMjIENvbXBvc2ljacOzbiBkZWwgTWVyY2FkbyBkZSBUcmFiYWpvCgojIyBJbnNlcmNpw7NuIGxhYm9yYWwKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnRhYmxhMS4xIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKENIMDYgPj0gMTQpICU+JSAKICBncm91cF9ieShTZXhvKSAlPiUgCiAgc3VtbWFyaXNlKFBvYmxhY2lvbiAgICAgICAgID0gc3VtKFBPTkRFUkEpLAogICAgICAgICAgICBPY3VwYWRvcyAgICAgICAgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxXSksCiAgICAgICAgICAgIERlc29jdXBhZG9zICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDJdKSwKICAgICAgICAgICAgUEVBICAgICAgICAgICAgICAgPSBPY3VwYWRvcyArIERlc29jdXBhZG9zLAogICAgICAgICAgICBPY3VwYWRvc19kZW1hbmQgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxICYgUFAwM0ogPT0xXSksCiAgICAgICAgICAgIFN1Ym9jX2RlbWFuZGFudGUgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksCiAgICAgICAgICAgIFN1Ym9jX25vX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKICVpbiUgYygyLDkpXSksCiAgICAgICAgICAgIFN1Ym9jdXBhZG9zICAgICAgID0gU3Vib2NfZGVtYW5kYW50ZSArIFN1Ym9jX25vX2RlbWFuZCwKICAgICAgICAgICAgJ1Rhc2EgQWN0aXZpZGFkJyAgICAgICAgICAgICAgICAgID0gcm91bmQoUEVBL1BvYmxhY2lvbiwgMyksCiAgICAgICAgICAgICdUYXNhIEVtcGxlbycgICAgICAgICAgICAgICAgICAgICA9IHJvdW5kKE9jdXBhZG9zL1BvYmxhY2lvbiwgMyksCiAgICAgICAgICAgICdUYXNhIERlc29jdXBhY2nDs24nICAgICAgICAgICAgICAgPSByb3VuZChEZXNvY3VwYWRvcy9QRUEsIDMpLAogICAgICAgICAgICAnVGFzYSBPY3VwYWRvcyBEZW1hbmRhbnRlcycgICAgICAgPSByb3VuZChPY3VwYWRvc19kZW1hbmQvUEVBLCAzKSwKICAgICAgICAgICAgJ1Rhc2EgU3Vib2N1cGFjacOzbicgICAgICAgICAgICAgICA9IHJvdW5kKFN1Ym9jdXBhZG9zL1BFQSwgMyksCiAgICAgICAgICAgICdUYXNhIFN1Ym9jdXBhY2nDs24gZGVtYW5kYW50ZScgICAgPSByb3VuZChTdWJvY19kZW1hbmRhbnRlL1BFQSwgMyksCiAgICAgICAgICAgICdUYXNhIFN1Ym9jdXBhY2nDs24gbm8gZGVtYW5kYW50ZScgPSByb3VuZChTdWJvY19ub19kZW1hbmQvUEVBLCAzKSkgJT4lIAogIHNlbGVjdCgtYygyOjkpKSAlPiUgCiAgZ2F0aGVyKEluZGljYWRvcmVzLCBWYWxvciwgMjo4KSAlPiUgCiAgc3ByZWFkKC4sIFNleG8sIFZhbG9yKQoKaW5saW5lXzUgPC0gdGFibGExLjEgJT4lIGZpbHRlcihJbmRpY2Fkb3JlcyA9PSAiVGFzYSBBY3RpdmlkYWQiKSAlPiUgCiAgdHJhbnNtdXRlKGRpZmVyZW5jaWEgPSByb3VuZCgoVmFyb25lcy1NdWplcmVzKSoxMDAsLTEpKQppbmxpbmVfNSA8LSBpbmxpbmVfNSRkaWZlcmVuY2lhCmlubGluZV82IDwtIHRhYmxhMS4xICU+JSBmaWx0ZXIoSW5kaWNhZG9yZXMgPT0gIlRhc2EgRW1wbGVvIikgJT4lIAogIHRyYW5zbXV0ZShkaWZlcmVuY2lhID0gcm91bmQoKFZhcm9uZXMtTXVqZXJlcykqMTAwLC0xKSkKaW5saW5lXzYgPC0gaW5saW5lXzYkZGlmZXJlbmNpYQpgYGAKCkVuIHByaW1lciBsdWdhciBzZSBwcmVzZW50YW4gYWxndW5vcyBpbmRpY2Fkb3JlcyBjbMOhc2ljb3MgKHV0aWxpemFkb3MgYSBuaXZlbCBpbnRlcm5hY2lvbmFsKSBxdWUgY2FyYWN0ZXJpemFuIGxhIGNvbXBvc2ljacOzbiBkZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBkZXNhZ3JlZ2Fkb3Mgc2Vnw7puIGVsIHNleG8uICAgICAgCkxhIHRhc2EgZGUgQWN0aXZpZGFkIGVzIGxhIHJlbGFjacOzbiBlbnRyZSBhcXVlbGxvcyBxdWUgcGFydGljaXBhbiBlbiBlbCBtZXJjYWRvIGRlIHRyYWJham8gKHlhIHNlYSBjb21vIG9jdXBhZG9zIG8gY29tbyBkZXNvY3VwYWRvcykgeSBsYSBwb2JsYWNpw7NuIHRvdGFsLiBFbiBlc3RlIGNhc28sIGRpY2hhIHRhc2EgZXMgYW1wbGlhbWVudGUgbWF5b3IgZW50cmUgbG9zIHZhcm9uZXMgKGxhIGRpZmVyZW5jaWEgc3VwZXJhIGxvcyBgciBpbmxpbmVfNWAgcHVudG9zIHBvcmNlbnR1YWxlcykuIEVzdG8gc3VjZWRlIHBvcnF1ZSBleGlzdGUgdW5hIGltcG9ydGFudGUgcG9yY2nDs24gZGUgbGFzIG11amVyZXMgZW4gZWRhZCBsYWJvcmFsIHF1ZSBkZWRpY2FuIHN1IHRpZW1wbyBhIHJlYWxpemFyIHRhcmVhcyBkb23DqXN0aWNhcywgaGFjaWEgZWwgaW50ZXJpb3IgZGUgc3VzIGhvZ2FyZXMsIGVuIGx1Z2FyIGRlIHRlbmVyIHVuYSBhY3RpdmlkYWQgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLiAgICAgICAgICAgCkxhIHRhc2EgZGUgRW1wbGVvIGV4aGliZSBsYSBwcm9wb3JjacOzbiBkZSBvY3VwYWRvcyBlbnRyZSBsYSBwb2JsYWNpw7NuIHRvdGFsLiBMYSBkaWZlcmVuY2lhIGVudHJlIHZhcm9uZXMgeSBtdWplcmVzIGVuIGVzdGUgY2FzbyB0YW1iacOpbiBzdXBlcmEgbG9zIGByIGlubGluZV82YCBwdW50b3MsIGRlbm90YW5kbyBlbCBtaXNtbyBmZW7Ds21lbm8gYW50ZXJpb3JtZW50ZSBtZW5jaW9uYWRvLiAgICAgCkEgZGlmZXJlbmNpYSBkZSBsYXMgdGFzYXMgYW50ZXJpb3JlcywgbGFzIHRhc2FzIGRlIGRlc29jdXBhY2nDs24geSBzdWJvY3VwYWNpw7NuIGV4cHJlc2FuIGxhIHByb3BvcmNpw7NuIHF1ZSBlc3RvcyBncnVwb3MgcmVwcmVzZW50YW4gZW4gbGEgUG9ibGFjacOzbiBFY29uw7NtaWNhbWVudGUgQWN0aXZhLiBFbiBlc3RlIGNhc28sIGFtYmFzIHRhc2FzIHNvbiBtYXlvcmVzIHBhcmEgbGFzIG11amVyZXMgcXVlIHBhcmEgbG9zIHZhcm9uZXMuIEVzdG8gZXhwcmVzYSBxdWUsIGluY2x1c28gc2llbmRvIG1pbm9yw61hIGVuIGVsIG1lcmNhZG8gZGUgdHJhYmFqbywgbGFzIG11amVyZXMgdGllbmVuIG3DoXMgZGlmaWN1bHRhZGVzIHBhcmEgY29uc2VndWlyIHRyYWJham8geS9vIHBhcmEgdHJhYmFqYXIgdW5hIGpvcm5hZGEgY29tcGxldGEuICAgICAgCkVuIHN1IGNvbmp1bnRvLCBlc3RvcyBjdWF0cm8gaW5kaWNhZG9yZXMgbm9zIHByZXNlbnRhbiB1bmEgcHJpbWVyYSBpbWFnZW4gZGUgbGEgbWFzY3VsaW5pemFjacOzbiBkZWwgbWVyY2FkbyBkZSB0cmFiYWpvIGFyZ2VudGluby4gICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgCl9fR3LDoWZpY28gMS5fXyBfUG9ibGFjacOzbiBkZSAxNCBhw7FvcyB5IG3DoXMuIFRhc2FzIGRlIEFjdGl2aWRhZCB5IGRlIEVtcGxlbyBwb3Igc2V4by4gVG90YWwgZGUgYWdsb21lcmFkb3MgdXJiYW5vcy4gYHIgZGF0ZWAuXwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0YWJsYTEuMl9ncmFmIDwtIHRhYmxhMS4xICU+JSAKICBmaWx0ZXIoSW5kaWNhZG9yZXMgJWluJSBjKCJUYXNhIEFjdGl2aWRhZCIsICJUYXNhIEVtcGxlbyIpKSAlPiUgCiAgZ2F0aGVyKC4sIFNleG8sIHByb3BvcmNpb24sIDI6MykKCmdncGxvdCh0YWJsYTEuMl9ncmFmLCBhZXMoeCA9ICcnLCBwcm9wb3JjaW9uLCBmaWxsID0gU2V4bywgZ3JvdXA9IFNleG8sIGxhYmVsID0gcGFzdGUwKGZvcm1hdG9fcG9yYyhwcm9wb3JjaW9uKjEwMCksICIlIikpKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0yLCBzaXplID0gNikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKwogIGZhY2V0X2dyaWQofkluZGljYWRvcmVzKSArCiAgbGFicyhjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgRVBILUlOREVDIikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBBcXXDrSBoYXkgcXVlIGNhbWJpYXIgZWwgZGlyZWN0b3JpbyBlbiBxdWUgc2UgdmEgYSBndWFyZGFyIGVsIGdyw6FmaWNvLgpnZ3NhdmUoIkdyYWZpY29zL0dyYWZpY28xLnBuZyIsIHNjYWxlID0gMikKYGBgCgpfX0dyw6FmaWNvIDIuX18gX1BvYmxhY2nDs24gZGUgMTQgYcOxb3MgeSBtw6FzLiBUYXNhcyBkZSBEZXNvY3VwYWNpw7NuIHkgZGUgU3Vib2N1cGFjacOzbiBwb3Igc2V4by4gVG90YWwgZGUgYWdsb21lcmFkb3MgdXJiYW5vcy4gYHIgZGF0ZWAuXwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0YWJsYTEuM19ncmFmIDwtIHRhYmxhMS4xICU+JSAKICBmaWx0ZXIoSW5kaWNhZG9yZXMgJWluJSBjKCJUYXNhIERlc29jdXBhY2nDs24iLCAiVGFzYSBTdWJvY3VwYWNpw7NuIikpICU+JSAKICBnYXRoZXIoLiwgU2V4bywgcHJvcG9yY2lvbiwgMjozKQoKZ2dwbG90KHRhYmxhMS4zX2dyYWYsIGFlcyh4ID0gJycsIHByb3BvcmNpb24sIGZpbGwgPSBTZXhvLCBncm91cD0gU2V4bywgbGFiZWwgPSBwYXN0ZTAoZm9ybWF0b19wb3JjKHByb3BvcmNpb24qMTAwKSwgIiUiKSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPTIsIHNpemUgPSA2KSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArCiAgZmFjZXRfZ3JpZCh+SW5kaWNhZG9yZXMpICsKICBsYWJzKGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIEFxdcOtIGhheSBxdWUgY2FtYmlhciBlbCBkaXJlY3RvcmlvIGVuIHF1ZSBzZSB2YSBhIGd1YXJkYXIgZWwgZ3LDoWZpY28uCmdnc2F2ZSgiR3JhZmljb3MvR3JhZmljbzIucG5nIiwgc2NhbGUgPSAyKQpgYGAKCjxicj4KCiMjIFBvciBncnVwb3MgZGUgZWRhZCB5IHNleG8KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnRhYmxhMS40IDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKENIMDYgPj0gMTQpICU+JSAKICBncm91cF9ieShTZXhvLCBHUlVQT19FREFEKSAlPiUgCiAgc3VtbWFyaXNlKFBvYmxhY2lvbiAgICAgICAgID0gc3VtKFBPTkRFUkEpLAogICAgICAgICAgICBPY3VwYWRvcyAgICAgICAgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxXSksCiAgICAgICAgICAgIERlc29jdXBhZG9zICAgICAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDJdKSwKICAgICAgICAgICAgUEVBICAgICAgICAgICAgICAgPSBPY3VwYWRvcyArIERlc29jdXBhZG9zLAogICAgICAgICAgICBPY3VwYWRvc19kZW1hbmQgICA9IHN1bShQT05ERVJBW0VTVEFETyA9PSAxICYgUFAwM0ogPT0xXSksCiAgICAgICAgICAgIFN1Ym9jX2RlbWFuZGFudGUgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKPT0xXSksCiAgICAgICAgICAgIFN1Ym9jX25vX2RlbWFuZCAgID0gc3VtKFBPTkRFUkFbRVNUQURPID09IDEgJiBJTlRFTlNJID09MSAmIFBQMDNKICVpbiUgYygyLDkpXSksCiAgICAgICAgICAgIFN1Ym9jdXBhZG9zICAgICAgID0gU3Vib2NfZGVtYW5kYW50ZSArIFN1Ym9jX25vX2RlbWFuZCwKICAgICAgICAgICAgJ1Rhc2EgQWN0aXZpZGFkJyAgICAgICAgICAgICAgICAgID0gZm9ybWF0b19wb3JjKFBFQS9Qb2JsYWNpb24qMTAwKSwKICAgICAgICAgICAgJ1Rhc2EgRW1wbGVvJyAgICAgICAgICAgICAgICAgICAgID0gZm9ybWF0b19wb3JjKE9jdXBhZG9zL1BvYmxhY2lvbioxMDApLAogICAgICAgICAgICAnVGFzYSBEZXNvY3VwYWNpw7NuJyAgICAgICAgICAgICAgID0gZm9ybWF0b19wb3JjKERlc29jdXBhZG9zL1BFQSoxMDApLAogICAgICAgICAgICAnVGFzYSBTdWJvY3VwYWNpw7NuJyAgICAgICAgICAgICAgID0gZm9ybWF0b19wb3JjKFN1Ym9jdXBhZG9zL1BFQSoxMDApKSAlPiUgCiAgc2VsZWN0KC1jKDM6MTApKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShHUlVQT19FREFEKSkgJT4lIAogIGdhdGhlcihJbmRpY2Fkb3JlcywgVmFsb3IsIDM6NikgJT4lIAogIHNwcmVhZCguLCBTZXhvLCBWYWxvcikgJT4lIAogIG11dGF0ZShJbmRpY2Fkb3JlcyA9IGZhY3RvcihJbmRpY2Fkb3JlcywgbGV2ZWxzID0gYygiVGFzYSBBY3RpdmlkYWQiLCAiVGFzYSBFbXBsZW8iLCAiVGFzYSBEZXNvY3VwYWNpw7NuIiwgIlRhc2EgU3Vib2N1cGFjacOzbiIpKSkgJT4lIAogIGFycmFuZ2UoSW5kaWNhZG9yZXMpCgp0YWJsYTEuNC5tIDwtIHRhYmxhMS40ICU+JSAKICBzZWxlY3QoLVZhcm9uZXMpICU+JSAKICBzcHJlYWQoLiwgR1JVUE9fRURBRCwgTXVqZXJlcykKCnRhYmxhMS40LnYgPC0gdGFibGExLjQgJT4lIAogIHNlbGVjdCgtTXVqZXJlcykgJT4lIAogIHNwcmVhZCguLCBHUlVQT19FREFELCBWYXJvbmVzKQoKdGFibGExLjUgPC0gbGVmdF9qb2luKHRhYmxhMS40Lm0sdGFibGExLjQudiwgYnkgPSAiSW5kaWNhZG9yZXMiKSAlPiUgCiAgc2VsZWN0KEluZGljYWRvcmVzLCBNdWplcmVzID0gYGRlIDE0IGEgMjkgYcOxb3MueGAsIFZhcm9uZXMgPSBgZGUgMTQgYSAyOSBhw7Fvcy55YCwKICAgICAgICAgTXVqZXJlcyA9IGBkZSAzMCBhIDY0IGHDsW9zLnhgLCBWYXJvbmVzID0gYGRlIDMwIGEgNjQgYcOxb3MueWApCgppbmxpbmVfMTkgPC0gdGFibGExLjQubSRgZGUgMTQgYSAyOSBhw7Fvc2BbdGFibGExLjQubSRJbmRpY2Fkb3JlcyA9PSAiVGFzYSBEZXNvY3VwYWNpw7NuIl0KYGBgCgpBc2ltaXNtbyBzZSBleHBvbmVuIGxhcyBtaXNtYXMgdGFzYXMsIHBlcm8gZGVzYWdyZWdhZGFzIHBvciBncnVwb3MgZGUgZWRhZCBhZGVtw6FzIGRlIHBvciBzZXhvLiBFbiBlc3RlIGNhc28sIGxsYW1hIGxhIGF0ZW5jacOzbiBxdWUgc29uIGxhcyBtdWplcmVzIG3DoXMgasOzdmVuZXMgbGFzIHF1ZSBwcmVzZW50YW4gbWVub3JlcyB0YXNhcyBkZSBBY3RpdmlkYWQgeSBFbXBsZW8sIGVuIHNpbXVsdMOhbmVvIGNvbiBsYXMgbWF5b3JlcyB0YXNhcyBkZSBEZXNvY3VwYWNpw7NuIHkgU3Vib2N1cGFjacOzbi4gICAgClBhcmEgZGFyIHVuIGVqZW1wbG8sIHVuIGByIGlubGluZV8xOWAlIGRlIGxhcyBtdWplcmVzIGRlIDE0IGEgMjkgYcOxb3MgZXN0w6EgZGVzb2N1cGFkYSwgZXMgZGVjaXIgcXVlLCBubyB0ZW5pZW5kbyBvY3VwYWNpw7NuLCBlc3TDoW4gYnVzY2FuZG8gYWN0aXZhbWVudGUgdW4gdHJhYmFqbyB5IG5vIGxvIGNvbnNpZ3Vlbi4KCl9fQ3VhZHJvIDEuX18gX1BvYmxhY2nDs24gZGUgMTQgYSA2NCBhw7Fvcy4gUHJpbmNpcGFsZXMgVGFzYXMgZGVsIE1lcmNhZG8gZGUgVHJhYmFqbywgcG9yIGdydXBvcyBkZSBlZGFkIHkgc2V4by4gRW4gcG9yY2VudGFqZXMuIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Ka2FibGUodGFibGExLjUsIGFsaWduID0gInIiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAiY2VudGVyIikgJT4lCiAgYWRkX2hlYWRlcl9hYm92ZShjKCIgIiA9IDEsICJkZSAxNCBhIDI5IGHDsW9zIiA9IDIsICJkZSAzMCBhIDY0IGHDsW9zIiA9IDIpKQpgYGAKCjxicj4KCiMjIEVtcGxlbyBubyByZWdpc3RyYWRvCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0YWJsYTIuMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihFU1RBRE89PTEsCiAgICAgICAgIENBVF9PQ1VQPT0zKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZSgiUHJvcG9yY2nDs24gZGUgbm8gUmVnaXN0cmFkb3MiID0gZm9ybWF0b19wb3JjKHN1bShQT05ERVJBW1BQMDdIPT0yXSkvc3VtKFBPTkRFUkEpKjEwMCkpCgppbmxpbmVfMSA8LSB0YWJsYTIuMSRgUHJvcG9yY2nDs24gZGUgbm8gUmVnaXN0cmFkb3NgW3RhYmxhMi4xJFNleG8gPT0gIk11amVyZXMiXQppbmxpbmVfMiA8LSB0YWJsYTIuMSRgUHJvcG9yY2nDs24gZGUgbm8gUmVnaXN0cmFkb3NgW3RhYmxhMi4xJFNleG8gPT0gIlZhcm9uZXMiXQpgYGAKCkEgc3UgdmV6LCBsYXMgb2N1cGFkYXMgYXNhbGFyaWFkYXMgZXN0w6FuIGV4cHVlc3RhcyBhIHVuYSB0YXNhIGRlIGVtcGxlbyBubyByZWdpc3RyYWRvIG1heW9yIHF1ZSBsYSBkZSBzdXMgY29tcGHDsWVyb3MgdmFyb25lcy4gSGF5IHVuIGByIGlubGluZV8xYCUgZGUgbGFzIGFzYWxhcmlhZGFzIGEgcXVpZW5lcyBzdXMgZW1wbGVhZG9yZXMgbm8gaW5zY3JpYmVuIGVuIGxhIHNlZ3VyaWRhZCBzb2NpYWwsIG1pZW50cmFzIHF1ZSBwYXJhIGxvcyBhc2FsYXJpYWRvcyB2YXJvbmVzIGVzdGEgdGFzYSBkZSBubyByZWdpc3RybyBlcyBkZWwgYHIgaW5saW5lXzJgJS4gICAgCiAgICAgIApfX0N1YWRybyAyLl9fIF9PY3VwYWRhcy9vcyBhc2FsYXJpYWRhcy9vcy4gVGFzYXMgZGUgZW1wbGVvIG5vIHJlZ2lzdHJhZG8gcG9yIHNleG8uIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmthYmxlKHRhYmxhMi4xLCBhbGlnbiA9ICJyIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKCjxicj4KCiMjIEFjY2VzbyBhIENhcmdvcyBqZXLDoXJxdWljb3MKCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnRhYmxhMy4xIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKEpFUkFSUVVJQSAhPSAiMCIsCiAgICAgICAgIEVTVEFETyA9PSAxKSAlPiUKICBncm91cF9ieShTZXhvKSAlPiUgCiAgbXV0YXRlKEZyZWN1ZW5jaWEgPSBzdW0oUE9OREVSQSkpICU+JSAKICBncm91cF9ieShTZXhvLCBKRVJBUlFVSUEpICU+JSAKICBzdW1tYXJpc2UocHJvcG9yY2lvbiA9IHJvdW5kKHN1bShQT05ERVJBKS91bmlxdWUoRnJlY3VlbmNpYSksIDMpKQoKaW5saW5lXzMgPC0gZm9ybWF0b19wb3JjKHN1bSh0YWJsYTMuMSRwcm9wb3JjaW9uW3RhYmxhMy4xJEpFUkFSUVVJQSAlaW4lIGMoIkplZmVzIiwgIkRpcmVjY2nDs24iKSAmIHRhYmxhMy4xJFNleG8gPT0gIlZhcm9uZXMiXSkgKiAxMDApCmlubGluZV80IDwtIGZvcm1hdG9fcG9yYyhzdW0odGFibGEzLjEkcHJvcG9yY2lvblt0YWJsYTMuMSRKRVJBUlFVSUEgJWluJSBjKCJKZWZlcyIsICJEaXJlY2Npw7NuIikgJiB0YWJsYTMuMSRTZXhvID09ICJNdWplcmVzIl0pICogMTAwKQpgYGAKCkFkZW3DoXMgZGUgdGVuZXIgdW5hIHBhcnRpY2lwYWNpw7NuIG3DoXMgcmVzdHJpbmdpZGEgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLCBsYXMgb2N1cGFkYXMgZW5jdWVudHJhbiBtw6FzIG9ic3TDoWN1bG9zIHBhcmEgYWNjZWRlciBhIGNhcmdvcyBqZXLDoXJxdWljb3M6IG1pZW50cmFzIHF1ZSB1biBgciBpbmxpbmVfM2AlIGRlIGxvcyBvY3VwYWRvcyB2YXJvbmVzIHRpZW5lbiBjYXJnb3MgZGUgZGlyZWNjacOzbiBvIHNvbiBqZWZlcywgdW4gYHIgaW5saW5lXzRgJSBkZSBsYXMgb2N1cGFkYXMgZWplcmNlbiBwdWVzdG9zIGRlIGVzYXMgY2FyYWN0ZXLDrXN0aWNhcy4gQWwgbWlzbW8gdGllbXBvLCBsYXMgb2N1cGFkYXMgc2UgZW5jdWVudHJhbiBtw6FzIGNvbmNlbnRyYWRhcyBlbiBsb3MgcHVlc3RvcyBhc2FsYXJpYWRvcywgZXMgZGVjaXIsIGVuIHJlbGFjacOzbiBkZSBkZXBlbmRlbmNpYS4gICAKICAgICAgIApfX0dyw6FmaWNvIDMuX18gX09jdXBhZGFzL29zLiBNdWplcmVzIHkgVmFyb25lcyBzZWfDum4gSmVyYXJxdcOtYSBkZSBsYSBvY3VwYWNpw7NuLCBlbiBwb3JjZW50YWplIChlc2NhbGFzIGxpYnJlcykuIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dwbG90KHRhYmxhMy4xLCBhZXMoeCA9ICcnLCBwcm9wb3JjaW9uLCBmaWxsID0gU2V4bywgZ3JvdXA9IFNleG8sIGxhYmVsID0gcGVyY2VudChwcm9wb3JjaW9uKSApKSsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPTIsIHNpemUgPSA2KSArCiAgdGhlbWVfdm9pZCgpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMpKwogIGZhY2V0X3dyYXAofkpFUkFSUVVJQSwgc2NhbGVzID0gImZyZWUiKSArIAogIGxhYnMoY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpCmBgYAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cmdnc2F2ZSgiR3JhZmljb3MvR3JhZmljbzMucG5nIiwgc2NhbGUgPSAyKQpgYGAKCjxicj4KCiMjIEJyZWNoYXMgZGUgaW5ncmVzb3MgbWVuc3VhbGVzCgpBIGNvbnRpbnVhY2nDs24gc2UgaGFjZSBmb2NvIGVuIGxhcyBkaWZlcmVuY2lhcyBkZSBtb250b3MgZGUgaW5ncmVzb3MgcXVlIHBlcmNpYmVuIGxvcyB2YXJvbmVzIHkgbGFzIG11amVyZXMuIEVzdG9zIGluZ3Jlc29zIHB1ZWRlbiBwcm92ZW5pciBkZSBkaXZlcnNhcyBmdWVudGVzIHkgYWwgbWlzbW8gdGllbXBvIHB1ZWRlbiBkZXNhZ3JlZ2Fyc2Ugc2Vnw7puIGNhcmFjdGVyw61zdGljYXMgYWRpY2lvbmFsZXMgZGUgbGFzIHBlcnNvbmFzIG8gbG9zIHB1ZXN0b3MgcXVlIGRlc2VtcGXDsWFuLiBJbmNsdXNvIHB1ZWRlbiBkaXN0aW5ndWlyc2UgbG9zIGluZ3Jlc29zIG1lbnN1YWxlcyB5IGxvcyBpbmdyZXNvcyBob3Jhcmlvcy4gICAgICAgICAgICAgIApQYXJhIGRpbWVuc2lvbmFyIGVzdGFzIGRpZmVyZW5jaWFzIGhhY2Vtb3MgdXNvIGRlbCBjb25jZXB0byBkZSAiYnJlY2hhIiwgcXVlIGVuIGVzdGUgY2FzbyBzZSBjYWxjdWxhIGNvbW8gbGEgZGlmZXJlbmNpYSBlbnRyZSBsb3MgaW5ncmVzb3MgcHJvbWVkaW9zIGRlIGxvcyB2YXJvbmVzIHkgbGFzIG11amVyZXMsIGV4cHJlc2FkYSBlbiB0w6lybWlub3MgZGVsIGluZ3Jlc28gbcOhcyBhbHRvLiBFcyBkZWNpciwgcXVlIHB1ZWRlIGxlZXJzZSBjb21vICJsYXMgbXVqZXJlcyBwZXJjaWJlbiBpbmdyZXNvcyBxdWUsIGVuIHByb21lZGlvLCBzb24gdW4gLi4uJSBtZW5vcmVzIHF1ZSBsb3MgZGUgbG9zIHZhcm9uZXMiLiAgICAgICAgCgo8YnI+CgojIyMgQnJlY2hhIGRlIGluZ3Jlc29zIHRvdGFsZXMgbWVuc3VhbGVzCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0YWJsYTQuMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihQNDdUID4gMCkgJT4lIAogIGdyb3VwX2J5KFNleG8pICU+JSAKICBzdW1tYXJpc2UoTWVkaWEuSVRJID0gcm91bmQod2VpZ2h0ZWQubWVhbihQNDdULCBQT05ESUkpLCAxKSkgJT4lIAogIHNwcmVhZCguLCBTZXhvLCBNZWRpYS5JVEkpICU+JSAKICBtdXRhdGUoIkJyZWNoYSBkZWwgSW5ncmVzbyBUb3RhbCBJbmRpdmlkdWFsIiA9IGZvcm1hdG9fcG9yYygoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcykqMTAwKSwKICAgICAgICAgIk1lZGlhIGRlIGluZ3Jlc29zIGRlIGxhcyBNdWplcmVzIiA9IGZvcm1hdG9fcGVzb3MoTXVqZXJlcyksCiAgICAgICAgICJNZWRpYSBkZSBpbmdyZXNvcyBkZSBsb3MgVmFyb25lcyIgPSBmb3JtYXRvX3Blc29zKFZhcm9uZXMpKSAlPiUgCiAgc2VsZWN0KCJNZWRpYSBkZSBpbmdyZXNvcyBkZSBsYXMgTXVqZXJlcyIsICJNZWRpYSBkZSBpbmdyZXNvcyBkZSBsb3MgVmFyb25lcyIsICJCcmVjaGEgZGVsIEluZ3Jlc28gVG90YWwgSW5kaXZpZHVhbCIpCgppbmxpbmVfOCA8LSB0YWJsYTQuMSRgQnJlY2hhIGRlbCBJbmdyZXNvIFRvdGFsIEluZGl2aWR1YWxgCmBgYAoKT2JzZXJ2YW5kbyBsb3MgaW5ncmVzb3MgdG90YWxlcyBpbmRpdmlkdWFsZXMgZGUgdG9kYSBsYSBwb2JsYWNpw7NuLCBzZSBvYnNlcnZhIHF1ZSBsYSBicmVjaGEgZW50cmUgdmFyb25lcyB5IG11amVyZXMgZW4gZXN0ZSBjYXNvIGVzIGRlIGByIGlubGluZV84YCBwdW50b3MgcG9yY2VudHVhbGVzLiBFcyBkZWNpciwgY29udGVtcGxhbmRvIHRvZG9zIGxvcyBpbmdyZXNvcyBxdWUgc2UgcGVyY2liZW4sIHNlYW4gZGUgb3JpZ2VuIGxhYm9yYWwgbyBubyBsYWJvcmFsIChjb21vIGp1YmlsYWNpb25lcyB5IHBlbnNpb25lcywgY3VvdGFzIGFsaW1lbnRhcmlhcywgc3Vic2lkaW9zLCBldGMuKSwgbGFzIG11amVyZXMgcGVyY2liZW4gaW5ncmVzb3MgcXVlLCBlbiBwcm9tZWRpbywgc29uIHVuIGByIGlubGluZV84YCUgbWVub3JlcyBxdWUgbG9zIGRlIGxvcyB2YXJvbmVzLiAgICAgCiAgICAgICAgICAgICAgCl9fQ3VhZHJvIDMuX18gX1BvYmxhY2nDs24gcGVyY2VwdG9yYSBkZSBpbmdyZXNvcy4gTWVkaWEgZGUgaW5ncmVzb3MgdG90YWxlcyBpbmRpdmlkdWFsZXMgeSBicmVjaGEgZGUgaW5ncmVzb3MgKGVuIHBvcmNlbnRhamUpIHBvciBzZXhvLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQprYWJsZSh0YWJsYTQuMSwgYWxpZ24gPSAiciIpICU+JSAKICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKCjxicj4KCiMjIyBCcmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIGRlIGxhcy9vcyBvY3VwYWRhcy9vcwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGFibGE1LjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoRVNUQURPID09IDEpICU+JSAKICBncm91cF9ieShTZXhvKSAlPiUgCiAgc3VtbWFyaXNlKE1lZGlhLklPUCA9IHJvdW5kKHdlaWdodGVkLm1lYW4oUDIxLCBQT05ESUlPKSwgMSkpICU+JSAKICBzcHJlYWQoLiwgU2V4bywgTWVkaWEuSU9QKSAlPiUgCiAgbXV0YXRlKCJCcmVjaGEgZGUgaW5ncmVzb3MgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwiID0gZm9ybWF0b19wb3JjKCgoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKSoxMDApLAogICAgICAgICAiTWVkaWEgZGUgaW5ncmVzb3MgZGUgbGFzIE11amVyZXMiID0gZm9ybWF0b19wZXNvcyhNdWplcmVzKSwKICAgICAgICAgIk1lZGlhIGRlIGluZ3Jlc29zIGRlIGxvcyBWYXJvbmVzIiA9IGZvcm1hdG9fcGVzb3MoVmFyb25lcykpICU+JSAKICBzZWxlY3QoIk1lZGlhIGRlIGluZ3Jlc29zIGRlIGxhcyBNdWplcmVzIiwgIk1lZGlhIGRlIGluZ3Jlc29zIGRlIGxvcyBWYXJvbmVzIiwgIkJyZWNoYSBkZSBpbmdyZXNvcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCIpCgppbmxpbmVfOSA8LSB0YWJsYTUuMSRgQnJlY2hhIGRlIGluZ3Jlc29zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsYAppbmxpbmVfMTAgPC0gdGFibGE1LjEkYE1lZGlhIGRlIGluZ3Jlc29zIGRlIGxhcyBNdWplcmVzYAppbmxpbmVfMTEgPC0gdGFibGE1LjEkYE1lZGlhIGRlIGluZ3Jlc29zIGRlIGxvcyBWYXJvbmVzYApgYGAKClNpbXVsdMOhbmVhbWVudGUsIGVuIGVsIG1lcmNhZG8gZGUgdHJhYmFqbywgbGFzIG11amVyZXMgZ2FuYW4gZW4gcHJvbWVkaW8gdW4gYHIgaW5saW5lXzlgJSBtZW5vcyBxdWUgbG9zIHZhcm9uZXMgKGByIGlubGluZV8xMGAgdnMuIGByIGlubGluZV8xMWAgKS4gRXN0b3MgZGF0b3MgY29ycmVzcG9uZGVuIGEgbGEgdG90YWxpZGFkIGRlIG9jdXBhZGFzL29zLCBjdWFscXVpZXJhIHNlYSBzdSBjYXRlZ29yw61hIG9jdXBhY2lvbmFsLCBjYWxpZmljYWNpw7NuIG8gamVyYXJxdcOtYSwgeSBvYnNlcnZhbmRvIGVuIGVzdGUgY2FzbyBsb3MgaW5ncmVzb3MgcHJvdmVuaWVudGVzIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsLiAgCiAgICAgICAgICAgICAgCl9fQ3VhZHJvIDQuX18gX09jdXBhZGFzL29zLiBNZWRpYSBkZSBpbmdyZXNvcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCB5IGJyZWNoYSBkZSBpbmdyZXNvcyAoZW4gcG9yY2VudGFqZSkgcG9yIHNleG8uIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmthYmxlKHRhYmxhNS4xLCBhbGlnbiA9ICJyIikgJT4lIAogICAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpLCBmdWxsX3dpZHRoID0gRiwgcG9zaXRpb24gPSAiY2VudGVyIikKYGBgCgo8YnI+CgojIyMgQnJlY2hhIGRlIGluZ3Jlc29zIG1lbnN1YWxlcyBlbnRyZSBhc2FsYXJpYWRhcy9vcyBubyByZWdpc3RyYWRvcwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGFibGE2LjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoRVNUQURPID09IDEgJiBDQVRfT0NVUCA9PSAzICYgUFAwN0ggPT0gMikgJT4lIAogIGdyb3VwX2J5KFNleG8pICU+JSAKICBzdW1tYXJpc2UoTWVkaWEuSU9QID0gcm91bmQod2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLCAxKSkgJT4lIAogIHNwcmVhZCguLCBTZXhvLCBNZWRpYS5JT1ApICU+JSAKICBtdXRhdGUoIkJyZWNoYSBkZSBpbmdyZXNvcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCIgPSBmb3JtYXRvX3BvcmMoKChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMpKjEwMCksCiAgICAgICAgICJNZWRpYSBkZSBpbmdyZXNvcyBkZSBsYXMgTXVqZXJlcyIgPSBmb3JtYXRvX3Blc29zKE11amVyZXMpLAogICAgICAgICAiTWVkaWEgZGUgaW5ncmVzb3MgZGUgbG9zIFZhcm9uZXMiID0gZm9ybWF0b19wZXNvcyhWYXJvbmVzKSkgJT4lIAogIHNlbGVjdCgiTWVkaWEgZGUgaW5ncmVzb3MgZGUgbGFzIE11amVyZXMiLCAiTWVkaWEgZGUgaW5ncmVzb3MgZGUgbG9zIFZhcm9uZXMiLCAiQnJlY2hhIGRlIGluZ3Jlc29zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIikKCmlubGluZV8xMiA8LSB0YWJsYTYuMSRgQnJlY2hhIGRlIGluZ3Jlc29zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsYApgYGAKCkFudGVyaW9ybWVudGUgc2Ugb2JzZXJ2w7MgcXVlIGxhcyBhc2FsYXJpYWRhcyBlc3TDoW4gZXhwdWVzdGFzIGEgdW5hIHRhc2EgZGUgbm8gcmVnaXN0cm8gbcOhcyBhbHRhIHF1ZSBsYSBxdWUgcHJlc2VudGFuIGxvcyBhc2FsYXJpYWRvcyB2YXJvbmVzLiBQZXJvIGFkZW3DoXMsIGxhcyBhc2FsYXJpYWRhcyBkZSBlc3RlIHNlY3RvciwgZWwgbm8gcmVnaXN0cmFkbywgZ2FuYW4gZW4gcHJvbWVkaW8gdW4gYHIgaW5saW5lXzEyYCUgbWVub3MgcXVlIHN1cyBwYXJlcy4gRXMgZGVjaXIgcXVlIGxhIGJyZWNoYSBkZSBpbmdyZXNvcyBkZSBsYXMvb3Mgb2N1cGFkYXMvb3Mgc2UgYW1wbMOtYSBjdWFuZG8gdmVtb3MgYSBhcXVlbGxhcy9vcyBhc2FsYXJpYWRhcy9vcyBxdWUgdGllbmVuIHBlb3JlcyBjb25kaWNpb25lcyBkZSB0cmFiYWpvLiAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAKX19DdWFkcm8gNS5fXyBfT2N1cGFkYXMvb3MgQXNhbGFyaWFkYXMvb3Mgbm8gcmVnaXN0cmFkb3MuIE1lZGlhIGRlIGluZ3Jlc29zIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsIHkgYnJlY2hhIGRlIGluZ3Jlc29zIChlbiBwb3JjZW50YWplKSBwb3Igc2V4by4gVG90YWwgZGUgYWdsb21lcmFkb3MgdXJiYW5vcy4gYHIgZGF0ZWAuXwpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Ka2FibGUodGFibGE2LjEsIGFsaWduID0gInIiKSAlPiUgCiAgICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKCjxicj4KCiMjIyBCcmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciBjYWxpZmljYWNpw7NuIGRlbCBwdWVzdG8gZGUgdHJhYmFqbwoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGFibGE3LjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoQ0FMSUZJQ0FDSU9OIT0iMCIsCiAgICAgICAgIEVTVEFETyA9PSAxLCAKICAgICAgICAgUFAzRV9UT1QgPiAwKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bywgQ0FMSUZJQ0FDSU9OKSAlPiUgCiAgc3VtbWFyaXNlKElPUF9ociA9IHJvdW5kKHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pLCAyKSwKICAgICAgICAgICAgSU9QX21lbnN1YWwgID0gcm91bmQod2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLCAyKSkgCgppbmxpbmVfMTMgPC0gZm9ybWF0b19wZXNvcyh0YWJsYTcuMSRJT1BfbWVuc3VhbFt0YWJsYTcuMSRTZXhvID09ICJWYXJvbmVzIiAmIHRhYmxhNy4xJENBTElGSUNBQ0lPTiA9PSAiUHJvZmVzaW9uYWxlcyJdLCBkZWMgPSAwKSAKCmlubGluZV8xNCA8LSBmb3JtYXRvX3Blc29zKHRhYmxhNy4xJElPUF9tZW5zdWFsW3RhYmxhNy4xJFNleG8gPT0gIk11amVyZXMiICYgdGFibGE3LjEkQ0FMSUZJQ0FDSU9OID09ICJQcm9mZXNpb25hbGVzIl0sIGRlYyA9IDApCgppbmxpbmVfMTUgPC0gdGFibGE3LjEgJT4lIAogIGZpbHRlcihDQUxJRklDQUNJT04gPT0gIlByb2Zlc2lvbmFsZXMiKSAlPiUgCiAgc2VsZWN0KFNleG8sIElPUF9tZW5zdWFsKSAlPiUgCiAgc3ByZWFkKC4sIFNleG8sIElPUF9tZW5zdWFsKSAlPiUgCiAgdHJhbnNtdXRlKHZhbG9yID0gZm9ybWF0b19wb3JjKChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMgKiAxMDApKQppbmxpbmVfMTUgPC0gaW5saW5lXzE1JHZhbG9yCgppbmxpbmVfMTYgPC0gZm9ybWF0b19wZXNvcyh0YWJsYTcuMSRJT1BfbWVuc3VhbFt0YWJsYTcuMSRTZXhvID09ICJWYXJvbmVzIiAmIHRhYmxhNy4xJENBTElGSUNBQ0lPTiA9PSAiTm8gQ2FsaWZpY2Fkb3MiXSwgZGVjID0gMCkKCmlubGluZV8xNyA8LSBmb3JtYXRvX3Blc29zKHRhYmxhNy4xJElPUF9tZW5zdWFsW3RhYmxhNy4xJFNleG8gPT0gIk11amVyZXMiICYgdGFibGE3LjEkQ0FMSUZJQ0FDSU9OID09ICJObyBDYWxpZmljYWRvcyJdLCBkZWMgPSAwKQoKaW5saW5lXzE4IDwtIHRhYmxhNy4xICU+JSAKICBmaWx0ZXIoQ0FMSUZJQ0FDSU9OID09ICJObyBDYWxpZmljYWRvcyIpICU+JSAKICBzZWxlY3QoU2V4bywgSU9QX21lbnN1YWwpICU+JSAKICBzcHJlYWQoLiwgU2V4bywgSU9QX21lbnN1YWwpICU+JSAKICB0cmFuc211dGUodmFsb3IgPSBmb3JtYXRvX3BvcmMoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcyAqIDEwMCkpCmlubGluZV8xOCA8LSBpbmxpbmVfMTgkdmFsb3IKYGBgCgpMYSBicmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIGRlIGxhcy9vcyBvY3VwYWRhcy9vcyBzZSBtYW50aWVuZSBpbmNsdXNvIGEgaWd1YWxlcyBuaXZlbGVzIGRlIGNhbGlmaWNhY2nDs24gZGVsIHB1ZXN0byBkZSB0cmFiYWpvLiBQb3IgZWplbXBsbywgbWllbnRyYXMgcXVlIGxvcyB2YXJvbmVzIHF1ZSB0cmFiYWphbiBlbiBvY3VwYWNpb25lcyBwcm9mZXNpb25hbGVzIHRpZW5lbiB1biBpbmdyZXNvIG1lZGlvIGRlIGByIGlubGluZV8xM2AsIGxhcyBtdWplcmVzIG9jdXBhZGFzIGVuIGVzZSBtaXNtbyBzZWdtZW50byBwZXJjaWJlbiB1biBpbmdyZXNvIG1lZGlvIGRlIGByIGlubGluZV8xNGAsIGVzIGRlY2lyLCB1biBgciBpbmxpbmVfMTVgJSBtZW5vcyBxdWUgbG9zIHZhcm9uZXMuICAgIApFbiBsb3MgcHVlc3RvcyBubyBjYWxpZmljYWRvcywgbG9zIHZhcm9uZXMgZ2FuYW4gYHIgaW5saW5lXzE2YCBlbiBwcm9tZWRpbywgYWwgdGllbXBvIHF1ZSBsYXMgbXVqZXJlcyBnYW5hbiBhbHJlZGVkb3IgZGUgYHIgaW5saW5lXzE3YC4gRXN0YSBicmVjaGEgZXMgZGVsIGByIGlubGluZV8xOGAlLiAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAKX19HcsOhZmljbyA0Ll9fIF9PY3VwYWRhcy9vcy4gQnJlY2hhIGRlIGluZ3Jlc29zIG1lbnN1YWxlcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCwgcG9yIHNleG8geSBjYWxpZmljYWNpw7NuIG9jdXBhY2lvbmFsLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgZ2dwbG90KHRhYmxhNy4xLCBhZXMoeCA9IENBTElGSUNBQ0lPTiwgSU9QX21lbnN1YWwsIGZpbGwgPSBTZXhvLCBncm91cCA9IFNleG8sIGxhYmVsID0gZm9ybWF0b19wZXNvcyhJT1BfbWVuc3VhbCwgZGVjID0gMCkgKSkrCiMgICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKIyAgIGdlb21fdGV4dChwb3NpdGlvbiA9cG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0tLjEsIHNpemUgPSAzLjUpICsKIyAgIHRoZW1lX21pbmltYWwoKSArCiMgICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICAgbGFicyh5ID0gJ0luZ3Jlc28gTWVuc3VhbCcsIHggPSAiIikgKwojICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKwojICAgbGFicyhjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgRVBILUlOREVDIikKCnRhYmxhNy4xX2FsdCA8LSB0YWJsYTcuMSAlPiUgCiAgc2VsZWN0KC1JT1BfaHIpICU+JSAKICBzcHJlYWQoLiwgU2V4bywgSU9QX21lbnN1YWwpICU+JSAKICBtdXRhdGUoYnJlY2hhID0gcGFzdGUwKGZvcm1hdG9fcG9yYygoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzKjEwMCksICIlIiksCiAgICAgICAgIHggPSAoVmFyb25lcytNdWplcmVzKS8yKSAKCmdncGxvdCh0YWJsYTcuMV9hbHQsIGFlcyh4ID0gTXVqZXJlcywgeGVuZCA9IFZhcm9uZXMsIHkgPSBDQUxJRklDQUNJT04sIGdyb3VwID0gQ0FMSUZJQ0FDSU9OLGxhYmVsPSBicmVjaGEpKSArCiAgZ2VvbV9kdW1iYmVsbChjb2xvcj0gIiM4MDgwODAiLAogICAgICAgICAgICAgICAgc2l6ZV94ID0gMywgc2l6ZV94ZW5kID0gMywKICAgICAgICAgICAgICAgIGNvbG91cl94ID0gY29sb3Jlc1sxXSwKICAgICAgICAgICAgICAgIGNvbG91cl94ZW5kID0gY29sb3Jlc1syXSkgKwogIGdlb21fdGV4dChkYXRhID0gdGFibGE3LjFfYWx0LCBhZXMoeCwgQ0FMSUZJQ0FDSU9OLCBsYWJlbCA9IGJyZWNoYSksIG51ZGdlX3kgPSAuMikrCiAgbGFicyh4PSJJbmdyZXNvIE1lbnN1YWwiLAogICAgICAgeT1OVUxMLCAKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JlcykrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dzYXZlKCJHcmFmaWNvcy9HcmFmaWNvNF9tcy5wbmciKQpgYGAKCjxicj4KCiMjIyBCcmVjaGEgZGUgaW5ncmVzb3MgbWVuc3VhbGVzIHBvciBuaXZlbCBlZHVjYXRpdm8gCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0YWJsYTguMSA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihFU1RBRE8gPT0gMSwgIWlzLm5hKE5JVkVMX0VEVUNBVElWTykpICU+JSAKICBncm91cF9ieShTZXhvKSAlPiUKICBtdXRhdGUoRnJlY3VlbmNpYSA9IHN1bShQT05ERVJBKSkgJT4lIAogIGdyb3VwX2J5KFNleG8sIE5JVkVMX0VEVUNBVElWTykgJT4lIAogIHN1bW1hcmlzZShUYXNhID0gZm9ybWF0b19wb3JjKHN1bShQT05ERVJBKS91bmlxdWUoRnJlY3VlbmNpYSkqMTAwKSkgJT4lIAogIHNwcmVhZCguLCBTZXhvLCBUYXNhKSAlPiUgCiAgcmVuYW1lKCJOaXZlbCBFZHVjYXRpdm8iID0gTklWRUxfRURVQ0FUSVZPLCAiJSBkZSBNdWplcmVzIiA9IE11amVyZXMsICIlIGRlIFZhcm9uZXMiID0gVmFyb25lcykKCnRhYmxhOC4yIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKEVTVEFETyA9PSAxLCBQUDNFX1RPVCA+IDAsICFpcy5uYShOSVZFTF9FRFVDQVRJVk8pKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bywgTklWRUxfRURVQ0FUSVZPKSAlPiUgCiAgc3VtbWFyaXNlKElPUF9ociA9IHJvdW5kKHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pLCAyKSwKICAgICAgICAgICAgSU9QX21lbnN1YWwgID0gcm91bmQod2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pLCAyKSkgCgppbmxpbmVfMjAgPC0gdGFibGE4LjIgJT4lIAogIGZpbHRlcihOSVZFTF9FRFVDQVRJVk8gPT0gIlN1cGVyaW9yIikgJT4lIAogIHNlbGVjdChTZXhvLCBJT1BfbWVuc3VhbCkgJT4lIAogIHNwcmVhZCguLCBTZXhvLCBJT1BfbWVuc3VhbCkgJT4lIAogIHRyYW5zbXV0ZSh2YWxvciA9IGZvcm1hdG9fcG9yYygoVmFyb25lcy1NdWplcmVzKS9WYXJvbmVzICogMTAwKSkKaW5saW5lXzIwIDwtIGlubGluZV8yMCR2YWxvcgoKaW5saW5lXzIxIDwtIHRhYmxhOC4yICU+JSAKICBmaWx0ZXIoTklWRUxfRURVQ0FUSVZPID09ICJQcmltYXJpYSIpICU+JSAKICBzZWxlY3QoU2V4bywgSU9QX21lbnN1YWwpICU+JSAKICBzcHJlYWQoLiwgU2V4bywgSU9QX21lbnN1YWwpICU+JSAKICB0cmFuc211dGUodmFsb3IgPSBmb3JtYXRvX3BvcmMoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcyAqIDEwMCkpCmlubGluZV8yMSA8LSBpbmxpbmVfMjEkdmFsb3IKCmBgYAoKTGFzIG11amVyZXMgb2N1cGFkYXMgZXN0w6FuIGVuIHByb21lZGlvIG3DoXMgZm9ybWFkYXMgcXVlIGxvcyB2YXJvbmVzIHF1ZSBwYXJ0aWNpcGFuIGVuIGVsIG1lcmNhZG8gZGUgdHJhYmFqbyAoaGF5IHVuYSBtYXlvciBwcm9wb3JjacOzbiBkZSBtdWplcmVzIGNvbiBuaXZlbGVzIGVkdWNhdGl2b3MgbcOhcyBhbHRvcykuIFNpbiBlbWJhcmdvLCBhIGlndWFsIG5pdmVsIGVkdWNhdGl2bywgbG9zIGluZ3Jlc29zIGxhYm9yYWxlcyBkZSBsYXMgbXVqZXJlcyB0cmFiYWphZG9yYXMgc29uIGluZmVyaW9yZXMgYSBsb3MgZGUgbG9zIHZhcm9uZXMuIEVzdGEgZGlmZXJlbmNpYSBkZSBpbmdyZXNvcyBlcyBkZWwgYHIgaW5saW5lXzIwYCUgcGFyYSBsYXMgZGUgbml2ZWwgdW5pdmVyc2l0YXJpby9zdXBlcmlvciwgeSBkZWwgYHIgaW5saW5lXzIxYCUgcGFyYSBsYXMgcXVlIGN1ZW50YW4gY29uIG5pdmVsIHByaW1hcmlvLiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIApfX0N1YWRybyA2Ll9fIF9PY3VwYWRhcy9vcy4gTXVqZXJlcyB5IFZhcm9uZXMgc2Vnw7puIG5pdmVsIGVkdWNhdGl2byAoUG9yY2VudGFqZSBwb3IgY29sdW1uYXMpLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmthYmxlKHRhYmxhOC4xLCBhbGlnbiA9ICJyIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGLCBwb3NpdGlvbiA9ICJjZW50ZXIiKQpgYGAKCl9fR3LDoWZpY28gNS5fXyBfT2N1cGFkYXMvb3MuIEJyZWNoYSBkZSBpbmdyZXNvcyBtZW5zdWFsZXMgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwsIHBvciBzZXhvIHkgbml2ZWwgZWR1Y2F0aXZvLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiNnZ3Bsb3QodGFibGE4LjIsIGFlcyh4ID0gTklWRUxfRURVQ0FUSVZPLCBJT1BfbWVuc3VhbCwgZmlsbCA9IFNleG8sIGdyb3VwPSBTZXhvLCBsYWJlbCA9IGZvcm1hdG9fcGVzb3MoSU9QX21lbnN1YWwsIGRlYyA9IDApICkpICsKIyAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiMgIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9LS4xLCBzaXplID0gMy41KSArCiMgIHRoZW1lX21pbmltYWwoKSArCiMgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgbGFicyh5ID0gJ0luZ3Jlc28gTWVuc3VhbCcsIHggPSAiIikgKwojICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArCiMgIGxhYnMoY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpCgp0YWJsYTguMl9hbHQgPC0gdGFibGE4LjIgJT4lIAogIHNlbGVjdCgtSU9QX2hyKSAlPiUgCiAgc3ByZWFkKC4sIFNleG8sIElPUF9tZW5zdWFsKSAlPiUgCiAgbXV0YXRlKGJyZWNoYSA9IHBhc3RlMChmb3JtYXRvX3BvcmMoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcyoxMDApLCAiJSIpLAogICAgICAgICB4ID0gKFZhcm9uZXMrTXVqZXJlcykvMikgCgpnZ3Bsb3QodGFibGE4LjJfYWx0LCBhZXMoeCA9IE11amVyZXMsIHhlbmQgPSBWYXJvbmVzLCB5ID0gTklWRUxfRURVQ0FUSVZPLCBncm91cCA9IE5JVkVMX0VEVUNBVElWTywgbGFiZWwgPSBicmVjaGEpKSArCiAgZ2VvbV9kdW1iYmVsbChjb2xvcj0gIiM4MDgwODAiLAogICAgICAgICAgICAgICAgc2l6ZV94ID0gMywgc2l6ZV94ZW5kID0gMywKICAgICAgICAgICAgICAgIGNvbG91cl94ID0gY29sb3Jlc1sxXSwKICAgICAgICAgICAgICAgIGNvbG91cl94ZW5kID0gY29sb3Jlc1syXSkgKwogIGdlb21fdGV4dChhZXMoeCwgTklWRUxfRURVQ0FUSVZPLCBsYWJlbCA9IGJyZWNoYSksIG51ZGdlX3kgPSAuMikrCiAgbGFicyh4PSJJbmdyZXNvIE1lbnN1YWwiLAogICAgICAgeT1OVUxMLCAKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JlcykrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dzYXZlKCJHcmFmaWNvcy9HcmFmaWNvNV9tcy5wbmciKQpgYGAKCjxicj4KCiMjIEJyZWNoYXMgZGUgaW5ncmVzb3MgaG9yYXJpb3MKCiMjIyBCcmVjaGEgZGUgaW5ncmVzb3MgaG9yYXJpb3MgcG9yIGNhbGlmaWNhY2nDs24gZGVsIHB1ZXN0byBkZSB0cmFiYWpvCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0YWJsYTcuMV9hbHQyIDwtIHRhYmxhNy4xICU+JSAKICBzZWxlY3QoLUlPUF9tZW5zdWFsKSAlPiUgCiAgc3ByZWFkKC4sIFNleG8sIElPUF9ocikgJT4lIAogIG11dGF0ZShicmVjaGEgPSBwYXN0ZTAoZm9ybWF0b19wb3JjKChWYXJvbmVzLU11amVyZXMpL1Zhcm9uZXMqMTAwKSwgIiUiKSwKICAgICAgICAgeCA9IChWYXJvbmVzK011amVyZXMpLzIpCmBgYAoKU2kgZW4gbHVnYXIgZGUgY29tcGFyYXIgaW5ncmVzb3MgbWVuc3VhbGVzIHRvbWFtb3MgZWwgaW5ncmVzbyBwb3IgaG9yYSBkZSBsYXMgcGVyc29uYXMsIGxhIGhpc3RvcmlhIGVzIHVuIHBvY28gZGlmZXJlbnRlLiBBbCByZWNhbGN1bGFyIGVsIGdyw6FmaWNvIDQgKHBvciBjYWxpZmljYWNpw7NuIGRlbCBwdWVzdG8gZGUgdHJhYmFqbykgbGEgYnJlY2hhLCBleGNlcHRvIHBhcmEgcHJvZmVzaW9uYWxlcywgcHLDoWN0aWNhbWVudGUgc2UgYW51bGEuCgpfX0dyw6FmaWNvIDYuX18gX09jdXBhZGFzL29zLiBCcmVjaGEgZGUgaW5ncmVzb3MgaG9yYXJpb3MgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwsIHBvciBzZXhvIHkgY2FsaWZpY2FjacOzbiBvY3VwYWNpb25hbC4gVG90YWwgZGUgYWdsb21lcmFkb3MgdXJiYW5vcy4gYHIgZGF0ZWAuXwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojZ2dwbG90KHRhYmxhNy4xLCBhZXMoeCA9IENBTElGSUNBQ0lPTiwgSU9QX2hyLCBmaWxsID0gU2V4bywgZ3JvdXA9IFNleG8sIGxhYmVsID0gZm9ybWF0b19wZXNvcyhJT1BfaHIsIGRlYyA9IDApICkpICsKIyAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiMgIGdlb21fdGV4dChwb3NpdGlvbiA9cG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0tLjEsIHNpemUgPSA0KSArCiMgIHRoZW1lX21pbmltYWwoKSArCiMgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCkpICsKIyAgbGFicyh5ID0gJ0luZ3Jlc28gSG9yYXJpbycsIHggPSAiIikgKwojICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArCiMgIGxhYnMoY2FwdGlvbiA9ICJGdWVudGU6IEVsYWJvcmFjacOzbiBwcm9waWEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpCgpnZ3Bsb3QodGFibGE3LjFfYWx0MiwgYWVzKHggPSBNdWplcmVzLCB4ZW5kID0gVmFyb25lcywgeSA9IENBTElGSUNBQ0lPTiwgZ3JvdXAgPSBDQUxJRklDQUNJT04sIGxhYmVsID0gYnJlY2hhKSkgKwogIGdlb21fZHVtYmJlbGwoY29sb3I9ICIjODA4MDgwIiwKICAgICAgICAgICAgICAgIHNpemVfeCA9IDMsIHNpemVfeGVuZCA9IDMsCiAgICAgICAgICAgICAgICBjb2xvdXJfeCA9IGNvbG9yZXNbMV0sCiAgICAgICAgICAgICAgICBjb2xvdXJfeGVuZCA9IGNvbG9yZXNbMl0pICsKICBnZW9tX3RleHQoYWVzKHgsIENBTElGSUNBQ0lPTiwgbGFiZWwgPSBicmVjaGEpLCBudWRnZV95ID0gLjIpKwogIGxhYnMoeD0iSW5ncmVzbyBNZW5zdWFsIiwKICAgICAgIHk9TlVMTCwgCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgRVBILUlOREVDIikrCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMpKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cmdnc2F2ZSgiR3JhZmljb3MvR3JhZmljbzZfaHIucG5nIikKYGBgCgo8YnI+CgojIyMgQnJlY2hhIGRlIGluZ3Jlc29zIGhvcmFyaW9zIHBvciBuaXZlbCBlZHVjYXRpdm8KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnRhYmxhOC4yX2FsdDIgPC0gdGFibGE4LjIgJT4lIAogIHNlbGVjdCgtSU9QX21lbnN1YWwpICU+JSAKICBzcHJlYWQoLiwgU2V4bywgSU9QX2hyKSAlPiUgCiAgbXV0YXRlKGJyZWNoYSA9IHBhc3RlMChmb3JtYXRvX3BvcmMoKFZhcm9uZXMtTXVqZXJlcykvVmFyb25lcyoxMDApLCAiJSIpLAogICAgICAgICB4ID0gKFZhcm9uZXMrTXVqZXJlcykvMikKYGBgCgpTaSBlc29zIG1pc21vcyBpbmdyZXNvcyBob3JhcmlvcyBkZSBsYXMvb3Mgb2N1cGFkYXMvb3Mgc2UgY29tcGFyYW4gc2Vnw7puIHN1IG5pdmVsIGVkdWNhdGl2bywgbGEgYnJlY2hhIHNlIG1hbnRpZW5lLCBhdW5xdWUgYSBuaXZlbGVzIG3DoXMgYmFqb3MsIHBhcmEgbGEgbWF5b3LDrWEgZGUgbG9zIG5pdmVsZXMuIFNpbiBlbWJhcmdvLCBjYWJlIHNlw7FhbGFyIHF1ZSBlbiBlbCBpbmZvcm1lIGNvcnJlc3BvbmRpZW50ZSBhbCBbNHRvIHRyaW1lc3RyZSAyMDE3XShodHRwOi8vcnB1YnMuY29tL25hdHN1bWlfc2hva2lkYS9jdWFydG9fdHJpbV8yMDE3KSwgZXN0ZSBtaXNtbyBpbmRpY2Fkb3IgcHJlc2VudGFiYSBicmVjaGFzIG1lbm9yZXMgZW4gdmFsb3IgYWJzb2x1dG8uIEVzdG8gcHVlZGUgZGViZXJzZSBhIGNpZXJ0YSB2b2xhdGlsaWRhZCBlbiBsYXMgaG9yYXMgZGUgdHJhYmFqbyBjYXB0YWRhcyBlbiBsYSBlbmN1ZXN0YS4gICAgICAgICAgCiAgICAgICAgICAgICAgICAgCl9fR3LDoWZpY28gNy5fXyBfT2N1cGFkYXMvb3MuIEJyZWNoYSBkZSBpbmdyZXNvcyBob3JhcmlvcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCwgcG9yIHNleG8geSBuaXZlbCBlZHVjYXRpdm8uIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KI2dncGxvdCh0YWJsYTguMiwgYWVzKHggPSBOSVZFTF9FRFVDQVRJVk8sIElPUF9ociwgZmlsbCA9IFNleG8sIGdyb3VwPSBTZXhvLCBsYWJlbCA9IGZvcm1hdG9fcGVzb3MoSU9QX2hyLCBkZWMgPSAwKSApKSsKIyAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSsKIyAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIHZqdXN0ID0tLjEsIHNpemUgPSA0KSsKIyAgdGhlbWVfbWluaW1hbCgpICsKIyAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSkgKwojICBsYWJzKHkgPSAnSW5ncmVzbyBIb3JhcmlvJywgeCA9ICIiKSArCiMgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMpICsKIyAgbGFicyhjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgRVBILUlOREVDIikKCmdncGxvdCh0YWJsYTguMl9hbHQyLCBhZXMoeCA9IE11amVyZXMsIHhlbmQgPSBWYXJvbmVzLCB5ID0gTklWRUxfRURVQ0FUSVZPLCBncm91cCA9IE5JVkVMX0VEVUNBVElWTywgbGFiZWwgPSBicmVjaGEpKSArCiAgZ2VvbV9kdW1iYmVsbChjb2xvcj0gIiM4MDgwODAiLAogICAgICAgICAgICAgICAgc2l6ZV94ID0gMywgc2l6ZV94ZW5kID0gMywKICAgICAgICAgICAgICAgIGNvbG91cl94ID0gY29sb3Jlc1sxXSwKICAgICAgICAgICAgICAgIGNvbG91cl94ZW5kID0gY29sb3Jlc1syXSkgKwogIGdlb21fdGV4dChhZXMoeCwgTklWRUxfRURVQ0FUSVZPLCBsYWJlbCA9IGJyZWNoYSksIG51ZGdlX3kgPSAuMikrCiAgbGFicyh4PSJJbmdyZXNvIE1lbnN1YWwiLAogICAgICAgeT1OVUxMLCAKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKSsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gY29sb3JlcykrCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dzYXZlKCJHcmFmaWNvcy9HcmFmaWNvN19oci5wbmciKQpgYGAKCkFsIGluY29ycG9yYXIgbGEgZXh0ZW5zacOzbiBkZSBsYXMgam9ybmFkYXMgbGFib3JhbGVzIGFsIGFuw6FsaXNpcywgbGEgbWFnbml0dWQgZGUgbGEgYnJlY2hhIGRpc21pbnV5ZSBub3RhYmxlbWVudGUuIERlIGFxdcOtIHNlIGRlc3ByZW5kZSBxdWUsIGVuIHByb21lZGlvLCBsYXMgbXVqZXJlcyB0cmFiYWphbiBtZW5vcyBob3JhcyBxdWUgbG9zIHZhcm9uZXMsIHkgZXN0byBleHBsaWNhIHVuYSBwYXJ0ZSBpbXBvcnRhbnRlIGRlIGxhIGJyZWNoYSBkZSBpbmdyZXNvcyBtZW5zdWFsZXMuIENhYmUgY3Vlc3Rpb25hcnNlIHJlc3BlY3RvIGFsIHBvcnF1w6kgZGUgbGEgZGlmZXJlbmNpYSBkZSBob3JhcyB0cmFiYWphZGFzIHBvciBtdWplcmVzIHkgcG9yIGhvbWJyZXMuIMK/RXhpc3RlIHVuYSBmYWx0YSBkZSB2b2x1bnRhZCBkZSBsYXMgbXVqZXJlcyBwYXJhIHRyYWJhamFyPyDCv3NvbiBtw6FzIGhvbGdhemFuYXM/IMK/byBlbiByZWFsaWRhZCBleGlzdGUgb3RybyBtb3Rpdm8gcG9yIGVsIGN1YWwgbGFzIG11amVyZXMgZGViZW4gcmVsZWdhciBzdXMgdHJhYmFqb3MsIGRlbCBjdWFsIGxvcyBob21icmVzIGVzdMOhbiBleGVudG9zPwoKPGJyPgoKIyMgRGlzdHJpYnVjacOzbiBkZSBsYXMgdGFyZWFzIGRlbCBob2dhcgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGFibGExMS4xX2dyYWYgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBsZWZ0X2pvaW4oLiwgYmFzZV9ob2dhciAlPiUgCiAgICAgICAgICAgICAgc2VsZWN0KENPRFVTVSwgTlJPX0hPR0FSLCBWSUkxXzEsIFZJSTFfMiksIGJ5ID0gYygiQ09EVVNVIiwgIk5ST19IT0dBUiIpKSAlPiUgCiAgbXV0YXRlKHByb3BvcmNpb24gPSBjYXNlX3doZW4oVklJMV8xID09IENPTVBPTkVOVEUgfCBWSUkxXzIgPT0gQ09NUE9ORU5URSB+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lIAogIHNlbGVjdChTZXhvLCBwcm9wb3JjaW9uLCBQT05ERVJBKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogICAgc3VtbWFyaXNlKHByb3BvcmNpb24gPSBzdW0ocHJvcG9yY2lvbipQT05ERVJBKSkgJT4lIAogICAgbXV0YXRlKHByb3BvcmNpb24gPSByb3VuZChwcm9wb3JjaW9uL3N1bShwcm9wb3JjaW9uKSoxMDAsIDApKQoKaW5saW5lXzIyIDwtIHRhYmxhMTEuMV9ncmFmJHByb3BvcmNpb25bdGFibGExMS4xX2dyYWYkU2V4byA9PSAiTXVqZXJlcyJdCmlubGluZV8yMyA8LSB0YWJsYTExLjFfZ3JhZiRwcm9wb3JjaW9uW3RhYmxhMTEuMV9ncmFmJFNleG8gPT0gIlZhcm9uZXMiXQpgYGAKCkdlbmVyYWxtZW50ZSwgbGFzIG11amVyZXMgZGViZW4gYWRlbcOhcyBkZWRpY2FyIHN1IHRpZW1wbyBhbCB0cmFiYWpvIGRvbcOpc3RpY28uIEVzIGRlY2lyLCByZWFsaXphbiB0YXJlYXMgZGUgY3VpZGFkbyB5IHJlcHJvZHVjY2nDs24gcGFyYSBvdHJvcyBtaWVtYnJvcyBkZSBzdSBob2dhci4gRXN0ZSB0cmFiYWpvIG5vIHNlIGNvbWVyY2lhIGVuIGVsIG1lcmNhZG8geSBwb3IgdGFudG8gbm8gZXMgcmVtdW5lcmFkby4gQSBtb2RvIGlsdXN0cmF0aXZvLCBzZSBzZcOxYWxhIHF1ZTogZGVsIHRvdGFsIGRlIHBlcnNvbmFzIHF1ZSByZWFsaXphbiBsYXMgdGFyZWFzIGRlIGxhIGNhc2EsIHVuIGByIGlubGluZV8yMmAlIHNvbiBtdWplcmVzIHkgdW4gYHIgaW5saW5lXzIzYCUgc29uIHZhcm9uZXMuIEVzdGUgcmVwYXJ0byBkZXNpZ3VhbCBkZSBsYXMgdGFyZWFzIGRvbcOpc3RpY2FzIGVudHJlIHZhcm9uZXMgeSBtdWplcmVzIHB1ZWRlIGFzb2NpYXJzZSBhIGxhcyBkZXNpZ3VhbGRhZGVzIHZpc3RhcyBlbiBsYSBjb21wb3NpY2nDs24gZGVsIG1lcmNhZG8gZGUgdHJhYmFqbyB5IGxhIGRpZmVyZW5jaWEgZGUgbGEgZXh0ZW5zacOzbiBkZSBsYSBqb3JuYWRhIGxhYm9yYWwuICAgICAgICAgICAKICAgICAgICAgICAgICAKX19HcsOhZmljbyA4Ll9fIF9QZXJzb25hcyBxdWUgcmVhbGl6YW4gbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBkZWwgaG9nYXIsIHNlZ8O6biBzZXhvIChubyBpbmNsdXllIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvKS4gVG90YWwgZGUgYWdsb21lcmFkb3MgdXJiYW5vcy4gYHIgZGF0ZWAuXwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyBQcmVwIGRhdGEgKG5vdGhpbmcgdG8gY2hhbmdlIGhlcmUpCm5yb3dzIDwtIDEwCmRmIDwtIGV4cGFuZC5ncmlkKHggPSAxOm5yb3dzLCB5ID0gMTpucm93cykKZGYkU2V4byA8LSBmYWN0b3IocmVwKHRhYmxhMTEuMV9ncmFmJFNleG8sIHRhYmxhMTEuMV9ncmFmJHByb3BvcmNpb24pKSAgCiMjIFBsb3QKZ2dwbG90KGRmLCBhZXMoeCA9IHgsIHkgPSB5LCBmaWxsID0gU2V4bykpICsgCiAgICAgICAgZ2VvbV90aWxlKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDAuNSkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApKSArCiAgICAgICAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCksIHRyYW5zID0gJ3JldmVyc2UnKSArCiAgICAgICAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gY29sb3JlcykgKwogIHRoZW1lX3ZvaWQoKSArCiAgbGFicyhjYXB0aW9uID0gIkZ1ZW50ZTogRWxhYm9yYWNpw7NuIHByb3BpYSBlbiBiYXNlIGEgRVBILUlOREVDIikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KZ2dzYXZlKCJHcmFmaWNvcy9HcmFmaWNvOC5wbmciLCBzY2FsZSA9IDMpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KdGFibGE5LjEgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoUFAwNEIxID09IDEpICU+JSAKICBtdXRhdGUoVG90YWwgPSBzdW0oUE9OREVSQSkpICU+JSAKICBncm91cF9ieShTZXhvKSAlPiUgCiAgc3VtbWFyaXNlKFByb3BvcmNpb24gPSBmb3JtYXRvX3BvcmMoc3VtKFBPTkRFUkEpL3VuaXF1ZShUb3RhbCkqMTAwKSkKCmlubGluZV8yNCA8LSB0YWJsYTkuMSRQcm9wb3JjaW9uW3RhYmxhOS4xJFNleG8gPT0gIk11amVyZXMiXQoKdGFibGE5LjJfZ3JhZiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihFU1RBRE8gPT0gMSwKICAgICAgICAgU2V4byA9PSAiTXVqZXJlcyIpICU+JSAKICBtdXRhdGUoc2VydmljaW8uZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDRCMSAhPSAxIH4gIk5vIikpICU+JSAKICBncm91cF9ieShzZXJ2aWNpby5kb21lc3RpY28pICU+JSAKICBzdW1tYXJpc2UoZnJlY3VlbmNpYSA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShwcm9wb3JjaW9uID0gcm91bmQoZnJlY3VlbmNpYS9zdW0oZnJlY3VlbmNpYSkqMTAwLCAwKSkKCmlubGluZV8yNSA8LSB0YWJsYTkuMl9ncmFmJHByb3BvcmNpb25bdGFibGE5LjJfZ3JhZiRzZXJ2aWNpby5kb21lc3RpY28gPT0gIlPDrSJdCmBgYAoKQSBlc3RvIHNlIHN1bWEgZWwgaGVjaG8gZGUgcXVlIHByw6FjdGljYW1lbnRlIHRvZGFzIGxhcyBwZXJzb25hcyBxdWUgc2UgZGVkaWNhbiBhbCBzZXJ2aWNpbyBkb23DqXN0aWNvIChlcyBkZWNpciwgcXVlIHPDrSB2ZW5kZW4gZXN0ZSB0cmFiYWpvIGVuIGVsIG1lcmNhZG8pIHNvbiBtdWplcmVzLCB1biBgciBpbmxpbmVfMjRgJS4gQXNpbWlzbW8sIGRlbCB0b3RhbCBkZSBtdWplcmVzIG9jdXBhZGFzLCB1biBgciBpbmxpbmVfMjVgJSBzZSBkZWRpY2EgYSBlc3RhIG9jdXBhY2nDs24sIGNvbmZvcm1hbmRvIGVudG9uY2VzIHVuYSBzYWxpZGEgbGFib3JhbCBwb3B1bGFyLgoKX19HcsOhZmljbyA5Ll9fIF9PY3VwYWRhcywgc2Vnw7puIHNpIHByZXN0YW4gbyBubyBzZXJ2aWNpb3MgZG9tw6lzdGljb3MgZW4gaG9nYXJlcyBwYXJ0aWN1bGFyZXMuIFRvdGFsIGRlIGFnbG9tZXJhZG9zIHVyYmFub3MuIGByIGRhdGVgLl8KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY29sb3JlczIgPSBjKCIjRkUxNzY0IiwiIzgwODA4MCIpCgojIyBQcmVwIGRhdGEgKG5vdGhpbmcgdG8gY2hhbmdlIGhlcmUpCm5yb3dzIDwtIDEwCmRmIDwtIGV4cGFuZC5ncmlkKHggPSAxOm5yb3dzLCB5ID0gMTpucm93cykKZGYkc2VydmljaW8uZG9tZXN0aWNvIDwtIGZhY3RvcihyZXAodGFibGE5LjJfZ3JhZiRzZXJ2aWNpby5kb21lc3RpY28sIHRhYmxhOS4yX2dyYWYkcHJvcG9yY2lvbikpICAKIyMgUGxvdApnZ3Bsb3QoZGYsIGFlcyh4ID0geCwgeSA9IHksIGZpbGwgPSBzZXJ2aWNpby5kb21lc3RpY28pKSArIAogICAgICAgIGdlb21fdGlsZShjb2xvciA9ICJibGFjayIsIHNpemUgPSAwLjUpICsKICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKwogICAgICAgIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsIDApLCB0cmFucyA9ICdyZXZlcnNlJykgKwogICAgICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yZXMyKSArCiAgdGhlbWVfdm9pZCgpICsKICBsYWJzKGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKSArCiAgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKHRpdGxlPSJUcmFiYWphbiBlbiBTZXJ2aWNpbyBEb23DqXN0aWNvPyIpKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3NhdmUoIkdyYWZpY29zL0dyYWZpY285LnBuZyIsIHNjYWxlID0gMykKYGBgCgo8YnI+CgojIyBEaXN0cmlidWNpw7NuIGRlbCBpbmdyZXNvCgpQb3Igw7psdGltbywgcG9kZW1vcyB2ZXIgZWwgZWZlY3RvIGRlIGVzdGFzIGRpZmVyZW5jaWFzIGVuIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGluZ3Jlc29zLiBFbiBwcmltZXIgbHVnYXIsIHNlIHNlcGFyYSBhIGxhIHBvYmxhY2nDs24gZW4gZGVjaWxlcyBzZWfDum4gZWwgaW5ncmVzbyB0b3RhbCBpbmRpdmlkdWFsLiBFcyBkZWNpciwgc2UgZm9ybWFuIGRpZXogZ3J1cG9zIGRlIGlndWFsIHRhbWHDsW8sIG9yZGVuYWRvcyBzZWfDum4gZWwgbml2ZWwgZGUgaW5ncmVzb3MgcXVlIHBlcmNpYmUgY2FkYSBpbmRpdmlkdW8uIFB1ZWRlIHZlcnNlIHF1ZSBsb3MgZGVjaWxlcyBtw6FzIGJham9zIGRlIGluZ3Jlc29zIGVzdMOhbiBjb21wdWVzdG9zIG1heW9yaXRhcmlhbWVudGUgcG9yIG11amVyZXMgeSwgZW4gcGFyYWxlbG8sIGxvcyBkZWNpbGVzIGRlIG1heW9yZXMgaW5ncmVzb3Mgc2UgY29tcG9uZW4gbWF5b3JpdGFyaWFtZW50ZSBwb3IgdmFyb25lcy4gTG9zIGVzdHJhdG9zIGRlIG1lbm9yZXMgaW5ncmVzb3MgZXN0w6FuIGVudG9uY2VzIGZlbWluaXphZG9zLCBhbCB0aWVtcG8gcXVlIGxvcyBlc3RyYXRvcyBkZSBtYXlvcmVzIGluZ3Jlc29zIHNlIGVuY3VlbnRyYW4gbWFzY3VsaW5pemFkb3MuICAgIAogICAgICAgICAgICAgCl9fR3LDoWZpY28gMTAuX18gX1BvYmxhY2nDs24gcGVyY2VwdG9yYSBkZSBpbmdyZXNvcy4gQ29tcG9zaWNpw7NuIHNlZ8O6biBzZXhvIGRlIGxvcyBkZWNpbGVzIGRlIGluZ3Jlc29zIHRvdGFsZXMgaW5kaXZpZHVhbGVzLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRhYmxhMTIuMV9ncmFmIDwtYmFzZV9pbmRpdmlkdWFsICU+JSAKICAgIHNlbGVjdChERUNJTkRSLCBQNDdULCBQT05ESUksIFNleG8pICU+JSAKICAgIGZpbHRlcihERUNJTkRSICVpbiUgYygxOjEwKSkgJT4lIAogIGdyb3VwX2J5KERFQ0lORFIpICU+JSAKICBtdXRhdGUoUG9iID0gc3VtKFBPTkRJSSkpICU+JSAKICBncm91cF9ieShERUNJTkRSLCBTZXhvKSAlPiUKICBzdW1tYXJpc2UoUHJvcCA9IHN1bShQT05ESUkpL3VuaXF1ZShQb2IpKQoKZ2dwbG90KHRhYmxhMTIuMV9ncmFmLCBhZXMoeCA9IERFQ0lORFIsIFByb3AsIGZpbGwgPSBTZXhvLCBncm91cD0gU2V4bywgbGFiZWwgPSBwYXN0ZTAoZm9ybWF0b19wb3JjKFByb3AqMTAwKSwgIiUiKSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpKwogIAogIGdlb21fdGV4dChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLCB2anVzdCA9LS4xLCBzaXplID0gMi41KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh5ID0gJycpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoIkRlY2lsIGRlIGluZ3Jlc28gdG90YWwiLCBicmVha3MgPWMoMToxMCkpICsKICBsYWJzKGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3NhdmUoIkdyYWZpY29zL0dyYWZpY28xMC5wbmciLCBzY2FsZSA9IDEpCmBgYAoKRW4gc2VndW5kbyBsdWdhciBzZSBvcmRlbmEgcG9yIGRlY2lsZXMgYSBsb3MgaG9nYXJlcyAobm8gYSBsb3MgaW5kaXZpZHVvcyksIGRlIGFjdWVyZG8gYWwgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhci4gRXN0ZSBlcyBlbCBpbmdyZXNvIHRvdGFsIGRlbCBob2dhciwgZGl2aWRpZG8gcG9yIGxhIGNhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBsbyBjb21wb25lbi4gRW4gZWwgZ3LDoWZpY28gMTEgc2UgcHVlZGUgb2JzZXJ2YXIgbGEgcHJvcG9yY2nDs24gZGUgbXVqZXJlcyB5IGRlIHZhcm9uZXMgcXVlIGNvbXBvbmVuIGNhZGEgZGVjaWwuICAgICAgICAKRW4gZXN0ZSBjYXNvLCBubyBoYXkgZGlmZXJlbmNpYXMgZGVzdGFjYWJsZXMgbcOhcyBhbGzDoSBkZSB1bmEgbGV2ZSBwcmVwb25kZXJhbmNpYSBkZSBsYXMgbXVqZXJlcyBlbiB0b2RvcyBsb3MgZGVjaWxlcywgZXhwbGljYWJsZSBwb3IgY3Vlc3Rpb25lcyBkZW1vZ3LDoWZpY2FzIChoYXkgbcOhcyBtdWplcmVzIHF1ZSB2YXJvbmVzIGVuIGxhIHBvYmxhY2nDs24gZ2VuZXJhbCkuIMK/Q3XDoWwgZXMgbGEgZGlmZXJlbmNpYSByZXNwZWN0byBkZWwgZ3LDoWZpY28gYW50ZXJpb3I/ICAgICAgICAKTG9zIGluZ3Jlc29zIHF1ZSBlbiBhcXVlbCBncsOhZmljbyBzZSBkaXN0aW5ndcOtYW4gc2Vnw7puIGVsIHNleG8gZGUgcXVpw6luIGxvcyBwZXJjaWLDrWEsIGVuIGVzdGUgw7psdGltbyBncsOhZmljbyBzZSBlbmN1ZW50cmFuIGRpc3RyaWJ1w61kb3MgZW50cmUgdG9kb3MgbG9zIG1pZW1icm9zIGRlbCBob2dhci4gRGUgZXN0YSBmb3JtYSwgbGEgY29tcG9zaWNpw7NuIHBvciBzZXhvIGRlIGxvcyBlc3RyYXRvcyBkZSBtZW5vcmVzIGluZ3Jlc29zIG5vIHRpZW5lIG1heW9yZXMgZGlmZXJlbmNpYXMgcmVzcGVjdG8gYSBsYSBkZSBsb3MgZXN0cmF0b3MgZGUgbWF5b3JlcyBpbmdyZXNvcy4gTGEgdW5pZGFkIGZhbWlsaWFyIHBhcmVjZSByZXNvbHZlciBsYSBkaWZlcmVuY2lhIGVudHJlIHNleG9zIHF1ZSBzZSB2ZcOtYSBlbiBlbCBncsOhZmljbyBhbnRlcmlvciwgcGVybyBlcyBkZW50cm8gZGUgw6lzdGEgcXVlIHNlIG1hbnRpZW5lIGxhIGRpZmVyZW5jaWE6IGRlIGFjdWVyZG8gYSB0b2RvIGxvIHZpc3RvIGFudGVyaW9ybWVudGUsIGxvcyB2YXJvbmVzIHRpZW5lbiBtw6FzIHByb2JhYmlsaWRhZGVzIGRlIGdhbmFyIG3DoXMgcXVlIGxhcyBtdWplcmVzIGRlbCBob2dhci4gTGEgZGlzdHJpYnVjacOzbiBkZSBsb3MgaW5ncmVzb3MgZGUgbGFzIG11amVyZXMsIHNlc2dhZGEgaGFjaWEgbG9zIG1lbm9yZXMgaW5ncmVzb3MsIHNlIGNvbXBlbnNhIGVuIGxhIGVzdHJ1Y3R1cmEgZmFtaWxpYXIgY29uIGxhIGRpc3RyaWJ1Y2nDs24gZGUgbG9zIGluZ3Jlc29zIGRlIGxvcyB2YXJvbmVzLCBzZXNnYWRhIGhhY2lhIGxvcyBtYXlvcmVzIGluZ3Jlc29zLiBFbnRvbmNlcywgbGEgdW5pZGFkIGZhbWlsaWFyIGVzY29uZGUgeSByZXN1ZWx2ZSBkZWJham8gZGUgbGEgc3VwZXJmaWNpZSAobGEgZGlzdHJpYnVjacOzbiBhcGFyZW50ZW1lbnRlIGVxdWl0YXRpdmEgc2Vnw7puIGxvcyBpbmdyZXNvcyBwZXIgY8OhcGl0YSkgbGEgaW5lcXVpdGF0aXZhIGRpc3RyaWJ1Y2nDs24gZGUgbGFzIHRhcmVhcyBkZSByZXByb2R1Y2Npw7NuIHkgbGFzIGRpZmljdWx0YWRlcyBhc29jaWFkYXMgcXVlIHRpZW5lbiBsYXMgbXVqZXJlcyBwYXJhIHBhcnRpY2lwYXIgZGUgZm9ybWEgcGxlbmEgZW4gZWwgbWVyY2FkbyBkZSB0cmFiYWpvLiAgIAogICAgICAgICAgICAKX19HcsOhZmljbyAxMS5fXyBfVG90YWwgZGUgbGEgcG9ibGFjacOzbi4gQ29tcG9zaWNpw7NuIHNlZ8O6biBzZXhvIGRlIGxvcyBkZWNpbGVzIGRlbCBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyLiBUb3RhbCBkZSBhZ2xvbWVyYWRvcyB1cmJhbm9zLiBgciBkYXRlYC5fCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnRhYmxhMTMuMV9ncmFmIDwtYmFzZV9pbmRpdmlkdWFsICU+JSAKICBzZWxlY3QoREVDQ0ZSLCBJUENGLCBQT05ESUgsIFNleG8pICU+JSAKICBmaWx0ZXIoREVDQ0ZSICVpbiUgYygxOjEwKSkgJT4lIAogIGdyb3VwX2J5KERFQ0NGUikgJT4lIAogIG11dGF0ZShQb2IgPSBzdW0oUE9ORElIKSkgJT4lIAogIGdyb3VwX2J5KERFQ0NGUiwgU2V4bykgJT4lCiAgc3VtbWFyaXNlKFByb3AgPSBzdW0oUE9ORElIKS91bmlxdWUoUG9iKSkKCmdncGxvdCh0YWJsYTEzLjFfZ3JhZiwgYWVzKHggPSBERUNDRlIsIFByb3AsIGZpbGwgPSBTZXhvLCBncm91cD0gU2V4bywgbGFiZWwgPSBwYXN0ZTAoZm9ybWF0b19wb3JjKFByb3AqMTAwKSwgIiUiKSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgdmp1c3QgPS0uMSwgc2l6ZSA9IDIuNSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh5ID0gJycpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcmVzKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCJEZWNpbCBkZWwgSW5ncmVzbyBQZXIgQ8OhcGl0YSBGYW1pbGlhciIsIGJyZWFrcyA9IGMoMToxMCkpICsKICBsYWJzKGNhcHRpb24gPSAiRnVlbnRlOiBFbGFib3JhY2nDs24gcHJvcGlhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3NhdmUoIkdyYWZpY29zL0dyYWZpY28xMS5wbmciLCBzY2FsZSA9IDEpCmBgYAoKW14xXTogX1ByZXNpb25hbmRvIGVuXyAgX19Db2RlID4gRG93bmxvYWQgUm1kX18gX3NlIGFjY2VkZSBhIGxhIGRlc2NhcmdhIGRlIGxhIHNpbnRheGlzIGNvbXBsZXRhIGRlIGVzdGUgaW5mb3JtZSwgcXVlIGluY2x1eWUgbGEgZGVzY2FyZ2EgYXV0b23DoXRpY2EgZGUgbGFzIGJhc2VzIGRlIGxhIEVQSCB1dGlsaXphZGFzLCB1bmEgc2VyaWUgZGUgZnVuY2lvbmVzIMO6dGlsZXMgeSBsYSBlbGFib3JhY2nDs24gZGUgY3VhZHJvcyB5IGdyw6FmaWNvcyBjb24gZWwgbGVuZ3VhamUgUi5fICAgIAo=