Introduccion

La productividad laboral es un indicador clave para evaluar el desempeño económico de los países, ya que refleja la eficiencia con la que se utilizan los recursos humanos en la generación de bienes y servicios. En este sentido, el GDP per person employed (constant 2017 PPP $) permite aproximar el valor agregado que produce cada trabajador, facilitando comparaciones entre economías con diferentes niveles de desarrollo y estructuras productivas. Desde esta perspectiva, la productividad no depende únicamente de la cantidad de trabajadores, sino también de la forma en que estos se distribuyen entre los distintos sectores económicos, como la industria y los servicios, los cuales presentan diferencias importantes en términos de tecnología, capital y generación de valor. Asimismo, las condiciones del mercado laboral, como el nivel de trabajo independiente y la participación laboral masculina y femenina, pueden influir en este comportamiento.

En este contexto, el presente trabajo tiene como objetivo estimar y analizar un modelo de regresión lineal múltiple que permita explicar la productividad laboral en función de la estructura sectorial del empleo y de las condiciones laborales, utilizando información correspondiente al año 2017 proveniente de la base de datos World Development Indicators. A partir de este modelo, se busca identificar la relación entre dichas variables, así como evaluar la dirección e intensidad de su impacto sobre la productividad laboral, con el fin de aportar evidencia sobre los factores que influyen en el desempeño económico de los países.

Metodologia

Carga de datos y selección de variables

  • Librerías y base de datos
library(tidyverse)
library(readxl)
library(ggplot2)
library(ggcorrplot)
library(plotly)
library(knitr)
library(car)
library(googlesheets4)
library(kableExtra)

BD <- read_excel("Taller_1_Data.xlsx")
  • Selección de variables

Se extrajeron los datos que están contenidos en el año 2017.

BD_2017 <- BD %>% 
  filter(Time == "2017")

Luego se seleccionaron variables relacionadas con la estructura del empleo y su posible impacto en la productividad:

Tabla1 <- BD_2017 %>% 
  select(
    `Time`, `Country Name`,
    GDP = `GDP per person employed (constant 2017 PPP $) [SL.GDP.PCAP.EM.KD]`,
    industria= `Employment in industry (% of total employment) (modeled ILO estimate) [SL.IND.EMPL.ZS]`,
    servicios= `Employment in services (% of total employment) (modeled ILO estimate) [SL.SRV.EMPL.ZS]`,
    trabajadores_ind= `Self-employed, total (% of total employment) (modeled ILO estimate) [SL.EMP.SELF.ZS]`,
    trabajadores_fem= `Employment to population ratio, 15+, female (%) (national estimate) [SL.EMP.TOTL.SP.FE.NE.ZS]`,
    trabajadores_mas= `Employment to population ratio, 15+, male (%) (modeled ILO estimate) [SL.EMP.TOTL.SP.MA.ZS]`
  )

Análisis descriptivo de las variable

Partiendo de esto, realizaremos el Análisis descriptivo de las variables:

data <- read_sheet("https://docs.google.com/spreadsheets/d/1kANd20rvpMDPzkOkw0X1BmBwveMgJ49U8Lqb0v8v0qw/edit?gid=0#gid=0")

data %>% 
  head() %>% 
  kable(caption = "Tabla 1") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "bordered"))
Tabla 1
VARIABLES DESCRIPCIÓN TIPO DE VARIABLE NOMBRE DE LA VARIABLE EN R
Employment in industry (% of total employment) (modeled ILO estimate) [SL.IND.EMPL.ZS] Indica el porcentaje de trabajadores empleados en el sector industrial, que incluye manufactura, construcción y actividades productivas. Cuantitativa industria
Employment to population ratio, 15+, famale (%) (modeled ILO estimate) [SL.EMP.TOTL.SP.FA.ZS] Representa el porcentaje de mujeres mayores de 15 años que se encuentran empleadas en relación con la población total femenina en ese grupo de edad. Cuantitativa trabajadores_fem
Employment in services (% of total employment) (modeled ILO estimate) [SL.SRV.EMPL.ZS] Mide el porcentaje de la población ocupada en el sector de servicios, como comercio, transporte, educación, salud y actividades financieras. Cuantitativa servicios
Self-employed, total (% of total employment) (modeled ILO estimate) [SL.EMP.SELF.ZS] Representa el porcentaje de trabajadores que se encuentran en condición de empleo independiente o por cuenta propia, sin relación laboral formal con un empleador. Cuantitativa trabajadores_ind
Employment to population ratio, 15+, male (%) (modeled ILO estimate) [SL.EMP.TOTL.SP.MA.ZS] Indica el porcentaje de hombres mayores de 15 años que se encuentran empleados en relación con la población total masculina en ese grupo de edad. Cuantitativa trabajadores_mas
Región Demuestra una clasificación de los países según su ubicación geográfica dividiéndose en:Latinoamérica y el caribe, Europa y AsDPia central. Categórica region
  • Clasificación de países por región

Para poder clasificar los países en las regiones de Latinoamérica y el Caribe, Europa y Asia Central, primero fue necesario identificar qué países pertenecen a cada una de estas zonas. Para ello se realizó una búsqueda y se tomó como referencia la información disponible en el sitio web de ThoughtCo, donde se listan oficialmente los países por región.

Con base en esa información, se creó en R una nueva columna llamada Región utilizando la función mutate(). Posteriormente, se empleó case_when() para asignar a cada país el nombre de la región correspondiente. De esta manera, en lugar de mostrar el nombre individual de cada país, la base de datos queda organizada por la región a la que pertenece cada uno.

CG <- Tabla1 %>% 
  mutate(Region = case_when(
    `Country Name` %in% c("Argentina","Bolivia","Brazil","Chile","Colombia","Costa Rica","Cuba",
                          "Dominican Republic","Ecuador","El Salvador","Guatemala","Haiti",
                          "Honduras","Jamaica","Mexico","Nicaragua","Panama","Paraguay",
                          "Peru","Uruguay","Venezuela") ~ "Latinoamérica y el Caribe",
    `Country Name` %in% c("Germany","France","Spain","Italy","United Kingdom","Netherlands",
                          "Belgium","Sweden","Norway","Finland","Denmark","Portugal",
                          "Austria","Switzerland","Poland","Czech Republic","Greece",
                          "Hungary","Ireland","Romania","Bulgaria","Serbia","Croatia",
                          "Slovakia","Slovenia","Ukraine","Russia") ~ "Europa",
    `Country Name` %in% c("Kazakhstan","Uzbekistan","Turkmenistan","Kyrgyz Republic","Tajikistan") ~ "Asia Central",
    TRUE ~ "Otros"
  ))
  • Volviendo la variable región como cuantitativa
CG$Region <- as.factor(CG$Region)

Descripción del modelo

Con el fin de analizar los determinantes de la productividad laboral, se estimó un modelo de regresión lineal múltiple utilizando información correspondiente al año 2017. La variable dependiente del modelo es el GDP per person employed (constant 2017 PPP $), la cual mide la productividad promedio de los trabajadores en cada país. Como variables explicativas, se incluyeron indicadores relacionados con la estructura sectorial del empleo y las condiciones del mercado laboral.

De esta forma, el modelo estimado puede expresarse como:

\[ GDP_i = \beta_0 + \beta_1 \, servicios_i + \beta_2 \, industria_i + \beta_3 \, trabajadores\_mas_i + \beta_4 \, trabajadores\_fem_i + \beta_5 \, trabajadores\_ind_i + \gamma_1 \, Region_{America,i} + \gamma_2 \, Region_{Asia,i} + \gamma_3 \, Region_{Europa,i} + \varepsilon_i \]

Donde:

  • \(GDP_i\): Producto Interno Bruto del país \(i\).
  • \(\beta_0\): Intercepto del modelo.
  • \(\beta_1, \beta_2, \beta_3, \beta_4, \beta_5\): Efectos marginales de las variables continuas.
  • \(Region_{America,i}, Region_{Asia,i}, Region_{Europa,i}\): Variables indicadoras que valen 1 si el país pertenece a esa región y 0 en caso contrario.
  • \(\gamma_1, \gamma_2, \gamma_3\): Efectos diferenciales de cada región respecto a la categoría base.
  • \(\varepsilon_i\): Término de error que recoge factores no observados.

Resultados Descriptivos

Tablas descriptivas

tabla_industria <- CG %>% 
  summarize(
    Promedio = mean(industria, na.rm = TRUE),
    Mediana = median(industria, na.rm = TRUE),
    Minimo = min(industria, na.rm = TRUE),
    Maximo = max(industria, na.rm = TRUE),
    Desv = sd(industria, na.rm = TRUE)
  )

tabla_industria %>% 
  kable(caption = "Tabla 2: Estadísticas descriptivas de Industria") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 2: Estadísticas descriptivas de Industria
Promedio Mediana Minimo Maximo Desv
21.82012 20.075 6.72 38.73 6.04504
tabla_servicios <- CG %>% 
  summarize(
    Promedio = mean(servicios, na.rm = TRUE),
    Mediana  = median(servicios, na.rm = TRUE),
    Minimo   = min(servicios, na.rm = TRUE),
    Maximo   = max(servicios, na.rm = TRUE),
    Desv     = sd(servicios, na.rm = TRUE)
  )

tabla_servicios %>% 
  kable(caption = "Tabla 3: Estadísticas descriptivas de Servicios") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 3: Estadísticas descriptivas de Servicios
Promedio Mediana Minimo Maximo Desv
65.53707 67.105 37.89 87.85 11.49462
tabla_ind <- CG %>% 
  summarize(
    Promedio = mean(trabajadores_ind, na.rm = TRUE),
    Mediana = median(trabajadores_ind, na.rm = TRUE),
    Minimo = min(trabajadores_ind, na.rm = TRUE),
    Maximo = max(trabajadores_ind, na.rm = TRUE),
    Desv = sd(trabajadores_ind, na.rm = TRUE)
  )

tabla_ind %>% 
  kable(caption = "Tabla 4: Estadísticas descriptivas de Trabajadores Independientes") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 4: Estadísticas descriptivas de Trabajadores Independientes
Promedio Mediana Minimo Maximo Desv
26.02402 23.905 4.37 73.7 15.76061
tabla_mas <- CG %>% 
  summarize(
    Promedio = mean(trabajadores_mas, na.rm = TRUE),
    Mediana = median(trabajadores_mas, na.rm = TRUE),
    Minimo = min(trabajadores_mas, na.rm = TRUE),
    Maximo = max(trabajadores_mas, na.rm = TRUE),
    Desv = sd(trabajadores_mas, na.rm = TRUE)
  )

tabla_mas %>% 
  kable(caption = "Tabla 5: Estadísticas descriptivas de Trabajadores Masculinos +15") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 5: Estadísticas descriptivas de Trabajadores Masculinos +15
