Trabajo elaborado para la asignatura ā€œProgramaciĆ³n y manejo de datos en la era del Big Dataā€ de la Universitat de ValĆØncia durante el curso 2021-2022. El repo del trabajo estĆ” aquĆ­.

La pƔgina web de la asignatura y los trabajos de mis compaƱeros pueden verse aquƭ.


IntroducciĆ³n

El principal anĆ”lisis de este trabajo va a ser el Sistema de pensiones espaƱol y las diversas variables que lo envuelven al mismo. Dentro de estas variables podemos encontrar variables demogrĆ”ficas como pueden ser la esperanza de vida, la tasa de natalidadā€¦ tambiĆ©n vamos a analizar diversas variables econĆ³micas relacionadas tanto con el mercado laboral como en el gasto en pensionesā€¦

Las pensiones en EspaƱa se han convertido en un tema abordable para su estudio y anƔlisis. Podemos decir que el sistema de pensiones se ve afectado por 2 grandes grupos de variables: la demografƭa y el mercado laboral.

Para que lo entendamos, existen dos tipos de sistemas de pensiones:

Sistema de Reparto: los trabajadores del momento pagan unas cotizaciones a la seguridad social que estƔn destinadas al pago de las pensiones de dicho momento (Es decir, los trabajadores les pagan a los pensionistas y, cuando se jubilen, los antiguos trabajadores cobrarƔn gracias a los futuros trabajadores)

Sistema de CapitalizaciĆ³n: cada trabajador hace sus aportaciones y, cuando se jubile, cobrarĆ” dichas aportaciones (actualizadas)

En EspaƱa el sistema que tenemos es el de reparto. Por tanto, este sistema funciona correctamente si la corriente de ingresos (trabajadores) y pagos (pensionistas) estƔ equilibrada. En el momento en el que ese equilibrio se rompe de manera no transitoria, el problema se agrava y hay que abordarlo para que el sistema de pensiones sea sostenible.

ĀæQuĆ© estĆ” pasando con el sistema de pensiones espaƱol? ĀæFunciona correctamente? ĀæEs sostenible? Algunos expertos afirman que el sistema estĆ” quebrado:

Y otros, no piensan igual:

ĀæPor quĆ© hacemos este trabajo?

Vista la problemĆ”tica tanto del tema como de las posibles soluciones y la pasividad de los polĆ­ticos, como la gran mayorĆ­a dependeremos de una pensiĆ³n en el futuro, queremos ver si los conductores del sistema nacional de pensiones nos llevan hacia la deriva o si todo esto es otro discurso populista de los polĆ­ticos para hacer oposiciĆ³n.

Datos

ExtracciĆ³n de datos

Nos ha llevado un tiempo extraer todos los datos necesarios, la mayorĆ­a son obtenidos del INE, aunque tambiĆ©n tenemos datos de Eurostat y del Banco de EspaƱa. Nos hemos descargado los datos en csv, algunos estaban bien, pero otros daban problemas debido a que no los reconocĆ­a como numĆ©ricos, los nombres de las variables eran demasiado largos, por lo que era incĆ³modo a la hora de trabajar y habĆ­a mucha informaciĆ³n que sobraba.

CĆ³digo

Una vez extraidos nuestros datos en formato .csv, nos ha tocado arreglarlos con Rstudio ya que muchas veces R no los detectava con formato numerico, no podiamos representar bien los grƔficos o simplemente queriamos explicar unos datos a partir de otros y nos ha tocado juntarlos en un mismo Dataframe


#- Cargamos el df del paro que anteriormente hemos descargado del INE

df_paro <- rio::import("./datos/tasa_paro.csv")


df_paro <- df_paro %>%
  select(Paro, Periodos)

#Ahora cargamos los datos del df de la tasa de actividad nacional para poder compararlos con la tasa de paro nacional.

df_actividad <- rio::import("./datos/tasa_actividad.csv")

df_actividad <- df_actividad %>%
  select(Periodos, Tasa_Actividad)


#- Vamos a juntar el df de la tasa de actividad y la tasa de paro para poder hacer un grƔfico donde se representen ambas tasas.

df_union <- inner_join(df_actividad, df_paro)

#Vamos a comparar la evoluciĆ³n de la tasa de natalidad y del indice de envejecimiento para tener conocimiento de la evoluciĆ³n que han tenido estas variables demogrĆ”ficas.

df_natalidad <- rio::import("./datos/tasa_natalidad.csv")

df_indice <- rio::import("./datos/indice_envejecimiento.csv")

df_indice <- df_indice %>%
  filter(Periodo != 2021) %>%
  rename(Periodos = "Periodo")

df_indice$Total <- as.numeric(df_indice$Total)

df_union_2 <- inner_join(df_natalidad, df_indice)

df_union_2 <- df_union_2 %>%
  select(Periodos, Tasa_Natalidad, Total)

#Cargamos el df de los ocupados por grupo de edad.

df_edad <- rio::import("./datos/ocup_edad.csv")

df_edad$Total <- as.numeric(df_edad$Total)

df_edad <- df_edad %>%
  mutate(fecha = lubridate::yq(Periodo)) %>%
  filter(fecha == "2021-07-01")


#Vamos a cargar los datos referentes a la edad de emancipacion de los jovenes en EspaƱa

df_eman <- rio::import("./datos/edad_emancipacion.csv")

df_eman <- df_eman %>%
 filter(!(Tramo_Edad %in% "16-34 edad"))

df_var <- df_eman %>%
  pivot_wider(names_from = Periodo, values_from = Porcentaje)

df_var <- janitor::clean_names(df_var)
names(df_var)
#> [1] "tramo_edad" "x2008"      "x2018"

df_var <- df_var %>%
  mutate(variacion = (x2018 - x2008)/x2008)

#- Vamos a arreglar los datos de la pension media y del salario medio que encontramos en los siguientes df.

df_pens_med <- rio::import("./datos/pension_media.csv")

df_w_med <- rio::import("./datos/salario_medio.csv")

df_w_med$w_med_anual <- as.numeric(df_w_med$w_med_anual)

#- Vamos a unir los df de la pension media y del salario medio para observar la variacion entre ambas variables

df_union_3 <- inner_join(df_pens_med, df_w_med)

df_union_3 <- df_union_3 %>%
  select(periodo, pension_media_anual, w_med_anual) %>%
  mutate(porcentaje = (pension_media_anual/w_med_anual)*100)

#Vamos a arreglar los datos referentes a la evoluciĆ³n de la esperanza de vida en EspaƱa

df_vida <- rio::import("./datos/esperanza_vida.csv")

df_vida <- df_vida %>%
  select("geo", "TIME_PERIOD", "OBS_VALUE") %>%
  rename(pais = "geo", periodo = "TIME_PERIOD", esperanza_vida = "OBS_VALUE")

#nos quedamos con los datos que queremos mostrar

df_vida <- df_vida %>%
  filter(pais  %in% c("FR", "ES", "IT", "PT", "AL") )

#Arreglamos los datos del Fondo de Reserva de las pensiones

df_fondo <- rio::import("./datos/fondo_reserva.csv")

df_fondo$millones_euros <- as.numeric(df_fondo$millones_euros)

#Cargamos y arreglamos los df de la piramide poblacional y de la proyeccion

df_piramide <- rio::import("./datos/piramide_pob.csv")

df_piramide$Total <- as.numeric(df_piramide$Total)

df_piramide_20 <- df_piramide %>%
  filter(`AƱo` == 2020) %>%
  arrange(`AƱo`)

df_proyeccion <- rio::import("./datos/proyeccion_2070.csv")

df_proyeccion$total_red <- as.numeric(df_proyeccion$total_red)

#Creamos los df para los aƱos que queremos mostrar.

df_proyeccion_36 <- df_proyeccion %>%
  filter(Periodo == 2036)

df_proyeccion_50 <- df_proyeccion %>%
  filter(Periodo == 2050)

df_proyeccion_70 <- df_proyeccion %>%
  filter(Periodo == 2070)

#A partir de aqui empieza lo bueno

df_alternativas <- rio::import("./datos/otras_alternativas.csv")
df_alternativas <- janitor::clean_names(df_alternativas) 


df_alternativas_4 <- df_alternativas %>%
  rename(Ef_y_De = efectivo_y_dep_a3sitos_2) %>%
  rename(capital = participaciones_en_el_capital_y_en_fi_2) %>%
  rename(year = fecha) %>%
  rename(cotizadas = acciones_cotizadas_2) %>%
  rename(no_cotizadas = acciones_no_cotizadas_2)%>%
  mutate(participaciones = participaciones_en_fi_y_acciones_de_soc_de_inversi_a3n_2 + otras_participaciones_2) %>%
  rename(cash = efectivo_2) %>%
  mutate( depositos = dep_a3sitos_transferibles_2 + otros_dep_a3sitos_2)


df_alternativas_4 <- df_alternativas_4 %>%
  select(year, capital, cotizadas, no_cotizadas, participaciones, cash, Ef_y_De, depositos) %>% 
  rename(efectivo = cash) %>%
  rename(acciones = capital) %>%
  rename(efectivo_y_depositos = Ef_y_De)


df_alternativas <- df_alternativas %>%
  rename(year = fecha) %>%
  rename(total = todos_los_instrumentos) %>%
  rename(oro = oro_monetario_y_deg_2) %>%
  rename(Ef_y_De = efectivo_y_dep_a3sitos_2) %>%
  rename(deuda = valores_representativos_de_deuda_2) %>%
  rename(loan = pr_a_c_stamos_2) %>%
  rename(capital = participaciones_en_el_capital_y_en_fi_2) %>%
  rename(pensiones_priv = sistemas_de_seguros_pensiones_y_garant_a_as_estandarizadas_2) %>%
  rename(otros = otros_activos_pasivos_2)


df_alternativas <- df_alternativas %>%
  select(year, total, oro, Ef_y_De, deuda, loan, capital, pensiones_priv, otros)

df_alternativas_2 <- df_alternativas %>%
  filter(year == 2020) 
df_alternativas_2$comprobacion = rowSums (df_alternativas_2[ , 3:9])
df_alternativas_2 <- df_alternativas_2 %>%
  select(-total) %>% rename(total = comprobacion)
df_alternativas_2 <- df_alternativas_2 %>% pivot_longer(cols = 2:8, names_to = "Activos", values_to = "Miles_de_euros")

df_alternativas_2$porcentaje <- prop.table(df_alternativas_2$Miles_de_euros)
df_alternativas_2$porcentaje <- round(prop.table(df_alternativas_2$Miles_de_euros), 7)*100

df_alternativas[, c(1:9)] <- sapply(df_alternativas[, c(1:9)], as.numeric)

df_alternativas_3 <- df_alternativas%>%
  select(-c(total)) %>%
  pivot_longer(cols = 2:8, names_to = "Activos", values_to = "Miles_de_euros")


#Vamos a arreglar los datos para poder hacer una tabla

df_piramide <- rio::import("./datos/piramide_pob.csv")
df_piramide$Total <- as.numeric(df_piramide$Total)
df_piramide2 <- df_piramide %>% 
  select(-`EspaƱoles/Extranjeros`) %>% 
  rename(Periodo = AƱo) %>% 
  rename(total_red = Total) %>% 
  rename(Edad = `Edad (grupos quinquenales)`)


df_proy <- rio::import("./datos/proyeccion_2070.csv")
df_proy$total_red <- as.numeric(df_proy$total_red)
df_proy2 <- df_proy %>% 
  select (-Total)



df_uni <- full_join(df_piramide2 , df_proy2)
df_uni2 <- df_uni %>% 
  filter(c(Edad == "0-4 aƱos" | Edad == "65-69 aƱos"))

#Vamos a arreglar los datos para poder hacer un mapa comparativo entre paises sobre el ahorro privado

df_ahorro <- rio::import("./datos/ahorro_privado.xls")
df_ahorro <- df_ahorro %>%
  select(-c(`Indicator Name`)) %>%
  pivot_longer(cols = 4:64, names_to = "Year", values_to = "ahorro_PIB")


data(World) 
df_ahorro_1 <- janitor::clean_names(df_ahorro)
df_ahorro_1 <- df_ahorro_1 %>%
  filter(year == 2020) %>%
  select(country_code, ahorro_pib)
world <- World ; rm(World)
world <- world %>% rename(country_code = iso_a3)
df_mapa <- inner_join(world, df_ahorro_1)

Variables DemogrƔficas

Natalidad Vs. Envejecimiento

AnƔlisis

En la parte superior y en color rojo podemos ver la tasa de envejecimiento, mientras que en la parte inferior y en color azul encontramos la tasa de natalidad.

Claramente se aprecia que la evoluciĆ³n de la natalidad ha sido decreciente, mientras que la tasa de envejecimiento ha aumentado.

ĀæY quĆ© significa esto? +Gasto - Ingresos = ā€¦






CĆ³digo


p2 <- ggplot(df_union_2) +
  geom_line(aes(Periodos, Tasa_Natalidad, color = "Tasa_Natalidad")) + 
  geom_point(aes(Periodos, Tasa_Natalidad, color = "Tasa_Natalidad")) +
  geom_line(aes(Periodos, Total, color = "Indice_envejecimiento"))+
  geom_point(aes(Periodos, Total, color = "Indice_envejecimiento"))+
  scale_y_continuous(name = "Indice de envejecimiento", 
                     sec.axis = sec_axis(~./5, name = "Tasa Natalidad", 
                                         labels = function(b) { paste0(round(b * 4, 0), "%")})) +
  labs(title = "ComparaciĆ³n Tasa de Natalidad e ƍndice de Envejecimiento",
    subtitle = "Datos extraidos del INEBase") +
  theme_minimal()
  


ggplotly(p2)




EvoluciĆ³n de la esperanza de vida

AnƔlisis

En este caso se puede apreciar la clara tendencia alcista en la evoluciĆ³n de la esperanza de vida. Hace aƱos, ejemplo en 1980, en EspaƱa la gente morĆ­a de media a los 75 aƱos. Los Ćŗltimos datos, 2019, nos indican que de media la poblaciĆ³n espaƱola fallece a los 84 aƱos.

Por tanto,el avance del sistema de bienestar hace que la gente viva mĆ”s aƱos en edad de jubilaciĆ³n por lo que aumentan los gastos del sistema

Sin embargo esto no es un caso aislado del sistema espaƱol, pues afecta a todas las economƭas desarrolladas.

ĀæY quĆ© significa esto? +Gasto






CĆ³digo


p11 <- ggplot(df_vida) +
 aes(x = periodo, y = esperanza_vida, colour = pais) +
 geom_line(size = 1) +
 theme_minimal() + 
  theme(plot.subtitle = element_text(size = 11)) +labs(title = "EvoluciĆ³n de la esperanza de vida por paises",
    x = "Periodo", y = "AƱos de vida", subtitle = "Datos extraidos de Eurostat")

ggplotly(p11)

Piramide Poblacional

AnƔlisis

En este caso podemos apreciar las imĆ”genes que resumen, aunque de manera aproximada, la inestabilidad del sistema. El problema de disminuciĆ³n de ingresos junto al aumento de gastos se agravarĆ” en el futuro segĆŗn las proyecciones del INE. ĀæY si hacemos un nuevo baby boom? Algunos economistas hablan de que un nuevo baby boom ayudarĆ­a a solucionar el problema, puesto que aumentarĆ­a los ingresos potenciales. Sin embargo, este enfoque es miope, ya que no se estĆ” teniendo en cuenta que en el futuro, cuando la generaciĆ³n del nuevo baby boom sea anciana, serĆ­a necesario otro incremento masivo de la natalidad, entrando asĆ­ en un bucle de necesidad de incremento de la poblaciĆ³n.

Pan para hoy y hambre para maƱana

CĆ³digo


p13 <- ggplot(df_piramide, aes(x = `Edad (grupos quinquenales)`,
                y = `Total`,
                fill = Sexo)) +
  geom_col(data = subset(df_piramide, Sexo == "Hombres") %>% 
             mutate(`Total` = - `Total`),
           width = 0.5, fill = "blue") +
  geom_col(data = subset(df_piramide, Sexo == "Mujeres"),
           width = 0.5, fill = "pink") + 
  coord_flip()+labs(title = "Piramide Poblacional aƱo 2020 ",
    y = "Miles de Personas", subtitle = "Datos extraidos del INEBase")

ggplotly(p13)

Proyecciones Poblacionales

2036

2050

2070

Tabla

EmancipaciĆ³n

AnƔlisis

En relaciĆ³n con la posible soluciĆ³n del baby boom, desde nuestro punto de vista, el principal problema reside en la edad de emancipaciĆ³n. Si les preguntamos a nuestros abuelos o padres a quĆ© edad empezaron a trabajar probablemente escuchemos un intervalo de edad de 13-18 aƱos. Sin embargo, a dĆ­a de hoy esa edad es mucho mĆ”s tardĆ­a. Por lo tanto el principal problema lo podemos ver en que la gente entra mĆ”s tarde al mercado laboral junto a que ahora se vive mĆ”s aƱos.Por ello que los politicos estĆ”n alargando la edad de jubilaciĆ³n.

ĀæY quĆ© significa esto? +Gasto - Ingresos = ā€¦







CĆ³digo


p8 <- ggplot(df_eman) +
 aes(x = Tramo_Edad, fill = Tramo_Edad, weight = Porcentaje) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal() +
 facet_wrap(vars(Periodo)) + theme(plot.subtitle = element_text(size = 11),
    axis.title = element_text(size = 13),
    plot.title = element_text(size = 16)) +labs(title = "Porcentaje de Emancipados por edad",
    x = "Tramo de Edad", y = "Porcentaje de emancipados",
    subtitle = "Datos extraidos del BBVA Research Foundation")

ggplotly(p8)


 p9 <- ggplot(df_var) +
 aes(x = tramo_edad, fill = tramo_edad, weight = variacion) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal() + theme(plot.subtitle = element_text(size = 10)) +labs(title = "VariaciĆ³n porcentual de emancipados 2018 - 2008",
    x = "Tramo de Edad", y = "VariaciĆ³n de emancipados",
    fill = "Tramo de Edad", subtitle = "Datos extraidos del BBVA Research")

ggplotly(p9)




Mercado Laboral

Tasa de Paro Vs. Actividad

AnƔlisis

En este caso podemos apreciar que ambas variables se mueven al unƭsono pero de manera inversa. Asƭ, cuando el paro disminuye, aumenta la tasa de actividad y viceversa. Dƭa tras dƭa podemos escuchar y/o leer en las noticias el preocupante problema del paro espaƱol, por ejemplo aquƭ

Desde el punto de vista del sistema de pensiones espaƱol, que recordemos que es un sistema de reparto (los trabajadores de ahora pagan a los pensionistas de ahora), esto influye en la menor capacidad recaudatoria de dicho sistema y, por tanto, provoca una gran inestabilidad.

ĀæY quĆ© significa esto? - Ingresos






CĆ³digo

p4 <- ggplot(df_union) +
  geom_bar(aes(Periodos, Tasa_Actividad), stat = "identity", fill = "grey") +
  geom_line(aes(Periodos, Paro), size = 1) +
  geom_point(aes(Periodos, Paro), size = 2) +
  labs(title = "ComparaciĆ³n Tasa de Paro y de Actividad",
       subtitle = "Datos para el periodo 2002 - 2020",
       caption = "Datos provenientes del INEBase",
       y = "Tasa de Paro y Actividad") +
  theme_minimal()


ggplotly(p4)




Ocupados por grupo de Edad

AnƔlisis

Este anĆ”lisis va en lĆ­nea al anterior. En este caso cabe destacar que para que el sistema recibiera una bocanada de aire esperanzador, la fuerza motriz del mercado laboral deberĆ­a ser principalmente las edades de 20 a 50 aƱos. AsĆ­ conseguirĆ­amos que las pensiones estuvieran mĆ”s garantizadas que ahora mismo. Sin embargo, se puede apreciar claramente la baja tasa de ocupaciĆ³n a edades de entre 20 y 30 aƱos, cosa que preocupa y mucho. ConcrĆ©tamente, segĆŗn fuentes documentales EspaƱa tiene la tasa de paro juvenil mĆ”s alta de los paĆ­ses miembros de la UniĆ³n Europea

ĀæY quĆ© significa esto? Futuro Negro para EspaƱa






CĆ³digo


p10 <- ggplot(df_edad) +
 aes(x = Edad, fill = Edad, weight = Total) +
 geom_bar() +
 scale_fill_viridis_d(option = "viridis", 
 direction = 1) +
 theme_minimal()+labs(title = "Ocupados por grupo de Edad en 2021",
    x = NULL, y = "Miles de Personas", subtitle = "Datos extraidos del INEBase")

