Secciones

Introducción


Introducción



El presente informe tiene como objetivo visibilizar las condiciones de trabajo, ingresos, y principales características de las trabajadoras que prestan servicio doméstico en hogares particulares. Para ello se presentan diversos indicadores, cuadros y gráficos de elaboración propia respondiendo a preguntas como ¿Cuántas personas se dedican a brindar servicios domésticos en hogares?, ¿Qué tan feminizado se encuentra el sector?, ¿Tienen jornadas completas de trabajo?, ¿Cuánto cobran por mes?¿Y por hora?, ¿Qué tanto se respetan sus derechos laborales?, ¿También son quienes realizan las tareas domésticas en su propio hogar?, ¿Son el principal sostén económico de sus hogares?, y también se realiza una comparación con otras ramas de ocupaciones.

Para realizar los cálculos se utilizan bases de datos publicadas por la Encuesta Permanente de Hogares del INDEC, en este caso referidas al 3er trimestre de 2019. Esta encuesta releva características demográficas, sociales, económicas, con especial atención a las formas de participación en el mercado laboral, entre hogares y personas de 31 aglomerados urbanos (pensémoslo como las grandes ciudades del país). El documento se realizó utilizando el lenguaje de programación R, y para les curioses todo el código se encuentra disponible para su descarga.

Este reporte puede volverse un poco técnico por momentos, pero seguramente desde Economía Femini(s)ta realicemos también otras notas de carácter divulgatorio. Obviamente, estás invitade a utilizar estos datos en notas, reflexiones, trabajos, infografías, etc1. Además, si te gusta lo que hacemos podés apoyarnos potenciando nuestros proyectos, haciéndote socie del #ClubEcofeminita o realizando una donación.

Trabajadoras de servicio doméstico


Trabajadoras de servicio doméstico



El interés por analizar distintas características de las trabajadoras de servicio doméstico radica principalmente en la magnitud que dicha ocupación presenta, en su estrecho vínculo con la división sexual del trabajo y la feminización de este sector y, como veremos luego, por las particularmente diferenciadas condiciones, acceso a derechos y bajos ingresos que perciben a cambio de su trabajo. Entre las grandes ciudades del país, pueden contarse más de 900 mil personas que componen al sector (¡esto es el equivalente a más de 13 canchas de River llenas!). A su vez, la tasa de feminidad del sector es del 97,9%. Es decir que casi en su totalidad se trata de trabajadoras mujeres. Es por esto que, a lo largo de todo el informe, utilizaremos pronombres femeninos a la hora de generalizar, aunque muchas veces estemos hablando del conjunto de les trabajadores que se dedican a esta actividad. A su vez, cabe destacar que el ejercicio debe ser realizado en términos cis-binarios por falta de información respecto de las identidades trans-travesti en las estadísticas oficiales.

Las trabajadoras que realizan tareas domésticas y de cuidado en hogares particulares representan un 17% dentro del total de ocupadas mujeres. Esto significa que una de cada 6 ocupadas en Argentina trabaja en este sector de la economía. Al mismo tiempo, estas más de 900.000 trabajadoras representan un 22% dentro del total de ocupadas-asalariadas. O sea que dentro de las mujeres que trabajan en relación de dependencia, 1 de cada 5 tiene como ocupación principal el trabajo en hogares particulares. Como veremos más adelante, se trata de la ocupación más popular entre las mujeres.


Cantidad de personas que se dedican al servicio doméstico

852.841

Porcentaje de mujeres y de varones en el sector

Sexo Porcentaje
Mujeres 97,2
Varones 2,8

Porcentaje de la ocupación dentro de las ocupadas mujeres

¿Se dedica al servicio doméstico? Porcentaje
No 83,9
16,1

Porcentaje de la ocupación dentro de las asalariadas mujeres

¿Se dedica al servicio doméstico? Porcentaje
No 78,8
21,2

Características


Algunas características de las trabajadoras de servicio doméstico



En esta sección se presentan algunas métricas respecto a la distribución etaria, el lugar de nacimiento y características educativas de las trabajadoras del sector de servicio doméstico. Se destacan la sobrerrepresentación de migrantes en el sector, y las dificultades de sostener estudio y trabajo en paralelo si se trabaja en esta rama ocupacional.


Edad


Mientras que casi la mitad de estas trabajadoras tienen entre 30 y 49 años, un 31% tiene entre 50 y 64 años. Por su parte, hay un 5,4% que continúa trabajando a pesar de haber superar los 65 años, y un 16.6% está compuesto por jóvenes que no llegan a los 30 años. Este último grupo está compuesto por más de 150 mil jóvenes.


Composicion por edad de las trabajadoras del servicio doméstico

Edad Cantidad Porcentaje
de 14 a 29 años 146.271 17,2
de 30 a 49 años 397.864 46,7
de 50 a 64 años 266.084 31,2
65 años y más 42.622 5,0
Lugar de nacimiento


Considerando a la población en general, casi un 12% se encuentra viviendo en una provincia distinta a la que tiene como lugar de nacimiento, y un 3,5% proviene de un país limítrofe. Por su parte, en el caso de las trabajadoras de servicio doméstico, casi un 20% ha migrado de provincia y casi un 10% proviene de un país limítrofe, es decir que las personas migrantes se encuentran sobrerrepresentadas en dicho sector de la economía. Puede observarse entonces que la ocupación está estrechamente relacionada con los fenómenos migratorios.


Lugar de nacimiento de las trabajadoras de servicio doméstico y del total de la población

Trabajadoras de Servicio Doméstico
Población general
¿Dónde nació? Cantidad Porcentaje Cantidad Porcentaje
En esta localidad 510.239 59,8 21.159.904 75,6
En otra localidad de esta provincia 51.945 6,1 1.885.879 6,7
En otra provincia 165.174 19,4 3.382.741 12,1
En un país limítrofe 89.415 10,5 973.853 3,5

Nota: Las estimaciones correspondientes a aquellas personas que han nacido en otro país (no limítrofe) y aquellas que NS/NR la pregunta, no cuentan con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro las categorías.

Educación


Más de la mitad de las trabajadoras del sector finalizó el nivel primario de escolaridad, a lo que se suma un 35,7% que cuenta también con el nivel secundario, en tanto un 7,7% no posee instrucción formal.


Composicion por nivel educativo de las trabajadoras del servicio doméstico

Nivel educativo Cantidad Porcentaje
Sin Instrucción 59.923 7,0
Primaria 448.747 52,6
Secundaria 312.013 36,6

Nota: La estimación correspondiente a aquellas que han finalizado un nivel superior de formación no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría.


Las jóvenes y su formación educativa

Entre las más jóvenes del sector, aquellas que tienen entre 14 y 29 años, alrededor del 75% no asiste actualmente a un establecimiento educativo aunque asistió en el pasado, mientras que un 23,4% (casi 1 de cada 4) estudia al mismo tiempo que se desempeña como trabajadora de servicio doméstico. Este indicador se ubica 9 puntos por debajo de la correspondiente para aquellas jóvenes que no se dedican a esta tarea en particular. En promedio, parece más difícil sostener estudio y trabajo en paralelo si se trabaja en el sector que estamos analizando. Esto se refleja también en la posibilidad de acceder a estudios superiores: entre las mujeres jóvenes que trabajan y estudian la mayoría se encuentra cursando un terciario o una carrera universitaria, seguidas por las que se encuentran finalizando el secundario o el polimodal. Sin embargo, entre aquellas que se dedican a brindar servicio doméstico un 65,5% está cursando un terciario/universitario, en tanto entre aquellas que se dedican a otra ocupación esta cifra asciende al 85,5%.


Mujeres jóvenes del servicio doméstico por asistencia a establecimiento educativo

¿Asiste a un establecimiento educativo? Cantidad Porcentaje
Asiste actualmente 37.918 26,6
No asiste, pero asistió en el pasado 104.865 73,4

Nota: La estimación correspondiente a aquellas que nunca asistieron a un establecimiento educativo no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría.


Ocupadas jóvenes según si se dedican al servicio doméstico y su respectiva tasa de asistencia a un establecimiento educativo

¿Se dedica al servicio doméstico? Tasa de asistencia a est. educativo
No 31,6
26,6

Nota: La estimación correspondiente a aquellas que nunca asistieron a un establecimiento educativo no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría.


Ocupadas jóvenes que estudian según si se dedican al servicio doméstico, y qué nivel se encuentran cursando

¿Se dedica al servicio doméstico? Secundario/Polimodal Terciario/Universitario
No 11,2 87,9
24,5 75,5

Nota: Las estimaciones correspondientes a otros niveles educativos en curso no cuentan con suficientes casos muestrales como para garantizar significatividad de los datos, por lo que se las ha retirado del cuadro.

Intensidad del trabajo


Intensidad del trabajo de las trabajadoras de servicio doméstico



En relación a la cantidad de horas que trabajan semanalmente las empleadas domésticas, un 54,1% son ocupadas “plenas”, es decir que trabajan entre 35 y 45 horas semanales, o están conformes con la cantidad de horas que trabajan. Al mismo tiempo un 33,2% se encuentra sub-ocupada, trabaja menos de 35 horas semanales por causas involuntarias, estando dispuestas a trabajar más horas. Por su parte, un 10,5% está sobre-ocupada, trabaja más de 45 horas por semana.

En cuanto a la cantidad de hogares en que se desempeñan, un 71,4% trabaja en una sola casa, por lo que al mismo tiempo casi un 30% de ellas trabaja en más de una vivienda. Mientras que las que son contratadas por un sólo hogar trabajan cerca de 25 horas semanales (jornada part-time), aquellas que trabajan en más de una casa trabajan en promedio menos de 18 horas por semana en la ocupación principal, acercándose a las 24 o 26 horas semanales con las ocupaciones secundarias.


Trabajadoras de servicio doméstico según intensidad del trabajo

Intensidad Cantidad Porcentaje
Ocupadas plenas 446.044 52,3
Sobreocupadas 92.907 10,9
Subocupadas por insuficiencia horaria 288.756 33,9

Nota: La estimación correspondiente a aquellas que no trabajaron en la semana de referencia de la encuesta no cuenta con suficientes casos muestrales como para garantizar significatividad del dato, por lo que se ha retirado del cuadro la categoría.


Trabajadoras del servicio doméstico según la cantidad de hogares en los que trabajan

Cantidad de hogares en que trabaja Cantidad Porcentaje hs/sem en ocup. princ. hs/sem con ocup. secund.
1 613.959 74,2 23,5 23,9
2 132.123 16,0 17,9 26,5
3 o más 81.625 9,9 18,0 28,3

Derechos laborales


Derechos laborales de las trabajadoras de servicio doméstico



Dentro del conjunto de asalariades, un 34,5% no se encuentra registrade en la seguridad social. Esta tasa asciende al 36,1% cuando hablamos de las asalariadas mujeres, pero también puede observarse que la problemática es particularmente incisiva entre las trabajadoras domésticas: un 73,5% de ellas no percibe descuento jubilatorio. Asociado a esto, un 69,2% de estas trabajadoras no cuenta con vacaciones pagas, un 68,1% no percibe aguinaldos, un 72,2% no percibe el pago en caso de enfermedad, y un 72,6% no cuenta con cobertura de salud mediante obra social.


En ese trabajo tiene…

Indicador No
¿Tiene descuento jubilatorio? 27,4 72,6
¿Tiene vacaciones pagas? 30,1 69,9
¿Tiene aguinaldo? 32,5 67,5
¿Tiene días pagos por enfermedad? 28,5 71,5
¿Tiene obra social? 27,7 72,3

Ingresos


Ingresos de las trabajadoras de servicio doméstico



Las trabajadoras del sector perciben ingresos que, en promedio, rondan los $7.300 pesos mensuales por su ocupación principal. Al mismo tiempo, un 50% de ellas cobra $6.000 por mes por dicho trabajo. Esto equivale a que en promedio cobran unos $91 por hora, y el 50% cobra menos de $86 por hora. En el primer cuadro también pueden apreciarse los ingresos mensuales totales de fuente laboral (incluyendo ingresos de ocupaciones secundarias), los totales individuales (incluyendo ingresos que no provienen de una fuente laboral), los ingresos totales familiares que tienen en promedio los hogares de estas trabajadoras, y el ingreso per cápita familiar de estos mismos hogares.

En el segundo cuadro puede apreciarse que hay una amplia diferencia entre los ingresos que perciben en promedio las trabajadoras que se encuentran registradas respecto de aquellas que no, tanto en términos mensuales como por hora trabajada. Además, aquellas que tienen descuento jubilatorio trabajan más horas en su ocupación principal respecto que aquellas que no.

Si ordenamos al total de las personas ocupadas de acuerdo al nivel de ingresos que perciben por su ocupación principal, y las agrupamos en 10 grupos de igual tamaño, obtenemos los denominados deciles de ingreso. En el gráfico se muestra claramente que aquellas personas que trabajan en el sector de servicio doméstico se encuentran concentradas en los deciles de menores ingresos.

Ojo! Debe tenerse en cuenta que todos los montos están expresados en pesos del 3er trimestre de 2019.


Promedio y mediana de los ingresos de las trabajadoras de servicio doméstico y sus familias

Ingresos Ingreso promedio 50% cobra menos de
Mensuales, de la ocupación principal $7.991,72 $6.500,00
Por hora, de la ocupación principal $99,69 $93,33
Mensuales, total de fuente laboral $9.953,95 $8.000,00
Mensuales, ingreso total individual $12.967,50 $11.717,35
Mensuales, ingreso total familiar $38.815,00 $32.000,00
Mensuales, ingreso per cápita familiar $11.357,27 $9.773,67

Trabajadoras de servicio doméstico según si tienen descuento jubilatorio, sus ingresos y horas de trabajo promedio

¿Tiene descuento jubilatorio? Ingreso mensual promedio Ingreso por hora promedio hs/sem en ocup. princ.
$11.978,19 $109,61 28,7
No $6.599,40 $96,23 19,7

Trabajadoras de servicio domśtico según deciles de ingreso de la ocupación principal

Hogares


Algunas características referidas a los hogares de las trabajadoras de servicio doméstico



Si esta vez ordenamos al total de las personas de acuerdo a sus ingresos per cápita familiares (aquellos que surgen de dividir el total de ingresos de la familia por la cantidad de miembros de la misma), de menor a mayor, y las agrupamos en 10 grupos de igual tamaño, obtenemos otra escala de deciles. En este caso también se puede apreciar que las trabajadoras de servicio doméstico se concentran en los primeros deciles. Cabe destacar que los primeros tres deciles de esta escala suelen estar altamente relacionados con la situación de pobreza de los hogares (tomando como referencia la metodología oficial de cálculo de la misma).

Al mismo tiempo, mientras que un 58,3% no es el primer sostén económico del hogar, un 41,7% sí lo es. En ambos casos, la mayoría de ellas realizan las tareas domésticas en su hogar. Esto es así porque casi el 75% de quienes trabajan de forma remunerada realizando trabajo doméstico también están a cargo de la realización de este trabajo en sus hogares de manera no-asalariada, y por tanto no remunerada. Una posible interpretación de este fenómeno es que en muchos hogares donde el ingreso principal no alcanza para llegar a fin de mes, las mujeres que realizan las tareas domésticas del hogar complementan los ingresos realizando este trabajo en otros hogares de forma remunerada, habitualmente (como hemos visto en otro apartado) en jornadas parciales.


Trabajadoras de servicio domśtico según deciles de ingreso per cápita familiar


Trabajadoras de servicio doméstico según si perciben el ingreso principal de su grupo familiar y si son quienes realizan las tareas domésticas en su hogar

Comparación con otras ramas de la ocupación


Comparación con otras ramas de la ocupación



