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 Cmd+Shift+Enter.

rm(list=ls())
library(dplyr)
library(ggplot2)
library(tidyverse)
library(kableExtra)

setwd("~/Documents/DiDa 325/final project/Mortality Rate- final project dataset")
big_data <- read.csv("adult_mortality_rate.csv")
qatar_data <- read.csv("qatar_dataset.csv")
bulgaria_data <- read.csv("bulgaria_dataset.csv")

options(scipen = 999) 
View(big_data)

data_highest <- big_data %>% 
  select("Countries")
bulgaria_data <- na.omit(bulgaria_data)
View(bulgaria_data)
bulgaria_data1 <- bulgaria_data %>%
  select(c(-Indicator.Code, -X)) 

filtered_bulgaria <- bulgaria_data1 %>% 
  select(X2021, Country.Name, Indicator.Name)
View(filtered_bulgaria)

bulgaria_pivot <- filtered_bulgaria %>% 
  pivot_longer(-c(Country.Name, Indicator.Name), names_to = "Year", values_to= "Count")
View(bulgaria_pivot)
wide_data <- bulgaria_data1 %>% 
  select(c(X2021, Country.Name, Indicator.Name))

#Change the data names to make it nice once we reshape it
colnames(wide_data) <- c("Year", "Country", "Indicator")

View(wide_data)
long_data <- wide_data %>% 
  pivot_longer(-Year, names_to = "Gender", values_to = "Majors")

head(long_data)
#What if I wanted to go from long to wide data? Here's what that looks like, for your reference:

wide_data1 <- long_data %>% 
  pivot_wider(names_from = Gender, values_from = Majors)
View(wide_data1)
library(cowplot)

a <- ggplot(bulgaria_pivot)+
  geom_point(aes(x = Indicator.Name, y = Count, color = Year))+
  geom_smooth(method = "lm", aes(x = Indicator.Name, y = Count))+ 
  theme_minimal()+
  labs(title = "Segregation vs Inequality")

b <- ggplot(bulgaria_pivot)+
  geom_point(aes(x = Year, y = Count, color = Year))+
  geom_smooth(method = "lm", aes(x = Year, y = Count))+
  theme_minimal()+
  labs(title = "Segregation vs Crime Rates")

c <- ggplot(bulgaria_pivot)+
  geom_point(aes(x = Country.Name, y = Count, color = Year))+
  geom_smooth(method = "lm", aes(x = Country.Name, y = Count))+
  theme_minimal()+
  labs(title = "Segregation vs College Education")

plot_grid(a, b, c, nrow = 1)


bul_pivot_18 <- bulgaria_data %>%
  select(X2018, Indicator.Name)%>%
  pivot_wider(names_from = Indicator.Name,values_from = X2018) %>%
  mutate(year = 2018)

bul_pivot_19 <- bulgaria_data %>%
  select(X2019, Indicator.Name)%>%
  pivot_wider(names_from = Indicator.Name,values_from = X2019) %>%
  mutate(year = 2019)

bul_pivot_20 <- bulgaria_data %>%
  select(X2020, Indicator.Name)%>%
  pivot_wider(names_from = Indicator.Name,values_from = X2020) %>%
  mutate(year = 2020)

bul_pivot_21 <- bulgaria_data %>%
  select(X2021, Indicator.Name)%>%
  pivot_wider(names_from = Indicator.Name,values_from = X2021) %>%
  mutate(year = 2021)

bul_pivot_22 <- bulgaria_data %>%
  select(X2022, Indicator.Name)%>%
  pivot_wider(names_from = Indicator.Name,values_from = X2022) %>%
  mutate(year = 2022)

allyears <- bind_rows(bul_pivot_18,bul_pivot_19,bul_pivot_20,bul_pivot_21,bul_pivot_22)

allyears <- allyears %>%
  select(year, everything())

View(allyears)
#remove pesky spaces that make ggplot unusable
allyears <- rename_with(allyears, ~ tolower(gsub(" ", "_", .x, fixed = TRUE)))

