Economist-Style Plot using R
Origin of the Economist plot can be found here. In searching a more simpler method of plotting, this plot can be created by only using ggplot2 as follows:

R Codes for Data Cleaning and Visualization
Before going ahead, you can read part 1 for creating left plot here. R codes for replicating above Economist Plot:
#=======================
# Create a fake data
#=======================
library(tidyverse)
sector <- c("Oild, gas, coal", "Metals", "Banking & Finance", "Other",
"Telecoms/IT", "Real estate", "Chemicals and Fertiliser")
bySector <- tibble(sector = sector,
year2005 = c(57, 49, 30, 5, 4, 1, 1),
year2015 = c(28, 20, 32, 25, 6, 19, 11))
bySector %>% mutate(sector = factor(sector, levels = sector)) -> bySector
# Prepare data for plotting
my_font <- "Ubuntu Condensed"
colorSector <- c("#68382C", "#D6777E", "#00A4E6", "grey40",
"#eca324", "#8abbd0", "#9ae5de")
legendLabels <- sector <- c("Oild, gas, coal", "Metals", "Banking & Finance", "Other",
"Telecoms / IT", "Real estate", "Chemicals\nand fertiliser")
#=======================
# Create right plot
#======================
pointPosition_y <- seq(4, 20, length.out = 4)
pointPosition_y <- pointPosition_y[1:3]
ggplot() +
geom_segment(aes(x = rep(2005, 4), xend = rep(2016, 4),
y = seq(0, 60, 20), yend = seq(0, 60, 20)), color = "grey70", size = 0.7) +
geom_segment(aes(x = 2005, xend = 2005, y = 0, yend = 60), color = "grey70", size = 0.7) +
geom_segment(aes(x = 2015, xend = 2015, y = 0, yend = 60), color = "grey70", size = 0.7) +
geom_point(data = bySector, aes(x = 2005, y = year2005, color = sector), size = 4, show.legend = FALSE) +
geom_point(data = bySector, aes(x = 2015, y = year2015, color = sector), size = 4, show.legend = FALSE) +
geom_segment(aes(x = 2005, xend = 2015, y = bySector$year2005, yend = bySector$year2015, color = bySector$sector), size = 2, show.legend = FALSE) +
theme(panel.background = element_rect(fill = "white")) +
theme(plot.background = element_rect(fill = "grey90")) +
theme(axis.title = element_blank()) +
theme(axis.text = element_blank()) +
theme(axis.ticks = element_blank()) +
scale_y_continuous(limits = c(-1, 63)) +
scale_x_continuous(limits = c(2000, 2016.5)) +
scale_color_manual(values = colorSector) +
geom_text(aes(x = c(2005, 2015), y = c(-1, -1), label = c("2005", "2015")), family = my_font, color = "grey20", size = 5, vjust = 1) +
geom_text(aes(x = rep(2016.5, 4), y = seq(0, 60, 20), label = seq(0, 60, 20)), family = my_font, color = "grey30", size = 6) +
geom_point(aes(x = 2000, y = c(bySector$year2005[1:3], 20)), color = colorSector[1:4], size = 4) +
geom_text(aes(x = 2000 + 0.3, y = c(bySector$year2005[1:3], 20)), label = legendLabels[1:4], hjust = 0, family = my_font, size = 6, color = "grey30") +
geom_point(aes(x = 2000, y = pointPosition_y), color = colorSector[7:5], size = 4) +
geom_text(aes(x = 2000 + 0.3, y = pointPosition_y), label = legendLabels[7:5], hjust = 0, family = my_font, size = 6, color = "grey30") +
geom_text(aes(x = 2000, y = 63, label = "by sector*, %"), size = 6, color = "black", family = my_font, hjust = 0.1, vjust = -0.5) +
theme(plot.margin = unit(c(1.2, 1, 0.7, 0.7 / 2), "cm")) +
labs(caption = "*some billionaires were involved in multi sectors", title = "", subtitle = "") +
theme(plot.caption = element_text(family = my_font, size = 12, vjust = -3)) +
theme(plot.title = element_text(size = 22, face = "bold", vjust = 4)) +
theme(plot.subtitle = element_text(size = 18, vjust = 5)) -> right_plot
#======================
# Create left plot
#======================
myColors <- c("#68382C", "#00A4E6")
# Data for ploting:
dat <- read.csv(text = "Year,Russia,World
1996,0,423
1997,4,220
1998,1,221
1999,0,298
2000,0,322
2001,8,530
2002,6,466
2003,17,459
2004,25,562
2005,27,664
2006,33,760
2007,53,893
2008,87,1038
2009,32,761
2010,62,949
2011,101,1109
2012,96,1130
2013,110,1317
2014,111,1535
2015,88,1738", header = TRUE)
# Left graph:
ggplot() +
annotate("curve",
curvature = 0,
x = 1995.8,
xend = 2015.5,
y = seq(50, 200, 50),
yend = seq(50, 200, 50),
color = "gray70", size = 0.7) +
annotate("curve",
curvature = 0,
x = 1995.8,
xend = 2015.5,
y = 0,
yend = 0,
color = "gray30", size = 0.7) +
annotate("curve",
curvature = 0,
x = c(1996, 2000, 2005, 2010, 2015),
xend = c(1996, 2000, 2005, 2010, 2015),
y = 0,
yend = -2.5, color = "gray30", size = 0.7) +
annotate("text",
x = c(1996, 2000, 2005, 2010, 2015),
y = 0,
label = c("1996", "2000", "05", "10", "15"),
family = my_font,
size = 5,
color = "grey20", vjust = 2) +
geom_line(data = dat, aes(Year, Russia), color = myColors[1], size = 1.7) +
geom_line(data = dat, aes(Year, World / 10), color = myColors[2], size = 1.7) +
scale_y_continuous(limits = c(-5, 215)) +
scale_x_continuous(limits = c(1995.5, 2016.5), breaks = seq(1996, 2015, 1)) +
theme(panel.grid.major = element_blank()) +
theme(panel.grid.minor = element_blank()) +
annotate("text", x = 1995.5, y = seq(0, 200, 50), label = seq(0, 200, 50),
hjust = 0.7, color = myColors[1], size = 5.5, family = my_font) +
annotate("text", x = 2015.5, y = seq(0, 200, 50), label = seq(0, 2000, 500),
hjust = -0.2, color = myColors[2], size = 5.5, family = my_font) +
theme(axis.title = element_blank(), axis.text = element_blank()) +
theme(axis.ticks = element_blank()) +
theme(panel.background = element_rect(fill = "white")) +
theme(plot.background = element_rect(fill = "grey90")) +
annotate("text", x = 1995.5, y = 210, label = "Number in Russia", hjust = 0.1, vjust = -1.8,
size = 6, family = my_font, color = myColors[1], fontface = "bold") +
annotate("text", x = 2015.5, y = 210, label = "Rest of world", vjust = -1.8, hjust = 0.6,
size = 6, family = my_font, color = myColors[2], fontface = "bold") +
theme(plot.margin = unit(c(1.2, 0.7 / 2, 0.3, 1), "cm")) +
labs(caption = "Source: Russia’s billionaires\nD.Treisman, American Economic Review (2016)",
title = "Off the rich list", subtitle = "Russia billionaires") +
theme(plot.caption = element_text(family = my_font, size = 12, vjust = -0.3, hjust = 0)) +
theme(plot.title = element_text(family = my_font, size = 22, face = "bold", vjust = 4)) +
theme(plot.subtitle = element_text(family = my_font, size = 18, color = "grey30", vjust = 5)) -> left_plot
# library(gridExtra)
# grid.arrange(left_plot, right_plot, ncol = 2)
library(grid)
grid.draw(grobTree(rectGrob(gp = gpar(fill = "grey30")), arrangeGrob(left_plot, right_plot, ncol = 2)))
grid.rect(x = 0.015, y = 0.93, hjust = 1, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
grid.rect(x = 1, y = 1 - 0.005, hjust = 1, vjust = 0, gp = gpar(fill = "#e5001c", lwd = 0))
LS0tCnRpdGxlOiAiUGl0eSBSdXNzaWHigJlzIGJpbGxpb25haXJlcyAoY29tcGxldGUgdmVyc2lvbikiCmF1dGhvcjogIk5ndXllbiBDaGkgRHVuZyIKc3VidGl0bGU6IERhaWx5IEdyYXBoIFNlcmllcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICB0aGVtZTogZmxhdGx5CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCmBgYHtyIHNldHVwLGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0ID0gNikKYGBgCgojIEVjb25vbWlzdC1TdHlsZSBQbG90IHVzaW5nIFIKCk9yaWdpbiBvZiB0aGUgRWNvbm9taXN0IHBsb3QgY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3d3dy5lY29ub21pc3QuY29tL2dyYXBoaWMtZGV0YWlsLzIwMTYvMDUvMTkvcGl0eS1ydXNzaWFzLWJpbGxpb25haXJlcykuIEluIHNlYXJjaGluZyBhIG1vcmUgc2ltcGxlciBtZXRob2Qgb2YgcGxvdHRpbmcsIHRoaXMgcGxvdCBjYW4gYmUgY3JlYXRlZCBieSBvbmx5IHVzaW5nIGdncGxvdDIgYXMgZm9sbG93czogCiAgCiFbXSgvaG9tZS9raGFuaGFuL2JpbGxpb24yLnBuZykKCgojIFIgQ29kZXMgZm9yIERhdGEgQ2xlYW5pbmcgYW5kIFZpc3VhbGl6YXRpb24KCkJlZm9yZSBnb2luZyBhaGVhZCwgeW91IGNhbiByZWFkIHBhcnQgMSBmb3IgY3JlYXRpbmcgbGVmdCBwbG90IFtoZXJlXShodHRwczovL3JwdWJzLmNvbS9jaGlkdW5na3QvNTY0MDQ2KS4gUiBjb2RlcyBmb3IgcmVwbGljYXRpbmcgYWJvdmUgRWNvbm9taXN0IFBsb3Q6IAoKYGBge3IsIGV2YWw9RkFMU0V9CiM9PT09PT09PT09PT09PT09PT09PT09PQojICBDcmVhdGUgYSBmYWtlIGRhdGEKIz09PT09PT09PT09PT09PT09PT09PT09CgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCnNlY3RvciA8LSBjKCJPaWxkLCBnYXMsIGNvYWwiLCAiTWV0YWxzIiwgIkJhbmtpbmcgJiBGaW5hbmNlIiwgIk90aGVyIiwgCiAgICAgICAgICAgICJUZWxlY29tcy9JVCIsICJSZWFsIGVzdGF0ZSIsICJDaGVtaWNhbHMgYW5kIEZlcnRpbGlzZXIiKQoKYnlTZWN0b3IgPC0gdGliYmxlKHNlY3RvciA9IHNlY3RvciwgCiAgICAgICAgICAgICAgICAgICB5ZWFyMjAwNSA9IGMoNTcsIDQ5LCAzMCwgNSwgNCwgMSwgMSksIAogICAgICAgICAgICAgICAgICAgeWVhcjIwMTUgPSBjKDI4LCAyMCwgMzIsIDI1LCA2LCAxOSwgMTEpKQoKYnlTZWN0b3IgJT4lIG11dGF0ZShzZWN0b3IgPSBmYWN0b3Ioc2VjdG9yLCBsZXZlbHMgPSBzZWN0b3IpKSAtPiBieVNlY3RvcgoKCiMgUHJlcGFyZSBkYXRhIGZvciBwbG90dGluZyAKCm15X2ZvbnQgPC0gIlVidW50dSBDb25kZW5zZWQiCgpjb2xvclNlY3RvciA8LSBjKCIjNjgzODJDIiwgIiNENjc3N0UiLCAiIzAwQTRFNiIsICJncmV5NDAiLCAKICAgICAgICAgICAgICAgICAiI2VjYTMyNCIsICIjOGFiYmQwIiwgIiM5YWU1ZGUiKQoKbGVnZW5kTGFiZWxzIDwtIHNlY3RvciA8LSBjKCJPaWxkLCBnYXMsIGNvYWwiLCAiTWV0YWxzIiwgIkJhbmtpbmcgJiBGaW5hbmNlIiwgIk90aGVyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGVsZWNvbXMgLyBJVCIsICJSZWFsIGVzdGF0ZSIsICJDaGVtaWNhbHNcbmFuZCBmZXJ0aWxpc2VyIikKCgojPT09PT09PT09PT09PT09PT09PT09PT0KIyAgQ3JlYXRlIHJpZ2h0IHBsb3QKIz09PT09PT09PT09PT09PT09PT09PT0KCnBvaW50UG9zaXRpb25feSA8LSBzZXEoNCwgMjAsIGxlbmd0aC5vdXQgPSA0KQpwb2ludFBvc2l0aW9uX3kgPC0gcG9pbnRQb3NpdGlvbl95WzE6M10KCmdncGxvdCgpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gcmVwKDIwMDUsIDQpLCB4ZW5kID0gcmVwKDIwMTYsIDQpLCAKICAgICAgICAgICAgICAgICAgIHkgPSBzZXEoMCwgNjAsIDIwKSwgeWVuZCA9IHNlcSgwLCA2MCwgMjApKSwgY29sb3IgPSAiZ3JleTcwIiwgc2l6ZSA9IDAuNykgKyAKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAyMDA1LCB4ZW5kID0gMjAwNSwgeSA9IDAsIHllbmQgPSA2MCksIGNvbG9yID0gImdyZXk3MCIsIHNpemUgPSAwLjcpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMjAxNSwgeGVuZCA9IDIwMTUsIHkgPSAwLCB5ZW5kID0gNjApLCBjb2xvciA9ICJncmV5NzAiLCBzaXplID0gMC43KSArIAogIGdlb21fcG9pbnQoZGF0YSA9IGJ5U2VjdG9yLCBhZXMoeCA9IDIwMDUsIHkgPSB5ZWFyMjAwNSwgY29sb3IgPSBzZWN0b3IpLCBzaXplID0gNCwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKyAKICBnZW9tX3BvaW50KGRhdGEgPSBieVNlY3RvciwgYWVzKHggPSAyMDE1LCB5ID0geWVhcjIwMTUsIGNvbG9yID0gc2VjdG9yKSwgc2l6ZSA9IDQsIHNob3cubGVnZW5kID0gRkFMU0UpICsgCiAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMjAwNSwgeGVuZCA9IDIwMTUsIHkgPSBieVNlY3RvciR5ZWFyMjAwNSwgeWVuZCA9IGJ5U2VjdG9yJHllYXIyMDE1LCBjb2xvciA9IGJ5U2VjdG9yJHNlY3RvciksIHNpemUgPSAyLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArIAogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIpKSArIAogIHRoZW1lKHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gImdyZXk5MCIpKSArIAogIHRoZW1lKGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTEsIDYzKSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygyMDAwLCAyMDE2LjUpKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjb2xvclNlY3RvcikgKyAKICBnZW9tX3RleHQoYWVzKHggPSBjKDIwMDUsIDIwMTUpLCB5ID0gYygtMSwgLTEpLCBsYWJlbCA9IGMoIjIwMDUiLCAiMjAxNSIpKSwgZmFtaWx5ID0gbXlfZm9udCwgY29sb3IgPSAiZ3JleTIwIiwgc2l6ZSA9IDUsIHZqdXN0ID0gMSkgKyAKICBnZW9tX3RleHQoYWVzKHggPSByZXAoMjAxNi41LCA0KSwgeSA9IHNlcSgwLCA2MCwgMjApLCBsYWJlbCA9IHNlcSgwLCA2MCwgMjApKSwgZmFtaWx5ID0gbXlfZm9udCwgY29sb3IgPSAiZ3JleTMwIiwgc2l6ZSA9IDYpICsgCiAgZ2VvbV9wb2ludChhZXMoeCA9IDIwMDAsIHkgPSBjKGJ5U2VjdG9yJHllYXIyMDA1WzE6M10sIDIwKSksIGNvbG9yID0gY29sb3JTZWN0b3JbMTo0XSwgc2l6ZSA9IDQpICsgCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMjAwMCArIDAuMywgeSA9IGMoYnlTZWN0b3IkeWVhcjIwMDVbMTozXSwgMjApKSwgbGFiZWwgPSBsZWdlbmRMYWJlbHNbMTo0XSwgaGp1c3QgPSAwLCBmYW1pbHkgPSBteV9mb250LCBzaXplID0gNiwgY29sb3IgPSAiZ3JleTMwIikgKyAKICBnZW9tX3BvaW50KGFlcyh4ID0gMjAwMCwgeSA9IHBvaW50UG9zaXRpb25feSksIGNvbG9yID0gY29sb3JTZWN0b3JbNzo1XSwgc2l6ZSA9IDQpICsgCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMjAwMCArIDAuMywgeSA9IHBvaW50UG9zaXRpb25feSksIGxhYmVsID0gbGVnZW5kTGFiZWxzWzc6NV0sIGhqdXN0ID0gMCwgZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDYsIGNvbG9yID0gImdyZXkzMCIpICsgCiAgZ2VvbV90ZXh0KGFlcyh4ID0gMjAwMCwgeSA9IDYzLCBsYWJlbCA9ICJieSBzZWN0b3IqLCAlIiksIHNpemUgPSA2LCBjb2xvciA9ICJibGFjayIsIGZhbWlseSA9IG15X2ZvbnQsIGhqdXN0ID0gMC4xLCB2anVzdCA9IC0wLjUpICsgCiAgdGhlbWUocGxvdC5tYXJnaW4gPSB1bml0KGMoMS4yLCAxLCAwLjcsIDAuNyAvIDIpLCAiY20iKSkgKyAKICBsYWJzKGNhcHRpb24gPSAiKnNvbWUgYmlsbGlvbmFpcmVzIHdlcmUgaW52b2x2ZWQgaW4gbXVsdGkgc2VjdG9ycyIsIHRpdGxlID0gIiIsIHN1YnRpdGxlID0gIiIpICsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gbXlfZm9udCwgc2l6ZSA9IDEyLCB2anVzdCA9IC0zKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMiwgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSA0KSkgKyAKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCwgdmp1c3QgPSA1KSkgLT4gcmlnaHRfcGxvdCAKCiM9PT09PT09PT09PT09PT09PT09PT09CiMgIENyZWF0ZSBsZWZ0IHBsb3QKIz09PT09PT09PT09PT09PT09PT09PT0KCm15Q29sb3JzIDwtIGMoIiM2ODM4MkMiLCAiIzAwQTRFNiIpCgojIERhdGEgZm9yIHBsb3Rpbmc6IAoKZGF0IDwtIHJlYWQuY3N2KHRleHQgPSAiWWVhcixSdXNzaWEsV29ybGQKMTk5NiwwLDQyMwoxOTk3LDQsMjIwCjE5OTgsMSwyMjEKMTk5OSwwLDI5OAoyMDAwLDAsMzIyICAKMjAwMSw4LDUzMAoyMDAyLDYsNDY2CjIwMDMsMTcsNDU5CjIwMDQsMjUsNTYyCjIwMDUsMjcsNjY0CjIwMDYsMzMsNzYwCjIwMDcsNTMsODkzCjIwMDgsODcsMTAzOAoyMDA5LDMyLDc2MQoyMDEwLDYyLDk0OQoyMDExLDEwMSwxMTA5CjIwMTIsOTYsMTEzMAoyMDEzLDExMCwxMzE3CjIwMTQsMTExLDE1MzUKMjAxNSw4OCwxNzM4IiwgaGVhZGVyICA9IFRSVUUpCgojIExlZnQgZ3JhcGg6IAoKZ2dwbG90KCkgKyAKICBhbm5vdGF0ZSgiY3VydmUiLCAKICAgICAgICAgICBjdXJ2YXR1cmUgPSAwLAogICAgICAgICAgIHggPSAxOTk1LjgsIAogICAgICAgICAgIHhlbmQgPSAyMDE1LjUsIAogICAgICAgICAgIHkgPSBzZXEoNTAsIDIwMCwgNTApLCAKICAgICAgICAgICB5ZW5kID0gc2VxKDUwLCAyMDAsIDUwKSwKICAgICAgICAgICBjb2xvciA9ICJncmF5NzAiLCBzaXplID0gMC43KSArIAogIGFubm90YXRlKCJjdXJ2ZSIsIAogICAgICAgICAgIGN1cnZhdHVyZSA9IDAsCiAgICAgICAgICAgeCA9IDE5OTUuOCwgCiAgICAgICAgICAgeGVuZCA9IDIwMTUuNSwgCiAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgIHllbmQgPSAwLAogICAgICAgICAgIGNvbG9yID0gImdyYXkzMCIsIHNpemUgPSAwLjcpICsgCiAgYW5ub3RhdGUoImN1cnZlIiwgCiAgICAgICAgICAgY3VydmF0dXJlID0gMCwKICAgICAgICAgICB4ID0gYygxOTk2LCAyMDAwLCAyMDA1LCAyMDEwLCAyMDE1KSwgCiAgICAgICAgICAgeGVuZCA9IGMoMTk5NiwgMjAwMCwgMjAwNSwgMjAxMCwgMjAxNSksCiAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgIHllbmQgPSAtMi41LCBjb2xvciA9ICJncmF5MzAiLCBzaXplID0gMC43KSArIAogIGFubm90YXRlKCJ0ZXh0IiwgCiAgICAgICAgICAgeCA9IGMoMTk5NiwgMjAwMCwgMjAwNSwgMjAxMCwgMjAxNSksCiAgICAgICAgICAgeSA9IDAsIAogICAgICAgICAgIGxhYmVsID0gYygiMTk5NiIsICIyMDAwIiwgIjA1IiwgIjEwIiwgIjE1IiksIAogICAgICAgICAgIGZhbWlseSA9IG15X2ZvbnQsIAogICAgICAgICAgIHNpemUgPSA1LAogICAgICAgICAgIGNvbG9yID0gImdyZXkyMCIsIHZqdXN0ID0gMikgKyAKICBnZW9tX2xpbmUoZGF0YSA9IGRhdCwgYWVzKFllYXIsIFJ1c3NpYSksIGNvbG9yID0gbXlDb2xvcnNbMV0sIHNpemUgPSAxLjcpICsgCiAgZ2VvbV9saW5lKGRhdGEgPSBkYXQsIGFlcyhZZWFyLCBXb3JsZCAvIDEwKSwgY29sb3IgPSBteUNvbG9yc1syXSwgc2l6ZSA9IDEuNykgKyAKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwgMjE1KSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTk1LjUsIDIwMTYuNSksIGJyZWFrcyA9IHNlcSgxOTk2LCAyMDE1LCAxKSkgKyAKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk5NS41LCB5ID0gc2VxKDAsIDIwMCwgNTApLCBsYWJlbCA9IHNlcSgwLCAyMDAsIDUwKSwgCiAgICAgICAgICAgaGp1c3QgPSAwLjcsIGNvbG9yID0gbXlDb2xvcnNbMV0sIHNpemUgPSA1LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMjAxNS41LCB5ID0gc2VxKDAsIDIwMCwgNTApLCBsYWJlbCA9IHNlcSgwLCAyMDAwLCA1MDApLCAKICAgICAgICAgICBoanVzdCA9IC0wLjIsIGNvbG9yID0gbXlDb2xvcnNbMl0sIHNpemUgPSA1LjUsIGZhbWlseSA9IG15X2ZvbnQpICsgCiAgdGhlbWUoYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKSArIAogIHRoZW1lKGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCkpICsgCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIndoaXRlIikpICsgCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiZ3JleTkwIikpICsgCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMTk5NS41LCB5ID0gMjEwLCBsYWJlbCA9ICJOdW1iZXIgaW4gUnVzc2lhIiwgaGp1c3QgPSAwLjEsIHZqdXN0ID0gLTEuOCwgCiAgICAgICAgICAgc2l6ZSA9IDYsIGZhbWlseSA9IG15X2ZvbnQsIGNvbG9yID0gbXlDb2xvcnNbMV0sIGZvbnRmYWNlID0gImJvbGQiKSArIAogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDIwMTUuNSwgeSA9IDIxMCwgbGFiZWwgPSAiUmVzdCBvZiB3b3JsZCIsIHZqdXN0ID0gLTEuOCwgaGp1c3QgPSAwLjYsIAogICAgICAgICAgIHNpemUgPSA2LCBmYW1pbHkgPSBteV9mb250LCBjb2xvciA9IG15Q29sb3JzWzJdLCBmb250ZmFjZSA9ICJib2xkIikgKyAKICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygxLjIsIDAuNyAvIDIsIDAuMywgMSksICJjbSIpKSArIAogIGxhYnMoY2FwdGlvbiA9ICJTb3VyY2U6IFJ1c3NpYeKAmXMgYmlsbGlvbmFpcmVzXG5ELlRyZWlzbWFuLCBBbWVyaWNhbiBFY29ub21pYyBSZXZpZXcgKDIwMTYpIiwgCiAgICAgICB0aXRsZSA9ICJPZmYgdGhlIHJpY2ggbGlzdCIsIHN1YnRpdGxlID0gIlJ1c3NpYSBiaWxsaW9uYWlyZXMiKSArIAogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSBteV9mb250LCBzaXplID0gMTIsIHZqdXN0ID0gLTAuMywgaGp1c3QgPSAwKSkgKyAKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAyMiwgZmFjZSA9ICJib2xkIiwgdmp1c3QgPSA0KSkgKyAKICB0aGVtZShwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGZhbWlseSA9IG15X2ZvbnQsIHNpemUgPSAxOCwgY29sb3IgPSAiZ3JleTMwIiwgdmp1c3QgPSA1KSkgLT4gbGVmdF9wbG90CiAgCiMgbGlicmFyeShncmlkRXh0cmEpCiMgZ3JpZC5hcnJhbmdlKGxlZnRfcGxvdCwgcmlnaHRfcGxvdCwgbmNvbCA9IDIpCgpsaWJyYXJ5KGdyaWQpCmdyaWQuZHJhdyhncm9iVHJlZShyZWN0R3JvYihncCA9IGdwYXIoZmlsbCA9ICJncmV5MzAiKSksICBhcnJhbmdlR3JvYihsZWZ0X3Bsb3QsIHJpZ2h0X3Bsb3QsIG5jb2wgPSAyKSkpCmdyaWQucmVjdCh4ID0gMC4wMTUsIHkgPSAwLjkzLCBoanVzdCA9IDEsIHZqdXN0ID0gMCwgZ3AgPSBncGFyKGZpbGwgPSAiI2U1MDAxYyIsIGx3ZCA9IDApKSAgCmdyaWQucmVjdCh4ID0gMSwgeSA9IDEgLSAwLjAwNSwgaGp1c3QgPSAxLCB2anVzdCA9IDAsICBncCA9IGdwYXIoZmlsbCA9ICIjZTUwMDFjIiwgbHdkID0gMCkpCiAgICAKYGBgCgoKCg==