1. Descripción

La tasa de mortalidad infantil es el indicador demográfico que señala el número de defunciones de niños en una población de cada mil nacimientos vivos registrados, durante el primer año de su vida.

La consideración del primer año de vida para establecer la tasa de mortalidad infantil se debe a que el primer año de vida es el más crítico en la supervivencia del ser humano, cuando se sobrepasa el primer año de nacimiento, las probabilidades de supervivencia aumentan drásticamente.

En Argentina se ha registrado un decrecimiento en la tasa de mortalidad infantil debido a diversos factores como la implementación de políticas de salubridad, el decrecimiento en el número de embarazos en adolescentes, entre otros. Es importante la implementación de modelos que expliquen el comportamiento de la tasa de mortalidad infantil en Argentina para tener una estimación de tal índice en años supsecuentes y saber si hay que tomar medidas para controlarlo.

1.2 Descripción de las variables

Tasa de Mortalidad Infantil en el primer año de nacido por mil nacidos vivos con jurisdicción de residencia de la madre ocurridos en la República Argentina. La base contiene 24 provincias diferentes de Argentina y 29 periodos diferentes (desde 1990-01-01 hasta 2018-01-01), por cada combinanción de provincia-periodo hay un valor para la tasa de mortalidad infantil.

1.3 Vista de la base de datos

2. Objetivos

2.1 Objetivos generales

  1. Encontrar el mejor modelo predictivo que explique la tasa de mortalidad infantil a lo largo del tiempo en la República Argentina discriminando por las diferentes provincias del país.

  2. Exhibir la utilidad e importancia de los modelos mixtos cuando se tienen datos agrupados.

2.2 Objetivos específicos

  1. Encontrar posibles curvaturas en los diagramas de disperisión.

  2. Crear modelos preditivos en base al análisis descriptivo.

  3. Probar la significancia de los efectos aleatorios en el modelo.

  4. Probar la significancia de los efectos fijos en el modelo.

  5. Comparar los modelos predictivos y escoger el mejor modelo mediante pruebas de hipótesis.

3. Análisis descriptivo

Siempre es útil comenzar la exploración de los datos creando gráficos de disperción para tener una idea del comportamiento de la variable respuesta, en este caso, de la tasa de mortalidad infantil por mil niños(as) nacidos vivos.

Se observa en la nube de puntos que la tasa de mortalidad conjunta de las provincias de Argentina al parecer decrece conjuntamente. Además, parece que disminuye la variabilidad conforme pasa el tiempo. Por lo que al ajustar un modelo de regresíon líneal clásico a la tasa de mortalidad conjunta de las provincias, puede que exitan problemas con el supuesto de varianza constante.

Se procede a crear un grafico de dispersión diferente por cada provincia, para análisar de mejor manera el comportamiento individual de la tasa de mortalidad en cada provincia.

En la figura anterior se observa que la nueve de puntos en cada una de las provincias efectivamente es decreciente, pero en Tucuman existe un incremento en la tasa de mortalidad al rededor del periodo 10 que es 1999-01-01. En corrientes hay un valor de la tasa de mortalidad que se sale de la tendencia de la nube de puntos en el periodo 11 que es 2000-01-01.

También se observa que los interceptos son diferentes en cada provincia, por lo que la creación de modelos mixtos puede ser beneficiosa para explicar el comportamiento de la tasa de mortalidad infantil en Argentina.

En algunas provincias se nota una posible curvatura en la nube de puntos, por ejemplo en Santa fe, Santiago del estefero, Tierra del fuego. Por lo que sería interesante incluir un polinomio de grado 2 sobre la variable id_periodo. El diagrama de disperisión de Tucuman al tener alrededor de 4 o 5 curvas necesitaría la inclusión de un polinomio grado 4 o 5 para explicar su nube de puntos pero al ser la única provincia con este comportamiento, es necesario consultar con un experto o conocedor del tema para saber que pasó durante esos años en esta provincia.

4. Modelos a considerar

1. Modelo de regresión líneal clásico.

\[mortalidad_{j} \sim N(\mu_{j}, \sigma^2)\]

\[\mu_j = \beta_0 + \beta_1 id\_periodo_{j}\]

\[j = 1,~2, ...,~ 29\]

2. Modelo de regresión líneal mixto con intercepto aleatorio

\[mortalidad_{ij} \sim N(\mu_{ij}, \sigma^2)\] \[\mu_{ij} = \beta_0 + \beta_1 id\_periodo_{ij} + \beta_{0i}\]

\[b_{0} \sim N(0, \sigma^2_{b0})\]

\[i = 1,~2,...,~24. ~~~ j = 1,~2, ...,~ 29\]

3. Modelo de regresión líneal mixto con intercepto y pendiente aleatoria

\[mortalidad_{ij} \sim N(\mu_{ij}, \sigma^2)\]

\[\mu_{ij} = \beta_0 + \beta_1 id\_periodo_{ij} + \beta_{0i} + \beta_{1i} ~id\_periodo_{ij}\]

\[ {b_0 \choose b_1} \sim N \left({0 \choose 0},{\sigma^2_{b0} \ \ \sigma^2_{b01} \choose \sigma^2_{b01} \ \ \sigma^2_{b1}} \right)\]

\[i = 1,~2,...,~24. ~~~ j = 1,~2, ...,~ 29\]

4. Modelo de regresión líneal mixto con intercepto y pediente aleatoria. Además con un término cuadrático que acompaña a los efectos fijos.

\[mortalidad_{ij} \sim N(\mu_{ij}, \sigma^2)\]

\[\mu_{ij} = \beta_0 + \beta_1 id\_periodo_{ij} + \beta_2 id\_periodo_{ij}^2 + \beta_{0i} + \beta_{1i} ~id\_periodo_{ij}\]

\[ {b_0 \choose b_1} \sim N \left({0 \choose 0},{\sigma^2_{b0} \ \ \sigma^2_{b01} \choose \sigma^2_{b01} \ \ \sigma^2_{b1}} \right)\]

\[i = 1,~2,...,~24. ~~~ j = 1,~2, ...,~ 29\]

5. Modelo de regresión líneal mixto con intercepto y pediente aleatoria. Además con un término cuadrático y otro cúbico que acompaña a los efectos fijos.

\[mortalidad_{ij} \sim N(\mu_{ij}, \sigma^2)\]

\[\mu_{ij} = \beta_0 + \beta_1 id\_periodo_{ij} + \beta_2 id\_periodo_{ij}^2 + \beta_3 id\_periodo_{ij}^3 + \beta_{0i} + \beta_{1i} ~id\_periodo_{ij}\]

\[ {b_0 \choose b_1} \sim N \left({0 \choose 0},{\sigma^2_{b0} \ \ \sigma^2_{b01} \choose \sigma^2_{b01} \ \ \sigma^2_{b1}} \right)\]

\[i = 1,~2,...,~24. ~~~ j = 1,~2, ...,~ 29\]

5. Construccción de modelos

Se procede con la contrucción de los modelos de regresión definidos en la sección 4., para esto se utiliza el paquetes nlme que está horientado a la creación y manipulación de modelos de efectos mixtos con respuesta normalmente distribuida.

# Modelo 1
mod1 <- gls(mortalidad ~ 1 + id_periodo, data = dt_mortal)

# Modelo 2
mod2 <- lme(mortalidad ~ 1 + id_periodo, random =~ 1 | provincia,
             data = dt_mortal)

# Modelo 3
mod3 <- lme(mortalidad ~ 1 + id_periodo, random=~ 1 + id_periodo | provincia,
             data = dt_mortal)

# Modelo 3 hallado con el metodo de Máxima verosimilud no restringido para las comparaciones de los efectos fijos
mod3.2 <- lme(mortalidad ~ 1 + id_periodo, random=~ 1 + id_periodo | provincia,
             method = "ML", data = dt_mortal)

# Modelo 4
mod4 <- lme(mortalidad ~ 1 + id_periodo + I(id_periodo^2), random=~ 1 + id_periodo | provincia,
             data = dt_mortal)

# Modelo 4 hallado con el metodo de Máxima verosimilud no restringido para las comparaciones de los efectos fijos
mod4.2 <- lme(mortalidad ~ 1 + id_periodo + I(id_periodo^2), random=~ 1 + id_periodo | provincia,
             method = "ML",data = dt_mortal)

# Modelo 5
mod5 <- lme(mortalidad ~ 1 + id_periodo + I(id_periodo^2) + I(id_periodo^3),
            random=~ 1 + id_periodo | provincia, data = dt_mortal)

# Modelo 5 hallado con el metodo de Máxima verosimilud no restringido para las comparaciones de los efectos fijos
mod5.2 <- lme(mortalidad ~ 1 + id_periodo + I(id_periodo^2) + I(id_periodo^3),
            random=~ 1 + id_periodo | provincia,
             method = "ML",data = dt_mortal)

# Añadir valores ajustados a la base de datos
dt_mortal$pred1 <- predict(mod1, type = 'response', newdata = dt_mortal)
dt_mortal$pred2 <- predict(mod2, type = 'response', newdata = dt_mortal)
dt_mortal$pred3 <- predict(mod3, type = 'response', newdata = dt_mortal)
dt_mortal$pred4 <- predict(mod4, type = 'response', newdata = dt_mortal)
dt_mortal$pred5 <- predict(mod5, type = 'response', newdata = dt_mortal)

6. Comparación de modelos

6.1 Pruebas de hipótesis sobre componentes de varianza

Nota: Cabe aclarar que para probar la significancia de los efectos aleatorios, los modelos deben ser ajustados por el método de Máxima versimilitud restringido.

6.1.1 Prueba de Híporesis para la significancia de la componente de varianza de los interceptos aleatorios

\[H_{0}: \sigma^2_{b0} = 0 ~~~ vs ~~~ H_{1}: \sigma^2_{b0} > 0\] Estadístico de prueba: \(lrt= -2 \times (logLik(modelo ~1) - logLik(modelo ~2))\)

Donde \(lrt \sim \chi_1^2\)

Se rechaza \(H_{0}\) con un nivel de significancia de 0.05 si \(P(\chi_1^2 > lrt) < 0.05\)

Se puede realizar la prueba para esta componente de varianza mediante una tabla anova, pero es una prueba conservativa, entonces hay que tener cuidado con Valores-P grandes.

De la tabla anterior se tiene que \(lrt = 667.1689\) y \(P(\chi_1^2 > lrt) < 0.0001\) por lo que se rechaza la hipótesis nula y se tiene que la componente de varianza para el intercepto aleatorio es significativa y contribuye a la explicación de la tasa de mortalidad infantil de las provincias de Argentina.

6.1.2 Prueba de Híporesis para la significancia de la componente de varianza de las pendientes aleatorias y la componente de covarianza entre interceptos y pendientes aleatorias.

\[H_{0}: {\sigma^2_{b0} \ \ \sigma^2_{b01} \choose \sigma^2_{b01} \ \ \sigma^2_{b1}} = {\sigma^2_{b0} \ \ 0 \choose 0 \ \ ~~0} ~~~ vs ~~~ H_{1}: {\sigma^2_{b0} \ \ \sigma^2_{b01} \choose \sigma^2_{b01} \ \ \sigma^2_{b1}} = {\sigma^2_{b0}~~~~~~ \ \ \sigma^2_{b01} \neq 0 \choose \sigma^2_{b01} \neq0 \ \ \sigma^2_{b1}>0 }\] Estadístico de prueba: \(lrt= -2 \times (logLik(mododelo ~2) - logLik(modelo~3))\)

Donde \(lrt \sim \chi_2^2\)

