Contexto

El Informe Mundial de la Felicidad es una encuesta histórica sobre el estado de la felicidad mundial. El informe continúa ganando reconocimiento mundial a medida que los gobiernos, las organizaciones y la sociedad civil utilizan cada vez más indicadores de felicidad para informar sus decisiones de formulación de políticas. Los principales expertos en todos los campos como economía, psicología, análisis de encuestas, estadísticas nacionales, salud, políticas públicas. Describen cómo las mediciones del bienestar se pueden usar de manera efectiva para evaluar el progreso de las naciones.

Los puntajes y clasificaciones de felicidad utilizan datos de la Encuesta mundial de Gallup, obtenidas de la página web Kaggle y se encuentran en el siguiente link https://www.kaggle.com/datasets/ajaypalsinghlo/world-happiness-report-2021?resource=download.

Barplot 5 Mejores y Peores puestos

Diagrama de Barras Horizontal usando GGPLOT2

Tomando en cuenta el dataset obtenido se comienza por obtener los países que ocupan los 5 mejores y peores posiciones en la encuesta realizada.

#Agregar el dataset al espacio de trabajo
happiness<- read.csv("C:/Users/Lenovo/Documents/TRABAJO FINAL R/CSV/world-happiness-report-2021-22.csv")

#Generación del dataframe
happiness_frame <- data.frame(happiness)

#Extracción de parte del dataframe - 5 mejores y 5 peores
top_bottom <- happiness_frame[c(1:5,145:149),c(1,3)]

#Extracción de ciertos datos - Nombre y Score
Top_Bottom_Countries <- top_bottom$Country.name
Top_Bottom_Score <- top_bottom$Ladder.score

#Generación del barplot horizontal
ggplot(top_bottom) + geom_bar (aes(x=reorder(Top_Bottom_Countries, Top_Bottom_Score), y= Top_Bottom_Score, fill=Top_Bottom_Score), stat ="identity", show.legend = FALSE) + ggtitle ("World Happiness Record by Country - 2021")+ theme(plot.title =element_text(hjust=0.5)) + theme(axis.text=element_text(size=10), axis.title=element_text(size=10),plot.title=element_text(size=15)) + xlab("Countries") + ylab("Score") + coord_flip()+ scale_fill_gradient(low="yellow", high="orange")

Mapa de los 5 Mejores y Peores puestos

Mapa interactivo usando LEAFLET

A través del siguiente gráfico podemos espacializar la información presentada en el diagrama de barras horizontal, evidenciamos que los cinco mejores puestos se encuentran ubicados en Europa

#Crear contenedor
contenedor <- leaflet()

#Crear Mapa Base - Open street
mapa_base <-  leaflet() %>%
    addTiles()

#Mapa
img <-"https://www.r-project.org/logo/Rlogo.svg"

locat_top5 <- data.frame(lugar=c("FINLAND","DENMARK","SWITZERLAND","ICELAND","NETHERLANDS","LESOTHO","BOTSWANA","RWANDA","ZIMBABWE","AFGHANISTAN"),latitud=c(61.959045509468396,55.5690690852674,46.810983516491575,65.0203706074323,52.14456542779506, -29.61847571440903,-22.1587824783575, -1.9957180459558523,-19.00207536538525,33.92539382532929   ),    longitud=c(25.879485198901012,10.146249479940135, 7.805431215367384,-18.25750753544188, 5.6186815047851635, 28.183386544295576,24.12446526972815, 29.96264476860521,29.72097336510127, 64.52946767888776),score=c(7.84,7.62,7.57,7.55,7.46, 3.51,3.47,3.42,3.15,2.52),puesto=c(1,2,3,4,5,145,146,147,148,149),color=c("red","red","red","red","red", "blue","blue","blue","blue","blue"))