ggplot(data = allyears, aes(x = year, y = urban_population)) +
  geom_line() +
  geom_point() +
  theme_minimal() +
  labs(title = "Urban Population Over Time", x = "Year", y = "Urban Population") +
  ylim(0, NA) 

NA
NA
mean1 <- allyears %>% summarise(across(everything(), mean)) 
sd1 <- allyears %>% summarise(across(everything(), sd))
min1 <- allyears %>% summarise(across(everything(), min))
max1 <- allyears %>% summarise(across(everything(), max))

#put together into a table using rbind()

table <- rbind(mean1, sd1, min1, max1)
View(table)

rownames(table) <- c("Mean", "Standard Deviation", "Minimum", "Maximum")

table <- t(table)

table <- table %>% 
  as.data.frame %>% 
  mutate_if(is.numeric, round, digits=2)

table
rm(list=ls())
bulgaria <- read.csv("bulgaria.csv")
options(scipen = 999) 
bulgaria <- na.omit(bulgaria)
View(bulgaria)
library(cowplot)

a <- ggplot(bulgaria)+
  geom_point(aes(x = Crude.death.rate, y = Population.density, color = Year))+
  geom_smooth(method = "lm", aes(x = Crude.death.rate, y = Population.density))+ 
  theme_minimal()+
  labs(title = "")

b <- ggplot(bulgaria)+
  geom_point(aes(x = Growth.rate, y = Population.density, color = Year))+
  theme_minimal()+
  labs(title = "")

c <- ggplot(bulgaria)+
  geom_point(aes(x = Gross.reproduction.rate, y = Population.density, color = Year))+
  geom_smooth(method = "lm", aes(x = Gross.reproduction.rate, y = Population.density))+
  theme_minimal()+
  labs(title = "")

plot_grid(a, b, c, nrow = 1)

bulgaria1 <- bulgaria %>% 
  select(c("Crude.birth.rate", "Crude.death.rate", "Population.density", "Both.sexes.life.expectancy.at.birth"))
# bulgaria_number <- as.numeric(bulgaria1)

bulgaria1 <- bulgaria %>%
  mutate_all(as.numeric)
set.seed(8675309)

split <- 0.75

rows  <- nrow(bulgaria1)

train.entries <- sample(rows, rows*split)

model.train <- bulgaria1[train.entries, ]
model.valid  <- bulgaria1[-train.entries,  ]
model <- lm(Crude.birth.rate ~ Population.density + Crude.death.rate + Both.sexes.life.expectancy.at.birth, data=model.train)

summary(model)

Call:
lm(formula = Crude.birth.rate ~ Population.density + Crude.death.rate + 
    Both.sexes.life.expectancy.at.birth, data = model.train)

Residuals:
        4         3         2         8         5         6 
 0.010268  0.004276 -0.004106  0.010513  0.007743 -0.028694 

Coefficients:
                                    Estimate Std. Error t value Pr(>|t|)
(Intercept)                          72.5210   149.2597   0.486    0.675
Population.density                    0.0239     0.5021   0.048    0.966
Crude.death.rate                     -0.8517     1.1936  -0.714    0.550
Both.sexes.life.expectancy.at.birth  -0.7105     1.3279  -0.535    0.646

Residual standard error: 0.02382 on 2 degrees of freedom
Multiple R-squared:  0.9964,    Adjusted R-squared:  0.9911 
F-statistic:   187 on 3 and 2 DF,  p-value: 0.005323
model.valid <- model.valid %>%
    mutate(yhat = predict(model, newdata=model.valid)) %>%
    mutate(residual = Crude.birth.rate - yhat)

model.train <- model.train %>%
    mutate(yhat = predict(model, newdata=model.train)) %>%
    mutate(residual = Crude.birth.rate - yhat)

head(model.valid)

mean(model.valid$residual)
[1] 0.009489347
library(ggplot2)
ggplot(model.valid) +
  geom_point(aes(x=yhat, y=residual)) +
  geom_hline(aes(yintercept=0), linetype="dashed", color="red") +
  xlab("Predicted Crude Birth Rate") +
  ylab("Residual Crude Birth Rate")+
  ylim(-0.4,0.4)+
  theme_minimal()+
  labs(title = "Residual Plot for Validation Model")

