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 2020-2021. La página web de la asignatura puede verse aquí: https://perezp44.github.io/intro-ds-20-21-web/. Los trabajos de mis compañeros de curso pueden verse aquí.



1. Introducción

En el siguiente trabajo, vamos a hablar sobre los PIGS.

Algunos se preguntarán, ¿qué es eso de los PIGS? Pues ahora lo vamos a intentar explicar.

PIGS es un acrónimo con connotación negativa (cerdo en castellano), que se usó durante el período de la Gran Recesión para referirse a los países de Europa del Sur, Portugal, Italia, Grecia y España que en ese momento estaban sufriendo con más severidad la crisis económica, más concretamente en cuanto a la deuda pública.

2. Objetivo del trabajo

El objetivo del trabajo es analizar algunos datos económicos y sociales que consideramos relevantes de los países que forman parte del grupo de los PIGS comparándolo con los datos de Alemania y Reino Unido.

Hemos elegido estos dos países puesto que, por un lado Alemania, suele utilizarse como el ejemplo a seguir, y el Reino Unido, ya que en fue en este país, más concretamente los periódicos económicos, donde surgió y más se utilizó esta manera despectiva de hablar sobre los países de la Europa Meridional.

2.1. El caso de Irlanda

Dentro de este grupo conocido como PIGS, en ocasiones también se solía incluir a la República de Irlanda, ya que su situación económica era bastante mala. Sin embargo, hemos decidido no incorporar a este país al análisis ya que su consideración de “semi-paraiso fiscal”, y su repentino crecimiento del PIB en un 25% en un año, hacen que el análisis se hubieran desvirtuado.

3. Comparación

En esta parte del trabajo, pretendemos, elegir distintas variables que consideremos interesantes para así intentar a través de distintos gráficos y tablas, observar las diferencias si las hubiera entre los países del sur de Europa con respecto a Alemania y Reino Unido.

En definitiva, lo que buscamos, es ver si se puede tratar de manera homogénea a este grupo de países, y si verdaderamente hay tanta diferencia entre los PIGS y los países supuestamente “ejemplares”.

3.1. Materia Económica

3.1.1. PIB per cápita

El primer indicador que vamos a utilizar es el PIB per cápita.

Probablemente este sea el dato económico más popular y más representativo del desarrollo y el bienestar de un país. En él se muestra la relación entre el total del PIB de un país y su población.

Pese a esto, somos conscientes que el dato del PIB per capita no es perfecto, y que la renta no está equitativamente distribuida. Sin embargo, debemos admitir que sigue siendo uno de los datos más útiles para analizar el bienestar social de un país.

Pib_per_capita <- get_eurostat("sdg_08_10")

ppc <- Pib_per_capita %>% filter(unit %in% c("CLV10_EUR_HAB"))%>% select(geo, time, values) 

ppc_paises <- ppc %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK"))

graf <- ggplot(ppc_paises, aes(x=time, y=values, group=geo, color=geo)) +
  geom_point() +
  geom_line() +
  scale_color_manual(values=c("darkblue","red", "gold", "green", "grey", "brown", "orange"))  +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title= "Progresión PIB per cápita",
    subtitle = "Los PIGS vs Alemania y Reino Unido")
  
graf 

ggplot(ppc_paises, aes(x=time, y=values, group=geo, color=geo)) +
  geom_point(alpha=0.6) +
  geom_abline(intercept=0, slope=1, linetype="dashed") +
  geom_smooth(method="lm", se=FALSE) +
  labs(title = "Crecimiento PIB per cápita", subtitle = "PIGS vs Alemania y Reino Unido") +
  theme(plot.title = element_text(hjust = 0.5)) +
  guides(color=guide_legend(reverse=TRUE))    

Teniendo en cuenta los gráficos, se puede observar como en relación con el PIB per cápita que sí existen diferencias.

Alemania y Reino Unido serían los países con mayor renta por habitante, tras estos, en una posición intermedia se encontrarían Italia y España. Y finalmente, con una renta ligeramente inferior, Portugal y Grecia.

3.1.2. Desempleo

El segundo indicador que vamos a comparar es la tasa de paro o desempleo.

El desempleo consiste en un desajuste en el mercado laboral, en el que la demanda de trabajo (las empresas) es menor que la oferta (los trabajadores). Esto es, cuando existen más personas dispuestas a ofrecer su trabajo a las empresas que puestos de trabajo disponibles en ese momento.

Poseer una alta tasa de desempleo supone un problema importante para un país ya que afecta de manera directa al crecimiento económico y al desarrollo del país. Además, las consecuencias de una tasa de paro elevada,tienen un fuerte carácter económicas en cuanto a la disminución de la producción real, la reducción de la demanda o el aumento del déficit público, pero tampoco podemos olvidarnos de los efectos de caracter social, como los problemas psicológicos o la pérdida de capital humano.

paro_pais<- get_eurostat("tps00203")

paro_orden <- paro_pais %>% filter(unit %in% c("PC_ACT"))%>% select(geo, time, values) 
                      
piigs <- paro_orden %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK"))

cerdos <- ggplot(piigs, aes(x=time, y=values, group=geo, color=geo)) +
  geom_point() +
  geom_line() +
  scale_color_manual(values=c("darkblue","red", "gold", "green", "grey", "orange"))  +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title="Desempleo", subtitle="Los PIGS vs Alemania y Reino Unido")

cerdos




tambienUE <- paro_orden %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK"))


conjunto <- ggplot(tambienUE, aes(x=Años, y=desempleovalues, group=geo, color=geo)) +
  geom_point() +
  geom_line() +
  scale_color_manual(values=c("darkblue","red", "gold", "green", "grey", "brown", "orange"))  +
  theme(plot.title = element_text(hjust = 0.5)) +
  labs(title="Los PIGS vs ")



ggplot(tambienUE , aes(x = time,  y = values, color= geo))+ geom_point() + ylim(c(NA, 30)) + 
  labs(title = "Desempleo", subtitle = "Los PIGS vs Alemania y Reino Unido", x = "Años",
       y = "Desempleo")+ theme(axis.line = element_line(color = "orange",size=1))+
  theme(panel.background=element_blank())+
  theme(axis.text = element_text(size = 8,face="bold"),
        plot.title = element_text(size=16,face = "bold"))+  gghighlight::gghighlight() + 
  facet_wrap(vars(geo))

Una vez observados los gráficos, volvemos a encontrar diferencias entre los PIGS y Alemania y el Reino Unido.

En este caso, observamos como las tasas de paro de España y Grecia han llegado a ser verdaderamente altas, llegando a superar, en los peores años de la crisis(2013), el 25%. En una posición intermedia, estarían Italia y Portugal, mientras que Alemania y Reino Unido tienen unas cifras bastante bajas, prácticamente, sin superar en ningún momento el 10%

3.2 Materia Social

3.2.1. Gasto en Protección Social

El tercer indicador que hemos escogido es el porcentaje del PIB que representa el Gasto Social en relación con el PIB. Esto es, que porcentaje del PIB se dedica a Protección Social.

El gasto en protección social es aquella partida del presupuesto que el Estado destina a satisfacer las necesidades básicas de los ciudadanos. Esto es, aquellas necesidades básicas que son imprescindibles para lograr una vida digna, sana, prolongada, creativa y productiva. El gasto social es el instrumento a través del cual se ayuda a lograr la igualdad de oportunidades a aquellos ciudadanos que se encuentran en una peor situación.



prosoc <- get_eurostat("spr_exp_sum")

prot <- prosoc %>% filter(unit %in% c("PC_GDP")) %>% filter(spdeps %in% c("TOTALNOREROUTE")) %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK")) 