location_top5 <- leaflet(data=locat_top5) %>% 
  
  addTiles() %>%  
  
  addMarkers(lat=~latitud,lng=~longitud, popup=paste(sep="<br>","<b>Lugar:</b>",locat_top5$lugar, "<b>Puesto:</b>",locat_top5$puesto, "<b>Score:</b>",locat_top5$score)) %>% 
  
  
  addCircleMarkers(lat=~latitud,lng=~longitud,color=~color,radius=10)

location_top5

Barplot Países en Sudamérica

Diagrama de Barras usando GGPLOT2

Si bien se tiene en cuenta el ranking de los mejores y peores 5 países del Informe Mundial de la Felicidad, se procede a tomar el dato de los países en Sudamérica y el Caribe, dichos datos pueden evidenciar aún más el contexto en el que nos encontramos como país y de los países alrededor asimismo se procede a mostrar el resultado de manera espacializada

#Extracción de parte del dataframe - Países de Sudamérica y el Caribe
sud_countries <- subset(happiness,Regional.indicator=="Latin America and Caribbean")

#Extracción de ciertos datos - Nombre y Score
sudcountries_info <- sud_countries$Country.name
sudscore_info <- sud_countries$Ladder.score

#Generación del barplot horizontal
ggplot(sud_countries) + geom_bar (aes(x=reorder(sudcountries_info, sudscore_info), y= sudscore_info, fill=sudscore_info), stat ="identity", show.legend = FALSE) + ggtitle ("Latin America and Caribbean Happiness Record - 2021")+ theme(plot.title =element_text(hjust=0.5)) + theme(axis.text=element_text(size=10), axis.title=element_text(size=10),plot.title=element_text(size=15)) + xlab("Countries") + ylab("Score") + coord_flip()+ scale_fill_gradient(low="yellow", high="red")

Mapa Países en Sudamérica

Mapa usando GGPLOT2

Si bien ya se conoce la información en Sudamérica y el Caribe se propone espacializar esa data a través del siguiente gráfico utilizando GGPLOT2

sud_happiness<- read.csv("C:/Users/Lenovo/Documents/TRABAJO FINAL R/CSV/world-happiness-report-2021-22-sudd.csv")

#Creación de data frame
sud_frame <- data.frame(sud_happiness)

#separar datos del data frame
suddata_countries <- subset(sud_frame,Regional.indicator=="Latin America and Caribbean")

#juntar info en ambos datasets a partir de la columna region
mapdata <- map_data("world") #ver info alrededor del mundo

mapdata <- left_join(mapdata,suddata_countries,by="region")

#Seleccionar sólo los datos que cumplen con la columna Ladder.Score
mapdata1 <- mapdata %>% filter(!is.na(mapdata$Ladder.score))

#Generar mapa
ggplot(mapdata1, aes(x=long, y=lat, group=group))+
  geom_polygon(aes(fill=Ladder.score), color = "black")+
  scale_fill_gradient(name = "Score", low ="yellow", high = "red" ,na.value="grey50")+
  theme(axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        axis.title.y = element_blank(),
        axis.title.x = element_blank(),
        rect= element_blank())

Bubble plot corrupción y soporte social

Bubble plot usando GGPLOT2

En este gráfico se pretende evidenciar la relación de tres datos, expectativa de vida, corrupción, soporte social y el resultado que se evidencia en la encuesta. Demostrando que estos valores guardan relación entre sí.

Life_expectancy <- happiness$Healthy.life.expectancy
Score <- happiness$Ladder.score
corruption <- happiness$Perceptions.of.corruption
social_support <- happiness$Social.support

#Generación del plano
ggplot(happiness) + geom_jitter(aes(x=corruption, y=Life_expectancy, color=Score, size=social_support), alpha=0.6)+ xlab("Corruption")+ylab("Health Life Expectancy")+ theme(axis.text=element_text(size=10), axis.title=element_text(size=10),plot.title=element_text(size=15))+labs(color="Score", size="Social \n Support") + scale_color_viridis()