ggplotly(p10)




Pensiones

EvoluciĆ³n del Fondo de Reserva

AnƔlisis

Primero que nada debemos entender que el fondo de reserva es el ā€œlugarā€ donde, en Ć©pocas de superĆ”vit, se depositan las aportaciones que sobran (cosa que hace que el fondo aumente) y, en Ć©pocas deficitarias, se utiliza para tomar dinero para pagar a los pensionistas (disminuye el fondo de reserva).

Claramente se puede apreciar que en la Ć©poca precrisis (antes de 2008) el mercado laboral espaƱol estaba en auge, cosa que permitĆ­a que la cantidad ingresada en la seguridad social fuera superior a la cantidad gastada (cotizaciones > pensiones), provocando un superĆ”vit del fondo de reserva. Sin embargo, estĆ” claro que la crisis tuvo gran incidencia en el mercado laboral espaƱol. La gran tasa de paro junto al aumento del nĀŗ de pensionistas provocĆ³ el gran declive de lo que comĆŗnmente se conoce como la ā€œhucha de las pensionesā€. Muchos economistas califican este grĆ”fico como una imĆ”gen de la estructura deficitaria de dicho sistema. AdemĆ”s, el problema no es tanto que lo hayamos utilizado durante aƱos de malestar econĆ³mico nacional, sinĆ³ que las proyecciones y el anĆ”lisis de variables no parecen prometer una recuperaciĆ³n del superĆ”vit

ĀæY quĆ© significa esto? Nos estamos fundiendo los ahorros de nuestros abuelos




CĆ³digo


p12 <- ggplot(df_fondo) +
 aes(x = periodo, y = millones_euros) +
 geom_line(size = 1, colour = "#066DD1") +
  geom_point()+labs(title = "EvoluciĆ³n del Fondo de Reserva 2000 - 2019",
    x = "Periodo", y = "Millones de Euros",
    subtitle = "Datos extraidos del INEBase") +
  theme_minimal()

ggplotly(p12)




Tasa de cobertura o reemplazo

AnƔlisis

En palabras sencillas, la tasa de cobertura o de reemplazo de las pensiones nos indica el porcentaje del salario que cobramos como pensiĆ³n. La calculamos dividiendo nuestra pensiĆ³n entre nuestro Ćŗltimo salario. AsĆ­ medimos si el sistema es capaz de mantener nuestra capacidad adquisitiva. A modo de ejemplo, si un trabajador cobra 600ā‚¬ de pensiĆ³n y su Ćŗltimo salario era de 1.000ā‚¬, la tasa de cobertura es de (600/1000 *100) 60% . Es decir, al pasar de ser trabajador a pensionista, estamos perdiendo un 40% de poder adquisitivo (respecto al Ćŗltimo dĆ­a que trabajamos).

Podemos apreciar que la tendencia evolutiva ha sido ascendiente, claro ejemplo del fomento del estado de bienestar. SIn embargo, mĆ”s que la evoluciĆ³n pasada, lo que tenemos que preguntarnos es si aumentar o mantener la tasa de cobertura serĆ” viable segĆŗn los nefastos pronĆ³sticos que los economistas diagnostican.




CĆ³digo


p7 <- ggplot(df_union_3, aes(periodo, porcentaje)) + 
  geom_line(size = 0.8) + 
  geom_point() + 
  theme(axis.line = element_line(size = 0.5),
    panel.grid.major = element_line(size = 0),
    axis.text = element_text(size = 12),
    panel.background = element_rect(fill = "gray85"),
    plot.background = element_rect(fill = "white")) +labs(title = "Tasa de cobertura o reemplazo de la pensiĆ³n media",
    x = "Periodo", y = "Porcentaje", subtitle = "Datos extraidos del INEBase ") +
  theme_minimal()

ggplotly(p7)




Alternativas a las pensiones pĆŗblicas

Para analizar la viabilidad del sistema de pensiones es importante analizar si existen alternativas reales a la pensiĆ³n pĆŗblica en estos momentos en EspaƱa. Queremos averiguar si es factible pensar que el ahorro privado es suficiente para compensar unas pensiones futuras, en caso de que este sistema fracase. Para ello hemos investigado cĆ³mo se distribuye el ahorro privado en EspaƱa y cĆ³mo ha ido evolucionando este en los Ćŗltimos aƱos.


ComparaciĆ³n del ahorro privado entre paises

AnƔlisis

Primero, hemos elaborado este mapa para observar en el aƱo 2020, quĆ© porcentaje del PIB ocupa el ahorro privado en casi todos los paĆ­ses del mundo. Vemos que en EspaƱa se sitĆŗa en el 21,3%. Como se aprecia en el mapa, los niveles mĆ”s altos de ahorro se encuentran en los paĆ­ses del norte de Europa y el sur de Asia, nos sorprende especialmente los casos de Marruecos, UzbequistĆ”n y Bangladesh. PaĆ­ses como Suiza, Noruega y Suecia cuentan con sistemas de pensiones mixtos, es decir, un porcentaje de las pensiones es pagado por el paĆ­s y otro por el propio ahorro privado del beneficiario. Es por ello que cuentan con grandes porcentajes de ahorro privado con respecto al PIB, ya que el propio sistema favorece a ello.

ĀæY quĆ© significa esto? Ahorro insuficiente

CĆ³digo


mypalette <- colorNumeric( palette="Greys", domain=df_mapa$ahorro_pib,na.color="transparent")

mytext <- paste(
  "PaĆ­s: ", df_mapa$name,"<br/>", 
  "SituaciĆ³n econĆ³mica:",  df_mapa$economy, "<br/>", 
  "Porcentaje de ahorro: ", df_mapa$ahorro_pib, 
  sep="") %>%
  lapply(htmltools::HTML)
mapa <- leaflet(df_mapa) %>% 
  addTiles()  %>% 
  setView( lat=10, lng=0 , zoom=2) %>%
  addPolygons( 
    fillColor = ~mypalette(ahorro_pib), 
    stroke=TRUE, 
    fillOpacity = 0.9, 
    color="white", 
    weight=0.3,
    label = mytext,
    labelOptions = labelOptions( 
      style = list("font-weight" = "normal", padding = "3px 8px"), 
      textsize = "13px", 
      direction = "auto"
    )
  ) %>%
  addLegend( pal=mypalette, values=~ahorro_pib, opacity=0.9, title = "% de ahorro en el PIB", position = "bottomleft" )
mapa

Tabla comparativa

AnƔlisis

En la siguiente tabla observamos el porcentaje de ahorro en relaciĆ³n al PIB en todos los paĆ­ses que tenemos datos en 2020 y la diferencia con la media total. Observamos como EspaƱa se sitĆŗa 1 punto porcentual por debajo de la media total, que es del 22,37%. Si filtramos de mayor a menor podemos apreciar como Singapur es el paĆ­s del mundo con mayor ahorro, con mĆ”s del 40%, otro paĆ­s que cuenta con un sistema de capitalizaciĆ³n (igual que Suecia y Noruega). De esta manera, es el propio trabajador el que, por ley, ahorra dinero durante toda su vida para gastarlo cuando se jubile, y el paĆ­s ofrece una ayuda para aquellos que no alcancen el mĆ­nimo ahorrado. Eso explica porcentajes tan altos de ahorro.

Entre los paĆ­ses con menor tasa de ahorro encontramos a Grecia, Ucrania o Reino Unido. Mientras los 2 primeros cuentan con sistemas de reparto puramente pĆŗblico, como en EspaƱa, sorprende el caso de Reino Unido, en el cual las pensiones pĆŗblicas no superan el 30% del salario medio del paĆ­s.

ĀæY quĆ© significa esto? + Pensiones puramente pĆŗblicas - ahorro privado

CĆ³digo

df_tabla <- df_ahorro  %>%
  filter(Year == 2020) %>%
  drop_na() %>%
  mutate(diferencia = ahorro_PIB - mean(ahorro_PIB , na.rm = TRUE)) %>%
  select('Country Name', ahorro_PIB, diferencia)
library(DT)  
DT::datatable(df_tabla)

DistribuciĆ³n del ahorro privado

Pero, dentro de EspaƱa, ĀæcĆ³mo se distribuye el ahorro? ĀæLe estamos sacando toda la rentabilidad posible? Vemos como la mayor parte del ahorro se distribuye en capital (acciones y participaciones), efectivo y depĆ³sitos, valores representativos de deuda (bonos, obligaciones, pagarĆ©s, etc.) y prĆ©stamos. El activo mĆ”s rentable histĆ³ricamente son las acciones, por lo que no estĆ” mal en ese sentido, aunque habrĆ­a que analizar en quĆ© acciones se invierte principalmente y cuĆ”n rentables son estas para sacar una conclusiĆ³n. Por otro lado, el efectivo y los depĆ³sitos son los activos menos rentables posibles (nula o negativa si contamos la inflaciĆ³n).

ĀæY quĆ© significa esto? Rentabilidad insuficiente

AnƔlisis

CĆ³digo


g1 <- ggplot(df_alternativas_2, aes(x=1, y=porcentaje, fill= Activos)) +
  geom_bar(stat="identity") +
  geom_text(aes(label = paste0(round(porcentaje,1),"%")), 
            position = position_stack(vjust = 0.5)) +
  coord_polar(theta = "y") + 
  theme_void()+labs(title = "Ahorro privado en 2020", x = NULL,
    subtitle = "Datos extraidos del Banco de EspaƱa")

g1 




EvoluciĆ³n del ahorro privado

AnƔlisis

En este grĆ”fico observamos el crecimiento de las diferentes partidas durante los Ćŗltimos 20 aƱos, es interesante como el capital ha crecido mĆ”s que el resto de partidas, aunque con mayor volatilidad, ya que se puede apreciar la caĆ­da en los aƱos de crisis (2008-2014).

ĀæY quĆ© significa esto? Āæcamino correcto?

CĆ³digo


plot_dinamico <- df_alternativas_3 %>%
  ggplot(aes(x = Activos, 
             y = Miles_de_euros, 
             fill= Activos )) +
  geom_bar(stat= "identity", 
           color = "grey", 
           show.legend = FALSE) +
  geom_text(aes(label = as.numeric(Miles_de_euros)), 
            position = position_stack(), 
            vjust= 1,
            hjust= -0.1,
            size = 4, 
            color = "black")+
  scale_fill_manual(values = c("orange", "darkgrey", "green", "red", "blue", "yellow", "purple")) +
  scale_y_continuous(labels = scales::comma) +
  theme_minimal()+
  enter_appear() +
  transition_states(year, 
                    transition_length = 5, 
                    state_length = 5) +
  labs(title = " Volumen de los activos financieros por aƱo \n Year : {closest_state}", 
       subtitle = "En miles de euros",
       y = "",
       x = "",
       caption = "Banco de EspaƱa") +
  theme(panel.grid.major.x = element_blank(),
        plot.title = element_text(size = 18, 
                                  face = "bold", 
                                  hjust = 0.5),
        plot.subtitle = element_text(size=14, 
                                     face = "plain", 
                                     hjust = 0.5)) + coord_flip()

plot_dinamico

DistribuciĆ³n acciones y depĆ³sitos

AnƔlisis

Pero, dentro de EspaƱa, ĀæcĆ³mo se distribuye el ahorro? ĀæLe estamos sacando toda la rentabilidad posible? Vemos como la mayor parte del ahorro se distribuye en capital (acciones y participaciones), efectivo y depĆ³sitos, valores representativos de deuda (bonos, obligaciones, pagarĆ©s, etc.) y prĆ©stamos. El activo mĆ”s rentable histĆ³ricamente son las acciones, por lo que no estĆ” mal en ese sentido, aunque habrĆ­a que analizar en quĆ© acciones se invierte principalmente y cuĆ”n rentables son estas para sacar una conclusiĆ³n. Por otro lado, el efectivo y los depĆ³sitos son los activos menos rentables posibles (nula o negativa si contamos la inflaciĆ³n).

ĀæY quĆ© significa esto? Rentabilidad insuficiente

CĆ³digo


sketch = htmltools::withTags(table(
  class = 'display',
  thead(
    tr(th(rowspan = 2, 'AƱo'),
      th(colspan = 3, 'Acciones'),
      th(colspan = 2, 'Efectivo y depĆ³sitos')),
    tr(lapply(rep(c('cotizadas', 'no cotizadas', 'participaciones', 'efectivo', 'depĆ³sitos'), 1), th)
    )
  )
))
print(sketch)

df_alternativas_5 <- df_alternativas_4%>%
  select(-c("acciones", "efectivo_y_depositos"))
datatable(df_alternativas_5, container = sketch, rownames = FALSE)  

Conclusiones

Entonces Āæes viable el sistema de pensiones en EspaƱa? ĀæquĆ© ocurrirĆ” dentro de 20 aƱos? Bueno, como hemos podido analizar, existen preocupantes datos en cuanto a lo que el sistema se refiere. Las alarmas suenan cuando analizamos las variables demogrĆ”ficas, donde el baby boom de los aƱos aƱos 60 en relaciĆ³n con la reducciĆ³n constante de la natalidad de los Ćŗltimos 30-40 aƱos hacen prever un nĆŗmero de jubilados futuros que puede llegar a ser insostenible.

El mercado laboral no deja mejores impresiones, con tasas de paro altĆ­simas y empleo demasiado bajo entre las personas de 20 y 30 aƱos. Este dato puede afectar a la tasa de natalidad del futuro, ya que si estos grupos de edad no tienen una estabilidad econĆ³mica es probable que pospongan la decisiĆ³n de tener hijos o, incluso, la desestimen. Pero, ademĆ”s de eso, ĀæquiĆ©n va a pagar las pensiones dentro de 20 aƱos si los que hoy tienen 30 no tienen trabajo?

La financiaciĆ³n de las pensiones tampoco arroja seƱales positivas, ya que durante la crisis el fondo de reserva se redujo considerablemente y, ademĆ”s, la tasa de cobertura no deja de aumentar.

Y las alternativas no nos dejan datos del todo horribles, pero siguen sin estar a niveles de los mejores sistemas de pensiones del mundo, ademĆ”s de un excesivo peso en el ahorro de los depĆ³sitos y el efectivo. Por todo esto, nuestra conclusiĆ³n es que hay suficientes alarmas para, al menos, preocuparse y hacerse ciertas preguntas. ĀæConfiamos en que dentro de 15, 20 aƱos, cuando nuestros padres se jubilen, tendrĆ”n una pensiĆ³n pĆŗblica digna como merecen? Āæla tendremos nosotros dentro de 40 aƱos? ĀæquĆ© soluciones podemos encontrar como individuos particulares? Āæy quĆ© decisiones puede tomar el Estado?



BibliografĆ­a

Para la realizaciĆ³n de nuestro trabajo nos hemos basado en las siguientes pĆ”ginas web y bases de datos:

INE

BBVAResearch

Web del Curso

gganimate

Banco de EspaƱa





InformaciĆ³n de mi R-sesiĆ³n:

- Session info  --------------------------------------------------------------
 hash: child: light skin tone, bottle with popping cork, family: man, boy

 setting  value
 version  R version 4.1.1 (2021-08-10)
 os       Windows 10 x64 (build 19042)
 system   x86_64, mingw32
 ui       RTerm
 language (EN)
 collate  Spanish_Spain.1252
 ctype    Spanish_Spain.1252
 tz       Europe/Paris
 date     2021-12-17
 pandoc   2.11.4 @ C:/Program Files/RStudio/bin/pandoc/ (via rmarkdown)