Promedio Mediana Minimo Maximo Desv
63.85882 63.5015 42.843 82.961 8.787615
tabla_trabajadores_fem <- CG %>% 
  summarize(
    Promedio = mean(trabajadores_fem, na.rm = TRUE),
    Mediana = median(trabajadores_fem, na.rm = TRUE),
    Minimo = min(trabajadores_fem, na.rm = TRUE),
    Maximo = max(trabajadores_fem, na.rm = TRUE),
    Desv = sd(trabajadores_fem, na.rm = TRUE)
  )

tabla_trabajadores_fem %>% 
  kable(caption = "Tabla 6: Estadísticas descriptivas de Trabajadoras Femeninas +15") %>% 
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tabla 6: Estadísticas descriptivas de Trabajadoras Femeninas +15
Promedio Mediana Minimo Maximo Desv
48.47843 50.415 10.93 76.75 9.932112
tabla_region <- CG %>% 
    group_by(Region) %>% 
    summarize(
      Promedio_GDP = mean(GDP, na.rm = TRUE),
      Mediana_GDP = median(GDP, na.rm = TRUE),
      Min_GDP = min(GDP, na.rm = TRUE),
      Max_GDP = max(GDP, na.rm = TRUE),
      Desv_GDP = sd(GDP, na.rm = TRUE)
  )

tabla_region %>% 
kable(caption = "Tablas 7: promedios por región ")%>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
Tablas 7: promedios por región
Region Promedio_GDP Mediana_GDP Min_GDP Max_GDP Desv_GDP
Asia Central 28343.04 16995.59 13152.006 52372.73 19177.85
Europa 91917.08 100210.97 26143.285 171519.15 32283.05
Latinoamérica y el Caribe 32838.22 26746.98 8363.455 69735.83 17321.61
Otros 62509.28 53120.74 17280.982 244475.33 43253.16

Comparando las regiones se observa que Europa tiene un mayor GDP promedio en comparación con las demás regiones, también tiene una variabilidad mucho más amplia entre países, lo que puede sugerir que entre los países de esta región la economía varía mucho. En cambio, Latinoamérica y el Caribe muestra valores más concentrados y menores niveles de productividad. El grupo “Otros” muestra una mezcla más heterogénea, con países que pueden tener tanto niveles muy bajos como extremadamente altos de GDP.

Relación entre variables

Sin embargo, es fundamental recordar que este tipo de análisis correlacional no permite establecer una relación causal directa”. Estos gráficos se van a analizar a partir de 3 aspectos: Forma, dirección y fuerza.

CG2 <- CG %>% drop_na(GDP, industria, servicios, trabajadores_ind, trabajadores_fem, trabajadores_mas)

grafico1<- ggplot(CG2, aes(x = industria, y = GDP)) +
  geom_point(color = "#54197D") +
  geom_smooth(method = "lm", color = "red") +
  
  labs(title = "Grfico 1: Relación entre GDP y Industria",
       x = "Industria",
       y = "GDP")
ggplotly(grafico1)

La variable “industria” muestra una relación débil con el Producto Interno Bruto (GDP) por persona empleada, ya que la dispersión de los datos alrededor de la línea de regresión es alta. Esta significativa dispersión sugiere la ausencia de una regresión lineal clara entre ambas variables; analizando el gráfico y la tendencia obtenida, se podría decir que la dirección se mantiene plana con ligeros cambios debido a la alta dispersión, por lo que presenta una asociación de baja intensidad entre ambas variables.

grafico2<- ggplot(CG2, aes(x = servicios, y = GDP)) +
  geom_point(color = "#54197D") +
  geom_smooth(method = "lm", color = "red") +
  
  labs(title = "Grfico 2: Relación entre GDP y Servicios",
       x = "Servicios",
       y = "GDP")
ggplotly(grafico2)

La variable “servicios” muestra una relación fuerte positiva entre el Producto Interno Bruto (GDP) por persona empleada, ya que la pendiente ascendente (positiva) de la línea de regresión indica que, a medida que la participación de los servicios aumenta, el GDP muestra una tendencia a incrementarse de forma más consistente, por lo que presenta una asociación significativa del sector servicios con el crecimiento económico.

grafico3<- ggplot(CG2, aes(x = trabajadores_ind, y = GDP)) +
  geom_point(color = "#54197D") +
  geom_smooth(method = "lm", color = "red") +
  
  labs(title = "Grfico 3: Relación entre GDP y Trabajadores independientes",
       x = "Trabajadores Independientes",
       y = "GDP")
ggplotly(grafico3)

La variable “trabajadores independientes” presenta una asociación directa, lo cual se evidencia en la línea de regresión. Esta línea muestra una relación negativa y de fuerza moderada con el Producto Interno Bruto (GDP) por persona empleada, debido a una leve dispersión en los datos. La pendiente es negativa conforme aumenta la participación del sector servicios.

grafico4<-ggplot(CG2, aes(x = trabajadores_mas, y = GDP)) +
  geom_point(color = "#54197D") +
  geom_smooth(method = "lm", color = "red") +
  
  labs(title = "Grfico 4: Relación entre GDP y Trabajadores sex masculinos +15",
       x = "Trabajadores del sexo masculinos +15",
       y = "GDP")
ggplotly(grafico4)

La variable “Trabajadores del sexo masculino +15” exhibe una asociación débil e inversa con el Producto Interno Bruto (GDP) por persona empleada. Se observa una tendencia, aunque ligera, a la disminución del PIB a medida que el número de trabajadores masculinos aumenta. Esto se refleja en la línea de regresión con una pendiente negativa, pero muy poco pronunciada (plana).

grafico5<- ggplot(CG2, aes(x = trabajadores_fem, y = GDP)) +
  geom_point(color = "#54197D") +
  geom_smooth(method = "lm", color = "red") +
  
  labs(title = "Grfico 5: Relación entre GDP y trabajadores sex femenino +15",
       x = "Trabajadores del sexo femenino +15",
       y = "GDP")
ggplotly(grafico5)

La variable “Trabajadores del sexo femenino +15”. El gráfico evidencia una relación positiva débil entre el número de trabajadoras del sexo femenino (+15) y el Producto Interno Bruto (GDP) por persona empleada. Esto se debe a la distancia que presentan algunos datos frente a la línea de regresión, la cual provocaría una fuerza débil; sin embargo, a mayor participación femenina, el GDP por persona empleada tiende a incrementarse.

g_región <- ggplot(CG, aes(x = Region, y = GDP, fill = Region)) +
  geom_boxplot() +
  labs(title = "Grafico 6: Distribución del GDP por Región",
       x = "Región",
       y = "GDP")
ggplotly(g_región)

Resultados del Modelo

  • Modelo
modelo <- lm(GDP ~ servicios+industria+trabajadores_mas+trabajadores_fem+trabajadores_ind+Region, data = CG)
summary(modelo)
## 
## Call:
## lm(formula = GDP ~ servicios + industria + trabajadores_mas + 
##     trabajadores_fem + trabajadores_ind + Region, data = CG)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -60234 -12496    -56  10899 129626 
## 
## Coefficients:
##                                 Estimate Std. Error t value Pr(>|t|)  
## (Intercept)                     -70773.0    83831.3  -0.844   0.4020  
## servicios                         1775.8      695.3   2.554   0.0133 *
## industria                         -584.4     1021.3  -0.572   0.5694  
## trabajadores_mas                   572.6      677.8   0.845   0.4017  
## trabajadores_fem                  -345.6      531.9  -0.650   0.5185  
## trabajadores_ind                  -385.3      562.0  -0.686   0.4956  
## RegionEuropa                     40509.2    22504.8   1.800   0.0771 .
## RegionLatinoamérica y el Caribe  -2753.1    22985.3  -0.120   0.9051  
## RegionOtros                      23239.3    21596.9   1.076   0.2864  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 28100 on 58 degrees of freedom
##   (36 observations deleted due to missingness)
## Multiple R-squared:  0.6025, Adjusted R-squared:  0.5476 
## F-statistic: 10.99 on 8 and 58 DF,  p-value: 2.791e-09

Lo que interpretamos de los resultados del modelo de regresión lineal es que la variable servicios es significativa, la variable trabajadores independientes es marginal y las faltantes no son relevantes. Al observar el p-value, observamos que es muy pequeño; por lo tanto, el modelo es significativo, ya que por lo menos una de las variables es significativa.

Analisis del resultado del modelo

Homocedasticidad

res1 <- residuals(modelo)

plot(modelo$fitted.values, res1,
     xlab = "Valores ajustados",
     ylab = "Residuos",
     main = "Grafico 7: Residuos vs Ajustados")
abline(h = 0, col = "red")

El gráfico 7 muestra una relación directa entre las variables. Dado que los puntos se dispersan aleatoriamente alrededor de la línea de regresión sin formar patrones discernibles, se infiere que el modelo se ajusta bien a los datos. La dispersión constante de los puntos sugiere también el cumplimiento del supuesto de homocedasticidad.

Normalidad de residuos

qqnorm(res1, main = "Gráfico 8: Q-Q plot de los residuos")
qqline(res1, col = "red")

El gráfico 8 nos muestra que los datos están sumamente alineados a la línea de regresión por lo que el modelo predice bien.

Matriz de correlación

vars_cor <- CG %>% 
  select(GDP, industria, servicios, trabajadores_ind, trabajadores_fem, trabajadores_mas)

matriz <- cor(vars_cor, use = "complete.obs")

ggcorrplot(matriz, 
           type = "lower",
           lab = TRUE,
           lab_size = 3,
           colors = c("#B2182B", "white", "#2166Ac"),
           title = "Grafico 9: Matriz de Correlación")

La matriz de correlación permite observar la relación lineal entre las variables explicativas y el GDP per person employed. Se evidencia que la variable empleo en el sector servicios presenta la mayor correlación positiva con el GDP (0.68), lo que sugiere que los países con mayor participación del empleo en servicios tienden a mostrar mayores niveles de productividad laboral. En contraste, el empleo independiente presenta una correlación negativa relativamente alta con el GDP (-0.62), lo que indicaría que una mayor proporción de trabajadores independientes se asocia con menores niveles de productividad.

Por su parte, las demás variables muestran relaciones débiles con el GDP, dado que sus coeficientes de correlación se encuentran cercanos a cero: trabajadores femeninos (0.16), trabajadores masculinos (-0.27) e industria (-0.07). Esto sugiere que, de manera individual, estas variables no presentan una relación lineal fuerte con la variable dependiente.

Adicionalmente, no se observan correlaciones extremadamente altas entre las variables explicativas, por lo que no se evidencia, en principio, un problema grave de multicolinealidad.

Multicolinealidad

vif(modelo)
##                      GVIF Df GVIF^(1/(2*Df))
## servicios        4.918644  1        2.217802
## industria        2.885387  1        1.698643
## trabajadores_mas 2.879858  1        1.697014
## trabajadores_fem 1.921985  1        1.386357
## trabajadores_ind 6.522170  1        2.553854
## Region           3.486186  3        1.231379

En estos resultados se observa que todas las variables presentan valores de VIF menores a 10, lo que significa que no existen problemas graves de multicolinealidad. Aunque la variable trabajadores independientes presenta el valor más alto (5.16), este sigue estando dentro de un rango aceptable, posiblemente debido a su relación con la variable servicios.

