This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

Install the necessary packages and run the libraries

library(animation)
library(car)
library(corrplot)
library(datasets)
library(gapminder)
library(gcookbook)
library(geomnet)
library(GGally)
library(ggmap)
library(htmlwidgets)
library(leaflet)
library(manipulateWidget)
library(maps)
library(PerformanceAnalytics)
library(plotly)
library(radarchart)
library(RColorBrewer)
library(rmarkdown)
library(shiny)
library(shinydashboard)
library(tidyverse)
library(treemap)
library(WDI)
library(grid)
library(devtools)
library(gridExtra)
library(scales)

Import the data from World Indicators data set and perform necesaary wrangling on the variables; change data types, format, and clean the dataset

# Read the world indicators data
worldIndicators <- read_csv(file.choose())
Parsed with column specification:
cols(
  .default = col_character(),
  `Business Tax Rate` = col_logical(),
  `CO2 Emissions` = col_double(),
  LifeExpectancy = col_double(),
  `Days to Start Business` = col_double(),
  `Ease of Business` = col_logical(),
  `Energy Usage` = col_double(),
  `Hours to do Tax` = col_logical(),
  `Lending Interest` = col_double(),
  `Life Expectancy Female` = col_double(),
  `Life Expectancy Male` = col_double(),
  `Number of Records` = col_double(),
  `Population 65+` = col_double()
)
See spec(...) for full column specifications.
3023 parsing failures.
 row               col           expected actual                                file