- Packages -------------------------------------------------------------------
 package           * version    date (UTC) lib source
 abind               1.4-5      2016-07-21 [1] CRAN (R 4.1.0)
 assertthat          0.2.1      2019-03-21 [1] CRAN (R 4.1.1)
 backports           1.3.0      2021-10-27 [1] CRAN (R 4.1.1)
 base64enc           0.1-3      2015-07-28 [1] CRAN (R 4.1.0)
 bit                 4.0.4      2020-08-04 [1] CRAN (R 4.1.1)
 bit64               4.0.5      2020-08-30 [1] CRAN (R 4.1.1)
 broom               0.7.10     2021-10-31 [1] CRAN (R 4.1.1)
 bslib               0.3.1      2021-10-06 [1] CRAN (R 4.1.1)
 cellranger          1.1.0      2016-07-27 [1] CRAN (R 4.1.1)
 class               7.3-19     2021-05-03 [2] CRAN (R 4.1.1)
 classInt            0.4-3      2020-04-07 [1] CRAN (R 4.1.1)
 cli                 3.1.0      2021-10-27 [1] CRAN (R 4.1.1)
 clipr               0.7.1      2020-10-08 [1] CRAN (R 4.1.1)
 codetools           0.2-18     2020-11-04 [2] CRAN (R 4.1.1)
 colorspace          2.0-2      2021-06-24 [1] CRAN (R 4.1.1)
 crayon              1.4.2      2021-10-29 [1] CRAN (R 4.1.1)
 crosstalk           1.2.0      2021-11-04 [1] CRAN (R 4.1.1)
 curl                4.3.2      2021-06-23 [1] CRAN (R 4.1.1)
 data.table          1.14.2     2021-09-27 [1] CRAN (R 4.1.2)
 DBI                 1.1.1      2021-01-15 [1] CRAN (R 4.1.1)
 dbplyr              2.1.1      2021-04-06 [1] CRAN (R 4.1.1)
 desc                1.4.0      2021-09-28 [1] CRAN (R 4.1.1)
 details             0.2.1      2020-01-12 [1] CRAN (R 4.1.1)
 dichromat           2.0-0      2013-01-24 [1] CRAN (R 4.1.0)
 digest              0.6.28     2021-09-23 [1] CRAN (R 4.1.1)
 dplyr             * 1.0.7      2021-06-18 [1] CRAN (R 4.1.1)
 DT                * 0.19       2021-09-02 [1] CRAN (R 4.1.1)
 e1071               1.7-9      2021-09-16 [1] CRAN (R 4.1.1)
 ellipsis            0.3.2      2021-04-29 [1] CRAN (R 4.1.1)
 evaluate            0.14       2019-05-28 [1] CRAN (R 4.1.1)
 fansi               0.5.0      2021-05-25 [1] CRAN (R 4.1.1)
 farver              2.1.0      2021-02-28 [1] CRAN (R 4.1.1)
 fastmap             1.1.0      2021-01-25 [1] CRAN (R 4.1.1)
 forcats           * 0.5.1      2021-01-27 [1] CRAN (R 4.1.1)
 foreign             0.8-81     2020-12-22 [2] CRAN (R 4.1.1)
 fs                  1.5.0      2020-07-31 [1] CRAN (R 4.1.1)
 generics            0.1.1      2021-10-25 [1] CRAN (R 4.1.1)
 gganimate         * 1.0.7      2020-10-15 [1] CRAN (R 4.1.1)
 ggplot2           * 3.3.5      2021-06-25 [1] CRAN (R 4.1.1)
 ggrepel           * 0.9.1      2021-01-15 [1] CRAN (R 4.1.1)
 ggspatial         * 1.1.5      2021-01-04 [1] CRAN (R 4.1.2)
 ggthemes          * 4.2.4      2021-01-20 [1] CRAN (R 4.1.1)
 gifski            * 1.4.3-1    2021-05-02 [1] CRAN (R 4.1.1)
 glue                1.5.0      2021-11-07 [1] CRAN (R 4.1.2)
 gt                * 0.3.1      2021-08-07 [1] CRAN (R 4.1.1)
 gtable              0.3.0      2019-03-25 [1] CRAN (R 4.1.1)
 haven               2.4.3      2021-08-04 [1] CRAN (R 4.1.1)
 here                1.0.1      2020-12-13 [1] CRAN (R 4.1.1)
 highr               0.9        2021-04-16 [1] CRAN (R 4.1.1)
 hms                 1.1.1      2021-09-26 [1] CRAN (R 4.1.1)
 htmltools           0.5.2      2021-08-25 [1] CRAN (R 4.1.1)
 htmlwidgets         1.5.4      2021-09-08 [1] CRAN (R 4.1.1)
 httr                1.4.2      2020-07-20 [1] CRAN (R 4.1.1)
 janitor             2.1.0      2021-01-05 [1] CRAN (R 4.1.1)
 jquerylib           0.1.4      2021-04-26 [1] CRAN (R 4.1.1)
 jsonlite            1.7.2      2020-12-09 [1] CRAN (R 4.1.1)
 kableExtra        * 1.3.4      2021-02-20 [1] CRAN (R 4.1.1)
 KernSmooth          2.23-20    2021-05-03 [2] CRAN (R 4.1.1)
 klippy            * 0.0.0.9500 2021-11-16 [1] Github (rlesur/klippy@378c247)
 knitr             * 1.36       2021-09-29 [1] CRAN (R 4.1.1)
 labeling            0.4.2      2020-10-20 [1] CRAN (R 4.1.0)
 lattice             0.20-44    2021-05-02 [2] CRAN (R 4.1.1)
 lazyeval            0.2.2      2019-03-15 [1] CRAN (R 4.1.1)
 leafem            * 0.1.6      2021-05-24 [1] CRAN (R 4.1.1)
 leaflet           * 2.0.4.1    2021-01-07 [1] CRAN (R 4.1.1)
 leaflet.providers   1.9.0      2019-11-09 [1] CRAN (R 4.1.1)
 leafsync            0.1.0      2019-03-05 [1] CRAN (R 4.1.1)
 lifecycle           1.0.1      2021-09-24 [1] CRAN (R 4.1.1)
 lubridate           1.8.0      2021-10-07 [1] CRAN (R 4.1.1)
 lwgeom              0.2-8      2021-10-06 [1] CRAN (R 4.1.1)
 magrittr            2.0.1      2020-11-17 [1] CRAN (R 4.1.1)
 modelr              0.1.8      2020-05-19 [1] CRAN (R 4.1.1)
 munsell             0.5.0      2018-06-12 [1] CRAN (R 4.1.1)
 openxlsx            4.2.4      2021-06-16 [1] CRAN (R 4.1.1)
 patchwork         * 1.1.1      2020-12-17 [1] CRAN (R 4.1.1)
 pillar              1.6.4      2021-10-18 [1] CRAN (R 4.1.1)
 pjpv2020.01       * 0.0.0.9000 2021-11-06 [1] Github (perezp44/pjpv2020.01@6c6065f)
 pkgconfig           2.0.3      2019-09-22 [1] CRAN (R 4.1.1)
 plotly            * 4.10.0     2021-10-09 [1] CRAN (R 4.1.1)
 plyr                1.8.6      2020-03-03 [1] CRAN (R 4.1.1)
 png                 0.1-7      2013-12-03 [1] CRAN (R 4.1.0)
 prettyunits         1.1.1      2020-01-24 [1] CRAN (R 4.1.1)
 progress            1.2.2      2019-05-16 [1] CRAN (R 4.1.1)
 proxy               0.4-26     2021-06-07 [1] CRAN (R 4.1.1)
 purrr             * 0.3.4      2020-04-17 [1] CRAN (R 4.1.1)
 R6                  2.5.1      2021-08-19 [1] CRAN (R 4.1.1)
 raster              3.5-2      2021-10-11 [1] CRAN (R 4.1.1)
 RColorBrewer        1.1-2      2014-12-07 [1] CRAN (R 4.1.0)
 Rcpp                1.0.7      2021-07-07 [1] CRAN (R 4.1.1)
 readr             * 2.0.2      2021-09-27 [1] CRAN (R 4.1.1)
 readxl              1.3.1      2019-03-13 [1] CRAN (R 4.1.1)
 reprex              2.0.1      2021-08-05 [1] CRAN (R 4.1.1)
 rio                 0.5.27     2021-06-21 [1] CRAN (R 4.1.1)
 rlang               0.4.12     2021-10-18 [1] CRAN (R 4.1.1)
 rmarkdown           2.11       2021-09-14 [1] CRAN (R 4.1.1)
 rnaturalearth     * 0.1.0      2017-03-21 [1] CRAN (R 4.1.1)
 rnaturalearthdata * 0.1.0      2017-02-21 [1] CRAN (R 4.1.1)
 rprojroot           2.0.2      2020-11-15 [1] CRAN (R 4.1.1)
 rstudioapi          0.13       2020-11-12 [1] CRAN (R 4.1.1)
 rvest               1.0.2      2021-10-16 [1] CRAN (R 4.1.1)
 sass                0.4.0      2021-05-12 [1] CRAN (R 4.1.1)
 scales              1.1.1      2020-05-11 [1] CRAN (R 4.1.1)
 sessioninfo         1.2.1      2021-11-02 [1] CRAN (R 4.1.1)
 sf                * 1.0-3      2021-10-07 [1] CRAN (R 4.1.1)
 snakecase           0.11.0     2019-05-25 [1] CRAN (R 4.1.1)
 sp                  1.4-5      2021-01-10 [1] CRAN (R 4.1.1)
 stars               0.5-3      2021-06-08 [1] CRAN (R 4.1.1)
 stringi             1.7.5      2021-10-04 [1] CRAN (R 4.1.1)
 stringr           * 1.4.0      2019-02-10 [1] CRAN (R 4.1.1)
 svglite             2.0.0      2021-02-20 [1] CRAN (R 4.1.1)
 systemfonts         1.0.3      2021-10-13 [1] CRAN (R 4.1.1)
 terra               1.4-11     2021-10-11 [1] CRAN (R 4.1.1)
 tibble            * 3.1.6      2021-11-07 [1] CRAN (R 4.1.2)
 tidyr             * 1.1.4      2021-09-27 [1] CRAN (R 4.1.1)
 tidyselect          1.1.1      2021-04-30 [1] CRAN (R 4.1.1)
 tidyverse         * 1.3.1      2021-04-15 [1] CRAN (R 4.1.1)
 tmap              * 3.3-2      2021-06-16 [1] CRAN (R 4.1.1)
 tmaptools           3.1-1      2021-01-19 [1] CRAN (R 4.1.1)
 tweenr              1.0.2      2021-03-23 [1] CRAN (R 4.1.1)
 tzdb                0.2.0      2021-10-27 [1] CRAN (R 4.1.1)
 units               0.7-2      2021-06-08 [1] CRAN (R 4.1.1)
 usethis             2.1.3      2021-10-27 [1] CRAN (R 4.1.1)
 utf8                1.2.2      2021-07-24 [1] CRAN (R 4.1.1)
 vctrs               0.3.8      2021-04-29 [1] CRAN (R 4.1.1)
 vembedr           * 0.1.5.9000 2021-12-15 [1] Github (ijlyttle/vembedr@f270a72)
 viridisLite         0.4.0      2021-04-13 [1] CRAN (R 4.1.1)
 webshot             0.5.2      2019-11-22 [1] CRAN (R 4.1.1)
 withr               2.4.3      2021-11-30 [1] CRAN (R 4.1.2)
 xfun                0.28       2021-11-04 [1] CRAN (R 4.1.2)
 XML                 3.99-0.8   2021-09-17 [1] CRAN (R 4.1.1)
 xml2                1.3.2      2020-04-23 [1] CRAN (R 4.1.1)
 yaml                2.2.1      2020-02-01 [1] CRAN (R 4.1.0)
 zip                 2.2.0      2021-05-31 [1] CRAN (R 4.1.1)

 [1] C:/Users/Pau/Documents/R/win-library/4.1
 [2] C:/Program Files/R/R-4.1.1/library

------------------------------------------------------------------------------