prote <- ggplot(prot, aes(x=time, y=values, color = geo)) + geom_line() + facet_grid(rows = vars(geo)) +
labs(title = "Evolución del Gasto en Protección Social en relación con el PIB")

prote

ggplot(prot, aes(x=time, y=values, group=geo, color=geo)) +
  geom_point(alpha=0.6) +
  geom_abline(intercept=0, slope=1, linetype="dashed") +
  geom_smooth(method="lm", se=FALSE) +
  labs(title = "Crecimiento del Gasto en Protección Social", subtitle = "PIGS vs Alemania y Reino Unido") +
  theme(plot.title = element_text(hjust = 0.5)) +
  guides(color=guide_legend(reverse=TRUE))  

Observando los gráficos podemos observar como los PIGS, a finales de los 90s el gasto social era bastante menor que el de Reino Unido y sobre todo, Alemania. Sin embargo, la tendencia desde el inicio del siglo XXI ha sido la de la convergencia hacia unos valores de Gasto Social similares, de aproximadamente un cuarta parte del PIB.

3.2.2. Exclusión social

Este indicador muestra la cantidad de personas que se encuentran en una situación de riesgo de exclusión social. Esto es, la falta de participación por parte de ciudadanos en la vida cultural, económica y social de sus respectivas sociedades debido a la carencia de los derechos, recursos y capacidades básicas factores que hacen posible una participación social plena.

Según la Comisión Europea una persona está en riesgo de pobreza y exclusión social si cumplen con los siguentes puntos.

  1. Cuando no alcanza un 60 % del Salario mínimo del país, pese a percibir ayudas por parte del Estado.

  2. Cuando existe desempleo de larga duración en buena parte de los miembros de la familia.

  3. Cuando las personas no pueden acceder a más de la mitad de los siguientes items

  • Pagar el alquiler o las facturas de servicios públicos.
  • Calefacción adecuada.
  • No poder enfrentarse a gastos inesperados.
  • Comer Carne, Pescado o Proteínas equivalentes cada 2 días.
  • Una semana de vacaciones fuera de casa al año.
  • Un coche.
  • Una lavadora.
  • Una televisión en color.
  • Un teléfono.

exclusion <- get_eurostat ("ilc_peps01")

exc <-  exclusion %>% filter(unit %in% c("PC")) %>% filter(sex %in% c("T")) %>% filter(age %in% c("TOTAL")) %>% select(geo, time, values) 


exclu <- exc %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK"))


ggplot(exclu, aes(time, values, color = geo)) + geom_point() +  geom_smooth() + labs(title = "% de personas en riesgo de exclusión social", subtitle = "PIGS vs Alemania y Reino Unido")

Espa <- exclu %>% filter(time == "2019-01-01")

knitr::kable(Espa, align = "c", caption = "Datos de la exclusión social en la actualidad") %>% kableExtra::kable_styling(fixed_thead = list(enabled = T, background = "yellow"))
Datos de la exclusión social en la actualidad
geo time values
DE 2019-01-01 17.4
EL 2019-01-01 30.0
ES 2019-01-01 25.3
IT 2019-01-01 25.6
PT 2019-01-01 21.6

A diferencia de lo que ocurre en cuanto al porcentaje destinado a protección social, donde las cifras han convergido, en este apartado, sí que se observan diferencias notables con respecto a las personas en riesgo de pobreza y exclusión social. Por ejemplo, los datos de Alemania y Grecia divergen en más de un 10%.

Estos datos nos muestran que tal vez lo importante, no solo sea cuanto dinero se destina a la protección social, sino cómo y en qué se utiliza.

4. Conclusiones

En este breve trabajo hemos pretendido observar la trayectoria reciente, de los PIGS comparándolos con el Reino Unido y Alemania.

Queríamos, por una parte saber en que medida los PIGS eran homegéneos entre ellos. Así como, cotejar estos datos con esos países de Europa Central, que suelen ser considerados como “ejemplos a seguir”.

A lo largo de la investigación hemos mostrado gráficos de dos ámbitos distintos, del económico (PIB per cápita y Desempleo) y del social (Gasto social en relación con el PIB y Riesgo de pobreza y exclusión social).

Querríamos destacar que en líneas generales sí que se han observado diferencias entre los PIGS y los países de Europa del norte y central. Entre ellas, destacaríamos las divergencias en materia económica, en el PIB per cápita y en la tasa de paro. En el ámbito social, en cuanto al gasto destinado a protección social se puede observar una cierta convergencia en valores de aproximadamente, 25%, del total del PIB. Pese a esto, se mantienen las distancias en cuanto a porcentaje de personas que viven en riesgo de pobreza o exclusión social.

En definitiva, se puede afirmar en base a los datos, que persisten esas disparidades y diferencias entre los países del sur, PIGS y los del norte, Reino Unido y Alemania.

4.1. Satisfacción con la vida

Para finalizar el trabajo, hemos querido mostrar un gráfico en donde se compare una variable subjetiva como es la satisfacción con la vida. Y con ello poder observar si hay o no una correlación entre buenos datos macroeconoómicos y sociales con, la satisfacción vital.

satis <- get_eurostat("ilc_pw01")

vida <-  satis %>% filter(age %in% c("Y_GE16")) %>% filter(sex %in% c("T")) %>% filter(indic_wb %in% c("LIFESAT")) %>% filter(isced11 %in% c("TOTAL")) %>% filter(age %in% c("Y_GE16")) %>% select(geo, time, values) 


vivir <- vida %>% filter(geo %in% c("PT", "IT", "ES", "EL", "DE", "UK"))

mean <- vivir %>% group_by(geo) %>% summarize(mean(values))

mean <- mean %>% rename("mean" = "mean(values)")


meanb <- mean %>%
        mutate(GEO = forcats::fct_reorder(geo, mean, .desc=TRUE))

ggplot(meanb, aes(fct_rev(GEO), mean, fill=geo)) + geom_col() + labs(title = "Satisfacción con la vida", subtitle = "Valores medios", y="Media", x=NULL) +   scale_y_continuous(breaks = seq(0, 8, 2), limits = c(0, 10)) + theme_bw() 

Podemos decir que, aparemente, sí que hay cierta correlación, pero que a simple vista no parece que ésta sea muy fuerte.

5. Referencias

  • Database Eurostat
  • El trabajo Grupal realizado sobre los Juegos Olímpicos junto a mis compañeros Manuel Jiménez y Antonio Langa.