1041 Business Tax Rate 1/0/T/F/TRUE/FALSE  0.769 'C:\My Data\World Indicators.csv'
1041 Hours to do Tax   1/0/T/F/TRUE/FALSE  451   'C:\My Data\World Indicators.csv'
1042 Business Tax Rate 1/0/T/F/TRUE/FALSE  0.521 'C:\My Data\World Indicators.csv'
1042 Hours to do Tax   1/0/T/F/TRUE/FALSE  272   'C:\My Data\World Indicators.csv'
1043 Business Tax Rate 1/0/T/F/TRUE/FALSE  0.757 'C:\My Data\World Indicators.csv'
.... ................. .................. ...... ...................................
See problems(...) for more details.
view(worldIndicators)
str(worldIndicators)
Classes ‘spec_tbl_df’, ‘tbl_df’, ‘tbl’ and 'data.frame':    2704 obs. of  33 variables:
 $ BirthRate                  : chr  "2.00%" "5.00%" "4.30%" "2.70%" ...
 $ Business Tax Rate          : logi  NA NA NA NA NA NA ...
 $ CO2 Emissions              : num  87931 9542 1617 4276 1041 ...
 $ Above Threshold?           : chr  "Below Threshold" "Below Threshold" "Below Threshold" "Below Threshold" ...
 $ GDP per Capita             : chr  "$1,727" "$656" "$339" "$3,297" ...
 $ Birth Rate Bin             : chr  "1.5-3%" "Above 3%" "Above 3%" "1.5-3%" ...
 $ LifeExpectancy             : num  69 46 55 51 51 48 52 44 47 58 ...
 $ Ease of Business (clusters): chr  "Low" "Low" "Low" "Friendly" ...
 $ Country                    : chr  "Algeria" "Angola" "Benin" "Botswana" ...
 $ Days to Start Business     : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Ease of Business           : logi  NA NA NA NA NA NA ...
 $ Energy Usage               : num  26998 7499 1983 1836 NA ...
 $ GDP per Capita (bin)       : chr  "$0" "$0" "$0" "$0" ...
 $ GDP                        : chr  "$55B" "$9B" "$2B" "$6B" ...
 $ Health Exp % GDP           : chr  "3.50%" "3.40%" "4.30%" "4.70%" ...
 $ Health Exp/Capita          : chr  "$60" "$22" "$15" "$152" ...
 $ Hours to do Tax            : logi  NA NA NA NA NA NA ...
 $ InfantMortalityRate        : chr  "3.40%" "12.80%" "9.00%" "5.40%" ...
 $ Internet Usage             : chr  "1%" "0%" "0%" "3%" ...
 $ Lending Interest           : num  0.1 1.032 NA 0.155 NA ...
 $ Life Expectancy Female     : num  71 47 57 52 52 49 53 45 48 59 ...
 $ Life Expectancy Male       : num  67 44 53 49 49 47 51 42 46 56 ...
 $ Mobile Phone Usage         : chr  "0%" "0%" "1%" "13%" ...
 $ Number of Records          : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Population 0-14            : chr  "34%" "48%" "45%" "38%" ...
 $ Population 15-64           : chr  "62%" "50%" "52%" "59%" ...
 $ Population 65+             : num  0.039 0.025 0.029 0.029 0.028 0.029 0.034 0.04 0.028 0.031 ...
 $ Population Total           : chr  "31.7M" "13.9M" "6.9M" "1.8M" ...
 $ Population Urban           : chr  "59.90%" "32.40%" "38.30%" "53.20%" ...
 $ Region                     : chr  "Africa" "Africa" "Africa" "Africa" ...
 $ Tourism Inbound            : chr  "$0B" "$0B" "$0B" "$0B" ...
 $ Tourism Outbound           : chr  "$0B" "$0B" "$0B" "$0B" ...
 $ Year                       : chr  "12/1/2000" "12/1/2000" "12/1/2000" "12/1/2000" ...
 - attr(*, "problems")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    3023 obs. of  5 variables:
  ..$ row     : int  1041 1041 1042 1042 1043 1043 1044 1044 1045 1045 ...
  ..$ col     : chr  "Business Tax Rate" "Hours to do Tax" "Business Tax Rate" "Hours to do Tax" ...
  ..$ expected: chr  "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" ...
  ..$ actual  : chr  "0.769" "451" "0.521" "272" ...
  ..$ file    : chr  "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" ...
 - attr(*, "spec")=
  .. cols(
  ..   BirthRate = col_character(),
  ..   `Business Tax Rate` = col_logical(),
  ..   `CO2 Emissions` = col_double(),
  ..   `Above Threshold?` = col_character(),
  ..   `GDP per Capita` = col_character(),
  ..   `Birth Rate Bin` = col_character(),
  ..   LifeExpectancy = col_double(),
  ..   `Ease of Business (clusters)` = col_character(),
  ..   Country = col_character(),
  ..   `Days to Start Business` = col_double(),
  ..   `Ease of Business` = col_logical(),
  ..   `Energy Usage` = col_double(),
  ..   `GDP per Capita (bin)` = col_character(),
  ..   GDP = col_character(),
  ..   `Health Exp % GDP` = col_character(),
  ..   `Health Exp/Capita` = col_character(),
  ..   `Hours to do Tax` = col_logical(),
  ..   InfantMortalityRate = col_character(),
  ..   `Internet Usage` = col_character(),
  ..   `Lending Interest` = col_double(),
  ..   `Life Expectancy Female` = col_double(),
  ..   `Life Expectancy Male` = col_double(),
  ..   `Mobile Phone Usage` = col_character(),
  ..   `Number of Records` = col_double(),
  ..   `Population 0-14` = col_character(),
  ..   `Population 15-64` = col_character(),
  ..   `Population 65+` = col_double(),
  ..   `Population Total` = col_character(),
  ..   `Population Urban` = col_character(),
  ..   Region = col_character(),
  ..   `Tourism Inbound` = col_character(),
  ..   `Tourism Outbound` = col_character(),
  ..   Year = col_character()
  .. )
# Data Wrangling and Cleaning
worldIndicators2 <- select(worldIndicators, c("BirthRate", "LifeExpectancy", "InfantMortalityRate", "Region", "Year"))
worldIndicators2 <- filter(worldIndicators2, Year > "12/1/2003" & Year < "12/1/2011")
glimpse(worldIndicators2)
Observations: 1,456
Variables: 5
$ BirthRate           <chr> "2.00%", "5.00%", "4.10%", "2.60%", "4.50%", "4.30%", "4.10%", "3.80%", "5.00%", "3.90%", "4.60%", "3.90%", "3.70%", "2.90%",...
$ LifeExpectancy      <dbl> 70, 48, 57, 48, 52, 50, 52, 45, 48, 59, 48, 54, 47, 58, 70, 49, 58, 56, 60, 57, 58, 52, 52, 54, 44, 54, 74, 61, 48, 51, 61, 7...
$ InfantMortalityRate <chr> "3.00%", "12.30%", "7.80%", "4.60%", "8.90%", "7.90%", "8.10%", "11.10%", "10.20%", "7.10%", "10.80%", "6.60%", "9.10%", "7.3...
$ Region              <chr> "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Africa", "Afri...
$ Year                <chr> "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/2004", "12/1/20...
#  Need to strip out '%' from 2 of the columns
worldIndicators2$birth <- str_sub(worldIndicators2$`BirthRate`, 1, str_length(worldIndicators2$`BirthRate`)-1)
worldIndicators2$birth <- as.numeric(worldIndicators2$birth)
worldIndicators2$im <- str_sub(worldIndicators2$`InfantMortalityRate`, 1, str_length(worldIndicators2$`InfantMortalityRate`)-1)
worldIndicators2$im <- as.numeric(worldIndicators2$im)
worldIndicators2$life <- as.numeric(worldIndicators2$`LifeExpectancy`)