LS0tDQp0aXRsZTogIlNpc3RlbWEgZGUgUGVuc2lvbmVzIEVzcGHDsW9sIg0KYXV0aG9yOiAiUGF1IFBpZXJhIFBhbGFjaW9zKHBhdXBpZXBhQGFsdW1uaS51di5lcykgIFxuXG4gTWFyaW8gR2FyY8OtYSBaYW1vcmEobWFnYXJ6YTJAYWx1bW5pLnV2LmVzKSAgXG4gXG4gUnViw6luIENhbXBvcyBDYW1wb3MgKHJ1Y2FtY2FtQGFsdW1uaS51di5lcykuIFxuXG4gVW5pdmVyc2l0YXQgZGUgVmFsw6huY2lhIg0KZGF0ZTogIkRpY2llbWJyZSBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICAjY3NzOiAiLi9hc3NldHMvbXlfY3NzX2ZpbGUuY3NzIg0KICAgIHRoZW1lOiBwYXBlcg0KICAgIGhpZ2hsaWdodDogdGV4dG1hdGUgDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAzIA0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICBzZWxmX2NvbnRhaW5lZDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCiAgICBkZl9wcmludDoga2FibGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlDQotLS0NCg0KYGBge3IgcGFja2FnZXMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtsaXBweSkgIA0KbGlicmFyeShrbml0cikNCmxpYnJhcnkodGliYmxlKQ0KbGlicmFyeShnZ3RoZW1lcykNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGdnc3BhdGlhbCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aCkNCmxpYnJhcnkocm5hdHVyYWxlYXJ0aGRhdGEpDQpsaWJyYXJ5KHBqcHYyMDIwLjAxKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdnYW5pbWF0ZSkNCmxpYnJhcnkgKGdpZnNraSkNCmxpYnJhcnkoZ3QpDQpsaWJyYXJ5KGthYmxlRXh0cmEpDQpsaWJyYXJ5KERUKQ0KbGlicmFyeShsZWFmbGV0KSANCmxpYnJhcnkobGVhZmVtKSANCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHRtYXApDQpsaWJyYXJ5KGxlYWZsZXQpDQpsaWJyYXJ5KHZlbWJlZHIpDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJpamx5dHRsZS92ZW1iZWRyIikNCg0KYGBgDQoNCmBgYHtyIGNodW5rLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGV2YWwgPSBUUlVFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgI3Jlc3VsdHMgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBGQUxTRSwgY2FjaGUucGF0aCA9ICIvY2FjaGVzLyIsIGNvbW1lbnQgPSAiIz4iLA0KICAgICAgICAgICAgICAgICAgICAgICNmaWcud2lkdGggPSA3LCAjZmlnLmhlaWdodD0gNywgICANCiAgICAgICAgICAgICAgICAgICAgICAjb3V0LndpZHRoID0gNywgb3V0LmhlaWdodCA9IDcsDQogICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2UgPSBUUlVFLCAgZmlnLnNob3cgPSAiaG9sZCIsDQogICAgICAgICAgICAgICAgICAgICAgZmlnLmFzcCA9IDcvOSwgb3V0LndpZHRoID0gIjc1JSIsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGRldiA9ICJwbmciLCBkZXYuYXJncyA9IGxpc3QodHlwZSA9ICJjYWlyby1wbmciKSkNCmBgYA0KDQoNCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjLSBwYXJhIHF1aXRhciBsYSBub3RhY2nDs24gY2llbnTDrWZpY2ENCm9wdGlvbnMoInlhbWwuZXZhbC5leHByIiA9IFRSVUUpIA0KYGBgDQoNCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpgYGANCg0KPGRpdiBzdHlsZT0idGV4dC1hbGlnbjoganVzdGlmeSI+PGRpdi8+DQoNCjxociBjbGFzcz0ibGluZWEtYmxhY2siPg0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGNhc2kgaWd1YWwsIHNvbG8gSEFTIGRlIFNVU1RJVFVJUiAicGVyZXpwNDQiIHBvciB0dSB1c3VhcmlvIGRlIEdpdGh1Yi0tPg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjEtMjAyMi4gRWwgcmVwbyBkZWwgdHJhYmFqbyBlc3TDoSBbYXF1w61dKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVwaWVyYTIzL3RyYWJham9fQmlnRGF0YV9lcXVpcG8pe3RhcmdldD0iX2JsYW5rIn0uIA0KDQo8IS0tIEVsIHDDoXJyYWZvIGRlIGFiYWpvIGhhcyBkZSBkZWphcmxvIGV4YWN0YW1lbnRlIGlndWFsLCBOTyBoYXMgZGUgY2FtYmlhciBuYWRhLS0+DQoNCkxhIHDDoWdpbmEgd2ViIGRlIGxhIGFzaWduYXR1cmEgeSBsb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNy10cmFiYWpvcy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9Lg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCg0KDQojICA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkludHJvZHVjY2nDs24qKiA8L0ZPTlQ+DQoNCg0KRWwgcHJpbmNpcGFsIGFuw6FsaXNpcyBkZSBlc3RlIHRyYWJham8gdmEgYSBzZXIgZWwgU2lzdGVtYSBkZSBwZW5zaW9uZXMgZXNwYcOxb2wgeSBsYXMgZGl2ZXJzYXMgdmFyaWFibGVzIHF1ZSBsbyBlbnZ1ZWx2ZW4gYWwgbWlzbW8uIERlbnRybyBkZSBlc3RhcyB2YXJpYWJsZXMgcG9kZW1vcyBlbmNvbnRyYXIgdmFyaWFibGVzIGRlbW9ncsOhZmljYXMgY29tbyBwdWVkZW4gc2VyIGxhIGVzcGVyYW56YSBkZSB2aWRhLCBsYSB0YXNhIGRlIG5hdGFsaWRhZC4uLiB0YW1iacOpbiB2YW1vcyBhIGFuYWxpemFyIGRpdmVyc2FzIHZhcmlhYmxlcyBlY29uw7NtaWNhcyByZWxhY2lvbmFkYXMgdGFudG8gY29uIGVsIG1lcmNhZG8gbGFib3JhbCBjb21vIGVuIGVsIGdhc3RvIGVuIHBlbnNpb25lcy4uLg0KDQoNCkxhcyBwZW5zaW9uZXMgZW4gRXNwYcOxYSBzZSBoYW4gY29udmVydGlkbyBlbiB1biB0ZW1hIGFib3JkYWJsZSBwYXJhIHN1IGVzdHVkaW8geSBhbsOhbGlzaXMuIFBvZGVtb3MgZGVjaXIgcXVlIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIHNlIHZlIGFmZWN0YWRvIHBvciAyIGdyYW5kZXMgZ3J1cG9zIGRlIHZhcmlhYmxlczogbGEgZGVtb2dyYWbDrWEgeSBlbCBtZXJjYWRvIGxhYm9yYWwuIA0KDQpQYXJhIHF1ZSBsbyBlbnRlbmRhbW9zLCBleGlzdGVuIGRvcyB0aXBvcyBkZSBzaXN0ZW1hcyBkZSBwZW5zaW9uZXM6DQoNClNpc3RlbWEgZGUgUmVwYXJ0bzogbG9zIHRyYWJhamFkb3JlcyBkZWwgbW9tZW50byBwYWdhbiB1bmFzIGNvdGl6YWNpb25lcyBhIGxhIHNlZ3VyaWRhZCBzb2NpYWwgcXVlIGVzdMOhbiBkZXN0aW5hZGFzIGFsIHBhZ28gZGUgbGFzIHBlbnNpb25lcyBkZSBkaWNobyBtb21lbnRvIChFcyBkZWNpciwgbG9zIHRyYWJhamFkb3JlcyBsZXMgcGFnYW4gYSBsb3MgcGVuc2lvbmlzdGFzIHksIGN1YW5kbyBzZSBqdWJpbGVuLCBsb3MgYW50aWd1b3MgdHJhYmFqYWRvcmVzIGNvYnJhcsOhbiBncmFjaWFzIGEgbG9zIGZ1dHVyb3MgdHJhYmFqYWRvcmVzKQ0KDQpTaXN0ZW1hIGRlIENhcGl0YWxpemFjacOzbjogY2FkYSB0cmFiYWphZG9yIGhhY2Ugc3VzIGFwb3J0YWNpb25lcyB5LCBjdWFuZG8gc2UganViaWxlLCBjb2JyYXLDoSBkaWNoYXMgYXBvcnRhY2lvbmVzIChhY3R1YWxpemFkYXMpDQoNCkVuIEVzcGHDsWEgZWwgc2lzdGVtYSBxdWUgdGVuZW1vcyBlcyBlbCBkZSByZXBhcnRvLiBQb3IgdGFudG8sIGVzdGUgc2lzdGVtYSBmdW5jaW9uYSBjb3JyZWN0YW1lbnRlIHNpIGxhIGNvcnJpZW50ZSBkZSBpbmdyZXNvcyAodHJhYmFqYWRvcmVzKSB5IHBhZ29zIChwZW5zaW9uaXN0YXMpIGVzdMOhIGVxdWlsaWJyYWRhLiBFbiBlbCBtb21lbnRvIGVuIGVsIHF1ZSBlc2UgZXF1aWxpYnJpbyBzZSByb21wZSBkZSBtYW5lcmEgbm8gdHJhbnNpdG9yaWEsIGVsIHByb2JsZW1hIHNlIGFncmF2YSB5IGhheSBxdWUgYWJvcmRhcmxvIHBhcmEgcXVlIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIHNlYSBzb3N0ZW5pYmxlLiANCg0Kwr9RdcOpIGVzdMOhIHBhc2FuZG8gY29uIGVsIHNpc3RlbWEgZGUgcGVuc2lvbmVzIGVzcGHDsW9sPyDCv0Z1bmNpb25hIGNvcnJlY3RhbWVudGU/IMK/RXMgc29zdGVuaWJsZT8NCkFsZ3Vub3MgZXhwZXJ0b3MgYWZpcm1hbiBxdWUgZWwgc2lzdGVtYSBlc3TDoSBxdWVicmFkbzoNCg0KPENFTlRFUj4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KDQplbWJlZF91cmwoImh0dHBzOi8veW91dHUuYmUvNm1zNW9TdjNINW8iKQ0KYGBgDQo8L0NFTlRFUj4NCg0KWSBvdHJvcywgbm8gcGllbnNhbiBpZ3VhbDoNCg0KPENFTlRFUj4NCmBgYHtyLCBlY2hvID0gRkFMU0UsIGV2YWwgPSBUUlVFfQ0KDQplbWJlZF91cmwoImh0dHBzOi8veW91dHUuYmUvMFJCM3UzaWtFNTQiKQ0KYGBgDQo8L0NFTlRFUj4NCg0KDQojIyAgIDxGT05UIENPTE9SPSJibGFjayI+ICoqwr9Qb3IgcXXDqSBoYWNlbW9zIGVzdGUgdHJhYmFqbz8qKjwvRk9OVD4gDQoNClZpc3RhIGxhIHByb2JsZW3DoXRpY2EgdGFudG8gZGVsIHRlbWEgY29tbyBkZSBsYXMgcG9zaWJsZXMgc29sdWNpb25lcyB5IGxhIHBhc2l2aWRhZCBkZSBsb3MgcG9sw610aWNvcywgY29tbyBsYSBncmFuIG1heW9yw61hIGRlcGVuZGVyZW1vcyBkZSB1bmEgcGVuc2nDs24gZW4gZWwgZnV0dXJvLCBxdWVyZW1vcyB2ZXIgc2kgbG9zIGNvbmR1Y3RvcmVzIGRlbCBzaXN0ZW1hIG5hY2lvbmFsIGRlIHBlbnNpb25lcyBub3MgbGxldmFuIGhhY2lhIGxhIGRlcml2YSBvIHNpIHRvZG8gZXN0byBlcyBvdHJvIGRpc2N1cnNvIHBvcHVsaXN0YSBkZSBsb3MgcG9sw610aWNvcyBwYXJhIGhhY2VyIG9wb3NpY2nDs24uDQoNCg0KIyAgIDxGT05UIENPTE9SPSJibGFjayI+ICoqRGF0b3MqKjwvRk9OVD4gey50YWJzZXR9DQoNCiMjIDxGT05UIENPTE9SPSJibGFjayI+ICoqRXh0cmFjY2nDs24gZGUgZGF0b3MqKiA8L0ZPTlQ+DQoNCk5vcyBoYSBsbGV2YWRvIHVuIHRpZW1wbyBleHRyYWVyIHRvZG9zIGxvcyBkYXRvcyBuZWNlc2FyaW9zLCBsYSBtYXlvcsOtYSBzb24gb2J0ZW5pZG9zIGRlbCBJTkUsIGF1bnF1ZSB0YW1iacOpbiB0ZW5lbW9zIGRhdG9zIGRlIEV1cm9zdGF0IHkgZGVsIEJhbmNvIGRlIEVzcGHDsWEuIE5vcyBoZW1vcyBkZXNjYXJnYWRvIGxvcyBkYXRvcyBlbiBjc3YsIGFsZ3Vub3MgZXN0YWJhbiBiaWVuLCBwZXJvIG90cm9zIGRhYmFuIHByb2JsZW1hcyBkZWJpZG8gYSBxdWUgbm8gbG9zIHJlY29ub2PDrWEgY29tbyBudW3DqXJpY29zLCBsb3Mgbm9tYnJlcyBkZSBsYXMgdmFyaWFibGVzIGVyYW4gZGVtYXNpYWRvIGxhcmdvcywgcG9yIGxvIHF1ZSBlcmEgaW5jw7Ntb2RvIGEgbGEgaG9yYSBkZSB0cmFiYWphciB5IGhhYsOtYSBtdWNoYSBpbmZvcm1hY2nDs24gcXVlIHNvYnJhYmEuIA0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiaW5lYmFzZS5qcGciKSkNCg0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAiYmFuY29fZXNwLmpwZyIpKQ0KDQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJldXJvc3RhdC5wbmciKSkNCg0KYGBgDQoNCg0KIyMgPEZPTlQgQ09MT1I9ImJsYWNrIj4qKkPDs2RpZ28qKjwvRk9OVD4NCg0KVW5hIHZleiBleHRyYWlkb3MgbnVlc3Ryb3MgZGF0b3MgZW4gZm9ybWF0byAuY3N2LCBub3MgaGEgdG9jYWRvIGFycmVnbGFybG9zIGNvbiBSc3R1ZGlvIHlhIHF1ZSBtdWNoYXMgdmVjZXMgUiBubyBsb3MgZGV0ZWN0YXZhIGNvbiBmb3JtYXRvIG51bWVyaWNvLCBubyBwb2RpYW1vcyByZXByZXNlbnRhciBiaWVuIGxvcyBncsOhZmljb3MgbyBzaW1wbGVtZW50ZSBxdWVyaWFtb3MgZXhwbGljYXIgdW5vcyBkYXRvcyBhIHBhcnRpciBkZSBvdHJvcyB5IG5vcyBoYSB0b2NhZG8ganVudGFybG9zIGVuIHVuIG1pc21vIERhdGFmcmFtZQ0KDQpgYGB7ciwgZXZhbCA9IFRSVUV9DQoNCiMtIENhcmdhbW9zIGVsIGRmIGRlbCBwYXJvIHF1ZSBhbnRlcmlvcm1lbnRlIGhlbW9zIGRlc2NhcmdhZG8gZGVsIElORQ0KDQpkZl9wYXJvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3Rhc2FfcGFyby5jc3YiKQ0KDQoNCmRmX3Bhcm8gPC0gZGZfcGFybyAlPiUNCiAgc2VsZWN0KFBhcm8sIFBlcmlvZG9zKQ0KDQojQWhvcmEgY2FyZ2Ftb3MgbG9zIGRhdG9zIGRlbCBkZiBkZSBsYSB0YXNhIGRlIGFjdGl2aWRhZCBuYWNpb25hbCBwYXJhIHBvZGVyIGNvbXBhcmFybG9zIGNvbiBsYSB0YXNhIGRlIHBhcm8gbmFjaW9uYWwuDQoNCmRmX2FjdGl2aWRhZCA8LSByaW86OmltcG9ydCgiLi9kYXRvcy90YXNhX2FjdGl2aWRhZC5jc3YiKQ0KDQpkZl9hY3RpdmlkYWQgPC0gZGZfYWN0aXZpZGFkICU+JQ0KICBzZWxlY3QoUGVyaW9kb3MsIFRhc2FfQWN0aXZpZGFkKQ0KDQoNCiMtIFZhbW9zIGEganVudGFyIGVsIGRmIGRlIGxhIHRhc2EgZGUgYWN0aXZpZGFkIHkgbGEgdGFzYSBkZSBwYXJvIHBhcmEgcG9kZXIgaGFjZXIgdW4gZ3LDoWZpY28gZG9uZGUgc2UgcmVwcmVzZW50ZW4gYW1iYXMgdGFzYXMuDQoNCmRmX3VuaW9uIDwtIGlubmVyX2pvaW4oZGZfYWN0aXZpZGFkLCBkZl9wYXJvKQ0KDQojVmFtb3MgYSBjb21wYXJhciBsYSBldm9sdWNpw7NuIGRlIGxhIHRhc2EgZGUgbmF0YWxpZGFkIHkgZGVsIGluZGljZSBkZSBlbnZlamVjaW1pZW50byBwYXJhIHRlbmVyIGNvbm9jaW1pZW50byBkZSBsYSBldm9sdWNpw7NuIHF1ZSBoYW4gdGVuaWRvIGVzdGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzLg0KDQpkZl9uYXRhbGlkYWQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvdGFzYV9uYXRhbGlkYWQuY3N2IikNCg0KZGZfaW5kaWNlIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2luZGljZV9lbnZlamVjaW1pZW50by5jc3YiKQ0KDQpkZl9pbmRpY2UgPC0gZGZfaW5kaWNlICU+JQ0KICBmaWx0ZXIoUGVyaW9kbyAhPSAyMDIxKSAlPiUNCiAgcmVuYW1lKFBlcmlvZG9zID0gIlBlcmlvZG8iKQ0KDQpkZl9pbmRpY2UkVG90YWwgPC0gYXMubnVtZXJpYyhkZl9pbmRpY2UkVG90YWwpDQoNCmRmX3VuaW9uXzIgPC0gaW5uZXJfam9pbihkZl9uYXRhbGlkYWQsIGRmX2luZGljZSkNCg0KZGZfdW5pb25fMiA8LSBkZl91bmlvbl8yICU+JQ0KICBzZWxlY3QoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBUb3RhbCkNCg0KI0NhcmdhbW9zIGVsIGRmIGRlIGxvcyBvY3VwYWRvcyBwb3IgZ3J1cG8gZGUgZWRhZC4NCg0KZGZfZWRhZCA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9vY3VwX2VkYWQuY3N2IikNCg0KZGZfZWRhZCRUb3RhbCA8LSBhcy5udW1lcmljKGRmX2VkYWQkVG90YWwpDQoNCmRmX2VkYWQgPC0gZGZfZWRhZCAlPiUNCiAgbXV0YXRlKGZlY2hhID0gbHVicmlkYXRlOjp5cShQZXJpb2RvKSkgJT4lDQogIGZpbHRlcihmZWNoYSA9PSAiMjAyMS0wNy0wMSIpDQoNCg0KI1ZhbW9zIGEgY2FyZ2FyIGxvcyBkYXRvcyByZWZlcmVudGVzIGEgbGEgZWRhZCBkZSBlbWFuY2lwYWNpb24gZGUgbG9zIGpvdmVuZXMgZW4gRXNwYcOxYQ0KDQpkZl9lbWFuIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2VkYWRfZW1hbmNpcGFjaW9uLmNzdiIpDQoNCmRmX2VtYW4gPC0gZGZfZW1hbiAlPiUNCiBmaWx0ZXIoIShUcmFtb19FZGFkICVpbiUgIjE2LTM0IGVkYWQiKSkNCg0KZGZfdmFyIDwtIGRmX2VtYW4gJT4lDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBQZXJpb2RvLCB2YWx1ZXNfZnJvbSA9IFBvcmNlbnRhamUpDQoNCmRmX3ZhciA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl92YXIpDQpuYW1lcyhkZl92YXIpDQoNCmRmX3ZhciA8LSBkZl92YXIgJT4lDQogIG11dGF0ZSh2YXJpYWNpb24gPSAoeDIwMTggLSB4MjAwOCkveDIwMDgpDQoNCiMtIFZhbW9zIGEgYXJyZWdsYXIgbG9zIGRhdG9zIGRlIGxhIHBlbnNpb24gbWVkaWEgeSBkZWwgc2FsYXJpbyBtZWRpbyBxdWUgZW5jb250cmFtb3MgZW4gbG9zIHNpZ3VpZW50ZXMgZGYuDQoNCmRmX3BlbnNfbWVkIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3BlbnNpb25fbWVkaWEuY3N2IikNCg0KZGZfd19tZWQgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3Mvc2FsYXJpb19tZWRpby5jc3YiKQ0KDQpkZl93X21lZCR3X21lZF9hbnVhbCA8LSBhcy5udW1lcmljKGRmX3dfbWVkJHdfbWVkX2FudWFsKQ0KDQojLSBWYW1vcyBhIHVuaXIgbG9zIGRmIGRlIGxhIHBlbnNpb24gbWVkaWEgeSBkZWwgc2FsYXJpbyBtZWRpbyBwYXJhIG9ic2VydmFyIGxhIHZhcmlhY2lvbiBlbnRyZSBhbWJhcyB2YXJpYWJsZXMNCg0KZGZfdW5pb25fMyA8LSBpbm5lcl9qb2luKGRmX3BlbnNfbWVkLCBkZl93X21lZCkNCg0KZGZfdW5pb25fMyA8LSBkZl91bmlvbl8zICU+JQ0KICBzZWxlY3QocGVyaW9kbywgcGVuc2lvbl9tZWRpYV9hbnVhbCwgd19tZWRfYW51YWwpICU+JQ0KICBtdXRhdGUocG9yY2VudGFqZSA9IChwZW5zaW9uX21lZGlhX2FudWFsL3dfbWVkX2FudWFsKSoxMDApDQoNCiNWYW1vcyBhIGFycmVnbGFyIGxvcyBkYXRvcyByZWZlcmVudGVzIGEgbGEgZXZvbHVjacOzbiBkZSBsYSBlc3BlcmFuemEgZGUgdmlkYSBlbiBFc3Bhw7FhDQoNCmRmX3ZpZGEgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvZXNwZXJhbnphX3ZpZGEuY3N2IikNCg0KZGZfdmlkYSA8LSBkZl92aWRhICU+JQ0KICBzZWxlY3QoImdlbyIsICJUSU1FX1BFUklPRCIsICJPQlNfVkFMVUUiKSAlPiUNCiAgcmVuYW1lKHBhaXMgPSAiZ2VvIiwgcGVyaW9kbyA9ICJUSU1FX1BFUklPRCIsIGVzcGVyYW56YV92aWRhID0gIk9CU19WQUxVRSIpDQoNCiNub3MgcXVlZGFtb3MgY29uIGxvcyBkYXRvcyBxdWUgcXVlcmVtb3MgbW9zdHJhcg0KDQpkZl92aWRhIDwtIGRmX3ZpZGEgJT4lDQogIGZpbHRlcihwYWlzICAlaW4lIGMoIkZSIiwgIkVTIiwgIklUIiwgIlBUIiwgIkFMIikgKQ0KDQojQXJyZWdsYW1vcyBsb3MgZGF0b3MgZGVsIEZvbmRvIGRlIFJlc2VydmEgZGUgbGFzIHBlbnNpb25lcw0KDQpkZl9mb25kbyA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9mb25kb19yZXNlcnZhLmNzdiIpDQoNCmRmX2ZvbmRvJG1pbGxvbmVzX2V1cm9zIDwtIGFzLm51bWVyaWMoZGZfZm9uZG8kbWlsbG9uZXNfZXVyb3MpDQoNCiNDYXJnYW1vcyB5IGFycmVnbGFtb3MgbG9zIGRmIGRlIGxhIHBpcmFtaWRlIHBvYmxhY2lvbmFsIHkgZGUgbGEgcHJveWVjY2lvbg0KDQpkZl9waXJhbWlkZSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9waXJhbWlkZV9wb2IuY3N2IikNCg0KZGZfcGlyYW1pZGUkVG90YWwgPC0gYXMubnVtZXJpYyhkZl9waXJhbWlkZSRUb3RhbCkNCg0KZGZfcGlyYW1pZGVfMjAgPC0gZGZfcGlyYW1pZGUgJT4lDQogIGZpbHRlcihgQcOxb2AgPT0gMjAyMCkgJT4lDQogIGFycmFuZ2UoYEHDsW9gKQ0KDQpkZl9wcm95ZWNjaW9uIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL3Byb3llY2Npb25fMjA3MC5jc3YiKQ0KDQpkZl9wcm95ZWNjaW9uJHRvdGFsX3JlZCA8LSBhcy5udW1lcmljKGRmX3Byb3llY2Npb24kdG90YWxfcmVkKQ0KDQojQ3JlYW1vcyBsb3MgZGYgcGFyYSBsb3MgYcOxb3MgcXVlIHF1ZXJlbW9zIG1vc3RyYXIuDQoNCmRmX3Byb3llY2Npb25fMzYgPC0gZGZfcHJveWVjY2lvbiAlPiUNCiAgZmlsdGVyKFBlcmlvZG8gPT0gMjAzNikNCg0KZGZfcHJveWVjY2lvbl81MCA8LSBkZl9wcm95ZWNjaW9uICU+JQ0KICBmaWx0ZXIoUGVyaW9kbyA9PSAyMDUwKQ0KDQpkZl9wcm95ZWNjaW9uXzcwIDwtIGRmX3Byb3llY2Npb24gJT4lDQogIGZpbHRlcihQZXJpb2RvID09IDIwNzApDQoNCiNBIHBhcnRpciBkZSBhcXVpIGVtcGllemEgbG8gYnVlbm8NCg0KZGZfYWx0ZXJuYXRpdmFzIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL290cmFzX2FsdGVybmF0aXZhcy5jc3YiKQ0KZGZfYWx0ZXJuYXRpdmFzIDwtIGphbml0b3I6OmNsZWFuX25hbWVzKGRmX2FsdGVybmF0aXZhcykgDQoNCg0KZGZfYWx0ZXJuYXRpdmFzXzQgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICByZW5hbWUoRWZfeV9EZSA9IGVmZWN0aXZvX3lfZGVwX2Ezc2l0b3NfMikgJT4lDQogIHJlbmFtZShjYXBpdGFsID0gcGFydGljaXBhY2lvbmVzX2VuX2VsX2NhcGl0YWxfeV9lbl9maV8yKSAlPiUNCiAgcmVuYW1lKHllYXIgPSBmZWNoYSkgJT4lDQogIHJlbmFtZShjb3RpemFkYXMgPSBhY2Npb25lc19jb3RpemFkYXNfMikgJT4lDQogIHJlbmFtZShub19jb3RpemFkYXMgPSBhY2Npb25lc19ub19jb3RpemFkYXNfMiklPiUNCiAgbXV0YXRlKHBhcnRpY2lwYWNpb25lcyA9IHBhcnRpY2lwYWNpb25lc19lbl9maV95X2FjY2lvbmVzX2RlX3NvY19kZV9pbnZlcnNpX2Ezbl8yICsgb3RyYXNfcGFydGljaXBhY2lvbmVzXzIpICU+JQ0KICByZW5hbWUoY2FzaCA9IGVmZWN0aXZvXzIpICU+JQ0KICBtdXRhdGUoIGRlcG9zaXRvcyA9IGRlcF9hM3NpdG9zX3RyYW5zZmVyaWJsZXNfMiArIG90cm9zX2RlcF9hM3NpdG9zXzIpDQoNCg0KZGZfYWx0ZXJuYXRpdmFzXzQgPC0gZGZfYWx0ZXJuYXRpdmFzXzQgJT4lDQogIHNlbGVjdCh5ZWFyLCBjYXBpdGFsLCBjb3RpemFkYXMsIG5vX2NvdGl6YWRhcywgcGFydGljaXBhY2lvbmVzLCBjYXNoLCBFZl95X0RlLCBkZXBvc2l0b3MpICU+JSANCiAgcmVuYW1lKGVmZWN0aXZvID0gY2FzaCkgJT4lDQogIHJlbmFtZShhY2Npb25lcyA9IGNhcGl0YWwpICU+JQ0KICByZW5hbWUoZWZlY3Rpdm9feV9kZXBvc2l0b3MgPSBFZl95X0RlKQ0KDQoNCmRmX2FsdGVybmF0aXZhcyA8LSBkZl9hbHRlcm5hdGl2YXMgJT4lDQogIHJlbmFtZSh5ZWFyID0gZmVjaGEpICU+JQ0KICByZW5hbWUodG90YWwgPSB0b2Rvc19sb3NfaW5zdHJ1bWVudG9zKSAlPiUNCiAgcmVuYW1lKG9ybyA9IG9yb19tb25ldGFyaW9feV9kZWdfMikgJT4lDQogIHJlbmFtZShFZl95X0RlID0gZWZlY3Rpdm9feV9kZXBfYTNzaXRvc18yKSAlPiUNCiAgcmVuYW1lKGRldWRhID0gdmFsb3Jlc19yZXByZXNlbnRhdGl2b3NfZGVfZGV1ZGFfMikgJT4lDQogIHJlbmFtZShsb2FuID0gcHJfYV9jX3N0YW1vc18yKSAlPiUNCiAgcmVuYW1lKGNhcGl0YWwgPSBwYXJ0aWNpcGFjaW9uZXNfZW5fZWxfY2FwaXRhbF95X2VuX2ZpXzIpICU+JQ0KICByZW5hbWUocGVuc2lvbmVzX3ByaXYgPSBzaXN0ZW1hc19kZV9zZWd1cm9zX3BlbnNpb25lc195X2dhcmFudF9hX2FzX2VzdGFuZGFyaXphZGFzXzIpICU+JQ0KICByZW5hbWUob3Ryb3MgPSBvdHJvc19hY3Rpdm9zX3Bhc2l2b3NfMikNCg0KDQpkZl9hbHRlcm5hdGl2YXMgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICBzZWxlY3QoeWVhciwgdG90YWwsIG9ybywgRWZfeV9EZSwgZGV1ZGEsIGxvYW4sIGNhcGl0YWwsIHBlbnNpb25lc19wcml2LCBvdHJvcykNCg0KZGZfYWx0ZXJuYXRpdmFzXzIgPC0gZGZfYWx0ZXJuYXRpdmFzICU+JQ0KICBmaWx0ZXIoeWVhciA9PSAyMDIwKSANCmRmX2FsdGVybmF0aXZhc18yJGNvbXByb2JhY2lvbiA9IHJvd1N1bXMgKGRmX2FsdGVybmF0aXZhc18yWyAsIDM6OV0pDQpkZl9hbHRlcm5hdGl2YXNfMiA8LSBkZl9hbHRlcm5hdGl2YXNfMiAlPiUNCiAgc2VsZWN0KC10b3RhbCkgJT4lIHJlbmFtZSh0b3RhbCA9IGNvbXByb2JhY2lvbikNCmRmX2FsdGVybmF0aXZhc18yIDwtIGRmX2FsdGVybmF0aXZhc18yICU+JSBwaXZvdF9sb25nZXIoY29scyA9IDI6OCwgbmFtZXNfdG8gPSAiQWN0aXZvcyIsIHZhbHVlc190byA9ICJNaWxlc19kZV9ldXJvcyIpDQoNCmRmX2FsdGVybmF0aXZhc18yJHBvcmNlbnRhamUgPC0gcHJvcC50YWJsZShkZl9hbHRlcm5hdGl2YXNfMiRNaWxlc19kZV9ldXJvcykNCmRmX2FsdGVybmF0aXZhc18yJHBvcmNlbnRhamUgPC0gcm91bmQocHJvcC50YWJsZShkZl9hbHRlcm5hdGl2YXNfMiRNaWxlc19kZV9ldXJvcyksIDcpKjEwMA0KDQpkZl9hbHRlcm5hdGl2YXNbLCBjKDE6OSldIDwtIHNhcHBseShkZl9hbHRlcm5hdGl2YXNbLCBjKDE6OSldLCBhcy5udW1lcmljKQ0KDQpkZl9hbHRlcm5hdGl2YXNfMyA8LSBkZl9hbHRlcm5hdGl2YXMlPiUNCiAgc2VsZWN0KC1jKHRvdGFsKSkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gMjo4LCBuYW1lc190byA9ICJBY3Rpdm9zIiwgdmFsdWVzX3RvID0gIk1pbGVzX2RlX2V1cm9zIikNCg0KDQojVmFtb3MgYSBhcnJlZ2xhciBsb3MgZGF0b3MgcGFyYSBwb2RlciBoYWNlciB1bmEgdGFibGENCg0KZGZfcGlyYW1pZGUgPC0gcmlvOjppbXBvcnQoIi4vZGF0b3MvcGlyYW1pZGVfcG9iLmNzdiIpDQpkZl9waXJhbWlkZSRUb3RhbCA8LSBhcy5udW1lcmljKGRmX3BpcmFtaWRlJFRvdGFsKQ0KZGZfcGlyYW1pZGUyIDwtIGRmX3BpcmFtaWRlICU+JSANCiAgc2VsZWN0KC1gRXNwYcOxb2xlcy9FeHRyYW5qZXJvc2ApICU+JSANCiAgcmVuYW1lKFBlcmlvZG8gPSBBw7FvKSAlPiUgDQogIHJlbmFtZSh0b3RhbF9yZWQgPSBUb3RhbCkgJT4lIA0KICByZW5hbWUoRWRhZCA9IGBFZGFkIChncnVwb3MgcXVpbnF1ZW5hbGVzKWApDQoNCg0KZGZfcHJveSA8LSByaW86OmltcG9ydCgiLi9kYXRvcy9wcm95ZWNjaW9uXzIwNzAuY3N2IikNCmRmX3Byb3kkdG90YWxfcmVkIDwtIGFzLm51bWVyaWMoZGZfcHJveSR0b3RhbF9yZWQpDQpkZl9wcm95MiA8LSBkZl9wcm95ICU+JSANCiAgc2VsZWN0ICgtVG90YWwpDQoNCg0KDQpkZl91bmkgPC0gZnVsbF9qb2luKGRmX3BpcmFtaWRlMiAsIGRmX3Byb3kyKQ0KZGZfdW5pMiA8LSBkZl91bmkgJT4lIA0KICBmaWx0ZXIoYyhFZGFkID09ICIwLTQgYcOxb3MiIHwgRWRhZCA9PSAiNjUtNjkgYcOxb3MiKSkNCg0KI1ZhbW9zIGEgYXJyZWdsYXIgbG9zIGRhdG9zIHBhcmEgcG9kZXIgaGFjZXIgdW4gbWFwYSBjb21wYXJhdGl2byBlbnRyZSBwYWlzZXMgc29icmUgZWwgYWhvcnJvIHByaXZhZG8NCg0KZGZfYWhvcnJvIDwtIHJpbzo6aW1wb3J0KCIuL2RhdG9zL2Fob3Jyb19wcml2YWRvLnhscyIpDQpkZl9haG9ycm8gPC0gZGZfYWhvcnJvICU+JQ0KICBzZWxlY3QoLWMoYEluZGljYXRvciBOYW1lYCkpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IDQ6NjQsIG5hbWVzX3RvID0gIlllYXIiLCB2YWx1ZXNfdG8gPSAiYWhvcnJvX1BJQiIpDQoNCg0KZGF0YShXb3JsZCkgDQpkZl9haG9ycm9fMSA8LSBqYW5pdG9yOjpjbGVhbl9uYW1lcyhkZl9haG9ycm8pDQpkZl9haG9ycm9fMSA8LSBkZl9haG9ycm9fMSAlPiUNCiAgZmlsdGVyKHllYXIgPT0gMjAyMCkgJT4lDQogIHNlbGVjdChjb3VudHJ5X2NvZGUsIGFob3Jyb19waWIpDQp3b3JsZCA8LSBXb3JsZCA7IHJtKFdvcmxkKQ0Kd29ybGQgPC0gd29ybGQgJT4lIHJlbmFtZShjb3VudHJ5X2NvZGUgPSBpc29fYTMpDQpkZl9tYXBhIDwtIGlubmVyX2pvaW4od29ybGQsIGRmX2Fob3Jyb18xKQ0KDQpgYGANCg0KIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipWYXJpYWJsZXMgRGVtb2dyw6FmaWNhcyoqICA8L0ZPTlQ+DQoNCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIE5hdGFsaWRhZCBWcy4gRW52ZWplY2ltaWVudG8gPC9GT05UPiB7LnRhYnNldH0NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFbiBsYSBwYXJ0ZSBzdXBlcmlvciB5IGVuIGNvbG9yIHJvam8gcG9kZW1vcyB2ZXIgbGEgdGFzYSBkZSBlbnZlamVjaW1pZW50bywgbWllbnRyYXMgcXVlIGVuIGxhIHBhcnRlIGluZmVyaW9yIHkgZW4gY29sb3IgYXp1bCBlbmNvbnRyYW1vcyBsYSB0YXNhIGRlIG5hdGFsaWRhZC4gDQoNCkNsYXJhbWVudGUgc2UgYXByZWNpYSBxdWUgbGEgZXZvbHVjacOzbiBkZSBsYSBuYXRhbGlkYWQgaGEgc2lkbyBkZWNyZWNpZW50ZSwgbWllbnRyYXMgcXVlIGxhIHRhc2EgZGUgZW52ZWplY2ltaWVudG8gaGEgYXVtZW50YWRvLiANCg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorR2FzdG8gLSBJbmdyZXNvcyA9IC4uLioqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnAyIDwtIGdncGxvdChkZl91bmlvbl8yKSArDQogIGdlb21fbGluZShhZXMoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBjb2xvciA9ICJUYXNhX05hdGFsaWRhZCIpKSArIA0KICBnZW9tX3BvaW50KGFlcyhQZXJpb2RvcywgVGFzYV9OYXRhbGlkYWQsIGNvbG9yID0gIlRhc2FfTmF0YWxpZGFkIikpICsNCiAgZ2VvbV9saW5lKGFlcyhQZXJpb2RvcywgVG90YWwsIGNvbG9yID0gIkluZGljZV9lbnZlamVjaW1pZW50byIpKSsNCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFRvdGFsLCBjb2xvciA9ICJJbmRpY2VfZW52ZWplY2ltaWVudG8iKSkrDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIkluZGljZSBkZSBlbnZlamVjaW1pZW50byIsIA0KICAgICAgICAgICAgICAgICAgICAgc2VjLmF4aXMgPSBzZWNfYXhpcyh+Li81LCBuYW1lID0gIlRhc2EgTmF0YWxpZGFkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGZ1bmN0aW9uKGIpIHsgcGFzdGUwKHJvdW5kKGIgKiA0LCAwKSwgIiUiKX0pKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyYWNpw7NuIFRhc2EgZGUgTmF0YWxpZGFkIGUgw41uZGljZSBkZSBFbnZlamVjaW1pZW50byIsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCiAgDQoNCg0KZ2dwbG90bHkocDIpDQoNCmBgYA0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMiA8LSBnZ3Bsb3QoZGZfdW5pb25fMikgKw0KICBnZW9tX2xpbmUoYWVzKFBlcmlvZG9zLCBUYXNhX05hdGFsaWRhZCwgY29sb3IgPSAiVGFzYV9OYXRhbGlkYWQiKSkgKyANCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFRhc2FfTmF0YWxpZGFkLCBjb2xvciA9ICJUYXNhX05hdGFsaWRhZCIpKSArDQogIGdlb21fbGluZShhZXMoUGVyaW9kb3MsIFRvdGFsLCBjb2xvciA9ICJJbmRpY2VfZW52ZWplY2ltaWVudG8iKSkrDQogIGdlb21fcG9pbnQoYWVzKFBlcmlvZG9zLCBUb3RhbCwgY29sb3IgPSAiSW5kaWNlX2VudmVqZWNpbWllbnRvIikpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJJbmRpY2UgZGUgZW52ZWplY2ltaWVudG8iLCANCiAgICAgICAgICAgICAgICAgICAgIHNlYy5heGlzID0gc2VjX2F4aXMofi4vNSwgbmFtZSA9ICJUYXNhIE5hdGFsaWRhZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBmdW5jdGlvbihiKSB7IHBhc3RlMChyb3VuZChiICogNCwgMCksICIlIil9KSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBUYXNhIGRlIE5hdGFsaWRhZCBlIMONbmRpY2UgZGUgRW52ZWplY2ltaWVudG8iLA0KICAgIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQogIA0KDQoNCmdncGxvdGx5KHAyKQ0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBjYXNvIHNlIHB1ZWRlIGFwcmVjaWFyIGxhIGNsYXJhIHRlbmRlbmNpYSBhbGNpc3RhIGVuIGxhIGV2b2x1Y2nDs24gZGUgbGEgZXNwZXJhbnphIGRlIHZpZGEuIEhhY2UgYcOxb3MsIGVqZW1wbG8gZW4gMTk4MCwgZW4gRXNwYcOxYSBsYSBnZW50ZSBtb3LDrWEgZGUgbWVkaWEgYSBsb3MgNzUgYcOxb3MuIExvcyDDumx0aW1vcyBkYXRvcywgMjAxOSwgbm9zIGluZGljYW4gcXVlIGRlIG1lZGlhIGxhIHBvYmxhY2nDs24gZXNwYcOxb2xhIGZhbGxlY2UgYSBsb3MgODQgYcOxb3MuDQoNClBvciB0YW50byxlbCBhdmFuY2UgZGVsIHNpc3RlbWEgZGUgYmllbmVzdGFyIGhhY2UgcXVlICBsYSBnZW50ZSB2aXZhIG3DoXMgYcOxb3MgZW4gZWRhZCBkZSBqdWJpbGFjacOzbiBwb3IgbG8gcXVlIGF1bWVudGFuIGxvcyBnYXN0b3MgZGVsIHNpc3RlbWEgDQoNClNpbiBlbWJhcmdvIGVzdG8gbm8gZXMgdW4gY2FzbyBhaXNsYWRvIGRlbCBzaXN0ZW1hIGVzcGHDsW9sLCBwdWVzIGFmZWN0YSBhIHRvZGFzIGxhcyBlY29ub23DrWFzIGRlc2Fycm9sbGFkYXMuDQoNCjxDRU5URVI+DQoqwr9ZIHF1w6kgc2lnbmlmaWNhIGVzdG8/KiAqKitHYXN0byAqKg0KPC9DRU5URVI+DQo8YnI+PGJyPg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDExIDwtIGdncGxvdChkZl92aWRhKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gZXNwZXJhbnphX3ZpZGEsIGNvbG91ciA9IHBhaXMpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhIHBvciBwYWlzZXMiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiQcOxb3MgZGUgdmlkYSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZSBFdXJvc3RhdCIpDQoNCmdncGxvdGx5KHAxMSkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KcDExIDwtIGdncGxvdChkZl92aWRhKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gZXNwZXJhbnphX3ZpZGEsIGNvbG91ciA9IHBhaXMpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpKSArbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlIGxhIGVzcGVyYW56YSBkZSB2aWRhIHBvciBwYWlzZXMiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiQcOxb3MgZGUgdmlkYSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZSBFdXJvc3RhdCIpDQoNCmdncGxvdGx5KHAxMSkNCg0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBQaXJhbWlkZSBQb2JsYWNpb25hbCAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQoNCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBjYXNvIHBvZGVtb3MgYXByZWNpYXIgbGFzIGltw6FnZW5lcyBxdWUgcmVzdW1lbiwgYXVucXVlIGRlIG1hbmVyYSBhcHJveGltYWRhLCBsYSBpbmVzdGFiaWxpZGFkIGRlbCBzaXN0ZW1hLiBFbCBwcm9ibGVtYSBkZSBkaXNtaW51Y2nDs24gZGUgaW5ncmVzb3MganVudG8gYWwgYXVtZW50byBkZSBnYXN0b3Mgc2UgYWdyYXZhcsOhIGVuIGVsIGZ1dHVybyBzZWfDum4gbGFzIHByb3llY2Npb25lcyBkZWwgSU5FLiANCsK/WSBzaSBoYWNlbW9zIHVuIG51ZXZvIGJhYnkgYm9vbT8gQWxndW5vcyBlY29ub21pc3RhcyBoYWJsYW4gZGUgcXVlIHVuIG51ZXZvIGJhYnkgYm9vbSBheXVkYXLDrWEgYSBzb2x1Y2lvbmFyIGVsIHByb2JsZW1hLCBwdWVzdG8gcXVlIGF1bWVudGFyw61hIGxvcyBpbmdyZXNvcyBwb3RlbmNpYWxlcy4gU2luIGVtYmFyZ28sIGVzdGUgZW5mb3F1ZSBlcyBtaW9wZSwgeWEgcXVlIG5vIHNlIGVzdMOhIHRlbmllbmRvIGVuIGN1ZW50YSBxdWUgZW4gZWwgZnV0dXJvLCBjdWFuZG8gbGEgZ2VuZXJhY2nDs24gZGVsIG51ZXZvIGJhYnkgYm9vbSBzZWEgYW5jaWFuYSwgc2Vyw61hIG5lY2VzYXJpbyBvdHJvIGluY3JlbWVudG8gbWFzaXZvIGRlIGxhIG5hdGFsaWRhZCwgZW50cmFuZG8gYXPDrSBlbiB1biBidWNsZSBkZSBuZWNlc2lkYWQgZGUgaW5jcmVtZW50byBkZSBsYSBwb2JsYWNpw7NuLg0KDQpQYW4gcGFyYSBob3kgeSBoYW1icmUgcGFyYSBtYcOxYW5hDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwMTMgPC0gZ2dwbG90KGRmX3BpcmFtaWRlLCBhZXMoeCA9IGBFZGFkIChncnVwb3MgcXVpbnF1ZW5hbGVzKWAsDQogICAgICAgICAgICAgICAgeSA9IGBUb3RhbGAsDQogICAgICAgICAgICAgICAgZmlsbCA9IFNleG8pKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcGlyYW1pZGUsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGBUb3RhbGAgPSAtIGBUb3RhbGApLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJibHVlIikgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3BpcmFtaWRlLCBTZXhvID09ICJNdWplcmVzIiksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gInBpbmsiKSArIA0KICBjb29yZF9mbGlwKCkrbGFicyh0aXRsZSA9ICJQaXJhbWlkZSBQb2JsYWNpb25hbCBhw7FvIDIwMjAgIiwNCiAgICB5ID0gIk1pbGVzIGRlIFBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDEzKQ0KDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCnAxMyA8LSBnZ3Bsb3QoZGZfcGlyYW1pZGUsIGFlcyh4ID0gYEVkYWQgKGdydXBvcyBxdWlucXVlbmFsZXMpYCwNCiAgICAgICAgICAgICAgICB5ID0gYFRvdGFsYCwNCiAgICAgICAgICAgICAgICBmaWxsID0gU2V4bykpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHN1YnNldChkZl9waXJhbWlkZSwgU2V4byA9PSAiSG9tYnJlcyIpICU+JSANCiAgICAgICAgICAgICBtdXRhdGUoYFRvdGFsYCA9IC0gYFRvdGFsYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcGlyYW1pZGUsIFNleG8gPT0gIk11amVyZXMiKSwNCiAgICAgICAgICAgd2lkdGggPSAwLjUsIGZpbGwgPSAicGluayIpICsgDQogIGNvb3JkX2ZsaXAoKStsYWJzKHRpdGxlID0gIlBpcmFtaWRlIFBvYmxhY2lvbmFsIGHDsW8gMjAyMCAiLA0KICAgIHkgPSAiTWlsZXMgZGUgUGVyc29uYXMiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKQ0KDQpnZ3Bsb3RseShwMTMpDQoNCmBgYA0KDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBQcm95ZWNjaW9uZXMgUG9ibGFjaW9uYWxlcyAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKjIwMzYqKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDE0IDwtIGdncGxvdChkZl9wcm95ZWNjaW9uXzM2LCBhZXMoeCA9IGBFZGFkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgdG90YWxfcmVkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTZXhvKSkgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3Byb3llY2Npb25fMzYsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGB0b3RhbF9yZWRgID0gLSBgdG90YWxfcmVkYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl8zNiwgU2V4byA9PSAiTXVqZXJlcyIpLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJwaW5rIikgKyANCiAgY29vcmRfZmxpcCgpK2xhYnModGl0bGUgPSAiUGlyYW1pZGUgUG9ibGFjaW9uYWwgYcOxbyAyMDM2IiwNCiAgICB5ID0gIk1pbGVzIGRlIHBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDE0KQ0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqMjA1MCoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwMTUgPC0gZ2dwbG90KGRmX3Byb3llY2Npb25fNTAsIGFlcyh4ID0gYEVkYWRgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYHRvdGFsX3JlZGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBTZXhvKSkgKw0KICBnZW9tX2NvbChkYXRhID0gc3Vic2V0KGRmX3Byb3llY2Npb25fNTAsIFNleG8gPT0gIkhvbWJyZXMiKSAlPiUgDQogICAgICAgICAgICAgbXV0YXRlKGB0b3RhbF9yZWRgID0gLSBgdG90YWxfcmVkYCksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gImJsdWUiKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl81MCwgU2V4byA9PSAiTXVqZXJlcyIpLA0KICAgICAgICAgICB3aWR0aCA9IDAuNSwgZmlsbCA9ICJwaW5rIikgKyANCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJQaXJhbWlkZSBQb2JsYWNpb25hbCBhw7FvIDIwNTAiLA0KICAgICAgIHkgPSAiTWlsZXMgZGUgcGVyc29uYXMiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKQ0KDQpnZ3Bsb3RseShwMTUpDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKioyMDcwKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnAxNiA8LSBnZ3Bsb3QoZGZfcHJveWVjY2lvbl83MCwgYWVzKHggPSBgRWRhZGAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBgdG90YWxfcmVkYCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IFNleG8pKSArDQogIGdlb21fY29sKGRhdGEgPSBzdWJzZXQoZGZfcHJveWVjY2lvbl83MCwgU2V4byA9PSAiSG9tYnJlcyIpICU+JSANCiAgICAgICAgICAgICBtdXRhdGUoYHRvdGFsX3JlZGAgPSAtIGB0b3RhbF9yZWRgKSwNCiAgICAgICAgICAgd2lkdGggPSAwLjUsIGZpbGwgPSAiYmx1ZSIpICsNCiAgZ2VvbV9jb2woZGF0YSA9IHN1YnNldChkZl9wcm95ZWNjaW9uXzcwLCBTZXhvID09ICJNdWplcmVzIiksDQogICAgICAgICAgIHdpZHRoID0gMC41LCBmaWxsID0gInBpbmsiKSArIA0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIlBpcmFtaWRlIFBvYmxhY2lvbmFsIGHDsW8gMjA3MCIsDQogICAgICAgeSA9ICJNaWxlcyBkZSBwZXJzb25hcyIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpDQoNCmdncGxvdGx5KHAxNikNCg0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKlRhYmxhKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCmRmX3VuaTIgJT4lICBEVDo6ZGF0YXRhYmxlKGV4dGVuc2lvbnMgPSAnQnV0dG9ucycsIA0KICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KGRvbSA9ICdCbGZydGlwJywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyA9IGMoJ2NvcHknLCAnY3N2JywgJ2V4Y2VsJywgJ3BkZicsICdwcmludCcpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlTGVuZ3RoID0gNSwgYXV0b1dpZHRoID0gVFJVRSApKQ0KDQpgYGANCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIEVtYW5jaXBhY2nDs24gIDwvRk9OVD4gey50YWJzZXR9DQoNCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFbiByZWxhY2nDs24gY29uIGxhIHBvc2libGUgc29sdWNpw7NuIGRlbCBiYWJ5IGJvb20sIGRlc2RlIG51ZXN0cm8gcHVudG8gZGUgdmlzdGEsIGVsIHByaW5jaXBhbCBwcm9ibGVtYSByZXNpZGUgZW4gbGEgZWRhZCBkZSBlbWFuY2lwYWNpw7NuLiBTaSBsZXMgcHJlZ3VudGFtb3MgYSBudWVzdHJvcyBhYnVlbG9zIG8gcGFkcmVzIGEgcXXDqSBlZGFkIGVtcGV6YXJvbiBhIHRyYWJhamFyIHByb2JhYmxlbWVudGUgZXNjdWNoZW1vcyB1biBpbnRlcnZhbG8gZGUgZWRhZCBkZSAxMy0xOCBhw7Fvcy4gU2luIGVtYmFyZ28sIGEgZMOtYSBkZSBob3kgZXNhIGVkYWQgZXMgbXVjaG8gbcOhcyB0YXJkw61hLiBQb3IgbG8gdGFudG8gZWwgcHJpbmNpcGFsIHByb2JsZW1hIGxvIHBvZGVtb3MgdmVyIGVuIHF1ZSBsYSBnZW50ZSBlbnRyYSBtw6FzIHRhcmRlIGFsIG1lcmNhZG8gbGFib3JhbCBqdW50byBhIHF1ZSBhaG9yYSBzZSB2aXZlIG3DoXMgYcOxb3MuUG9yIGVsbG8gcXVlIGxvcyBwb2xpdGljb3MgZXN0w6FuIGFsYXJnYW5kbyBsYSBlZGFkIGRlIGp1YmlsYWNpw7NuLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorR2FzdG8gLSBJbmdyZXNvcyA9IC4uLioqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnA4IDwtIGdncGxvdChkZl9lbWFuKSArDQogYWVzKHggPSBUcmFtb19FZGFkLCBmaWxsID0gVHJhbW9fRWRhZCwgd2VpZ2h0ID0gUG9yY2VudGFqZSkgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKSArDQogZmFjZXRfd3JhcCh2YXJzKFBlcmlvZG8pKSArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKSwNCiAgICBheGlzLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMyksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKSArbGFicyh0aXRsZSA9ICJQb3JjZW50YWplIGRlIEVtYW5jaXBhZG9zIHBvciBlZGFkIiwNCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlBvcmNlbnRhamUgZGUgZW1hbmNpcGFkb3MiLA0KICAgIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgQkJWQSBSZXNlYXJjaCBGb3VuZGF0aW9uIikNCg0KZ2dwbG90bHkocDgpDQoNCmBgYA0KDQo8YnI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KIHA5IDwtIGdncGxvdChkZl92YXIpICsNCiBhZXMoeCA9IHRyYW1vX2VkYWQsIGZpbGwgPSB0cmFtb19lZGFkLCB3ZWlnaHQgPSB2YXJpYWNpb24pICsNCiBnZW9tX2JhcigpICsNCiBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAidmlyaWRpcyIsIA0KIGRpcmVjdGlvbiA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkgKyB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCkpICtsYWJzKHRpdGxlID0gIlZhcmlhY2nDs24gcG9yY2VudHVhbCBkZSBlbWFuY2lwYWRvcyAyMDE4IC0gMjAwOCIsDQogICAgeCA9ICJUcmFtbyBkZSBFZGFkIiwgeSA9ICJWYXJpYWNpw7NuIGRlIGVtYW5jaXBhZG9zIiwNCiAgICBmaWxsID0gIlRyYW1vIGRlIEVkYWQiLCBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIEJCVkEgUmVzZWFyY2giKQ0KDQpnZ3Bsb3RseShwOSkNCg0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KcDggPC0gZ2dwbG90KGRmX2VtYW4pICsNCiBhZXMoeCA9IFRyYW1vX0VkYWQsIGZpbGwgPSBUcmFtb19FZGFkLCB3ZWlnaHQgPSBQb3JjZW50YWplKSArDQogZ2VvbV9iYXIoKSArDQogc2NhbGVfZmlsbF92aXJpZGlzX2Qob3B0aW9uID0gInZpcmlkaXMiLCANCiBkaXJlY3Rpb24gPSAxKSArDQogdGhlbWVfbWluaW1hbCgpICsNCiBmYWNldF93cmFwKHZhcnMoUGVyaW9kbykpICsgdGhlbWUocGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTEpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNikpICtsYWJzKHRpdGxlID0gIlBvcmNlbnRhamUgZGUgRW1hbmNpcGFkb3MgcG9yIGVkYWQiLA0KICAgIHggPSAiVHJhbW8gZGUgRWRhZCIsIHkgPSAiUG9yY2VudGFqZSBkZSBlbWFuY2lwYWRvcyIsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBCQlZBIFJlc2VhcmNoIEZvdW5kYXRpb24iKQ0KDQpnZ3Bsb3RseShwOCkNCg0KDQogcDkgPC0gZ2dwbG90KGRmX3ZhcikgKw0KIGFlcyh4ID0gdHJhbW9fZWRhZCwgZmlsbCA9IHRyYW1vX2VkYWQsIHdlaWdodCA9IHZhcmlhY2lvbikgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKSArIHRoZW1lKHBsb3Quc3VidGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgK2xhYnModGl0bGUgPSAiVmFyaWFjacOzbiBwb3JjZW50dWFsIGRlIGVtYW5jaXBhZG9zIDIwMTggLSAyMDA4IiwNCiAgICB4ID0gIlRyYW1vIGRlIEVkYWQiLCB5ID0gIlZhcmlhY2nDs24gZGUgZW1hbmNpcGFkb3MiLA0KICAgIGZpbGwgPSAiVHJhbW8gZGUgRWRhZCIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgQkJWQSBSZXNlYXJjaCIpDQoNCmdncGxvdGx5KHA5KQ0KDQpgYGANCg0KDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqTWVyY2FkbyBMYWJvcmFsKiogIDwvRk9OVD4NCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIFRhc2EgZGUgUGFybyBWcy4gQWN0aXZpZGFkICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIGVzdGUgY2FzbyBwb2RlbW9zIGFwcmVjaWFyIHF1ZSBhbWJhcyB2YXJpYWJsZXMgc2UgbXVldmVuIGFsIHVuw61zb25vIHBlcm8gZGUgbWFuZXJhIGludmVyc2EuIEFzw60sIGN1YW5kbyBlbCBwYXJvIGRpc21pbnV5ZSwgYXVtZW50YSBsYSB0YXNhIGRlIGFjdGl2aWRhZCB5IHZpY2V2ZXJzYS4gRMOtYSB0cmFzIGTDrWEgcG9kZW1vcyBlc2N1Y2hhciB5L28gbGVlciBlbiBsYXMgbm90aWNpYXMgZWwgcHJlb2N1cGFudGUgcHJvYmxlbWEgZGVsIHBhcm8gZXNwYcOxb2wsIHBvciBlamVtcGxvIFthcXXDrV0oaHR0cHM6Ly93d3cuZWxlY29ub21pc3RhLmVzL29waW5pb24tYmxvZ3Mvbm90aWNpYXMvMTExNDI2MDEvMDQvMjEvRWwtY3Jvbmljby1wcm9ibGVtYS1kZWwtcGFyby5odG1sKQ0KDQpEZXNkZSBlbCBwdW50byBkZSB2aXN0YSBkZWwgc2lzdGVtYSBkZSBwZW5zaW9uZXMgZXNwYcOxb2wsIHF1ZSByZWNvcmRlbW9zIHF1ZSBlcyB1biBzaXN0ZW1hIGRlIHJlcGFydG8gKGxvcyB0cmFiYWphZG9yZXMgZGUgYWhvcmEgcGFnYW4gYSBsb3MgcGVuc2lvbmlzdGFzIGRlIGFob3JhKSwgZXN0byBpbmZsdXllIGVuIGxhIG1lbm9yIGNhcGFjaWRhZCByZWNhdWRhdG9yaWEgZGUgZGljaG8gc2lzdGVtYSB5LCBwb3IgdGFudG8sIHByb3ZvY2EgdW5hIGdyYW4gaW5lc3RhYmlsaWRhZC4NCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqLSBJbmdyZXNvcyoqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDQgPC0gZ2dwbG90KGRmX3VuaW9uKSArDQogIGdlb21fYmFyKGFlcyhQZXJpb2RvcywgVGFzYV9BY3RpdmlkYWQpLCBzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJncmV5IikgKw0KICBnZW9tX2xpbmUoYWVzKFBlcmlvZG9zLCBQYXJvKSwgc2l6ZSA9IDEpICsNCiAgZ2VvbV9wb2ludChhZXMoUGVyaW9kb3MsIFBhcm8pLCBzaXplID0gMikgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmFjacOzbiBUYXNhIGRlIFBhcm8geSBkZSBBY3RpdmlkYWQiLA0KICAgICAgIHN1YnRpdGxlID0gIkRhdG9zIHBhcmEgZWwgcGVyaW9kbyAyMDAyIC0gMjAyMCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRvcyBwcm92ZW5pZW50ZXMgZGVsIElORUJhc2UiLA0KICAgICAgIHkgPSAiVGFzYSBkZSBQYXJvIHkgQWN0aXZpZGFkIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KDQpnZ3Bsb3RseShwNCkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCnA0IDwtIGdncGxvdChkZl91bmlvbikgKw0KICBnZW9tX2JhcihhZXMoUGVyaW9kb3MsIFRhc2FfQWN0aXZpZGFkKSwgc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAiZ3JleSIpICsNCiAgZ2VvbV9saW5lKGFlcyhQZXJpb2RvcywgUGFybyksIHNpemUgPSAxKSArDQogIGdlb21fcG9pbnQoYWVzKFBlcmlvZG9zLCBQYXJvKSwgc2l6ZSA9IDIpICsNCiAgbGFicyh0aXRsZSA9ICJDb21wYXJhY2nDs24gVGFzYSBkZSBQYXJvIHkgZGUgQWN0aXZpZGFkIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJEYXRvcyBwYXJhIGVsIHBlcmlvZG8gMjAwMiAtIDIwMjAiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0b3MgcHJvdmVuaWVudGVzIGRlbCBJTkVCYXNlIiwNCiAgICAgICB5ID0gIlRhc2EgZGUgUGFybyB5IEFjdGl2aWRhZCIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCg0KZ2dwbG90bHkocDQpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+ICBPY3VwYWRvcyBwb3IgZ3J1cG8gZGUgRWRhZCAgPC9GT05UPiB7LnRhYnNldH0NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipBbsOhbGlzaXMqKiAgPC9GT05UPg0KDQpFc3RlIGFuw6FsaXNpcyB2YSBlbiBsw61uZWEgYWwgYW50ZXJpb3IuIEVuIGVzdGUgY2FzbyBjYWJlIGRlc3RhY2FyIHF1ZSBwYXJhIHF1ZSBlbCBzaXN0ZW1hIHJlY2liaWVyYSB1bmEgYm9jYW5hZGEgZGUgYWlyZSBlc3BlcmFuemFkb3IsIGxhIGZ1ZXJ6YSBtb3RyaXogZGVsIG1lcmNhZG8gbGFib3JhbCBkZWJlcsOtYSBzZXIgcHJpbmNpcGFsbWVudGUgbGFzIGVkYWRlcyBkZSAyMCBhIDUwIGHDsW9zLiBBc8OtIGNvbnNlZ3VpcsOtYW1vcyBxdWUgbGFzIHBlbnNpb25lcyBlc3R1dmllcmFuIG3DoXMgZ2FyYW50aXphZGFzIHF1ZSBhaG9yYSBtaXNtby4gU2luIGVtYmFyZ28sIHNlIHB1ZWRlIGFwcmVjaWFyIGNsYXJhbWVudGUgbGEgYmFqYSB0YXNhIGRlIG9jdXBhY2nDs24gYSBlZGFkZXMgZGUgZW50cmUgMjAgeSAzMCBhw7FvcywgY29zYSBxdWUgcHJlb2N1cGEgeSBtdWNoby4gQ29uY3LDqXRhbWVudGUsIHNlZ8O6biBbZnVlbnRlcyBkb2N1bWVudGFsZXNdKGh0dHBzOi8vd3d3Lm51ZXZhdHJpYnVuYS5lcy9hcnRpY3Vsby9zb2NpZWRhZC9wYXJvanV2ZW5pbC12aWVqby1wcm9ibGVtYWVzdHJ1Y3R1cmFsLWpvdmVuZXMtcHJlY2FyaWVkYWQvMjAyMTA4MTAxNTE3MTkxOTAxNjQuaHRtbCM6fjp0ZXh0PUVzcGElQzMlQjFhJTJDJTIwZW4lMjBsYSUyMGFjdHVhbGlkYWQlMkMlMjBlcyxlbiUyMGVsJTIwMTclMkMxJTI1LikgRXNwYcOxYSB0aWVuZSBsYSB0YXNhIGRlIHBhcm8ganV2ZW5pbCBtw6FzIGFsdGEgZGUgbG9zIHBhw61zZXMgbWllbWJyb3MgZGUgbGEgVW5pw7NuIEV1cm9wZWENCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqRnV0dXJvIE5lZ3JvIHBhcmEgRXNwYcOxYSoqDQo8L0NFTlRFUj4NCg0KPGJyPjxicj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KcDEwIDwtIGdncGxvdChkZl9lZGFkKSArDQogYWVzKHggPSBFZGFkLCBmaWxsID0gRWRhZCwgd2VpZ2h0ID0gVG90YWwpICsNCiBnZW9tX2JhcigpICsNCiBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAidmlyaWRpcyIsIA0KIGRpcmVjdGlvbiA9IDEpICsNCiB0aGVtZV9taW5pbWFsKCkrbGFicyh0aXRsZSA9ICJPY3VwYWRvcyBwb3IgZ3J1cG8gZGUgRWRhZCBlbiAyMDIxIiwNCiAgICB4ID0gTlVMTCwgeSA9ICJNaWxlcyBkZSBQZXJzb25hcyIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSIpDQoNCmdncGxvdGx5KHAxMCkNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMTAgPC0gZ2dwbG90KGRmX2VkYWQpICsNCiBhZXMoeCA9IEVkYWQsIGZpbGwgPSBFZGFkLCB3ZWlnaHQgPSBUb3RhbCkgKw0KIGdlb21fYmFyKCkgKw0KIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJ2aXJpZGlzIiwgDQogZGlyZWN0aW9uID0gMSkgKw0KIHRoZW1lX21pbmltYWwoKStsYWJzKHRpdGxlID0gIk9jdXBhZG9zIHBvciBncnVwbyBkZSBFZGFkIGVuIDIwMjEiLA0KICAgIHggPSBOVUxMLCB5ID0gIk1pbGVzIGRlIFBlcnNvbmFzIiwgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBJTkVCYXNlIikNCg0KZ2dwbG90bHkocDEwKQ0KDQpgYGANCg0KPGJyPg0KPGJyPg0KPGJyPg0KDQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqUGVuc2lvbmVzKiogIDwvRk9OVD4gDQoNCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gRXZvbHVjacOzbiBkZWwgRm9uZG8gZGUgUmVzZXJ2YSA8L0ZPTlQ+ey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNClByaW1lcm8gcXVlIG5hZGEgZGViZW1vcyBlbnRlbmRlciBxdWUgZWwgZm9uZG8gZGUgcmVzZXJ2YSBlcyBlbCDigJxsdWdhcuKAnSBkb25kZSwgZW4gw6lwb2NhcyBkZSBzdXBlcsOhdml0LCBzZSBkZXBvc2l0YW4gbGFzIGFwb3J0YWNpb25lcyBxdWUgc29icmFuIChjb3NhIHF1ZSBoYWNlIHF1ZSBlbCBmb25kbyBhdW1lbnRlKSB5LCBlbiDDqXBvY2FzIGRlZmljaXRhcmlhcywgc2UgdXRpbGl6YSBwYXJhIHRvbWFyIGRpbmVybyBwYXJhIHBhZ2FyIGEgbG9zIHBlbnNpb25pc3RhcyAoZGlzbWludXllIGVsIGZvbmRvIGRlIHJlc2VydmEpLiANCg0KQ2xhcmFtZW50ZSBzZSBwdWVkZSBhcHJlY2lhciBxdWUgZW4gbGEgw6lwb2NhIHByZWNyaXNpcyAoYW50ZXMgZGUgMjAwOCkgZWwgbWVyY2FkbyBsYWJvcmFsIGVzcGHDsW9sIGVzdGFiYSBlbiBhdWdlLCBjb3NhIHF1ZSBwZXJtaXTDrWEgcXVlIGxhIGNhbnRpZGFkIGluZ3Jlc2FkYSBlbiBsYSBzZWd1cmlkYWQgc29jaWFsIGZ1ZXJhIHN1cGVyaW9yIGEgbGEgY2FudGlkYWQgZ2FzdGFkYSAoY290aXphY2lvbmVzID4gcGVuc2lvbmVzKSwgcHJvdm9jYW5kbyB1biBzdXBlcsOhdml0IGRlbCBmb25kbyBkZSByZXNlcnZhLiBTaW4gZW1iYXJnbywgZXN0w6EgY2xhcm8gcXVlIGxhIGNyaXNpcyB0dXZvIGdyYW4gaW5jaWRlbmNpYSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwgZXNwYcOxb2wuIExhIGdyYW4gdGFzYSBkZSBwYXJvIGp1bnRvIGFsIGF1bWVudG8gZGVsIG7CuiBkZSBwZW5zaW9uaXN0YXMgcHJvdm9jw7MgZWwgZ3JhbiBkZWNsaXZlIGRlIGxvIHF1ZSBjb23Dum5tZW50ZSBzZSBjb25vY2UgY29tbyBsYSDigJxodWNoYSBkZSBsYXMgcGVuc2lvbmVz4oCdLg0KTXVjaG9zIGVjb25vbWlzdGFzIGNhbGlmaWNhbiBlc3RlIGdyw6FmaWNvIGNvbW8gdW5hIGltw6FnZW4gZGUgbGEgZXN0cnVjdHVyYSBkZWZpY2l0YXJpYSBkZSBkaWNobyBzaXN0ZW1hLiBBZGVtw6FzLCBlbCBwcm9ibGVtYSBubyBlcyB0YW50byBxdWUgbG8gaGF5YW1vcyB1dGlsaXphZG8gZHVyYW50ZSBhw7FvcyBkZSBtYWxlc3RhciBlY29uw7NtaWNvIG5hY2lvbmFsLCBzaW7DsyBxdWUgbGFzIHByb3llY2Npb25lcyB5IGVsIGFuw6FsaXNpcyBkZSB2YXJpYWJsZXMgbm8gcGFyZWNlbiBwcm9tZXRlciB1bmEgcmVjdXBlcmFjacOzbiBkZWwgc3VwZXLDoXZpdA0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKipOb3MgZXN0YW1vcyBmdW5kaWVuZG8gbG9zIGFob3Jyb3MgZGUgbnVlc3Ryb3MgYWJ1ZWxvcyoqDQo8L0NFTlRFUj4NCg0KDQpgYGB7ciwgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCg0KDQpwMTIgPC0gZ2dwbG90KGRmX2ZvbmRvKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gbWlsbG9uZXNfZXVyb3MpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDY2REQxIikgKw0KICBnZW9tX3BvaW50KCkrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCBGb25kbyBkZSBSZXNlcnZhIDIwMDAgLSAyMDE5IiwNCiAgICB4ID0gIlBlcmlvZG8iLCB5ID0gIk1pbGxvbmVzIGRlIEV1cm9zIiwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwMTIpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwMTIgPC0gZ2dwbG90KGRmX2ZvbmRvKSArDQogYWVzKHggPSBwZXJpb2RvLCB5ID0gbWlsbG9uZXNfZXVyb3MpICsNCiBnZW9tX2xpbmUoc2l6ZSA9IDEsIGNvbG91ciA9ICIjMDY2REQxIikgKw0KICBnZW9tX3BvaW50KCkrbGFicyh0aXRsZSA9ICJFdm9sdWNpw7NuIGRlbCBGb25kbyBkZSBSZXNlcnZhIDIwMDAgLSAyMDE5IiwNCiAgICB4ID0gIlBlcmlvZG8iLCB5ID0gIk1pbGxvbmVzIGRlIEV1cm9zIiwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIElORUJhc2UiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwMTIpDQoNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gIFRhc2EgZGUgY29iZXJ0dXJhIG8gcmVlbXBsYXpvICA8L0ZPTlQ+IHsudGFic2V0fQ0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIHBhbGFicmFzIHNlbmNpbGxhcywgbGEgdGFzYSBkZSBjb2JlcnR1cmEgbyBkZSByZWVtcGxhem8gZGUgbGFzIHBlbnNpb25lcyBub3MgaW5kaWNhIGVsIHBvcmNlbnRhamUgZGVsIHNhbGFyaW8gcXVlIGNvYnJhbW9zIGNvbW8gcGVuc2nDs24uIExhIGNhbGN1bGFtb3MgZGl2aWRpZW5kbyBudWVzdHJhIHBlbnNpw7NuIGVudHJlIG51ZXN0cm8gw7psdGltbyBzYWxhcmlvLiBBc8OtIG1lZGltb3Mgc2kgZWwgc2lzdGVtYSBlcyBjYXBheiBkZSBtYW50ZW5lciBudWVzdHJhIGNhcGFjaWRhZCBhZHF1aXNpdGl2YS4gQSBtb2RvIGRlIGVqZW1wbG8sIHNpIHVuIHRyYWJhamFkb3IgY29icmEgNjAw4oKsIGRlIHBlbnNpw7NuIHkgc3Ugw7psdGltbyBzYWxhcmlvIGVyYSBkZSAxLjAwMOKCrCwgbGEgdGFzYSBkZSBjb2JlcnR1cmEgZXMgZGUgKDYwMC8xMDAwICoxMDApIDYwJSAuIEVzIGRlY2lyLCBhbCBwYXNhciBkZSBzZXIgdHJhYmFqYWRvciBhIHBlbnNpb25pc3RhLCBlc3RhbW9zIHBlcmRpZW5kbyB1biA0MCUgZGUgcG9kZXIgYWRxdWlzaXRpdm8gKHJlc3BlY3RvIGFsIMO6bHRpbW8gZMOtYSBxdWUgdHJhYmFqYW1vcykuDQoNClBvZGVtb3MgYXByZWNpYXIgcXVlIGxhIHRlbmRlbmNpYSBldm9sdXRpdmEgaGEgc2lkbyBhc2NlbmRpZW50ZSwgY2xhcm8gZWplbXBsbyBkZWwgZm9tZW50byBkZWwgZXN0YWRvIGRlIGJpZW5lc3Rhci4gU0luIGVtYmFyZ28sIG3DoXMgcXVlIGxhIGV2b2x1Y2nDs24gcGFzYWRhLCBsbyBxdWUgdGVuZW1vcyBxdWUgcHJlZ3VudGFybm9zIGVzIHNpIGF1bWVudGFyIG8gbWFudGVuZXIgbGEgdGFzYSBkZSBjb2JlcnR1cmEgc2Vyw6EgdmlhYmxlIHNlZ8O6biBsb3MgbmVmYXN0b3MgcHJvbsOzc3RpY29zIHF1ZSBsb3MgZWNvbm9taXN0YXMgZGlhZ25vc3RpY2FuLg0KDQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwNyA8LSBnZ3Bsb3QoZGZfdW5pb25fMywgYWVzKHBlcmlvZG8sIHBvcmNlbnRhamUpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTg1IiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgK2xhYnModGl0bGUgPSAiVGFzYSBkZSBjb2JlcnR1cmEgbyByZWVtcGxhem8gZGUgbGEgcGVuc2nDs24gbWVkaWEiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiUG9yY2VudGFqZSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwNykNCg0KYGBgDQoNCjxicj4NCjxicj4NCjxicj4NCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpwNyA8LSBnZ3Bsb3QoZGZfdW5pb25fMywgYWVzKHBlcmlvZG8sIHBvcmNlbnRhamUpKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKyANCiAgZ2VvbV9wb2ludCgpICsgDQogIHRoZW1lKGF4aXMubGluZSA9IGVsZW1lbnRfbGluZShzaXplID0gMC41KSwNCiAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKHNpemUgPSAwKSwNCiAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSwNCiAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JheTg1IiksDQogICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiKSkgK2xhYnModGl0bGUgPSAiVGFzYSBkZSBjb2JlcnR1cmEgbyByZWVtcGxhem8gZGUgbGEgcGVuc2nDs24gbWVkaWEiLA0KICAgIHggPSAiUGVyaW9kbyIsIHkgPSAiUG9yY2VudGFqZSIsIHN1YnRpdGxlID0gIkRhdG9zIGV4dHJhaWRvcyBkZWwgSU5FQmFzZSAiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpnZ3Bsb3RseShwNykNCg0KYGBgDQogDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQWx0ZXJuYXRpdmFzIGEgbGFzIHBlbnNpb25lcyBww7pibGljYXMqKiAgPC9GT05UPiANCg0KUGFyYSBhbmFsaXphciBsYSB2aWFiaWxpZGFkIGRlbCBzaXN0ZW1hIGRlIHBlbnNpb25lcyBlcyBpbXBvcnRhbnRlIGFuYWxpemFyIHNpIGV4aXN0ZW4gYWx0ZXJuYXRpdmFzIHJlYWxlcyBhIGxhIHBlbnNpw7NuIHDDumJsaWNhIGVuIGVzdG9zIG1vbWVudG9zIGVuIEVzcGHDsWEuIFF1ZXJlbW9zIGF2ZXJpZ3VhciBzaSBlcyBmYWN0aWJsZSBwZW5zYXIgcXVlIGVsIGFob3JybyBwcml2YWRvIGVzIHN1ZmljaWVudGUgcGFyYSBjb21wZW5zYXIgdW5hcyBwZW5zaW9uZXMgZnV0dXJhcywgZW4gY2FzbyBkZSBxdWUgZXN0ZSBzaXN0ZW1hIGZyYWNhc2UuIFBhcmEgZWxsbyBoZW1vcyBpbnZlc3RpZ2FkbyBjw7NtbyBzZSBkaXN0cmlidXllIGVsIGFob3JybyBwcml2YWRvIGVuIEVzcGHDsWEgeSBjw7NtbyBoYSBpZG8gZXZvbHVjaW9uYW5kbyBlc3RlIGVuIGxvcyDDumx0aW1vcyBhw7Fvcy4gDQogDQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IENvbXBhcmFjacOzbiBkZWwgYWhvcnJvIHByaXZhZG8gZW50cmUgcGFpc2VzIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KUHJpbWVybywgaGVtb3MgZWxhYm9yYWRvIGVzdGUgbWFwYSBwYXJhIG9ic2VydmFyIGVuIGVsIGHDsW8gMjAyMCwgcXXDqSBwb3JjZW50YWplIGRlbCBQSUIgb2N1cGEgZWwgYWhvcnJvIHByaXZhZG8gZW4gY2FzaSB0b2RvcyBsb3MgcGHDrXNlcyBkZWwgbXVuZG8uIFZlbW9zIHF1ZSBlbiBFc3Bhw7FhIHNlIHNpdMO6YSBlbiBlbCAyMSwzJS4gQ29tbyBzZSBhcHJlY2lhIGVuIGVsIG1hcGEsIGxvcyBuaXZlbGVzIG3DoXMgYWx0b3MgZGUgYWhvcnJvIHNlIGVuY3VlbnRyYW4gZW4gbG9zIHBhw61zZXMgZGVsIG5vcnRlIGRlIEV1cm9wYSB5IGVsIHN1ciBkZSBBc2lhLCBub3Mgc29ycHJlbmRlIGVzcGVjaWFsbWVudGUgbG9zIGNhc29zIGRlIE1hcnJ1ZWNvcywgVXpiZXF1aXN0w6FuICB5IEJhbmdsYWRlc2guIFBhw61zZXMgY29tbyBTdWl6YSwgTm9ydWVnYSB5IFN1ZWNpYSBjdWVudGFuIGNvbiBzaXN0ZW1hcyBkZSBwZW5zaW9uZXMgbWl4dG9zLCBlcyBkZWNpciwgdW4gcG9yY2VudGFqZSBkZSBsYXMgcGVuc2lvbmVzIGVzIHBhZ2FkbyBwb3IgZWwgcGHDrXMgeSBvdHJvIHBvciBlbCBwcm9waW8gYWhvcnJvIHByaXZhZG8gZGVsIGJlbmVmaWNpYXJpby4gRXMgcG9yIGVsbG8gcXVlIGN1ZW50YW4gY29uIGdyYW5kZXMgcG9yY2VudGFqZXMgZGUgYWhvcnJvIHByaXZhZG8gY29uIHJlc3BlY3RvIGFsIFBJQiwgeWEgcXVlIGVsIHByb3BpbyBzaXN0ZW1hIGZhdm9yZWNlIGEgZWxsby4gDQoNCjxDRU5URVI+DQoqwr9ZIHF1w6kgc2lnbmlmaWNhIGVzdG8/KiAqKkFob3JybyBpbnN1ZmljaWVudGUqKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpteXBhbGV0dGUgPC0gY29sb3JOdW1lcmljKCBwYWxldHRlPSJHcmV5cyIsIGRvbWFpbj1kZl9tYXBhJGFob3Jyb19waWIsbmEuY29sb3I9InRyYW5zcGFyZW50IikNCg0KbXl0ZXh0IDwtIHBhc3RlKA0KICAiUGHDrXM6ICIsIGRmX21hcGEkbmFtZSwiPGJyLz4iLCANCiAgIlNpdHVhY2nDs24gZWNvbsOzbWljYToiLCAgZGZfbWFwYSRlY29ub215LCAiPGJyLz4iLCANCiAgIlBvcmNlbnRhamUgZGUgYWhvcnJvOiAiLCBkZl9tYXBhJGFob3Jyb19waWIsIA0KICBzZXA9IiIpICU+JQ0KICBsYXBwbHkoaHRtbHRvb2xzOjpIVE1MKQ0KbWFwYSA8LSBsZWFmbGV0KGRmX21hcGEpICU+JSANCiAgYWRkVGlsZXMoKSAgJT4lIA0KICBzZXRWaWV3KCBsYXQ9MTAsIGxuZz0wICwgem9vbT0yKSAlPiUNCiAgYWRkUG9seWdvbnMoIA0KICAgIGZpbGxDb2xvciA9IH5teXBhbGV0dGUoYWhvcnJvX3BpYiksIA0KICAgIHN0cm9rZT1UUlVFLCANCiAgICBmaWxsT3BhY2l0eSA9IDAuOSwgDQogICAgY29sb3I9IndoaXRlIiwgDQogICAgd2VpZ2h0PTAuMywNCiAgICBsYWJlbCA9IG15dGV4dCwNCiAgICBsYWJlbE9wdGlvbnMgPSBsYWJlbE9wdGlvbnMoIA0KICAgICAgc3R5bGUgPSBsaXN0KCJmb250LXdlaWdodCIgPSAibm9ybWFsIiwgcGFkZGluZyA9ICIzcHggOHB4IiksIA0KICAgICAgdGV4dHNpemUgPSAiMTNweCIsIA0KICAgICAgZGlyZWN0aW9uID0gImF1dG8iDQogICAgKQ0KICApICU+JQ0KICBhZGRMZWdlbmQoIHBhbD1teXBhbGV0dGUsIHZhbHVlcz1+YWhvcnJvX3BpYiwgb3BhY2l0eT0wLjksIHRpdGxlID0gIiUgZGUgYWhvcnJvIGVuIGVsIFBJQiIsIHBvc2l0aW9uID0gImJvdHRvbWxlZnQiICkNCm1hcGENCg0KYGBgDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCm15cGFsZXR0ZSA8LSBjb2xvck51bWVyaWMoIHBhbGV0dGU9IkdyZXlzIiwgZG9tYWluPWRmX21hcGEkYWhvcnJvX3BpYixuYS5jb2xvcj0idHJhbnNwYXJlbnQiKQ0KDQpteXRleHQgPC0gcGFzdGUoDQogICJQYcOtczogIiwgZGZfbWFwYSRuYW1lLCI8YnIvPiIsIA0KICAiU2l0dWFjacOzbiBlY29uw7NtaWNhOiIsICBkZl9tYXBhJGVjb25vbXksICI8YnIvPiIsIA0KICAiUG9yY2VudGFqZSBkZSBhaG9ycm86ICIsIGRmX21hcGEkYWhvcnJvX3BpYiwgDQogIHNlcD0iIikgJT4lDQogIGxhcHBseShodG1sdG9vbHM6OkhUTUwpDQptYXBhIDwtIGxlYWZsZXQoZGZfbWFwYSkgJT4lIA0KICBhZGRUaWxlcygpICAlPiUgDQogIHNldFZpZXcoIGxhdD0xMCwgbG5nPTAgLCB6b29tPTIpICU+JQ0KICBhZGRQb2x5Z29ucyggDQogICAgZmlsbENvbG9yID0gfm15cGFsZXR0ZShhaG9ycm9fcGliKSwgDQogICAgc3Ryb2tlPVRSVUUsIA0KICAgIGZpbGxPcGFjaXR5ID0gMC45LCANCiAgICBjb2xvcj0id2hpdGUiLCANCiAgICB3ZWlnaHQ9MC4zLA0KICAgIGxhYmVsID0gbXl0ZXh0LA0KICAgIGxhYmVsT3B0aW9ucyA9IGxhYmVsT3B0aW9ucyggDQogICAgICBzdHlsZSA9IGxpc3QoImZvbnQtd2VpZ2h0IiA9ICJub3JtYWwiLCBwYWRkaW5nID0gIjNweCA4cHgiKSwgDQogICAgICB0ZXh0c2l6ZSA9ICIxM3B4IiwgDQogICAgICBkaXJlY3Rpb24gPSAiYXV0byINCiAgICApDQogICkgJT4lDQogIGFkZExlZ2VuZCggcGFsPW15cGFsZXR0ZSwgdmFsdWVzPX5haG9ycm9fcGliLCBvcGFjaXR5PTAuOSwgdGl0bGUgPSAiJSBkZSBhaG9ycm8gZW4gZWwgUElCIiwgcG9zaXRpb24gPSAiYm90dG9tbGVmdCIgKQ0KbWFwYQ0KDQpgYGANCg0KDQojIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiBUYWJsYSBjb21wYXJhdGl2YSA8L0ZPTlQ+ey50YWJzZXR9DQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAqKkFuw6FsaXNpcyoqICA8L0ZPTlQ+DQoNCkVuIGxhIHNpZ3VpZW50ZSB0YWJsYSBvYnNlcnZhbW9zIGVsIHBvcmNlbnRhamUgZGUgYWhvcnJvIGVuIHJlbGFjacOzbiBhbCBQSUIgZW4gdG9kb3MgbG9zIHBhw61zZXMgcXVlIHRlbmVtb3MgZGF0b3MgZW4gMjAyMCB5IGxhIGRpZmVyZW5jaWEgY29uIGxhIG1lZGlhIHRvdGFsLiBPYnNlcnZhbW9zIGNvbW8gRXNwYcOxYSBzZSBzaXTDumEgMSBwdW50byBwb3JjZW50dWFsIHBvciBkZWJham8gZGUgbGEgbWVkaWEgdG90YWwsIHF1ZSBlcyBkZWwgMjIsMzclLiBTaSBmaWx0cmFtb3MgZGUgbWF5b3IgYSBtZW5vciBwb2RlbW9zIGFwcmVjaWFyIGNvbW8gU2luZ2FwdXIgZXMgZWwgcGHDrXMgZGVsIG11bmRvIGNvbiBtYXlvciBhaG9ycm8sIGNvbiBtw6FzIGRlbCA0MCUsIG90cm8gcGHDrXMgcXVlIGN1ZW50YSBjb24gdW4gc2lzdGVtYSBkZSBjYXBpdGFsaXphY2nDs24gKGlndWFsIHF1ZSBTdWVjaWEgeSBOb3J1ZWdhKS4gRGUgZXN0YSBtYW5lcmEsIGVzIGVsIHByb3BpbyB0cmFiYWphZG9yIGVsIHF1ZSwgcG9yIGxleSwgYWhvcnJhIGRpbmVybyBkdXJhbnRlIHRvZGEgc3UgdmlkYSBwYXJhIGdhc3RhcmxvIGN1YW5kbyBzZSBqdWJpbGUsIHkgZWwgcGHDrXMgb2ZyZWNlIHVuYSBheXVkYSBwYXJhIGFxdWVsbG9zIHF1ZSBubyBhbGNhbmNlbiBlbCBtw61uaW1vIGFob3JyYWRvLiBFc28gZXhwbGljYSBwb3JjZW50YWplcyB0YW4gYWx0b3MgZGUgYWhvcnJvLiANCg0KDQpFbnRyZSBsb3MgcGHDrXNlcyBjb24gbWVub3IgdGFzYSBkZSBhaG9ycm8gZW5jb250cmFtb3MgYSBHcmVjaWEsIFVjcmFuaWEgbyBSZWlubyBVbmlkby4gTWllbnRyYXMgbG9zIDIgcHJpbWVyb3MgY3VlbnRhbiBjb24gc2lzdGVtYXMgZGUgcmVwYXJ0byBwdXJhbWVudGUgcMO6YmxpY28sIGNvbW8gZW4gRXNwYcOxYSwgc29ycHJlbmRlIGVsIGNhc28gZGUgUmVpbm8gVW5pZG8sIGVuIGVsIGN1YWwgbGFzIHBlbnNpb25lcyBww7pibGljYXMgbm8gc3VwZXJhbiBlbCAzMCUgZGVsIHNhbGFyaW8gbWVkaW8gZGVsIHBhw61zLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKiorIFBlbnNpb25lcyBwdXJhbWVudGUgcMO6YmxpY2FzIC0gYWhvcnJvIHByaXZhZG8qKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KZGZfdGFibGEgPC0gZGZfYWhvcnJvICAlPiUNCiAgZmlsdGVyKFllYXIgPT0gMjAyMCkgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgbXV0YXRlKGRpZmVyZW5jaWEgPSBhaG9ycm9fUElCIC0gbWVhbihhaG9ycm9fUElCICwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNlbGVjdCgnQ291bnRyeSBOYW1lJywgYWhvcnJvX1BJQiwgZGlmZXJlbmNpYSkNCmxpYnJhcnkoRFQpICANCkRUOjpkYXRhdGFibGUoZGZfdGFibGEpDQpgYGANCg0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipDw7NkaWdvKiogIDwvRk9OVD4NCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KZGZfdGFibGEgPC0gZGZfYWhvcnJvICAlPiUNCiAgZmlsdGVyKFllYXIgPT0gMjAyMCkgJT4lDQogIGRyb3BfbmEoKSAlPiUNCiAgbXV0YXRlKGRpZmVyZW5jaWEgPSBhaG9ycm9fUElCIC0gbWVhbihhaG9ycm9fUElCICwgbmEucm0gPSBUUlVFKSkgJT4lDQogIHNlbGVjdCgnQ291bnRyeSBOYW1lJywgYWhvcnJvX1BJQiwgZGlmZXJlbmNpYSkNCmxpYnJhcnkoRFQpICANCkRUOjpkYXRhdGFibGUoZGZfdGFibGEpDQpgYGANCg0KDQojIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiBEaXN0cmlidWNpw7NuIGRlbCBhaG9ycm8gcHJpdmFkbyA8L0ZPTlQ+ey50YWJzZXR9DQoNClBlcm8sIGRlbnRybyBkZSBFc3Bhw7FhLCDCv2PDs21vIHNlIGRpc3RyaWJ1eWUgZWwgYWhvcnJvPyDCv0xlIGVzdGFtb3Mgc2FjYW5kbyB0b2RhIGxhIHJlbnRhYmlsaWRhZCBwb3NpYmxlPyBWZW1vcyBjb21vIGxhIG1heW9yIHBhcnRlIGRlbCBhaG9ycm8gc2UgZGlzdHJpYnV5ZSBlbiBjYXBpdGFsIChhY2Npb25lcyB5IHBhcnRpY2lwYWNpb25lcyksIGVmZWN0aXZvIHkgZGVww7NzaXRvcywgdmFsb3JlcyByZXByZXNlbnRhdGl2b3MgZGUgZGV1ZGEgKGJvbm9zLCBvYmxpZ2FjaW9uZXMsIHBhZ2Fyw6lzLCBldGMuKSB5IHByw6lzdGFtb3MuIEVsIGFjdGl2byBtw6FzIHJlbnRhYmxlIGhpc3TDs3JpY2FtZW50ZSBzb24gbGFzIGFjY2lvbmVzLCBwb3IgbG8gcXVlIG5vIGVzdMOhIG1hbCBlbiBlc2Ugc2VudGlkbywgYXVucXVlIGhhYnLDrWEgcXVlIGFuYWxpemFyIGVuIHF1w6kgYWNjaW9uZXMgc2UgaW52aWVydGUgcHJpbmNpcGFsbWVudGUgeSBjdcOhbiByZW50YWJsZXMgc29uIGVzdGFzIHBhcmEgc2FjYXIgdW5hIGNvbmNsdXNpw7NuLiBQb3Igb3RybyBsYWRvLCBlbCBlZmVjdGl2byB5IGxvcyBkZXDDs3NpdG9zIHNvbiBsb3MgYWN0aXZvcyBtZW5vcyByZW50YWJsZXMgcG9zaWJsZXMgKG51bGEgbyBuZWdhdGl2YSBzaSBjb250YW1vcyBsYSBpbmZsYWNpw7NuKS4NCg0KPENFTlRFUj4NCirCv1kgcXXDqSBzaWduaWZpY2EgZXN0bz8qICoqUmVudGFiaWxpZGFkIGluc3VmaWNpZW50ZSoqDQo8L0NFTlRFUj4NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCmcxIDwtIGdncGxvdChkZl9hbHRlcm5hdGl2YXNfMiwgYWVzKHg9MSwgeT1wb3JjZW50YWplLCBmaWxsPSBBY3Rpdm9zKSkgKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChwb3JjZW50YWplLDEpLCIlIikpLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogIGNvb3JkX3BvbGFyKHRoZXRhID0gInkiKSArIA0KICB0aGVtZV92b2lkKCkrbGFicyh0aXRsZSA9ICJBaG9ycm8gcHJpdmFkbyBlbiAyMDIwIiwgeCA9IE5VTEwsDQogICAgc3VidGl0bGUgPSAiRGF0b3MgZXh0cmFpZG9zIGRlbCBCYW5jbyBkZSBFc3Bhw7FhIikNCg0KZzEgIA0KDQpgYGANCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICAqKkPDs2RpZ28qKiAgPC9GT05UPg0KDQpgYGB7ciwgZXZhbCA9IEZBTFNFLCBlY2hvID0gVFJVRX0NCg0KZzEgPC0gZ2dwbG90KGRmX2FsdGVybmF0aXZhc18yLCBhZXMoeD0xLCB5PXBvcmNlbnRhamUsIGZpbGw9IEFjdGl2b3MpKSArDQogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGFzdGUwKHJvdW5kKHBvcmNlbnRhamUsMSksIiUiKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsgDQogIHRoZW1lX3ZvaWQoKStsYWJzKHRpdGxlID0gIkFob3JybyBwcml2YWRvIGVuIDIwMjAiLCB4ID0gTlVMTCwNCiAgICBzdWJ0aXRsZSA9ICJEYXRvcyBleHRyYWlkb3MgZGVsIEJhbmNvIGRlIEVzcGHDsWEiKQ0KDQpnMSANCg0KYGBgDQogDQo8YnI+DQo8YnI+DQo8YnI+DQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IEV2b2x1Y2nDs24gZGVsIGFob3JybyBwcml2YWRvIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KRW4gZXN0ZSBncsOhZmljbyBvYnNlcnZhbW9zIGVsIGNyZWNpbWllbnRvIGRlIGxhcyBkaWZlcmVudGVzIHBhcnRpZGFzIGR1cmFudGUgbG9zIMO6bHRpbW9zIDIwIGHDsW9zLCBlcyBpbnRlcmVzYW50ZSBjb21vIGVsIGNhcGl0YWwgaGEgY3JlY2lkbyBtw6FzIHF1ZSBlbCByZXN0byBkZSBwYXJ0aWRhcywgYXVucXVlIGNvbiBtYXlvciB2b2xhdGlsaWRhZCwgeWEgcXVlIHNlIHB1ZWRlIGFwcmVjaWFyIGxhIGNhw61kYSBlbiBsb3MgYcOxb3MgZGUgY3Jpc2lzICgyMDA4LTIwMTQpLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKirCv2NhbWlubyBjb3JyZWN0bz8qKg0KPC9DRU5URVI+DQoNCmBgYHtyLCBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0KDQpwbG90X2RpbmFtaWNvIDwtIGRmX2FsdGVybmF0aXZhc18zICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBBY3Rpdm9zLCANCiAgICAgICAgICAgICB5ID0gTWlsZXNfZGVfZXVyb3MsIA0KICAgICAgICAgICAgIGZpbGw9IEFjdGl2b3MgKSkgKw0KICBnZW9tX2JhcihzdGF0PSAiaWRlbnRpdHkiLCANCiAgICAgICAgICAgY29sb3IgPSAiZ3JleSIsIA0KICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBhcy5udW1lcmljKE1pbGVzX2RlX2V1cm9zKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjaygpLCANCiAgICAgICAgICAgIHZqdXN0PSAxLA0KICAgICAgICAgICAgaGp1c3Q9IC0wLjEsDQogICAgICAgICAgICBzaXplID0gNCwgDQogICAgICAgICAgICBjb2xvciA9ICJibGFjayIpKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJvcmFuZ2UiLCAiZGFya2dyZXkiLCAiZ3JlZW4iLCAicmVkIiwgImJsdWUiLCAieWVsbG93IiwgInB1cnBsZSIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OmNvbW1hKSArDQogIHRoZW1lX21pbmltYWwoKSsNCiAgZW50ZXJfYXBwZWFyKCkgKw0KICB0cmFuc2l0aW9uX3N0YXRlcyh5ZWFyLCANCiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbl9sZW5ndGggPSA1LCANCiAgICAgICAgICAgICAgICAgICAgc3RhdGVfbGVuZ3RoID0gNSkgKw0KICBsYWJzKHRpdGxlID0gIiBWb2x1bWVuIGRlIGxvcyBhY3Rpdm9zIGZpbmFuY2llcm9zIHBvciBhw7FvIFxuIFllYXIgOiB7Y2xvc2VzdF9zdGF0ZX0iLCANCiAgICAgICBzdWJ0aXRsZSA9ICJFbiBtaWxlcyBkZSBldXJvcyIsDQogICAgICAgeSA9ICIiLA0KICAgICAgIHggPSAiIiwNCiAgICAgICBjYXB0aW9uID0gIkJhbmNvIGRlIEVzcGHDsWEiKSArDQogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAiYm9sZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMC41KSwNCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlID0gInBsYWluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpKSArIGNvb3JkX2ZsaXAoKQ0KDQpwbG90X2RpbmFtaWNvDQoNCmBgYA0KDQoNCiMjIyA8Rk9OVCBDT0xPUj0iQmxhY2siPiAgKipDw7NkaWdvKiogIDwvRk9OVD4NCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IFRSVUV9DQoNCnBsb3RfZGluYW1pY28gPC0gZGZfYWx0ZXJuYXRpdmFzXzMgJT4lDQogIGdncGxvdChhZXMoeCA9IEFjdGl2b3MsIA0KICAgICAgICAgICAgIHkgPSBNaWxlc19kZV9ldXJvcywgDQogICAgICAgICAgICAgZmlsbD0gQWN0aXZvcyApKSArDQogIGdlb21fYmFyKHN0YXQ9ICJpZGVudGl0eSIsIA0KICAgICAgICAgICBjb2xvciA9ICJncmV5IiwgDQogICAgICAgICAgIHNob3cubGVnZW5kID0gRkFMU0UpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGFzLm51bWVyaWMoTWlsZXNfZGVfZXVyb3MpKSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKCksIA0KICAgICAgICAgICAgdmp1c3Q9IDEsDQogICAgICAgICAgICBoanVzdD0gLTAuMSwNCiAgICAgICAgICAgIHNpemUgPSA0LCANCiAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikrDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIm9yYW5nZSIsICJkYXJrZ3JleSIsICJncmVlbiIsICJyZWQiLCAiYmx1ZSIsICJ5ZWxsb3ciLCAicHVycGxlIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6Y29tbWEpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBlbnRlcl9hcHBlYXIoKSArDQogIHRyYW5zaXRpb25fc3RhdGVzKHllYXIsIA0KICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uX2xlbmd0aCA9IDUsIA0KICAgICAgICAgICAgICAgICAgICBzdGF0ZV9sZW5ndGggPSA1KSArDQogIGxhYnModGl0bGUgPSAiIFZvbHVtZW4gZGUgbG9zIGFjdGl2b3MgZmluYW5jaWVyb3MgcG9yIGHDsW8gXG4gWWVhciA6IHtjbG9zZXN0X3N0YXRlfSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkVuIG1pbGVzIGRlIGV1cm9zIiwNCiAgICAgICB5ID0gIiIsDQogICAgICAgeCA9ICIiLA0KICAgICAgIGNhcHRpb24gPSAiQmFuY28gZGUgRXNwYcOxYSIpICsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGp1c3QgPSAwLjUpLA0KICAgICAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UgPSAicGxhaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdCA9IDAuNSkpICsgY29vcmRfZmxpcCgpDQoNCnBsb3RfZGluYW1pY28NCg0KYGBgDQoNCiMjIDxGT05UIENPTE9SPSJCbGFjayI+IERpc3RyaWJ1Y2nDs24gYWNjaW9uZXMgeSBkZXDDs3NpdG9zIDwvRk9OVD57LnRhYnNldH0NCg0KIyMjIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQW7DoWxpc2lzKiogIDwvRk9OVD4NCg0KUGVybywgZGVudHJvIGRlIEVzcGHDsWEsIMK/Y8OzbW8gc2UgZGlzdHJpYnV5ZSBlbCBhaG9ycm8/IMK/TGUgZXN0YW1vcyBzYWNhbmRvIHRvZGEgbGEgcmVudGFiaWxpZGFkIHBvc2libGU/IFZlbW9zIGNvbW8gbGEgbWF5b3IgcGFydGUgZGVsIGFob3JybyBzZSBkaXN0cmlidXllIGVuIGNhcGl0YWwgKGFjY2lvbmVzIHkgcGFydGljaXBhY2lvbmVzKSwgZWZlY3Rpdm8geSBkZXDDs3NpdG9zLCB2YWxvcmVzIHJlcHJlc2VudGF0aXZvcyBkZSBkZXVkYSAoYm9ub3MsIG9ibGlnYWNpb25lcywgcGFnYXLDqXMsIGV0Yy4pIHkgcHLDqXN0YW1vcy4gRWwgYWN0aXZvIG3DoXMgcmVudGFibGUgaGlzdMOzcmljYW1lbnRlIHNvbiBsYXMgYWNjaW9uZXMsIHBvciBsbyBxdWUgbm8gZXN0w6EgbWFsIGVuIGVzZSBzZW50aWRvLCBhdW5xdWUgaGFicsOtYSBxdWUgYW5hbGl6YXIgZW4gcXXDqSBhY2Npb25lcyBzZSBpbnZpZXJ0ZSBwcmluY2lwYWxtZW50ZSB5IGN1w6FuIHJlbnRhYmxlcyBzb24gZXN0YXMgcGFyYSBzYWNhciB1bmEgY29uY2x1c2nDs24uIFBvciBvdHJvIGxhZG8sIGVsIGVmZWN0aXZvIHkgbG9zIGRlcMOzc2l0b3Mgc29uIGxvcyBhY3Rpdm9zIG1lbm9zIHJlbnRhYmxlcyBwb3NpYmxlcyAobnVsYSBvIG5lZ2F0aXZhIHNpIGNvbnRhbW9zIGxhIGluZmxhY2nDs24pLg0KDQo8Q0VOVEVSPg0KKsK/WSBxdcOpIHNpZ25pZmljYSBlc3RvPyogKipSZW50YWJpbGlkYWQgaW5zdWZpY2llbnRlKioNCjwvQ0VOVEVSPg0KYGBge3IsIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQoNCnNrZXRjaCA9IGh0bWx0b29sczo6d2l0aFRhZ3ModGFibGUoDQogIGNsYXNzID0gJ2Rpc3BsYXknLA0KICB0aGVhZCgNCiAgICB0cih0aChyb3dzcGFuID0gMiwgJ0HDsW8nKSwNCiAgICAgIHRoKGNvbHNwYW4gPSAzLCAnQWNjaW9uZXMnKSwNCiAgICAgIHRoKGNvbHNwYW4gPSAyLCAnRWZlY3Rpdm8geSBkZXDDs3NpdG9zJykpLA0KICAgIHRyKGxhcHBseShyZXAoYygnY290aXphZGFzJywgJ25vIGNvdGl6YWRhcycsICdwYXJ0aWNpcGFjaW9uZXMnLCAnZWZlY3Rpdm8nLCAnZGVww7NzaXRvcycpLCAxKSwgdGgpDQogICAgKQ0KICApDQopKQ0KDQoNCmRmX2FsdGVybmF0aXZhc181IDwtIGRmX2FsdGVybmF0aXZhc180JT4lDQogIHNlbGVjdCgtYygiYWNjaW9uZXMiLCAiZWZlY3Rpdm9feV9kZXBvc2l0b3MiKSkNCmRhdGF0YWJsZShkZl9hbHRlcm5hdGl2YXNfNSwgY29udGFpbmVyID0gc2tldGNoLCByb3duYW1lcyA9IEZBTFNFKSAgDQoNCmBgYA0KDQojIyMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gICoqQ8OzZGlnbyoqICA8L0ZPTlQ+DQoNCmBgYHtyLCBldmFsID0gRkFMU0UsIGVjaG8gPSBUUlVFfQ0KDQpza2V0Y2ggPSBodG1sdG9vbHM6OndpdGhUYWdzKHRhYmxlKA0KICBjbGFzcyA9ICdkaXNwbGF5JywNCiAgdGhlYWQoDQogICAgdHIodGgocm93c3BhbiA9IDIsICdBw7FvJyksDQogICAgICB0aChjb2xzcGFuID0gMywgJ0FjY2lvbmVzJyksDQogICAgICB0aChjb2xzcGFuID0gMiwgJ0VmZWN0aXZvIHkgZGVww7NzaXRvcycpKSwNCiAgICB0cihsYXBwbHkocmVwKGMoJ2NvdGl6YWRhcycsICdubyBjb3RpemFkYXMnLCAncGFydGljaXBhY2lvbmVzJywgJ2VmZWN0aXZvJywgJ2RlcMOzc2l0b3MnKSwgMSksIHRoKQ0KICAgICkNCiAgKQ0KKSkNCnByaW50KHNrZXRjaCkNCg0KZGZfYWx0ZXJuYXRpdmFzXzUgPC0gZGZfYWx0ZXJuYXRpdmFzXzQlPiUNCiAgc2VsZWN0KC1jKCJhY2Npb25lcyIsICJlZmVjdGl2b195X2RlcG9zaXRvcyIpKQ0KZGF0YXRhYmxlKGRmX2FsdGVybmF0aXZhc181LCBjb250YWluZXIgPSBza2V0Y2gsIHJvd25hbWVzID0gRkFMU0UpICANCg0KYGBgDQoNCg0KDQojIDxGT05UIENPTE9SPSJCbGFjayI+ICoqQ29uY2x1c2lvbmVzKiogPC9GT05UPg0KDQpFbnRvbmNlcyDCv2VzIHZpYWJsZSBlbCBzaXN0ZW1hIGRlIHBlbnNpb25lcyBlbiBFc3Bhw7FhPyDCv3F1w6kgb2N1cnJpcsOhIGRlbnRybyBkZSAyMCBhw7Fvcz8gQnVlbm8sIGNvbW8gaGVtb3MgcG9kaWRvIGFuYWxpemFyLCBleGlzdGVuIHByZW9jdXBhbnRlcyBkYXRvcyBlbiBjdWFudG8gYSBsbyBxdWUgZWwgc2lzdGVtYSBzZSByZWZpZXJlLiBMYXMgYWxhcm1hcyBzdWVuYW4gY3VhbmRvIGFuYWxpemFtb3MgbGFzIHZhcmlhYmxlcyBkZW1vZ3LDoWZpY2FzLCBkb25kZSBlbCBiYWJ5IGJvb20gZGUgbG9zIGHDsW9zIGHDsW9zIDYwIGVuIHJlbGFjacOzbiBjb24gbGEgcmVkdWNjacOzbiBjb25zdGFudGUgZGUgbGEgbmF0YWxpZGFkIGRlIGxvcyDDumx0aW1vcyAzMC00MCBhw7FvcyBoYWNlbiBwcmV2ZXIgdW4gbsO6bWVybyBkZSBqdWJpbGFkb3MgZnV0dXJvcyBxdWUgcHVlZGUgbGxlZ2FyIGEgc2VyIGluc29zdGVuaWJsZS4gDQoNCg0KRWwgbWVyY2FkbyBsYWJvcmFsIG5vIGRlamEgbWVqb3JlcyBpbXByZXNpb25lcywgY29uIHRhc2FzIGRlIHBhcm8gYWx0w61zaW1hcyB5IGVtcGxlbyBkZW1hc2lhZG8gYmFqbyBlbnRyZSBsYXMgcGVyc29uYXMgZGUgMjAgeSAzMCBhw7Fvcy4gRXN0ZSBkYXRvIHB1ZWRlIGFmZWN0YXIgYSBsYSB0YXNhIGRlIG5hdGFsaWRhZCBkZWwgZnV0dXJvLCB5YSBxdWUgc2kgZXN0b3MgZ3J1cG9zIGRlIGVkYWQgbm8gdGllbmVuIHVuYSBlc3RhYmlsaWRhZCBlY29uw7NtaWNhIGVzIHByb2JhYmxlIHF1ZSBwb3Nwb25nYW4gbGEgZGVjaXNpw7NuIGRlIHRlbmVyIGhpam9zIG8sIGluY2x1c28sIGxhIGRlc2VzdGltZW4uIFBlcm8sIGFkZW3DoXMgZGUgZXNvLCDCv3F1acOpbiB2YSBhIHBhZ2FyIGxhcyBwZW5zaW9uZXMgZGVudHJvIGRlIDIwIGHDsW9zIHNpIGxvcyBxdWUgaG95IHRpZW5lbiAzMCBubyB0aWVuZW4gdHJhYmFqbz8NCg0KDQpMYSBmaW5hbmNpYWNpw7NuIGRlIGxhcyBwZW5zaW9uZXMgdGFtcG9jbyBhcnJvamEgc2XDsWFsZXMgcG9zaXRpdmFzLCB5YSBxdWUgZHVyYW50ZSBsYSBjcmlzaXMgZWwgZm9uZG8gZGUgcmVzZXJ2YSBzZSByZWR1am8gY29uc2lkZXJhYmxlbWVudGUgeSwgYWRlbcOhcywgbGEgdGFzYSBkZSBjb2JlcnR1cmEgbm8gZGVqYSBkZSBhdW1lbnRhci4gDQoNCg0KWSBsYXMgYWx0ZXJuYXRpdmFzIG5vIG5vcyBkZWphbiBkYXRvcyBkZWwgdG9kbyBob3JyaWJsZXMsIHBlcm8gc2lndWVuIHNpbiBlc3RhciBhIG5pdmVsZXMgZGUgbG9zIG1lam9yZXMgc2lzdGVtYXMgZGUgcGVuc2lvbmVzIGRlbCBtdW5kbywgYWRlbcOhcyBkZSB1biBleGNlc2l2byBwZXNvIGVuIGVsIGFob3JybyBkZSBsb3MgZGVww7NzaXRvcyB5IGVsIGVmZWN0aXZvLiANClBvciB0b2RvIGVzdG8sIG51ZXN0cmEgY29uY2x1c2nDs24gZXMgcXVlIGhheSBzdWZpY2llbnRlcyBhbGFybWFzIHBhcmEsIGFsIG1lbm9zLCBwcmVvY3VwYXJzZSB5IGhhY2Vyc2UgY2llcnRhcyBwcmVndW50YXMuIMK/Q29uZmlhbW9zIGVuIHF1ZSBkZW50cm8gZGUgMTUsIDIwIGHDsW9zLCBjdWFuZG8gbnVlc3Ryb3MgcGFkcmVzIHNlIGp1YmlsZW4sIHRlbmRyw6FuIHVuYSBwZW5zacOzbiBww7pibGljYSBkaWduYSBjb21vIG1lcmVjZW4/IMK/bGEgdGVuZHJlbW9zIG5vc290cm9zIGRlbnRybyBkZSA0MCBhw7Fvcz8gwr9xdcOpIHNvbHVjaW9uZXMgcG9kZW1vcyBlbmNvbnRyYXIgY29tbyBpbmRpdmlkdW9zIHBhcnRpY3VsYXJlcz8gwr95IHF1w6kgZGVjaXNpb25lcyBwdWVkZSB0b21hciBlbCBFc3RhZG8/DQoNCjxicj48YnI+DQoNCiMgPEZPTlQgQ09MT1I9IkJsYWNrIj4gKipCaWJsaW9ncmFmw61hKio8L0ZPTlQ+DQoNClBhcmEgbGEgcmVhbGl6YWNpw7NuIGRlIG51ZXN0cm8gdHJhYmFqbyBub3MgaGVtb3MgYmFzYWRvIGVuIGxhcyBzaWd1aWVudGVzIHDDoWdpbmFzIHdlYiB5IGJhc2VzIGRlIGRhdG9zOg0KDQpbSU5FXShodHRwczovL3d3dy5pbmUuZXMvaW5kZXguaHRtKQ0KDQpbQkJWQVJlc2VhcmNoXShodHRwczovL3d3dy5iYnZhcmVzZWFyY2guY29tLykNCg0KW1dlYiBkZWwgQ3Vyc29dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIxLTIyLXdlYi8wNC10dXRvcmlhbGVzLmh0bWwpDQoNCltnZ2FuaW1hdGVdKGh0dHBzOi8vZ2dhbmltYXRlLmNvbS8pDQoNCltCYW5jbyBkZSBFc3Bhw7FhXShodHRwczovL3d3dy5iZGUuZXMvYmRlL2VzLykNCg0KDQo8YnI+PGJyPg0KDQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQo8aHIgY2xhc3M9ImxpbmVhLXJlZCI+DQoNCg0KYGBge3IsIGVjaG8gPSBGQUxTRX0NCnNlc3Npb25pbmZvOjpzZXNzaW9uX2luZm8oKSAlPiUgZGV0YWlsczo6ZGV0YWlscyhzdW1tYXJ5ID0gJ0luZm9ybWFjacOzbiBkZSBtaSBSLXNlc2nDs246JykgDQpgYGANCg0KDQo8YnI+PGJyPg0KDQo8ZGl2IGNsYXNzPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIGRhdGEtdW5pcXVlPSJ0b2NpZnktZXh0ZW5kLXBhZ2UiIHN0eWxlPSJoZWlnaHQ6IDA7Ij48L2Rpdj4NCg==