Se rechaza \(H_{0}\) con un nivel de significancia de 0.05 si \(P(\chi_2^2 > lrt) < 0.05\)

Se puede realizar la prueba para este componente de varianza mediante una tabla anova, pero es una prueba conservativa, entonces hay que tener cuidado con Valores-P grandes.

De la tabla anterior se tiene que \(lrt = 225.8864\) y \(P(\chi_2^2 > lrt) < 0.0001\) por lo que se rechaza la hipótesis nula y se tiene que la componente de varianza para la pendiente aleatoria, además de la componente de covarianza entre el intecpeto y la pendiente aleatoria son significativas, por lo tanto contribuyen a la explicación de la tasa de mortalidad infantil de la provincias de Argentina.

6.2 Pruebas de hipótesis sobre los efectos fijos

Nota: Cabe aclarar que para probar la significancia de los efectos fijos, los modelos deben ser ajustados por el método de Máxima versimilitud no restringido.

6.2.1 Prueba de Híporesis para la significancia de la componente cuadrática de la covariable id_periodo

\[H_{0}: b_{2} = 0 ~~~ vs ~~~ H_{1}: b_{2} \neq 0\]

Estadístico de prueba: \(lrt= -2 \times (logLik(mododelo ~3) - logLik(modelo~4))\)

Donde \(lrt \sim \chi_1^2\)

Se rechaza \(H_{0}\) con un nivel de significancia de 0.05 si \(Valor-P=P(\chi_1^2 > lrt) < 0.05\)

Se puede realizar la prueba para este componente de varianza mediante una tabla anova, pero es una prueba anticonservativa, es decir, arroja Valores-P más pequeños de lo que en verdad son, entonces hay que tener cuidado con Valores-P pequeños.

Se tiene que \(lrt=117.6657\) y se nota que el Valor-P de la prueba es extremadamente pequeño, entonces puede que el verdadero Valor-P sea menor que 0.05. Aun así se procede a usar simulación para obtener un Valor-P más fiel a la realidad.

## [1] 0

Se obtiene un Valor-P aproximadamente igual a cero, por lo que efectivamente se rechaza la hipótesis nula y el factor cuadrático de la variable id_periodo es significativo en el modelo.

6.2.2 Prueba de Híporesis para la significancia de la componente cúbica de la covariable id_periodo

\[H_{0}: b_{3} = 0 ~~~ vs ~~~ H_{1}: b_{3} \neq 0\]

Estadístico de prueba: \(lrt= -2 \times (logLik(mododelo ~4) - logLik(modelo~5))\)

Donde \(lrt \sim \chi_1^2\)

Se rechaza \(H_{0}\) con un nivel de significancia de 0.05 si \(Valor-P=P(\chi_1^2 > lrt) < 0.05\)

Se puede realizar la prueba para este componente de varianza mediante una tabla anova, pero es una prueba anticonservativa, es decir, arroja Valores-P más pequeños de lo que en verdad son, entonces hay que tener cuidado con Valores-P pequeños.

De la tabla anova se tiene que \(lrt = 0.4256328\) y \(Valor-P=P(\chi_1^2 > lrt)\) es mucho mayor que 0.05, y este Valor-P es más pequeño que el real, entonces sin necesidad de usar simulación se tiene que la componente cúbica en el modelo no es significativa.

7. Análisis de residuales

7.1 Análisis de residuales para el modelo 4

En el gráfico de Residuales vs Valores ajustados, no se observa un patrón obvio por lo que no se evidencia la existencia de carencia de ajuste en el modelo. Por otro lado, tampoco se observan cambios de forma en la nube de puntos, por lo que el supuesto de varianza constante es razonable en el modelo. Aunque también se logran observar algunos puntos atípicos que se encuentran por fuera de la nube de puntos conjunta.

El supuesto de normalidad para los efectos aleatorios también es razonable ya que todos los puntos se encuentran cercanos a la recta de normalidad.

El supuesto de normalidad al parecer tiene problemas, ya que en los extremos varios puntos se alejan de la recta de normalidad. La manera más sencilla de solcionar este problema es aplicar una transformación logaritmica a la variable respuesta, es decir, a la tasa de mortalidad, ajustar de nuevo el modelo con la tasa de mortalidad en escala logaritmica y posteriormente aplicarle la transformación inversa para obterner los valores ajustados.

Para esto se procede a usar el siguiente código:

7.2 Análisis de residuales para el modelo 4 con respuesta transformada

En los gráficos anteriores se evidencia un comportamiento muy similar al que se observó con la variable tasa de mortalidad en su escala original, por lo que se siguen cumpliendo los supuestos anteriormente mencionados. (varianza constante y normalidad para los efectos aleatorios)

Por otro lado, en el gráfico de normalidad parece que se arregló el problema que tenía el modelo 4, el cuál se creó con la tasa de mortalidad en su escala original. Exceptuando algunos puntos en los extremos que parecen datos atípicos, para estar seguros se necesitaría investigar más afondo qué fue lo que pasó en ese periodo y en ese lugar, por el momento se dejará incluido.

8. Mejor Modelo

Mediante las pruebas de hipótesis se concluye que el mejor modelo para ajustar la tasa de mortalidad infantil en Argentina es el modelo 4. Pero en el análisis de residuales se encontró un problema con el supuesto de normalidad sobre la tasa de mortalidad infantil. Por lo tanto, se usa una trasnformación logarítmica sobre la tasa de mortalidad infantil y se crea un modelo sobre esta variable transformada para corregir los supuestos inválidos del modelo 4.

Finalmente el mejor modelo ajustado mediante el método de Máxima verosimilitud restringido es el siguiente:

\[Log[~ \widehat{\mu}_{ij}~]= 3.2924 - 0.0434~ id\_periodo_{ij} + 0.0002~id\_periodo_{ij}^2 + \widehat{\beta}_{0i} + \widehat{\beta}_{1i} ~id\_periodo_{ij}\] \[con ~~\widehat{\mu}_{ij} = \widehat{E}[~Tasa~de~mortalidad~infantil_{ij}~]\]

\[ {b_0 \choose b_1} \sim aprox ~ N \left({0 \choose 0},{0.0703 \ \ \ -0.0018 \choose -0.0018 \ \ 0.00002} \right)\]

\[i = 1,~2,...,~24. ~~~ j = 1,~2, ...\]

Donde \(i\) representa la identificación de las provincias de Argentina observadas en orden alfabetico y \(j\) representa el periodo/año de ocurrencia.

Puede parecer que las componentes de varianza para los efectos aleatorios son pequeñas pero esto es debido a que la tasa de mortalidad infantil con la que se ajustó el modelo está en escala logaritmica.

8.1 Representación gráfica del mejor modelo ajustado y para los demás modelos descritos en esta aplicación

Como se puede observar, el uso de modelos con efectos aleatorios mejora en gran medida las estimaciones para la tasa de mortalidad infantil por mil nacidos vivos en Argentina, así mismo el mejor modelo explica muy bien el comportamiento de este índice.

Mejor Modelo

Modelo 1

Modelo 2

Modelo 3

Modelo 4

Referencias

Freddy Hernández Barajas, Jorge Leonardo López Martínez (2020-03-15). Modelos Mixtos con R. https://fhernanb.github.io/libro_modelos_mixtos/

Andrew Gelman, Jennifer Hill (2007). Data Analysis Using Regression and Multilevel/Hierarchical Models.

Pinheiro J, Bates D, DebRoy S, Sarkar D, R Core Team (2020). nlme: Linear and Nonlinear Mixed Effects Models.

Wickham H, Averick M, Bryan J, Chang W, McGowan LD, François R, Grolemund G, Hayes A, Henry L, Hester J, Kuhn M, Pedersen TL, Miller E, Bache SM, Müller K, Ooms J, Robinson D, Seidel DP, Spinu V, Takahashi K, Vaughan D, Wilke C, Woo K, Yutani H (2019). “Welcome to the tidyverse.” Journal of Open Source Software, 4(43), 1686.

Dongwen Luo, Siva Ganesh and John Koolaard. predictmeans: Providing functions to diagnose and make inferences from various linear models.