#  Convert Year to numeric year
worldIndicators2$Yr <- as.Date.character(worldIndicators2$Year, "%m/%d/%Y")
worldIndicators2$Region <- as.factor(worldIndicators2$Region)
view(worldIndicators2)

#  Now summarize average rates by region
worldIndicators3 <- worldIndicators2 %>%
  group_by(Region, Yr) %>%
  summarize(birthrate = mean(birth, na.rm = T),
            life_exp = mean(life, na.rm = T), 
            infant = mean(im, na.rm = T))


worldIndicators3$Yr1 <- as.numeric(format(as.Date(worldIndicators3$Yr, format("%m%d%Y%")), "%Y"))
worldIndicators3
str(worldIndicators3)
Classes ‘grouped_df’, ‘tbl_df’, ‘tbl’ and 'data.frame': 42 obs. of  6 variables:
 $ Region   : Factor w/ 6 levels "Africa","Asia",..: 1 1 1 1 1 1 1 2 2 2 ...
 $ Yr       : Date, format: "2004-12-01" "2005-12-01" "2006-12-01" "2007-12-01" ...
 $ birthrate: num  3.69 3.67 3.65 3.62 3.6 ...
 $ life_exp : num  55.1 55.5 56 56.6 57.2 ...
 $ infant   : num  7.12 6.89 6.66 6.43 6.23 ...
 $ Yr1      : num  2004 2005 2006 2007 2008 ...
 - attr(*, "problems")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':    3023 obs. of  5 variables:
  ..$ row     : int  1041 1041 1042 1042 1043 1043 1044 1044 1045 1045 ...
  ..$ col     : chr  "Business Tax Rate" "Hours to do Tax" "Business Tax Rate" "Hours to do Tax" ...
  ..$ expected: chr  "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" "1/0/T/F/TRUE/FALSE" ...
  ..$ actual  : chr  "0.769" "451" "0.521" "272" ...
  ..$ file    : chr  "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" "'C:\\My Data\\World Indicators.csv'" ...
 - attr(*, "spec")=
  .. cols(
  ..   BirthRate = col_character(),
  ..   `Business Tax Rate` = col_logical(),
  ..   `CO2 Emissions` = col_double(),
  ..   `Above Threshold?` = col_character(),
  ..   `GDP per Capita` = col_character(),
  ..   `Birth Rate Bin` = col_character(),
  ..   LifeExpectancy = col_double(),
  ..   `Ease of Business (clusters)` = col_character(),
  ..   Country = col_character(),
  ..   `Days to Start Business` = col_double(),
  ..   `Ease of Business` = col_logical(),
  ..   `Energy Usage` = col_double(),
  ..   `GDP per Capita (bin)` = col_character(),
  ..   GDP = col_character(),
  ..   `Health Exp % GDP` = col_character(),
  ..   `Health Exp/Capita` = col_character(),
  ..   `Hours to do Tax` = col_logical(),
  ..   InfantMortalityRate = col_character(),
  ..   `Internet Usage` = col_character(),
  ..   `Lending Interest` = col_double(),
  ..   `Life Expectancy Female` = col_double(),
  ..   `Life Expectancy Male` = col_double(),
  ..   `Mobile Phone Usage` = col_character(),
  ..   `Number of Records` = col_double(),
  ..   `Population 0-14` = col_character(),
  ..   `Population 15-64` = col_character(),
  ..   `Population 65+` = col_double(),
  ..   `Population Total` = col_character(),
  ..   `Population Urban` = col_character(),
  ..   Region = col_character(),
  ..   `Tourism Inbound` = col_character(),
  ..   `Tourism Outbound` = col_character(),
  ..   Year = col_character()
  .. )
 - attr(*, "groups")=Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  6 obs. of  2 variables:
  ..$ Region: Factor w/ 6 levels "Africa","Asia",..: 1 2 3 4 5 6
  ..$ .rows :List of 6
  .. ..$ : int  1 2 3 4 5 6 7
  .. ..$ : int  8 9 10 11 12 13 14
  .. ..$ : int  15 16 17 18 19 20 21
  .. ..$ : int  22 23 24 25 26 27 28
  .. ..$ : int  29 30 31 32 33 34 35
  .. ..$ : int  36 37 38 39 40 41 42
  ..- attr(*, ".drop")= logi TRUE