LS0tDQp0aXRsZTogIldvcmxkIEhhcHBpbmVzcyBSZXBvcnQgMjAyMSINCmF1dGhvcjogIkFsZXhhbmRyYSBNaWxhZ3JvcyBQw6lyZXogUmFtw61yZXoiDQpkYXRlOiAiMjAyMi8wNC8wOSINCnN1YnRpdGxlOiBUcmFiYWpvIEZpbmFsIFINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBjb2RlX2Rvd25sb2FkOiBUUlVFDQogICAgDQotLS0NCg0KPCEtLSBBw7FhZGlyIGNvbWVudGFyaW9zIC0tPg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmxpYnJhcnkobGVhZmxldCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KbGlicmFyeSh2aXJpZGlzKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1UUlVFKQ0KYGBgDQoNCiMjIENvbnRleHRvDQpFbCAqKkluZm9ybWUgTXVuZGlhbCBkZSBsYSBGZWxpY2lkYWQqKiBlcyB1bmEgZW5jdWVzdGEgaGlzdMOzcmljYSBzb2JyZSBlbCBlc3RhZG8gZGUgbGEgZmVsaWNpZGFkIG11bmRpYWwuIEVsIGluZm9ybWUgY29udGluw7phIGdhbmFuZG8gcmVjb25vY2ltaWVudG8gbXVuZGlhbCBhIG1lZGlkYSBxdWUgbG9zIGdvYmllcm5vcywgbGFzIG9yZ2FuaXphY2lvbmVzIHkgbGEgc29jaWVkYWQgY2l2aWwgdXRpbGl6YW4gY2FkYSB2ZXogbcOhcyBpbmRpY2Fkb3JlcyBkZSBmZWxpY2lkYWQgcGFyYSBpbmZvcm1hciBzdXMgZGVjaXNpb25lcyBkZSBmb3JtdWxhY2nDs24gZGUgcG9sw610aWNhcy4gTG9zIHByaW5jaXBhbGVzIGV4cGVydG9zIGVuIHRvZG9zIGxvcyBjYW1wb3MgY29tbyAqKmVjb25vbcOtYSwgcHNpY29sb2fDrWEsIGFuw6FsaXNpcyBkZSBlbmN1ZXN0YXMsIGVzdGFkw61zdGljYXMgbmFjaW9uYWxlcywgc2FsdWQsIHBvbMOtdGljYXMgcMO6YmxpY2FzLioqIERlc2NyaWJlbiBjw7NtbyBsYXMgbWVkaWNpb25lcyBkZWwgYmllbmVzdGFyIHNlIHB1ZWRlbiB1c2FyIGRlIG1hbmVyYSBlZmVjdGl2YSBwYXJhIGV2YWx1YXIgZWwgcHJvZ3Jlc28gZGUgbGFzIG5hY2lvbmVzLiANCg0KTG9zIHB1bnRhamVzIHkgY2xhc2lmaWNhY2lvbmVzIGRlIGZlbGljaWRhZCB1dGlsaXphbiBkYXRvcyBkZSBsYSBFbmN1ZXN0YSBtdW5kaWFsIGRlIEdhbGx1cCwgb2J0ZW5pZGFzIGRlIGxhIHDDoWdpbmEgd2ViIEthZ2dsZSB5IHNlIGVuY3VlbnRyYW4gZW4gZWwgc2lndWllbnRlIGxpbmsgIDxodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2FqYXlwYWxzaW5naGxvL3dvcmxkLWhhcHBpbmVzcy1yZXBvcnQtMjAyMT9yZXNvdXJjZT1kb3dubG9hZD4uIA0KDQohW10oaHR0cHM6Ly9jZG4tMy5leHBhbnNpb24ubXgvZGltczQvZGVmYXVsdC8xYmI3ZmY4LzIxNDc0ODM2NDcvc3RyaXAvdHJ1ZS9jcm9wLzEyNTR4NjU4KzArODkvcmVzaXplLzEyMDB4NjMwIS9mb3JtYXQvanBnL3F1YWxpdHkvODAvP3VybD1odHRwcyUzQSUyRiUyRmNkbi0zLmV4cGFuc2lvbi5teCUyRjVhJTJGNDQlMkZjODg5MTJkYzQ3YzhhNmU0YWM3ZDlmYjllMjM1JTJGaXN0b2NrLTY0MzEzNzEwOC5qcGcpDQoNCiMjIEJhcnBsb3QgNSBNZWpvcmVzIHkgUGVvcmVzIHB1ZXN0b3MNCiMjIyBEaWFncmFtYSBkZSBCYXJyYXMgSG9yaXpvbnRhbCB1c2FuZG8gR0dQTE9UMg0KVG9tYW5kbyBlbiBjdWVudGEgZWwgZGF0YXNldCBvYnRlbmlkbyBzZSBjb21pZW56YSBwb3Igb2J0ZW5lciBsb3MgcGHDrXNlcyBxdWUgb2N1cGFuIGxvcyA1IG1lam9yZXMgeSBwZW9yZXMgcG9zaWNpb25lcyBlbiBsYSBlbmN1ZXN0YSByZWFsaXphZGEuDQoNCg0KYGBge3IgdG9wX2JvdHRvbSBiYXJwbG90IGdncGxvdCwgZmlnLmFsaWduPSdjZW50ZXInfQ0KDQojQWdyZWdhciBlbCBkYXRhc2V0IGFsIGVzcGFjaW8gZGUgdHJhYmFqbw0KaGFwcGluZXNzPC0gcmVhZC5jc3YoIkM6L1VzZXJzL0xlbm92by9Eb2N1bWVudHMvVFJBQkFKTyBGSU5BTCBSL0NTVi93b3JsZC1oYXBwaW5lc3MtcmVwb3J0LTIwMjEtMjIuY3N2IikNCg0KI0dlbmVyYWNpw7NuIGRlbCBkYXRhZnJhbWUNCmhhcHBpbmVzc19mcmFtZSA8LSBkYXRhLmZyYW1lKGhhcHBpbmVzcykNCg0KI0V4dHJhY2Npw7NuIGRlIHBhcnRlIGRlbCBkYXRhZnJhbWUgLSA1IG1lam9yZXMgeSA1IHBlb3Jlcw0KdG9wX2JvdHRvbSA8LSBoYXBwaW5lc3NfZnJhbWVbYygxOjUsMTQ1OjE0OSksYygxLDMpXQ0KDQojRXh0cmFjY2nDs24gZGUgY2llcnRvcyBkYXRvcyAtIE5vbWJyZSB5IFNjb3JlDQpUb3BfQm90dG9tX0NvdW50cmllcyA8LSB0b3BfYm90dG9tJENvdW50cnkubmFtZQ0KVG9wX0JvdHRvbV9TY29yZSA8LSB0b3BfYm90dG9tJExhZGRlci5zY29yZQ0KDQojR2VuZXJhY2nDs24gZGVsIGJhcnBsb3QgaG9yaXpvbnRhbA0KZ2dwbG90KHRvcF9ib3R0b20pICsgZ2VvbV9iYXIgKGFlcyh4PXJlb3JkZXIoVG9wX0JvdHRvbV9Db3VudHJpZXMsIFRvcF9Cb3R0b21fU2NvcmUpLCB5PSBUb3BfQm90dG9tX1Njb3JlLCBmaWxsPVRvcF9Cb3R0b21fU2NvcmUpLCBzdGF0ID0iaWRlbnRpdHkiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIGdndGl0bGUgKCJXb3JsZCBIYXBwaW5lc3MgUmVjb3JkIGJ5IENvdW50cnkgLSAyMDIxIikrIHRoZW1lKHBsb3QudGl0bGUgPWVsZW1lbnRfdGV4dChoanVzdD0wLjUpKSArIHRoZW1lKGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApLHBsb3QudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTUpKSArIHhsYWIoIkNvdW50cmllcyIpICsgeWxhYigiU2NvcmUiKSArIGNvb3JkX2ZsaXAoKSsgc2NhbGVfZmlsbF9ncmFkaWVudChsb3c9InllbGxvdyIsIGhpZ2g9Im9yYW5nZSIpDQoNCmBgYA0KDQojIyBNYXBhIGRlIGxvcyA1IE1lam9yZXMgeSBQZW9yZXMgcHVlc3Rvcw0KIyMjIE1hcGEgaW50ZXJhY3Rpdm8gdXNhbmRvIExFQUZMRVQNCkEgdHJhdsOpcyBkZWwgc2lndWllbnRlIGdyw6FmaWNvIHBvZGVtb3MgZXNwYWNpYWxpemFyIGxhIGluZm9ybWFjacOzbiBwcmVzZW50YWRhIGVuIGVsIGRpYWdyYW1hIGRlIGJhcnJhcyBob3Jpem9udGFsLCBldmlkZW5jaWFtb3MgcXVlIGxvcyBjaW5jbyBtZWpvcmVzIHB1ZXN0b3Mgc2UgZW5jdWVudHJhbiB1YmljYWRvcyBlbiBFdXJvcGENCg0KYGBge3IgbWFwYSBpbnRlcmFjdGl2byBsZWFmbGV0LCBmaWcuYWxpZ249J2NlbnRlcid9DQoNCiNDcmVhciBjb250ZW5lZG9yDQpjb250ZW5lZG9yIDwtIGxlYWZsZXQoKQ0KDQojQ3JlYXIgTWFwYSBCYXNlIC0gT3BlbiBzdHJlZXQNCm1hcGFfYmFzZSA8LSAgbGVhZmxldCgpICU+JQ0KICAgIGFkZFRpbGVzKCkNCg0KI01hcGENCmltZyA8LSJodHRwczovL3d3dy5yLXByb2plY3Qub3JnL2xvZ28vUmxvZ28uc3ZnIg0KDQpsb2NhdF90b3A1IDwtIGRhdGEuZnJhbWUobHVnYXI9YygiRklOTEFORCIsIkRFTk1BUksiLCJTV0lUWkVSTEFORCIsIklDRUxBTkQiLCJORVRIRVJMQU5EUyIsIkxFU09USE8iLCJCT1RTV0FOQSIsIlJXQU5EQSIsIlpJTUJBQldFIiwiQUZHSEFOSVNUQU4iKSxsYXRpdHVkPWMoNjEuOTU5MDQ1NTA5NDY4Mzk2LDU1LjU2OTA2OTA4NTI2NzQsNDYuODEwOTgzNTE2NDkxNTc1LDY1LjAyMDM3MDYwNzQzMjMsNTIuMTQ0NTY1NDI3Nzk1MDYsIC0yOS42MTg0NzU3MTQ0MDkwMywtMjIuMTU4NzgyNDc4MzU3NSwgLTEuOTk1NzE4MDQ1OTU1ODUyMywtMTkuMDAyMDc1MzY1Mzg1MjUsMzMuOTI1MzkzODI1MzI5MjkgICApLCAgICBsb25naXR1ZD1jKDI1Ljg3OTQ4NTE5ODkwMTAxMiwxMC4xNDYyNDk0Nzk5NDAxMzUsIDcuODA1NDMxMjE1MzY3Mzg0LC0xOC4yNTc1MDc1MzU0NDE4OCwgNS42MTg2ODE1MDQ3ODUxNjM1LCAyOC4xODMzODY1NDQyOTU1NzYsMjQuMTI0NDY1MjY5NzI4MTUsIDI5Ljk2MjY0NDc2ODYwNTIxLDI5LjcyMDk3MzM2NTEwMTI3LCA2NC41Mjk0Njc2Nzg4ODc3Niksc2NvcmU9Yyg3Ljg0LDcuNjIsNy41Nyw3LjU1LDcuNDYsIDMuNTEsMy40NywzLjQyLDMuMTUsMi41MikscHVlc3RvPWMoMSwyLDMsNCw1LDE0NSwxNDYsMTQ3LDE0OCwxNDkpLGNvbG9yPWMoInJlZCIsInJlZCIsInJlZCIsInJlZCIsInJlZCIsICJibHVlIiwiYmx1ZSIsImJsdWUiLCJibHVlIiwiYmx1ZSIpKQ0KDQpsb2NhdGlvbl90b3A1IDwtIGxlYWZsZXQoZGF0YT1sb2NhdF90b3A1KSAlPiUgDQogIA0KICBhZGRUaWxlcygpICU+JSAgDQogIA0KICBhZGRNYXJrZXJzKGxhdD1+bGF0aXR1ZCxsbmc9fmxvbmdpdHVkLCBwb3B1cD1wYXN0ZShzZXA9Ijxicj4iLCI8Yj5MdWdhcjo8L2I+Iixsb2NhdF90b3A1JGx1Z2FyLCAiPGI+UHVlc3RvOjwvYj4iLGxvY2F0X3RvcDUkcHVlc3RvLCAiPGI+U2NvcmU6PC9iPiIsbG9jYXRfdG9wNSRzY29yZSkpICU+JSANCiAgDQogIA0KICBhZGRDaXJjbGVNYXJrZXJzKGxhdD1+bGF0aXR1ZCxsbmc9fmxvbmdpdHVkLGNvbG9yPX5jb2xvcixyYWRpdXM9MTApDQoNCmxvY2F0aW9uX3RvcDUNCg0KDQpgYGANCg0KIyMgQmFycGxvdCBQYcOtc2VzIGVuIFN1ZGFtw6lyaWNhDQojIyMgRGlhZ3JhbWEgZGUgQmFycmFzIHVzYW5kbyBHR1BMT1QyDQpTaSBiaWVuIHNlIHRpZW5lIGVuIGN1ZW50YSBlbCByYW5raW5nIGRlIGxvcyBtZWpvcmVzIHkgcGVvcmVzIDUgcGHDrXNlcyBkZWwgKipJbmZvcm1lIE11bmRpYWwgZGUgbGEgRmVsaWNpZGFkKiosIHNlIHByb2NlZGUgYSB0b21hciBlbCBkYXRvIGRlIGxvcyBwYcOtc2VzIGVuIFN1ZGFtw6lyaWNhIHkgZWwgQ2FyaWJlLCBkaWNob3MgZGF0b3MgcHVlZGVuIGV2aWRlbmNpYXIgYcO6biBtw6FzIGVsIGNvbnRleHRvIGVuIGVsIHF1ZSBub3MgZW5jb250cmFtb3MgY29tbyBwYcOtcyB5IGRlIGxvcyBwYcOtc2VzIGFscmVkZWRvciBhc2ltaXNtbyBzZSBwcm9jZWRlIGEgbW9zdHJhciBlbCByZXN1bHRhZG8gZGUgbWFuZXJhIGVzcGFjaWFsaXphZGENCg0KYGBge3Igc3VkYW1lcmljYSBiYXJwbG90IGdncGxvdCxmaWcuYWxpZ249J2NlbnRlcid9DQoNCiNFeHRyYWNjacOzbiBkZSBwYXJ0ZSBkZWwgZGF0YWZyYW1lIC0gUGHDrXNlcyBkZSBTdWRhbcOpcmljYSB5IGVsIENhcmliZQ0Kc3VkX2NvdW50cmllcyA8LSBzdWJzZXQoaGFwcGluZXNzLFJlZ2lvbmFsLmluZGljYXRvcj09IkxhdGluIEFtZXJpY2EgYW5kIENhcmliYmVhbiIpDQoNCiNFeHRyYWNjacOzbiBkZSBjaWVydG9zIGRhdG9zIC0gTm9tYnJlIHkgU2NvcmUNCnN1ZGNvdW50cmllc19pbmZvIDwtIHN1ZF9jb3VudHJpZXMkQ291bnRyeS5uYW1lDQpzdWRzY29yZV9pbmZvIDwtIHN1ZF9jb3VudHJpZXMkTGFkZGVyLnNjb3JlDQoNCiNHZW5lcmFjacOzbiBkZWwgYmFycGxvdCBob3Jpem9udGFsDQpnZ3Bsb3Qoc3VkX2NvdW50cmllcykgKyBnZW9tX2JhciAoYWVzKHg9cmVvcmRlcihzdWRjb3VudHJpZXNfaW5mbywgc3Vkc2NvcmVfaW5mbyksIHk9IHN1ZHNjb3JlX2luZm8sIGZpbGw9c3Vkc2NvcmVfaW5mbyksIHN0YXQgPSJpZGVudGl0eSIsIHNob3cubGVnZW5kID0gRkFMU0UpICsgZ2d0aXRsZSAoIkxhdGluIEFtZXJpY2EgYW5kIENhcmliYmVhbiBIYXBwaW5lc3MgUmVjb3JkIC0gMjAyMSIpKyB0aGVtZShwbG90LnRpdGxlID1lbGVtZW50X3RleHQoaGp1c3Q9MC41KSkgKyB0aGVtZShheGlzLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTApLCBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKSxwbG90LnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE1KSkgKyB4bGFiKCJDb3VudHJpZXMiKSArIHlsYWIoIlNjb3JlIikgKyBjb29yZF9mbGlwKCkrIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93PSJ5ZWxsb3ciLCBoaWdoPSJyZWQiKQ0KDQpgYGANCg0KIyMgTWFwYSBQYcOtc2VzIGVuIFN1ZGFtw6lyaWNhDQojIyMgTWFwYSB1c2FuZG8gR0dQTE9UMg0KU2kgYmllbiB5YSBzZSBjb25vY2UgbGEgaW5mb3JtYWNpw7NuIGVuIFN1ZGFtw6lyaWNhIHkgZWwgQ2FyaWJlIHNlIHByb3BvbmUgZXNwYWNpYWxpemFyIGVzYSBkYXRhIGEgdHJhdsOpcyBkZWwgc2lndWllbnRlIGdyw6FmaWNvIHV0aWxpemFuZG8gR0dQTE9UMg0KDQpgYGB7ciBtYXBhIGdncGxvdCwgZmlnLmFsaWduPSdjZW50ZXInfQ0Kc3VkX2hhcHBpbmVzczwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9MZW5vdm8vRG9jdW1lbnRzL1RSQUJBSk8gRklOQUwgUi9DU1Yvd29ybGQtaGFwcGluZXNzLXJlcG9ydC0yMDIxLTIyLXN1ZGQuY3N2IikNCg0KI0NyZWFjacOzbiBkZSBkYXRhIGZyYW1lDQpzdWRfZnJhbWUgPC0gZGF0YS5mcmFtZShzdWRfaGFwcGluZXNzKQ0KDQojc2VwYXJhciBkYXRvcyBkZWwgZGF0YSBmcmFtZQ0Kc3VkZGF0YV9jb3VudHJpZXMgPC0gc3Vic2V0KHN1ZF9mcmFtZSxSZWdpb25hbC5pbmRpY2F0b3I9PSJMYXRpbiBBbWVyaWNhIGFuZCBDYXJpYmJlYW4iKQ0KDQojanVudGFyIGluZm8gZW4gYW1ib3MgZGF0YXNldHMgYSBwYXJ0aXIgZGUgbGEgY29sdW1uYSByZWdpb24NCm1hcGRhdGEgPC0gbWFwX2RhdGEoIndvcmxkIikgI3ZlciBpbmZvIGFscmVkZWRvciBkZWwgbXVuZG8NCg0KbWFwZGF0YSA8LSBsZWZ0X2pvaW4obWFwZGF0YSxzdWRkYXRhX2NvdW50cmllcyxieT0icmVnaW9uIikNCg0KI1NlbGVjY2lvbmFyIHPDs2xvIGxvcyBkYXRvcyBxdWUgY3VtcGxlbiBjb24gbGEgY29sdW1uYSBMYWRkZXIuU2NvcmUNCm1hcGRhdGExIDwtIG1hcGRhdGEgJT4lIGZpbHRlcighaXMubmEobWFwZGF0YSRMYWRkZXIuc2NvcmUpKQ0KDQojR2VuZXJhciBtYXBhDQpnZ3Bsb3QobWFwZGF0YTEsIGFlcyh4PWxvbmcsIHk9bGF0LCBncm91cD1ncm91cCkpKw0KICBnZW9tX3BvbHlnb24oYWVzKGZpbGw9TGFkZGVyLnNjb3JlKSwgY29sb3IgPSAiYmxhY2siKSsNCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lID0gIlNjb3JlIiwgbG93ID0ieWVsbG93IiwgaGlnaCA9ICJyZWQiICxuYS52YWx1ZT0iZ3JleTUwIikrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIHJlY3Q9IGVsZW1lbnRfYmxhbmsoKSkNCmBgYA0KDQojIyBCdWJibGUgcGxvdCBjb3JydXBjacOzbiB5IHNvcG9ydGUgc29jaWFsDQojIyMgQnViYmxlIHBsb3QgdXNhbmRvIEdHUExPVDINCkVuIGVzdGUgZ3LDoWZpY28gc2UgcHJldGVuZGUgZXZpZGVuY2lhciBsYSByZWxhY2nDs24gZGUgdHJlcyBkYXRvcywgZXhwZWN0YXRpdmEgZGUgdmlkYSwgY29ycnVwY2nDs24sIHNvcG9ydGUgc29jaWFsIHkgZWwgcmVzdWx0YWRvIHF1ZSBzZSBldmlkZW5jaWEgZW4gbGEgZW5jdWVzdGEuIERlbW9zdHJhbmRvIHF1ZSBlc3RvcyB2YWxvcmVzIGd1YXJkYW4gcmVsYWNpw7NuIGVudHJlIHPDrS4NCg0KYGBge3IgYnViYmxlcGxvdCBnZ3Bsb3QsIGZpZy5hbGlnbj0nY2VudGVyJ30NCg0KTGlmZV9leHBlY3RhbmN5IDwtIGhhcHBpbmVzcyRIZWFsdGh5LmxpZmUuZXhwZWN0YW5jeQ0KU2NvcmUgPC0gaGFwcGluZXNzJExhZGRlci5zY29yZQ0KY29ycnVwdGlvbiA8LSBoYXBwaW5lc3MkUGVyY2VwdGlvbnMub2YuY29ycnVwdGlvbg0Kc29jaWFsX3N1cHBvcnQgPC0gaGFwcGluZXNzJFNvY2lhbC5zdXBwb3J0DQoNCiNHZW5lcmFjacOzbiBkZWwgcGxhbm8NCmdncGxvdChoYXBwaW5lc3MpICsgZ2VvbV9qaXR0ZXIoYWVzKHg9Y29ycnVwdGlvbiwgeT1MaWZlX2V4cGVjdGFuY3ksIGNvbG9yPVNjb3JlLCBzaXplPXNvY2lhbF9zdXBwb3J0KSwgYWxwaGE9MC42KSsgeGxhYigiQ29ycnVwdGlvbiIpK3lsYWIoIkhlYWx0aCBMaWZlIEV4cGVjdGFuY3kiKSsgdGhlbWUoYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTEwKSwgYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xMCkscGxvdC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNSkpK2xhYnMoY29sb3I9IlNjb3JlIiwgc2l6ZT0iU29jaWFsIFxuIFN1cHBvcnQiKSArIHNjYWxlX2NvbG9yX3ZpcmlkaXMoKQ0KDQpgYGANCg0KDQo=