LS0tDQp0aXRsZTogIkFwbGljYWNpw7NuIGRlIG1vZGVsb3MgbWl4dG9zIHBhcmEgYWp1c3RhciBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgZW4gQXJnZW50aW5hIg0KYXV0aG9yOiAiSmFpbWUgQW5kcmVzIE1vbGluYSBDb3JyZWEiDQpkYXRlOiAiMTYvMy8yMDIwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICBoaWdobGlnaHQ6IGthdGUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBUUlVFDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQojIFBhcXVldGUgb3JpZW50YWRvIGEgbGEgY3JlYWNpw7NuIGRlIG1vZGVsb3MgbWl4dG9zIGNvbiByZXNwdWVzdGEgbm9ybWFsLg0KbGlicmFyeShubG1lKQ0KDQojIFBhcXVldGUgb3JpZW50YWRvIGFsIGFuw6FsaXNpcyBkZXNjcmlwdGl2by4NCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQojIHBhcXVldGUgcGFyYSBlbCBhbsOhbGlzaXMgZGUgcmVzaWR1YWxlcw0KbGlicmFyeShwcmVkaWN0bWVhbnMpDQoNCmBgYA0KDQojIyAxLiBEZXNjcmlwY2nDs24NCg0KTGEgdGFzYSBkZSBtb3J0YWxpZGFkIGluZmFudGlsIGVzIGVsIGluZGljYWRvciBkZW1vZ3LDoWZpY28gcXVlIHNlw7FhbGEgZWwgbsO6bWVybyBkZSBkZWZ1bmNpb25lcyBkZSBuacOxb3MgZW4gdW5hIHBvYmxhY2nDs24gZGUgY2FkYSBtaWwgbmFjaW1pZW50b3Mgdml2b3MgcmVnaXN0cmFkb3MsIGR1cmFudGUgZWwgcHJpbWVyIGHDsW8gZGUgc3UgdmlkYS4NCg0KTGEgY29uc2lkZXJhY2nDs24gZGVsIHByaW1lciBhw7FvIGRlIHZpZGEgcGFyYSBlc3RhYmxlY2VyIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBzZSBkZWJlIGEgcXVlIGVsIHByaW1lciBhw7FvIGRlIHZpZGEgZXMgZWwgbcOhcyBjcsOtdGljbyBlbiBsYSBzdXBlcnZpdmVuY2lhIGRlbCBzZXIgaHVtYW5vLCBjdWFuZG8gc2Ugc29icmVwYXNhIGVsIHByaW1lciBhw7FvIGRlIG5hY2ltaWVudG8sIGxhcyBwcm9iYWJpbGlkYWRlcyBkZSBzdXBlcnZpdmVuY2lhIGF1bWVudGFuIGRyw6FzdGljYW1lbnRlLiANCg0KIVtdKGltYWdlbi5qcGVnKXt3aWR0aD00MjBweH0NCg0KRW4gQXJnZW50aW5hIHNlIGhhIHJlZ2lzdHJhZG8gdW4gZGVjcmVjaW1pZW50byBlbiBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgZGViaWRvIGEgZGl2ZXJzb3MgZmFjdG9yZXMgY29tbyBsYSBpbXBsZW1lbnRhY2nDs24gZGUgcG9sw610aWNhcyBkZSBzYWx1YnJpZGFkLCBlbCBkZWNyZWNpbWllbnRvIGVuIGVsIG7Dum1lcm8gZGUgZW1iYXJhem9zIGVuIGFkb2xlc2NlbnRlcywgZW50cmUgb3Ryb3MuIEVzIGltcG9ydGFudGUgbGEgaW1wbGVtZW50YWNpw7NuIGRlIG1vZGVsb3MgcXVlIGV4cGxpcXVlbiBlbCBjb21wb3J0YW1pZW50byBkZSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgZW4gQXJnZW50aW5hIHBhcmEgdGVuZXIgdW5hIGVzdGltYWNpw7NuIGRlIHRhbCDDrW5kaWNlIGVuIGHDsW9zIHN1cHNlY3VlbnRlcyB5IHNhYmVyIHNpIGhheSBxdWUgdG9tYXIgbWVkaWRhcyBwYXJhIGNvbnRyb2xhcmxvLg0KDQojIyMgMS4xIExlY3R1cmEgZGUgbGEgYmFzZSBkZSBkYXRvcw0KDQpMaW5rIGRlIGRlc2NhcmdhOiBodHRwczovL2RhdG9zLmdvYi5hci9kYXRhc2V0L3NhbHVkLXRhc2EtbW9ydGFsaWRhZC1pbmZhbnRpbC9hcmNoaXZvL3NhbHVkX2MxMjUzODk3LWQ1MDctNDFmNy1hM2UxLTZlZDc1NmU3MjQzYg0KDQpMaW5rIGRlIHByb3BpZXRhcmlvOiBodHRwczovL3d3dy5hcmdlbnRpbmEuZ29iLmFyL3NhbHVkDQoNCmBgYHtyfQ0KYmFzZV9tb3IgPC0gcmVhZC5jc3YoInRhc2EtbW9ydGFsaWRhZC1pbmZhbnRpbC5jc3YiLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KYmFzZV9tb3IgPC0gYmFzZV9tb3IgJT4lIHJlbmFtZShwZXJpb2RvID0gw68uLmluZGljZV90aWVtcG8sIGFyZ2VudGluYSA9IG1vcnRhbGlkYWRfaW5mYW50aWxfYXJnZW50aW5hLCBjYWJhID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9jYWJhLCBidWVub3NfYWlyZXMgPSBtb3J0YWxpZGFkX2luZmFudGlsX2J1ZW5vc2FpcmVzLCBjYXRhbWFyY2EgPSBtb3J0YWxpZGFkX2luZmFudGlsX2NhdGFtYXJjYSwgY29yZG9iYSA9ICBtb3J0YWxpZGFkX2luZmFudGlsX2NvcmRvYmEsIGNvcnJpZW50ZXMgPSBtb3J0YWxpZGFkX2luZmFudGlsX2NvcnJpZW50ZXMsIGNoYWNvID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9jaGFjbywgY2h1YnV0ID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9jaHVidXQsIGVudHJlX3Jpb3MgPSBtb3J0YWxpZGFkX2luZmFudGlsX2VudHJlcmlvcywgZm9ybW9zYSA9IG1vcnRhbGlkYWRfaW5mYW50aWxfZm9ybW9zYSwganVqdXkgPSAgbW9ydGFsaWRhZF9pbmZhbnRpbF9qdWp1eSwgbGFfcGFtcGEgPSBtb3J0YWxpZGFkX2luZmFudGlsX2xhcGFtcGEsIGxhX3Jpb2phID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9sYXJpb2phLCBtZW5kb3phID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9tZW5kb3phLCBtaXNpb25lcyA9IG1vcnRhbGlkYWRfaW5mYW50aWxfbWlzaW9uZXMsIG5ldXF1ZW4gPSBtb3J0YWxpZGFkX2luZmFudGlsX25ldXF1ZW4sIHJpb19uZWdybyA9IG1vcnRhbGlkYWRfaW5mYW50aWxfcmlvbmVncm8sIHNhbHRhID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9zYWx0YSwgc2FuX2p1YW4gPSBtb3J0YWxpZGFkX2luZmFudGlsX3Nhbmp1YW4sIHNhbl9sdWlzID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9zYW5sdWlzLCBzYW50YV9jcnV6ID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9zYW50YWNydXosIHNhbnRhX2ZlID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9zYW50YWZlLCBzYW50aWFnb19kZWxfZXN0ZXJvID0gbW9ydGFsaWRhZF9pbmZhbnRpbF9zYW50aWFnb2RlbGVzdGVybywgdHVjdW1hbiA9IG1vcnRhbGlkYWRfaW5mYW50aWxfdHVjdW1hbiwgdGllcnJhX2RlbF9mdWVnbyA9IG1vcnRhbGlkYWRfaW5mYW50aWxfdGllcnJhZGVsZnVlZ28pDQoNCmJhc2VfbW9yIDwtIGJhc2VfbW9yICU+JSBtdXRhdGUoYXJnZW50aW5hID0gTlVMTCkNCmBgYA0KDQpUcmFuZm9ybWFyIGxhIGJhc2UgZGUgZGF0b3MgYSBmb3JtYXRvIGxhcmdvIHkgY3JlYWNpw7NuIGRlIHZhcmlhYmxlIGluZGljYWRvcmEgcGFyYSBlbCBwZXJpb2RvLg0KDQpgYGB7cn0NCmJhc2VfbW9yIDwtIGJhc2VfbW9yICU+JSBtdXRhdGUoaWRfcGVyaW9kbyA9IDE6MjksIGFyZ2VudGluYSA9IE5VTEwpDQoNCmR0X21vcnRhbCA8LSAgYmFzZV9tb3IgJT4lIGdhdGhlcihwcm92aW5jaWEsIG1vcnRhbGlkYWQsIGNhYmE6dGllcnJhX2RlbF9mdWVnbykNCmR0X21vcnRhbCRwcm92aW5jaWEgPC0gYXMuZmFjdG9yKGR0X21vcnRhbCRwcm92aW5jaWEpDQoNCmR0X21vcnRhbCA8LSBkdF9tb3J0YWwgJT4lIHNlbGVjdChwcm92aW5jaWEgPSBwcm92aW5jaWEsIGlkX3BlcmlvZG8gPSBpZF9wZXJpb2RvLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZG8gPSBwZXJpb2RvLCBtb3J0YWxpZGFkID0gbW9ydGFsaWRhZCkgJT4lIGFycmFuZ2UocHJvdmluY2lhKQ0KYGBgDQoNCiMjIyAxLjIgRGVzY3JpcGNpw7NuIGRlIGxhcyB2YXJpYWJsZXMNCg0KYGBge3IsIHJvd3MucHJpbnQgPSA0LCBjb2xzLnByaW50ID0gMywgZWNobz1GQUxTRX0NCihkZXNjcmlwY2lvbiA8LSBkYXRhLmZyYW1lKG5vbWJyZV92YXJpYWJsZSA9IGMoInBlcmlvZG8iLCAiaWRfcGVyaW9kbyIsICJwcm92aW5jaWEiLCAibW9ydGFsaWRhZCIpLCBkZXNjcmlwY2lvbiA9IGMoIlBlcmlvZG8gZW4gZWwgcXVlIHNlIHNlIG9ic2VydsOzIiwgIklkZW50aWZpY2FjacOzbiBkZWwgcGVyaW9kbyIsICJQcm92aW5jaWEgZGUgQXJnZW50aW5hIGVuIGxhIHF1ZSBzZSBvYnNlcnbDsyIsICJUYXNhIGRlIG1vcnRhbGlkYWQgcG9yIDEwMDAgbmFjaWRvcyB2aXZvcyIpLCB0aXBvX2RlX3ZhcmlhYmxlID0gYygiRmFjdG9yICgyOSBsZXZlbHMpIiwgImludCAoMToyOSkiLCAiRmFjdG9yICgyNCBsZXZlbHMpIiwgIm51bSIpKSkNCmBgYA0KDQpUYXNhIGRlIE1vcnRhbGlkYWQgSW5mYW50aWwgZW4gZWwgcHJpbWVyIGHDsW8gZGUgbmFjaWRvIHBvciBtaWwgbmFjaWRvcyB2aXZvcyBjb24ganVyaXNkaWNjacOzbiBkZSByZXNpZGVuY2lhIGRlIGxhIG1hZHJlIG9jdXJyaWRvcyBlbiBsYSBSZXDDumJsaWNhIEFyZ2VudGluYS4gTGEgYmFzZSBjb250aWVuZSAyNCBwcm92aW5jaWFzIGRpZmVyZW50ZXMgZGUgQXJnZW50aW5hIHkgMjkgcGVyaW9kb3MgZGlmZXJlbnRlcyAoZGVzZGUgMTk5MC0wMS0wMSBoYXN0YSAyMDE4LTAxLTAxKSwgcG9yIGNhZGEgY29tYmluYW5jacOzbiBkZSBwcm92aW5jaWEtcGVyaW9kbyBoYXkgdW4gdmFsb3IgcGFyYSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwuDQoNCiFbXShtYXBhLmpwZyl7d2lkdGg9MzMwcHh9DQoNCiMjIyAxLjMgVmlzdGEgZGUgbGEgYmFzZSBkZSBkYXRvcw0KDQpgYGB7ciwgcm93cy5wcmludCA9IDYsIGNvbHMucHJpbnQgPSA0LCBwYWdlcy5wcmludCA9IDEwMCwgZWNobz1GQUxTRX0NCmR0X21vcnRhbA0KYGBgDQoNCiMjIDIuIE9iamV0aXZvcw0KDQojIyMgMi4xIE9iamV0aXZvcyBnZW5lcmFsZXMNCg0KMS4gRW5jb250cmFyIGVsIG1lam9yIG1vZGVsbyBwcmVkaWN0aXZvIHF1ZSBleHBsaXF1ZSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgYSBsbyBsYXJnbyBkZWwgdGllbXBvIGVuIGxhIFJlcMO6YmxpY2EgQXJnZW50aW5hIGRpc2NyaW1pbmFuZG8gcG9yIGxhcyBkaWZlcmVudGVzIHByb3ZpbmNpYXMgZGVsIHBhw61zLg0KDQoyLiBFeGhpYmlyIGxhIHV0aWxpZGFkIGUgaW1wb3J0YW5jaWEgZGUgbG9zIG1vZGVsb3MgbWl4dG9zIGN1YW5kbyBzZSB0aWVuZW4gZGF0b3MgYWdydXBhZG9zLg0KDQojIyMgMi4yIE9iamV0aXZvcyBlc3BlY8OtZmljb3MNCg0KMS4gRW5jb250cmFyIHBvc2libGVzIGN1cnZhdHVyYXMgZW4gbG9zIGRpYWdyYW1hcyBkZSBkaXNwZXJpc2nDs24uDQoNCjIuIENyZWFyIG1vZGVsb3MgcHJlZGl0aXZvcyBlbiBiYXNlIGFsIGFuw6FsaXNpcyBkZXNjcmlwdGl2by4NCg0KMi4gUHJvYmFyIGxhIHNpZ25pZmljYW5jaWEgZGUgbG9zIGVmZWN0b3MgYWxlYXRvcmlvcyBlbiBlbCBtb2RlbG8uDQoNCjMuIFByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGxvcyBlZmVjdG9zIGZpam9zIGVuIGVsIG1vZGVsby4NCg0KNS4gQ29tcGFyYXIgbG9zIG1vZGVsb3MgcHJlZGljdGl2b3MgeSBlc2NvZ2VyIGVsIG1lam9yIG1vZGVsbyBtZWRpYW50ZSBwcnVlYmFzIGRlIGhpcMOzdGVzaXMuDQoNCiMjIDMuIEFuw6FsaXNpcyBkZXNjcmlwdGl2bw0KDQpTaWVtcHJlIGVzIMO6dGlsIGNvbWVuemFyIGxhIGV4cGxvcmFjacOzbiBkZSBsb3MgZGF0b3MgY3JlYW5kbyBncsOhZmljb3MgZGUgZGlzcGVyY2nDs24gcGFyYSB0ZW5lciB1bmEgaWRlYSBkZWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdmFyaWFibGUgcmVzcHVlc3RhLCBlbiBlc3RlIGNhc28sIGRlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBwb3IgbWlsIG5pw7FvcyhhcykgbmFjaWRvcyB2aXZvcy4NCg0KYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMH0NCmdncGxvdChkYXRhID0gZHRfbW9ydGFsLCBhZXMoeCA9IGlkX3BlcmlvZG8sIHkgPSBtb3J0YWxpZGFkLCBjb2xvciA9IHByb3ZpbmNpYSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgdGhlbWVfYncoKSArIA0KICBsYWJzKHkgPSAiVGFzYSBkZSBtb3J0YWxpZGFkIikgKw0KICBnZ3RpdGxlICgiR3LDoWZpY28gZGUgZGlzcGVyc2nDs24gZGUgUGVyaW9kbyB2cyBUYXNhIGRlIG1vcnRhbGlkYWQiKQ0KYGBgDQoNClNlIG9ic2VydmEgZW4gbGEgbnViZSBkZSBwdW50b3MgcXVlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBjb25qdW50YSBkZSBsYXMgcHJvdmluY2lhcyBkZSBBcmdlbnRpbmEgYWwgcGFyZWNlciBkZWNyZWNlIGNvbmp1bnRhbWVudGUuIEFkZW3DoXMsIHBhcmVjZSBxdWUgZGlzbWludXllIGxhIHZhcmlhYmlsaWRhZCBjb25mb3JtZSBwYXNhIGVsIHRpZW1wby4gUG9yIGxvIHF1ZSBhbCBhanVzdGFyIHVuIG1vZGVsbyBkZSByZWdyZXPDrW9uIGzDrW5lYWwgY2zDoXNpY28gYSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgY29uanVudGEgZGUgbGFzIHByb3ZpbmNpYXMsIHB1ZWRlIHF1ZSBleGl0YW4gcHJvYmxlbWFzIGNvbiBlbCBzdXB1ZXN0byBkZSB2YXJpYW56YSBjb25zdGFudGUuDQoNClNlIHByb2NlZGUgYSBjcmVhciB1biBncmFmaWNvIGRlIGRpc3BlcnNpw7NuIGRpZmVyZW50ZSBwb3IgY2FkYSBwcm92aW5jaWEsIHBhcmEgYW7DoWxpc2FyIGRlIG1lam9yIG1hbmVyYSBlbCBjb21wb3J0YW1pZW50byBpbmRpdmlkdWFsIGRlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBlbiBjYWRhIHByb3ZpbmNpYS4NCg0KYGBge3IsIGZpZy5oZWlnaHQgPSA4LCBmaWcud2lkdGggPSAxMH0NCmdncGxvdChkYXRhID0gZHRfbW9ydGFsLCBhZXMoeCA9IGlkX3BlcmlvZG8sIHkgPSBtb3J0YWxpZGFkLCBjb2xvciA9IHByb3ZpbmNpYSkpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgdGhlbWVfYncoKSArDQogIGxhYnMoeSA9ICJUYXNhIGRlIG1vcnRhbGlkYWQiKSArDQogIGdndGl0bGUgKCJHcsOhZmljbyBkZSBkaXNwZXJzacOzbiBkZSBQZXJpb2RvIHZzIFRhc2EgZGUgbW9ydGFsaWRhZCIpICsNCiAgZmFjZXRfd3JhcCh+IHByb3ZpbmNpYSkNCmBgYA0KDQpFbiBsYSBmaWd1cmEgYW50ZXJpb3Igc2Ugb2JzZXJ2YSBxdWUgbGEgbnVldmUgZGUgcHVudG9zIGVuIGNhZGEgdW5hIGRlIGxhcyBwcm92aW5jaWFzIGVmZWN0aXZhbWVudGUgZXMgZGVjcmVjaWVudGUsIHBlcm8gZW4gVHVjdW1hbiBleGlzdGUgdW4gaW5jcmVtZW50byBlbiBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgYWwgcmVkZWRvciBkZWwgcGVyaW9kbyAxMCBxdWUgZXMgMTk5OS0wMS0wMS4gRW4gY29ycmllbnRlcyBoYXkgdW4gdmFsb3IgZGUgbGEgdGFzYSBkZSBtb3J0YWxpZGFkIHF1ZSBzZSBzYWxlIGRlIGxhIHRlbmRlbmNpYSBkZSBsYSBudWJlIGRlIHB1bnRvcyBlbiBlbCBwZXJpb2RvIDExIHF1ZSBlcyAyMDAwLTAxLTAxLg0KDQpUYW1iacOpbiBzZSBvYnNlcnZhIHF1ZSBsb3MgaW50ZXJjZXB0b3Mgc29uIGRpZmVyZW50ZXMgZW4gY2FkYSBwcm92aW5jaWEsIHBvciBsbyBxdWUgbGEgY3JlYWNpw7NuIGRlIG1vZGVsb3MgbWl4dG9zIHB1ZWRlIHNlciBiZW5lZmljaW9zYSBwYXJhIGV4cGxpY2FyIGVsIGNvbXBvcnRhbWllbnRvIGRlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBlbiBBcmdlbnRpbmEuDQoNCkVuIGFsZ3VuYXMgcHJvdmluY2lhcyBzZSBub3RhIHVuYSBwb3NpYmxlIGN1cnZhdHVyYSBlbiBsYSBudWJlIGRlIHB1bnRvcywgcG9yIGVqZW1wbG8gZW4gU2FudGEgZmUsIFNhbnRpYWdvIGRlbCBlc3RlZmVybywgVGllcnJhIGRlbCBmdWVnby4gUG9yIGxvIHF1ZSBzZXLDrWEgaW50ZXJlc2FudGUgaW5jbHVpciB1biBwb2xpbm9taW8gZGUgZ3JhZG8gMiBzb2JyZSBsYSB2YXJpYWJsZSBpZF9wZXJpb2RvLiBFbCBkaWFncmFtYSBkZSBkaXNwZXJpc2nDs24gZGUgVHVjdW1hbiBhbCB0ZW5lciBhbHJlZGVkb3IgZGUgNCBvIDUgY3VydmFzIG5lY2VzaXRhcsOtYSBsYSBpbmNsdXNpw7NuIGRlIHVuIHBvbGlub21pbyBncmFkbyA0IG8gNSBwYXJhIGV4cGxpY2FyIHN1IG51YmUgZGUgcHVudG9zIHBlcm8gYWwgc2VyIGxhIMO6bmljYSBwcm92aW5jaWEgY29uIGVzdGUgY29tcG9ydGFtaWVudG8sIGVzIG5lY2VzYXJpbyBjb25zdWx0YXIgY29uIHVuIGV4cGVydG8gbyBjb25vY2Vkb3IgZGVsIHRlbWEgcGFyYSBzYWJlciBxdWUgcGFzw7MgZHVyYW50ZSBlc29zIGHDsW9zIGVuIGVzdGEgcHJvdmluY2lhLg0KDQojIyA0LiBNb2RlbG9zIGEgY29uc2lkZXJhcg0KDQojIyMjIDEuIE1vZGVsbyBkZSByZWdyZXNpw7NuIGzDrW5lYWwgY2zDoXNpY28uDQoNCiQkbW9ydGFsaWRhZF97an0gXHNpbSBOKFxtdV97an0sIFxzaWdtYV4yKSQkDQoNCiQkXG11X2ogPSBcYmV0YV8wICsgXGJldGFfMSBpZFxfcGVyaW9kb197an0kJA0KDQokJGogPSAxLH4yLCAuLi4sfiAyOSQkDQoNClx2c3BhY2V7NXB0fQ0KDQojIyMjIDIuIE1vZGVsbyBkZSByZWdyZXNpw7NuIGzDrW5lYWwgbWl4dG8gY29uIGludGVyY2VwdG8gYWxlYXRvcmlvDQoNCiQkbW9ydGFsaWRhZF97aWp9IFxzaW0gTihcbXVfe2lqfSwgXHNpZ21hXjIpJCQNCiQkXG11X3tpan0gPSBcYmV0YV8wICsgXGJldGFfMSBpZFxfcGVyaW9kb197aWp9ICsgXGJldGFfezBpfSQkDQoNCiQkYl97MH0gXHNpbSBOKDAsIFxzaWdtYV4yX3tiMH0pJCQNCg0KJCRpID0gMSx+MiwuLi4sfjI0LiB+fn4gaiA9IDEsfjIsIC4uLix+IDI5JCQNClx2c3BhY2V7NXB0fQ0KDQojIyMjIDMuIE1vZGVsbyBkZSByZWdyZXNpw7NuIGzDrW5lYWwgbWl4dG8gY29uIGludGVyY2VwdG8geSBwZW5kaWVudGUgYWxlYXRvcmlhDQoNCiQkbW9ydGFsaWRhZF97aWp9IFxzaW0gTihcbXVfe2lqfSwgXHNpZ21hXjIpJCQNCg0KJCRcbXVfe2lqfSA9IFxiZXRhXzAgKyBcYmV0YV8xIGlkXF9wZXJpb2RvX3tpan0gKyBcYmV0YV97MGl9ICsgXGJldGFfezFpfSB+aWRcX3BlcmlvZG9fe2lqfSQkDQoNCiQkIHtiXzAgXGNob29zZSBiXzF9IFxzaW0gTiBcbGVmdCh7MCBcY2hvb3NlIDB9LHtcc2lnbWFeMl97YjB9IFwgIFwgXHNpZ21hXjJfe2IwMX0gXGNob29zZSBcc2lnbWFeMl97YjAxfSBcIFwgXHNpZ21hXjJfe2IxfX0gXHJpZ2h0KSQkDQoNCiQkaSA9IDEsfjIsLi4uLH4yNC4gfn5+IGogPSAxLH4yLCAuLi4sfiAyOSQkDQpcdnNwYWNlezVwdH0NCg0KIyMjIyA0LiBNb2RlbG8gZGUgcmVncmVzacOzbiBsw61uZWFsIG1peHRvIGNvbiBpbnRlcmNlcHRvIHkgcGVkaWVudGUgYWxlYXRvcmlhLiBBZGVtw6FzIGNvbiB1biB0w6lybWlubyBjdWFkcsOhdGljbyBxdWUgYWNvbXBhw7FhIGEgbG9zIGVmZWN0b3MgZmlqb3MuDQoNCiQkbW9ydGFsaWRhZF97aWp9IFxzaW0gTihcbXVfe2lqfSwgXHNpZ21hXjIpJCQNCg0KJCRcbXVfe2lqfSA9IFxiZXRhXzAgKyBcYmV0YV8xIGlkXF9wZXJpb2RvX3tpan0gKyBcYmV0YV8yIGlkXF9wZXJpb2RvX3tpan1eMiArIFxiZXRhX3swaX0gKyBcYmV0YV97MWl9IH5pZFxfcGVyaW9kb197aWp9JCQNCg0KJCQge2JfMCBcY2hvb3NlIGJfMX0gXHNpbSBOIFxsZWZ0KHswIFxjaG9vc2UgMH0se1xzaWdtYV4yX3tiMH0gXCAgXCBcc2lnbWFeMl97YjAxfSBcY2hvb3NlIFxzaWdtYV4yX3tiMDF9IFwgXCBcc2lnbWFeMl97YjF9fSBccmlnaHQpJCQNCg0KJCRpID0gMSx+MiwuLi4sfjI0LiB+fn4gaiA9IDEsfjIsIC4uLix+IDI5JCQNCg0KIyMjIyA1LiBNb2RlbG8gZGUgcmVncmVzacOzbiBsw61uZWFsIG1peHRvIGNvbiBpbnRlcmNlcHRvIHkgcGVkaWVudGUgYWxlYXRvcmlhLiBBZGVtw6FzIGNvbiB1biB0w6lybWlubyBjdWFkcsOhdGljbyB5IG90cm8gY8O6YmljbyBxdWUgYWNvbXBhw7FhIGEgbG9zIGVmZWN0b3MgZmlqb3MuDQoNCiQkbW9ydGFsaWRhZF97aWp9IFxzaW0gTihcbXVfe2lqfSwgXHNpZ21hXjIpJCQNCg0KJCRcbXVfe2lqfSA9IFxiZXRhXzAgKyBcYmV0YV8xIGlkXF9wZXJpb2RvX3tpan0gKyBcYmV0YV8yIGlkXF9wZXJpb2RvX3tpan1eMiArIFxiZXRhXzMgaWRcX3BlcmlvZG9fe2lqfV4zICsgXGJldGFfezBpfSArIFxiZXRhX3sxaX0gfmlkXF9wZXJpb2RvX3tpan0kJA0KDQokJCB7Yl8wIFxjaG9vc2UgYl8xfSBcc2ltIE4gXGxlZnQoezAgXGNob29zZSAwfSx7XHNpZ21hXjJfe2IwfSBcICBcIFxzaWdtYV4yX3tiMDF9IFxjaG9vc2UgXHNpZ21hXjJfe2IwMX0gXCBcIFxzaWdtYV4yX3tiMX19IFxyaWdodCkkJA0KDQokJGkgPSAxLH4yLC4uLix+MjQuIH5+fiBqID0gMSx+MiwgLi4uLH4gMjkkJA0KDQojIyA1LiBDb25zdHJ1Y2NjacOzbiBkZSBtb2RlbG9zDQoNClNlIHByb2NlZGUgY29uIGxhIGNvbnRydWNjacOzbiBkZSBsb3MgbW9kZWxvcyBkZSByZWdyZXNpw7NuIGRlZmluaWRvcyBlbiBsYSBzZWNjacOzbiA0LiwgcGFyYSBlc3RvIHNlIHV0aWxpemEgZWwgcGFxdWV0ZXMgbmxtZSBxdWUgZXN0w6EgaG9yaWVudGFkbyBhIGxhIGNyZWFjacOzbiB5IG1hbmlwdWxhY2nDs24gZGUgbW9kZWxvcyBkZSBlZmVjdG9zIG1peHRvcyBjb24gcmVzcHVlc3RhIG5vcm1hbG1lbnRlIGRpc3RyaWJ1aWRhLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCiMgTW9kZWxvIDENCm1vZDEgPC0gZ2xzKG1vcnRhbGlkYWQgfiAxICsgaWRfcGVyaW9kbywgZGF0YSA9IGR0X21vcnRhbCkNCg0KIyBNb2RlbG8gMg0KbW9kMiA8LSBsbWUobW9ydGFsaWRhZCB+IDEgKyBpZF9wZXJpb2RvLCByYW5kb20gPX4gMSB8IHByb3ZpbmNpYSwNCiAgICAgICAgICAgICBkYXRhID0gZHRfbW9ydGFsKQ0KDQojIE1vZGVsbyAzDQptb2QzIDwtIGxtZShtb3J0YWxpZGFkIH4gMSArIGlkX3BlcmlvZG8sIHJhbmRvbT1+IDEgKyBpZF9wZXJpb2RvIHwgcHJvdmluY2lhLA0KICAgICAgICAgICAgIGRhdGEgPSBkdF9tb3J0YWwpDQoNCiMgTW9kZWxvIDMgaGFsbGFkbyBjb24gZWwgbWV0b2RvIGRlIE3DoXhpbWEgdmVyb3NpbWlsdWQgbm8gcmVzdHJpbmdpZG8gcGFyYSBsYXMgY29tcGFyYWNpb25lcyBkZSBsb3MgZWZlY3RvcyBmaWpvcw0KbW9kMy4yIDwtIGxtZShtb3J0YWxpZGFkIH4gMSArIGlkX3BlcmlvZG8sIHJhbmRvbT1+IDEgKyBpZF9wZXJpb2RvIHwgcHJvdmluY2lhLA0KICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsIGRhdGEgPSBkdF9tb3J0YWwpDQoNCiMgTW9kZWxvIDQNCm1vZDQgPC0gbG1lKG1vcnRhbGlkYWQgfiAxICsgaWRfcGVyaW9kbyArIEkoaWRfcGVyaW9kb14yKSwgcmFuZG9tPX4gMSArIGlkX3BlcmlvZG8gfCBwcm92aW5jaWEsDQogICAgICAgICAgICAgZGF0YSA9IGR0X21vcnRhbCkNCg0KIyBNb2RlbG8gNCBoYWxsYWRvIGNvbiBlbCBtZXRvZG8gZGUgTcOheGltYSB2ZXJvc2ltaWx1ZCBubyByZXN0cmluZ2lkbyBwYXJhIGxhcyBjb21wYXJhY2lvbmVzIGRlIGxvcyBlZmVjdG9zIGZpam9zDQptb2Q0LjIgPC0gbG1lKG1vcnRhbGlkYWQgfiAxICsgaWRfcGVyaW9kbyArIEkoaWRfcGVyaW9kb14yKSwgcmFuZG9tPX4gMSArIGlkX3BlcmlvZG8gfCBwcm92aW5jaWEsDQogICAgICAgICAgICAgbWV0aG9kID0gIk1MIixkYXRhID0gZHRfbW9ydGFsKQ0KDQojIE1vZGVsbyA1DQptb2Q1IDwtIGxtZShtb3J0YWxpZGFkIH4gMSArIGlkX3BlcmlvZG8gKyBJKGlkX3BlcmlvZG9eMikgKyBJKGlkX3BlcmlvZG9eMyksDQogICAgICAgICAgICByYW5kb209fiAxICsgaWRfcGVyaW9kbyB8IHByb3ZpbmNpYSwgZGF0YSA9IGR0X21vcnRhbCkNCg0KIyBNb2RlbG8gNSBoYWxsYWRvIGNvbiBlbCBtZXRvZG8gZGUgTcOheGltYSB2ZXJvc2ltaWx1ZCBubyByZXN0cmluZ2lkbyBwYXJhIGxhcyBjb21wYXJhY2lvbmVzIGRlIGxvcyBlZmVjdG9zIGZpam9zDQptb2Q1LjIgPC0gbG1lKG1vcnRhbGlkYWQgfiAxICsgaWRfcGVyaW9kbyArIEkoaWRfcGVyaW9kb14yKSArIEkoaWRfcGVyaW9kb14zKSwNCiAgICAgICAgICAgIHJhbmRvbT1+IDEgKyBpZF9wZXJpb2RvIHwgcHJvdmluY2lhLA0KICAgICAgICAgICAgIG1ldGhvZCA9ICJNTCIsZGF0YSA9IGR0X21vcnRhbCkNCg0KIyBBw7FhZGlyIHZhbG9yZXMgYWp1c3RhZG9zIGEgbGEgYmFzZSBkZSBkYXRvcw0KZHRfbW9ydGFsJHByZWQxIDwtIHByZWRpY3QobW9kMSwgdHlwZSA9ICdyZXNwb25zZScsIG5ld2RhdGEgPSBkdF9tb3J0YWwpDQpkdF9tb3J0YWwkcHJlZDIgPC0gcHJlZGljdChtb2QyLCB0eXBlID0gJ3Jlc3BvbnNlJywgbmV3ZGF0YSA9IGR0X21vcnRhbCkNCmR0X21vcnRhbCRwcmVkMyA8LSBwcmVkaWN0KG1vZDMsIHR5cGUgPSAncmVzcG9uc2UnLCBuZXdkYXRhID0gZHRfbW9ydGFsKQ0KZHRfbW9ydGFsJHByZWQ0IDwtIHByZWRpY3QobW9kNCwgdHlwZSA9ICdyZXNwb25zZScsIG5ld2RhdGEgPSBkdF9tb3J0YWwpDQpkdF9tb3J0YWwkcHJlZDUgPC0gcHJlZGljdChtb2Q1LCB0eXBlID0gJ3Jlc3BvbnNlJywgbmV3ZGF0YSA9IGR0X21vcnRhbCkNCmBgYA0KDQojIyA2LiBDb21wYXJhY2nDs24gZGUgbW9kZWxvcyANCg0KIyMjIDYuMSBQcnVlYmFzIGRlIGhpcMOzdGVzaXMgc29icmUgY29tcG9uZW50ZXMgZGUgdmFyaWFuemENCg0KTm90YTogQ2FiZSBhY2xhcmFyIHF1ZSBwYXJhIHByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGxvcyBlZmVjdG9zIGFsZWF0b3Jpb3MsIGxvcyBtb2RlbG9zIGRlYmVuIHNlciBhanVzdGFkb3MgcG9yIGVsIG3DqXRvZG8gZGUgTcOheGltYSB2ZXJzaW1pbGl0dWQgcmVzdHJpbmdpZG8uDQoNCiMjIyMgNi4xLjEgUHJ1ZWJhIGRlIEjDrXBvcmVzaXMgcGFyYSBsYSBzaWduaWZpY2FuY2lhIGRlIGxhIGNvbXBvbmVudGUgZGUgdmFyaWFuemEgZGUgbG9zIGludGVyY2VwdG9zIGFsZWF0b3Jpb3MNCg0KJCRIX3swfTogXHNpZ21hXjJfe2IwfSA9IDAgfn5+IHZzIH5+fiBIX3sxfTogXHNpZ21hXjJfe2IwfSA+IDAkJA0KRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJGxydD0gLTIgXHRpbWVzIChsb2dMaWsobW9kZWxvIH4xKSAtIGxvZ0xpayhtb2RlbG8gfjIpKSQNCg0KRG9uZGUgJGxydCBcc2ltIFxjaGlfMV4yJA0KDQpTZSByZWNoYXphICRIX3swfSQgY29uIHVuIG5pdmVsIGRlIHNpZ25pZmljYW5jaWEgZGUgMC4wNSBzaSAkUChcY2hpXzFeMiA+IGxydCkgPCAwLjA1JA0KDQpTZSBwdWVkZSByZWFsaXphciBsYSBwcnVlYmEgcGFyYSBlc3RhIGNvbXBvbmVudGUgZGUgdmFyaWFuemEgbWVkaWFudGUgdW5hIHRhYmxhIGFub3ZhLCBwZXJvIGVzIHVuYSBwcnVlYmEgY29uc2VydmF0aXZhLCBlbnRvbmNlcyBoYXkgcXVlIHRlbmVyIGN1aWRhZG8gY29uIFZhbG9yZXMtUCBncmFuZGVzLg0KDQpgYGB7cn0NCmFub3ZhMSA8LSBhbm92YShtb2QxLCBtb2QyKQ0KYW5vdmExICU+JSBtdXRhdGUoY2FsbCA9IE5VTEwpDQpgYGANCg0KRGUgbGEgdGFibGEgYW50ZXJpb3Igc2UgdGllbmUgcXVlICRscnQgPSA2NjcuMTY4OSQgeSAkUChcY2hpXzFeMiA+IGxydCkgPCAwLjAwMDEkIHBvciBsbyBxdWUgc2UgcmVjaGF6YSBsYSBoaXDDs3Rlc2lzIG51bGEgeSBzZSB0aWVuZSBxdWUgbGEgY29tcG9uZW50ZSBkZSB2YXJpYW56YSBwYXJhIGVsIGludGVyY2VwdG8gYWxlYXRvcmlvIGVzIHNpZ25pZmljYXRpdmEgeSBjb250cmlidXllIGEgbGEgZXhwbGljYWNpw7NuIGRlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBkZSBsYXMgcHJvdmluY2lhcyBkZSBBcmdlbnRpbmEuDQoNClx2c3BhY2V7MTVwdH0NCg0KIyMjIyA2LjEuMiBQcnVlYmEgZGUgSMOtcG9yZXNpcyBwYXJhIGxhIHNpZ25pZmljYW5jaWEgZGUgbGEgY29tcG9uZW50ZSBkZSB2YXJpYW56YSBkZSBsYXMgcGVuZGllbnRlcyBhbGVhdG9yaWFzIHkgbGEgY29tcG9uZW50ZSBkZSBjb3ZhcmlhbnphIGVudHJlIGludGVyY2VwdG9zIHkgcGVuZGllbnRlcyBhbGVhdG9yaWFzLg0KDQokJEhfezB9OiB7XHNpZ21hXjJfe2IwfSBcICBcIFxzaWdtYV4yX3tiMDF9IFxjaG9vc2UgXHNpZ21hXjJfe2IwMX0gXCBcIFxzaWdtYV4yX3tiMX19ID0ge1xzaWdtYV4yX3tiMH0gXCAgXCAwIFxjaG9vc2UgMCBcIFwgfn4wfSB+fn4gdnMgfn5+IEhfezF9OiB7XHNpZ21hXjJfe2IwfSBcICBcIFxzaWdtYV4yX3tiMDF9IFxjaG9vc2UgXHNpZ21hXjJfe2IwMX0gXCBcIFxzaWdtYV4yX3tiMX19ID0ge1xzaWdtYV4yX3tiMH1+fn5+fn4gXCAgXCBcc2lnbWFeMl97YjAxfSBcbmVxIDAgXGNob29zZSBcc2lnbWFeMl97YjAxfSBcbmVxMCBcIFwgXHNpZ21hXjJfe2IxfT4wIH0kJA0KRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJGxydD0gLTIgXHRpbWVzIChsb2dMaWsobW9kb2RlbG8gfjIpIC0gbG9nTGlrKG1vZGVsb34zKSkkDQoNCkRvbmRlICRscnQgXHNpbSBcY2hpXzJeMiQNCg0KU2UgcmVjaGF6YSAkSF97MH0kIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDUgc2kgJFAoXGNoaV8yXjIgPiBscnQpIDwgMC4wNSQNCg0KU2UgcHVlZGUgcmVhbGl6YXIgbGEgcHJ1ZWJhIHBhcmEgZXN0ZSBjb21wb25lbnRlIGRlIHZhcmlhbnphIG1lZGlhbnRlIHVuYSB0YWJsYSBhbm92YSwgcGVybyBlcyB1bmEgcHJ1ZWJhIGNvbnNlcnZhdGl2YSwgZW50b25jZXMgaGF5IHF1ZSB0ZW5lciBjdWlkYWRvIGNvbiBWYWxvcmVzLVAgZ3JhbmRlcy4NCg0KYGBge3J9DQphbm92YTIgPC0gYW5vdmEobW9kMiwgbW9kMykNCmFub3ZhMiAlPiUgbXV0YXRlKGNhbGwgPSBOVUxMKQ0KYGBgDQoNCkRlIGxhIHRhYmxhIGFudGVyaW9yIHNlIHRpZW5lIHF1ZSAkbHJ0ID0gMjI1Ljg4NjQkIHkgJFAoXGNoaV8yXjIgPiBscnQpIDwgMC4wMDAxJCBwb3IgbG8gcXVlIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIHkgc2UgdGllbmUgcXVlIGxhIGNvbXBvbmVudGUgZGUgdmFyaWFuemEgcGFyYSBsYSBwZW5kaWVudGUgYWxlYXRvcmlhLCBhZGVtw6FzIGRlIGxhIGNvbXBvbmVudGUgZGUgY292YXJpYW56YSBlbnRyZSBlbCBpbnRlY3BldG8geSBsYSBwZW5kaWVudGUgYWxlYXRvcmlhIHNvbiBzaWduaWZpY2F0aXZhcywgcG9yIGxvIHRhbnRvIGNvbnRyaWJ1eWVuIGEgbGEgZXhwbGljYWNpw7NuIGRlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBkZSBsYSBwcm92aW5jaWFzIGRlIEFyZ2VudGluYS4NCg0KIyMjIDYuMiBQcnVlYmFzIGRlIGhpcMOzdGVzaXMgc29icmUgbG9zIGVmZWN0b3MgZmlqb3MNCg0KTm90YTogQ2FiZSBhY2xhcmFyIHF1ZSBwYXJhIHByb2JhciBsYSBzaWduaWZpY2FuY2lhIGRlIGxvcyBlZmVjdG9zIGZpam9zLCBsb3MgbW9kZWxvcyBkZWJlbiBzZXIgYWp1c3RhZG9zIHBvciBlbCBtw6l0b2RvIGRlIE3DoXhpbWEgdmVyc2ltaWxpdHVkIG5vIHJlc3RyaW5naWRvLg0KDQojIyMjIDYuMi4xIFBydWViYSBkZSBIw61wb3Jlc2lzIHBhcmEgbGEgc2lnbmlmaWNhbmNpYSBkZSBsYSBjb21wb25lbnRlIGN1YWRyw6F0aWNhIGRlIGxhIGNvdmFyaWFibGUgaWRfcGVyaW9kbw0KDQokJEhfezB9OiBiX3syfSA9IDAgfn5+IHZzIH5+fiBIX3sxfTogYl97Mn0gXG5lcSAwJCQNCg0KRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJGxydD0gLTIgXHRpbWVzIChsb2dMaWsobW9kb2RlbG8gfjMpIC0gbG9nTGlrKG1vZGVsb340KSkkDQoNCkRvbmRlICRscnQgXHNpbSBcY2hpXzFeMiQNCg0KU2UgcmVjaGF6YSAkSF97MH0kIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDUgc2kgJFZhbG9yLVA9UChcY2hpXzFeMiA+IGxydCkgPCAwLjA1JA0KDQpTZSBwdWVkZSByZWFsaXphciBsYSBwcnVlYmEgcGFyYSBlc3RlIGNvbXBvbmVudGUgZGUgdmFyaWFuemEgbWVkaWFudGUgdW5hIHRhYmxhIGFub3ZhLCBwZXJvIGVzIHVuYSBwcnVlYmEgYW50aWNvbnNlcnZhdGl2YSwgIGVzIGRlY2lyLCBhcnJvamEgVmFsb3Jlcy1QIG3DoXMgcGVxdWXDsW9zIGRlIGxvIHF1ZSBlbiB2ZXJkYWQgc29uLCBlbnRvbmNlcyBoYXkgcXVlIHRlbmVyIGN1aWRhZG8gY29uIFZhbG9yZXMtUCBwZXF1ZcOxb3MuDQoNCmBgYHtyfQ0KYW5vdmEzIDwtIGFub3ZhKG1vZDMuMiwgbW9kNC4yKQ0KYW5vdmEzICU+JSBtdXRhdGUoY2FsbCA9IE5VTEwpDQpgYGANCg0KU2UgdGllbmUgcXVlICRscnQ9MTE3LjY2NTckIHkgc2Ugbm90YSBxdWUgZWwgVmFsb3ItUCBkZSBsYSBwcnVlYmEgZXMgZXh0cmVtYWRhbWVudGUgcGVxdWXDsW8sIGVudG9uY2VzIHB1ZWRlIHF1ZSBlbCB2ZXJkYWRlcm8gVmFsb3ItUCBzZWEgbWVub3IgcXVlIDAuMDUuIEF1biBhc8OtIHNlIHByb2NlZGUgYSB1c2FyIHNpbXVsYWNpw7NuIHBhcmEgb2J0ZW5lciB1biBWYWxvci1QIG3DoXMgZmllbCBhIGxhIHJlYWxpZGFkLg0KDQpgYGB7cn0NCnNpbXVsIDwtIHNpbXVsYXRlLmxtZShvYmplY3Q9bW9kMy4yLCBtMj1tb2Q0LjIsIG1ldGhvZCA9ICdNTCcsIG5zaW09MTAwMCkNCmxydHNfbmxtZSA8LSAtMiAqIChzaW11bCRudWxsJE1MWywgMl0gLSBzaW11bCRhbHQkTUxbLCAyXSkNCmFjdW11bGFkYTEgPC0gZWNkZih4PWxydHNfbmxtZSkgIyBGKHgpIHBhcmEgbG9zIHZhbG9yZXMgTFJUDQoxIC0gYWN1bXVsYWRhMSgxMTcuNjY1NykNCmBgYA0KDQpTZSBvYnRpZW5lIHVuIFZhbG9yLVAgYXByb3hpbWFkYW1lbnRlIGlndWFsIGEgY2VybywgcG9yIGxvIHF1ZSBlZmVjdGl2YW1lbnRlIHNlIHJlY2hhemEgbGEgaGlww7N0ZXNpcyBudWxhIHkgZWwgZmFjdG9yIGN1YWRyw6F0aWNvIGRlIGxhIHZhcmlhYmxlIGlkX3BlcmlvZG8gZXMgc2lnbmlmaWNhdGl2byBlbiBlbCBtb2RlbG8uDQoNClx2c3BhY2V7MTVwdH0NCg0KIyMjIyA2LjIuMiBQcnVlYmEgZGUgSMOtcG9yZXNpcyBwYXJhIGxhIHNpZ25pZmljYW5jaWEgZGUgbGEgY29tcG9uZW50ZSBjw7piaWNhIGRlIGxhIGNvdmFyaWFibGUgaWRfcGVyaW9kbw0KDQokJEhfezB9OiBiX3szfSA9IDAgfn5+IHZzIH5+fiBIX3sxfTogYl97M30gXG5lcSAwJCQNCg0KRXN0YWTDrXN0aWNvIGRlIHBydWViYTogJGxydD0gLTIgXHRpbWVzIChsb2dMaWsobW9kb2RlbG8gfjQpIC0gbG9nTGlrKG1vZGVsb341KSkkDQoNCkRvbmRlICRscnQgXHNpbSBcY2hpXzFeMiQNCg0KU2UgcmVjaGF6YSAkSF97MH0kIGNvbiB1biBuaXZlbCBkZSBzaWduaWZpY2FuY2lhIGRlIDAuMDUgc2kgJFZhbG9yLVA9UChcY2hpXzFeMiA+IGxydCkgPCAwLjA1JA0KDQpTZSBwdWVkZSByZWFsaXphciBsYSBwcnVlYmEgcGFyYSBlc3RlIGNvbXBvbmVudGUgZGUgdmFyaWFuemEgbWVkaWFudGUgdW5hIHRhYmxhIGFub3ZhLCBwZXJvIGVzIHVuYSBwcnVlYmEgYW50aWNvbnNlcnZhdGl2YSwgIGVzIGRlY2lyLCBhcnJvamEgVmFsb3Jlcy1QIG3DoXMgcGVxdWXDsW9zIGRlIGxvIHF1ZSBlbiB2ZXJkYWQgc29uLCBlbnRvbmNlcyBoYXkgcXVlIHRlbmVyIGN1aWRhZG8gY29uIFZhbG9yZXMtUCBwZXF1ZcOxb3MuDQoNCmBgYHtyfQ0KYW5vdmE0IDwtIGFub3ZhKG1vZDQuMiwgbW9kNS4yKQ0KYW5vdmE0ICU+JSBtdXRhdGUoY2FsbCA9IE5VTEwpDQpgYGANCg0KRGUgbGEgdGFibGEgYW5vdmEgc2UgdGllbmUgcXVlICRscnQgPSAwLjQyNTYzMjgkIHkgJFZhbG9yLVA9UChcY2hpXzFeMiA+IGxydCkkIGVzIG11Y2hvIG1heW9yIHF1ZSAwLjA1LCB5IGVzdGUgVmFsb3ItUCBlcyBtw6FzIHBlcXVlw7FvIHF1ZSBlbCByZWFsLCBlbnRvbmNlcyBzaW4gbmVjZXNpZGFkIGRlIHVzYXIgc2ltdWxhY2nDs24gc2UgdGllbmUgcXVlIGxhIGNvbXBvbmVudGUgY8O6YmljYSBlbiBlbCBtb2RlbG8gbm8gZXMgc2lnbmlmaWNhdGl2YS4NCg0KYGBge3IsIGluY2x1ZGUgPSBGQUxTRSwgZWNobz1GQUxTRX0NCmFub3ZhKG1vZDEsbW9kMixtb2QzLG1vZDQsbW9kNSkNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZSA9IEZBTFNFLCBlY2hvPUZBTFNFfQ0KY29yKGR0X21vcnRhbCRtb3J0YWxpZGFkLCBkdF9tb3J0YWwkcHJlZDEpDQpjb3IoZHRfbW9ydGFsJG1vcnRhbGlkYWQsIGR0X21vcnRhbCRwcmVkMikNCmNvcihkdF9tb3J0YWwkbW9ydGFsaWRhZCwgZHRfbW9ydGFsJHByZWQzKQ0KY29yKGR0X21vcnRhbCRtb3J0YWxpZGFkLCBkdF9tb3J0YWwkcHJlZDQpDQpjb3IoZHRfbW9ydGFsJG1vcnRhbGlkYWQsIGR0X21vcnRhbCRwcmVkNSkNCg0KDQpkaXN0KG1hdHJpeChjKGR0X21vcnRhbCRtb3J0YWxpZGFkLCBkdF9tb3J0YWwkcHJlZDEpLCBucm93ID0gMiwgYnlyb3cgPSBUKSwNCiAgICAgbWV0aG9kID0gImV1Y2xpZGVhbiIpDQpkaXN0KG1hdHJpeChjKGR0X21vcnRhbCRtb3J0YWxpZGFkLCBkdF9tb3J0YWwkcHJlZDIpLCBucm93ID0gMiwgYnlyb3cgPSBUKSwgDQogICAgIG1ldGhvZCA9ICJldWNsaWRlYW4iKQ0KZGlzdChtYXRyaXgoYyhkdF9tb3J0YWwkbW9ydGFsaWRhZCwgZHRfbW9ydGFsJHByZWQzKSwgbnJvdyA9IDIsIGJ5cm93ID0gVCksDQogICAgIG1ldGhvZCA9ICJldWNsaWRlYW4iKQ0KZGlzdChtYXRyaXgoYyhkdF9tb3J0YWwkbW9ydGFsaWRhZCwgZHRfbW9ydGFsJHByZWQ0KSwgbnJvdyA9IDIsIGJ5cm93ID0gVCksDQogICAgIG1ldGhvZCA9ICJldWNsaWRlYW4iKQ0KZGlzdChtYXRyaXgoYyhkdF9tb3J0YWwkbW9ydGFsaWRhZCwgZHRfbW9ydGFsJHByZWQ1KSwgbnJvdyA9IDIsIGJ5cm93ID0gVCksDQogICAgIG1ldGhvZCA9ICJldWNsaWRlYW4iKQ0KYGBgDQoNCg0KIyMgNy4gQW7DoWxpc2lzIGRlIHJlc2lkdWFsZXMNCg0KIyMjIDcuMSBBbsOhbGlzaXMgZGUgcmVzaWR1YWxlcyBwYXJhIGVsIG1vZGVsbyA0DQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KcmVzaWRwbG90KG1vZDQsIHNsb3BlID0gRikNCnJlc2lkcGxvdChtb2Q0LCBzbG9wZSA9IFQpDQpgYGANCg0KPGNlbnRlcj4NCiFbXShyZXNpZHVhbGVzLkpQRyl7d2lkdGg9NDgwcHh9DQo8L2NlbnRlcj4NCg0KRW4gZWwgZ3LDoWZpY28gZGUgUmVzaWR1YWxlcyB2cyBWYWxvcmVzIGFqdXN0YWRvcywgbm8gc2Ugb2JzZXJ2YSB1biBwYXRyw7NuIG9idmlvIHBvciBsbyBxdWUgbm8gc2UgZXZpZGVuY2lhIGxhIGV4aXN0ZW5jaWEgZGUgY2FyZW5jaWEgZGUgYWp1c3RlIGVuIGVsIG1vZGVsby4gUG9yIG90cm8gbGFkbywgdGFtcG9jbyBzZSBvYnNlcnZhbiBjYW1iaW9zIGRlIGZvcm1hIGVuIGxhIG51YmUgZGUgcHVudG9zLCBwb3IgbG8gcXVlIGVsIHN1cHVlc3RvIGRlIHZhcmlhbnphIGNvbnN0YW50ZSBlcyByYXpvbmFibGUgZW4gZWwgbW9kZWxvLiBBdW5xdWUgdGFtYmnDqW4gc2UgbG9ncmFuIG9ic2VydmFyIGFsZ3Vub3MgcHVudG9zIGF0w61waWNvcyBxdWUgc2UgZW5jdWVudHJhbiBwb3IgZnVlcmEgZGUgbGEgbnViZSBkZSBwdW50b3MgY29uanVudGEuDQoNCkVsIHN1cHVlc3RvIGRlIG5vcm1hbGlkYWQgcGFyYSBsb3MgZWZlY3RvcyBhbGVhdG9yaW9zIHRhbWJpw6luIGVzIHJhem9uYWJsZSB5YSBxdWUgdG9kb3MgbG9zIHB1bnRvcyBzZSBlbmN1ZW50cmFuICBjZXJjYW5vcyBhIGxhIHJlY3RhIGRlIG5vcm1hbGlkYWQuDQoNCjxjZW50ZXI+DQohW10ocXFwbG90X21vZDQuSlBHKXt3aWR0aD0zMzBweH0NCjwvY2VudGVyPg0KDQpFbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkIGFsIHBhcmVjZXIgdGllbmUgcHJvYmxlbWFzLCB5YSBxdWUgZW4gbG9zIGV4dHJlbW9zIHZhcmlvcyBwdW50b3Mgc2UgYWxlamFuIGRlIGxhIHJlY3RhIGRlIG5vcm1hbGlkYWQuIExhIG1hbmVyYSBtw6FzIHNlbmNpbGxhIGRlIHNvbGNpb25hciBlc3RlIHByb2JsZW1hIGVzIGFwbGljYXIgdW5hIHRyYW5zZm9ybWFjacOzbiBsb2dhcml0bWljYSBhIGxhIHZhcmlhYmxlIHJlc3B1ZXN0YSwgZXMgZGVjaXIsIGEgbGEgdGFzYSBkZSBtb3J0YWxpZGFkLCBhanVzdGFyIGRlIG51ZXZvIGVsIG1vZGVsbyBjb24gbGEgdGFzYSBkZSBtb3J0YWxpZGFkIGVuIGVzY2FsYSBsb2dhcml0bWljYSB5IHBvc3Rlcmlvcm1lbnRlIGFwbGljYXJsZSBsYSB0cmFuc2Zvcm1hY2nDs24gaW52ZXJzYSBwYXJhIG9idGVybmVyIGxvcyB2YWxvcmVzIGFqdXN0YWRvcy4NCg0KUGFyYSBlc3RvIHNlIHByb2NlZGUgYSB1c2FyIGVsIHNpZ3VpZW50ZSBjw7NkaWdvOg0KDQpgYGB7cn0NCiMgQXBsaWNhciBsb2dhcml0bW8gYSBsYSB2YXJpYWJsZSByZXNwdWVzdGEuDQpkdF9tb3J0YWwkbG9nX21vcnRhbGlkYWQgPC0gbG9nKGR0X21vcnRhbCRtb3J0YWxpZGFkKQ0KDQojIE1vZGVsbyA0IGNvbiBsYSB0YXNhIHNlIG1vcnRhbGlkYWQgdHJhbmZvcm1hZGENCm5ld19tb2QgPC0gbG1lKGxvZ19tb3J0YWxpZGFkIH4gMSArIGlkX3BlcmlvZG8gKyBJKGlkX3BlcmlvZG9eMiksDQogICAgICAgICAgICAgICByYW5kb209fiAxICsgaWRfcGVyaW9kbyB8IHByb3ZpbmNpYSwgZGF0YSA9IGR0X21vcnRhbCkNCg0KIyBBZ3JlZ2FyIHZhbG9yZXMgYWp1c3RhZG9zIGEgbGEgYmFzZSBkZSBkYXRvcw0KZHRfbW9ydGFsJHByZWRfbmV3IDwtIGV4cChwcmVkaWN0KG5ld19tb2QsIHR5cGUgPSAncmVzcG9uc2UnLCBuZXdkYXRhID0gZHRfbW9ydGFsKSkNCmBgYA0KDQojIyMgNy4yIEFuw6FsaXNpcyBkZSByZXNpZHVhbGVzIHBhcmEgZWwgbW9kZWxvIDQgY29uIHJlc3B1ZXN0YSB0cmFuc2Zvcm1hZGENCg0KYGBge3IsIGVjaG89RkFMU0V9DQpyZXNpZHBsb3QobmV3X21vZCwgc2xvcGUgPSBGKQ0KcmVzaWRwbG90KG5ld19tb2QsIHNsb3BlID0gVCkNCmBgYA0KDQo8Y2VudGVyPg0KIVtdKG5ld19yZXNpZHVhbGVzLkpQRyl7d2lkdGg9NDgwcHh9DQo8L2NlbnRlcj4NCg0KRW4gbG9zIGdyw6FmaWNvcyBhbnRlcmlvcmVzIHNlIGV2aWRlbmNpYSB1biBjb21wb3J0YW1pZW50byBtdXkgc2ltaWxhciBhbCBxdWUgc2Ugb2JzZXJ2w7MgY29uIGxhIHZhcmlhYmxlIHRhc2EgZGUgbW9ydGFsaWRhZCBlbiBzdSBlc2NhbGEgb3JpZ2luYWwsIHBvciBsbyBxdWUgc2Ugc2lndWVuIGN1bXBsaWVuZG8gbG9zIHN1cHVlc3RvcyBhbnRlcmlvcm1lbnRlIG1lbmNpb25hZG9zLiAodmFyaWFuemEgY29uc3RhbnRlIHkgbm9ybWFsaWRhZCBwYXJhIGxvcyBlZmVjdG9zIGFsZWF0b3Jpb3MpDQoNCjxjZW50ZXI+DQohW10ocXFwbG90X25ld19tb2QuSlBHKXt3aWR0aD0zMzBweH0NCjwvY2VudGVyPg0KDQpQb3Igb3RybyBsYWRvLCBlbiBlbCBncsOhZmljbyBkZSBub3JtYWxpZGFkIHBhcmVjZSBxdWUgc2UgYXJyZWdsw7MgZWwgcHJvYmxlbWEgcXVlIHRlbsOtYSBlbCBtb2RlbG8gNCwgZWwgY3XDoWwgc2UgY3Jlw7MgY29uIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBlbiBzdSBlc2NhbGEgb3JpZ2luYWwuIEV4Y2VwdHVhbmRvIGFsZ3Vub3MgcHVudG9zIGVuIGxvcyBleHRyZW1vcyBxdWUgcGFyZWNlbiBkYXRvcyBhdMOtcGljb3MsIHBhcmEgZXN0YXIgc2VndXJvcyBzZSBuZWNlc2l0YXLDrWEgaW52ZXN0aWdhciBtw6FzIGFmb25kbyBxdcOpIGZ1ZSBsbyBxdWUgcGFzw7MgZW4gZXNlIHBlcmlvZG8geSBlbiBlc2UgbHVnYXIsIHBvciBlbCBtb21lbnRvIHNlIGRlamFyw6EgaW5jbHVpZG8uDQoNCiMjIDguIE1lam9yIE1vZGVsbw0KDQpNZWRpYW50ZSBsYXMgcHJ1ZWJhcyBkZSBoaXDDs3Rlc2lzIHNlIGNvbmNsdXllIHF1ZSBlbCBtZWpvciBtb2RlbG8gcGFyYSBhanVzdGFyIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbCBlbiBBcmdlbnRpbmEgZXMgZWwgbW9kZWxvIDQuIFBlcm8gZW4gZWwgYW7DoWxpc2lzIGRlIHJlc2lkdWFsZXMgc2UgZW5jb250csOzIHVuIHByb2JsZW1hIGNvbiBlbCBzdXB1ZXN0byBkZSBub3JtYWxpZGFkIHNvYnJlIGxhIHRhc2EgZGUgbW9ydGFsaWRhZCBpbmZhbnRpbC4gUG9yIGxvIHRhbnRvLCBzZSB1c2EgdW5hIHRyYXNuZm9ybWFjacOzbiBsb2dhcsOtdG1pY2Egc29icmUgbGEgdGFzYSBkZSBtb3J0YWxpZGFkIGluZmFudGlsIHkgc2UgY3JlYSB1biBtb2RlbG8gc29icmUgZXN0YSB2YXJpYWJsZSB0cmFuc2Zvcm1hZGEgcGFyYSBjb3JyZWdpciBsb3Mgc3VwdWVzdG9zIGludsOhbGlkb3MgZGVsIG1vZGVsbyA0Lg0KDQpGaW5hbG1lbnRlIGVsIG1lam9yIG1vZGVsbyBhanVzdGFkbyBtZWRpYW50ZSBlbCBtw6l0b2RvIGRlIE3DoXhpbWEgdmVyb3NpbWlsaXR1ZCByZXN0cmluZ2lkbyBlcyBlbCBzaWd1aWVudGU6DQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0Kc3VtbWFyeShuZXdfbW9kKQ0KYGBgDQoNCg0KJCRMb2dbfiBcd2lkZWhhdHtcbXV9X3tpan1+XT0gMy4yOTI0IC0gMC4wNDM0fiBpZFxfcGVyaW9kb197aWp9ICsgMC4wMDAyfmlkXF9wZXJpb2RvX3tpan1eMiArIFx3aWRlaGF0e1xiZXRhfV97MGl9ICsgXHdpZGVoYXR7XGJldGF9X3sxaX0gfmlkXF9wZXJpb2RvX3tpan0kJA0KJCRjb24gfn5cd2lkZWhhdHtcbXV9X3tpan0gPSBcd2lkZWhhdHtFfVt+VGFzYX5kZX5tb3J0YWxpZGFkfmluZmFudGlsX3tpan1+XSQkDQoNCiQkIHtiXzAgXGNob29zZSBiXzF9IFxzaW0gYXByb3ggfiBOIFxsZWZ0KHswIFxjaG9vc2UgMH0sezAuMDcwMyBcICBcIFwgLTAuMDAxOCBcY2hvb3NlIC0wLjAwMTggXCBcIDAuMDAwMDJ9IFxyaWdodCkkJA0KDQokJGkgPSAxLH4yLC4uLix+MjQuIH5+fiBqID0gMSx+MiwgLi4uJCQNCg0KRG9uZGUgJGkkIHJlcHJlc2VudGEgbGEgaWRlbnRpZmljYWNpw7NuIGRlIGxhcyBwcm92aW5jaWFzIGRlIEFyZ2VudGluYSBvYnNlcnZhZGFzIGVuIG9yZGVuIGFsZmFiZXRpY28geSAkaiQgcmVwcmVzZW50YSBlbCBwZXJpb2RvL2HDsW8gZGUgb2N1cnJlbmNpYS4NCg0KUHVlZGUgcGFyZWNlciBxdWUgbGFzIGNvbXBvbmVudGVzIGRlIHZhcmlhbnphIHBhcmEgbG9zIGVmZWN0b3MgYWxlYXRvcmlvcyBzb24gcGVxdWXDsWFzIHBlcm8gZXN0byBlcyBkZWJpZG8gYSBxdWUgbGEgdGFzYSBkZSBtb3J0YWxpZGFkIGluZmFudGlsIGNvbiBsYSBxdWUgc2UgYWp1c3TDsyBlbCBtb2RlbG8gZXN0w6EgZW4gZXNjYWxhIGxvZ2FyaXRtaWNhLg0KDQojIyMgOC4xIFJlcHJlc2VudGFjacOzbiBncsOhZmljYSBkZWwgbWVqb3IgbW9kZWxvIGFqdXN0YWRvIHkgcGFyYSBsb3MgZGVtw6FzIG1vZGVsb3MgZGVzY3JpdG9zIGVuIGVzdGEgYXBsaWNhY2nDs24gey50YWJzZXR9DQoNCkNvbW8gc2UgcHVlZGUgb2JzZXJ2YXIsIGVsIHVzbyBkZSBtb2RlbG9zIGNvbiBlZmVjdG9zIGFsZWF0b3Jpb3MgbWVqb3JhIGVuIGdyYW4gbWVkaWRhIGxhcyBlc3RpbWFjaW9uZXMgcGFyYSBsYSB0YXNhIGRlIG1vcnRhbGlkYWQgaW5mYW50aWwgcG9yIG1pbCBuYWNpZG9zIHZpdm9zIGVuIEFyZ2VudGluYSwgYXPDrSBtaXNtbyBlbCBtZWpvciBtb2RlbG8gZXhwbGljYSBtdXkgYmllbiBlbCBjb21wb3J0YW1pZW50byBkZSBlc3RlIMOtbmRpY2UuDQoNCiMjIyMgTWVqb3IgTW9kZWxvDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGR0X21vcnRhbCwgYWVzKHggPSBpZF9wZXJpb2RvLCB5ID0gbW9ydGFsaWRhZCwgY29sb3IgPSBwcm92aW5jaWEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKH4gcHJvdmluY2lhKSArDQogIGdlb21fbGluZShhZXMoeSA9IHByZWRfbmV3LCB4ID0gaWRfcGVyaW9kbyksIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQojIyMjIE1vZGVsbyAxDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGR0X21vcnRhbCwgYWVzKHggPSBpZF9wZXJpb2RvLCB5ID0gbW9ydGFsaWRhZCwgY29sb3IgPSBwcm92aW5jaWEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKH4gcHJvdmluY2lhKSArDQogIGdlb21fbGluZShhZXMoeSA9IHByZWQxLCB4ID0gaWRfcGVyaW9kbyksIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQojIyMjIE1vZGVsbyAyDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGR0X21vcnRhbCwgYWVzKHggPSBpZF9wZXJpb2RvLCB5ID0gbW9ydGFsaWRhZCwgY29sb3IgPSBwcm92aW5jaWEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKH4gcHJvdmluY2lhKSArDQogIGdlb21fbGluZShhZXMoeSA9IHByZWQyLCB4ID0gaWRfcGVyaW9kbyksIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQojIyMjIE1vZGVsbyAzDQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGR0X21vcnRhbCwgYWVzKHggPSBpZF9wZXJpb2RvLCB5ID0gbW9ydGFsaWRhZCwgY29sb3IgPSBwcm92aW5jaWEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKH4gcHJvdmluY2lhKSArDQogIGdlb21fbGluZShhZXMoeSA9IHByZWQzLCB4ID0gaWRfcGVyaW9kbyksIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQojIyMjIE1vZGVsbyA0DQoNCmBgYHtyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLndpZHRoID0gMTAsIGVjaG89RkFMU0V9DQpnZ3Bsb3QoZGF0YSA9IGR0X21vcnRhbCwgYWVzKHggPSBpZF9wZXJpb2RvLCB5ID0gbW9ydGFsaWRhZCwgY29sb3IgPSBwcm92aW5jaWEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX2J3KCkgKw0KICBmYWNldF93cmFwKH4gcHJvdmluY2lhKSArDQogIGdlb21fbGluZShhZXMoeSA9IHByZWQ0LCB4ID0gaWRfcGVyaW9kbyksIGNvbG9yID0gImJsYWNrIikNCmBgYA0KDQojIyBSZWZlcmVuY2lhcw0KDQpGcmVkZHkgSGVybsOhbmRleiBCYXJhamFzLCBKb3JnZSBMZW9uYXJkbyBMw7NwZXogTWFydMOtbmV6ICgyMDIwLTAzLTE1KS4gTW9kZWxvcyBNaXh0b3MgY29uIFIuIA0KaHR0cHM6Ly9maGVybmFuYi5naXRodWIuaW8vbGlicm9fbW9kZWxvc19taXh0b3MvDQoNCkFuZHJldyBHZWxtYW4sIEplbm5pZmVyIEhpbGwgKDIwMDcpLiBEYXRhIEFuYWx5c2lzIFVzaW5nIFJlZ3Jlc3Npb24gYW5kIE11bHRpbGV2ZWwvSGllcmFyY2hpY2FsIE1vZGVscy4NCg0KUGluaGVpcm8gSiwgQmF0ZXMgRCwgRGViUm95IFMsIFNhcmthciBELCBSIENvcmUgVGVhbSAoMjAyMCkuIG5sbWU6IExpbmVhciBhbmQgTm9ubGluZWFyIE1peGVkIEVmZmVjdHMgTW9kZWxzLg0KDQpXaWNraGFtIEgsIEF2ZXJpY2sgTSwgQnJ5YW4gSiwgQ2hhbmcgVywgTWNHb3dhbiBMRCwgRnJhbsOnb2lzIFIsIEdyb2xlbXVuZCBHLCBIYXllcyBBLCBIZW5yeSBMLCBIZXN0ZXIgSiwgS3VobiBNLCBQZWRlcnNlbiBUTCwgTWlsbGVyIEUsIEJhY2hlIFNNLCBNw7xsbGVyIEssIE9vbXMgSiwgUm9iaW5zb24gRCwgU2VpZGVsIERQLCBTcGludSBWLCBUYWthaGFzaGkgSywgVmF1Z2hhbiBELCBXaWxrZSBDLCBXb28gSywgWXV0YW5pIEggKDIwMTkpLiDigJxXZWxjb21lIHRvIHRoZSB0aWR5dmVyc2Uu4oCdIEpvdXJuYWwgb2YgT3BlbiBTb3VyY2UgU29mdHdhcmUsIDQoNDMpLCAxNjg2Lg0KDQpEb25nd2VuIEx1bywgU2l2YSBHYW5lc2ggYW5kIEpvaG4gS29vbGFhcmQuIHByZWRpY3RtZWFuczogUHJvdmlkaW5nIGZ1bmN0aW9ucyB0byBkaWFnbm9zZSBhbmQgbWFrZSBpbmZlcmVuY2VzIGZyb20gdmFyaW91cyBsaW5lYXIgbW9kZWxzLg0KDQoNCg0K