Now plot the 3 major measures(Birth Rate, Infant Mortality Rate, Life Expectancy) across 6 regions of the world

# Birth Rate
p1 <- ggplot(worldIndicators3, aes(x = Yr1, y = birthrate, color = Region)) + 
  geom_line(size = 1.5) + 
  facet_grid(~ Region) +
  theme(axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        legend.position = "none") +
  scale_y_continuous(limits = c(0, 4), 
                     breaks = c(0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5)) +
  labs(y = "Avg. Birth Rate(%)")
  

# Infant Mortality Rate
p2 <- ggplot(worldIndicators3, aes(x = Yr1, y = infant, color = Region)) + 
  geom_line(size = 1.5) + 
  facet_grid(~ Region) +
  theme(axis.title.x = element_blank(), 
        axis.text.x = element_blank(), 
        axis.ticks.x = element_blank(), 
        strip.text.x = element_blank(),
        legend.position = "none") +
  scale_y_continuous(limits = c(0,7.5), 
                     breaks = c(1,2,3,4,5,6,7)) +
  labs(y = "Avg. Infant Mortality Rate")

  

# Life Expectancy Rate
p3 <- ggplot(worldIndicators3, 
             aes(x = Yr1, y = life_exp, fill = Region)) + 
  geom_bar(stat = "identity")+
  facet_grid(.~Region) +
  theme(strip.text.x = element_blank(), 
        legend.position = "none", 
        axis.text.x=element_text(angle=90,hjust=1),
        axis.title.x = element_blank()) +
  scale_x_continuous(breaks = worldIndicators3$Yr1) +
  labs(y = "Avg. Life Expectancy (years)")

Plot the abovd 3 measures on a single graph as a grid