bulgaria2 <- bulgaria %>% 
  select(c("Female.infant.mortality.rate", "Male.infant.mortality.rate", "Both.sexes.Infant.mortality.rate", "Year"))

bulgaria1 <- bulgaria %>%
  mutate_all(as.numeric)
bulgaria3 <- bulgaria2 %>% 
  select(c(-Year))

mean1 <- bulgaria3 %>% summarise(across(everything(), mean)) 
sd1 <- bulgaria3 %>% summarise(across(everything(), sd))
min1 <- bulgaria3 %>% summarise(across(everything(), min))
max1 <- bulgaria3 %>% summarise(across(everything(), max))

#put together into a table using rbind()

table <- rbind(mean1, sd1, min1, max1)
View(table)

rownames(table) <- c("Mean", "Standard Deviation", "Minimum", "Maximum")

table <- t(table)

table <- table %>% 
  as.data.frame %>% 
  mutate_if(is.numeric, round, digits=2)

table

table %>%
  kbl(caption = "<center><strong> Infant Mortality Rate</strong></center>", 
      format = "html") %>%
  kable_classic_2("striped", full_width = F) %>%
  row_spec(3, bold = T, color = "white", background = "chartreuse4") %>%
  row_spec(2, bold = T, color = "white", background = "royalblue") %>%
  row_spec(1, bold = T, color = "white", background = "deeppink1") %>% 
  kable_styling()