LS0tDQp0aXRsZTogIkxvcyBQSUdTIg0KYXV0aG9yOiAiTWFudWVsIFJvam8gTMOzcGV6IChyb2xvbWE2QGFsdW1uaS51di5lcykuIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSINCmRhdGU6ICJFbmVybyBkZSAyMDIxIChhY3R1YWxpemFkbyBlbCBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkLSVtLSVZJylgKSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0aGVtZTogcGFwZXINCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlIA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMyANCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiB0cnVlDQogICAgc2VsZl9jb250YWluZWQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlDQogICAgZGZfcHJpbnQ6IGthYmxlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KZWRpdG9yX29wdGlvbnM6IA0KICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQ0KLS0tDQoNCmBgYHtyIHBhY2thZ2VzLXNldHVwLCBpbmNsdWRlID0gRkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoa2xpcHB5KSAgIy0gcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoInJsZXN1ci9rbGlwcHkiKQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoZXVyb3N0YXQpDQpgYGANCg0KYGBge3IgY2h1bmstc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgZXZhbCA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCANCiAgICAgICAgICAgICAgICAgICAgICAjcmVzdWx0cyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IEZBTFNFLCBjYWNoZS5wYXRoID0gIi9jYWNoZXMvIiwgY29tbWVudCA9ICIjPiIsDQogICAgICAgICAgICAgICAgICAgICAgI2ZpZy53aWR0aCA9IDcsICNmaWcuaGVpZ2h0PSA3LCAgIA0KICAgICAgICAgICAgICAgICAgICAgICNvdXQud2lkdGggPSA3LCBvdXQuaGVpZ2h0ID0gNywNCiAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZSA9IFRSVUUsICBmaWcuc2hvdyA9ICJob2xkIiwNCiAgICAgICAgICAgICAgICAgICAgICBmaWcuYXNwID0gNy85LCBvdXQud2lkdGggPSAiNjAlIiwgZmlnLmFsaWduID0gImNlbnRlciIpDQprbml0cjo6b3B0c19jaHVuayRzZXQoZGV2ID0gInBuZyIsIGRldi5hcmdzID0gbGlzdCh0eXBlID0gImNhaXJvLXBuZyIpKQ0KYGBgDQoNCmBgYHtyIG9wdGlvbnMtc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KSAjLSBwYXJhIHF1aXRhciBsYSBub3RhY2nDs24gY2llbnTDrWZpY2ENCm9wdGlvbnMoInlhbWwuZXZhbC5leHByIiA9IFRSVUUpIA0KYGBgDQoNCg0KYGBge3Iga2xpcHB5LCBlY2hvID0gRkFMU0V9DQprbGlwcHk6OmtsaXBweShwb3NpdGlvbiA9IGMoInRvcCIsICJyaWdodCIpKSAjLSByZW1vdGVzOjppbnN0YWxsX2dpdGh1Yigicmxlc3VyL2tsaXBweSIpDQpgYGANCg0KLS0tLS0tLS0tLS0tLS0tLS0NCg0KVHJhYmFqbyBlbGFib3JhZG8gcGFyYSBsYSBhc2lnbmF0dXJhICJQcm9ncmFtYWNpw7NuIHkgbWFuZWpvIGRlIGRhdG9zIGVuIGxhIGVyYSBkZWwgQmlnIERhdGEiIGRlIGxhIFVuaXZlcnNpdGF0IGRlIFZhbMOobmNpYSBkdXJhbnRlIGVsIGN1cnNvIDIwMjAtMjAyMS4gTGEgcMOhZ2luYSB3ZWIgZGUgbGEgYXNpZ25hdHVyYSBwdWVkZSB2ZXJzZSBhcXXDrTogPGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8+LiBMb3MgdHJhYmFqb3MgZGUgbWlzIGNvbXBhw7Flcm9zIGRlIGN1cnNvIHB1ZWRlbiB2ZXJzZSBbYXF1w61dKGh0dHBzOi8vcGVyZXpwNDQuZ2l0aHViLmlvL2ludHJvLWRzLTIwLTIxLXdlYi8wNy10cmFiYWpvcy5odG1sKS4NCg0KLS0tLS0tLS0tLS0tLS0tDQoNCjxicj4NCg0KIyAxLiBJbnRyb2R1Y2Npw7NuDQoNCkVuIGVsIHNpZ3VpZW50ZSB0cmFiYWpvLCB2YW1vcyBhIGhhYmxhciBzb2JyZSBsb3MgUElHUy4gDQoNCkFsZ3Vub3Mgc2UgcHJlZ3VudGFyw6FuLCDCv3F1w6kgZXMgZXNvIGRlIGxvcyBQSUdTPyANClB1ZXMgYWhvcmEgbG8gdmFtb3MgYSBpbnRlbnRhciBleHBsaWNhci4gDQoNCg0KUElHUyBlcyB1biBhY3LDs25pbW8gY29uIGNvbm5vdGFjacOzbiBuZWdhdGl2YSAoY2VyZG8gZW4gY2FzdGVsbGFubyksIHF1ZSBzZSB1c8OzIGR1cmFudGUgZWwgcGVyw61vZG8gZGUgbGEgR3JhbiBSZWNlc2nDs24gcGFyYSByZWZlcmlyc2UgYSBsb3MgcGHDrXNlcyBkZSBFdXJvcGEgZGVsIFN1ciwgUG9ydHVnYWwsIEl0YWxpYSwgR3JlY2lhIHkgRXNwYcOxYSBxdWUgZW4gZXNlIG1vbWVudG8gZXN0YWJhbiBzdWZyaWVuZG8gY29uIG3DoXMgc2V2ZXJpZGFkIGxhIGNyaXNpcyBlY29uw7NtaWNhLCBtw6FzIGNvbmNyZXRhbWVudGUgZW4gY3VhbnRvIGEgbGEgZGV1ZGEgcMO6YmxpY2EuIA0KDQoNCg0KYGBge3IsIGV2YWwgPSBGQUxTRSwgZWNobyA9IEZBTFNFfQ0KcmlvOjpleHBvcnQodW5lbSwgIi4vZGF0b3MvdW5lbS54bHMiKQ0KYGBgDQoNCmBgYHtyIGV2YWwgPSBUUlVFLCBlY2hvID0gRkFMU0V9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJpbWFnZW5lcyIsICJwaWdzMS5qcGciKSkNCmBgYA0KDQojIDIuIE9iamV0aXZvIGRlbCB0cmFiYWpvDQoNCkVsIG9iamV0aXZvIGRlbCB0cmFiYWpvIGVzIGFuYWxpemFyIGFsZ3Vub3MgZGF0b3MgZWNvbsOzbWljb3MgeSBzb2NpYWxlcyBxdWUgY29uc2lkZXJhbW9zIHJlbGV2YW50ZXMgZGUgbG9zICBwYcOtc2VzIHF1ZSBmb3JtYW4gcGFydGUgZGVsIGdydXBvIGRlIGxvcyBQSUdTIGNvbXBhcsOhbmRvbG8gY29uIGxvcyBkYXRvcyBkZSBBbGVtYW5pYSB5IFJlaW5vIFVuaWRvLiANCg0KSGVtb3MgZWxlZ2lkbyBlc3RvcyBkb3MgcGHDrXNlcyBwdWVzdG8gcXVlLCBwb3IgdW4gbGFkbyBBbGVtYW5pYSwgc3VlbGUgdXRpbGl6YXJzZSBjb21vIGVsIGVqZW1wbG8gYSBzZWd1aXIsIHkgZWwgUmVpbm8gVW5pZG8sIHlhIHF1ZSBlbiBmdWUgZW4gZXN0ZSBwYcOtcywgbcOhcyBjb25jcmV0YW1lbnRlIGxvcyBwZXJpw7NkaWNvcyBlY29uw7NtaWNvcywgZG9uZGUgc3VyZ2nDsyAgeSBtw6FzIHNlIHV0aWxpesOzIGVzdGEgbWFuZXJhIGRlc3BlY3RpdmEgZGUgaGFibGFyIHNvYnJlIGxvcyBwYcOtc2VzIGRlIGxhIEV1cm9wYSBNZXJpZGlvbmFsLg0KDQojIyAqKjIuMS4gRWwgY2FzbyBkZSBJcmxhbmRhKioNCg0KRGVudHJvIGRlIGVzdGUgZ3J1cG8gY29ub2NpZG8gY29tbyBQSUdTLCBlbiBvY2FzaW9uZXMgdGFtYmnDqW4gc2Ugc29sw61hIGluY2x1aXIgYSBsYSBSZXDDumJsaWNhIGRlIElybGFuZGEsIHlhIHF1ZSBzdSBzaXR1YWNpw7NuIGVjb27Ds21pY2EgZXJhIGJhc3RhbnRlIG1hbGEuIFNpbiBlbWJhcmdvLCBoZW1vcyBkZWNpZGlkbyBubyBpbmNvcnBvcmFyIGEgZXN0ZSBwYcOtcyBhbCBhbsOhbGlzaXMgeWEgcXVlIHN1IGNvbnNpZGVyYWNpw7NuIGRlICJzZW1pLXBhcmFpc28gZmlzY2FsIiwgeSBzdSByZXBlbnRpbm8gY3JlY2ltaWVudG8gZGVsIFBJQiBlbiB1biAyNSUgZW4gdW4gYcOxbywgaGFjZW4gcXVlIGVsIGFuw6FsaXNpcyBzZSBodWJpZXJhbiBkZXN2aXJ0dWFkby4gDQoNCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltYWdlbmVzIiwgImlyZS5qcGciKSkNCmBgYA0KDQoNCiMgMy4gQ29tcGFyYWNpw7NuDQoNCkVuIGVzdGEgcGFydGUgZGVsIHRyYWJham8sIHByZXRlbmRlbW9zLCBlbGVnaXIgZGlzdGludGFzIHZhcmlhYmxlcyBxdWUgY29uc2lkZXJlbW9zIGludGVyZXNhbnRlcyBwYXJhIGFzw60gaW50ZW50YXIgYSB0cmF2w6lzIGRlIGRpc3RpbnRvcyBncsOhZmljb3MgeSB0YWJsYXMsIG9ic2VydmFyIGxhcyBkaWZlcmVuY2lhcyBzaSBsYXMgaHViaWVyYSBlbnRyZSBsb3MgcGHDrXNlcyBkZWwgc3VyIGRlIEV1cm9wYSBjb24gcmVzcGVjdG8gYSBBbGVtYW5pYSB5IFJlaW5vIFVuaWRvLiANCg0KRW4gZGVmaW5pdGl2YSwgbG8gcXVlIGJ1c2NhbW9zLCBlcyB2ZXIgc2kgc2UgcHVlZGUgdHJhdGFyIGRlIG1hbmVyYSBob21vZ8OpbmVhIGEgZXN0ZSBncnVwbyBkZSBwYcOtc2VzLCB5IHNpIHZlcmRhZGVyYW1lbnRlIGhheSB0YW50YSBkaWZlcmVuY2lhIGVudHJlIGxvcyBQSUdTIHkgbG9zIHBhw61zZXMgc3VwdWVzdGFtZW50ZSAiZWplbXBsYXJlcyIuIA0KDQoNCg0KIyMgKiozLjEuIE1hdGVyaWEgRWNvbsOzbWljYSoqDQoNCg0KYGBge3IgZXZhbCA9IFRSVUUsIGVjaG8gPSBGQUxTRX0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImltYWdlbmVzIiwgImVjby5qcGciKSkNCmBgYA0KDQojIyMgMy4xLjEuIFBJQiBwZXIgY8OhcGl0YQ0KDQpFbCBwcmltZXIgaW5kaWNhZG9yIHF1ZSB2YW1vcyBhIHV0aWxpemFyIGVzIGVsIFBJQiBwZXIgY8OhcGl0YS4NCg0KUHJvYmFibGVtZW50ZSBlc3RlIHNlYSBlbCBkYXRvIGVjb27Ds21pY28gbcOhcyBwb3B1bGFyIHkgbcOhcyByZXByZXNlbnRhdGl2byBkZWwgZGVzYXJyb2xsbyB5IGVsIGJpZW5lc3RhciBkZSB1biBwYcOtcy4gRW4gw6lsIHNlIG11ZXN0cmEgbGEgcmVsYWNpw7NuIGVudHJlIGVsIHRvdGFsIGRlbCBQSUIgZGUgdW4gcGHDrXMgeSBzdSBwb2JsYWNpw7NuLiANCg0KUGVzZSBhIGVzdG8sIHNvbW9zIGNvbnNjaWVudGVzIHF1ZSBlbCBkYXRvIGRlbCBQSUIgcGVyIGNhcGl0YSBubyBlcyBwZXJmZWN0bywgeSBxdWUgbGEgcmVudGEgbm8gZXN0w6EgZXF1aXRhdGl2YW1lbnRlIGRpc3RyaWJ1aWRhLiBTaW4gZW1iYXJnbywgZGViZW1vcyBhZG1pdGlyIHF1ZSBzaWd1ZSBzaWVuZG8gdW5vIGRlIGxvcyBkYXRvcyBtw6FzIMO6dGlsZXMgcGFyYSBhbmFsaXphciBlbCBiaWVuZXN0YXIgc29jaWFsIGRlIHVuIHBhw61zLiANCg0KDQpgYGB7cn0NClBpYl9wZXJfY2FwaXRhIDwtIGdldF9ldXJvc3RhdCgic2RnXzA4XzEwIikNCg0KcHBjIDwtIFBpYl9wZXJfY2FwaXRhICU+JSBmaWx0ZXIodW5pdCAlaW4lIGMoIkNMVjEwX0VVUl9IQUIiKSklPiUgc2VsZWN0KGdlbywgdGltZSwgdmFsdWVzKSANCg0KcHBjX3BhaXNlcyA8LSBwcGMgJT4lIGZpbHRlcihnZW8gJWluJSBjKCJQVCIsICJJVCIsICJFUyIsICJFTCIsICJERSIsICJVSyIpKQ0KDQpncmFmIDwtIGdncGxvdChwcGNfcGFpc2VzLCBhZXMoeD10aW1lLCB5PXZhbHVlcywgZ3JvdXA9Z2VvLCBjb2xvcj1nZW8pKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fbGluZSgpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJkYXJrYmx1ZSIsInJlZCIsICJnb2xkIiwgImdyZWVuIiwgImdyZXkiLCAiYnJvd24iLCAib3JhbmdlIikpICArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnModGl0bGU9ICJQcm9ncmVzacOzbiBQSUIgcGVyIGPDoXBpdGEiLA0KICAgIHN1YnRpdGxlID0gIkxvcyBQSUdTIHZzIEFsZW1hbmlhIHkgUmVpbm8gVW5pZG8iKQ0KICANCmdyYWYgDQoNCmdncGxvdChwcGNfcGFpc2VzLCBhZXMoeD10aW1lLCB5PXZhbHVlcywgZ3JvdXA9Z2VvLCBjb2xvcj1nZW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGE9MC42KSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdD0wLCBzbG9wZT0xLCBsaW5ldHlwZT0iZGFzaGVkIikgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJDcmVjaW1pZW50byBQSUIgcGVyIGPDoXBpdGEiLCBzdWJ0aXRsZSA9ICJQSUdTIHZzIEFsZW1hbmlhIHkgUmVpbm8gVW5pZG8iKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGd1aWRlcyhjb2xvcj1ndWlkZV9sZWdlbmQocmV2ZXJzZT1UUlVFKSkgICAgDQoNCg0KYGBgDQoNClRlbmllbmRvIGVuIGN1ZW50YSBsb3MgZ3LDoWZpY29zLCBzZSBwdWVkZSBvYnNlcnZhciBjb21vIGVuIHJlbGFjacOzbiBjb24gZWwgUElCIHBlciBjw6FwaXRhIHF1ZSBzw60gZXhpc3RlbiBkaWZlcmVuY2lhcy4NCg0KQWxlbWFuaWEgeSBSZWlubyBVbmlkbyBzZXLDrWFuIGxvcyBwYcOtc2VzIGNvbiBtYXlvciByZW50YSBwb3IgaGFiaXRhbnRlLCB0cmFzIGVzdG9zLCBlbiB1bmEgcG9zaWNpw7NuIGludGVybWVkaWEgc2UgZW5jb250cmFyw61hbiBJdGFsaWEgeSBFc3Bhw7FhLiBZIGZpbmFsbWVudGUsIGNvbiB1bmEgcmVudGEgbGlnZXJhbWVudGUgaW5mZXJpb3IsIFBvcnR1Z2FsIHkgR3JlY2lhLiANCg0KDQoNCg0KDQoNCg0KIyMjIDMuMS4yLiBEZXNlbXBsZW8NCg0KRWwgc2VndW5kbyBpbmRpY2Fkb3IgcXVlIHZhbW9zIGEgY29tcGFyYXIgZXMgbGEgdGFzYSBkZSBwYXJvIG8gZGVzZW1wbGVvLiANCg0KRWwgZGVzZW1wbGVvIGNvbnNpc3RlIGVuIHVuIGRlc2FqdXN0ZSBlbiBlbCBtZXJjYWRvIGxhYm9yYWwsIGVuIGVsIHF1ZSBsYSBkZW1hbmRhIGRlIHRyYWJham8gKGxhcyBlbXByZXNhcykgZXMgbWVub3IgcXVlIGxhIG9mZXJ0YSAobG9zIHRyYWJhamFkb3JlcykuIEVzdG8gZXMsIGN1YW5kbyBleGlzdGVuIG3DoXMgcGVyc29uYXMgZGlzcHVlc3RhcyBhIG9mcmVjZXIgc3UgdHJhYmFqbyBhIGxhcyBlbXByZXNhcyBxdWUgcHVlc3RvcyBkZSB0cmFiYWpvIGRpc3BvbmlibGVzIGVuIGVzZSBtb21lbnRvLiANCg0KUG9zZWVyIHVuYSBhbHRhIHRhc2EgZGUgZGVzZW1wbGVvIHN1cG9uZSB1biBwcm9ibGVtYSBpbXBvcnRhbnRlIHBhcmEgdW4gcGHDrXMgeWEgcXVlIGFmZWN0YSBkZSBtYW5lcmEgZGlyZWN0YSBhbCBjcmVjaW1pZW50byBlY29uw7NtaWNvIHkgYWwgZGVzYXJyb2xsbyBkZWwgcGHDrXMuIEFkZW3DoXMsIGxhcyBjb25zZWN1ZW5jaWFzIGRlIHVuYSB0YXNhIGRlIHBhcm8gZWxldmFkYSx0aWVuZW4gdW4gZnVlcnRlIGNhcsOhY3RlciBlY29uw7NtaWNhcyBlbiBjdWFudG8gYSBsYSBkaXNtaW51Y2nDs24gZGUgbGEgcHJvZHVjY2nDs24gcmVhbCwgbGEgcmVkdWNjacOzbiBkZSBsYSBkZW1hbmRhIG8gZWwgYXVtZW50byBkZWwgZMOpZmljaXQgcMO6YmxpY28sIHBlcm8gdGFtcG9jbyBwb2RlbW9zIG9sdmlkYXJub3MgZGUgbG9zIGVmZWN0b3MgZGUgY2FyYWN0ZXIgc29jaWFsLCBjb21vIGxvcyBwcm9ibGVtYXMgcHNpY29sw7NnaWNvcyBvIGxhIHDDqXJkaWRhIGRlIGNhcGl0YWwgaHVtYW5vLiANCg0KYGBge3J9DQpwYXJvX3BhaXM8LSBnZXRfZXVyb3N0YXQoInRwczAwMjAzIikNCg0KcGFyb19vcmRlbiA8LSBwYXJvX3BhaXMgJT4lIGZpbHRlcih1bml0ICVpbiUgYygiUENfQUNUIikpJT4lIHNlbGVjdChnZW8sIHRpbWUsIHZhbHVlcykgDQogICAgICAgICAgICAgICAgICAgICAgDQpwaWlncyA8LSBwYXJvX29yZGVuICU+JSBmaWx0ZXIoZ2VvICVpbiUgYygiUFQiLCAiSVQiLCAiRVMiLCAiRUwiLCAiREUiLCAiVUsiKSkNCg0KY2VyZG9zIDwtIGdncGxvdChwaWlncywgYWVzKHg9dGltZSwgeT12YWx1ZXMsIGdyb3VwPWdlbywgY29sb3I9Z2VvKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX2xpbmUoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiZGFya2JsdWUiLCJyZWQiLCAiZ29sZCIsICJncmVlbiIsICJncmV5IiwgIm9yYW5nZSIpKSAgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBsYWJzKHRpdGxlPSJEZXNlbXBsZW8iLCBzdWJ0aXRsZT0iTG9zIFBJR1MgdnMgQWxlbWFuaWEgeSBSZWlubyBVbmlkbyIpDQoNCmNlcmRvcw0KDQoNCg0KDQp0YW1iaWVuVUUgPC0gcGFyb19vcmRlbiAlPiUgZmlsdGVyKGdlbyAlaW4lIGMoIlBUIiwgIklUIiwgIkVTIiwgIkVMIiwgIkRFIiwgIlVLIikpDQoNCg0KY29uanVudG8gPC0gZ2dwbG90KHRhbWJpZW5VRSwgYWVzKHg9QcOxb3MsIHk9ZGVzZW1wbGVvdmFsdWVzLCBncm91cD1nZW8sIGNvbG9yPWdlbykpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoImRhcmtibHVlIiwicmVkIiwgImdvbGQiLCAiZ3JlZW4iLCAiZ3JleSIsICJicm93biIsICJvcmFuZ2UiKSkgICsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZT0iTG9zIFBJR1MgdnMgIikNCg0KDQoNCmdncGxvdCh0YW1iaWVuVUUgLCBhZXMoeCA9IHRpbWUsICB5ID0gdmFsdWVzLCBjb2xvcj0gZ2VvKSkrIGdlb21fcG9pbnQoKSArIHlsaW0oYyhOQSwgMzApKSArIA0KICBsYWJzKHRpdGxlID0gIkRlc2VtcGxlbyIsIHN1YnRpdGxlID0gIkxvcyBQSUdTIHZzIEFsZW1hbmlhIHkgUmVpbm8gVW5pZG8iLCB4ID0gIkHDsW9zIiwNCiAgICAgICB5ID0gIkRlc2VtcGxlbyIpKyB0aGVtZShheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3IgPSAib3JhbmdlIixzaXplPTEpKSsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X2JsYW5rKCkpKw0KICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsZmFjZT0iYm9sZCIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTYsZmFjZSA9ICJib2xkIikpKyAgZ2doaWdobGlnaHQ6OmdnaGlnaGxpZ2h0KCkgKyANCiAgZmFjZXRfd3JhcCh2YXJzKGdlbykpDQoNCg0KDQoNCmBgYA0KDQpVbmEgdmV6IG9ic2VydmFkb3MgbG9zIGdyw6FmaWNvcywgdm9sdmVtb3MgYSBlbmNvbnRyYXIgZGlmZXJlbmNpYXMgZW50cmUgbG9zIFBJR1MgeSBBbGVtYW5pYSB5IGVsIFJlaW5vIFVuaWRvLiANCg0KRW4gZXN0ZSBjYXNvLCBvYnNlcnZhbW9zIGNvbW8gbGFzIHRhc2FzIGRlIHBhcm8gZGUgRXNwYcOxYSB5IEdyZWNpYSBoYW4gbGxlZ2FkbyBhIHNlciB2ZXJkYWRlcmFtZW50ZSBhbHRhcywgbGxlZ2FuZG8gYSBzdXBlcmFyLCBlbiBsb3MgcGVvcmVzIGHDsW9zIGRlIGxhIGNyaXNpcygyMDEzKSwgZWwgMjUlLiBFbiB1bmEgcG9zaWNpw7NuIGludGVybWVkaWEsIGVzdGFyw61hbiBJdGFsaWEgeSBQb3J0dWdhbCwgbWllbnRyYXMgcXVlIEFsZW1hbmlhIHkgUmVpbm8gVW5pZG8gdGllbmVuIHVuYXMgY2lmcmFzIGJhc3RhbnRlIGJhamFzLCBwcsOhY3RpY2FtZW50ZSwgc2luIHN1cGVyYXIgZW4gbmluZ8O6biBtb21lbnRvIGVsIDEwJQ0KDQoNCiMjICoqMy4yIE1hdGVyaWEgU29jaWFsKioNCg0KDQpgYGB7ciBldmFsID0gVFJVRSwgZWNobyA9IEZBTFNFfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoaGVyZTo6aGVyZSgiaW1hZ2VuZXMiLCAic29jLmpwZyIpKQ0KYGBgDQoNCiMjIyAzLjIuMS4gR2FzdG8gZW4gUHJvdGVjY2nDs24gU29jaWFsDQoNCkVsIHRlcmNlciBpbmRpY2Fkb3IgcXVlIGhlbW9zIGVzY29naWRvIGVzIGVsIHBvcmNlbnRhamUgZGVsIFBJQiBxdWUgcmVwcmVzZW50YSBlbCBHYXN0byBTb2NpYWwgZW4gcmVsYWNpw7NuIGNvbiBlbCBQSUIuIEVzdG8gZXMsIHF1ZSBwb3JjZW50YWplIGRlbCBQSUIgc2UgZGVkaWNhIGEgUHJvdGVjY2nDs24gU29jaWFsLiANCg0KRWwgZ2FzdG8gZW4gcHJvdGVjY2nDs24gc29jaWFsIGVzIGFxdWVsbGEgcGFydGlkYSBkZWwgcHJlc3VwdWVzdG8gcXVlIGVsIEVzdGFkbyBkZXN0aW5hIGEgc2F0aXNmYWNlciBsYXMgbmVjZXNpZGFkZXMgYsOhc2ljYXMgZGUgbG9zIGNpdWRhZGFub3MuIEVzdG8gZXMsIGFxdWVsbGFzIG5lY2VzaWRhZGVzIGLDoXNpY2FzIHF1ZSBzb24gaW1wcmVzY2luZGlibGVzIHBhcmEgbG9ncmFyIHVuYSB2aWRhIGRpZ25hLCBzYW5hLCBwcm9sb25nYWRhLCBjcmVhdGl2YSB5IHByb2R1Y3RpdmEuIEVsIGdhc3RvIHNvY2lhbCBlcyBlbCBpbnN0cnVtZW50byBhIHRyYXbDqXMgZGVsIGN1YWwgc2UgYXl1ZGEgYSBsb2dyYXIgbGEgaWd1YWxkYWQgZGUgb3BvcnR1bmlkYWRlcyBhIGFxdWVsbG9zIGNpdWRhZGFub3MgcXVlIHNlIGVuY3VlbnRyYW4gZW4gdW5hIHBlb3Igc2l0dWFjacOzbi4NCg0KDQpgYGB7cn0NCg0KDQpwcm9zb2MgPC0gZ2V0X2V1cm9zdGF0KCJzcHJfZXhwX3N1bSIpDQoNCnByb3QgPC0gcHJvc29jICU+JSBmaWx0ZXIodW5pdCAlaW4lIGMoIlBDX0dEUCIpKSAlPiUgZmlsdGVyKHNwZGVwcyAlaW4lIGMoIlRPVEFMTk9SRVJPVVRFIikpICU+JSBmaWx0ZXIoZ2VvICVpbiUgYygiUFQiLCAiSVQiLCAiRVMiLCAiRUwiLCAiREUiLCAiVUsiKSkgDQoNCnByb3RlIDwtIGdncGxvdChwcm90LCBhZXMoeD10aW1lLCB5PXZhbHVlcywgY29sb3IgPSBnZW8pKSArIGdlb21fbGluZSgpICsgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhnZW8pKSArDQpsYWJzKHRpdGxlID0gIkV2b2x1Y2nDs24gZGVsIEdhc3RvIGVuIFByb3RlY2Npw7NuIFNvY2lhbCBlbiByZWxhY2nDs24gY29uIGVsIFBJQiIpDQoNCnByb3RlDQoNCmdncGxvdChwcm90LCBhZXMoeD10aW1lLCB5PXZhbHVlcywgZ3JvdXA9Z2VvLCBjb2xvcj1nZW8pKSArDQogIGdlb21fcG9pbnQoYWxwaGE9MC42KSArDQogIGdlb21fYWJsaW5lKGludGVyY2VwdD0wLCBzbG9wZT0xLCBsaW5ldHlwZT0iZGFzaGVkIikgKw0KICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpICsNCiAgbGFicyh0aXRsZSA9ICJDcmVjaW1pZW50byBkZWwgR2FzdG8gZW4gUHJvdGVjY2nDs24gU29jaWFsIiwgc3VidGl0bGUgPSAiUElHUyB2cyBBbGVtYW5pYSB5IFJlaW5vIFVuaWRvIikgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKw0KICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKHJldmVyc2U9VFJVRSkpICANCg0KDQoNCmBgYA0KICANCk9ic2VydmFuZG8gbG9zIGdyw6FmaWNvcyBwb2RlbW9zIG9ic2VydmFyIGNvbW8gbG9zIFBJR1MsIGEgZmluYWxlcyBkZSBsb3MgOTBzIGVsIGdhc3RvIHNvY2lhbCBlcmEgYmFzdGFudGUgbWVub3IgcXVlIGVsIGRlIFJlaW5vIFVuaWRvIHkgc29icmUgdG9kbywgQWxlbWFuaWEuIFNpbiBlbWJhcmdvLCBsYSB0ZW5kZW5jaWEgZGVzZGUgZWwgaW5pY2lvIGRlbCBzaWdsbyBYWEkgaGEgc2lkbyBsYSBkZSBsYSBjb252ZXJnZW5jaWEgaGFjaWEgdW5vcyB2YWxvcmVzIGRlIEdhc3RvIFNvY2lhbCBzaW1pbGFyZXMsIGRlIGFwcm94aW1hZGFtZW50ZSB1biBjdWFydGEgcGFydGUgZGVsIFBJQi4NCg0KICANCiAgDQojIyMgMy4yLjIuIEV4Y2x1c2nDs24gc29jaWFsIA0KIA0KRXN0ZSBpbmRpY2Fkb3IgbXVlc3RyYSBsYSBjYW50aWRhZCBkZSBwZXJzb25hcyBxdWUgc2UgZW5jdWVudHJhbiBlbiB1bmEgc2l0dWFjacOzbiBkZSByaWVzZ28gZGUgZXhjbHVzacOzbiBzb2NpYWwuIEVzdG8gZXMsIGxhIGZhbHRhIGRlIHBhcnRpY2lwYWNpw7NuIHBvciBwYXJ0ZSBkZSBjaXVkYWRhbm9zIGVuIGxhIHZpZGEgY3VsdHVyYWwsIGVjb27Ds21pY2EgeSBzb2NpYWwgZGUgc3VzIHJlc3BlY3RpdmFzIHNvY2llZGFkZXMgZGViaWRvIGEgbGEgY2FyZW5jaWEgZGUgbG9zIGRlcmVjaG9zLCByZWN1cnNvcyB5IGNhcGFjaWRhZGVzIGLDoXNpY2FzIGZhY3RvcmVzIHF1ZSBoYWNlbiBwb3NpYmxlIHVuYSBwYXJ0aWNpcGFjacOzbiBzb2NpYWwgcGxlbmEuDQoNClNlZ8O6biBsYSBDb21pc2nDs24gRXVyb3BlYSB1bmEgcGVyc29uYSBlc3TDoSBlbiByaWVzZ28gZGUgcG9icmV6YSB5IGV4Y2x1c2nDs24gc29jaWFsIHNpIGN1bXBsZW4gY29uIGxvcyBzaWd1ZW50ZXMgcHVudG9zLiANCg0KMS4gQ3VhbmRvIG5vIGFsY2FuemEgdW4gNjAgJSBkZWwgU2FsYXJpbyBtw61uaW1vIGRlbCBwYcOtcywgcGVzZSBhIHBlcmNpYmlyIGF5dWRhcyBwb3IgcGFydGUgZGVsIEVzdGFkby4gDQoNCjIuIEN1YW5kbyBleGlzdGUgZGVzZW1wbGVvIGRlIGxhcmdhIGR1cmFjacOzbiBlbiBidWVuYSBwYXJ0ZSBkZSBsb3MgbWllbWJyb3MgZGUgbGEgZmFtaWxpYS4NCg0KMy4gQ3VhbmRvIGxhcyBwZXJzb25hcyBubyBwdWVkZW4gYWNjZWRlciBhIG3DoXMgZGUgbGEgbWl0YWQgZGUgbG9zIHNpZ3VpZW50ZXMgaXRlbXMNCiAtIFBhZ2FyIGVsIGFscXVpbGVyIG8gbGFzIGZhY3R1cmFzIGRlIHNlcnZpY2lvcyBww7pibGljb3MuDQogLSBDYWxlZmFjY2nDs24gYWRlY3VhZGEuDQogLSBObyBwb2RlciBlbmZyZW50YXJzZSBhIGdhc3RvcyBpbmVzcGVyYWRvcy4NCiAtIENvbWVyIENhcm5lLCBQZXNjYWRvIG8gUHJvdGXDrW5hcyBlcXVpdmFsZW50ZXMgY2FkYSAyIGTDrWFzLg0KIC0gVW5hIHNlbWFuYSBkZSB2YWNhY2lvbmVzIGZ1ZXJhIGRlIGNhc2EgYWwgYcOxby4NCiAtIFVuIGNvY2hlLg0KIC0gVW5hIGxhdmFkb3JhLg0KIC0gVW5hIHRlbGV2aXNpw7NuIGVuIGNvbG9yLg0KIC0gVW4gdGVsw6lmb25vLg0KDQpgYGB7cn0NCg0KZXhjbHVzaW9uIDwtIGdldF9ldXJvc3RhdCAoImlsY19wZXBzMDEiKQ0KDQpleGMgPC0gIGV4Y2x1c2lvbiAlPiUgZmlsdGVyKHVuaXQgJWluJSBjKCJQQyIpKSAlPiUgZmlsdGVyKHNleCAlaW4lIGMoIlQiKSkgJT4lIGZpbHRlcihhZ2UgJWluJSBjKCJUT1RBTCIpKSAlPiUgc2VsZWN0KGdlbywgdGltZSwgdmFsdWVzKSANCg0KDQpleGNsdSA8LSBleGMgJT4lIGZpbHRlcihnZW8gJWluJSBjKCJQVCIsICJJVCIsICJFUyIsICJFTCIsICJERSIsICJVSyIpKQ0KDQoNCmdncGxvdChleGNsdSwgYWVzKHRpbWUsIHZhbHVlcywgY29sb3IgPSBnZW8pKSArIGdlb21fcG9pbnQoKSArICBnZW9tX3Ntb290aCgpICsgbGFicyh0aXRsZSA9ICIlIGRlIHBlcnNvbmFzIGVuIHJpZXNnbyBkZSBleGNsdXNpw7NuIHNvY2lhbCIsIHN1YnRpdGxlID0gIlBJR1MgdnMgQWxlbWFuaWEgeSBSZWlubyBVbmlkbyIpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KRXNwYSA8LSBleGNsdSAlPiUgZmlsdGVyKHRpbWUgPT0gIjIwMTktMDEtMDEiKQ0KDQprbml0cjo6a2FibGUoRXNwYSwgYWxpZ24gPSAiYyIsIGNhcHRpb24gPSAiRGF0b3MgZGUgbGEgZXhjbHVzacOzbiBzb2NpYWwgZW4gbGEgYWN0dWFsaWRhZCIpICU+JSBrYWJsZUV4dHJhOjprYWJsZV9zdHlsaW5nKGZpeGVkX3RoZWFkID0gbGlzdChlbmFibGVkID0gVCwgYmFja2dyb3VuZCA9ICJ5ZWxsb3ciKSkNCmBgYA0KDQoNCkEgZGlmZXJlbmNpYSBkZSBsbyBxdWUgb2N1cnJlIGVuIGN1YW50byBhbCBwb3JjZW50YWplIGRlc3RpbmFkbyBhIHByb3RlY2Npw7NuIHNvY2lhbCwgZG9uZGUgbGFzIGNpZnJhcyBoYW4gY29udmVyZ2lkbywgZW4gZXN0ZSBhcGFydGFkbywgc8OtIHF1ZSBzZSBvYnNlcnZhbiBkaWZlcmVuY2lhcyBub3RhYmxlcyBjb24gcmVzcGVjdG8gYSBsYXMgcGVyc29uYXMgZW4gcmllc2dvIGRlIHBvYnJlemEgeSBleGNsdXNpw7NuIHNvY2lhbC4gUG9yIGVqZW1wbG8sIGxvcyBkYXRvcyBkZSBBbGVtYW5pYSB5IEdyZWNpYSBkaXZlcmdlbiBlbiBtw6FzIGRlIHVuIDEwJS4gDQoNCkVzdG9zIGRhdG9zIG5vcyBtdWVzdHJhbiBxdWUgdGFsIHZleiBsbyBpbXBvcnRhbnRlLCBubyBzb2xvIHNlYSBjdWFudG8gZGluZXJvIHNlICBkZXN0aW5hIGEgbGEgcHJvdGVjY2nDs24gc29jaWFsLCBzaW5vIGPDs21vIHkgZW4gcXXDqSBzZSB1dGlsaXphLiANCg0KDQoNCg0KDQojIDQuIENvbmNsdXNpb25lcw0KDQpFbiBlc3RlIGJyZXZlIHRyYWJham8gaGVtb3MgcHJldGVuZGlkbyBvYnNlcnZhciBsYSB0cmF5ZWN0b3JpYSByZWNpZW50ZSwgZGUgbG9zICBQSUdTIGNvbXBhcsOhbmRvbG9zIGNvbiBlbCBSZWlubyBVbmlkbyB5IEFsZW1hbmlhLiANCg0KUXVlcsOtYW1vcywgcG9yIHVuYSBwYXJ0ZSBzYWJlciBlbiBxdWUgbWVkaWRhIGxvcyBQSUdTIGVyYW4gaG9tZWfDqW5lb3MgZW50cmUgZWxsb3MuIEFzw60gY29tbywgY290ZWphciBlc3RvcyBkYXRvcyBjb24gZXNvcyBwYcOtc2VzIGRlIEV1cm9wYSBDZW50cmFsLCBxdWUgc3VlbGVuIHNlciBjb25zaWRlcmFkb3MgY29tbyAiZWplbXBsb3MgYSBzZWd1aXIiLiANCg0KQSBsbyBsYXJnbyBkZSBsYSBpbnZlc3RpZ2FjacOzbiBoZW1vcyBtb3N0cmFkbyBncsOhZmljb3MgZGUgZG9zIMOhbWJpdG9zIGRpc3RpbnRvcywgZGVsIGVjb27Ds21pY28gKFBJQiBwZXIgY8OhcGl0YSB5IERlc2VtcGxlbykgeSBkZWwgc29jaWFsIChHYXN0byBzb2NpYWwgZW4gcmVsYWNpw7NuIGNvbiBlbCBQSUIgeSBSaWVzZ28gZGUgcG9icmV6YSB5IGV4Y2x1c2nDs24gc29jaWFsKS4gDQoNClF1ZXJyw61hbW9zIGRlc3RhY2FyIHF1ZSBlbiBsw61uZWFzIGdlbmVyYWxlcyBzw60gcXVlIHNlIGhhbiBvYnNlcnZhZG8gZGlmZXJlbmNpYXMgZW50cmUgbG9zIFBJR1MgeSBsb3MgcGHDrXNlcyBkZSBFdXJvcGEgZGVsIG5vcnRlIHkgY2VudHJhbC4gRW50cmUgZWxsYXMsIGRlc3RhY2Fyw61hbW9zIGxhcyBkaXZlcmdlbmNpYXMgZW4gbWF0ZXJpYSBlY29uw7NtaWNhLCBlbiBlbCBQSUIgcGVyIGPDoXBpdGEgeSBlbiBsYSB0YXNhIGRlIHBhcm8uIEVuIGVsIMOhbWJpdG8gc29jaWFsLCBlbiBjdWFudG8gYWwgZ2FzdG8gZGVzdGluYWRvIGEgcHJvdGVjY2nDs24gc29jaWFsIHNlIHB1ZWRlIG9ic2VydmFyIHVuYSBjaWVydGEgY29udmVyZ2VuY2lhIGVuIHZhbG9yZXMgZGUgYXByb3hpbWFkYW1lbnRlLCAyNSUsIGRlbCB0b3RhbCBkZWwgUElCLiBQZXNlIGEgZXN0bywgc2UgbWFudGllbmVuIGxhcyBkaXN0YW5jaWFzIGVuIGN1YW50byBhIHBvcmNlbnRhamUgZGUgcGVyc29uYXMgcXVlIHZpdmVuIGVuIHJpZXNnbyBkZSBwb2JyZXphIG8gZXhjbHVzacOzbiBzb2NpYWwuIA0KDQpFbiBkZWZpbml0aXZhLCBzZSBwdWVkZSBhZmlybWFyIGVuIGJhc2UgYSBsb3MgZGF0b3MsIHF1ZSBwZXJzaXN0ZW4gZXNhcyBkaXNwYXJpZGFkZXMgeSBkaWZlcmVuY2lhcyBlbnRyZSBsb3MgcGHDrXNlcyBkZWwgc3VyLCBQSUdTIHkgbG9zIGRlbCBub3J0ZSwgUmVpbm8gVW5pZG8geSBBbGVtYW5pYS4gDQoNCiMjIDQuMS4gU2F0aXNmYWNjacOzbiBjb24gbGEgdmlkYQ0KDQpQYXJhIGZpbmFsaXphciBlbCB0cmFiYWpvLCBoZW1vcyBxdWVyaWRvIG1vc3RyYXIgdW4gZ3LDoWZpY28gZW4gZG9uZGUgc2UgY29tcGFyZSB1bmEgdmFyaWFibGUgc3ViamV0aXZhIGNvbW8gZXMgbGEgc2F0aXNmYWNjacOzbiBjb24gbGEgdmlkYS4gWSBjb24gZWxsbyBwb2RlciBvYnNlcnZhciBzaSBoYXkgbyBubyB1bmEgY29ycmVsYWNpw7NuIGVudHJlIGJ1ZW5vcyBkYXRvcyBtYWNyb2Vjb25vw7NtaWNvcyB5IHNvY2lhbGVzIGNvbiwgbGEgc2F0aXNmYWNjacOzbiB2aXRhbC4gDQoNCmBgYHtyfQ0Kc2F0aXMgPC0gZ2V0X2V1cm9zdGF0KCJpbGNfcHcwMSIpDQoNCnZpZGEgPC0gIHNhdGlzICU+JSBmaWx0ZXIoYWdlICVpbiUgYygiWV9HRTE2IikpICU+JSBmaWx0ZXIoc2V4ICVpbiUgYygiVCIpKSAlPiUgZmlsdGVyKGluZGljX3diICVpbiUgYygiTElGRVNBVCIpKSAlPiUgZmlsdGVyKGlzY2VkMTEgJWluJSBjKCJUT1RBTCIpKSAlPiUgZmlsdGVyKGFnZSAlaW4lIGMoIllfR0UxNiIpKSAlPiUgc2VsZWN0KGdlbywgdGltZSwgdmFsdWVzKSANCg0KDQp2aXZpciA8LSB2aWRhICU+JSBmaWx0ZXIoZ2VvICVpbiUgYygiUFQiLCAiSVQiLCAiRVMiLCAiRUwiLCAiREUiLCAiVUsiKSkNCg0KbWVhbiA8LSB2aXZpciAlPiUgZ3JvdXBfYnkoZ2VvKSAlPiUgc3VtbWFyaXplKG1lYW4odmFsdWVzKSkNCg0KbWVhbiA8LSBtZWFuICU+JSByZW5hbWUoIm1lYW4iID0gIm1lYW4odmFsdWVzKSIpDQoNCg0KbWVhbmIgPC0gbWVhbiAlPiUNCiAgICAgICAgbXV0YXRlKEdFTyA9IGZvcmNhdHM6OmZjdF9yZW9yZGVyKGdlbywgbWVhbiwgLmRlc2M9VFJVRSkpDQoNCmdncGxvdChtZWFuYiwgYWVzKGZjdF9yZXYoR0VPKSwgbWVhbiwgZmlsbD1nZW8pKSArIGdlb21fY29sKCkgKyBsYWJzKHRpdGxlID0gIlNhdGlzZmFjY2nDs24gY29uIGxhIHZpZGEiLCBzdWJ0aXRsZSA9ICJWYWxvcmVzIG1lZGlvcyIsIHk9Ik1lZGlhIiwgeD1OVUxMKSArICAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA4LCAyKSwgbGltaXRzID0gYygwLCAxMCkpICsgdGhlbWVfYncoKSANCg0KDQoNCg0KDQpgYGANCg0KUG9kZW1vcyBkZWNpciBxdWUsIGFwYXJlbWVudGUsIHPDrSBxdWUgaGF5IGNpZXJ0YSBjb3JyZWxhY2nDs24sIHBlcm8gcXVlIGEgc2ltcGxlIHZpc3RhIG5vIHBhcmVjZSBxdWUgw6lzdGEgc2VhIG11eSBmdWVydGUuIA0KDQoNCg0KDQoNCiMgNS4gUmVmZXJlbmNpYXMNCiANCiAtIERhdGFiYXNlIEV1cm9zdGF0DQogLSBFbCB0cmFiYWpvIEdydXBhbCByZWFsaXphZG8gc29icmUgbG9zIEp1ZWdvcyBPbMOtbXBpY29zIGp1bnRvIGEgbWlzIGNvbXBhw7Flcm9zIE1hbnVlbCBKaW3DqW5leiB5IEFudG9uaW8gTGFuZ2EuIA0KDQoNCg0KDQoNCg0KDQoNCiAgDQogIA0KICANCiAgDQogIA0KICANCiAgDQo=