En general, se concluye que no existe un problema importante de multicolinealidad en el modelo.

Conclusiones

  • Conclusiones sobre los factores que influyen en la variable dependiente

A partir del modelo estimado, se concluye que la productividad laboral, medida a través del GDP por persona empleada, está influenciada principalmente por la estructura sectorial del empleo. En particular, la participación del empleo en el sector servicios presenta una relación positiva y estadísticamente significativa, indicando que los países con mayor peso en este sector tienden a tener mayores niveles de productividad.

Por otro lado, el trabajo independiente muestra una relación negativa con el GDP, lo cual sugiere que mayores niveles de autoempleo están asociados con menores niveles de eficiencia económica, posiblemente debido a la informalidad. En contraste, variables como la participación del empleo en el sector industrial y las tasas de empleo por género no resultaron estadísticamente significativas, por lo que su efecto sobre la productividad no es concluyente dentro del modelo.

  • Estrategias o recomendaciones basadas en los hallazgos

Con base en los resultados obtenidos, se recomienda fomentar políticas que impulsen el desarrollo del sector servicios, dado su impacto positivo sobre la productividad. Asimismo, es importante implementar estrategias orientadas a reducir el trabajo independiente informal, promoviendo la formalización del empleo y el acceso a oportunidades laborales más productivas.

Adicionalmente, se sugiere fortalecer la calidad del empleo mediante inversiones en educación, capacitación y tecnología, con el fin de facilitar la transición hacia sectores económicos con mayor generación de valor agregado.

  • ¿El modelo logró responder al objetivo de la investigación?

A la luz de los resultados obtenidos, se considera que el modelo ajustado sí logró responder al objetivo de la investigación, ya que permitió identificar la relación entre la estructura del empleo y la productividad laboral, así como determinar cuáles variables tienen un impacto significativo sobre el GDP.

No obstante, estos resultados deben interpretarse con cautela, dado que no todas las variables incluidas resultaron significativas y podrían existir otros factores relevantes no considerados en el modelo. En este sentido, aunque el modelo proporciona evidencia consistente con la teoría económica, su capacidad explicativa podría mejorarse mediante la inclusión de variables adicionales en futuros análisis.

Bibliografía