Es útil contextualizar muchos de los indicadores presentados realizando una comparación con otras ramas de ocupación. En esta sección se presenta una serie de gráficos que permiten realizar este ejercicio. En todos los casos se considera a la población asalariada, es decir a las personas que se desempeñan en el mercado laboral con una relación de dependencia, y teniendo en cuenta las características de la ocupación principal de estas personas.

Se destaca que el sector de servicio doméstico es uno de los más importantes del mercado laboral. También se trata de la rama más feminizada, es la que más proporción ocupa dentro de las trabajadoras mujeres y la menos popular entre los varones. También es la rama que presenta la tasa de no-registro más alta, y los ingresos promedios más bajos, tanto de bolsillo como por hora trabajada.


Cantidad de trabajadores

Tasa de feminización

Proporción entre las asalariadas mujeres

Proporción entre los asalariados varones

Tasa de no registro de la relación laboral

Ingresos mensuales promedio

Ingresos por hora promedio


  1. Si necesitás citarnos en un trabajo, podés hacerlo como: “Shokida, Natsumi S. (05/03/2020) Las trabajadoras de servicio doméstico en Argentina. 3er trimestre de 2019. Economía Femini(s)ta. Recuperado de https://ecofeminita.github.io/EcoFemiData/informe_servicio_domestico/trim_2019_03/informe.nb.html

LS0tCnRpdGxlOiAiTGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIGVuIEFyZ2VudGluYSIKc3VidGl0bGU6ICIzZXIgdHJpbWVzdHJlIGRlIDIwMTkiCmF1dGhvcjogIk5hdHN1bWkgU2hva2lkYSBwYXJhIEVjb25vbcOtYSBGZW1pbmkocyl0YSAtIE1heW8gZGUgMjAyMCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdGhlbWU6IGZsYXRseQp1cmxjb2xvcjogI0ZFMTc2NAotLS0KCjxzdHlsZT4KLm5hdj5saT5hIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgY29sb3I6ICNGRTE3NjQ7Cn0KCiAubmF2LXBpbGxzPmxpLmFjdGl2ZT5hLCAubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmhvdmVyLCAubmF2LXBpbGxzPmxpLmFjdGl2ZT5hOmZvY3VzIHsKICAgIGNvbG9yOiAjZmZmZmZmOwogICAgYmFja2dyb3VuZC1jb2xvcjogI0ZFMTc2NDsKfQo8L3N0eWxlPgoKLS0tCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpkYXRlIDwtICIzZXIgdHJpbWVzdHJlIGRlIDIwMTkiICAgICAgICAgICAgICAgICAgICAgICAgIyA8LS0tLS0tLS0tLS0tLS0tLS0KYGBgCgojIyBTZWNjaW9uZXMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMgSW50cm9kdWNjacOzbgoKLS0tCgojIyMjIEludHJvZHVjY2nDs24KPGJyPjxicj4KRWwgcHJlc2VudGUgaW5mb3JtZSB0aWVuZSBjb21vIG9iamV0aXZvIHZpc2liaWxpemFyIGxhcyBjb25kaWNpb25lcyBkZSB0cmFiYWpvLCBpbmdyZXNvcywgeSBwcmluY2lwYWxlcyBjYXJhY3RlcsOtc3RpY2FzIGRlIGxhcyB0cmFiYWphZG9yYXMgcXVlIHByZXN0YW4gc2VydmljaW8gZG9tw6lzdGljbyBlbiBob2dhcmVzIHBhcnRpY3VsYXJlcy4gUGFyYSBlbGxvIHNlIHByZXNlbnRhbiBkaXZlcnNvcyBpbmRpY2Fkb3JlcywgY3VhZHJvcyB5IGdyw6FmaWNvcyBkZSBlbGFib3JhY2nDs24gcHJvcGlhIHJlc3BvbmRpZW5kbyBhIHByZWd1bnRhcyBjb21vIMK/Q3XDoW50YXMgcGVyc29uYXMgc2UgZGVkaWNhbiBhIGJyaW5kYXIgc2VydmljaW9zIGRvbcOpc3RpY29zIGVuIGhvZ2FyZXM/LCDCv1F1w6kgdGFuIGZlbWluaXphZG8gc2UgZW5jdWVudHJhIGVsIHNlY3Rvcj8sIMK/VGllbmVuIGpvcm5hZGFzIGNvbXBsZXRhcyBkZSB0cmFiYWpvPywgwr9DdcOhbnRvIGNvYnJhbiBwb3IgbWVzP8K/WSBwb3IgaG9yYT8sIMK/UXXDqSB0YW50byBzZSByZXNwZXRhbiBzdXMgZGVyZWNob3MgbGFib3JhbGVzPywgwr9UYW1iacOpbiBzb24gcXVpZW5lcyByZWFsaXphbiBsYXMgdGFyZWFzIGRvbcOpc3RpY2FzIGVuIHN1IHByb3BpbyBob2dhcj8sIMK/U29uIGVsIHByaW5jaXBhbCBzb3N0w6luIGVjb27Ds21pY28gZGUgc3VzIGhvZ2FyZXM/LCB5IHRhbWJpw6luIHNlIHJlYWxpemEgdW5hIGNvbXBhcmFjacOzbiBjb24gb3RyYXMgcmFtYXMgZGUgb2N1cGFjaW9uZXMuCjxicj48YnI+ClBhcmEgcmVhbGl6YXIgbG9zIGPDoWxjdWxvcyBzZSB1dGlsaXphbiBiYXNlcyBkZSBkYXRvcyBwdWJsaWNhZGFzIHBvciBsYSBFbmN1ZXN0YSBQZXJtYW5lbnRlIGRlIEhvZ2FyZXMgZGVsIElOREVDLCBlbiBlc3RlIGNhc28gcmVmZXJpZGFzIGFsIGByIGRhdGVgLiBFc3RhIGVuY3Vlc3RhIHJlbGV2YSBjYXJhY3RlcsOtc3RpY2FzIGRlbW9ncsOhZmljYXMsIHNvY2lhbGVzLCBlY29uw7NtaWNhcywgY29uIGVzcGVjaWFsIGF0ZW5jacOzbiBhIGxhcyBmb3JtYXMgZGUgcGFydGljaXBhY2nDs24gZW4gZWwgbWVyY2FkbyBsYWJvcmFsLCBlbnRyZSBob2dhcmVzIHkgcGVyc29uYXMgZGUgMzEgYWdsb21lcmFkb3MgdXJiYW5vcyAocGVuc8OpbW9zbG8gY29tbyBsYXMgZ3JhbmRlcyBjaXVkYWRlcyBkZWwgcGHDrXMpLiBFbCBkb2N1bWVudG8gc2UgcmVhbGl6w7MgdXRpbGl6YW5kbyBlbCBsZW5ndWFqZSBkZSBwcm9ncmFtYWNpw7NuIFIsIHkgcGFyYSBsZXMgY3VyaW9zZXMgdG9kbyBlbCBjw7NkaWdvIHNlIGVuY3VlbnRyYSBkaXNwb25pYmxlIHBhcmEgc3UgZGVzY2FyZ2EuCjxicj48YnI+CkVzdGUgcmVwb3J0ZSBwdWVkZSB2b2x2ZXJzZSB1biBwb2NvIHTDqWNuaWNvIHBvciBtb21lbnRvcywgcGVybyBzZWd1cmFtZW50ZSBkZXNkZSBbRWNvbm9tw61hIEZlbWluaShzKXRhXShodHRwOi8vZWNvbm9taWFmZW1pbml0YS5jb20vKSByZWFsaWNlbW9zIHRhbWJpw6luIG90cmFzIG5vdGFzIGRlIGNhcsOhY3RlciBkaXZ1bGdhdG9yaW8uIE9idmlhbWVudGUsIGVzdMOhcyBpbnZpdGFkZSBhIHV0aWxpemFyIGVzdG9zIGRhdG9zIGVuIG5vdGFzLCByZWZsZXhpb25lcywgdHJhYmFqb3MsIGluZm9ncmFmw61hcywgZXRjXltTaSBuZWNlc2l0w6FzIGNpdGFybm9zIGVuIHVuIHRyYWJham8sIHBvZMOpcyBoYWNlcmxvIGNvbW86ICJTaG9raWRhLCBOYXRzdW1pIFMuICgwNS8wMy8yMDIwKSBMYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gZW4gQXJnZW50aW5hLiBgciBkYXRlYC4gX0Vjb25vbcOtYSBGZW1pbmkocyl0YV8uIFJlY3VwZXJhZG8gZGUgaHR0cHM6Ly9lY29mZW1pbml0YS5naXRodWIuaW8vRWNvRmVtaURhdGEvaW5mb3JtZV9zZXJ2aWNpb19kb21lc3RpY28vdHJpbV8yMDE5XzAzL2luZm9ybWUubmIuaHRtbCJdLiBBZGVtw6FzLCBzaSB0ZSBndXN0YSBsbyBxdWUgaGFjZW1vcyBwb2TDqXMgYXBveWFybm9zIHBvdGVuY2lhbmRvIG51ZXN0cm9zIHByb3llY3RvcywgaGFjacOpbmRvdGUgc29jaWUgZGVsIFsjQ2x1YkVjb2ZlbWluaXRhIG8gcmVhbGl6YW5kbyB1bmEgZG9uYWNpw7NuXShodHRwczovL2RvbmFyb25saW5lLm9yZy9lY29ub21pYS1mZW1pbmktcy10YS9jbHViLWVjb2ZlbWluaXRhKS4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgU2UgY2FyZ2FuIGxpYnJlcsOtYXMgw7p0aWxlcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShodHRyKQpsaWJyYXJ5KHN0cmluZ3IpCiMgbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShoYXZlbikKIyBsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShnZ3RoZW1lcykKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoZ2dhbHQpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShmb3JtYXR0YWJsZSkKbGlicmFyeShxdWVzdGlvbnIpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShlcGgpICMgVW4gcGFxdWV0ZSBwYXJhIHRyYWJhamFyIGNvbiBsYXMgYmFzZXMgZGUgbGEgRW5jdWVzdGEgcGVybWFuZW50ZSBkZSBIb2dhcmVzIQojIENvbW8gZnVlbnRlIHRvbWFtb3MgdW4gc2NyaXB0IGNvbiBlbCBjw7NkaWdvIHF1ZSBwZXJtaXRlIGNvbnN0cnVpciBsYXMgcmFtYXMgZGUgbGEgb2N1cGFjacOzbiBkZSBhY3VlcmRvIGFsIG5vbWVuY2xhZG9yLCB5IG90cm8gY29uIGZ1bmNpb25lcyBkZSBmb3JtYXRvIHBhcmEgbG9zIGRhdG9zLgpzb3VyY2UoIi4uLy4uL1IvZnVuY2lvbmVzIHJhbWEuUiIpIApzb3VyY2UoIi4uLy4uL1IvZnVuY2lvbmVzIGZvcm1hdG8uUiIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBDYXJnbyBiYXNlIGRlIEVQSCBjb24gZWwgcGFxdWV0ZSBlcGgKYmFzZV9pbmRpdmlkdWFsIDwtIGVwaDo6Z2V0X21pY3JvZGF0YSh5ZWFyID0gMjAxOSwgdHJpbWVzdGVyID0gMywgdHlwZSA9ICAiaW5kaXZpZHVhbCIpICMgPC0tLS0tLS0tLS0tLS0tLS0tCmJhc2VfaG9nYXIgPC0gZXBoOjpnZXRfbWljcm9kYXRhKHllYXIgPSAyMDE5LCB0cmltZXN0ZXIgPSAzLCB0eXBlID0gICJob2dhciIpICAgICAgICAgICAjIDwtLS0tLS0tLS0tLS0tLS0tLQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIE1vZGlmaWNhY2lvbmVzIGVuIGxhIGJhc2UgZGUgaW5kaXZpZHVvcwpiYXNlX2luZGl2aWR1YWwgPC0gYmFzZV9pbmRpdmlkdWFsICU+JSAKICBtdXRhdGUoU2V4byA9IGFzLmNoYXJhY3RlcihDSDA0KSwKICAgICAgICAgU2V4byA9IGNhc2Vfd2hlbihTZXhvPT0iMSIgfiAiVmFyb25lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgU2V4bz09IjIiIH4gIk11amVyZXMiKSwKICAgICAgICAgTklWRUxfRURVQ0FUSVZPID0gY2FzZV93aGVuKE5JVkVMX0VEICVpbiUgYygxLCA3KSB+ICJTaW4gSW5zdHJ1Y2Npw7NuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JVkVMX0VEICVpbiUgYygyLCAzKSB+ICJQcmltYXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCAlaW4lIGMoNCwgNSkgfiAiU2VjdW5kYXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSVZFTF9FRCA9PSA2ICAgICAgICAgfiAiU3VwZXJpb3IiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklWRUxfRUQgPT0gOSAgICAgICAgIH4gIk5TL05SIiksCiAgICAgICAgIE5JVkVMX0VEVUNBVElWTyA9IGZhY3RvcihOSVZFTF9FRFVDQVRJVk8sIGxldmVscyA9IGMoIlNpbiBJbnN0cnVjY2nDs24iLCAiUHJpbWFyaWEiLCAiU2VjdW5kYXJpYSIsICJTdXBlcmlvciIpKSwKICAgICAgICAgR1JVUE9fRURBRCA9IGNhc2Vfd2hlbihDSDA2ID49IDE0ICYgQ0gwNiA8PSAyOSB+ICJkZSAxNCBhIDI5IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDMwICYgQ0gwNiA8PSA0OSB+ICJkZSAzMCBhIDQ5IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDUwICYgQ0gwNiA8PSA2NCB+ICJkZSA1MCBhIDY0IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDA2ID49IDY1ICAgICAgICAgICAgICB+ICI2NSBhw7FvcyB5IG3DoXMiKSwKICAgICAgICAgR1JVUE9fRURBRCA9IGZhY3RvcihHUlVQT19FREFELCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJkZSAxNCBhIDI5IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZSAzMCBhIDQ5IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZSA1MCBhIDY0IGHDsW9zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NSBhw7FvcyB5IG3DoXMiKSksCiAgICAgICAgIERPTkRFX05BQ0lPID0gY2FzZV93aGVuKENIMTUgPT0gMSB+ICJFbiBlc3RhIGxvY2FsaWRhZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTUgPT0gMiB+ICJFbiBvdHJhIGxvY2FsaWRhZCBkZSBlc3RhIHByb3ZpbmNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTUgPT0gMyB+ICJFbiBvdHJhIHByb3ZpbmNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTUgPT0gNCB+ICJFbiB1biBwYcOtcyBsaW3DrXRyb2ZlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gxNSA9PSA1IH4gIkVuIG90cm8gcGHDrXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDE1ID09IDkgfiAiTlMvTlIiKSwKICAgICAgICAgRE9OREVfTkFDSU8gPSBmYWN0b3IoRE9OREVfTkFDSU8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkVuIGVzdGEgbG9jYWxpZGFkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW4gb3RyYSBsb2NhbGlkYWQgZGUgZXN0YSBwcm92aW5jaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbiBvdHJhIHByb3ZpbmNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuIHVuIHBhw61zIGxpbcOtdHJvZmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbiBvdHJvIHBhw61zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTlMvTlIiKSksCiAgICAgICAgIFZhY2FjaW9uZXNfcGFnYXMgPSBjYXNlX3doZW4oUFAwN0cxID09IDEgfiAiU8OtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA3RzEgPT0gMiB+ICJObyIpLAogICAgICAgICBBZ3VpbmFsZG8gPSBjYXNlX3doZW4oUFAwN0cyID09IDEgfiAiU8OtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDdHMiA9PSAyIH4gIk5vIiksCiAgICAgICAgIERpYXNfZW5mZXJtZWRhZCA9IGNhc2Vfd2hlbihQUDA3RzMgPT0gMSB+ICJTw60iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwN0czID09IDIgfiAiTm8iKSwKICAgICAgICAgT2JyYV9zb2NpYWwgPSBjYXNlX3doZW4oUFAwN0c0ID09IDEgfiAiU8OtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwN0c0ID09IDIgfiAiTm8iKSwKICAgICAgICAgRGVzY3VlbnRvX2p1YmlsYXRvcmlvID0gY2FzZV93aGVuKFBQMDdIID09IDEgfiAiU8OtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDdIID09IDIgfiAiTm8iKSkKCiMgY29sb3JlcyA9IGMoIiNhYTE2NWEiLCIjMTZhYTY2IikKY29sb3JlcyA9IGMoIiNGRTE3NjQiLCAiIzAwQkRENiIpCmBgYAoKIyMjIFRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIAoKLS0tCgojIyMjIFRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIAo8YnI+PGJyPgpFbCBpbnRlcsOpcyBwb3IgYW5hbGl6YXIgZGlzdGludGFzIGNhcmFjdGVyw61zdGljYXMgZGUgbGFzIHRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHJhZGljYSBwcmluY2lwYWxtZW50ZSBlbiBsYSBtYWduaXR1ZCBxdWUgZGljaGEgb2N1cGFjacOzbiBwcmVzZW50YSwgZW4gc3UgZXN0cmVjaG8gdsOtbmN1bG8gY29uIGxhIGRpdmlzacOzbiBzZXh1YWwgZGVsIHRyYWJham8geSBsYSBmZW1pbml6YWNpw7NuIGRlIGVzdGUgc2VjdG9yIHksIGNvbW8gdmVyZW1vcyBsdWVnbywgcG9yIGxhcyBwYXJ0aWN1bGFybWVudGUgZGlmZXJlbmNpYWRhcyBjb25kaWNpb25lcywgYWNjZXNvIGEgZGVyZWNob3MgeSBiYWpvcyBpbmdyZXNvcyBxdWUgcGVyY2liZW4gYSBjYW1iaW8gZGUgc3UgdHJhYmFqby4gRW50cmUgbGFzIGdyYW5kZXMgY2l1ZGFkZXMgZGVsIHBhw61zLCBwdWVkZW4gY29udGFyc2UgX19tw6FzIGRlIDkwMCBtaWwgcGVyc29uYXMgcXVlIGNvbXBvbmVuIGFsIHNlY3RvciAowqFlc3RvIGVzIGVsIGVxdWl2YWxlbnRlIGEgbcOhcyBkZSAxMyBjYW5jaGFzIGRlIFJpdmVyIGxsZW5hcyEpX18uIEEgc3UgdmV6LCBsYSB0YXNhIGRlIGZlbWluaWRhZCBkZWwgc2VjdG9yIGVzIGRlbCA5Nyw5JS4gRXMgZGVjaXIgcXVlIF9fY2FzaSBlbiBzdSB0b3RhbGlkYWQgc2UgdHJhdGEgZGUgdHJhYmFqYWRvcmFzIG11amVyZXNfXy4gRXMgcG9yIGVzdG8gcXVlLCBhIGxvIGxhcmdvIGRlIHRvZG8gZWwgaW5mb3JtZSwgdXRpbGl6YXJlbW9zIHByb25vbWJyZXMgZmVtZW5pbm9zIGEgbGEgaG9yYSBkZSBnZW5lcmFsaXphciwgYXVucXVlIG11Y2hhcyB2ZWNlcyBlc3RlbW9zIGhhYmxhbmRvIGRlbCBjb25qdW50byBkZSBsZXMgdHJhYmFqYWRvcmVzIHF1ZSBzZSBkZWRpY2FuIGEgZXN0YSBhY3RpdmlkYWQuIEEgc3UgdmV6LCBjYWJlIGRlc3RhY2FyIHF1ZSBlbCBlamVyY2ljaW8gZGViZSBzZXIgcmVhbGl6YWRvIGVuIHTDqXJtaW5vcyBjaXMtYmluYXJpb3MgcG9yIGZhbHRhIGRlIGluZm9ybWFjacOzbiByZXNwZWN0byBkZSBsYXMgaWRlbnRpZGFkZXMgdHJhbnMtdHJhdmVzdGkgZW4gbGFzIGVzdGFkw61zdGljYXMgb2ZpY2lhbGVzLgo8YnI+PGJyPgpMYXMgdHJhYmFqYWRvcmFzIHF1ZSByZWFsaXphbiB0YXJlYXMgZG9tw6lzdGljYXMgeSBkZSBjdWlkYWRvIGVuIGhvZ2FyZXMgcGFydGljdWxhcmVzIHJlcHJlc2VudGFuIHVuIDE3JSBkZW50cm8gZGVsIHRvdGFsIGRlIG9jdXBhZGFzIG11amVyZXMuIEVzdG8gc2lnbmlmaWNhIHF1ZSBfX3VuYSBkZSBjYWRhIDYgb2N1cGFkYXMgZW4gQXJnZW50aW5hIHRyYWJhamEgZW4gZXN0ZSBzZWN0b3IgZGUgbGEgZWNvbm9tw61hX18uIEFsIG1pc21vIHRpZW1wbywgZXN0YXMgbcOhcyBkZSA5MDAuMDAwIHRyYWJhamFkb3JhcyByZXByZXNlbnRhbiB1biAyMiUgZGVudHJvIGRlbCB0b3RhbCBkZSBvY3VwYWRhcy1hc2FsYXJpYWRhcy4gTyBzZWEgcXVlIGRlbnRybyBkZSBsYXMgbXVqZXJlcyBxdWUgdHJhYmFqYW4gZW4gcmVsYWNpw7NuIGRlIGRlcGVuZGVuY2lhLCAxIGRlIGNhZGEgNSB0aWVuZSBjb21vIG9jdXBhY2nDs24gcHJpbmNpcGFsIGVsIHRyYWJham8gZW4gaG9nYXJlcyBwYXJ0aWN1bGFyZXMuIENvbW8gdmVyZW1vcyBtw6FzIGFkZWxhbnRlLCBzZSB0cmF0YSBkZSBfX2xhIG9jdXBhY2nDs24gbcOhcyBwb3B1bGFyIGVudHJlIGxhcyBtdWplcmVzX18uIAoKLS0tCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIEFybWFtb3MgdW5hIG1pbmkgYmFzZSBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHV0aWxpemFuZG8gbGEgcHJlZ3VudGEgUFAwNEIxLCBxdWUgaWRlbnRpZmljYSBhIGxhcyBwZXJzb25hcyBxdWUgcHJlc3RhbiBzZXJ2aWNpbyBkb23DqXN0aWNvIGVuIGhvZ2FyZXMgcGFydGljdWxhcmVzLiAKCnNlcnYuZG9tIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKFBQMDRCMSA9PSAxKQojIENvbnRhbW9zIGNvbiAxODk5IGNhc29zIG11ZXN0cmFsZXMKIyBMdWVnbywgYSBsYSBob3JhIGRlIHRyYWJhamFyIGNvbiBlbCBjbGFzaWZpY2Fkb3IgZGUgYWN0aXZpZGFkZXMsIHNlIGVuY3VlbnRyYW4gbcOhcyBjYXNvcyBlbiAiQWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyBkZSBwZXJzb25hbCBkb23DqXN0aWNvIiwgcGVybyBzZSB2ZXLDoSBxdWUgc2UgdHJhdGEgZGUgY2Fzb3MgcXVlIG5vIHJlc3BvbmRpZXJvbiBlbiBjdcOhbnRhcyBjYXNhcyB0cmFiYWphbi4KCnRhYmxlKHNlcnYuZG9tJEVTVEFETywgc2Vydi5kb20kQ0FUX09DVVAsIGV4Y2x1ZGUgPSBOVUxMKQojIFRvZGFzIG9jdXBhZGFzIC0gYXNhbGFyaWFkYXMuIApgYGAKCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX0NhbnRpZGFkIGRlIHBlcnNvbmFzIHF1ZSBzZSBkZWRpY2FuIGFsIHNlcnZpY2lvIGRvbcOpc3RpY29fXzwvcD4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2Vydi5kb20gJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoc3VtKFBPTkRFUkEpKSkgJT4lIAogIGthYmxlKGFsaWduID0gImMiLCAgY29sLm5hbWVzID0gTlVMTCkgJT4lIAogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSA1MCkgJT4lIAogIHJvd19zcGVjKHJvdyA9IDEsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiIzAwQkRENiIpCmBgYAoKLS0tCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+X19Qb3JjZW50YWplIGRlIG11amVyZXMgeSBkZSB2YXJvbmVzIGVuIGVsIHNlY3Rvcl9fPC9wPgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzZXJ2LmRvbSAlPiUgCiAgbXV0YXRlKFRvdGFsID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKHN1bShQT05ERVJBKS91bmlxdWUoVG90YWwpKjEwMCkpICU+JSAKICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIAogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0ZFMTc2NCIpCmBgYAoKLS0tCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+X19Qb3JjZW50YWplIGRlIGxhIG9jdXBhY2nDs24gZGVudHJvIGRlIGxhcyBvY3VwYWRhcyBtdWplcmVzX188L3A+CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJhc2VfaW5kaXZpZHVhbCAlPiUgCiAgZmlsdGVyKEVTVEFETyA9PSAxLAogICAgICAgICBTZXhvID09ICJNdWplcmVzIikgJT4lIAogIG11dGF0ZShTZXJ2aWNpb19kb21lc3RpY28gPSBjYXNlX3doZW4oUFAwNEIxID09IDEgfiAiU8OtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQMDRCMSAhPSAxIH4gIk5vIikpICU+JSAKICBncm91cF9ieShTZXJ2aWNpb19kb21lc3RpY28pICU+JSAKICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSAKICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkpICU+JSAKICBzZWxlY3QoIsK/U2UgZGVkaWNhIGFsIHNlcnZpY2lvIGRvbcOpc3RpY28/IiA9IFNlcnZpY2lvX2RvbWVzdGljbywKICAgICAgICAgUG9yY2VudGFqZSkgJT4lIAogIGthYmxlKGFsaWduID0gImMiKSAlPiUgCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRkUxNzY0IikKYGBgCgotLS0KCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX1BvcmNlbnRhamUgZGUgbGEgb2N1cGFjacOzbiBkZW50cm8gZGUgbGFzIGFzYWxhcmlhZGFzIG11amVyZXNfXzwvcD4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoRVNUQURPID09IDEsCiAgICAgICAgIENBVF9PQ1VQID09IDMsCiAgICAgICAgIFNleG8gPT0gIk11amVyZXMiKSAlPiUgCiAgbXV0YXRlKFNlcnZpY2lvX2RvbWVzdGljbyA9IGNhc2Vfd2hlbihQUDA0QjEgPT0gMSB+ICJTw60iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIxICE9IDEgfiAiTm8iKSkgJT4lIAogIGdyb3VwX2J5KFNlcnZpY2lvX2RvbWVzdGljbykgJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIAogIHNlbGVjdCgiwr9TZSBkZWRpY2EgYWwgc2VydmljaW8gZG9tw6lzdGljbz8iID0gU2VydmljaW9fZG9tZXN0aWNvLAogICAgICAgICBQb3JjZW50YWplKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSAKICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNGRTE3NjQiKQpgYGAKCiMjIyBDYXJhY3RlcsOtc3RpY2FzIAoKLS0tCgojIyMjIEFsZ3VuYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9Cjxicj48YnI+CkVuIGVzdGEgc2VjY2nDs24gc2UgcHJlc2VudGFuIGFsZ3VuYXMgbcOpdHJpY2FzIHJlc3BlY3RvIGEgbGEgZGlzdHJpYnVjacOzbiBldGFyaWEsIGVsIGx1Z2FyIGRlIG5hY2ltaWVudG8geSBjYXJhY3RlcsOtc3RpY2FzIGVkdWNhdGl2YXMgZGUgbGFzIHRyYWJhamFkb3JhcyBkZWwgc2VjdG9yIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28uIFNlIGRlc3RhY2FuIGxhIHNvYnJlcnJlcHJlc2VudGFjacOzbiBkZSBtaWdyYW50ZXMgZW4gZWwgc2VjdG9yLCB5IGxhcyBkaWZpY3VsdGFkZXMgZGUgc29zdGVuZXIgZXN0dWRpbyB5IHRyYWJham8gZW4gcGFyYWxlbG8gc2kgc2UgdHJhYmFqYSBlbiBlc3RhIHJhbWEgb2N1cGFjaW9uYWwuCgotLS0KCiMjIyMjIEVkYWQKPGJyPgpNaWVudHJhcyBxdWUgY2FzaSBsYSBtaXRhZCBkZSBlc3RhcyB0cmFiYWphZG9yYXMgdGllbmVuIGVudHJlIDMwIHkgNDkgYcOxb3MsIHVuIDMxJSB0aWVuZSBlbnRyZSA1MCB5IDY0IGHDsW9zLiBQb3Igc3UgcGFydGUsIGhheSB1biA1LDQlIHF1ZSBjb250aW7DumEgdHJhYmFqYW5kbyBhIHBlc2FyIGRlIGhhYmVyIHN1cGVyYXIgbG9zIDY1IGHDsW9zLCB5IHVuIDE2LjYlIGVzdMOhIGNvbXB1ZXN0byBwb3IgasOzdmVuZXMgcXVlIG5vIGxsZWdhbiBhIGxvcyAzMCBhw7Fvcy4gRXN0ZSDDumx0aW1vIGdydXBvIGVzdMOhIGNvbXB1ZXN0byBwb3IgbcOhcyBkZSAxNTAgbWlsIGrDs3ZlbmVzLgoKLS0tCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+X19Db21wb3NpY2lvbiBwb3IgZWRhZCBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlbCBzZXJ2aWNpbyBkb23DqXN0aWNvX188L3A+CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNlcnYuZG9tICU+JSAKICBncm91cF9ieShHUlVQT19FREFEKSAlPiUgCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLAogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUKICBzZWxlY3QoRWRhZCA9IEdSVVBPX0VEQUQsIENhbnRpZGFkLCBQb3JjZW50YWplKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSAKICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNGRTE3NjQiKQpgYGAKCiMjIyMjIEx1Z2FyIGRlIG5hY2ltaWVudG8KPGJyPgpDb25zaWRlcmFuZG8gYSBsYSBwb2JsYWNpw7NuIGVuIGdlbmVyYWwsIGNhc2kgdW4gMTIlIHNlIGVuY3VlbnRyYSB2aXZpZW5kbyBlbiB1bmEgcHJvdmluY2lhIGRpc3RpbnRhIGEgbGEgcXVlIHRpZW5lIGNvbW8gbHVnYXIgZGUgbmFjaW1pZW50bywgeSB1biAzLDUlIHByb3ZpZW5lIGRlIHVuIHBhw61zIGxpbcOtdHJvZmUuIFBvciBzdSBwYXJ0ZSwgX19lbiBlbCBjYXNvIGRlIGxhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljb19fLCBjYXNpIHVuIDIwJSBoYSBtaWdyYWRvIGRlIHByb3ZpbmNpYSB5IGNhc2kgdW4gMTAlIHByb3ZpZW5lIGRlIHVuIHBhw61zIGxpbcOtdHJvZmUsIGVzIGRlY2lyIHF1ZSBfX2xhcyBwZXJzb25hcyBtaWdyYW50ZXMgc2UgZW5jdWVudHJhbiBzb2JyZXJyZXByZXNlbnRhZGFzIGVuIGRpY2hvIHNlY3RvciBkZSBsYSBlY29ub23DrWFfXy4gUHVlZGUgb2JzZXJ2YXJzZSBlbnRvbmNlcyBxdWUgbGEgb2N1cGFjacOzbiBlc3TDoSBlc3RyZWNoYW1lbnRlIHJlbGFjaW9uYWRhIGNvbiBsb3MgZmVuw7NtZW5vcyBtaWdyYXRvcmlvcy4KCi0tLQoKPHAgc3R5bGU9ImNvbG9yOiNGRTE3NjQiPl9fTHVnYXIgZGUgbmFjaW1pZW50byBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28geSBkZWwgdG90YWwgZGUgbGEgcG9ibGFjacOzbl9fPC9wPgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFRhYmxhIGludGVybWVkaWEuIENhc29zIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28uIENoZXF1ZW8gY2FudGlkYWRlcyBtdWVzdHJhbGVzLgp0YWJsYTEgPC0gc2Vydi5kb20gJT4lIAogIGdyb3VwX2J5KERPTkRFX05BQ0lPKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpLAogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSwKICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIAogIHNlbGVjdChET05ERV9OQUNJTywgQ2FudGlkYWQsIFBvcmNlbnRhamUpCgojIFRhYmxhIGludGVybWVkaWEuIFRvZG9zIGxvcyBjYXNvcy4gQ2hlcXVlbyBjYW50aWRhZGVzIG11ZXN0cmFsZXMuCnRhYmxhMiA8LSBiYXNlX2luZGl2aWR1YWwgJT4lIAogIGdyb3VwX2J5KERPTkRFX05BQ0lPKSAlPiUgCiAgc3VtbWFyaXNlKG49bigpLAogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSwKICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIAogIHNlbGVjdChET05ERV9OQUNJTywgQ2FudGlkYWQsIFBvcmNlbnRhamUpCgpsZWZ0X2pvaW4odGFibGExLCB0YWJsYTIsIGJ5ID0gIkRPTkRFX05BQ0lPIikgJT4lIAogIGZpbHRlcihET05ERV9OQUNJTyAhPSAiRW4gb3RybyBwYcOtcyIsCiAgICAgICAgIERPTkRFX05BQ0lPICE9ICJOUy9OUiIpICU+JSAKICBzZWxlY3QoIsK/RMOzbmRlIG5hY2nDsz8iID0gRE9OREVfTkFDSU8sCiAgICAgICAgICJDYW50aWRhZCIgPSBDYW50aWRhZC54LAogICAgICAgICAiUG9yY2VudGFqZSIgPSBQb3JjZW50YWplLngsCiAgICAgICAgICJDYW50aWRhZCIgPSBDYW50aWRhZC55LAogICAgICAgICAiUG9yY2VudGFqZSIgPSBQb3JjZW50YWplLnkpICU+JSAKICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIAogIGFkZF9oZWFkZXJfYWJvdmUoYygiICAgICAgIiA9IDEsICJUcmFiYWphZG9yYXMgZGUgU2VydmljaW8gRG9tw6lzdGljbyIgPSAyLCAiUG9ibGFjacOzbiBnZW5lcmFsIiA9IDIpLCAKICAgICAgICAgICAgICAgICAgIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0ZFMTc2NCIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSAKICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNGRTE3NjQiKQpgYGAKCl9Ob3RhOiBMYXMgZXN0aW1hY2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMgYSBhcXVlbGxhcyBwZXJzb25hcyBxdWUgaGFuIG5hY2lkbyBlbiBvdHJvIHBhw61zIChubyBsaW3DrXRyb2ZlKSB5IGFxdWVsbGFzIHF1ZSBOUy9OUiBsYSBwcmVndW50YSwgbm8gY3VlbnRhbiBjb24gc3VmaWNpZW50ZXMgY2Fzb3MgbXVlc3RyYWxlcyBjb21vIHBhcmEgZ2FyYW50aXphciBzaWduaWZpY2F0aXZpZGFkIGRlbCBkYXRvLCBwb3IgbG8gcXVlIHNlIGhhIHJldGlyYWRvIGRlbCBjdWFkcm8gbGFzIGNhdGVnb3LDrWFzLl8gICAgIAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kcm0odGFibGExLCB0YWJsYTIpCmBgYAoKIyMjIyMgRWR1Y2FjacOzbgo8YnI+Ck3DoXMgZGUgbGEgbWl0YWQgZGUgbGFzIHRyYWJhamFkb3JhcyBkZWwgc2VjdG9yIGZpbmFsaXrDsyBlbCBuaXZlbCBwcmltYXJpbyBkZSBlc2NvbGFyaWRhZCwgYSBsbyBxdWUgc2Ugc3VtYSB1biAzNSw3JSBxdWUgY3VlbnRhIHRhbWJpw6luIGNvbiBlbCBuaXZlbCBzZWN1bmRhcmlvLCBlbiB0YW50byB1biA3LDclIG5vIHBvc2VlIGluc3RydWNjacOzbiBmb3JtYWwuCgotLS0KCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX0NvbXBvc2ljaW9uIHBvciBuaXZlbCBlZHVjYXRpdm8gZGUgbGFzIHRyYWJhamFkb3JhcyBkZWwgc2VydmljaW8gZG9tw6lzdGljb19fPC9wPgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkoTklWRUxfRURVQ0FUSVZPKSAlPiUgCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLAogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUKICBmaWx0ZXIoTklWRUxfRURVQ0FUSVZPICE9ICJTdXBlcmlvciIpICU+JSAKICBzZWxlY3QoIk5pdmVsIGVkdWNhdGl2byIgPSBOSVZFTF9FRFVDQVRJVk8sIENhbnRpZGFkLCBQb3JjZW50YWplKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSAKICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNGRTE3NjQiKQpgYGAKCl9Ob3RhOiBMYSBlc3RpbWFjacOzbiBjb3JyZXNwb25kaWVudGUgYSBhcXVlbGxhcyBxdWUgaGFuIGZpbmFsaXphZG8gdW4gbml2ZWwgc3VwZXJpb3IgZGUgZm9ybWFjacOzbiBubyBjdWVudGEgY29uIHN1ZmljaWVudGVzIGNhc29zIG11ZXN0cmFsZXMgY29tbyBwYXJhIGdhcmFudGl6YXIgc2lnbmlmaWNhdGl2aWRhZCBkZWwgZGF0bywgcG9yIGxvIHF1ZSBzZSBoYSByZXRpcmFkbyBkZWwgY3VhZHJvIGxhIGNhdGVnb3LDrWEuXwoKLS0tCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+X19MYXMgasOzdmVuZXMgeSBzdSBmb3JtYWNpw7NuIGVkdWNhdGl2YV9fPC9wPiAgICAgICAgICAgICAgIAoKRW50cmUgX19sYXMgbcOhcyBqw7N2ZW5lcyBkZWwgc2VjdG9yLCBhcXVlbGxhcyBxdWUgdGllbmVuIGVudHJlIDE0IHkgMjkgYcOxb3NfXywgYWxyZWRlZG9yIGRlbCA3NSUgbm8gYXNpc3RlIGFjdHVhbG1lbnRlIGEgdW4gZXN0YWJsZWNpbWllbnRvIGVkdWNhdGl2byBhdW5xdWUgYXNpc3Rpw7MgZW4gZWwgcGFzYWRvLCBtaWVudHJhcyBxdWUgX191biAyMyw0JSAoY2FzaSAxIGRlIGNhZGEgNCkgZXN0dWRpYSBhbCBtaXNtbyB0aWVtcG8gcXVlIHNlIGRlc2VtcGXDsWEgY29tbyB0cmFiYWphZG9yYSBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvX18uIEVzdGUgaW5kaWNhZG9yIHNlIHViaWNhIDkgcHVudG9zIHBvciBkZWJham8gZGUgbGEgY29ycmVzcG9uZGllbnRlIHBhcmEgYXF1ZWxsYXMgasOzdmVuZXMgcXVlIG5vIHNlIGRlZGljYW4gYSBlc3RhIHRhcmVhIGVuIHBhcnRpY3VsYXIuIEVuIHByb21lZGlvLCBfX3BhcmVjZSBtw6FzIGRpZsOtY2lsIHNvc3RlbmVyIGVzdHVkaW8geSB0cmFiYWpvIGVuIHBhcmFsZWxvIHNpIHNlIHRyYWJhamEgZW4gZWwgc2VjdG9yIHF1ZSBlc3RhbW9zIGFuYWxpemFuZG9fXy4gRXN0byBzZSByZWZsZWphIHRhbWJpw6luIGVuIGxhIHBvc2liaWxpZGFkIGRlIGFjY2VkZXIgYSBlc3R1ZGlvcyBzdXBlcmlvcmVzOiBlbnRyZSBsYXMgbXVqZXJlcyBqw7N2ZW5lcyBxdWUgdHJhYmFqYW4geSBlc3R1ZGlhbiBsYSBtYXlvcsOtYSBzZSBlbmN1ZW50cmEgY3Vyc2FuZG8gdW4gdGVyY2lhcmlvIG8gdW5hIGNhcnJlcmEgdW5pdmVyc2l0YXJpYSwgc2VndWlkYXMgcG9yIGxhcyBxdWUgc2UgZW5jdWVudHJhbiBmaW5hbGl6YW5kbyBlbCBzZWN1bmRhcmlvIG8gZWwgcG9saW1vZGFsLiBTaW4gZW1iYXJnbywgZW50cmUgYXF1ZWxsYXMgcXVlIHNlIGRlZGljYW4gYSBicmluZGFyIHNlcnZpY2lvIGRvbcOpc3RpY28gdW4gNjUsNSUgZXN0w6EgY3Vyc2FuZG8gdW4gdGVyY2lhcmlvL3VuaXZlcnNpdGFyaW8sIGVuIHRhbnRvIGVudHJlIGFxdWVsbGFzIHF1ZSBzZSBkZWRpY2FuIGEgb3RyYSBvY3VwYWNpw7NuIGVzdGEgY2lmcmEgYXNjaWVuZGUgYWwgODUsNSUuCgotLS0KCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX011amVyZXMgasOzdmVuZXMgZGVsIHNlcnZpY2lvIGRvbcOpc3RpY28gcG9yIGFzaXN0ZW5jaWEgYSBlc3RhYmxlY2ltaWVudG8gZWR1Y2F0aXZvX188L3A+CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnNlcnYuZG9tICU+JSAKICBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIsCiAgICAgICAgIEdSVVBPX0VEQUQgPT0gImRlIDE0IGEgMjkgYcOxb3MiKSAlPiUgCiAgbXV0YXRlKEFzaXN0ZW5jaWEgPSBjYXNlX3doZW4oQ0gxMCA9PSAxIH4gIkFzaXN0ZSBhY3R1YWxtZW50ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gxMCA9PSAyIH4gIk5vIGFzaXN0ZSwgcGVybyBhc2lzdGnDsyBlbiBlbCBwYXNhZG8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTAgPT0gMyB+ICJOdW5jYSBhc2lzdGnDsyIpKSAlPiUgCiAgZ3JvdXBfYnkoQXNpc3RlbmNpYSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLAogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSwKICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIAogIGZpbHRlcihBc2lzdGVuY2lhICE9ICJOdW5jYSBhc2lzdGnDsyIpICU+JSAKICBzZWxlY3QoIsK/QXNpc3RlIGEgdW4gZXN0YWJsZWNpbWllbnRvIGVkdWNhdGl2bz8iID0gQXNpc3RlbmNpYSwKICAgICAgICAgQ2FudGlkYWQsIFBvcmNlbnRhamUpICU+JSAKICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIAogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0ZFMTc2NCIpCmBgYApfTm90YTogTGEgZXN0aW1hY2nDs24gY29ycmVzcG9uZGllbnRlIGEgYXF1ZWxsYXMgcXVlIG51bmNhIGFzaXN0aWVyb24gYSB1biBlc3RhYmxlY2ltaWVudG8gZWR1Y2F0aXZvIG5vIGN1ZW50YSBjb24gc3VmaWNpZW50ZXMgY2Fzb3MgbXVlc3RyYWxlcyBjb21vIHBhcmEgZ2FyYW50aXphciBzaWduaWZpY2F0aXZpZGFkIGRlbCBkYXRvLCBwb3IgbG8gcXVlIHNlIGhhIHJldGlyYWRvIGRlbCBjdWFkcm8gbGEgY2F0ZWdvcsOtYS5fICAgICAgICAgCgotLS0KICAgCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX09jdXBhZGFzIGrDs3ZlbmVzIHNlZ8O6biBzaSBzZSBkZWRpY2FuIGFsIHNlcnZpY2lvIGRvbcOpc3RpY28geSBzdSByZXNwZWN0aXZhIHRhc2EgZGUgYXNpc3RlbmNpYSBhIHVuIGVzdGFibGVjaW1pZW50byBlZHVjYXRpdm9fXzwvcD4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmFzZV9pbmRpdmlkdWFsICU+JSAKICBmaWx0ZXIoU2V4byA9PSAiTXVqZXJlcyIsCiAgICAgICAgIEdSVVBPX0VEQUQgPT0gImRlIDE0IGEgMjkgYcOxb3MiLAogICAgICAgICBFU1RBRE8gPT0gMSkgJT4lIAogIG11dGF0ZShBc2lzdGVuY2lhID0gY2FzZV93aGVuKENIMTAgPT0gMSB+ICJBc2lzdGUgYWN0dWFsbWVudGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTAgPT0gMiB+ICJObyBhc2lzdGUsIHBlcm8gYXNpc3Rpw7MgZW4gZWwgcGFzYWRvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSDEwID09IDMgfiAiTnVuY2EgYXNpc3Rpw7MiKSwKICAgICAgICAgU2VydmljaW9fZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA0QjEgIT0gMSB+ICJObyIpKSAlPiUgCiAgZ3JvdXBfYnkoU2VydmljaW9fZG9tZXN0aWNvLCBBc2lzdGVuY2lhKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksCiAgICAgICAgICAgIENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLAogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUgCiAgZmlsdGVyKEFzaXN0ZW5jaWEgPT0gIkFzaXN0ZSBhY3R1YWxtZW50ZSIpICU+JSAKICBzZWxlY3QoIsK/U2UgZGVkaWNhIGFsIHNlcnZpY2lvIGRvbcOpc3RpY28/IiA9IFNlcnZpY2lvX2RvbWVzdGljbywKICAgICAgICAgIlRhc2EgZGUgYXNpc3RlbmNpYSBhIGVzdC4gZWR1Y2F0aXZvIiA9IFBvcmNlbnRhamUpICU+JSAKICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIAogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0ZFMTc2NCIpCmBgYApfTm90YTogTGEgZXN0aW1hY2nDs24gY29ycmVzcG9uZGllbnRlIGEgYXF1ZWxsYXMgcXVlIG51bmNhIGFzaXN0aWVyb24gYSB1biBlc3RhYmxlY2ltaWVudG8gZWR1Y2F0aXZvIG5vIGN1ZW50YSBjb24gc3VmaWNpZW50ZXMgY2Fzb3MgbXVlc3RyYWxlcyBjb21vIHBhcmEgZ2FyYW50aXphciBzaWduaWZpY2F0aXZpZGFkIGRlbCBkYXRvLCBwb3IgbG8gcXVlIHNlIGhhIHJldGlyYWRvIGRlbCBjdWFkcm8gbGEgY2F0ZWdvcsOtYS5fICAgICAgICAgCgotLS0KCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX09jdXBhZGFzIGrDs3ZlbmVzIHF1ZSBlc3R1ZGlhbiBzZWfDum4gc2kgc2UgZGVkaWNhbiBhbCBzZXJ2aWNpbyBkb23DqXN0aWNvLCB5IHF1w6kgbml2ZWwgc2UgZW5jdWVudHJhbiBjdXJzYW5kb19fPC9wPgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojb2N1cGFkYXMgasOzdmVuZXMgcXVlIGFzaXN0ZW4gc2VndW4gc2kgc29uIGRlIHNlcnZpY2lvIGRvbWVzdGljbyB5IGEgcXXDqSBuaXZlbApiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihTZXhvID09ICJNdWplcmVzIiwKICAgICAgICAgR1JVUE9fRURBRCA9PSAiZGUgMTQgYSAyOSBhw7FvcyIsCiAgICAgICAgIEVTVEFETyA9PSAxLAogICAgICAgICBDSDEwID09IDEpICU+JSAKICBtdXRhdGUoU2VydmljaW9fZG9tZXN0aWNvID0gY2FzZV93aGVuKFBQMDRCMSA9PSAxIH4gIlPDrSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUDA0QjEgIT0gMSB+ICJObyIpLAogICAgICAgICBOaXZlbCA9IGNhc2Vfd2hlbihDSDEyID09IDEgfiAiSmFyZMOtbi9QcmVlc2NvbGFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gxMiAlaW4lIGMoMiwgMykgfiAiUHJpbWFyaW8vRUdCIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0gxMiAlaW4lIGMoNCwgNSkgfiAiU2VjdW5kYXJpby9Qb2xpbW9kYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDSDEyICVpbiUgYyg2LCA3KSB+ICJUZXJjaWFyaW8vVW5pdmVyc2l0YXJpbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTIgPT0gOCB+ICJQb3NncmFkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENIMTIgPT0gOSB+ICJFZC4gRXNwZWNpYWwiKSkgJT4lIAogIGdyb3VwX2J5KFNlcnZpY2lvX2RvbWVzdGljbywgTml2ZWwpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwKICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSAKICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCksCiAgICAgICAgIENhbnRpZGFkID0gZm9ybWF0b19jYW50aWRhZChDYW50aWRhZCkpICU+JSAKICBmaWx0ZXIoTml2ZWwgJWluJSBjKCJTZWN1bmRhcmlvL1BvbGltb2RhbCIsICJUZXJjaWFyaW8vVW5pdmVyc2l0YXJpbyIpKSAlPiUgCiAgc2VsZWN0KCLCv1NlIGRlZGljYSBhbCBzZXJ2aWNpbyBkb23DqXN0aWNvPyIgPSBTZXJ2aWNpb19kb21lc3RpY28sCiAgICAgICAgICJOaXZlbCBhbCBxdWUgYXNpc3RlIiA9IE5pdmVsLAogICAgICAgICAiVGFzYSIgPSBQb3JjZW50YWplKSAlPiUgCiAgc3ByZWFkKC4sICJOaXZlbCBhbCBxdWUgYXNpc3RlIiwgVGFzYSkgJT4lIAogIGthYmxlKGFsaWduID0gImMiKSAlPiUgCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRkUxNzY0IikKYGBgCl9Ob3RhOiBMYXMgZXN0aW1hY2lvbmVzIGNvcnJlc3BvbmRpZW50ZXMgYSBvdHJvcyBuaXZlbGVzIGVkdWNhdGl2b3MgZW4gY3Vyc28gbm8gY3VlbnRhbiBjb24gc3VmaWNpZW50ZXMgY2Fzb3MgbXVlc3RyYWxlcyBjb21vIHBhcmEgZ2FyYW50aXphciBzaWduaWZpY2F0aXZpZGFkIGRlIGxvcyBkYXRvcywgcG9yIGxvIHF1ZSBzZSBsYXMgaGEgcmV0aXJhZG8gZGVsIGN1YWRyby5fIAoKIyMjIEludGVuc2lkYWQgZGVsIHRyYWJham8KCi0tLQoKIyMjIyBJbnRlbnNpZGFkIGRlbCB0cmFiYWpvIGRlIGxhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbwo8YnI+PGJyPgpFbiByZWxhY2nDs24gYSBsYSBjYW50aWRhZCBkZSBob3JhcyBxdWUgdHJhYmFqYW4gc2VtYW5hbG1lbnRlIGxhcyBlbXBsZWFkYXMgZG9tw6lzdGljYXMsIHVuIDU0LDElIHNvbiBvY3VwYWRhcyAicGxlbmFzIiwgZXMgZGVjaXIgcXVlIHRyYWJhamFuIGVudHJlIDM1IHkgNDUgaG9yYXMgc2VtYW5hbGVzLCBvIGVzdMOhbiBjb25mb3JtZXMgY29uIGxhIGNhbnRpZGFkIGRlIGhvcmFzIHF1ZSB0cmFiYWphbi4gQWwgbWlzbW8gdGllbXBvIF9fdW4gMzMsMiUgc2UgZW5jdWVudHJhIHN1Yi1vY3VwYWRhX18sIHRyYWJhamEgbWVub3MgZGUgMzUgaG9yYXMgc2VtYW5hbGVzIHBvciBjYXVzYXMgaW52b2x1bnRhcmlhcywgZXN0YW5kbyBkaXNwdWVzdGFzIGEgdHJhYmFqYXIgbcOhcyBob3Jhcy4gUG9yIHN1IHBhcnRlLCBfX3VuIDEwLDUlIGVzdMOhIHNvYnJlLW9jdXBhZGFfXywgdHJhYmFqYSBtw6FzIGRlIDQ1IGhvcmFzIHBvciBzZW1hbmEuCjxicj48YnI+CkVuIGN1YW50byBhIGxhIGNhbnRpZGFkIGRlIGhvZ2FyZXMgZW4gcXVlIHNlIGRlc2VtcGXDsWFuLCB1biA3MSw0JSB0cmFiYWphIGVuIHVuYSBzb2xhIGNhc2EsIHBvciBsbyBxdWUgYWwgbWlzbW8gdGllbXBvIGNhc2kgdW4gMzAlIGRlIGVsbGFzIHRyYWJhamEgZW4gbcOhcyBkZSB1bmEgdml2aWVuZGEuIF9fTWllbnRyYXMgcXVlIGxhcyBxdWUgc29uIGNvbnRyYXRhZGFzIHBvciB1biBzw7NsbyBob2dhciB0cmFiYWphbiBjZXJjYSBkZSAyNSBob3JhcyBzZW1hbmFsZXMgKGpvcm5hZGEgcGFydC10aW1lKSwgYXF1ZWxsYXMgcXVlIHRyYWJhamFuIGVuIG3DoXMgZGUgdW5hIGNhc2EgdHJhYmFqYW4gZW4gcHJvbWVkaW8gbWVub3MgZGUgMTggaG9yYXMgcG9yIHNlbWFuYSBlbiBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCwgYWNlcmPDoW5kb3NlIGEgbGFzIDI0IG8gMjYgaG9yYXMgc2VtYW5hbGVzIGNvbiBsYXMgb2N1cGFjaW9uZXMgc2VjdW5kYXJpYXNfXy4KCi0tLQoKPHAgc3R5bGU9ImNvbG9yOiNGRTE3NjQiPl9fVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIGludGVuc2lkYWQgZGVsIHRyYWJham9fXzwvcD4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2Vydi5kb20gJT4lIAogIG11dGF0ZShJbnRlbnNpZGFkID0gY2FzZV93aGVuKElOVEVOU0kgPT0gMSB+ICJTdWJvY3VwYWRhcyBwb3IgaW5zdWZpY2llbmNpYSBob3JhcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlNJID09IDIgfiAiT2N1cGFkYXMgcGxlbmFzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlNJID09IDMgfiAiU29icmVvY3VwYWRhcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5TSSA9PSA0IH4gIk9jdXBhZGEgcXVlIG5vIHRyYWJhasOzIGVuIGxhIHNlbWFuYSIpKSAlPiUgCiAgZ3JvdXBfYnkoSW50ZW5zaWRhZCkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLAogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSwKICAgICAgICAgQ2FudGlkYWQgPSBmb3JtYXRvX2NhbnRpZGFkKENhbnRpZGFkKSkgJT4lIAogIGZpbHRlcihJbnRlbnNpZGFkICE9ICJPY3VwYWRhIHF1ZSBubyB0cmFiYWrDsyBlbiBsYSBzZW1hbmEiKSAlPiUgCiAgc2VsZWN0KEludGVuc2lkYWQsIENhbnRpZGFkLCBQb3JjZW50YWplKSAlPiUgCiAga2FibGUoYWxpZ24gPSAiYyIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgICAgICAgICAgICAgIGZpeGVkX3RoZWFkID0gVCwgZm9udF9zaXplID0gMjApICU+JSAKICByb3dfc3BlYygwLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gIiNGRTE3NjQiKQpgYGAKCl9Ob3RhOiBMYSBlc3RpbWFjacOzbiBjb3JyZXNwb25kaWVudGUgYSBhcXVlbGxhcyBxdWUgbm8gdHJhYmFqYXJvbiBlbiBsYSBzZW1hbmEgZGUgcmVmZXJlbmNpYSBkZSBsYSBlbmN1ZXN0YSBubyBjdWVudGEgY29uIHN1ZmljaWVudGVzIGNhc29zIG11ZXN0cmFsZXMgY29tbyBwYXJhIGdhcmFudGl6YXIgc2lnbmlmaWNhdGl2aWRhZCBkZWwgZGF0bywgcG9yIGxvIHF1ZSBzZSBoYSByZXRpcmFkbyBkZWwgY3VhZHJvIGxhIGNhdGVnb3LDrWEuXyAKCi0tLQoKPHAgc3R5bGU9ImNvbG9yOiNGRTE3NjQiPl9fVHJhYmFqYWRvcmFzIGRlbCBzZXJ2aWNpbyBkb23DqXN0aWNvIHNlZ8O6biBsYSBjYW50aWRhZCBkZSBob2dhcmVzIGVuIGxvcyBxdWUgdHJhYmFqYW5fXzwvcD4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc2Vydi5kb20gJT4lIAogIGZpbHRlcihQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMKICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgCiAgbXV0YXRlKGNhbnRpZGFkX2hvZ2FyZXMgPSBjYXNlX3doZW4oUFAwNEIyID09IDEgfiAiMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIyID09IDIgfiAiMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFAwNEIyID49IDMgfiAiMyBvIG3DoXMiKSkgJT4lIAogIGdyb3VwX2J5KGNhbnRpZGFkX2hvZ2FyZXMpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwKICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSksCiAgICAgICAgICAgIGhzX29jdXBfcHJpbmMgPSBmb3JtYXRvX3BvcmMod2VpZ2h0ZWQubWVhbihQUDNFX1RPVCwgUE9OREVSQSkpLAogICAgICAgICAgICBoc190b3RhbGVzID0gZm9ybWF0b19wb3JjKHdlaWdodGVkLm1lYW4oUFAzRV9UT1QgKyBQUDNGX1RPVCwgUE9OREVSQSkpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApLAogICAgICAgICBDYW50aWRhZCA9IGZvcm1hdG9fY2FudGlkYWQoQ2FudGlkYWQpKSAlPiUgCiAgc2VsZWN0KCJDYW50aWRhZCBkZSBob2dhcmVzIGVuIHF1ZSB0cmFiYWphIiA9IGNhbnRpZGFkX2hvZ2FyZXMsCiAgICAgICAgIENhbnRpZGFkLCBQb3JjZW50YWplLCAKICAgICAgICAgImhzL3NlbSBlbiBvY3VwLiBwcmluYy4iID0gaHNfb2N1cF9wcmluYywgCiAgICAgICAgICJocy9zZW0gY29uIG9jdXAuIHNlY3VuZC4iID0gaHNfdG90YWxlcykgJT4lIAogIGthYmxlKGFsaWduID0gImMiKSAlPiUgCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRkUxNzY0IikKYGBgCgojIyMgRGVyZWNob3MgbGFib3JhbGVzCgotLS0KCiMjIyMgRGVyZWNob3MgbGFib3JhbGVzIGRlIGxhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbwo8YnI+PGJyPgpEZW50cm8gZGVsIGNvbmp1bnRvIGRlIGFzYWxhcmlhZGVzLCB1biAzNCw1JSBubyBzZSBlbmN1ZW50cmEgcmVnaXN0cmFkZSBlbiBsYSBzZWd1cmlkYWQgc29jaWFsLiBFc3RhIHRhc2EgYXNjaWVuZGUgYWwgMzYsMSUgY3VhbmRvIGhhYmxhbW9zIGRlIGxhcyBhc2FsYXJpYWRhcyBtdWplcmVzLCBwZXJvIHRhbWJpw6luIHB1ZWRlIG9ic2VydmFyc2UgcXVlIGxhIHByb2JsZW3DoXRpY2EgZXMgcGFydGljdWxhcm1lbnRlIGluY2lzaXZhIGVudHJlIGxhcyB0cmFiYWphZG9yYXMgZG9tw6lzdGljYXM6IF9fdW4gNzMsNSUgZGUgZWxsYXMgbm8gcGVyY2liZSBkZXNjdWVudG8ganViaWxhdG9yaW8uIEFzb2NpYWRvIGEgZXN0bywgdW4gNjksMiUgZGUgZXN0YXMgdHJhYmFqYWRvcmFzIG5vIGN1ZW50YSBjb24gdmFjYWNpb25lcyBwYWdhcywgdW4gNjgsMSUgbm8gcGVyY2liZSBhZ3VpbmFsZG9zLCB1biA3MiwyJSBubyBwZXJjaWJlIGVsIHBhZ28gZW4gY2FzbyBkZSBlbmZlcm1lZGFkLCB5IHVuIDcyLDYlIG5vIGN1ZW50YSBjb24gY29iZXJ0dXJhIGRlIHNhbHVkIG1lZGlhbnRlIG9icmEgc29jaWFsX18uCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFRvdGFsIGRlIGFzYWxhcmlhZGVzLiBFbXBsZW8gc2luIGRlc2N1ZW50byBqdWJpbGF0b3JpbwpiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihFU1RBRE8gPT0gMSwKICAgICAgICAgQ0FUX09DVVA9PTMpICU+JSAKICBzdW1tYXJpc2UoIlRhc2EgZGUgbm8gcmVnaXN0cm8iID0gZm9ybWF0b19wb3JjKHN1bShQT05ERVJBW1BQMDdIPT0yXSkvc3VtKFBPTkRFUkEpKjEwMCkpCgojIFRvdGFsIGRlIGFzYWxhcmlhZGVzLiBFbXBsZW8gc2luIGRlc2N1ZW50byBqdWJpbGF0b3JpbyBwb3Igc2V4bwpiYXNlX2luZGl2aWR1YWwgJT4lIAogIGZpbHRlcihFU1RBRE89PTEsCiAgICAgICAgIENBVF9PQ1VQPT0zKSAlPiUgCiAgZ3JvdXBfYnkoU2V4bykgJT4lIAogIHN1bW1hcmlzZSgiVGFzYSBkZSBubyByZWdpc3RybyIgPSBmb3JtYXRvX3BvcmMoc3VtKFBPTkRFUkFbUFAwN0g9PTJdKS9zdW0oUE9OREVSQSkqMTAwKSkKYGBgCgotLS0KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9CnRhYmxhMSA8LSBzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkoRGVzY3VlbnRvX2p1YmlsYXRvcmlvKSAlPiUgCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBmb3JtYXRvX3BvcmMoQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApKSAlPiUgCiAgc2VsZWN0KERlc2N1ZW50b19qdWJpbGF0b3JpbywgUG9yY2VudGFqZSkgJT4lIAogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBEZXNjdWVudG9fanViaWxhdG9yaW8sIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIAogIG11dGF0ZShJbmRpY2Fkb3IgPSAiwr9UaWVuZSBkZXNjdWVudG8ganViaWxhdG9yaW8/IikKCnRhYmxhMiA8LSBzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkoVmFjYWNpb25lc19wYWdhcykgJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIAogIHNlbGVjdChWYWNhY2lvbmVzX3BhZ2FzLCBQb3JjZW50YWplKSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFZhY2FjaW9uZXNfcGFnYXMsIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIAogIG11dGF0ZShJbmRpY2Fkb3IgPSAiwr9UaWVuZSB2YWNhY2lvbmVzIHBhZ2FzPyIpCgp0YWJsYTMgPC0gc2Vydi5kb20gJT4lIAogIGdyb3VwX2J5KEFndWluYWxkbykgJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIAogIHNlbGVjdChBZ3VpbmFsZG8sIFBvcmNlbnRhamUpICU+JSAKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gQWd1aW5hbGRvLCB2YWx1ZXNfZnJvbSA9IFBvcmNlbnRhamUpICU+JSAKICBtdXRhdGUoSW5kaWNhZG9yID0gIsK/VGllbmUgYWd1aW5hbGRvPyIpCgp0YWJsYTQgPC0gc2Vydi5kb20gJT4lIAogIGdyb3VwX2J5KERpYXNfZW5mZXJtZWRhZCkgJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gZm9ybWF0b19wb3JjKENhbnRpZGFkL3N1bShDYW50aWRhZCkqMTAwKSkgJT4lIAogIHNlbGVjdChEaWFzX2VuZmVybWVkYWQsIFBvcmNlbnRhamUpICU+JSAKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gRGlhc19lbmZlcm1lZGFkLCB2YWx1ZXNfZnJvbSA9IFBvcmNlbnRhamUpICU+JSAKICBtdXRhdGUoSW5kaWNhZG9yID0gIsK/VGllbmUgZMOtYXMgcGFnb3MgcG9yIGVuZmVybWVkYWQ/IikKCnRhYmxhNSA8LSBzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkoT2JyYV9zb2NpYWwpICU+JSAKICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSAKICBtdXRhdGUoUG9yY2VudGFqZSA9IGZvcm1hdG9fcG9yYyhDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkpICU+JSAKICBzZWxlY3QoT2JyYV9zb2NpYWwsIFBvcmNlbnRhamUpICU+JSAKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gT2JyYV9zb2NpYWwsIHZhbHVlc19mcm9tID0gUG9yY2VudGFqZSkgJT4lIAogIG11dGF0ZShJbmRpY2Fkb3IgPSAiwr9UaWVuZSBvYnJhIHNvY2lhbD8iKQpgYGAKCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX0VuIGVzZSB0cmFiYWpvIHRpZW5lLi4uX188L3A+ICAgICAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJpbmRfcm93cyh0YWJsYTEsIHRhYmxhMiwgdGFibGEzLCB0YWJsYTQsIHRhYmxhNSkgJT4lIAogIHNlbGVjdChJbmRpY2Fkb3IsIFPDrSwgTm8pICU+JSAKICBrYWJsZShhbGlnbiA9ICJjIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgICAgICAgICAgICAgZml4ZWRfdGhlYWQgPSBULCBmb250X3NpemUgPSAyMCkgJT4lIAogIHJvd19zcGVjKDAsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiI0ZFMTc2NCIpCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0Kcm0odGFibGExLCB0YWJsYTIsIHRhYmxhMywgdGFibGE0LCB0YWJsYTUpCmBgYAogIAojIyMgSW5ncmVzb3MKCi0tLQoKIyMjIyBJbmdyZXNvcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28KPGJyPjxicj4KTGFzIHRyYWJhamFkb3JhcyBkZWwgc2VjdG9yIHBlcmNpYmVuIGluZ3Jlc29zIHF1ZSwgZW4gcHJvbWVkaW8sIHJvbmRhbiBsb3MgJDcuMzAwIHBlc29zIG1lbnN1YWxlcyBwb3Igc3Ugb2N1cGFjacOzbiBwcmluY2lwYWwuIEFsIG1pc21vIHRpZW1wbywgdW4gNTAlIGRlIGVsbGFzIGNvYnJhICQ2LjAwMCBwb3IgbWVzIHBvciBkaWNobyB0cmFiYWpvLiBFc3RvIGVxdWl2YWxlIGEgcXVlIGVuIHByb21lZGlvIGNvYnJhbiB1bm9zICQ5MSBwb3IgaG9yYSwgeSBlbCA1MCUgY29icmEgbWVub3MgZGUgJDg2IHBvciBob3JhLiBFbiBlbCBwcmltZXIgY3VhZHJvIHRhbWJpw6luIHB1ZWRlbiBhcHJlY2lhcnNlIGxvcyBpbmdyZXNvcyBtZW5zdWFsZXMgdG90YWxlcyBkZSBmdWVudGUgbGFib3JhbCAoaW5jbHV5ZW5kbyBpbmdyZXNvcyBkZSBvY3VwYWNpb25lcyBzZWN1bmRhcmlhcyksIGxvcyB0b3RhbGVzIGluZGl2aWR1YWxlcyAoaW5jbHV5ZW5kbyBpbmdyZXNvcyBxdWUgbm8gcHJvdmllbmVuIGRlIHVuYSBmdWVudGUgbGFib3JhbCksIGxvcyBpbmdyZXNvcyB0b3RhbGVzIGZhbWlsaWFyZXMgcXVlIHRpZW5lbiBlbiBwcm9tZWRpbyBsb3MgaG9nYXJlcyBkZSBlc3RhcyB0cmFiYWphZG9yYXMsIHkgZWwgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhciBkZSBlc3RvcyBtaXNtb3MgaG9nYXJlcy4KPGJyPjxicj4KRW4gZWwgc2VndW5kbyBjdWFkcm8gcHVlZGUgYXByZWNpYXJzZSBxdWUgaGF5IHVuYSBhbXBsaWEgZGlmZXJlbmNpYSBlbnRyZSBsb3MgaW5ncmVzb3MgcXVlIHBlcmNpYmVuIGVuIHByb21lZGlvIGxhcyB0cmFiYWphZG9yYXMgcXVlIHNlIGVuY3VlbnRyYW4gcmVnaXN0cmFkYXMgcmVzcGVjdG8gZGUgYXF1ZWxsYXMgcXVlIG5vLCB0YW50byBlbiB0w6lybWlub3MgbWVuc3VhbGVzIGNvbW8gcG9yIGhvcmEgdHJhYmFqYWRhLiBBZGVtw6FzLCBhcXVlbGxhcyBxdWUgdGllbmVuIGRlc2N1ZW50byBqdWJpbGF0b3JpbyB0cmFiYWphbiBtw6FzIGhvcmFzIGVuIHN1IG9jdXBhY2nDs24gcHJpbmNpcGFsIHJlc3BlY3RvIHF1ZSBhcXVlbGxhcyBxdWUgbm8uCjxicj48YnI+ClNpIG9yZGVuYW1vcyBhbCB0b3RhbCBkZSBsYXMgcGVyc29uYXMgb2N1cGFkYXMgZGUgYWN1ZXJkbyBhbCBuaXZlbCBkZSBpbmdyZXNvcyBxdWUgcGVyY2liZW4gcG9yIHN1IG9jdXBhY2nDs24gcHJpbmNpcGFsLCB5IGxhcyBhZ3J1cGFtb3MgZW4gMTAgZ3J1cG9zIGRlIGlndWFsIHRhbWHDsW8sIG9idGVuZW1vcyBsb3MgZGVub21pbmFkb3MgZGVjaWxlcyBkZSBpbmdyZXNvLiBFbiBlbCBncsOhZmljbyBzZSBtdWVzdHJhIGNsYXJhbWVudGUgcXVlIGFxdWVsbGFzIHBlcnNvbmFzIHF1ZSB0cmFiYWphbiBlbiBlbCBzZWN0b3IgZGUgc2VydmljaW8gZG9tw6lzdGljbyBzZSBlbmN1ZW50cmFuIGNvbmNlbnRyYWRhcyBlbiBsb3MgZGVjaWxlcyBkZSBtZW5vcmVzIGluZ3Jlc29zLgo8YnI+PGJyPgpPam8hIERlYmUgdGVuZXJzZSBlbiBjdWVudGEgcXVlIHRvZG9zIGxvcyBtb250b3MgZXN0w6FuIGV4cHJlc2Fkb3MgZW4gcGVzb3MgZGVsIGByIGRhdGVgLiAKCi0tLQoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBJbmdyZXNvcyBtZW5zdWFsZXMsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsCnRhYmxhMSA8LSBzZXJ2LmRvbSAlPiUgCiAgZmlsdGVyKFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcwogICAgICAgICBQUDNFX1RPVCAhPSA5OTkpICU+JSAKICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gZm9ybWF0b19wZXNvcyh3ZWlnaHRlZC5tZWFuKFAyMSwgUE9ORElJTykpLAogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IGZvcm1hdG9fcGVzb3Moc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihQMjEsIFBPTkRJSU8pKSkgJT4lIAogIG11dGF0ZShJbmdyZXNvcyA9ICAiTWVuc3VhbGVzLCBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCIpCgojIEluZ3Jlc29zIHBvciBob3JhLCBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbAp0YWJsYTIgPC0gc2Vydi5kb20gJT4lIAogIGZpbHRlcihQUDNFX1RPVCA+IDAsICMgSG9yYXMgdHJhYmFqYWRhcyBwb3NpdGl2YXMKICAgICAgICAgUFAzRV9UT1QgIT0gOTk5KSAlPiUgCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3Mod2VpZ2h0ZWQubWVhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTykpLAogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IGZvcm1hdG9fcGVzb3Moc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTykpKSAlPiUgCiAgbXV0YXRlKEluZ3Jlc29zID0gICJQb3IgaG9yYSwgZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwiKQoKIyBJbmdyZXNvcyBtZW5zdWFsZXMsIHRvdGFsIGRlIGZ1ZW50ZSBsYWJvcmFsCnRhYmxhMyA8LSBzZXJ2LmRvbSAlPiUgCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3Mod2VpZ2h0ZWQubWVhbihQNDdUIC0gVF9WSSwgUE9ORElJKSksCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gZm9ybWF0b19wZXNvcyhzcGF0c3RhdDo6d2VpZ2h0ZWQubWVkaWFuKFA0N1QgLSBUX1ZJLCBQT05ESUkpKSkgJT4lIAogIG11dGF0ZShJbmdyZXNvcyA9ICAiTWVuc3VhbGVzLCB0b3RhbCBkZSBmdWVudGUgbGFib3JhbCIpCiAgCiMgSW5ncmVzb3MgbWVuc3VhbGVzLCB0b3RhbGVzIGluZGl2aWR1YWxlcwp0YWJsYTQgPC0gc2Vydi5kb20gJT4lIAogIHN1bW1hcmlzZSgiSW5ncmVzbyBwcm9tZWRpbyIgPSBmb3JtYXRvX3Blc29zKHdlaWdodGVkLm1lYW4oUDQ3VCwgUE9ORElJKSksCiAgICAgICAgICAgICI1MCUgY29icmEgbWVub3MgZGUiID0gZm9ybWF0b19wZXNvcyhzcGF0c3RhdDo6d2VpZ2h0ZWQubWVkaWFuKFA0N1QsIFBPTkRJSSkpKSAlPiUgCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGluZ3Jlc28gdG90YWwgaW5kaXZpZHVhbCIpCgojIEluZ3Jlc29zIG1lbnN1YWxlcywgdG90YWxlcyBmYW1pbGlhcmVzCnRhYmxhNSA8LSBzZXJ2LmRvbSAlPiUgCiAgc3VtbWFyaXNlKCJJbmdyZXNvIHByb21lZGlvIiA9IGZvcm1hdG9fcGVzb3Mod2VpZ2h0ZWQubWVhbihJVEYsIFBPTkRJSCkpLAogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IGZvcm1hdG9fcGVzb3Moc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihJVEYsIFBPTkRJSCkpKSAlPiUgCiAgbXV0YXRlKEluZ3Jlc29zID0gICJNZW5zdWFsZXMsIGluZ3Jlc28gdG90YWwgZmFtaWxpYXIiKQoKIyBJbmdyZXNvcyBtZW5zdWFsZXMsIHBlciBjYXBpdGEgZmFtaWxpYXIKdGFibGE2IDwtIHNlcnYuZG9tICU+JSAKICBzdW1tYXJpc2UoIkluZ3Jlc28gcHJvbWVkaW8iID0gZm9ybWF0b19wZXNvcyh3ZWlnaHRlZC5tZWFuKElQQ0YsIFBPTkRJSCkpLAogICAgICAgICAgICAiNTAlIGNvYnJhIG1lbm9zIGRlIiA9IGZvcm1hdG9fcGVzb3Moc3BhdHN0YXQ6OndlaWdodGVkLm1lZGlhbihJUENGLCBQT05ESUgpKSkgJT4lIAogIG11dGF0ZShJbmdyZXNvcyA9ICAiTWVuc3VhbGVzLCBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyIikKYGBgCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+X19Qcm9tZWRpbyB5IG1lZGlhbmEgZGUgbG9zIGluZ3Jlc29zIGRlIGxhcyB0cmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyB5IHN1cyBmYW1pbGlhc19fPC9wPiAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KYmluZF9yb3dzKHRhYmxhMSwgdGFibGEyLCB0YWJsYTMsIHRhYmxhNCwgdGFibGE1LCB0YWJsYTYpICU+JSAKICBzZWxlY3QoSW5ncmVzb3MsIGV2ZXJ5dGhpbmcoKSkgJT4lIAogIGthYmxlKGFsaWduID0gImMiKSAlPiUgCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRkUxNzY0IikKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpybSh0YWJsYTEsIHRhYmxhMiwgdGFibGEzLCB0YWJsYTQsIHRhYmxhNSwgdGFibGE2KQpgYGAKCi0tLQogICAKPHAgc3R5bGU9ImNvbG9yOiNGRTE3NjQiPl9fVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIHNpIHRpZW5lbiBkZXNjdWVudG8ganViaWxhdG9yaW8sIHN1cyBpbmdyZXNvcyB5IGhvcmFzIGRlIHRyYWJham8gcHJvbWVkaW9fXzwvcD4gCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgSW5ncmVzb3MgbWVuc3VhbGVzIHkgcG9yIGhvcmEsIGRlIGxhIG9jdXBhY2nDs24gcHJpbmNpcGFsCnNlcnYuZG9tICU+JSAKICBmaWx0ZXIoUFAzRV9UT1QgPiAwLCAjIEhvcmFzIHRyYWJhamFkYXMgcG9zaXRpdmFzCiAgICAgICAgIFBQM0VfVE9UICE9IDk5OSkgJT4lIAogIGdyb3VwX2J5KERlc2N1ZW50b19qdWJpbGF0b3JpbykgJT4lIAogIHN1bW1hcmlzZShJbmdyZXNvcyA9IGZvcm1hdG9fcGVzb3Mod2VpZ2h0ZWQubWVhbihQMjEsIFBPTkRJSU8pKSwKICAgICAgICAgICAgSW5ncmVzb3NfaHMgPSBmb3JtYXRvX3Blc29zKHdlaWdodGVkLm1lYW4oUDIxLyhQUDNFX1RPVCAqIDMwIC8gNyksIFBPTkRJSU8pKSwKICAgICAgICAgICAgaHNfb2N1cF9wcmluYyA9IGZvcm1hdG9fcG9yYyh3ZWlnaHRlZC5tZWFuKFBQM0VfVE9ULCBQT05ERVJBKSkpICU+JSAKICBhcnJhbmdlKEluZ3Jlc29zKSAlPiUgCiAgc2VsZWN0KCLCv1RpZW5lIGRlc2N1ZW50byBqdWJpbGF0b3Jpbz8iID0gRGVzY3VlbnRvX2p1YmlsYXRvcmlvLAogICAgICAgICAiSW5ncmVzbyBtZW5zdWFsIHByb21lZGlvIiA9IEluZ3Jlc29zLAogICAgICAgICAiSW5ncmVzbyBwb3IgaG9yYSBwcm9tZWRpbyIgPSBJbmdyZXNvc19ocywKICAgICAgICAgImhzL3NlbSBlbiBvY3VwLiBwcmluYy4iID0gaHNfb2N1cF9wcmluYykgJT4lIAogIGthYmxlKGFsaWduID0gImMiKSAlPiUgCiAga2FibGVfc3R5bGluZyhjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICAgICAgICAgICAgICBmaXhlZF90aGVhZCA9IFQsIGZvbnRfc2l6ZSA9IDIwKSAlPiUgCiAgcm93X3NwZWMoMCwgYm9sZCA9IFQsIGNvbG9yID0gIndoaXRlIiwgYmFja2dyb3VuZCA9ICIjRkUxNzY0IikKYGBgCgotLS0KCjxwIHN0eWxlPSJjb2xvcjojRkUxNzY0Ij5fX1RyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23Fm3RpY28gc2Vnw7puIGRlY2lsZXMgZGUgaW5ncmVzbyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbF9fPC9wPiAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kb3B0aW9ucyhzY2lwZW49OTk5OTk5KQoKIyBEZWNpbGVzIGRlIEluZ3Jlc28gZGUgbGEgT2N1cCBQcmluY2lwYWwKc2Vydi5kb20gJT4lIAogIG11dGF0ZShERUNPQ1VSID0gYXMuaW50ZWdlcihERUNPQ1VSKSkgJT4lIAogIGZpbHRlcihERUNPQ1VSICVpbiUgYygxOjEwKSkgJT4lIAogIGdyb3VwX2J5KERFQ09DVVIpICU+JSAKICBzdW1tYXJpc2UoQ2FudGlkYWQgPSBzdW0oUE9ORElIKSkgJT4lIAogIGdncGxvdCguLCBhZXMoeCA9IERFQ09DVVIsIHkgPSBDYW50aWRhZCkpICsKICBnZW9tX2NvbChmaWxsID0gIiNGRTE3NjQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IDE6MTApICsKICBsYWJzKHRpdGxlID0gIlRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvIHNlZ8O6biBkZWNpbGVzIiwKICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJEZWNpbGVzIGRlIGluZ3Jlc28gZGUgbGEgb2N1cGFjacOzbiBwcmluY2lwYWwuICIsIGRhdGUpLAogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IE5hdHN1bWkgU2hva2lkYSBlbiBiYXNlIGEgRVBILUlOREVDIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgojIyMgSG9nYXJlcwoKLS0tCgojIyMjIEFsZ3VuYXMgY2FyYWN0ZXLDrXN0aWNhcyByZWZlcmlkYXMgYSBsb3MgaG9nYXJlcyBkZSBsYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28KPGJyPjxicj4KU2kgZXN0YSB2ZXogb3JkZW5hbW9zIGFsIHRvdGFsIGRlIGxhcyBwZXJzb25hcyBkZSBhY3VlcmRvIGEgc3VzIGluZ3Jlc29zIHBlciBjw6FwaXRhIGZhbWlsaWFyZXMgKGFxdWVsbG9zIHF1ZSBzdXJnZW4gZGUgZGl2aWRpciBlbCB0b3RhbCBkZSBpbmdyZXNvcyBkZSBsYSBmYW1pbGlhIHBvciBsYSBjYW50aWRhZCBkZSBtaWVtYnJvcyBkZSBsYSBtaXNtYSksIGRlIG1lbm9yIGEgbWF5b3IsIHkgbGFzIGFncnVwYW1vcyBlbiAxMCBncnVwb3MgZGUgaWd1YWwgdGFtYcOxbywgb2J0ZW5lbW9zIG90cmEgZXNjYWxhIGRlIGRlY2lsZXMuIEVuIGVzdGUgY2FzbyB0YW1iacOpbiBzZSBwdWVkZSBhcHJlY2lhciBxdWUgX19sYXMgdHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2UgY29uY2VudHJhbiBlbiBsb3MgcHJpbWVyb3MgZGVjaWxlcy4gQ2FiZSBkZXN0YWNhciBxdWUgbG9zIHByaW1lcm9zIHRyZXMgZGVjaWxlcyBkZSBlc3RhIGVzY2FsYSBzdWVsZW4gZXN0YXIgYWx0YW1lbnRlIHJlbGFjaW9uYWRvcyBjb24gbGEgc2l0dWFjacOzbiBkZSBwb2JyZXphIGRlIGxvcyBob2dhcmVzX18gKHRvbWFuZG8gY29tbyByZWZlcmVuY2lhIGxhIG1ldG9kb2xvZ8OtYSBvZmljaWFsIGRlIGPDoWxjdWxvIGRlIGxhIG1pc21hKS4KPGJyPjxicj4KQWwgbWlzbW8gdGllbXBvLCBtaWVudHJhcyBxdWUgX191biA1OCwzJSBubyBlcyBlbCBwcmltZXIgc29zdMOpbiBlY29uw7NtaWNvIGRlbCBob2dhciwgdW4gNDEsNyUgc8OtIGxvIGVzX18uIEVuIGFtYm9zIGNhc29zLCBsYSBtYXlvcsOtYSBkZSBlbGxhcyByZWFsaXphbiBsYXMgdGFyZWFzIGRvbcOpc3RpY2FzIGVuIHN1IGhvZ2FyLiBFc3RvIGVzIGFzw60gcG9ycXVlIF9fY2FzaSBlbCA3NSUgZGUgcXVpZW5lcyB0cmFiYWphbiBkZSBmb3JtYSByZW11bmVyYWRhIHJlYWxpemFuZG8gdHJhYmFqbyBkb23DqXN0aWNvIHRhbWJpw6luIGVzdMOhbiBhIGNhcmdvIGRlIGxhIHJlYWxpemFjacOzbiBkZSBlc3RlIHRyYWJham8gZW4gc3VzIGhvZ2FyZXNfXyBkZSBtYW5lcmEgbm8tYXNhbGFyaWFkYSwgeSBwb3IgdGFudG8gbm8gcmVtdW5lcmFkYS4gVW5hIHBvc2libGUgaW50ZXJwcmV0YWNpw7NuIGRlIGVzdGUgZmVuw7NtZW5vIGVzIHF1ZSBlbiBtdWNob3MgaG9nYXJlcyBkb25kZSBlbCBpbmdyZXNvIHByaW5jaXBhbCBubyBhbGNhbnphIHBhcmEgbGxlZ2FyIGEgZmluIGRlIG1lcywgbGFzIG11amVyZXMgcXVlIHJlYWxpemFuIGxhcyB0YXJlYXMgZG9tw6lzdGljYXMgZGVsIGhvZ2FyIGNvbXBsZW1lbnRhbiBsb3MgaW5ncmVzb3MgcmVhbGl6YW5kbyBlc3RlIHRyYWJham8gZW4gb3Ryb3MgaG9nYXJlcyBkZSBmb3JtYSByZW11bmVyYWRhLCBoYWJpdHVhbG1lbnRlIChjb21vIGhlbW9zIHZpc3RvIGVuIG90cm8gYXBhcnRhZG8pIGVuIGpvcm5hZGFzIHBhcmNpYWxlcy4KCi0tLQoKPHAgc3R5bGU9ImNvbG9yOiNGRTE3NjQiPgpfX1RyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23Fm3RpY28gc2Vnw7puIGRlY2lsZXMgZGUgaW5ncmVzbyBwZXIgY8OhcGl0YSBmYW1pbGlhcl9fCjwvcD4gCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm9wdGlvbnMoc2NpcGVuPTk5OTk5OSkKCiMgRGVjaWxlcyBkZSBJbmdyZXNvIFBlciBDYXBpdGEgRmFtaWxpYXIKc2Vydi5kb20gJT4lIAogIG11dGF0ZShERUNDRlIgPSBhcy5pbnRlZ2VyKERFQ0NGUikpICU+JSAKICBmaWx0ZXIoREVDQ0ZSICVpbiUgYygxOjEwKSkgJT4lIAogIGdyb3VwX2J5KERFQ0NGUikgJT4lIAogIHN1bW1hcmlzZShDYW50aWRhZCA9IHN1bShQT05ESUgpKSAlPiUgCiAgZ2dwbG90KC4sIGFlcyh4ID0gREVDQ0ZSLCB5ID0gQ2FudGlkYWQpKSArCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkUxNzY0IikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSAxOjEwKSArCiAgbGFicyh0aXRsZSA9ICJUcmFiYWphZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBzZWfDum4gZGVjaWxlcyIsCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiRGVjaWxlcyBkZSBpbmdyZXNvIHBlciBjw6FwaXRhIGZhbWlsaWFyLiAiLCBkYXRlKSwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKLS0tCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFNvbiBlbCBpbmdyZXNvIHByaW5jaXBhbCBkZWwgaG9nYXI/CmluZ3Jlc29zX3ByaW5jaXBhbGVzIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUKICBncm91cF9ieShDT0RVU1UsIE5ST19IT0dBUikgJT4lIAogIG11dGF0ZShlc19wcmluY2lwYWwgPSBjYXNlX3doZW4oUDQ3VCA9PSBtYXgoUDQ3VCkgfiAgIlPDrSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gIk5vIikpICU+JSAKICBzZWxlY3QoQ09EVVNVLCBOUk9fSE9HQVIsIENPTVBPTkVOVEUsIGVzX3ByaW5jaXBhbCkKCnNlcnYuZG9tIDwtIGxlZnRfam9pbihzZXJ2LmRvbSwgaW5ncmVzb3NfcHJpbmNpcGFsZXMsIGJ5ID0gYygiQ09EVVNVIiwgIk5ST19IT0dBUiIsICJDT01QT05FTlRFIikpCgpzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkoZXNfcHJpbmNpcGFsKSAlPiUgCiAgc3VtbWFyaXNlKG4gPSBuKCksCiAgICAgICAgICAgIENhbnRpZGFkID0gc3VtKFBPTkRFUkEpKSAlPiUgCiAgbXV0YXRlKFBvcmNlbnRhamUgPSBDYW50aWRhZC9zdW0oQ2FudGlkYWQpKjEwMCkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIFJlYWxpemFjacOzbiBkZSBsYXMgdGFyZWFzIGRlIGxhIGNhc2EKc2Vydi5kb20gPC0gc2Vydi5kb20gJT4lIAogIGxlZnRfam9pbiguLCBiYXNlX2hvZ2FyICU+JSAKICAgICAgICAgICAgICBzZWxlY3QoQ09EVVNVLCBOUk9fSE9HQVIsIFZJSTFfMSwgVklJMV8yKSwgYnkgPSBjKCJDT0RVU1UiLCAiTlJPX0hPR0FSIikpICU+JSAKICBtdXRhdGUocmVhbGl6YSA9IGNhc2Vfd2hlbihWSUkxXzEgPT0gQ09NUE9ORU5URSB8IFZJSTFfMiA9PSBDT01QT05FTlRFIH4gIlPDrSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAiTm8iKSkgCgpzZXJ2LmRvbSAlPiUgCiAgZ3JvdXBfYnkocmVhbGl6YSkgJT4lIAogIHN1bW1hcmlzZShuID0gbigpLAogICAgICAgICAgICBDYW50aWRhZCA9IHN1bShQT05ERVJBKSkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApCmBgYAoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KbWF0cml6IDwtIHNlcnYuZG9tICU+JSAKICBncm91cF9ieShlc19wcmluY2lwYWwsIHJlYWxpemEpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwKICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShQb3JjZW50YWplID0gQ2FudGlkYWQvc3VtKENhbnRpZGFkKSoxMDApICU+JSAKICBzZWxlY3QoZXNfcHJpbmNpcGFsLCByZWFsaXphLCBQb3JjZW50YWplKSAlPiUgCiAgYXJyYW5nZSgtUG9yY2VudGFqZSkKYGBgCgo8cCBzdHlsZT0iY29sb3I6I0ZFMTc2NCI+Cl9fVHJhYmFqYWRvcmFzIGRlIHNlcnZpY2lvIGRvbcOpc3RpY28gc2Vnw7puIHNpIHBlcmNpYmVuIGVsIGluZ3Jlc28gcHJpbmNpcGFsIGRlIHN1IGdydXBvIGZhbWlsaWFyIHkgc2kgc29uIHF1aWVuZXMgcmVhbGl6YW4gbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBlbiBzdSBob2dhcl9fCjwvcD4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QobWF0cml6LCBhZXMoZXNfcHJpbmNpcGFsLCByZWFsaXphLCBmaWxsID0gUG9yY2VudGFqZSkpICsKICBnZW9tX3RpbGUoKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHN0cl9jKHJvdW5kKFBvcmNlbnRhamUsIDEpLCAiJSIpKSwgc2l6ZSA9IDgpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJ3aGl0ZSIsIGhpZ2ggPSAiI0ZFMTc2NCIpICsKICBzY2FsZV94X2Rpc2NyZXRlKHBvc2l0aW9uID0gInRvcCIpICsKICBnZW9tX3RpbGUoY29sb3IgPSAiYmxhY2siLCBmaWxsID0gImJsYWNrIiwgYWxwaGEgPSAwKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgpICsKICBsYWJzKHggPSAnwr9QZXJjaWJlIGVsIGluZ3Jlc28gcHJpbmNpcGFsIGRlbCBob2dhcj8nLAogICAgICAgeSA9ICfCv1JlYWxpemEgbGFzIHRhcmVhcyBkb23DqXN0aWNhcyBlbiBzdSBob2dhcj8nLAogICAgICAgdGl0bGUgPSBwYXN0ZTAoIlRyYWJhamFkb3JhcyBkZSBzZXJ2aWNpbyBkb23DqXN0aWNvLiAiLCBkYXRlKSwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpICsKICBndWlkZXMoZmlsbCA9IEZBTFNFKQpgYGAKCiMjIyBDb21wYXJhY2nDs24gY29uIG90cmFzIHJhbWFzIGRlIGxhIG9jdXBhY2nDs24KCi0tLQoKIyMjIyBDb21wYXJhY2nDs24gY29uIG90cmFzIHJhbWFzIGRlIGxhIG9jdXBhY2nDs24gey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9Cjxicj48YnI+CkVzIMO6dGlsIGNvbnRleHR1YWxpemFyIG11Y2hvcyBkZSBsb3MgaW5kaWNhZG9yZXMgcHJlc2VudGFkb3MgcmVhbGl6YW5kbyB1bmEgY29tcGFyYWNpw7NuIGNvbiBvdHJhcyByYW1hcyBkZSBvY3VwYWNpw7NuLiBFbiBlc3RhIHNlY2Npw7NuIHNlIHByZXNlbnRhIHVuYSBzZXJpZSBkZSBncsOhZmljb3MgcXVlIHBlcm1pdGVuIHJlYWxpemFyIGVzdGUgZWplcmNpY2lvLiBFbiB0b2RvcyBsb3MgY2Fzb3Mgc2UgY29uc2lkZXJhIGEgbGEgcG9ibGFjacOzbiBhc2FsYXJpYWRhLCBlcyBkZWNpciBhIGxhcyBwZXJzb25hcyBxdWUgc2UgZGVzZW1wZcOxYW4gZW4gZWwgbWVyY2FkbyBsYWJvcmFsIGNvbiB1bmEgcmVsYWNpw7NuIGRlIGRlcGVuZGVuY2lhLCB5IHRlbmllbmRvIGVuIGN1ZW50YSBsYXMgY2FyYWN0ZXLDrXN0aWNhcyBkZSBsYSBvY3VwYWNpw7NuIHByaW5jaXBhbCBkZSBlc3RhcyBwZXJzb25hcy4KPGJyPjxicj4KU2UgZGVzdGFjYSBxdWUgX19lbCBzZWN0b3IgZGUgc2VydmljaW8gZG9tw6lzdGljbyBlcyB1bm8gZGUgbG9zIG3DoXMgaW1wb3J0YW50ZXMgZGVsIG1lcmNhZG8gbGFib3JhbC4gVGFtYmnDqW4gc2UgdHJhdGEgZGUgbGEgcmFtYSBtw6FzIGZlbWluaXphZGEsIGVzIGxhIHF1ZSBtw6FzIHByb3BvcmNpw7NuIG9jdXBhIGRlbnRybyBkZSBsYXMgdHJhYmFqYWRvcmFzIG11amVyZXMgeSBsYSBtZW5vcyBwb3B1bGFyIGVudHJlIGxvcyB2YXJvbmVzLiBUYW1iacOpbiBlcyBsYSByYW1hIHF1ZSBwcmVzZW50YSBsYSB0YXNhIGRlIG5vLXJlZ2lzdHJvIG3DoXMgYWx0YSwgeSBsb3MgaW5ncmVzb3MgcHJvbWVkaW9zIG3DoXMgYmFqb3MsIHRhbnRvIGRlIGJvbHNpbGxvIGNvbW8gcG9yIGhvcmEgdHJhYmFqYWRhX18uCgotLS0KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgSW1wbGVtZW50byBsYSBmdW5jacOzbiBxdWUgY29uc3RydXllIGxhIHJhbWEgRVBIIGNvbiBub21icmVzIGRlc2NyaXB0aXZvcywgZGlyZWN0byBkZXNkZSBsYSBQUDA0Ql9DT0QKYmFzZV9pbmRpdmlkdWFsIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUKICBtdXRhdGUocmFtYS5ub21icmUgPSBlbnRyYS5jdWNoaWxsby5zYWxlbi5sYXMucmFtYXMoUFAwNEJfQ09EKSkKYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojIEFzYWxhcmlhZGVzCmFzYWxhcmlhZGVzIDwtIGJhc2VfaW5kaXZpZHVhbCAlPiUKICBmaWx0ZXIoRVNUQURPID09IDEsCiAgICAgICAgIENBVF9PQ1VQID09IDMpCgphc2FsYXJpYWRlcyAlPiUgCiAgZ3JvdXBfYnkocmFtYS5ub21icmUpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSwKICAgICAgICAgICAgQ2FudGlkYWQgPSBzdW0oUE9OREVSQSkpCgp0YWJsZShhc2FsYXJpYWRlcyRyYW1hLm5vbWJyZSwgYXNhbGFyaWFkZXMkUFAwNEIxLCBleGNsdWRlID0gTlVMTCkKIyBIYXkgY2Fzb3MgZGUgU2VydmljaW8gZG9tZXN0aWNvIGVuIGxhIHJhbWEgcGVybyBxdWUgbm8gdGllbmVuIG1hcmNhZGEgbGEgdmFyaWFibGUgcXVlIGxhcyBpZGVudGlmaWNhIGNvbW8gcHJlc3RhZG9yYXMgZGUgc2VydmljaW8gZG9tw6lzdGljbyBlbiBob2dhcmVzLCBzb24gMjEgY2Fzb3MgbXVlc3RyYWxlcwoKcHJ1ZWJhIDwtIGFzYWxhcmlhZGVzICU+JSAKICBmaWx0ZXIocmFtYS5ub21icmUgPT0gIlNlcnZpY2lvIGRvbWVzdGljbyIsIAogICAgICAgICBQUDA0QjEgPT0gMikKCnRhYmxlKHBydWViYSRQUDA0Ql9DT0QsIGV4Y2x1ZGUgPSBOVUxMKQp0YWJsZShwcnVlYmEkUFAwNEIyLCBleGNsdWRlID0gTlVMTCkKIyBMb3MgMjEgY2Fzb3MgdGllbmVuIHJhbWEgIjk3MDAiLCBxdWUgZW4gQ0FFUyBNZXJjb3N1ciBlcyAiQWN0aXZpZGFkZXMgZGUgbG9zIGhvZ2FyZXMgY29tbyBlbXBsZWFkb3JlcyBkZSBwZXJzb25hbCBkb23DqXN0aWNvIiwgbGEgbWlzbWEgcmFtYSBxdWUgZWwgcmVzdG8sIHBlcm8gcmVzcG9uZGVuIHRyYWJhamFyIGVuICIwIGNhc2FzIiB5IHBvciBlc28gbm8gc2UgdGllbmVuIGVuIGN1ZW50YSBoYXN0YSBhaG9yYSwgZW4gbGEgYmFzZSBzZXJ2LmRvbS4KYGBgCgpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQphc2FsLnJhbWFzIDwtIGFzYWxhcmlhZGVzICU+JSAKICBtdXRhdGUodG90YWwgPSBzdW0oUE9OREVSQSksCiAgICAgICAgIHRvdGFsX211amVyZXMgPSBzdW0oUE9OREVSQVtTZXhvID09ICJNdWplcmVzIl0pLAogICAgICAgICB0b3RhbF92YXJvbmVzID0gc3VtKFBPTkRFUkFbU2V4byA9PSAiVmFyb25lcyJdKSkgJT4lIAogIGdyb3VwX2J5KCJSYW1hIiA9IHJhbWEubm9tYnJlKSAlPiUgCiAgc3VtbWFyaXNlKENhbnRpZGFkID0gc3VtKFBPTkRFUkEpLAogICAgICAgICAgICBQcm9wb3JjaW9uID0gcm91bmQoc3VtKFBPTkRFUkEpL3VuaXF1ZSh0b3RhbCkqMTAwLCAxKSwKICAgICAgICAgICAgdGFzYV9mZW1pbml6YWNpb24gPSByb3VuZChzdW0oUE9OREVSQVtTZXhvID09ICJNdWplcmVzIl0pL3N1bShQT05ERVJBKSoxMDAsIDEpLAogICAgICAgICAgICBwcm9wX2VuX211amVyZXMgPSByb3VuZChzdW0oUE9OREVSQVtTZXhvID09ICJNdWplcmVzIl0pL3VuaXF1ZSh0b3RhbF9tdWplcmVzKSoxMDAsIDEpLAogICAgICAgICAgICBwcm9wX2VuX3Zhcm9uZXMgPSByb3VuZChzdW0oUE9OREVSQVtTZXhvID09ICJWYXJvbmVzIl0pL3VuaXF1ZSh0b3RhbF92YXJvbmVzKSoxMDAsIDEpLAogICAgICAgICAgICB0YXNhX25vX3JlZ2lzdHJvID0gcm91bmQoc3VtKFBPTkRFUkFbUFAwN0ggPT0gMl0pL3N1bShQT05ERVJBKSoxMDAsIDEpLAogICAgICAgICAgICBpbmdyZXNvX21lbnN1YWwgPSB3ZWlnaHRlZC5tZWFuKFAyMSwgUE9ORElJTykpCgphc2FsLnJhbWFzMiA8LSBhc2FsYXJpYWRlcyAlPiUgCiAgZmlsdGVyKFBQM0VfVE9UID4gMCwgIyBIb3JhcyB0cmFiYWphZGFzIHBvc2l0aXZhcwogICAgICAgICBQUDNFX1RPVCAhPSA5OTkpICU+JSAKICBncm91cF9ieSgiUmFtYSIgPSByYW1hLm5vbWJyZSkgJT4lIAogIHN1bW1hcmlzZShpbmdyZXNvX2hyID0gd2VpZ2h0ZWQubWVhbihQMjEvKFBQM0VfVE9UICogMzAgLyA3KSwgUE9ORElJTykpCgphc2FsLnJhbWFzIDwtIGFzYWwucmFtYXMgJT4lIAogIGxlZnRfam9pbiguLCBhc2FsLnJhbWFzMiwgYnkgPSAiUmFtYSIpCgpybShhc2FsLnJhbWFzMikKYGBgCgojIyMjIyBDYW50aWRhZCBkZSB0cmFiYWphZG9yZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmVvcmRlciB0aGUgZGF0YQpkYXRhIDwtIGFzYWwucmFtYXMgJT4lCiAgc2VsZWN0KHg9UmFtYSwgeT1DYW50aWRhZCkgJT4lIAogIGFycmFuZ2UoeSkgJT4lCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpCiAgCiMgUGxvdApnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsKICB0aGVtZV9pcHN1bSgpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJDYW50aWRhZCBkZSB0cmFiYWphZG9yZXMiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIiIpICsKICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJQb2JsYWNpw7NuIGFzYWxhcmlhZGEgcG9yIHJhbWEuICIsIGRhdGUpLAogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IE5hdHN1bWkgU2hva2lkYSBlbiBiYXNlIGEgRVBILUlOREVDIikKYGBgCgojIyMjIyBUYXNhIGRlIGZlbWluaXphY2nDs24KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmVvcmRlciB0aGUgZGF0YQpkYXRhIDwtIGFzYWwucmFtYXMgJT4lCiAgc2VsZWN0KHg9UmFtYSwgeT10YXNhX2ZlbWluaXphY2lvbikgJT4lIAogIGFycmFuZ2UoeSkgJT4lCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpCiAgCiMgUGxvdApnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsKICB0aGVtZV9pcHN1bSgpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJUYXNhIGRlIGZlbWluaXphY2nDs24iKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlBvcmNlbnRhamUiKSArCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiUG9ibGFjacOzbiBhc2FsYXJpYWRhIHBvciByYW1hLiAiLCBkYXRlKSwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpCmBgYAoKIyMjIyMgUHJvcG9yY2nDs24gZW50cmUgbGFzIGFzYWxhcmlhZGFzIG11amVyZXMKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmVvcmRlciB0aGUgZGF0YQpkYXRhIDwtIGFzYWwucmFtYXMgJT4lCiAgc2VsZWN0KHg9UmFtYSwgeT1wcm9wX2VuX211amVyZXMpICU+JSAKICBhcnJhbmdlKHkpICU+JQogIG11dGF0ZSh4PWZhY3Rvcih4LHgpKQogIAojIFBsb3QKZ2dwbG90KGRhdGEsIGFlcyh4PXgsIHk9eSkpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9eCwgeGVuZD14LCB5PTAsIHllbmQ9eSksIAogICAgICAgICAgICAgICBjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjMDBCREQ2IiwgIiNGRTE3NjQiKSwgCiAgICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAxLjMsIDAuNykgKSArCiAgZ2VvbV9wb2ludChjb2xvcj1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksICIjMDBCREQ2IiwgIiNGRTE3NjQiKSwgCiAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgNSwgMikgKSArCiAgdGhlbWVfaXBzdW0oKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiUHJvcG9yY2nDs24gZW50cmUgbXVqZXJlcyIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiUG9yY2VudGFqZSIpICsKICBsYWJzKHN1YnRpdGxlID0gcGFzdGUwKCJQb2JsYWNpw7NuIGFzYWxhcmlhZGEgcG9yIHJhbWEuICIsIGRhdGUpLAogICAgICAgY2FwdGlvbiA9ICJGdWVudGU6IE5hdHN1bWkgU2hva2lkYSBlbiBiYXNlIGEgRVBILUlOREVDIikKYGBgCgojIyMjIyBQcm9wb3JjacOzbiBlbnRyZSBsb3MgYXNhbGFyaWFkb3MgdmFyb25lcwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBSZW9yZGVyIHRoZSBkYXRhCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUKICBzZWxlY3QoeD1SYW1hLCB5PXByb3BfZW5fdmFyb25lcykgJT4lIAogIGFycmFuZ2UoeSkgJT4lCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpCiAgCiMgUGxvdApnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsKICB0aGVtZV9pcHN1bSgpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJQcm9wb3JjacOzbiBlbnRyZSB2YXJvbmVzIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJQb3JjZW50YWplIikgKwogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIiwgZGF0ZSksCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogTmF0c3VtaSBTaG9raWRhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCiMjIyMjIFRhc2EgZGUgbm8gcmVnaXN0cm8gZGUgbGEgcmVsYWNpw7NuIGxhYm9yYWwKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgUmVvcmRlciB0aGUgZGF0YQpkYXRhIDwtIGFzYWwucmFtYXMgJT4lCiAgc2VsZWN0KHg9UmFtYSwgeT10YXNhX25vX3JlZ2lzdHJvKSAlPiUgCiAgYXJyYW5nZSh5KSAlPiUKICBtdXRhdGUoeD1mYWN0b3IoeCx4KSkKICAKIyBQbG90CmdncGxvdChkYXRhLCBhZXMoeD14LCB5PXkpKSArCiAgZ2VvbV9zZWdtZW50KGFlcyh4PXgsIHhlbmQ9eCwgeT0wLCB5ZW5kPXkpLCAKICAgICAgICAgICAgICAgY29sb3I9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAiIzAwQkRENiIsICIjRkUxNzY0IiksIAogICAgICAgICAgICAgICBzaXplPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgMS4zLCAwLjcpICkgKwogIGdlb21fcG9pbnQoY29sb3I9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCAiIzAwQkRENiIsICIjRkUxNzY0IiksIAogICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDUsIDIpICkgKwogIHRoZW1lX2lwc3VtKCkgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoIk5vIHJlZ2lzdHJvIGRlIGxhIHJlbGFjacOzbiBsYWJvcmFsIikgKwogIHhsYWIoIiIpICsKICB5bGFiKCJQb3JjZW50YWplIikgKwogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIiwgZGF0ZSksCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogTmF0c3VtaSBTaG9raWRhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCiMjIyMjIEluZ3Jlc29zIG1lbnN1YWxlcyBwcm9tZWRpbwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBSZW9yZGVyIHRoZSBkYXRhCmRhdGEgPC0gYXNhbC5yYW1hcyAlPiUKICBzZWxlY3QoeD1SYW1hLCB5PWluZ3Jlc29fbWVuc3VhbCkgJT4lIAogIGFycmFuZ2UoeSkgJT4lCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpCiAgCiMgUGxvdApnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsKICB0aGVtZV9pcHN1bSgpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJJbmdyZXNvcyBtZW5zdWFsZXMgcHJvbWVkaW8iKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlBlc29zIikgKwogIGxhYnMoc3VidGl0bGUgPSBwYXN0ZTAoIlBvYmxhY2nDs24gYXNhbGFyaWFkYSBwb3IgcmFtYS4gIiwgZGF0ZSksCiAgICAgICBjYXB0aW9uID0gIkZ1ZW50ZTogTmF0c3VtaSBTaG9raWRhIGVuIGJhc2UgYSBFUEgtSU5ERUMiKQpgYGAKCiMjIyMjIEluZ3Jlc29zIHBvciBob3JhIHByb21lZGlvCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIFJlb3JkZXIgdGhlIGRhdGEKZGF0YSA8LSBhc2FsLnJhbWFzICU+JQogIHNlbGVjdCh4PVJhbWEsIHk9aW5ncmVzb19ocikgJT4lIAogIGFycmFuZ2UoeSkgJT4lCiAgbXV0YXRlKHg9ZmFjdG9yKHgseCkpCiAgCiMgUGxvdApnZ3Bsb3QoZGF0YSwgYWVzKHg9eCwgeT15KSkgKwogIGdlb21fc2VnbWVudChhZXMoeD14LCB4ZW5kPXgsIHk9MCwgeWVuZD15KSwgCiAgICAgICAgICAgICAgIGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgICAgc2l6ZT1pZmVsc2UoZGF0YSR4ICVpbiUgYygiU2VydmljaW8gZG9tZXN0aWNvIiksIDEuMywgMC43KSApICsKICBnZW9tX3BvaW50KGNvbG9yPWlmZWxzZShkYXRhJHggJWluJSBjKCJTZXJ2aWNpbyBkb21lc3RpY28iKSwgIiMwMEJERDYiLCAiI0ZFMTc2NCIpLCAKICAgICAgICAgICAgIHNpemU9aWZlbHNlKGRhdGEkeCAlaW4lIGMoIlNlcnZpY2lvIGRvbWVzdGljbyIpLCA1LCAyKSApICsKICB0aGVtZV9pcHN1bSgpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJJbmdyZXNvcyBwb3IgaG9yYSBwcm9tZWRpbyIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiUGVzb3MiKSArCiAgbGFicyhzdWJ0aXRsZSA9IHBhc3RlMCgiUG9ibGFjacOzbiBhc2FsYXJpYWRhIHBvciByYW1hLiAiLCBkYXRlKSwKICAgICAgIGNhcHRpb24gPSAiRnVlbnRlOiBOYXRzdW1pIFNob2tpZGEgZW4gYmFzZSBhIEVQSC1JTkRFQyIpCmBgYAoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=