Infant Mortality Rate
Mean Standard Deviation Minimum Maximum
Female.infant.mortality.rate 7.10 0.32 6.57 7.49
Male.infant.mortality.rate 9.28 0.37 8.68 9.74
Both.sexes.Infant.mortality.rate 8.22 0.34 7.66 8.65
NA

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgpgYGB7cn0Kcm0obGlzdD1scygpKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgpzZXR3ZCgifi9Eb2N1bWVudHMvRGlEYSAzMjUvZmluYWwgcHJvamVjdC9Nb3J0YWxpdHkgUmF0ZS0gZmluYWwgcHJvamVjdCBkYXRhc2V0IikKYmlnX2RhdGEgPC0gcmVhZC5jc3YoImFkdWx0X21vcnRhbGl0eV9yYXRlLmNzdiIpCnFhdGFyX2RhdGEgPC0gcmVhZC5jc3YoInFhdGFyX2RhdGFzZXQuY3N2IikKYnVsZ2FyaWFfZGF0YSA8LSByZWFkLmNzdigiYnVsZ2FyaWFfZGF0YXNldC5jc3YiKQoKb3B0aW9ucyhzY2lwZW4gPSA5OTkpIAoKYGBgCgoKYGBge3J9ClZpZXcoYmlnX2RhdGEpCgpkYXRhX2hpZ2hlc3QgPC0gYmlnX2RhdGEgJT4lIAogIHNlbGVjdCgiQ291bnRyaWVzIikKYGBgCgpgYGB7cn0KYnVsZ2FyaWFfZGF0YSA8LSBuYS5vbWl0KGJ1bGdhcmlhX2RhdGEpClZpZXcoYnVsZ2FyaWFfZGF0YSkKYGBgCgpgYGB7cn0KYnVsZ2FyaWFfZGF0YTEgPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoYygtSW5kaWNhdG9yLkNvZGUsIC1YKSkgCgpmaWx0ZXJlZF9idWxnYXJpYSA8LSBidWxnYXJpYV9kYXRhMSAlPiUgCiAgc2VsZWN0KFgyMDIxLCBDb3VudHJ5Lk5hbWUsIEluZGljYXRvci5OYW1lKQpWaWV3KGZpbHRlcmVkX2J1bGdhcmlhKQoKYnVsZ2FyaWFfcGl2b3QgPC0gZmlsdGVyZWRfYnVsZ2FyaWEgJT4lIAogIHBpdm90X2xvbmdlcigtYyhDb3VudHJ5Lk5hbWUsIEluZGljYXRvci5OYW1lKSwgbmFtZXNfdG8gPSAiWWVhciIsIHZhbHVlc190bz0gIkNvdW50IikKVmlldyhidWxnYXJpYV9waXZvdCkKCmBgYApgYGB7cn0Kd2lkZV9kYXRhIDwtIGJ1bGdhcmlhX2RhdGExICU+JSAKICBzZWxlY3QoYyhYMjAyMSwgQ291bnRyeS5OYW1lLCBJbmRpY2F0b3IuTmFtZSkpCgojQ2hhbmdlIHRoZSBkYXRhIG5hbWVzIHRvIG1ha2UgaXQgbmljZSBvbmNlIHdlIHJlc2hhcGUgaXQKY29sbmFtZXMod2lkZV9kYXRhKSA8LSBjKCJZZWFyIiwgIkNvdW50cnkiLCAiSW5kaWNhdG9yIikKClZpZXcod2lkZV9kYXRhKQpgYGAKCmBgYHtyfQpsb25nX2RhdGEgPC0gd2lkZV9kYXRhICU+JSAKICBwaXZvdF9sb25nZXIoLVllYXIsIG5hbWVzX3RvID0gIkdlbmRlciIsIHZhbHVlc190byA9ICJNYWpvcnMiKQoKaGVhZChsb25nX2RhdGEpCmBgYApgYGB7cn0KI1doYXQgaWYgSSB3YW50ZWQgdG8gZ28gZnJvbSBsb25nIHRvIHdpZGUgZGF0YT8gSGVyZSdzIHdoYXQgdGhhdCBsb29rcyBsaWtlLCBmb3IgeW91ciByZWZlcmVuY2U6Cgp3aWRlX2RhdGExIDwtIGxvbmdfZGF0YSAlPiUgCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IEdlbmRlciwgdmFsdWVzX2Zyb20gPSBNYWpvcnMpClZpZXcod2lkZV9kYXRhMSkKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpCgphIDwtIGdncGxvdChidWxnYXJpYV9waXZvdCkrCiAgZ2VvbV9wb2ludChhZXMoeCA9IEluZGljYXRvci5OYW1lLCB5ID0gQ291bnQsIGNvbG9yID0gWWVhcikpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh4ID0gSW5kaWNhdG9yLk5hbWUsIHkgPSBDb3VudCkpKyAKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICJTZWdyZWdhdGlvbiB2cyBJbmVxdWFsaXR5IikKCmIgPC0gZ2dwbG90KGJ1bGdhcmlhX3Bpdm90KSsKICBnZW9tX3BvaW50KGFlcyh4ID0gWWVhciwgeSA9IENvdW50LCBjb2xvciA9IFllYXIpKSsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhZXMoeCA9IFllYXIsIHkgPSBDb3VudCkpKwogIHRoZW1lX21pbmltYWwoKSsKICBsYWJzKHRpdGxlID0gIlNlZ3JlZ2F0aW9uIHZzIENyaW1lIFJhdGVzIikKCmMgPC0gZ2dwbG90KGJ1bGdhcmlhX3Bpdm90KSsKICBnZW9tX3BvaW50KGFlcyh4ID0gQ291bnRyeS5OYW1lLCB5ID0gQ291bnQsIGNvbG9yID0gWWVhcikpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh4ID0gQ291bnRyeS5OYW1lLCB5ID0gQ291bnQpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICJTZWdyZWdhdGlvbiB2cyBDb2xsZWdlIEVkdWNhdGlvbiIpCgpwbG90X2dyaWQoYSwgYiwgYywgbnJvdyA9IDEpCmBgYAoKYGBge3J9CgpidWxfcGl2b3RfMTggPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoWDIwMTgsIEluZGljYXRvci5OYW1lKSU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IuTmFtZSx2YWx1ZXNfZnJvbSA9IFgyMDE4KSAlPiUKICBtdXRhdGUoeWVhciA9IDIwMTgpCgpidWxfcGl2b3RfMTkgPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoWDIwMTksIEluZGljYXRvci5OYW1lKSU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IuTmFtZSx2YWx1ZXNfZnJvbSA9IFgyMDE5KSAlPiUKICBtdXRhdGUoeWVhciA9IDIwMTkpCgpidWxfcGl2b3RfMjAgPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoWDIwMjAsIEluZGljYXRvci5OYW1lKSU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IuTmFtZSx2YWx1ZXNfZnJvbSA9IFgyMDIwKSAlPiUKICBtdXRhdGUoeWVhciA9IDIwMjApCgpidWxfcGl2b3RfMjEgPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoWDIwMjEsIEluZGljYXRvci5OYW1lKSU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IuTmFtZSx2YWx1ZXNfZnJvbSA9IFgyMDIxKSAlPiUKICBtdXRhdGUoeWVhciA9IDIwMjEpCgpidWxfcGl2b3RfMjIgPC0gYnVsZ2FyaWFfZGF0YSAlPiUKICBzZWxlY3QoWDIwMjIsIEluZGljYXRvci5OYW1lKSU+JQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBJbmRpY2F0b3IuTmFtZSx2YWx1ZXNfZnJvbSA9IFgyMDIyKSAlPiUKICBtdXRhdGUoeWVhciA9IDIwMjIpCgphbGx5ZWFycyA8LSBiaW5kX3Jvd3MoYnVsX3Bpdm90XzE4LGJ1bF9waXZvdF8xOSxidWxfcGl2b3RfMjAsYnVsX3Bpdm90XzIxLGJ1bF9waXZvdF8yMikKCmFsbHllYXJzIDwtIGFsbHllYXJzICU+JQogIHNlbGVjdCh5ZWFyLCBldmVyeXRoaW5nKCkpCgpWaWV3KGFsbHllYXJzKQoKYGBgCgoKYGBge3J9CiNyZW1vdmUgcGVza3kgc3BhY2VzIHRoYXQgbWFrZSBnZ3Bsb3QgdW51c2FibGUKYWxseWVhcnMgPC0gcmVuYW1lX3dpdGgoYWxseWVhcnMsIH4gdG9sb3dlcihnc3ViKCIgIiwgIl8iLCAueCwgZml4ZWQgPSBUUlVFKSkpCgpnZ3Bsb3QoZGF0YSA9IGFsbHllYXJzLCBhZXMoeCA9IHllYXIsIHkgPSB1cmJhbl9wb3B1bGF0aW9uKSkgKwogIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgbGFicyh0aXRsZSA9ICJVcmJhbiBQb3B1bGF0aW9uIE92ZXIgVGltZSIsIHggPSAiWWVhciIsIHkgPSAiVXJiYW4gUG9wdWxhdGlvbiIpICsKICB5bGltKDAsIE5BKSAKCgpgYGAKCmBgYHtyfQptZWFuMSA8LSBhbGx5ZWFycyAlPiUgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIG1lYW4pKSAKc2QxIDwtIGFsbHllYXJzICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgc2QpKQptaW4xIDwtIGFsbHllYXJzICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWluKSkKbWF4MSA8LSBhbGx5ZWFycyAlPiUgc3VtbWFyaXNlKGFjcm9zcyhldmVyeXRoaW5nKCksIG1heCkpCgojcHV0IHRvZ2V0aGVyIGludG8gYSB0YWJsZSB1c2luZyByYmluZCgpCgp0YWJsZSA8LSByYmluZChtZWFuMSwgc2QxLCBtaW4xLCBtYXgxKQpWaWV3KHRhYmxlKQoKcm93bmFtZXModGFibGUpIDwtIGMoIk1lYW4iLCAiU3RhbmRhcmQgRGV2aWF0aW9uIiwgIk1pbmltdW0iLCAiTWF4aW11bSIpCgp0YWJsZSA8LSB0KHRhYmxlKQoKdGFibGUgPC0gdGFibGUgJT4lIAogIGFzLmRhdGEuZnJhbWUgJT4lIAogIG11dGF0ZV9pZihpcy5udW1lcmljLCByb3VuZCwgZGlnaXRzPTIpCgp0YWJsZQpgYGAKCgpgYGB7cn0Kcm0obGlzdD1scygpKQpidWxnYXJpYSA8LSByZWFkLmNzdigiYnVsZ2FyaWEuY3N2IikKb3B0aW9ucyhzY2lwZW4gPSA5OTkpIApidWxnYXJpYSA8LSBuYS5vbWl0KGJ1bGdhcmlhKQpWaWV3KGJ1bGdhcmlhKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KGNvd3Bsb3QpCgphIDwtIGdncGxvdChidWxnYXJpYSkrCiAgZ2VvbV9wb2ludChhZXMoeCA9IENydWRlLmRlYXRoLnJhdGUsIHkgPSBQb3B1bGF0aW9uLmRlbnNpdHksIGNvbG9yID0gWWVhcikpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh4ID0gQ3J1ZGUuZGVhdGgucmF0ZSwgeSA9IFBvcHVsYXRpb24uZGVuc2l0eSkpKyAKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICIiKQoKYiA8LSBnZ3Bsb3QoYnVsZ2FyaWEpKwogIGdlb21fcG9pbnQoYWVzKHggPSBHcm93dGgucmF0ZSwgeSA9IFBvcHVsYXRpb24uZGVuc2l0eSwgY29sb3IgPSBZZWFyKSkrCiAgdGhlbWVfbWluaW1hbCgpKwogIGxhYnModGl0bGUgPSAiIikKCmMgPC0gZ2dwbG90KGJ1bGdhcmlhKSsKICBnZW9tX3BvaW50KGFlcyh4ID0gR3Jvc3MucmVwcm9kdWN0aW9uLnJhdGUsIHkgPSBQb3B1bGF0aW9uLmRlbnNpdHksIGNvbG9yID0gWWVhcikpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGFlcyh4ID0gR3Jvc3MucmVwcm9kdWN0aW9uLnJhdGUsIHkgPSBQb3B1bGF0aW9uLmRlbnNpdHkpKSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICIiKQoKcGxvdF9ncmlkKGEsIGIsIGMsIG5yb3cgPSAxKQpgYGAKYGBge3J9CmJ1bGdhcmlhMSA8LSBidWxnYXJpYSAlPiUgCiAgc2VsZWN0KGMoIkNydWRlLmJpcnRoLnJhdGUiLCAiQ3J1ZGUuZGVhdGgucmF0ZSIsICJQb3B1bGF0aW9uLmRlbnNpdHkiLCAiQm90aC5zZXhlcy5saWZlLmV4cGVjdGFuY3kuYXQuYmlydGgiKSkKIyBidWxnYXJpYV9udW1iZXIgPC0gYXMubnVtZXJpYyhidWxnYXJpYTEpCgpidWxnYXJpYTEgPC0gYnVsZ2FyaWEgJT4lCiAgbXV0YXRlX2FsbChhcy5udW1lcmljKQpgYGAKCgpgYGB7cn0Kc2V0LnNlZWQoODY3NTMwOSkKCnNwbGl0IDwtIDAuNzUKCnJvd3MgIDwtIG5yb3coYnVsZ2FyaWExKQoKdHJhaW4uZW50cmllcyA8LSBzYW1wbGUocm93cywgcm93cypzcGxpdCkKCm1vZGVsLnRyYWluIDwtIGJ1bGdhcmlhMVt0cmFpbi5lbnRyaWVzLCBdCm1vZGVsLnZhbGlkICA8LSBidWxnYXJpYTFbLXRyYWluLmVudHJpZXMsICBdCgpgYGAKCmBgYHtyfQptb2RlbCA8LSBsbShDcnVkZS5iaXJ0aC5yYXRlIH4gUG9wdWxhdGlvbi5kZW5zaXR5ICsgQ3J1ZGUuZGVhdGgucmF0ZSArIEJvdGguc2V4ZXMubGlmZS5leHBlY3RhbmN5LmF0LmJpcnRoLCBkYXRhPW1vZGVsLnRyYWluKQoKc3VtbWFyeShtb2RlbCkKYGBgCgpgYGB7cn0KbW9kZWwudmFsaWQgPC0gbW9kZWwudmFsaWQgJT4lCiAgICBtdXRhdGUoeWhhdCA9IHByZWRpY3QobW9kZWwsIG5ld2RhdGE9bW9kZWwudmFsaWQpKSAlPiUKICAgIG11dGF0ZShyZXNpZHVhbCA9IENydWRlLmJpcnRoLnJhdGUgLSB5aGF0KQoKbW9kZWwudHJhaW4gPC0gbW9kZWwudHJhaW4gJT4lCiAgICBtdXRhdGUoeWhhdCA9IHByZWRpY3QobW9kZWwsIG5ld2RhdGE9bW9kZWwudHJhaW4pKSAlPiUKICAgIG11dGF0ZShyZXNpZHVhbCA9IENydWRlLmJpcnRoLnJhdGUgLSB5aGF0KQoKaGVhZChtb2RlbC52YWxpZCkKCm1lYW4obW9kZWwudmFsaWQkcmVzaWR1YWwpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKZ2dwbG90KG1vZGVsLnZhbGlkKSArCiAgZ2VvbV9wb2ludChhZXMoeD15aGF0LCB5PXJlc2lkdWFsKSkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0icmVkIikgKwogIHhsYWIoIlByZWRpY3RlZCBDcnVkZSBCaXJ0aCBSYXRlIikgKwogIHlsYWIoIlJlc2lkdWFsIENydWRlIEJpcnRoIFJhdGUiKSsKICB5bGltKC0wLjQsMC40KSsKICB0aGVtZV9taW5pbWFsKCkrCiAgbGFicyh0aXRsZSA9ICJSZXNpZHVhbCBQbG90IGZvciBWYWxpZGF0aW9uIE1vZGVsIikKYGBgCgpgYGB7cn0KYnVsZ2FyaWEyIDwtIGJ1bGdhcmlhICU+JSAKICBzZWxlY3QoYygiRmVtYWxlLmluZmFudC5tb3J0YWxpdHkucmF0ZSIsICJNYWxlLmluZmFudC5tb3J0YWxpdHkucmF0ZSIsICJCb3RoLnNleGVzLkluZmFudC5tb3J0YWxpdHkucmF0ZSIsICJZZWFyIikpCgpidWxnYXJpYTEgPC0gYnVsZ2FyaWEgJT4lCiAgbXV0YXRlX2FsbChhcy5udW1lcmljKQpgYGAKCmBgYHtyfQpidWxnYXJpYTMgPC0gYnVsZ2FyaWEyICU+JSAKICBzZWxlY3QoYygtWWVhcikpCgptZWFuMSA8LSBidWxnYXJpYTMgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBtZWFuKSkgCnNkMSA8LSBidWxnYXJpYTMgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBzZCkpCm1pbjEgPC0gYnVsZ2FyaWEzICU+JSBzdW1tYXJpc2UoYWNyb3NzKGV2ZXJ5dGhpbmcoKSwgbWluKSkKbWF4MSA8LSBidWxnYXJpYTMgJT4lIHN1bW1hcmlzZShhY3Jvc3MoZXZlcnl0aGluZygpLCBtYXgpKQoKI3B1dCB0b2dldGhlciBpbnRvIGEgdGFibGUgdXNpbmcgcmJpbmQoKQoKdGFibGUgPC0gcmJpbmQobWVhbjEsIHNkMSwgbWluMSwgbWF4MSkKVmlldyh0YWJsZSkKCnJvd25hbWVzKHRhYmxlKSA8LSBjKCJNZWFuIiwgIlN0YW5kYXJkIERldmlhdGlvbiIsICJNaW5pbXVtIiwgIk1heGltdW0iKQoKdGFibGUgPC0gdCh0YWJsZSkKCnRhYmxlIDwtIHRhYmxlICU+JSAKICBhcy5kYXRhLmZyYW1lICU+JSAKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgcm91bmQsIGRpZ2l0cz0yKQoKdGFibGUKYGBgCgpgYGB7cn0KCnRhYmxlICU+JQogIGtibChjYXB0aW9uID0gIjxjZW50ZXI+PHN0cm9uZz4gSW5mYW50IE1vcnRhbGl0eSBSYXRlPC9zdHJvbmc+PC9jZW50ZXI+IiwgCiAgICAgIGZvcm1hdCA9ICJodG1sIikgJT4lCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEYpICU+JQogIHJvd19zcGVjKDMsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiY2hhcnRyZXVzZTQiKSAlPiUKICByb3dfc3BlYygyLCBib2xkID0gVCwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gInJveWFsYmx1ZSIpICU+JQogIHJvd19zcGVjKDEsIGJvbGQgPSBULCBjb2xvciA9ICJ3aGl0ZSIsIGJhY2tncm91bmQgPSAiZGVlcHBpbmsxIikgJT4lIAogIGthYmxlX3N0eWxpbmcoKQoKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBidWxnYXJpYTIsIGFlcyh4ID0gWWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBGZW1hbGUuaW5mYW50Lm1vcnRhbGl0eS5yYXRlLCBjb2xvciA9ICJGZW1hbGUiKSwgc2l6ZSA9IDAuOCkgKwogIGdlb21fbGluZShhZXMoeSA9IE1hbGUuaW5mYW50Lm1vcnRhbGl0eS5yYXRlLCBjb2xvciA9ICJNYWxlIiksIHNpemUgPSAwLjgpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBCb3RoLnNleGVzLkluZmFudC5tb3J0YWxpdHkucmF0ZSwgY29sb3IgPSAiQm90aCIpLCBzaXplID0gMC44KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIkZlbWFsZSIgPSAiZGVlcHBpbmsxIiwgIk1hbGUiID0gInJveWFsYmx1ZSIsICJCb3RoIiA9ICJjaGFydHJldXNlNCIpKSArCiAgbGFicyhjb2xvciA9ICJJbmZhbnRzIiwgeSA9ICJJbmZhbnQgTW9ydGFsaXR5IFJhdGVzIGluIFBlcmNlbnRhZ2VzIiwgdGl0bGUgPSAiRmVtYWxlIGFuZCBNYWxlIEluZmFudCBNb3J0YWxpdHkgUmF0ZXMiKSArCiAgdGhlbWVfbWluaW1hbCgpCgpnZ3Bsb3QoZGF0YSA9IGJ1bGdhcmlhMiwgYWVzKHggPSBZZWFyKSkgKwogIGdlb21fbGluZShhZXMoeSA9IEZlbWFsZS5pbmZhbnQubW9ydGFsaXR5LnJhdGUsIGNvbG9yID0gIkZlbWFsZSIpLCBzaXplID0gMC44KSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gTWFsZS5pbmZhbnQubW9ydGFsaXR5LnJhdGUsIGNvbG9yID0gIk1hbGUiKSwgc2l6ZSA9IDAuOCkgKwogIGdlb21fbGluZShhZXMoeSA9IEJvdGguc2V4ZXMuSW5mYW50Lm1vcnRhbGl0eS5yYXRlLCBjb2xvciA9ICJCb3RoIiksIHNpemUgPSAwLjgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiRmVtYWxlIiA9ICJkZWVwcGluazEiLCAiTWFsZSIgPSAicm95YWxibHVlIiwgIkJvdGgiID0gImNoYXJ0cmV1c2U0IikpICsKICBsYWJzKGNvbG9yID0gIkluZmFudHMiLCB5ID0gIkluZmFudCBNb3J0YWxpdHkgUmF0ZXMgaW4gUGVyY2VudGFnZXMiLCB0aXRsZSA9ICJGZW1hbGUgYW5kIE1hbGUgSW5mYW50IE1vcnRhbGl0eSBSYXRlcyIpICsKICB5bGltKDAsIE5BKSArIAogIHRoZW1lX21pbmltYWwoKQoKCgpgYGA=