LS0tDQp0aXRsZTogIlRhbGxlciAxOiBBbsOhbGlzaXMgZGUgUmVncmVzacOzbiBMaW5lYWwgTcO6bHRpcGxlIg0KYXV0aG9yOiAiTWFyaWFuYSBCcmF2bywgT3NjYXIgTWFsZXMsIEphY29ibyBadcOxaWdhLCBEdXZhbiBCZXJtdWRleiINCmRhdGU6ICIyMDI2LTAzLTMxIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgdGhlbWU6IGZsYXRseQ0KICAgIGNvZGVfZm9sZGluZzogInNob3ciDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfbWVudTogdHJ1ZQ0KLS0tDQo8c3R5bGU+DQpoMSB7DQogIGNvbG9yOiAjMDAwMDhCOw0KfQ0KaDIgew0KICBjb2xvcjogIzFmNzdiNDsNCn0NCjwvc3R5bGU+DQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBjYWNoZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQ0KYGBgDQojIF9JbnRyb2R1Y2Npb25fDQoNCkxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbCBlcyB1biBpbmRpY2Fkb3IgY2xhdmUgcGFyYSBldmFsdWFyIGVsIGRlc2VtcGXDsW8gZWNvbsOzbWljbyBkZSBsb3MgcGHDrXNlcywgeWEgcXVlIHJlZmxlamEgbGEgZWZpY2llbmNpYSBjb24gbGEgcXVlIHNlIHV0aWxpemFuIGxvcyByZWN1cnNvcyBodW1hbm9zIGVuIGxhIGdlbmVyYWNpw7NuIGRlIGJpZW5lcyB5IHNlcnZpY2lvcy4gRW4gZXN0ZSBzZW50aWRvLCBlbCBHRFAgcGVyIHBlcnNvbiBlbXBsb3llZCAoY29uc3RhbnQgMjAxNyBQUFAgJCkgcGVybWl0ZSBhcHJveGltYXIgZWwgdmFsb3IgYWdyZWdhZG8gcXVlIHByb2R1Y2UgY2FkYSB0cmFiYWphZG9yLCBmYWNpbGl0YW5kbyBjb21wYXJhY2lvbmVzIGVudHJlIGVjb25vbcOtYXMgY29uIGRpZmVyZW50ZXMgbml2ZWxlcyBkZSBkZXNhcnJvbGxvIHkgZXN0cnVjdHVyYXMgcHJvZHVjdGl2YXMuIERlc2RlIGVzdGEgcGVyc3BlY3RpdmEsIGxhIHByb2R1Y3RpdmlkYWQgbm8gZGVwZW5kZSDDum5pY2FtZW50ZSBkZSBsYSBjYW50aWRhZCBkZSB0cmFiYWphZG9yZXMsIHNpbm8gdGFtYmnDqW4gZGUgbGEgZm9ybWEgZW4gcXVlIGVzdG9zIHNlIGRpc3RyaWJ1eWVuIGVudHJlIGxvcyBkaXN0aW50b3Mgc2VjdG9yZXMgZWNvbsOzbWljb3MsIGNvbW8gbGEgaW5kdXN0cmlhIHkgbG9zIHNlcnZpY2lvcywgbG9zIGN1YWxlcyBwcmVzZW50YW4gZGlmZXJlbmNpYXMgaW1wb3J0YW50ZXMgZW4gdMOpcm1pbm9zIGRlIHRlY25vbG9nw61hLCBjYXBpdGFsIHkgZ2VuZXJhY2nDs24gZGUgdmFsb3IuIEFzaW1pc21vLCBsYXMgY29uZGljaW9uZXMgZGVsIG1lcmNhZG8gbGFib3JhbCwgY29tbyBlbCBuaXZlbCBkZSB0cmFiYWpvIGluZGVwZW5kaWVudGUgeSBsYSBwYXJ0aWNpcGFjacOzbiBsYWJvcmFsIG1hc2N1bGluYSB5IGZlbWVuaW5hLCBwdWVkZW4gaW5mbHVpciBlbiBlc3RlIGNvbXBvcnRhbWllbnRvLg0KDQpFbiBlc3RlIGNvbnRleHRvLCBlbCBwcmVzZW50ZSB0cmFiYWpvIHRpZW5lIGNvbW8gb2JqZXRpdm8gZXN0aW1hciB5IGFuYWxpemFyIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgcXVlIHBlcm1pdGEgZXhwbGljYXIgbGEgcHJvZHVjdGl2aWRhZCBsYWJvcmFsIGVuIGZ1bmNpw7NuIGRlIGxhIGVzdHJ1Y3R1cmEgc2VjdG9yaWFsIGRlbCBlbXBsZW8geSBkZSBsYXMgY29uZGljaW9uZXMgbGFib3JhbGVzLCB1dGlsaXphbmRvIGluZm9ybWFjacOzbiBjb3JyZXNwb25kaWVudGUgYWwgYcOxbyAyMDE3IHByb3ZlbmllbnRlIGRlIGxhIGJhc2UgZGUgZGF0b3MgV29ybGQgRGV2ZWxvcG1lbnQgSW5kaWNhdG9ycy4gQSBwYXJ0aXIgZGUgZXN0ZSBtb2RlbG8sIHNlIGJ1c2NhIGlkZW50aWZpY2FyIGxhIHJlbGFjacOzbiBlbnRyZSBkaWNoYXMgdmFyaWFibGVzLCBhc8OtIGNvbW8gZXZhbHVhciBsYSBkaXJlY2Npw7NuIGUgaW50ZW5zaWRhZCBkZSBzdSBpbXBhY3RvIHNvYnJlIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbCwgY29uIGVsIGZpbiBkZSBhcG9ydGFyIGV2aWRlbmNpYSBzb2JyZSBsb3MgZmFjdG9yZXMgcXVlIGluZmx1eWVuIGVuIGVsIGRlc2VtcGXDsW8gZWNvbsOzbWljbyBkZSBsb3MgcGHDrXNlcy4NCg0KIyBfTWV0b2RvbG9naWFfDQoNCiMjICpDYXJnYSBkZSBkYXRvcyB5IHNlbGVjY2nDs24gZGUgdmFyaWFibGVzKg0KDQo8ZGl2IHN0eWxlPSJmb250LXNpemU6IDIwcHg7Ij4NCjx1bD4NCiAgPGxpPkxpYnJlcsOtYXMgeSBiYXNlIGRlIGRhdG9zPC9saT4NCjwvdWw+DQo8L2Rpdj4NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2djb3JycGxvdCkNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnb29nbGVzaGVldHM0KQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KDQpCRCA8LSByZWFkX2V4Y2VsKCJUYWxsZXJfMV9EYXRhLnhsc3giKQ0KYGBgDQoNCjxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMjBweDsiPg0KPHVsPg0KICA8bGk+U2VsZWNjacOzbiBkZSB2YXJpYWJsZXM8L2xpPg0KPC91bD4NCjwvZGl2Pg0KU2UgZXh0cmFqZXJvbiBsb3MgZGF0b3MgcXVlIGVzdMOhbiBjb250ZW5pZG9zIGVuIGVsIGHDsW8gMjAxNy4NCmBgYHtyfQ0KQkRfMjAxNyA8LSBCRCAlPiUgDQogIGZpbHRlcihUaW1lID09ICIyMDE3IikNCmBgYA0KDQpMdWVnbyBzZSAgc2VsZWNjaW9uYXJvbiB2YXJpYWJsZXMgcmVsYWNpb25hZGFzIGNvbiBsYSBlc3RydWN0dXJhIGRlbCBlbXBsZW8geSBzdSBwb3NpYmxlIGltcGFjdG8gZW4gbGEgcHJvZHVjdGl2aWRhZDoNCg0KYGBge3J9DQpUYWJsYTEgPC0gQkRfMjAxNyAlPiUgDQogIHNlbGVjdCgNCiAgICBgVGltZWAsIGBDb3VudHJ5IE5hbWVgLA0KICAgIEdEUCA9IGBHRFAgcGVyIHBlcnNvbiBlbXBsb3llZCAoY29uc3RhbnQgMjAxNyBQUFAgJCkgW1NMLkdEUC5QQ0FQLkVNLktEXWAsDQogICAgaW5kdXN0cmlhPSBgRW1wbG95bWVudCBpbiBpbmR1c3RyeSAoJSBvZiB0b3RhbCBlbXBsb3ltZW50KSAobW9kZWxlZCBJTE8gZXN0aW1hdGUpIFtTTC5JTkQuRU1QTC5aU11gLA0KICAgIHNlcnZpY2lvcz0gYEVtcGxveW1lbnQgaW4gc2VydmljZXMgKCUgb2YgdG90YWwgZW1wbG95bWVudCkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKSBbU0wuU1JWLkVNUEwuWlNdYCwNCiAgICB0cmFiYWphZG9yZXNfaW5kPSBgU2VsZi1lbXBsb3llZCwgdG90YWwgKCUgb2YgdG90YWwgZW1wbG95bWVudCkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKSBbU0wuRU1QLlNFTEYuWlNdYCwNCiAgICB0cmFiYWphZG9yZXNfZmVtPSBgRW1wbG95bWVudCB0byBwb3B1bGF0aW9uIHJhdGlvLCAxNSssIGZlbWFsZSAoJSkgKG5hdGlvbmFsIGVzdGltYXRlKSBbU0wuRU1QLlRPVEwuU1AuRkUuTkUuWlNdYCwNCiAgICB0cmFiYWphZG9yZXNfbWFzPSBgRW1wbG95bWVudCB0byBwb3B1bGF0aW9uIHJhdGlvLCAxNSssIG1hbGUgKCUpIChtb2RlbGVkIElMTyBlc3RpbWF0ZSkgW1NMLkVNUC5UT1RMLlNQLk1BLlpTXWANCiAgKQ0KDQpgYGANCg0KIyMjIEFuw6FsaXNpcyBkZXNjcmlwdGl2byBkZSBsYXMgdmFyaWFibGUNClBhcnRpZW5kbyBkZSBlc3RvLCByZWFsaXphcmVtb3MgZWwgQW7DoWxpc2lzIGRlc2NyaXB0aXZvIGRlIGxhcyB2YXJpYWJsZXM6DQpgYGB7cn0NCmRhdGEgPC0gcmVhZF9zaGVldCgiaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMWtBTmQyMHJ2cE1EUHprT2t3MFgxQm1Cd3ZlTWdKNDlVOExxYjB2OHYwcXcvZWRpdD9naWQ9MCNnaWQ9MCIpDQoNCmRhdGEgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRhYmxhIDEiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiYm9yZGVyZWQiKSkNCmBgYA0KDQo8ZGl2IHN0eWxlPSJmb250LXNpemU6IDIwcHg7Ij4NCjx1bD4NCiAgPGxpPkNsYXNpZmljYWNpw7NuIGRlIHBhw61zZXMgcG9yIHJlZ2nDs248L2xpPg0KPC91bD4NCjwvZGl2Pg0KDQpQYXJhIHBvZGVyIGNsYXNpZmljYXIgbG9zIHBhw61zZXMgZW4gbGFzIHJlZ2lvbmVzIGRlIExhdGlub2Ftw6lyaWNhIHkgZWwgQ2FyaWJlLCBFdXJvcGEgeSBBc2lhIENlbnRyYWwsIHByaW1lcm8gZnVlIG5lY2VzYXJpbyBpZGVudGlmaWNhciBxdcOpIHBhw61zZXMgcGVydGVuZWNlbiBhIGNhZGEgdW5hIGRlIGVzdGFzIHpvbmFzLiBQYXJhIGVsbG8gc2UgcmVhbGl6w7MgdW5hIGLDunNxdWVkYSB5IHNlIHRvbcOzIGNvbW8gcmVmZXJlbmNpYSBsYSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSBlbiBlbCBzaXRpbyB3ZWIgZGUgVGhvdWdodENvLCBkb25kZSBzZSBsaXN0YW4gb2ZpY2lhbG1lbnRlIGxvcyBwYcOtc2VzIHBvciByZWdpw7NuLg0KDQpDb24gYmFzZSBlbiBlc2EgaW5mb3JtYWNpw7NuLCBzZSBjcmXDsyBlbiBSIHVuYSBudWV2YSBjb2x1bW5hIGxsYW1hZGEgUmVnacOzbiB1dGlsaXphbmRvIGxhIGZ1bmNpw7NuIG11dGF0ZSgpLiBQb3N0ZXJpb3JtZW50ZSwgc2UgZW1wbGXDsyBjYXNlX3doZW4oKSBwYXJhIGFzaWduYXIgYSBjYWRhIHBhw61zIGVsIG5vbWJyZSBkZSBsYSByZWdpw7NuIGNvcnJlc3BvbmRpZW50ZS4gRGUgZXN0YSBtYW5lcmEsIGVuIGx1Z2FyIGRlIG1vc3RyYXIgZWwgbm9tYnJlIGluZGl2aWR1YWwgZGUgY2FkYSBwYcOtcywgbGEgYmFzZSBkZSBkYXRvcyBxdWVkYSBvcmdhbml6YWRhIHBvciBsYSByZWdpw7NuIGEgbGEgcXVlIHBlcnRlbmVjZSBjYWRhIHVuby4NCg0KYGBge3J9DQpDRyA8LSBUYWJsYTEgJT4lIA0KICBtdXRhdGUoUmVnaW9uID0gY2FzZV93aGVuKA0KICAgIGBDb3VudHJ5IE5hbWVgICVpbiUgYygiQXJnZW50aW5hIiwiQm9saXZpYSIsIkJyYXppbCIsIkNoaWxlIiwiQ29sb21iaWEiLCJDb3N0YSBSaWNhIiwiQ3ViYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLCJFY3VhZG9yIiwiRWwgU2FsdmFkb3IiLCJHdWF0ZW1hbGEiLCJIYWl0aSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJIb25kdXJhcyIsIkphbWFpY2EiLCJNZXhpY28iLCJOaWNhcmFndWEiLCJQYW5hbWEiLCJQYXJhZ3VheSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJ1IiwiVXJ1Z3VheSIsIlZlbmV6dWVsYSIpIH4gIkxhdGlub2Ftw6lyaWNhIHkgZWwgQ2FyaWJlIiwNCiAgICBgQ291bnRyeSBOYW1lYCAlaW4lIGMoIkdlcm1hbnkiLCJGcmFuY2UiLCJTcGFpbiIsIkl0YWx5IiwiVW5pdGVkIEtpbmdkb20iLCJOZXRoZXJsYW5kcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXVtIiwiU3dlZGVuIiwiTm9yd2F5IiwiRmlubGFuZCIsIkRlbm1hcmsiLCJQb3J0dWdhbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJBdXN0cmlhIiwiU3dpdHplcmxhbmQiLCJQb2xhbmQiLCJDemVjaCBSZXB1YmxpYyIsIkdyZWVjZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJIdW5nYXJ5IiwiSXJlbGFuZCIsIlJvbWFuaWEiLCJCdWxnYXJpYSIsIlNlcmJpYSIsIkNyb2F0aWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiU2xvdmFraWEiLCJTbG92ZW5pYSIsIlVrcmFpbmUiLCJSdXNzaWEiKSB+ICJFdXJvcGEiLA0KICAgIGBDb3VudHJ5IE5hbWVgICVpbiUgYygiS2F6YWtoc3RhbiIsIlV6YmVraXN0YW4iLCJUdXJrbWVuaXN0YW4iLCJLeXJneXogUmVwdWJsaWMiLCJUYWppa2lzdGFuIikgfiAiQXNpYSBDZW50cmFsIiwNCiAgICBUUlVFIH4gIk90cm9zIg0KICApKQ0KYGBgDQoNCjxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMjBweDsiPg0KPHVsPg0KICA8bGk+Vm9sdmllbmRvIGxhIHZhcmlhYmxlIHJlZ2nDs24gY29tbyBjdWFudGl0YXRpdmE8L2xpPg0KPC91bD4NCjwvZGl2PiANCmBgYHtyfQ0KQ0ckUmVnaW9uIDwtIGFzLmZhY3RvcihDRyRSZWdpb24pDQpgYGANCg0KIyMjIERlc2NyaXBjacOzbiBkZWwgbW9kZWxvDQoNCkNvbiBlbCBmaW4gZGUgYW5hbGl6YXIgbG9zIGRldGVybWluYW50ZXMgZGUgbGEgcHJvZHVjdGl2aWRhZCBsYWJvcmFsLCBzZSBlc3RpbcOzIHVuIG1vZGVsbyBkZSByZWdyZXNpw7NuIGxpbmVhbCBtw7psdGlwbGUgdXRpbGl6YW5kbyBpbmZvcm1hY2nDs24gY29ycmVzcG9uZGllbnRlIGFsIGHDsW8gMjAxNy4gTGEgdmFyaWFibGUgZGVwZW5kaWVudGUgZGVsIG1vZGVsbyBlcyBlbCBHRFAgcGVyIHBlcnNvbiBlbXBsb3llZCAoY29uc3RhbnQgMjAxNyBQUFAgJCksIGxhIGN1YWwgbWlkZSBsYSBwcm9kdWN0aXZpZGFkIHByb21lZGlvIGRlIGxvcyB0cmFiYWphZG9yZXMgZW4gY2FkYSBwYcOtcy4NCkNvbW8gdmFyaWFibGVzIGV4cGxpY2F0aXZhcywgc2UgaW5jbHV5ZXJvbiBpbmRpY2Fkb3JlcyByZWxhY2lvbmFkb3MgY29uIGxhIGVzdHJ1Y3R1cmEgc2VjdG9yaWFsIGRlbCBlbXBsZW8geSBsYXMgY29uZGljaW9uZXMgZGVsIG1lcmNhZG8gbGFib3JhbC4NCg0KRGUgZXN0YSBmb3JtYSwgZWwgbW9kZWxvIGVzdGltYWRvIHB1ZWRlIGV4cHJlc2Fyc2UgY29tbzoNCg0KXFsNCkdEUF9pID0gXGJldGFfMCANCisgXGJldGFfMSBcLCBzZXJ2aWNpb3NfaSANCisgXGJldGFfMiBcLCBpbmR1c3RyaWFfaSANCisgXGJldGFfMyBcLCB0cmFiYWphZG9yZXNcX21hc19pIA0KKyBcYmV0YV80IFwsIHRyYWJhamFkb3Jlc1xfZmVtX2kgDQorIFxiZXRhXzUgXCwgdHJhYmFqYWRvcmVzXF9pbmRfaSANCisgXGdhbW1hXzEgXCwgUmVnaW9uX3tBbWVyaWNhLGl9DQorIFxnYW1tYV8yIFwsIFJlZ2lvbl97QXNpYSxpfQ0KKyBcZ2FtbWFfMyBcLCBSZWdpb25fe0V1cm9wYSxpfQ0KKyBcdmFyZXBzaWxvbl9pDQpcXQ0KDQpEb25kZToNCg0KLSBcKEdEUF9pXCk6IFByb2R1Y3RvIEludGVybm8gQnJ1dG8gZGVsIHBhw61zIFwoaVwpLg0KLSBcKFxiZXRhXzBcKTogSW50ZXJjZXB0byBkZWwgbW9kZWxvLg0KLSBcKFxiZXRhXzEsIFxiZXRhXzIsIFxiZXRhXzMsIFxiZXRhXzQsIFxiZXRhXzVcKTogRWZlY3RvcyBtYXJnaW5hbGVzIGRlIGxhcyB2YXJpYWJsZXMgY29udGludWFzLg0KLSBcKFJlZ2lvbl97QW1lcmljYSxpfSwgUmVnaW9uX3tBc2lhLGl9LCBSZWdpb25fe0V1cm9wYSxpfVwpOiBWYXJpYWJsZXMgaW5kaWNhZG9yYXMgcXVlIHZhbGVuIDEgc2kgZWwgcGHDrXMgcGVydGVuZWNlIGEgZXNhIHJlZ2nDs24geSAwIGVuIGNhc28gY29udHJhcmlvLg0KLSBcKFxnYW1tYV8xLCBcZ2FtbWFfMiwgXGdhbW1hXzNcKTogRWZlY3RvcyBkaWZlcmVuY2lhbGVzIGRlIGNhZGEgcmVnacOzbiByZXNwZWN0byBhIGxhIGNhdGVnb3LDrWEgYmFzZS4NCi0gXChcdmFyZXBzaWxvbl9pXCk6IFTDqXJtaW5vIGRlIGVycm9yIHF1ZSByZWNvZ2UgZmFjdG9yZXMgbm8gb2JzZXJ2YWRvcy4NCg0KIyBfUmVzdWx0YWRvcyBEZXNjcmlwdGl2b3NfDQoNCiMjIyBUYWJsYXMgZGVzY3JpcHRpdmFzDQpgYGB7cn0NCnRhYmxhX2luZHVzdHJpYSA8LSBDRyAlPiUgDQogIHN1bW1hcml6ZSgNCiAgICBQcm9tZWRpbyA9IG1lYW4oaW5kdXN0cmlhLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lZGlhbmEgPSBtZWRpYW4oaW5kdXN0cmlhLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1pbmltbyA9IG1pbihpbmR1c3RyaWEsIG5hLnJtID0gVFJVRSksDQogICAgTWF4aW1vID0gbWF4KGluZHVzdHJpYSwgbmEucm0gPSBUUlVFKSwNCiAgICBEZXN2ID0gc2QoaW5kdXN0cmlhLCBuYS5ybSA9IFRSVUUpDQogICkNCg0KdGFibGFfaW5kdXN0cmlhICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsYSAyOiBFc3RhZMOtc3RpY2FzIGRlc2NyaXB0aXZhcyBkZSBJbmR1c3RyaWEiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQoNCnRhYmxhX3NlcnZpY2lvcyA8LSBDRyAlPiUgDQogIHN1bW1hcml6ZSgNCiAgICBQcm9tZWRpbyA9IG1lYW4oc2VydmljaW9zLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lZGlhbmEgID0gbWVkaWFuKHNlcnZpY2lvcywgbmEucm0gPSBUUlVFKSwNCiAgICBNaW5pbW8gICA9IG1pbihzZXJ2aWNpb3MsIG5hLnJtID0gVFJVRSksDQogICAgTWF4aW1vICAgPSBtYXgoc2VydmljaW9zLCBuYS5ybSA9IFRSVUUpLA0KICAgIERlc3YgICAgID0gc2Qoc2VydmljaW9zLCBuYS5ybSA9IFRSVUUpDQogICkNCg0KdGFibGFfc2VydmljaW9zICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJUYWJsYSAzOiBFc3RhZMOtc3RpY2FzIGRlc2NyaXB0aXZhcyBkZSBTZXJ2aWNpb3MiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQoNCnRhYmxhX2luZCA8LSBDRyAlPiUgDQogIHN1bW1hcml6ZSgNCiAgICBQcm9tZWRpbyA9IG1lYW4odHJhYmFqYWRvcmVzX2luZCwgbmEucm0gPSBUUlVFKSwNCiAgICBNZWRpYW5hID0gbWVkaWFuKHRyYWJhamFkb3Jlc19pbmQsIG5hLnJtID0gVFJVRSksDQogICAgTWluaW1vID0gbWluKHRyYWJhamFkb3Jlc19pbmQsIG5hLnJtID0gVFJVRSksDQogICAgTWF4aW1vID0gbWF4KHRyYWJhamFkb3Jlc19pbmQsIG5hLnJtID0gVFJVRSksDQogICAgRGVzdiA9IHNkKHRyYWJhamFkb3Jlc19pbmQsIG5hLnJtID0gVFJVRSkNCiAgKQ0KDQp0YWJsYV9pbmQgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlRhYmxhIDQ6IEVzdGFkw61zdGljYXMgZGVzY3JpcHRpdmFzIGRlIFRyYWJhamFkb3JlcyBJbmRlcGVuZGllbnRlcyIpICU+JSANCiAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRkFMU0UsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkNCg0KdGFibGFfbWFzIDwtIENHICU+JSANCiAgc3VtbWFyaXplKA0KICAgIFByb21lZGlvID0gbWVhbih0cmFiYWphZG9yZXNfbWFzLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1lZGlhbmEgPSBtZWRpYW4odHJhYmFqYWRvcmVzX21hcywgbmEucm0gPSBUUlVFKSwNCiAgICBNaW5pbW8gPSBtaW4odHJhYmFqYWRvcmVzX21hcywgbmEucm0gPSBUUlVFKSwNCiAgICBNYXhpbW8gPSBtYXgodHJhYmFqYWRvcmVzX21hcywgbmEucm0gPSBUUlVFKSwNCiAgICBEZXN2ID0gc2QodHJhYmFqYWRvcmVzX21hcywgbmEucm0gPSBUUlVFKQ0KICApDQoNCnRhYmxhX21hcyAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVGFibGEgNTogRXN0YWTDrXN0aWNhcyBkZXNjcmlwdGl2YXMgZGUgVHJhYmFqYWRvcmVzIE1hc2N1bGlub3MgKzE1IikgJT4lIA0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQ0KDQoNCnRhYmxhX3RyYWJhamFkb3Jlc19mZW0gPC0gQ0cgJT4lIA0KICBzdW1tYXJpemUoDQogICAgUHJvbWVkaW8gPSBtZWFuKHRyYWJhamFkb3Jlc19mZW0sIG5hLnJtID0gVFJVRSksDQogICAgTWVkaWFuYSA9IG1lZGlhbih0cmFiYWphZG9yZXNfZmVtLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1pbmltbyA9IG1pbih0cmFiYWphZG9yZXNfZmVtLCBuYS5ybSA9IFRSVUUpLA0KICAgIE1heGltbyA9IG1heCh0cmFiYWphZG9yZXNfZmVtLCBuYS5ybSA9IFRSVUUpLA0KICAgIERlc3YgPSBzZCh0cmFiYWphZG9yZXNfZmVtLCBuYS5ybSA9IFRSVUUpDQogICkNCg0KdGFibGFfdHJhYmFqYWRvcmVzX2ZlbSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVGFibGEgNjogRXN0YWTDrXN0aWNhcyBkZXNjcmlwdGl2YXMgZGUgVHJhYmFqYWRvcmFzIEZlbWVuaW5hcyArMTUiKSAlPiUgDQogIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEZBTFNFLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KYGBge3J9DQp0YWJsYV9yZWdpb24gPC0gQ0cgJT4lIA0KICAgIGdyb3VwX2J5KFJlZ2lvbikgJT4lIA0KICAgIHN1bW1hcml6ZSgNCiAgICAgIFByb21lZGlvX0dEUCA9IG1lYW4oR0RQLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgTWVkaWFuYV9HRFAgPSBtZWRpYW4oR0RQLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgTWluX0dEUCA9IG1pbihHRFAsIG5hLnJtID0gVFJVRSksDQogICAgICBNYXhfR0RQID0gbWF4KEdEUCwgbmEucm0gPSBUUlVFKSwNCiAgICAgIERlc3ZfR0RQID0gc2QoR0RQLCBuYS5ybSA9IFRSVUUpDQogICkNCg0KdGFibGFfcmVnaW9uICU+JSANCmthYmxlKGNhcHRpb24gPSAiVGFibGFzIDc6IHByb21lZGlvcyBwb3IgcmVnacOzbiAiKSU+JQ0KICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGQUxTRSwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQ0KDQpgYGANCg0KQ29tcGFyYW5kbyBsYXMgcmVnaW9uZXMgc2Ugb2JzZXJ2YSBxdWUgRXVyb3BhIHRpZW5lIHVuIG1heW9yIEdEUCBwcm9tZWRpbyBlbiBjb21wYXJhY2nDs24gY29uIGxhcyBkZW3DoXMgcmVnaW9uZXMsIHRhbWJpw6luIHRpZW5lIHVuYSB2YXJpYWJpbGlkYWQgbXVjaG8gbcOhcyBhbXBsaWEgZW50cmUgcGHDrXNlcywgbG8gcXVlIHB1ZWRlIHN1Z2VyaXIgcXVlIGVudHJlIGxvcyBwYcOtc2VzIGRlIGVzdGEgcmVnacOzbiBsYSBlY29ub23DrWEgdmFyw61hIG11Y2hvLg0KRW4gY2FtYmlvLCBMYXRpbm9hbcOpcmljYSB5IGVsIENhcmliZSBtdWVzdHJhIHZhbG9yZXMgbcOhcyBjb25jZW50cmFkb3MgeSBtZW5vcmVzIG5pdmVsZXMgZGUgcHJvZHVjdGl2aWRhZC4gRWwgZ3J1cG8g4oCcT3Ryb3PigJ0gbXVlc3RyYSB1bmEgbWV6Y2xhIG3DoXMgaGV0ZXJvZ8OpbmVhLCBjb24gcGHDrXNlcyBxdWUgcHVlZGVuIHRlbmVyIHRhbnRvIG5pdmVsZXMgbXV5IGJham9zIGNvbW8gZXh0cmVtYWRhbWVudGUgYWx0b3MgZGUgR0RQLg0KDQojIyMgUmVsYWNpw7NuIGVudHJlIHZhcmlhYmxlcw0KU2luIGVtYmFyZ28sIGVzIGZ1bmRhbWVudGFsIHJlY29yZGFyIHF1ZSBlc3RlIHRpcG8gZGUgYW7DoWxpc2lzIGNvcnJlbGFjaW9uYWwgbm8gcGVybWl0ZSBlc3RhYmxlY2VyIHVuYSByZWxhY2nDs24gY2F1c2FsIGRpcmVjdGHigJ0uDQpFc3RvcyBncsOhZmljb3Mgc2UgdmFuIGEgYW5hbGl6YXIgYSBwYXJ0aXIgZGUgMyBhc3BlY3RvczogRm9ybWEsIGRpcmVjY2nDs24geSBmdWVyemEuDQoNCg0KYGBge3J9DQpDRzIgPC0gQ0cgJT4lIGRyb3BfbmEoR0RQLCBpbmR1c3RyaWEsIHNlcnZpY2lvcywgdHJhYmFqYWRvcmVzX2luZCwgdHJhYmFqYWRvcmVzX2ZlbSwgdHJhYmFqYWRvcmVzX21hcykNCg0KZ3JhZmljbzE8LSBnZ3Bsb3QoQ0cyLCBhZXMoeCA9IGluZHVzdHJpYSwgeSA9IEdEUCkpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICIjNTQxOTdEIikgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICJyZWQiKSArDQogIA0KICBsYWJzKHRpdGxlID0gIkdyZmljbyAxOiBSZWxhY2nDs24gZW50cmUgR0RQIHkgSW5kdXN0cmlhIiwNCiAgICAgICB4ID0gIkluZHVzdHJpYSIsDQogICAgICAgeSA9ICJHRFAiKQ0KZ2dwbG90bHkoZ3JhZmljbzEpDQpgYGANCg0KTGEgdmFyaWFibGUgImluZHVzdHJpYSIgbXVlc3RyYSB1bmEgcmVsYWNpw7NuIGTDqWJpbCBjb24gZWwgUHJvZHVjdG8gSW50ZXJubyBCcnV0byAoR0RQKSBwb3IgcGVyc29uYSBlbXBsZWFkYSwgeWEgcXVlIGxhIGRpc3BlcnNpw7NuIGRlIGxvcyBkYXRvcyBhbHJlZGVkb3IgZGUgbGEgbMOtbmVhIGRlIHJlZ3Jlc2nDs24gZXMgYWx0YS4gRXN0YSBzaWduaWZpY2F0aXZhIGRpc3BlcnNpw7NuIHN1Z2llcmUgbGEgYXVzZW5jaWEgZGUgdW5hIHJlZ3Jlc2nDs24gbGluZWFsIGNsYXJhIGVudHJlIGFtYmFzIHZhcmlhYmxlczsgYW5hbGl6YW5kbyBlbCBncsOhZmljbyB5IGxhIHRlbmRlbmNpYSBvYnRlbmlkYSwgc2UgcG9kcsOtYSBkZWNpciBxdWUgbGEgZGlyZWNjacOzbiBzZSBtYW50aWVuZSBwbGFuYSBjb24gbGlnZXJvcyBjYW1iaW9zIGRlYmlkbyBhIGxhIGFsdGEgZGlzcGVyc2nDs24sIHBvciBsbyBxdWUgcHJlc2VudGEgdW5hIGFzb2NpYWNpw7NuIGRlIGJhamEgaW50ZW5zaWRhZCBlbnRyZSBhbWJhcyB2YXJpYWJsZXMuIA0KDQpgYGB7cn0NCmdyYWZpY28yPC0gZ2dwbG90KENHMiwgYWVzKHggPSBzZXJ2aWNpb3MsIHkgPSBHRFApKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzU0MTk3RCIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAicmVkIikgKw0KICANCiAgbGFicyh0aXRsZSA9ICJHcmZpY28gMjogUmVsYWNpw7NuIGVudHJlIEdEUCB5IFNlcnZpY2lvcyIsDQogICAgICAgeCA9ICJTZXJ2aWNpb3MiLA0KICAgICAgIHkgPSAiR0RQIikNCmdncGxvdGx5KGdyYWZpY28yKQ0KYGBgDQoNCkxhIHZhcmlhYmxlIOKAnHNlcnZpY2lvc+KAnSBtdWVzdHJhIHVuYSByZWxhY2nDs24gZnVlcnRlIHBvc2l0aXZhIGVudHJlIGVsIFByb2R1Y3RvIEludGVybm8gQnJ1dG8gKEdEUCkgcG9yIHBlcnNvbmEgZW1wbGVhZGEsIHlhIHF1ZSBsYSBwZW5kaWVudGUgYXNjZW5kZW50ZSAocG9zaXRpdmEpIGRlIGxhIGzDrW5lYSBkZSByZWdyZXNpw7NuIGluZGljYSBxdWUsIGEgbWVkaWRhIHF1ZSBsYSBwYXJ0aWNpcGFjacOzbiBkZSBsb3Mgc2VydmljaW9zIGF1bWVudGEsIGVsIEdEUCBtdWVzdHJhIHVuYSB0ZW5kZW5jaWEgYSBpbmNyZW1lbnRhcnNlIGRlIGZvcm1hIG3DoXMgY29uc2lzdGVudGUsIHBvciBsbyBxdWUgcHJlc2VudGEgdW5hIGFzb2NpYWNpw7NuIHNpZ25pZmljYXRpdmEgZGVsIHNlY3RvciBzZXJ2aWNpb3MgY29uIGVsIGNyZWNpbWllbnRvIGVjb27Ds21pY28uDQoNCmBgYHtyfQ0KZ3JhZmljbzM8LSBnZ3Bsb3QoQ0cyLCBhZXMoeCA9IHRyYWJhamFkb3Jlc19pbmQsIHkgPSBHRFApKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzU0MTk3RCIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAicmVkIikgKw0KICANCiAgbGFicyh0aXRsZSA9ICJHcmZpY28gMzogUmVsYWNpw7NuIGVudHJlIEdEUCB5IFRyYWJhamFkb3JlcyBpbmRlcGVuZGllbnRlcyIsDQogICAgICAgeCA9ICJUcmFiYWphZG9yZXMgSW5kZXBlbmRpZW50ZXMiLA0KICAgICAgIHkgPSAiR0RQIikNCmdncGxvdGx5KGdyYWZpY28zKQ0KYGBgDQoNCkxhIHZhcmlhYmxlICJ0cmFiYWphZG9yZXMgaW5kZXBlbmRpZW50ZXMiIHByZXNlbnRhIHVuYSBhc29jaWFjacOzbiBkaXJlY3RhLCBsbyBjdWFsIHNlIGV2aWRlbmNpYSBlbiBsYSBsw61uZWEgZGUgcmVncmVzacOzbi4gRXN0YSBsw61uZWEgbXVlc3RyYSB1bmEgcmVsYWNpw7NuIG5lZ2F0aXZhIHkgZGUgZnVlcnphIG1vZGVyYWRhIGNvbiBlbCBQcm9kdWN0byBJbnRlcm5vIEJydXRvIChHRFApIHBvciBwZXJzb25hIGVtcGxlYWRhLCBkZWJpZG8gYSB1bmEgbGV2ZSBkaXNwZXJzacOzbiBlbiBsb3MgZGF0b3MuIExhIHBlbmRpZW50ZSBlcyBuZWdhdGl2YSBjb25mb3JtZSBhdW1lbnRhIGxhIHBhcnRpY2lwYWNpw7NuIGRlbCBzZWN0b3Igc2VydmljaW9zLg0KDQpgYGB7cn0NCmdyYWZpY280PC1nZ3Bsb3QoQ0cyLCBhZXMoeCA9IHRyYWJhamFkb3Jlc19tYXMsIHkgPSBHRFApKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAiIzU0MTk3RCIpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAicmVkIikgKw0KICANCiAgbGFicyh0aXRsZSA9ICJHcmZpY28gNDogUmVsYWNpw7NuIGVudHJlIEdEUCB5IFRyYWJhamFkb3JlcyBzZXggbWFzY3VsaW5vcyArMTUiLA0KICAgICAgIHggPSAiVHJhYmFqYWRvcmVzIGRlbCBzZXhvIG1hc2N1bGlub3MgKzE1IiwNCiAgICAgICB5ID0gIkdEUCIpDQpnZ3Bsb3RseShncmFmaWNvNCkNCmBgYA0KDQpMYSB2YXJpYWJsZSAiVHJhYmFqYWRvcmVzIGRlbCBzZXhvIG1hc2N1bGlubyArMTUiIGV4aGliZSB1bmEgYXNvY2lhY2nDs24gZMOpYmlsIGUgaW52ZXJzYSBjb24gZWwgUHJvZHVjdG8gSW50ZXJubyBCcnV0byAoR0RQKSBwb3IgcGVyc29uYSBlbXBsZWFkYS4gU2Ugb2JzZXJ2YSB1bmEgdGVuZGVuY2lhLCBhdW5xdWUgbGlnZXJhLCBhIGxhIGRpc21pbnVjacOzbiBkZWwgUElCIGEgbWVkaWRhIHF1ZSBlbCBuw7ptZXJvIGRlIHRyYWJhamFkb3JlcyBtYXNjdWxpbm9zIGF1bWVudGEuIEVzdG8gc2UgcmVmbGVqYSBlbiBsYSBsw61uZWEgZGUgcmVncmVzacOzbiBjb24gdW5hIHBlbmRpZW50ZSBuZWdhdGl2YSwgcGVybyBtdXkgcG9jbyBwcm9udW5jaWFkYSAocGxhbmEpLg0KDQpgYGB7cn0NCmdyYWZpY281PC0gZ2dwbG90KENHMiwgYWVzKHggPSB0cmFiYWphZG9yZXNfZmVtLCB5ID0gR0RQKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gIiM1NDE5N0QiKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gInJlZCIpICsNCiAgDQogIGxhYnModGl0bGUgPSAiR3JmaWNvIDU6IFJlbGFjacOzbiBlbnRyZSBHRFAgeSB0cmFiYWphZG9yZXMgc2V4IGZlbWVuaW5vICsxNSIsDQogICAgICAgeCA9ICJUcmFiYWphZG9yZXMgZGVsIHNleG8gZmVtZW5pbm8gKzE1IiwNCiAgICAgICB5ID0gIkdEUCIpDQpnZ3Bsb3RseShncmFmaWNvNSkNCmBgYA0KDQpMYSB2YXJpYWJsZSDigJxUcmFiYWphZG9yZXMgZGVsIHNleG8gZmVtZW5pbm8gKzE14oCdLiBFbCBncsOhZmljbyBldmlkZW5jaWEgdW5hIHJlbGFjacOzbiBwb3NpdGl2YSBkw6liaWwgZW50cmUgZWwgbsO6bWVybyBkZSB0cmFiYWphZG9yYXMgZGVsIHNleG8gZmVtZW5pbm8gKCsxNSkgeSBlbCBQcm9kdWN0byBJbnRlcm5vIEJydXRvIChHRFApIHBvciBwZXJzb25hIGVtcGxlYWRhLiBFc3RvIHNlIGRlYmUgYSBsYSBkaXN0YW5jaWEgcXVlIHByZXNlbnRhbiBhbGd1bm9zIGRhdG9zIGZyZW50ZSBhIGxhIGzDrW5lYSBkZSByZWdyZXNpw7NuLCBsYSBjdWFsIHByb3ZvY2Fyw61hIHVuYSBmdWVyemEgZMOpYmlsOyBzaW4gZW1iYXJnbywgYSBtYXlvciBwYXJ0aWNpcGFjacOzbiBmZW1lbmluYSwgZWwgR0RQIHBvciBwZXJzb25hIGVtcGxlYWRhIHRpZW5kZSBhIGluY3JlbWVudGFyc2UuDQoNCg0KYGBge3J9DQpnX3JlZ2nDs24gPC0gZ2dwbG90KENHLCBhZXMoeCA9IFJlZ2lvbiwgeSA9IEdEUCwgZmlsbCA9IFJlZ2lvbikpICsNCiAgZ2VvbV9ib3hwbG90KCkgKw0KICBsYWJzKHRpdGxlID0gIkdyYWZpY28gNjogRGlzdHJpYnVjacOzbiBkZWwgR0RQIHBvciBSZWdpw7NuIiwNCiAgICAgICB4ID0gIlJlZ2nDs24iLA0KICAgICAgIHkgPSAiR0RQIikNCmdncGxvdGx5KGdfcmVnacOzbikNCmBgYA0KDQojIF9SZXN1bHRhZG9zIGRlbCBNb2RlbG9fDQotICoqTW9kZWxvKioNCmBgYHtyfQ0KbW9kZWxvIDwtIGxtKEdEUCB+IHNlcnZpY2lvcytpbmR1c3RyaWErdHJhYmFqYWRvcmVzX21hcyt0cmFiYWphZG9yZXNfZmVtK3RyYWJhamFkb3Jlc19pbmQrUmVnaW9uLCBkYXRhID0gQ0cpDQpzdW1tYXJ5KG1vZGVsbykNCmBgYA0KDQpMbyBxdWUgaW50ZXJwcmV0YW1vcyBkZSBsb3MgcmVzdWx0YWRvcyBkZWwgbW9kZWxvIGRlIHJlZ3Jlc2nDs24gbGluZWFsIGVzIHF1ZSBsYSB2YXJpYWJsZSBzZXJ2aWNpb3MgZXMgc2lnbmlmaWNhdGl2YSwgbGEgdmFyaWFibGUgdHJhYmFqYWRvcmVzIGluZGVwZW5kaWVudGVzIGVzIG1hcmdpbmFsIHkgbGFzIGZhbHRhbnRlcyBubyBzb24gcmVsZXZhbnRlcy4gQWwgb2JzZXJ2YXIgZWwgIHAtdmFsdWUsIG9ic2VydmFtb3MgcXVlIGVzIG11eSBwZXF1ZcOxbzsgcG9yIGxvIHRhbnRvLCBlbCBtb2RlbG8gZXMgc2lnbmlmaWNhdGl2bywgeWEgcXVlIHBvciBsbyBtZW5vcyB1bmEgZGUgbGFzIHZhcmlhYmxlcyBlcyBzaWduaWZpY2F0aXZhLiANCg0KIyMgKkFuYWxpc2lzIGRlbCByZXN1bHRhZG8gZGVsIG1vZGVsbyoNCg0KIyMjIEhvbW9jZWRhc3RpY2lkYWQNCmBgYHtyfQ0KcmVzMSA8LSByZXNpZHVhbHMobW9kZWxvKQ0KDQpwbG90KG1vZGVsbyRmaXR0ZWQudmFsdWVzLCByZXMxLA0KICAgICB4bGFiID0gIlZhbG9yZXMgYWp1c3RhZG9zIiwNCiAgICAgeWxhYiA9ICJSZXNpZHVvcyIsDQogICAgIG1haW4gPSAiR3JhZmljbyA3OiBSZXNpZHVvcyB2cyBBanVzdGFkb3MiKQ0KYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIikNCmBgYA0KDQpFbCBncsOhZmljbyA3IG11ZXN0cmEgdW5hIHJlbGFjacOzbiBkaXJlY3RhIGVudHJlIGxhcyB2YXJpYWJsZXMuIERhZG8gcXVlIGxvcyBwdW50b3Mgc2UgZGlzcGVyc2FuIGFsZWF0b3JpYW1lbnRlIGFscmVkZWRvciBkZSBsYSBsw61uZWEgZGUgcmVncmVzacOzbiBzaW4gZm9ybWFyIHBhdHJvbmVzIGRpc2Nlcm5pYmxlcywgc2UgaW5maWVyZSBxdWUgZWwgbW9kZWxvIHNlIGFqdXN0YSBiaWVuIGEgbG9zIGRhdG9zLiBMYSBkaXNwZXJzacOzbiBjb25zdGFudGUgZGUgbG9zIHB1bnRvcyBzdWdpZXJlIHRhbWJpw6luIGVsIGN1bXBsaW1pZW50byBkZWwgc3VwdWVzdG8gZGUgaG9tb2NlZGFzdGljaWRhZC4NCg0KIyMjIE5vcm1hbGlkYWQgZGUgcmVzaWR1b3MNCmBgYHtyfQ0KcXFub3JtKHJlczEsIG1haW4gPSAiR3LDoWZpY28gODogUS1RIHBsb3QgZGUgbG9zIHJlc2lkdW9zIikNCnFxbGluZShyZXMxLCBjb2wgPSAicmVkIikNCmBgYA0KDQpFbCBncsOhZmljbyA4IG5vcyBtdWVzdHJhIHF1ZSBsb3MgZGF0b3MgZXN0w6FuIHN1bWFtZW50ZSBhbGluZWFkb3MgYSBsYSBsw61uZWEgZGUgcmVncmVzacOzbiBwb3IgbG8gcXVlIGVsIG1vZGVsbyBwcmVkaWNlIGJpZW4uDQoNCiMjIyBNYXRyaXogZGUgY29ycmVsYWNpw7NuDQoNCmBgYHtyfQ0KdmFyc19jb3IgPC0gQ0cgJT4lIA0KICBzZWxlY3QoR0RQLCBpbmR1c3RyaWEsIHNlcnZpY2lvcywgdHJhYmFqYWRvcmVzX2luZCwgdHJhYmFqYWRvcmVzX2ZlbSwgdHJhYmFqYWRvcmVzX21hcykNCg0KbWF0cml6IDwtIGNvcih2YXJzX2NvciwgdXNlID0gImNvbXBsZXRlLm9icyIpDQoNCmdnY29ycnBsb3QobWF0cml6LCANCiAgICAgICAgICAgdHlwZSA9ICJsb3dlciIsDQogICAgICAgICAgIGxhYiA9IFRSVUUsDQogICAgICAgICAgIGxhYl9zaXplID0gMywNCiAgICAgICAgICAgY29sb3JzID0gYygiI0IyMTgyQiIsICJ3aGl0ZSIsICIjMjE2NkFjIiksDQogICAgICAgICAgIHRpdGxlID0gIkdyYWZpY28gOTogTWF0cml6IGRlIENvcnJlbGFjacOzbiIpDQoNCmBgYA0KDQpMYSBtYXRyaXogZGUgY29ycmVsYWNpw7NuIHBlcm1pdGUgb2JzZXJ2YXIgbGEgcmVsYWNpw7NuIGxpbmVhbCBlbnRyZSBsYXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcyB5IGVsIEdEUCBwZXIgcGVyc29uIGVtcGxveWVkLiBTZSBldmlkZW5jaWEgcXVlIGxhIHZhcmlhYmxlIGVtcGxlbyBlbiBlbCBzZWN0b3Igc2VydmljaW9zIHByZXNlbnRhIGxhIG1heW9yIGNvcnJlbGFjacOzbiBwb3NpdGl2YSBjb24gZWwgR0RQICgwLjY4KSwgbG8gcXVlIHN1Z2llcmUgcXVlIGxvcyBwYcOtc2VzIGNvbiBtYXlvciBwYXJ0aWNpcGFjacOzbiBkZWwgZW1wbGVvIGVuIHNlcnZpY2lvcyB0aWVuZGVuIGEgbW9zdHJhciBtYXlvcmVzIG5pdmVsZXMgZGUgcHJvZHVjdGl2aWRhZCBsYWJvcmFsLiBFbiBjb250cmFzdGUsIGVsIGVtcGxlbyBpbmRlcGVuZGllbnRlIHByZXNlbnRhIHVuYSBjb3JyZWxhY2nDs24gbmVnYXRpdmEgcmVsYXRpdmFtZW50ZSBhbHRhIGNvbiBlbCBHRFAgKC0wLjYyKSwgbG8gcXVlIGluZGljYXLDrWEgcXVlIHVuYSBtYXlvciBwcm9wb3JjacOzbiBkZSB0cmFiYWphZG9yZXMgaW5kZXBlbmRpZW50ZXMgc2UgYXNvY2lhIGNvbiBtZW5vcmVzIG5pdmVsZXMgZGUgcHJvZHVjdGl2aWRhZC4NCg0KUG9yIHN1IHBhcnRlLCBsYXMgZGVtw6FzIHZhcmlhYmxlcyBtdWVzdHJhbiByZWxhY2lvbmVzIGTDqWJpbGVzIGNvbiBlbCBHRFAsIGRhZG8gcXVlIHN1cyBjb2VmaWNpZW50ZXMgZGUgY29ycmVsYWNpw7NuIHNlIGVuY3VlbnRyYW4gY2VyY2Fub3MgYSBjZXJvOiB0cmFiYWphZG9yZXMgZmVtZW5pbm9zICgwLjE2KSwgdHJhYmFqYWRvcmVzIG1hc2N1bGlub3MgKC0wLjI3KSBlIGluZHVzdHJpYSAoLTAuMDcpLiBFc3RvIHN1Z2llcmUgcXVlLCBkZSBtYW5lcmEgaW5kaXZpZHVhbCwgZXN0YXMgdmFyaWFibGVzIG5vIHByZXNlbnRhbiB1bmEgcmVsYWNpw7NuIGxpbmVhbCBmdWVydGUgY29uIGxhIHZhcmlhYmxlIGRlcGVuZGllbnRlLg0KDQpBZGljaW9uYWxtZW50ZSwgbm8gc2Ugb2JzZXJ2YW4gY29ycmVsYWNpb25lcyBleHRyZW1hZGFtZW50ZSBhbHRhcyBlbnRyZSBsYXMgdmFyaWFibGVzIGV4cGxpY2F0aXZhcywgcG9yIGxvIHF1ZSBubyBzZSBldmlkZW5jaWEsIGVuIHByaW5jaXBpbywgdW4gcHJvYmxlbWEgZ3JhdmUgZGUgbXVsdGljb2xpbmVhbGlkYWQuIA0KDQojIyMgTXVsdGljb2xpbmVhbGlkYWQNCmBgYHtyfQ0KdmlmKG1vZGVsbykNCmBgYA0KDQpFbiBlc3RvcyByZXN1bHRhZG9zIHNlIG9ic2VydmEgcXVlIHRvZGFzIGxhcyB2YXJpYWJsZXMgcHJlc2VudGFuIHZhbG9yZXMgZGUgVklGIG1lbm9yZXMgYSAxMCwgbG8gcXVlIHNpZ25pZmljYSBxdWUgbm8gZXhpc3RlbiBwcm9ibGVtYXMgZ3JhdmVzIGRlIG11bHRpY29saW5lYWxpZGFkLiBBdW5xdWUgbGEgdmFyaWFibGUgdHJhYmFqYWRvcmVzIGluZGVwZW5kaWVudGVzIHByZXNlbnRhIGVsIHZhbG9yIG3DoXMgYWx0byAoNS4xNiksIGVzdGUgc2lndWUgZXN0YW5kbyBkZW50cm8gZGUgdW4gcmFuZ28gYWNlcHRhYmxlLCBwb3NpYmxlbWVudGUgZGViaWRvIGEgc3UgcmVsYWNpw7NuIGNvbiBsYSB2YXJpYWJsZSBzZXJ2aWNpb3MuDQoNCkVuIGdlbmVyYWwsIHNlIGNvbmNsdXllIHF1ZSBubyBleGlzdGUgdW4gcHJvYmxlbWEgaW1wb3J0YW50ZSBkZSBtdWx0aWNvbGluZWFsaWRhZCBlbiBlbCBtb2RlbG8uDQoNCiMgX0NvbmNsdXNpb25lc18NCi0gQ29uY2x1c2lvbmVzIHNvYnJlIGxvcyBmYWN0b3JlcyBxdWUgaW5mbHV5ZW4gZW4gbGEgdmFyaWFibGUgZGVwZW5kaWVudGUNCg0KQSBwYXJ0aXIgZGVsIG1vZGVsbyBlc3RpbWFkbywgc2UgY29uY2x1eWUgcXVlIGxhIHByb2R1Y3RpdmlkYWQgbGFib3JhbCwgbWVkaWRhIGEgdHJhdsOpcyBkZWwgR0RQIHBvciBwZXJzb25hIGVtcGxlYWRhLCBlc3TDoSBpbmZsdWVuY2lhZGEgcHJpbmNpcGFsbWVudGUgcG9yIGxhIGVzdHJ1Y3R1cmEgc2VjdG9yaWFsIGRlbCBlbXBsZW8uIEVuIHBhcnRpY3VsYXIsIGxhIHBhcnRpY2lwYWNpw7NuIGRlbCBlbXBsZW8gZW4gZWwgc2VjdG9yIHNlcnZpY2lvcyBwcmVzZW50YSB1bmEgcmVsYWNpw7NuIHBvc2l0aXZhIHkgZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YSwgaW5kaWNhbmRvIHF1ZSBsb3MgcGHDrXNlcyBjb24gbWF5b3IgcGVzbyBlbiBlc3RlIHNlY3RvciB0aWVuZGVuIGEgdGVuZXIgbWF5b3JlcyBuaXZlbGVzIGRlIHByb2R1Y3RpdmlkYWQuDQoNClBvciBvdHJvIGxhZG8sIGVsIHRyYWJham8gaW5kZXBlbmRpZW50ZSBtdWVzdHJhIHVuYSByZWxhY2nDs24gbmVnYXRpdmEgY29uIGVsIEdEUCwgbG8gY3VhbCBzdWdpZXJlIHF1ZSBtYXlvcmVzIG5pdmVsZXMgZGUgYXV0b2VtcGxlbyBlc3TDoW4gYXNvY2lhZG9zIGNvbiBtZW5vcmVzIG5pdmVsZXMgZGUgZWZpY2llbmNpYSBlY29uw7NtaWNhLCBwb3NpYmxlbWVudGUgZGViaWRvIGEgbGEgaW5mb3JtYWxpZGFkLiBFbiBjb250cmFzdGUsIHZhcmlhYmxlcyBjb21vIGxhIHBhcnRpY2lwYWNpw7NuIGRlbCBlbXBsZW8gZW4gZWwgc2VjdG9yIGluZHVzdHJpYWwgeSBsYXMgdGFzYXMgZGUgZW1wbGVvIHBvciBnw6luZXJvIG5vIHJlc3VsdGFyb24gZXN0YWTDrXN0aWNhbWVudGUgc2lnbmlmaWNhdGl2YXMsIHBvciBsbyBxdWUgc3UgZWZlY3RvIHNvYnJlIGxhIHByb2R1Y3RpdmlkYWQgbm8gZXMgY29uY2x1eWVudGUgZGVudHJvIGRlbCBtb2RlbG8uDQoNCi0gRXN0cmF0ZWdpYXMgbyByZWNvbWVuZGFjaW9uZXMgYmFzYWRhcyBlbiBsb3MgaGFsbGF6Z29zDQoNCkNvbiBiYXNlIGVuIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcywgc2UgcmVjb21pZW5kYSBmb21lbnRhciBwb2zDrXRpY2FzIHF1ZSBpbXB1bHNlbiBlbCBkZXNhcnJvbGxvIGRlbCBzZWN0b3Igc2VydmljaW9zLCBkYWRvIHN1IGltcGFjdG8gcG9zaXRpdm8gc29icmUgbGEgcHJvZHVjdGl2aWRhZC4gQXNpbWlzbW8sIGVzIGltcG9ydGFudGUgaW1wbGVtZW50YXIgZXN0cmF0ZWdpYXMgb3JpZW50YWRhcyBhIHJlZHVjaXIgZWwgdHJhYmFqbyBpbmRlcGVuZGllbnRlIGluZm9ybWFsLCBwcm9tb3ZpZW5kbyBsYSBmb3JtYWxpemFjacOzbiBkZWwgZW1wbGVvIHkgZWwgYWNjZXNvIGEgb3BvcnR1bmlkYWRlcyBsYWJvcmFsZXMgbcOhcyBwcm9kdWN0aXZhcy4NCg0KQWRpY2lvbmFsbWVudGUsIHNlIHN1Z2llcmUgZm9ydGFsZWNlciBsYSBjYWxpZGFkIGRlbCBlbXBsZW8gbWVkaWFudGUgaW52ZXJzaW9uZXMgZW4gZWR1Y2FjacOzbiwgY2FwYWNpdGFjacOzbiB5IHRlY25vbG9nw61hLCBjb24gZWwgZmluIGRlIGZhY2lsaXRhciBsYSB0cmFuc2ljacOzbiBoYWNpYSBzZWN0b3JlcyBlY29uw7NtaWNvcyBjb24gbWF5b3IgZ2VuZXJhY2nDs24gZGUgdmFsb3IgYWdyZWdhZG8uDQoNCi0gwr9FbCBtb2RlbG8gbG9ncsOzIHJlc3BvbmRlciBhbCBvYmpldGl2byBkZSBsYSBpbnZlc3RpZ2FjacOzbj8NCg0KQSBsYSBsdXogZGUgbG9zIHJlc3VsdGFkb3Mgb2J0ZW5pZG9zLCBzZSBjb25zaWRlcmEgcXVlIGVsIG1vZGVsbyBhanVzdGFkbyBzw60gbG9ncsOzIHJlc3BvbmRlciBhbCBvYmpldGl2byBkZSBsYSBpbnZlc3RpZ2FjacOzbiwgeWEgcXVlIHBlcm1pdGnDsyBpZGVudGlmaWNhciBsYSByZWxhY2nDs24gZW50cmUgbGEgZXN0cnVjdHVyYSBkZWwgZW1wbGVvIHkgbGEgcHJvZHVjdGl2aWRhZCBsYWJvcmFsLCBhc8OtIGNvbW8gZGV0ZXJtaW5hciBjdcOhbGVzIHZhcmlhYmxlcyB0aWVuZW4gdW4gaW1wYWN0byBzaWduaWZpY2F0aXZvIHNvYnJlIGVsIEdEUC4NCg0KTm8gb2JzdGFudGUsIGVzdG9zIHJlc3VsdGFkb3MgZGViZW4gaW50ZXJwcmV0YXJzZSBjb24gY2F1dGVsYSwgZGFkbyBxdWUgbm8gdG9kYXMgbGFzIHZhcmlhYmxlcyBpbmNsdWlkYXMgcmVzdWx0YXJvbiBzaWduaWZpY2F0aXZhcyB5IHBvZHLDrWFuIGV4aXN0aXIgb3Ryb3MgZmFjdG9yZXMgcmVsZXZhbnRlcyBubyBjb25zaWRlcmFkb3MgZW4gZWwgbW9kZWxvLiBFbiBlc3RlIHNlbnRpZG8sIGF1bnF1ZSBlbCBtb2RlbG8gcHJvcG9yY2lvbmEgZXZpZGVuY2lhIGNvbnNpc3RlbnRlIGNvbiBsYSB0ZW9yw61hIGVjb27Ds21pY2EsIHN1IGNhcGFjaWRhZCBleHBsaWNhdGl2YSBwb2Ryw61hIG1lam9yYXJzZSBtZWRpYW50ZSBsYSBpbmNsdXNpw7NuIGRlIHZhcmlhYmxlcyBhZGljaW9uYWxlcyBlbiBmdXR1cm9zIGFuw6FsaXNpcy4NCg0KIyBfQmlibGlvZ3JhZsOtYV8NCg0KLSAqKkJyaW5leSwgQS4qKiAocy5mLikuICpPZmZpY2lhbCBsaXN0aW5nIG9mIGNvdW50cmllcyBieSB3b3JsZCByZWdpb24uIFRob3VnaHRDby4qDQpodHRwczovL3d3dy50aG91Z2h0Y28uY29tL29mZmljaWFsLWxpc3Rpbmctb2YtY291bnRyaWVzLXdvcmxkLXJlZ2lvbi0xNDM1MTUzDQoNCi0gKipCYW5jbyBkZSBsYSBSZXDDumJsaWNhKiogKHMuZi4pLiAqUHJvZHVjdG8gSW50ZXJubyBCcnV0byAoUElCKS4qDQpodHRwczovL3d3dy5iYW5yZXAuZ292LmNvL2VzL2JhbnJlcC1lZHVjYS9lY29uby1jaW1pZW50b3MvcHJvZHVjdG8taW50ZXJuby1icnV0by1waWI/dXRtX3NvdXJjZQ0KDQotICoqV29ybGQgQmFuayoqIChzLmYuKS4gKldvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnMuKg0KaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL3NvdXJjZS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzDQoNCi0gKipPcmdhbmlzYXRpb24gZm9yIEVjb25vbWljIENvLW9wZXJhdGlvbiBhbmQgRGV2ZWxvcG1lbnQgKE9FQ0QpKiogKHMuZi4pLiAqUHJvZHVjdGl2aXR5IGFuZCBlY29ub21pYyBncm93dGguKg0KaHR0cHM6Ly93d3cub2VjZC5vcmcNCg0KLSAqKkd1amFyYXRpLCBELiBOLiwgJiBQb3J0ZXIsIEQuIEMuKiogKDIwMTApLiAqRWNvbm9tZXRyw61hLiBNY0dyYXctSGlsbC4qDQogaHR0cHM6Ly9iaWJsaW90ZWNhLnVjdWVuY2EuZWR1LmVjL2RpZ2l0YWwvcy9iaWJsaW90ZWNhLWRpZ2l0YWwvYXJrOi8yNTY1NC82NTQNCg0KLSAqKldvb2xkcmlkZ2UsIEouIE0uKiogKDIwMTMpLiAqSW50cm9kdWN0b3J5IEVjb25vbWV0cmljczogQSBNb2Rlcm4gQXBwcm9hY2guIENlbmdhZ2UgTGVhcm5pbmcuKg0KDQoNCi0gKipLdXpuZXRzLCBTLioqICgxOTczKS4gKk1vZGVybiBlY29ub21pYyBncm93dGg6IEZpbmRpbmdzIGFuZCByZWZsZWN0aW9ucy4q