Collect data from World Bank and make a Bubble Plot

#=======================================================================================================
# Reference: https://cran.r-project.org/web/packages/wbstats/vignettes/Using_the_wbstats_package.html
# https://www.r-bloggers.com/life-expectancy-animated/
#=======================================================================================================
# Load wbstats package:
library(wbstats)
# General information in list structure:
general_information <- wb_cachelist
# Show some basic information:
str(general_information, max.level = 1)
#---------------------------------------------------------------------
# Extract data frame that contains general information for countries
#---------------------------------------------------------------------
df_countries <- general_information[[1]]
# Some insights, for example, income group:
library(tidyverse)
df_countries %>%
group_by(income) %>%
count() %>%
ungroup()
#------------------------------
# Indicators provided by WB
#------------------------------
df_indicators <- general_information[[2]]
# Number of indicators:
dim(df_indicators)
# Description for indicators:
df_indicators %>%
filter(str_detect(indicator, "gross domestic")) %>%
head() %>%
View()
df_indicators %>%
filter(str_detect(indicator, "capital")) %>%
head() %>%
View()
df_indicators %>%
filter(str_detect(indicator, "death")) %>%
head() %>%
View()
df_indicators %>%
filter(str_detect(indicator, "tax")) %>%
head() %>%
View()
df_indicators %>%
filter(str_detect(indicator, "Population")) %>%
head() %>%
View()
# A list of indicators:
my_indicator <- c("SP.POP.TOTL", "SP.DYN.LE00.IN", "NY.GDP.PCAP.PP.CD")
df_indicators %>%
filter(indicatorID %in% my_indicator) %>%
select(1:2)
# Collect data for an indicator for all nations:
educ_data <- wb(country = "all",
indicator = "PRJ.POP.2024.3.MF",
startdate = 2000,
enddate = 2018)
# Collect data, an indicator for some nations:
educ_data_3nations <- wb(country = c("AFG", "AGO", "VNM"),
indicator = "SH.TBS.MORT",
startdate = 2016,
enddate = 2017)
# Collect some indicators for some nations:
educ_tuberculosis <- wb(country = c("AFG", "AGO", "VNM"),
indicator = c("SH.TBS.MORT", "PRJ.POP.2024.3.MF"),
startdate = 2016,
enddate = 2017) # Example 1.
mydf <- wb(country = "all",
indicator = my_indicator,
startdate = 2016,
enddate = 2017) # Example 2.
# Rename some columns and filter data for year of 2016:
mydf_small <- mydf %>%
filter(date == 2016) %>%
select(country, iso2c, indicatorID, value)
# Convert to wide form and rename for some columns:
mydf_small %>%
ungroup() %>%
spread(key = "indicatorID", value = "value") %>%
na.omit() %>%
rename(pop = SP.POP.TOTL, life = SP.DYN.LE00.IN, gdp = NY.GDP.PCAP.PP.CD) -> mydf_small_wide
# Filter our data (remove Aggregates label):
income_group <- df_countries %>%
mutate_if(is.factor, as.character) %>%
filter(income != "Aggregates") %>%
select(iso2c, region, income)
# Meger data sets and remove missing points:
total_df <- right_join(mydf_small_wide, income_group, by = "iso2c") %>% na.omit()
#-------------------------------------------------------------------------------------------------------------
# Page 38 from A. Deaton's book (https://www.amazon.com/gp/product/0691165629/ref=dbs_a_def_rwt_bibl_vppi_i0)
#-------------------------------------------------------------------------------------------------------------
library(ggrepel)
library(scales)
library(ggsci)
library(extrafont)
my_font <- "Roboto Condensed"
my_country <- c("Vietnam", "China", "India", "Thailand", "Malaysia", "France", "Cambodia",
"Germany", "Japan", "Nigeria", "Indonesia", "Singapore", "Philippines") # Select some nations.
total_df %>%
filter(gdp < 100000) %>%
ggplot(aes(gdp, life, size = pop, color = income)) +
geom_point(alpha = 0.5) +
geom_smooth(method = "lm", formula = y ~ log(x), color = "orange", alpha = 0.1, se = FALSE) +
geom_text_repel(data = total_df %>% filter(country %in% my_country), aes(label = country), color = "gray20", size = 5, force = 19, family = my_font) +
scale_x_continuous(breaks = seq(0, 100000, 10000), labels = dollar) +
scale_y_continuous(breaks = seq(50, 85, 5)) +
scale_size(range = c(1, 30)) +
scale_color_lancet(name = "Group:") +
guides(size = FALSE) +
labs(x = "GDP per capital",
y = "Life expectancy",
title = "The relationship between Life Expectancy and GDP per capital in 2016",
subtitle = "According to WHO definitions, Life Expectancy at reflects the overall mortality level of a population and it is defined as\nthe average number of years that a newborn is expected to live if current mortality rates continue to apply. ",
caption = "Data Source: The World Bank") +
theme_minimal() +
theme(legend.position = c(0.83, 0.30)) +
theme(legend.title = element_text(size = 12, face = "bold", family = my_font)) +
theme(plot.margin = unit(c(1, 1, 1, 1), "cm")) +
theme(plot.title = element_text(family = my_font, size = 26, color = "gray10")) +
theme(plot.subtitle = element_text(family = my_font, size = 15, color = "gray40")) +
theme(plot.caption = element_text(family = my_font, size = 12, color = "gray40", face = "italic")) +
theme(axis.text = element_text(family = my_font, size = 14, color = "gray30")) +
theme(legend.text = element_text(family = my_font, size = 12, color = "grey30")) +
theme(legend.title = element_text(family = my_font, size = 12, color = "grey30")) +
theme(axis.title = element_text(family = my_font, size = 15)) +
# theme(axis.title.x = element_text(family = my_font, size = 15, hjust = 0)) +
# theme(axis.title.y = element_text(family = my_font, size = 15, hjust = 1)) +
theme(panel.grid.minor = element_blank()) +
theme(plot.background = element_rect(fill = "seashell", color = NA))
LS0tDQp0aXRsZTogIndic3RhdHMgLSBSIFBhY2thZ2UgZm9yIENvbGxlY3RpbmcgRGF0YSBGcm9tIFdvcmxkIEJhbmsiDQphdXRob3I6ICJOZ3V5ZW4gQ2hpIER1bmciDQpzdWJ0aXRsZTogIkRhaWx5IEdyYXBoIFNlcmllcyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICB0aGVtZTogZmxhdGx5DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy5yZXRpbmE9MikNCmBgYA0KDQojIENvbGxlY3QgZGF0YSBmcm9tIFdvcmxkIEJhbmsgYW5kIG1ha2UgYSBCdWJibGUgUGxvdA0KDQohW10oQzpcXFVzZXJzXFxaYm9va1xcRGVza3RvcFxcRGVwb2Nlbl9Db3Vyc2VcXGIyLmpwZykNCg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQojICBSZWZlcmVuY2U6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy93YnN0YXRzL3ZpZ25ldHRlcy9Vc2luZ190aGVfd2JzdGF0c19wYWNrYWdlLmh0bWwNCiMgICAgICAgICAgICAgaHR0cHM6Ly93d3cuci1ibG9nZ2Vycy5jb20vbGlmZS1leHBlY3RhbmN5LWFuaW1hdGVkLw0KIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCg0KIyBMb2FkIHdic3RhdHMgcGFja2FnZTogDQoNCmxpYnJhcnkod2JzdGF0cykNCg0KIyBHZW5lcmFsIGluZm9ybWF0aW9uIGluIGxpc3Qgc3RydWN0dXJlOiANCg0KZ2VuZXJhbF9pbmZvcm1hdGlvbiA8LSAgd2JfY2FjaGVsaXN0DQoNCiMgU2hvdyBzb21lIGJhc2ljIGluZm9ybWF0aW9uOiANCnN0cihnZW5lcmFsX2luZm9ybWF0aW9uLCBtYXgubGV2ZWwgPSAxKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgRXh0cmFjdCBkYXRhIGZyYW1lIHRoYXQgY29udGFpbnMgZ2VuZXJhbCBpbmZvcm1hdGlvbiBmb3IgY291bnRyaWVzDQojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KZGZfY291bnRyaWVzIDwtIGdlbmVyYWxfaW5mb3JtYXRpb25bWzFdXQ0KDQoNCiMgU29tZSBpbnNpZ2h0cywgZm9yIGV4YW1wbGUsIGluY29tZSBncm91cDogDQoNCmxpYnJhcnkodGlkeXZlcnNlKQ0KDQpkZl9jb3VudHJpZXMgJT4lIA0KICBncm91cF9ieShpbmNvbWUpICU+JSANCiAgY291bnQoKSAlPiUgDQogIHVuZ3JvdXAoKQ0KDQoNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgIEluZGljYXRvcnMgcHJvdmlkZWQgYnkgV0INCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpkZl9pbmRpY2F0b3JzIDwtIGdlbmVyYWxfaW5mb3JtYXRpb25bWzJdXQ0KDQojIE51bWJlciBvZiBpbmRpY2F0b3JzOiANCg0KZGltKGRmX2luZGljYXRvcnMpDQoNCiMgRGVzY3JpcHRpb24gZm9yIGluZGljYXRvcnM6IA0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiZ3Jvc3MgZG9tZXN0aWMiKSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBWaWV3KCkNCg0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiY2FwaXRhbCIpKSAlPiUgDQogIGhlYWQoKSAlPiUgDQogIFZpZXcoKQ0KDQoNCmRmX2luZGljYXRvcnMgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3IsICJkZWF0aCIpKSAlPiUgDQogIGhlYWQoKSAlPiUgDQogIFZpZXcoKQ0KDQpkZl9pbmRpY2F0b3JzICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAidGF4IikpICU+JSANCiAgaGVhZCgpICU+JSANCiAgVmlldygpDQoNCg0KZGZfaW5kaWNhdG9ycyAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvciwgIlBvcHVsYXRpb24iKSkgJT4lIA0KICBoZWFkKCkgJT4lIA0KICBWaWV3KCkNCg0KIyBBIGxpc3Qgb2YgaW5kaWNhdG9yczogDQoNCm15X2luZGljYXRvciA8LSBjKCJTUC5QT1AuVE9UTCIsICJTUC5EWU4uTEUwMC5JTiIsICJOWS5HRFAuUENBUC5QUC5DRCIpDQoNCmRmX2luZGljYXRvcnMgJT4lIA0KICBmaWx0ZXIoaW5kaWNhdG9ySUQgJWluJSBteV9pbmRpY2F0b3IpICU+JSANCiAgc2VsZWN0KDE6MikNCg0KDQojIENvbGxlY3QgZGF0YSBmb3IgYW4gaW5kaWNhdG9yIGZvciBhbGwgbmF0aW9uczogDQoNCmVkdWNfZGF0YSA8LSB3Yihjb3VudHJ5ID0gImFsbCIsDQogICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gIlBSSi5QT1AuMjAyNC4zLk1GIiwNCiAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDAwLA0KICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE4KQ0KDQojIENvbGxlY3QgZGF0YSwgYW4gaW5kaWNhdG9yIGZvciBzb21lIG5hdGlvbnM6IA0KDQplZHVjX2RhdGFfM25hdGlvbnMgPC0gd2IoY291bnRyeSA9IGMoIkFGRyIsICJBR08iLCAiVk5NIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdG9yID0gIlNILlRCUy5NT1JUIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGRhdGUgPSAyMDE2LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE3KQ0KDQojIENvbGxlY3Qgc29tZSBpbmRpY2F0b3JzIGZvciBzb21lIG5hdGlvbnM6IA0KDQplZHVjX3R1YmVyY3Vsb3NpcyA8LSB3Yihjb3VudHJ5ID0gYygiQUZHIiwgIkFHTyIsICJWTk0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRvciA9IGMoIlNILlRCUy5NT1JUIiwgIlBSSi5QT1AuMjAyNC4zLk1GIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRkYXRlID0gMjAxNiwNCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZGRhdGUgPSAyMDE3KSAjIEV4YW1wbGUgMS4gDQoNCg0KDQoNCm15ZGYgPC0gd2IoY291bnRyeSA9ICJhbGwiLA0KICAgICAgICAgICBpbmRpY2F0b3IgPSBteV9pbmRpY2F0b3IsIA0KICAgICAgICAgICBzdGFydGRhdGUgPSAyMDE2LA0KICAgICAgICAgICBlbmRkYXRlID0gMjAxNykgIyBFeGFtcGxlIDIuIA0KDQoNCg0KIyBSZW5hbWUgc29tZSBjb2x1bW5zIGFuZCBmaWx0ZXIgZGF0YSBmb3IgeWVhciBvZiAyMDE2OiANCg0KbXlkZl9zbWFsbCA8LSBteWRmICU+JSANCiAgZmlsdGVyKGRhdGUgPT0gMjAxNikgJT4lIA0KICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIGluZGljYXRvcklELCB2YWx1ZSkNCg0KDQojIENvbnZlcnQgdG8gd2lkZSBmb3JtIGFuZCByZW5hbWUgZm9yIHNvbWUgY29sdW1uczogDQoNCm15ZGZfc21hbGwgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBzcHJlYWQoa2V5ID0gImluZGljYXRvcklEIiwgdmFsdWUgPSAidmFsdWUiKSAlPiUgDQogIG5hLm9taXQoKSAlPiUgDQogIHJlbmFtZShwb3AgPSBTUC5QT1AuVE9UTCwgbGlmZSA9IFNQLkRZTi5MRTAwLklOLCBnZHAgPSBOWS5HRFAuUENBUC5QUC5DRCkgLT4gbXlkZl9zbWFsbF93aWRlDQoNCg0KIyBGaWx0ZXIgb3VyIGRhdGEgKHJlbW92ZSBBZ2dyZWdhdGVzIGxhYmVsKTogDQoNCmluY29tZV9ncm91cCA8LSBkZl9jb3VudHJpZXMgJT4lIA0KICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpICU+JSANCiAgZmlsdGVyKGluY29tZSAhPSAiQWdncmVnYXRlcyIpICU+JSANCiAgc2VsZWN0KGlzbzJjLCByZWdpb24sIGluY29tZSkNCg0KDQojIE1lZ2VyIGRhdGEgc2V0cyBhbmQgcmVtb3ZlIG1pc3NpbmcgcG9pbnRzOiANCg0KdG90YWxfZGYgPC0gcmlnaHRfam9pbihteWRmX3NtYWxsX3dpZGUsIGluY29tZV9ncm91cCwgYnkgPSAiaXNvMmMiKSAlPiUgbmEub21pdCgpDQoNCg0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiMgUGFnZSAzOCBmcm9tIEEuIERlYXRvbidzIGJvb2sgKGh0dHBzOi8vd3d3LmFtYXpvbi5jb20vZ3AvcHJvZHVjdC8wNjkxMTY1NjI5L3JlZj1kYnNfYV9kZWZfcnd0X2JpYmxfdnBwaV9pMCkNCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ3NjaSkNCmxpYnJhcnkoZXh0cmFmb250KQ0KbXlfZm9udCA8LSAiUm9ib3RvIENvbmRlbnNlZCINCg0KDQpteV9jb3VudHJ5IDwtIGMoIlZpZXRuYW0iLCAiQ2hpbmEiLCAiSW5kaWEiLCAiVGhhaWxhbmQiLCAiTWFsYXlzaWEiLCAiRnJhbmNlIiwgIkNhbWJvZGlhIiwgDQogICAgICAgICAgICAgICAgIkdlcm1hbnkiLCAiSmFwYW4iLCAiTmlnZXJpYSIsICJJbmRvbmVzaWEiLCAiU2luZ2Fwb3JlIiwgIlBoaWxpcHBpbmVzIikgIyBTZWxlY3Qgc29tZSBuYXRpb25zLiANCg0KDQp0b3RhbF9kZiAlPiUgDQogIGZpbHRlcihnZHAgPCAxMDAwMDApICU+JSANCiAgZ2dwbG90KGFlcyhnZHAsIGxpZmUsIHNpemUgPSBwb3AsIGNvbG9yID0gaW5jb21lKSkgKyANCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNSkgKyANCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgZm9ybXVsYSA9IHkgfiBsb2coeCksIGNvbG9yID0gIm9yYW5nZSIsIGFscGhhID0gMC4xLCBzZSA9IEZBTFNFKSArIA0KICBnZW9tX3RleHRfcmVwZWwoZGF0YSA9IHRvdGFsX2RmICU+JSBmaWx0ZXIoY291bnRyeSAlaW4lIG15X2NvdW50cnkpLCBhZXMobGFiZWwgPSBjb3VudHJ5KSwgY29sb3IgPSAiZ3JheTIwIiwgc2l6ZSA9IDUsIGZvcmNlID0gMTksIGZhbWlseSA9IG15X2ZvbnQpICsgDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAwLCAxMDAwMCksIGxhYmVscyA9IGRvbGxhcikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IHNlcSg1MCwgODUsIDUpKSArIA0KICBzY2FsZV9zaXplKHJhbmdlID0gYygxLCAzMCkpICsgDQogIHNjYWxlX2NvbG9yX2xhbmNldChuYW1lID0gIkdyb3VwOiIpICsgDQogIGd1aWRlcyhzaXplID0gRkFMU0UpICsgDQogIGxhYnMoeCA9ICJHRFAgcGVyIGNhcGl0YWwiLCANCiAgICAgICB5ID0gIkxpZmUgZXhwZWN0YW5jeSIsIA0KICAgICAgIHRpdGxlID0gIlRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBMaWZlIEV4cGVjdGFuY3kgYW5kIEdEUCBwZXIgY2FwaXRhbCBpbiAyMDE2IiwgDQogICAgICAgc3VidGl0bGUgPSAiQWNjb3JkaW5nIHRvIFdITyBkZWZpbml0aW9ucywgTGlmZSBFeHBlY3RhbmN5IGF0IHJlZmxlY3RzIHRoZSBvdmVyYWxsIG1vcnRhbGl0eSBsZXZlbCBvZiBhIHBvcHVsYXRpb24gYW5kIGl0IGlzIGRlZmluZWQgYXNcbnRoZSBhdmVyYWdlIG51bWJlciBvZiB5ZWFycyB0aGF0IGEgbmV3Ym9ybiBpcyBleHBlY3RlZCB0byBsaXZlIGlmIGN1cnJlbnQgbW9ydGFsaXR5IHJhdGVzIGNvbnRpbnVlIHRvIGFwcGx5LiAiLCANCiAgICAgICBjYXB0aW9uID0gICJEYXRhIFNvdXJjZTogVGhlIFdvcmxkIEJhbmsiKSArIA0KICB0aGVtZV9taW5pbWFsKCkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYygwLjgzLCAwLjMwKSkgKyANCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiwgZmFtaWx5ID0gbXlfZm9udCkpICsgDQogIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDEsIDEsIDEsIDEpLCAiY20iKSkgKyANCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMjYsIGNvbG9yID0gImdyYXkxMCIpKSArIA0KICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgY29sb3IgPSAiZ3JheTQwIikpICsgDQogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTIsIGNvbG9yID0gImdyYXk0MCIsIGZhY2UgPSAiaXRhbGljIikpICsgDQogIHRoZW1lKGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTQsIGNvbG9yID0gImdyYXkzMCIpKSArIA0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTIsIGNvbG9yID0gImdyZXkzMCIpKSArIA0KICB0aGVtZShsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEyLCBjb2xvciA9ICJncmV5MzAiKSkgKyANCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTUpKSArIA0KICAjIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTUsIGhqdXN0ID0gMCkpICsgDQogICMgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxNSwgaGp1c3QgPSAxKSkgKyANCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJzZWFzaGVsbCIsIGNvbG9yID0gTkEpKQ0KDQogIA0KYGBgDQoNCg==