grid.arrange(p1, p2, p3, top = "Avg. Birth Rate, Avg. Infant Mortality Rate & Avg. Life Expectancy
             Region")

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQoNCmBgYA0KDQojIEluc3RhbGwgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBhbmQgcnVuIHRoZSBsaWJyYXJpZXMNCg0KYGBge3J9DQpsaWJyYXJ5KGFuaW1hdGlvbikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShjb3JycGxvdCkNCmxpYnJhcnkoZGF0YXNldHMpDQpsaWJyYXJ5KGdhcG1pbmRlcikNCmxpYnJhcnkoZ2Nvb2tib29rKQ0KbGlicmFyeShnZW9tbmV0KQ0KbGlicmFyeShHR2FsbHkpDQpsaWJyYXJ5KGdnbWFwKQ0KbGlicmFyeShodG1sd2lkZ2V0cykNCmxpYnJhcnkobGVhZmxldCkNCmxpYnJhcnkobWFuaXB1bGF0ZVdpZGdldCkNCmxpYnJhcnkobWFwcykNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkocmFkYXJjaGFydCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShybWFya2Rvd24pDQpsaWJyYXJ5KHNoaW55KQ0KbGlicmFyeShzaGlueWRhc2hib2FyZCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0cmVlbWFwKQ0KbGlicmFyeShXREkpDQpsaWJyYXJ5KGdyaWQpDQpsaWJyYXJ5KGRldnRvb2xzKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHNjYWxlcykNCmBgYA0KDQojIEltcG9ydCB0aGUgZGF0YSBmcm9tIFdvcmxkIEluZGljYXRvcnMgZGF0YSBzZXQgYW5kIHBlcmZvcm0gbmVjZXNhYXJ5IHdyYW5nbGluZyBvbiB0aGUgdmFyaWFibGVzOyBjaGFuZ2UgZGF0YSB0eXBlcywgZm9ybWF0LCBhbmQgY2xlYW4gdGhlIGRhdGFzZXQNCg0KYGBge3J9DQojIFJlYWQgdGhlIHdvcmxkIGluZGljYXRvcnMgZGF0YQ0Kd29ybGRJbmRpY2F0b3JzIDwtIHJlYWRfY3N2KGZpbGUuY2hvb3NlKCkpDQp2aWV3KHdvcmxkSW5kaWNhdG9ycykNCnN0cih3b3JsZEluZGljYXRvcnMpDQoNCiMgRGF0YSBXcmFuZ2xpbmcgYW5kIENsZWFuaW5nDQp3b3JsZEluZGljYXRvcnMyIDwtIHNlbGVjdCh3b3JsZEluZGljYXRvcnMsIGMoIkJpcnRoUmF0ZSIsICJMaWZlRXhwZWN0YW5jeSIsICJJbmZhbnRNb3J0YWxpdHlSYXRlIiwgIlJlZ2lvbiIsICJZZWFyIikpDQp3b3JsZEluZGljYXRvcnMyIDwtIGZpbHRlcih3b3JsZEluZGljYXRvcnMyLCBZZWFyID4gIjEyLzEvMjAwMyIgJiBZZWFyIDwgIjEyLzEvMjAxMSIpDQpnbGltcHNlKHdvcmxkSW5kaWNhdG9yczIpDQoNCg0KIyAgTmVlZCB0byBzdHJpcCBvdXQgJyUnIGZyb20gMiBvZiB0aGUgY29sdW1ucw0Kd29ybGRJbmRpY2F0b3JzMiRiaXJ0aCA8LSBzdHJfc3ViKHdvcmxkSW5kaWNhdG9yczIkYEJpcnRoUmF0ZWAsIDEsIHN0cl9sZW5ndGgod29ybGRJbmRpY2F0b3JzMiRgQmlydGhSYXRlYCktMSkNCndvcmxkSW5kaWNhdG9yczIkYmlydGggPC0gYXMubnVtZXJpYyh3b3JsZEluZGljYXRvcnMyJGJpcnRoKQ0Kd29ybGRJbmRpY2F0b3JzMiRpbSA8LSBzdHJfc3ViKHdvcmxkSW5kaWNhdG9yczIkYEluZmFudE1vcnRhbGl0eVJhdGVgLCAxLCBzdHJfbGVuZ3RoKHdvcmxkSW5kaWNhdG9yczIkYEluZmFudE1vcnRhbGl0eVJhdGVgKS0xKQ0Kd29ybGRJbmRpY2F0b3JzMiRpbSA8LSBhcy5udW1lcmljKHdvcmxkSW5kaWNhdG9yczIkaW0pDQp3b3JsZEluZGljYXRvcnMyJGxpZmUgPC0gYXMubnVtZXJpYyh3b3JsZEluZGljYXRvcnMyJGBMaWZlRXhwZWN0YW5jeWApDQoNCg0KIyAgQ29udmVydCBZZWFyIHRvIG51bWVyaWMgeWVhcg0Kd29ybGRJbmRpY2F0b3JzMiRZciA8LSBhcy5EYXRlLmNoYXJhY3Rlcih3b3JsZEluZGljYXRvcnMyJFllYXIsICIlbS8lZC8lWSIpDQp3b3JsZEluZGljYXRvcnMyJFJlZ2lvbiA8LSBhcy5mYWN0b3Iod29ybGRJbmRpY2F0b3JzMiRSZWdpb24pDQp2aWV3KHdvcmxkSW5kaWNhdG9yczIpDQoNCiMgIE5vdyBzdW1tYXJpemUgYXZlcmFnZSByYXRlcyBieSByZWdpb24NCndvcmxkSW5kaWNhdG9yczMgPC0gd29ybGRJbmRpY2F0b3JzMiAlPiUNCiAgZ3JvdXBfYnkoUmVnaW9uLCBZcikgJT4lDQogIHN1bW1hcml6ZShiaXJ0aHJhdGUgPSBtZWFuKGJpcnRoLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgbGlmZV9leHAgPSBtZWFuKGxpZmUsIG5hLnJtID0gVCksIA0KICAgICAgICAgICAgaW5mYW50ID0gbWVhbihpbSwgbmEucm0gPSBUKSkNCg0KDQp3b3JsZEluZGljYXRvcnMzJFlyMSA8LSBhcy5udW1lcmljKGZvcm1hdChhcy5EYXRlKHdvcmxkSW5kaWNhdG9yczMkWXIsIGZvcm1hdCgiJW0lZCVZJSIpKSwgIiVZIikpDQp3b3JsZEluZGljYXRvcnMzDQpzdHIod29ybGRJbmRpY2F0b3JzMykNCmBgYA0KDQojIE5vdyBwbG90IHRoZSAzIG1ham9yIG1lYXN1cmVzKEJpcnRoIFJhdGUsIEluZmFudCBNb3J0YWxpdHkgUmF0ZSwgTGlmZSBFeHBlY3RhbmN5KSBhY3Jvc3MgNiByZWdpb25zIG9mIHRoZSB3b3JsZA0KDQpgYGB7cn0NCiMgQmlydGggUmF0ZQ0KcDEgPC0gZ2dwbG90KHdvcmxkSW5kaWNhdG9yczMsIGFlcyh4ID0gWXIxLCB5ID0gYmlydGhyYXRlLCBjb2xvciA9IFJlZ2lvbikpICsgDQogIGdlb21fbGluZShzaXplID0gMS41KSArIA0KICBmYWNldF9ncmlkKH4gUmVnaW9uKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDQpLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMC41LCAxLjAsIDEuNSwgMi4wLCAyLjUsIDMuMCwgMy41KSkgKw0KICBsYWJzKHkgPSAiQXZnLiBCaXJ0aCBSYXRlKCUpIikNCiAgDQoNCiMgSW5mYW50IE1vcnRhbGl0eSBSYXRlDQpwMiA8LSBnZ3Bsb3Qod29ybGRJbmRpY2F0b3JzMywgYWVzKHggPSBZcjEsIHkgPSBpbmZhbnQsIGNvbG9yID0gUmVnaW9uKSkgKyANCiAgZ2VvbV9saW5lKHNpemUgPSAxLjUpICsgDQogIGZhY2V0X2dyaWQofiBSZWdpb24pICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLDcuNSksIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLDIsMyw0LDUsNiw3KSkgKw0KICBsYWJzKHkgPSAiQXZnLiBJbmZhbnQgTW9ydGFsaXR5IFJhdGUiKQ0KDQogIA0KDQojIExpZmUgRXhwZWN0YW5jeSBSYXRlDQpwMyA8LSBnZ3Bsb3Qod29ybGRJbmRpY2F0b3JzMywgDQogICAgICAgICAgICAgYWVzKHggPSBZcjEsIHkgPSBsaWZlX2V4cCwgZmlsbCA9IFJlZ2lvbikpICsgDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSsNCiAgZmFjZXRfZ3JpZCguflJlZ2lvbikgKw0KICB0aGVtZShzdHJpcC50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9OTAsaGp1c3Q9MSksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gd29ybGRJbmRpY2F0b3JzMyRZcjEpICsNCiAgbGFicyh5ID0gIkF2Zy4gTGlmZSBFeHBlY3RhbmN5ICh5ZWFycykiKQ0KYGBgDQoNCiMgUGxvdCB0aGUgYWJvdmQgMyBtZWFzdXJlcyBvbiBhIHNpbmdsZSBncmFwaCBhcyBhIGdyaWQNCg0KYGBge3J9DQpncmlkLmFycmFuZ2UocDEsIHAyLCBwMywgdG9wID0gIkF2Zy4gQmlydGggUmF0ZSwgQXZnLiBJbmZhbnQgTW9ydGFsaXR5IFJhdGUgJiBBdmcuIExpZmUgRXhwZWN0YW5jeQ0KICAgICAgICAgICAgIFJlZ2lvbiIpDQpgYGANCg0K