Figure 3.1: Distribution of Post-Conflict States’ Revenue Sources in Comparison to Other Income Groups, 1989-2010

library(foreign)
library(dplyr)
library(tikzDevice)
library(readr)
library(rio)
library(tidyr)
library(ggplot2)
library(gridExtra)
library(countrycode)
library(forcats)
library(cowplot)

# Load data
load("./data/income_types_WDI.rdta") # this gives the "taxes" data frame
load("./data/diss_df.rda")

# intrastate ucdp country-year data set

# load two small helper function to determine pre- and post-conflict years
ag_seq <- function(x) {
  runs <- cumsum(c(0, diff(x) != 1 ))
  return(runs)
}

source("./functions/identifyPostConflictYears.R")


# load and wrangle ucdp data
ucdp_cy <- read_csv("./data/133280_onset2012csv.csv") %>% 
  filter(year > 1989) %>% 
  arrange(gwno, year) %>% 
  group_by(gwno) %>% 
  mutate(iso2c = countrycode(gwno, "cown", "iso2c"),
         ucdp_dummy = ifelse(incidencev412 == 1, 1, 0),
         pc = pcIdentifier(ucdp_dummy),
         pc = ifelse(pc == 2, 1, 0),
         conflict_ep_id = cumsum(c(ifelse(first(ucdp_dummy) == 1, 
                                          1, 0), 
                                 diff(ucdp_dummy) != 0)), 
         conflict_ep_id = as.numeric(ifelse(ucdp_dummy == 1, 
                                            conflict_ep_id, 
                                            NA)),
         peace_ep_id = cumsum(c(ifelse(first(pc) == 2, 
                                       2, 1), 
                                diff(pc) != 0)),
         peace_ep_id = as.numeric(ifelse(pc == 1, peace_ep_id, NA)))%>% 
  group_by(gwno, conflict_ep_id) %>% 
  mutate(conflict_year = -1 * rev(cumsum(ucdp_dummy == 1))) %>% 
  group_by(gwno, peace_ep_id) %>% 
  mutate(peace_year = cumsum(pc == 1)) %>% 
  group_by(gwno) %>% 
  mutate(conf_and_peace_years = conflict_year + peace_year, 
         pc_dummy = pc)



# UN GDP estimates
un_gdp <- read_csv("./data/UNdata_Export_20150703_055055592.csv") %>% 
  mutate(iso2c = countrycode(`Country or Area`, "country.name", "iso2c"),
         year = Year,
         gdp = Value)

# Aid
aid <- read.dta("./data/aiddata_full.dta") %>% 
  dplyr::rename(wb_AidGNI = DT_ODA_ODAT_GN_ZS,
                wb_AidPC = DT_ODA_ODAT_PC_ZS,
                wb_AidGmentXP = DT_ODA_ODAT_XP_ZS,
                oecd_Aid = aid_oecd_commitment2011USD,
                oecd_Aid_mill = aid_oecd_commitment2011USD_mill,
                aid = commitment_amount_usd_constant, 
                iso2c = iso2) %>% 
  select(-population)

# Merge & wrangle data for eventual plotting
taxes <- taxes %>% 
  rename(tax = GC.TAX.TOTL.GD.ZS,
         natres = NY.GDP.TOTL.RT.ZS,
#         gdp = NY.GDP.MKTP.CD,
         population = SP.POP.TOTL) %>% 
  filter(region != "Aggregates") %>% 
  left_join(., ucdp_cy[, c("iso2c", "year", "ucdp_dummy", "pc_dummy")]) %>% 
  # left_join(., pc_dummy[, c("iso2c", "year", "pc_dummy")]) %>% 
  left_join(., un_gdp[, c("iso2c", "year", "gdp")]) %>% 
  left_join(., aid, by = c("iso2c", "year")) %>% 
  mutate(income = as.character(income),
         aid = aid / (gdp * population), 
         aid = aid * 100) %>% 
  mutate(income = ifelse(!is.na(ucdp_dummy) & ucdp_dummy == 1, "Conflict-affected", income),
         income = ifelse(!is.na(pc_dummy) & pc_dummy == 1, "Post-conflict", income),
         income = ifelse(income == "High income: OECD" | income == "High income: nonOECD",
                         "High Income", income)) %>% 
  filter(country != "United States" & country != "United Kingdom" & country != "Spain") %>% 
  filter(population > 500000) %>% 
  mutate(income = ifelse(country == "Timor-Leste", "Conflict-affected", income),
         income = ifelse(country == "Yemen, Rep.", "Conflict-affected", income),
         income = ifelse(country == "West Bank and Gaza", "Conflict-affected", income)) %>% 
  ungroup() 

# # take logs
# taxes <- taxes %>% 
#   mutate(tax = log(tax), 
#          natres = log(natres + 1), 
#          aid = log(aid + 1))


# 

# this piece calculates means and medians for each distribution
plot_tax_data_median <- taxes %>% 
  group_by(income) %>% 
  summarise(median_tax = median(tax, na.rm = T),
            median_natres = median(natres, na.rm = T),
            median_aid = median(aid, na.rm = T),
            mean_tax = mean(tax, na.rm = T),
            mean_natres = mean(natres, na.rm = T),
            mean_aid = mean(aid, na.rm = T)) %>% 
  filter(!is.na(median_tax)) %>% 
  gather(variable, value, 2:7) %>% 
  separate(variable, c("type", "variable")) %>% 
  mutate(variable = replace(variable, variable == "tax", values = "Tax Income / GDP"),
         variable = replace(variable, variable == "aid", values = "Aid / GDP"),
         variable = replace(variable, variable == "natres", values = "Resource Rents / GDP"))

taxes <- taxes %>% left_join(., plot_tax_data_median %>% 
                               filter(type == "mean" & variable == "tax"), all.x = T) %>% 
  arrange(type, variable, value) %>% 
  filter(income != "Not classified")

# reorder factors for country group classification
taxes$income <- factor(taxes$income, 
                       levels = c("Conflict-affected", 
                                  "Post-conflict", 
                                  "Low income", 
                                  "Lower middle income", 
                                  "Upper middle income",
                                  "High Income"))

# get data in shape for plotting
taxes_gath <- taxes %>% 
  dplyr::select(iso2c, year, income, aid, natres, tax) %>% 
  rename(`Aid / GDP` = aid,
         `Resource Rents / GDP` = natres,
        `Tax Income / GDP` = tax) %>% 
  gather(variable, value, 4:6 ) %>% 
  arrange(iso2c, variable, year) 


taxes_gath$income <- ordered(taxes_gath$income, 
                            levels = c("Conflict-affected", 
                                       "Post-conflict", 
                                       "Low income",
                                       "Lower middle income", 
                                       "Upper middle income",
                                       "High Income"))


plot_tax_data_median$income <- factor(plot_tax_data_median$income, 
                             levels = c("Conflict-affected", 
                                        "Post-conflict", 
                                        "Low income",
                                        "Lower middle income", 
                                        "Upper middle income",
                                        "High Income"))
# generate final plot

plot_tax <- ggplot(taxes_gath, 
                   aes(x = value, fill = income)) + 
  geom_histogram(aes(y = ..density..), bins = 20, color = "black") + 
  facet_grid( income ~ variable, scales = "free") +
  geom_vline(data = plot_tax_data_median %>% filter(type == "median"), 
             aes(xintercept = value),
             size = 1, color = "black", linetype = "dashed") +
  geom_vline(data = plot_tax_data_median %>% filter(type == "mean"), 
             aes(xintercept = value),
             size = 1, color = "black") +
  
  theme_bw() +
  theme(legend.position = "none") +
  scale_fill_manual(values = RColorBrewer::brewer.pal(6, "RdYlGn")) +
  labs(x = "", y = "") +
  theme(text = element_text(size = 13))

# output for manuscript
# library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[16pt]{article}" )
# 
# tikz("../figures/taxes.tex", height = 7)
# print(plot_tax)
# dev.off()

# output for replication archive
print(plot_tax)

Figure 3.2: Foreign Aid, Conditionality, and Armed Conflict

# Libraries ---------------------------------------------------------------

library(readxl)
library(dplyr)
library(countrycode)
library(tidyr)
library(ggplot2)
library(foreign)
library(readr)

# Load data

aid <- read.dta("./data/aiddata_full.dta")

# WB and IMF structural adjustment programs -------------------------------

wb_adj <- read_excel("./data/dreherWB_IMF.xls", sheet = "WB adjustment agreed")

imf_adj <- read_excel("./data/dreherWB_IMF.xls", sheet = "IMF PRGF")

# data cleaning
wb_adj <- wb_adj %>% gather(year, WB_adj,  `1970.000000`:`2004.000000`) %>% 
  mutate(year = as.numeric(as.character(year))) %>% 
  arrange(`Country Name`, year)
  
imf_adj <- imf_adj %>% gather(year, IMF_adj,`1970.000000`:`2011.000000`) %>% 
  mutate(year = as.numeric(as.character(year)),
         IMF_adj = as.numeric(as.character(IMF_adj))) %>% 
  arrange(`Country Name`, year)

all_countries <- left_join(wb_adj, imf_adj)

# create data frame with WB Structural Adjustment Dummies
test <- left_join(diss_df, imf_adj, by = c("iso3c" = "Country Code", "year"))
plot_IMF <- test %>% 
  group_by(Location) %>% 
  summarise(IMF = ifelse(sum(IMF_adj, na.rm = T) > 0, 1, 0))

# create data frame with IMF SAP dummies
test2 <- left_join(diss_df, wb_adj, by = c("iso3c" = "Country Code", "year"))
plot_WB <- test2 %>% 
  group_by(Location) %>% 
  summarise(WB = ifelse(sum(WB_adj, na.rm = T) > 0, 1, 0))


# combine information of IMF and WB adjustment programs
plot_adj_df <- left_join(test, test2 %>% 
                        ungroup() %>%  
                        dplyr::select(year, iso3c, WB_adj)) %>% 
  mutate(pcsampledummy = 1)

all_countries <- left_join(all_countries, 
                           plot_adj_df[, c("iso3c", "year", "pcsampledummy")], 
                           by = c("Country Code" = "iso3c", "year")) %>% 
  replace_na(list(pcsampledummy = 0))

# prepare data for plots
all_countries <- all_countries %>% 
  group_by(year, pcsampledummy) %>% 
  dplyr::summarise(WB_adj_year = sum(WB_adj, na.rm = T) / n(),
            IMF_adj_year = sum(IMF_adj, na.rm = T) / n()) %>% 
  gather(key = adj_donor, value, -year, -pcsampledummy) %>% 
  filter(year <= 2004 & year >= 1990)


# generate plot
plot_adj <- ggplot(all_countries %>% filter(adj_donor == "WB_adj_year"), 
                   aes(x = year, 
                       y = value, 
                       color = factor(pcsampledummy))) + 
  geom_point(size = 2) +
  geom_line(size = 0.8) +
  scale_color_manual("Sample:", 
                     values = c("#b3cde3", "#e41a1c"),
                     labels = c("All countries", "Post-Conflict Countries")) +
  labs(x = "", y = "Share of \n Structural Adjustment \nPrograms \n per year") +
  theme(legend.position = "bottom") 


# Democracy Aid -----------------------------------------------------------

dga_plot_df <- diss_df %>% 
  group_by(year) %>% 
  summarise(dga_year = sum(dga, na.rm = T),
            all_aid = sum(aiddata_Aid, na.rm = T))

dga_plot <- ggplot(dga_plot_df, 
                   aes(x = year, 
                       y = dga_year / 1000000)) +
  geom_line(size =0.8) + 
  geom_point(size = 2) +
  labs(x = "", y = "Democracy and Governance Aid \n(in 2011 USD Millions)")




# Aid after conflict ------------------------------------------------------

ag_seq <- function(x) {
  runs <- cumsum(c(0, diff(x) != 1 ))
  return(runs)
}

source("./functions/identifyPostConflictYears.R")

ucdp_cy <- read_csv("./data/133280_onset2012csv.csv") %>% 
  arrange(gwno, year) %>% 
  group_by(gwno) %>% 
  mutate(iso2c = countrycode(gwno, "cown", "iso2c"),
         ucdp_dummy = ifelse(incidencev412 == 1, 1, 0),
         pc = pcIdentifier(ucdp_dummy),
         pc = ifelse(pc == 2, 1, 0),
         conflict_ep_id = cumsum(c(ifelse(first(ucdp_dummy) == 1, 
                                          1, 0), 
                                 diff(ucdp_dummy) != 0)), 
         conflict_ep_id = as.numeric(ifelse(ucdp_dummy == 1, 
                                            conflict_ep_id, 
                                            NA)),
         peace_ep_id = cumsum(c(ifelse(first(pc) == 2, 
                                       2, 1), 
                                diff(pc) != 0)),
         peace_ep_id = as.numeric(ifelse(pc == 1, peace_ep_id, NA)))%>% 
  group_by(gwno, conflict_ep_id) %>% 
  mutate(conflict_year = -1 * rev(cumsum(ucdp_dummy == 1))) %>% 
  group_by(gwno, peace_ep_id) %>% 
  mutate(peace_year = cumsum(pc == 1)) %>% 
  group_by(gwno) %>% 
  mutate(conf_and_peace_years = conflict_year + peace_year)

# add aiddata


ucdp_cy <- left_join(ucdp_cy, 
                     aid, 
                     by = c("iso2c" = "iso2", "year")) %>% 
  filter(year >= 1989)

ucdp_cy_df <- ucdp_cy %>% 
  filter(conf_and_peace_years >= -10 &
           conf_and_peace_years <= 10 &
           conf_and_peace_years != 0) %>% 
  group_by(conf_and_peace_years) 


conf_pc_aid_plot <- ggplot(ucdp_cy_df, 
                           aes(x = conf_and_peace_years, 
                               y = log( commitment_amount_usd_constant / population),
                               color = factor(pc))) +  
  # geom_jitter(data = ucdp_cy_df %>% 
  #               filter(log(aiddata_Aid / population) > 0 ),
  #             width = 0.2,
  #             alpha = 0.5) +  
  geom_smooth(data = ucdp_cy_df %>% 
                filter(pc == 1), 
              inherit.aes = T, 
              method = "loess") +  
  geom_smooth(data = ucdp_cy_df %>% 
                filter(pc == 0),
              method = "loess") +
  scale_x_continuous(breaks = -10:10) +
  scale_color_manual(values = c( "#fc8d59", "#4575b4")) +
  geom_vline(aes(xintercept = 0), color = "#e41a1c") +
  theme(legend.position = "none") +
  labs(x = "Years before / after end of internal armed conflict",
       y = "Aid per capita (log)")

# # aid / GDP
# conf_pc_aidgdp_plot <- ggplot(ucdp_cy_df, 
#                            aes(x = conf_and_peace_years, 
#                                y = log(aiddata_Aid / GDP),
#                                color = factor(pc))) +  
#   geom_smooth(data = ucdp_cy_df %>% 
#                 filter(pc == 1), 
#               inherit.aes = T, 
#               method = "loess") +  
#   geom_smooth(data = ucdp_cy_df %>% 
#                 filter(pc == 0),
#               method = "loess") +
#   scale_x_continuous(breaks = -10:10) +
#   scale_color_manual(values = c( "#fc8d59", "#4575b4")) +
#   geom_vline(aes(xintercept = 0), color = "#e41a1c") +
#   theme(legend.position = "none") +
#   labs(x = "Years before / after end of internal armed conflict",
#        y = "Aid / GDP (log)")


# Plot --------------------------------------------------------------------

# Output plot for manuscript
# library(tikzDevice)
# library(cowplot)
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# 
# tikz("../figures/WB_IMF.tex", height = 6)
# 
# 
# plot_grid(plot_adj, 
#           dga_plot, 
#           # conf_pc_aid_plot,
#           align = "v", nrow = 2)
# 
# 
# dev.off()

# Output plot for replication archive
library(cowplot)

plot_grid(plot_adj, 
          dga_plot, 
          # conf_pc_aid_plot,
          align = "v", nrow = 2)

LS0tDQp0aXRsZTogIkNoYXB0ZXIgMzogVGhlb3J5Ig0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IA0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIg0KLS0tDQoNCg0KIyBGaWd1cmUgMy4xOiBEaXN0cmlidXRpb24gb2YgUG9zdC1Db25mbGljdCBTdGF0ZXPigJkgUmV2ZW51ZSBTb3VyY2VzIGluIENvbXBhcmlzb24gdG8gT3RoZXIgSW5jb21lIEdyb3VwcywgMTk4OS0yMDEwDQoNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGZpZy5oZWlnaHQ9IDEwfQ0KDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocmlvKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoY293cGxvdCkNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9pbmNvbWVfdHlwZXNfV0RJLnJkdGEiKSAjIHRoaXMgZ2l2ZXMgdGhlICJ0YXhlcyIgZGF0YSBmcmFtZQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBpbnRyYXN0YXRlIHVjZHAgY291bnRyeS15ZWFyIGRhdGEgc2V0DQoNCiMgbG9hZCB0d28gc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBwcmUtIGFuZCBwb3N0LWNvbmZsaWN0IHllYXJzDQphZ19zZXEgPC0gZnVuY3Rpb24oeCkgew0KICBydW5zIDwtIGN1bXN1bShjKDAsIGRpZmYoeCkgIT0gMSApKQ0KICByZXR1cm4ocnVucykNCn0NCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9pZGVudGlmeVBvc3RDb25mbGljdFllYXJzLlIiKQ0KDQoNCiMgbG9hZCBhbmQgd3JhbmdsZSB1Y2RwIGRhdGENCnVjZHBfY3kgPC0gcmVhZF9jc3YoIi4vZGF0YS8xMzMyODBfb25zZXQyMDEyY3N2LmNzdiIpICU+JSANCiAgZmlsdGVyKHllYXIgPiAxOTg5KSAlPiUgDQogIGFycmFuZ2UoZ3dubywgeWVhcikgJT4lIA0KICBncm91cF9ieShnd25vKSAlPiUgDQogIG11dGF0ZShpc28yYyA9IGNvdW50cnljb2RlKGd3bm8sICJjb3duIiwgImlzbzJjIiksDQogICAgICAgICB1Y2RwX2R1bW15ID0gaWZlbHNlKGluY2lkZW5jZXY0MTIgPT0gMSwgMSwgMCksDQogICAgICAgICBwYyA9IHBjSWRlbnRpZmllcih1Y2RwX2R1bW15KSwNCiAgICAgICAgIHBjID0gaWZlbHNlKHBjID09IDIsIDEsIDApLA0KICAgICAgICAgY29uZmxpY3RfZXBfaWQgPSBjdW1zdW0oYyhpZmVsc2UoZmlyc3QodWNkcF9kdW1teSkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmKHVjZHBfZHVtbXkpICE9IDApKSwgDQogICAgICAgICBjb25mbGljdF9lcF9pZCA9IGFzLm51bWVyaWMoaWZlbHNlKHVjZHBfZHVtbXkgPT0gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2VwX2lkLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkEpKSwNCiAgICAgICAgIHBlYWNlX2VwX2lkID0gY3Vtc3VtKGMoaWZlbHNlKGZpcnN0KHBjKSA9PSAyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZihwYykgIT0gMCkpLA0KICAgICAgICAgcGVhY2VfZXBfaWQgPSBhcy5udW1lcmljKGlmZWxzZShwYyA9PSAxLCBwZWFjZV9lcF9pZCwgTkEpKSklPiUgDQogIGdyb3VwX2J5KGd3bm8sIGNvbmZsaWN0X2VwX2lkKSAlPiUgDQogIG11dGF0ZShjb25mbGljdF95ZWFyID0gLTEgKiByZXYoY3Vtc3VtKHVjZHBfZHVtbXkgPT0gMSkpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8sIHBlYWNlX2VwX2lkKSAlPiUgDQogIG11dGF0ZShwZWFjZV95ZWFyID0gY3Vtc3VtKHBjID09IDEpKSAlPiUgDQogIGdyb3VwX2J5KGd3bm8pICU+JSANCiAgbXV0YXRlKGNvbmZfYW5kX3BlYWNlX3llYXJzID0gY29uZmxpY3RfeWVhciArIHBlYWNlX3llYXIsIA0KICAgICAgICAgcGNfZHVtbXkgPSBwYykNCg0KDQoNCiMgVU4gR0RQIGVzdGltYXRlcw0KdW5fZ2RwIDwtIHJlYWRfY3N2KCIuL2RhdGEvVU5kYXRhX0V4cG9ydF8yMDE1MDcwM18wNTUwNTU1OTIuY3N2IikgJT4lIA0KICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShgQ291bnRyeSBvciBBcmVhYCwgImNvdW50cnkubmFtZSIsICJpc28yYyIpLA0KICAgICAgICAgeWVhciA9IFllYXIsDQogICAgICAgICBnZHAgPSBWYWx1ZSkNCg0KIyBBaWQNCmFpZCA8LSByZWFkLmR0YSgiLi9kYXRhL2FpZGRhdGFfZnVsbC5kdGEiKSAlPiUgDQogIGRwbHlyOjpyZW5hbWUod2JfQWlkR05JID0gRFRfT0RBX09EQVRfR05fWlMsDQogICAgICAgICAgICAgICAgd2JfQWlkUEMgPSBEVF9PREFfT0RBVF9QQ19aUywNCiAgICAgICAgICAgICAgICB3Yl9BaWRHbWVudFhQID0gRFRfT0RBX09EQVRfWFBfWlMsDQogICAgICAgICAgICAgICAgb2VjZF9BaWQgPSBhaWRfb2VjZF9jb21taXRtZW50MjAxMVVTRCwNCiAgICAgICAgICAgICAgICBvZWNkX0FpZF9taWxsID0gYWlkX29lY2RfY29tbWl0bWVudDIwMTFVU0RfbWlsbCwNCiAgICAgICAgICAgICAgICBhaWQgPSBjb21taXRtZW50X2Ftb3VudF91c2RfY29uc3RhbnQsIA0KICAgICAgICAgICAgICAgIGlzbzJjID0gaXNvMikgJT4lIA0KICBzZWxlY3QoLXBvcHVsYXRpb24pDQoNCiMgTWVyZ2UgJiB3cmFuZ2xlIGRhdGEgZm9yIGV2ZW50dWFsIHBsb3R0aW5nDQp0YXhlcyA8LSB0YXhlcyAlPiUgDQogIHJlbmFtZSh0YXggPSBHQy5UQVguVE9UTC5HRC5aUywNCiAgICAgICAgIG5hdHJlcyA9IE5ZLkdEUC5UT1RMLlJULlpTLA0KIyAgICAgICAgIGdkcCA9IE5ZLkdEUC5NS1RQLkNELA0KICAgICAgICAgcG9wdWxhdGlvbiA9IFNQLlBPUC5UT1RMKSAlPiUgDQogIGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSAlPiUgDQogIGxlZnRfam9pbiguLCB1Y2RwX2N5WywgYygiaXNvMmMiLCAieWVhciIsICJ1Y2RwX2R1bW15IiwgInBjX2R1bW15IildKSAlPiUgDQogICMgbGVmdF9qb2luKC4sIHBjX2R1bW15WywgYygiaXNvMmMiLCAieWVhciIsICJwY19kdW1teSIpXSkgJT4lIA0KICBsZWZ0X2pvaW4oLiwgdW5fZ2RwWywgYygiaXNvMmMiLCAieWVhciIsICJnZHAiKV0pICU+JSANCiAgbGVmdF9qb2luKC4sIGFpZCwgYnkgPSBjKCJpc28yYyIsICJ5ZWFyIikpICU+JSANCiAgbXV0YXRlKGluY29tZSA9IGFzLmNoYXJhY3RlcihpbmNvbWUpLA0KICAgICAgICAgYWlkID0gYWlkIC8gKGdkcCAqIHBvcHVsYXRpb24pLCANCiAgICAgICAgIGFpZCA9IGFpZCAqIDEwMCkgJT4lIA0KICBtdXRhdGUoaW5jb21lID0gaWZlbHNlKCFpcy5uYSh1Y2RwX2R1bW15KSAmIHVjZHBfZHVtbXkgPT0gMSwgIkNvbmZsaWN0LWFmZmVjdGVkIiwgaW5jb21lKSwNCiAgICAgICAgIGluY29tZSA9IGlmZWxzZSghaXMubmEocGNfZHVtbXkpICYgcGNfZHVtbXkgPT0gMSwgIlBvc3QtY29uZmxpY3QiLCBpbmNvbWUpLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGluY29tZSA9PSAiSGlnaCBpbmNvbWU6IE9FQ0QiIHwgaW5jb21lID09ICJIaWdoIGluY29tZTogbm9uT0VDRCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIkhpZ2ggSW5jb21lIiwgaW5jb21lKSkgJT4lIA0KICBmaWx0ZXIoY291bnRyeSAhPSAiVW5pdGVkIFN0YXRlcyIgJiBjb3VudHJ5ICE9ICJVbml0ZWQgS2luZ2RvbSIgJiBjb3VudHJ5ICE9ICJTcGFpbiIpICU+JSANCiAgZmlsdGVyKHBvcHVsYXRpb24gPiA1MDAwMDApICU+JSANCiAgbXV0YXRlKGluY29tZSA9IGlmZWxzZShjb3VudHJ5ID09ICJUaW1vci1MZXN0ZSIsICJDb25mbGljdC1hZmZlY3RlZCIsIGluY29tZSksDQogICAgICAgICBpbmNvbWUgPSBpZmVsc2UoY291bnRyeSA9PSAiWWVtZW4sIFJlcC4iLCAiQ29uZmxpY3QtYWZmZWN0ZWQiLCBpbmNvbWUpLA0KICAgICAgICAgaW5jb21lID0gaWZlbHNlKGNvdW50cnkgPT0gIldlc3QgQmFuayBhbmQgR2F6YSIsICJDb25mbGljdC1hZmZlY3RlZCIsIGluY29tZSkpICU+JSANCiAgdW5ncm91cCgpIA0KDQojICMgdGFrZSBsb2dzDQojIHRheGVzIDwtIHRheGVzICU+JSANCiMgICBtdXRhdGUodGF4ID0gbG9nKHRheCksIA0KIyAgICAgICAgICBuYXRyZXMgPSBsb2cobmF0cmVzICsgMSksIA0KIyAgICAgICAgICBhaWQgPSBsb2coYWlkICsgMSkpDQoNCg0KIyANCg0KIyB0aGlzIHBpZWNlIGNhbGN1bGF0ZXMgbWVhbnMgYW5kIG1lZGlhbnMgZm9yIGVhY2ggZGlzdHJpYnV0aW9uDQpwbG90X3RheF9kYXRhX21lZGlhbiA8LSB0YXhlcyAlPiUgDQogIGdyb3VwX2J5KGluY29tZSkgJT4lIA0KICBzdW1tYXJpc2UobWVkaWFuX3RheCA9IG1lZGlhbih0YXgsIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWRpYW5fbmF0cmVzID0gbWVkaWFuKG5hdHJlcywgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG1lZGlhbl9haWQgPSBtZWRpYW4oYWlkLCBuYS5ybSA9IFQpLA0KICAgICAgICAgICAgbWVhbl90YXggPSBtZWFuKHRheCwgbmEucm0gPSBUKSwNCiAgICAgICAgICAgIG1lYW5fbmF0cmVzID0gbWVhbihuYXRyZXMsIG5hLnJtID0gVCksDQogICAgICAgICAgICBtZWFuX2FpZCA9IG1lYW4oYWlkLCBuYS5ybSA9IFQpKSAlPiUgDQogIGZpbHRlcighaXMubmEobWVkaWFuX3RheCkpICU+JSANCiAgZ2F0aGVyKHZhcmlhYmxlLCB2YWx1ZSwgMjo3KSAlPiUgDQogIHNlcGFyYXRlKHZhcmlhYmxlLCBjKCJ0eXBlIiwgInZhcmlhYmxlIikpICU+JSANCiAgbXV0YXRlKHZhcmlhYmxlID0gcmVwbGFjZSh2YXJpYWJsZSwgdmFyaWFibGUgPT0gInRheCIsIHZhbHVlcyA9ICJUYXggSW5jb21lIC8gR0RQIiksDQogICAgICAgICB2YXJpYWJsZSA9IHJlcGxhY2UodmFyaWFibGUsIHZhcmlhYmxlID09ICJhaWQiLCB2YWx1ZXMgPSAiQWlkIC8gR0RQIiksDQogICAgICAgICB2YXJpYWJsZSA9IHJlcGxhY2UodmFyaWFibGUsIHZhcmlhYmxlID09ICJuYXRyZXMiLCB2YWx1ZXMgPSAiUmVzb3VyY2UgUmVudHMgLyBHRFAiKSkNCg0KdGF4ZXMgPC0gdGF4ZXMgJT4lIGxlZnRfam9pbiguLCBwbG90X3RheF9kYXRhX21lZGlhbiAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKHR5cGUgPT0gIm1lYW4iICYgdmFyaWFibGUgPT0gInRheCIpLCBhbGwueCA9IFQpICU+JSANCiAgYXJyYW5nZSh0eXBlLCB2YXJpYWJsZSwgdmFsdWUpICU+JSANCiAgZmlsdGVyKGluY29tZSAhPSAiTm90IGNsYXNzaWZpZWQiKQ0KDQojIHJlb3JkZXIgZmFjdG9ycyBmb3IgY291bnRyeSBncm91cCBjbGFzc2lmaWNhdGlvbg0KdGF4ZXMkaW5jb21lIDwtIGZhY3Rvcih0YXhlcyRpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJDb25mbGljdC1hZmZlY3RlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3N0LWNvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvdyBpbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG93ZXIgbWlkZGxlIGluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBJbmNvbWUiKSkNCg0KIyBnZXQgZGF0YSBpbiBzaGFwZSBmb3IgcGxvdHRpbmcNCnRheGVzX2dhdGggPC0gdGF4ZXMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGlzbzJjLCB5ZWFyLCBpbmNvbWUsIGFpZCwgbmF0cmVzLCB0YXgpICU+JSANCiAgcmVuYW1lKGBBaWQgLyBHRFBgID0gYWlkLA0KICAgICAgICAgYFJlc291cmNlIFJlbnRzIC8gR0RQYCA9IG5hdHJlcywNCiAgICAgICAgYFRheCBJbmNvbWUgLyBHRFBgID0gdGF4KSAlPiUgDQogIGdhdGhlcih2YXJpYWJsZSwgdmFsdWUsIDQ6NiApICU+JSANCiAgYXJyYW5nZShpc28yYywgdmFyaWFibGUsIHllYXIpIA0KDQoNCnRheGVzX2dhdGgkaW5jb21lIDwtIG9yZGVyZWQodGF4ZXNfZ2F0aCRpbmNvbWUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIkNvbmZsaWN0LWFmZmVjdGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1jb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvdyBpbmNvbWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxvd2VyIG1pZGRsZSBpbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIaWdoIEluY29tZSIpKQ0KDQoNCnBsb3RfdGF4X2RhdGFfbWVkaWFuJGluY29tZSA8LSBmYWN0b3IocGxvdF90YXhfZGF0YV9tZWRpYW4kaW5jb21lLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiQ29uZmxpY3QtYWZmZWN0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9zdC1jb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMb3cgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG93ZXIgbWlkZGxlIGluY29tZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBtaWRkbGUgaW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGlnaCBJbmNvbWUiKSkNCiMgZ2VuZXJhdGUgZmluYWwgcGxvdA0KDQpwbG90X3RheCA8LSBnZ3Bsb3QodGF4ZXNfZ2F0aCwgDQogICAgICAgICAgICAgICAgICAgYWVzKHggPSB2YWx1ZSwgZmlsbCA9IGluY29tZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGFlcyh5ID0gLi5kZW5zaXR5Li4pLCBiaW5zID0gMjAsIGNvbG9yID0gImJsYWNrIikgKyANCiAgZmFjZXRfZ3JpZCggaW5jb21lIH4gdmFyaWFibGUsIHNjYWxlcyA9ICJmcmVlIikgKw0KICBnZW9tX3ZsaW5lKGRhdGEgPSBwbG90X3RheF9kYXRhX21lZGlhbiAlPiUgZmlsdGVyKHR5cGUgPT0gIm1lZGlhbiIpLCANCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZhbHVlKSwNCiAgICAgICAgICAgICBzaXplID0gMSwgY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArDQogIGdlb21fdmxpbmUoZGF0YSA9IHBsb3RfdGF4X2RhdGFfbWVkaWFuICU+JSBmaWx0ZXIodHlwZSA9PSAibWVhbiIpLCANCiAgICAgICAgICAgICBhZXMoeGludGVyY2VwdCA9IHZhbHVlKSwNCiAgICAgICAgICAgICBzaXplID0gMSwgY29sb3IgPSAiYmxhY2siKSArDQogIA0KICB0aGVtZV9idygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IFJDb2xvckJyZXdlcjo6YnJld2VyLnBhbCg2LCAiUmRZbEduIikpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiIikgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpDQoNCiMgb3V0cHV0IGZvciBtYW51c2NyaXB0DQojIGxpYnJhcnkodGlrekRldmljZSkNCiMgb3B0aW9ucyggdGlrekRvY3VtZW50RGVjbGFyYXRpb24gPSAiXFxkb2N1bWVudGNsYXNzWzE2cHRde2FydGljbGV9IiApDQojIA0KIyB0aWt6KCIuLi9maWd1cmVzL3RheGVzLnRleCIsIGhlaWdodCA9IDcpDQojIHByaW50KHBsb3RfdGF4KQ0KIyBkZXYub2ZmKCkNCg0KIyBvdXRwdXQgZm9yIHJlcGxpY2F0aW9uIGFyY2hpdmUNCnByaW50KHBsb3RfdGF4KQ0KDQpgYGANCg0KDQoNCjwhLS0gKk5vdGUgZnJvbSB0aGUgbWFudXNjcmlwdDoqIFRoZSBoaXN0b2dyYW1zIHJlZmxlY3QgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgeCB2YWx1ZXMgKGkuZS4gVGF4ZXMsIE5hdHVyYWwgUmVzb3VyY2UgUmVudHMgcGVyIEdEUCwgYW5kIEFpZCAvIEdEUCkuIFRoZSB5LWF4aXMgcmVwcmVzZW50cyB0aGUgcGVyY2VudGFnZSBvZiBvYnNlcnZhdGlvbnMgaW4gdGhlIGNhdGVnb3J5LiBTaW5jZSB0aGUgbWF4aW11bSBwZXJjZW50YWdlIHNjb3JlIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHJlc3BlY3RpdmUgZGlzdHJpYnV0aW9uLCB0aGUgeS1heGVzIGhhdmUgZGlmZmVyZW50IHNjYWxlcyBpbiB0aGUgcmVzcGVjdGl2ZSBjb3VudHJ5IGNhdGVnb3JpZXMuIFRoZSBzb2xpZCB2ZXJ0aWNhbCBsaW5lIGluZGljYXRlcyB0aGUgbWVhbiBvZiBlYWNoIGRpc3RyaWJ1dGlvbjsgdGhlIGRhc2hlZCBsaW5lIGluZGljYXRlcyB0aGUgbWVkaWFuLiAtLT4NCg0KPCEtLSAqSW50ZXJwcmV0YXRpb246KiBNYW55IHZhbHVlcyB0byB0aGUgbGVmdCBpbmRpY2F0ZSBsaXR0bGUgaW5jb21lIGZyb20gdGhlIHJlc3BlY3RpdmUgcmVzb3VyY2UgdHlwZSBpbiBhIGdpdmVuIGNvdW50cnkgY2F0ZWdvcnkgKGkuZS4gdGhlIHN0cm9uZ2x5IHJpZ2h0LXNrZXdlZCBkaXN0cmlidXRpb24gb2YgcmVzb3VyY2UgcmVudHMgaW4gaGlnaC1pbmNvbWUgY291bnRyaWVzIChtaWRkbGUgY29sdW1uLCBib3R0b20gcm93KSBpbmRpY2F0ZXMgdGhhdCBvbmx5IHZlcnkgZmV3IGhpZ2gtaW5jb21lIGNvdW50cmllcyByZWNlaXZlIGluY29tZSBmcm9tIG5hdHVyYWwgcmVzb3VyY2VzKSwgYW5kIHZpY2UgdmVyc2EuICAtLT4NCg0KDQojIEZpZ3VyZSAzLjI6IEZvcmVpZ24gQWlkLCBDb25kaXRpb25hbGl0eSwgYW5kIEFybWVkIENvbmZsaWN0DQoNCmBgYHtyLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBmaWcuaGVpZ2h0PSA2fQ0KDQojIExpYnJhcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShjb3VudHJ5Y29kZSkNCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGZvcmVpZ24pDQpsaWJyYXJ5KHJlYWRyKQ0KDQojIExvYWQgZGF0YQ0KDQphaWQgPC0gcmVhZC5kdGEoIi4vZGF0YS9haWRkYXRhX2Z1bGwuZHRhIikNCg0KIyBXQiBhbmQgSU1GIHN0cnVjdHVyYWwgYWRqdXN0bWVudCBwcm9ncmFtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCndiX2FkaiA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZHJlaGVyV0JfSU1GLnhscyIsIHNoZWV0ID0gIldCIGFkanVzdG1lbnQgYWdyZWVkIikNCg0KaW1mX2FkaiA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZHJlaGVyV0JfSU1GLnhscyIsIHNoZWV0ID0gIklNRiBQUkdGIikNCg0KIyBkYXRhIGNsZWFuaW5nDQp3Yl9hZGogPC0gd2JfYWRqICU+JSBnYXRoZXIoeWVhciwgV0JfYWRqLCAgYDE5NzAuMDAwMDAwYDpgMjAwNC4wMDAwMDBgKSAlPiUgDQogIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoeWVhcikpKSAlPiUgDQogIGFycmFuZ2UoYENvdW50cnkgTmFtZWAsIHllYXIpDQogIA0KaW1mX2FkaiA8LSBpbWZfYWRqICU+JSBnYXRoZXIoeWVhciwgSU1GX2FkaixgMTk3MC4wMDAwMDBgOmAyMDExLjAwMDAwMGApICU+JSANCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih5ZWFyKSksDQogICAgICAgICBJTUZfYWRqID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoSU1GX2FkaikpKSAlPiUgDQogIGFycmFuZ2UoYENvdW50cnkgTmFtZWAsIHllYXIpDQoNCmFsbF9jb3VudHJpZXMgPC0gbGVmdF9qb2luKHdiX2FkaiwgaW1mX2FkaikNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIFdCIFN0cnVjdHVyYWwgQWRqdXN0bWVudCBEdW1taWVzDQp0ZXN0IDwtIGxlZnRfam9pbihkaXNzX2RmLCBpbWZfYWRqLCBieSA9IGMoImlzbzNjIiA9ICJDb3VudHJ5IENvZGUiLCAieWVhciIpKQ0KcGxvdF9JTUYgPC0gdGVzdCAlPiUgDQogIGdyb3VwX2J5KExvY2F0aW9uKSAlPiUgDQogIHN1bW1hcmlzZShJTUYgPSBpZmVsc2Uoc3VtKElNRl9hZGosIG5hLnJtID0gVCkgPiAwLCAxLCAwKSkNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIElNRiBTQVAgZHVtbWllcw0KdGVzdDIgPC0gbGVmdF9qb2luKGRpc3NfZGYsIHdiX2FkaiwgYnkgPSBjKCJpc28zYyIgPSAiQ291bnRyeSBDb2RlIiwgInllYXIiKSkNCnBsb3RfV0IgPC0gdGVzdDIgJT4lIA0KICBncm91cF9ieShMb2NhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UoV0IgPSBpZmVsc2Uoc3VtKFdCX2FkaiwgbmEucm0gPSBUKSA+IDAsIDEsIDApKQ0KDQoNCiMgY29tYmluZSBpbmZvcm1hdGlvbiBvZiBJTUYgYW5kIFdCIGFkanVzdG1lbnQgcHJvZ3JhbXMNCnBsb3RfYWRqX2RmIDwtIGxlZnRfam9pbih0ZXN0LCB0ZXN0MiAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICB1bmdyb3VwKCkgJT4lICANCiAgICAgICAgICAgICAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoeWVhciwgaXNvM2MsIFdCX2FkaikpICU+JSANCiAgbXV0YXRlKHBjc2FtcGxlZHVtbXkgPSAxKQ0KDQphbGxfY291bnRyaWVzIDwtIGxlZnRfam9pbihhbGxfY291bnRyaWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsb3RfYWRqX2RmWywgYygiaXNvM2MiLCAieWVhciIsICJwY3NhbXBsZWR1bW15IildLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiQ291bnRyeSBDb2RlIiA9ICJpc28zYyIsICJ5ZWFyIikpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHBjc2FtcGxlZHVtbXkgPSAwKSkNCg0KIyBwcmVwYXJlIGRhdGEgZm9yIHBsb3RzDQphbGxfY291bnRyaWVzIDwtIGFsbF9jb3VudHJpZXMgJT4lIA0KICBncm91cF9ieSh5ZWFyLCBwY3NhbXBsZWR1bW15KSAlPiUgDQogIGRwbHlyOjpzdW1tYXJpc2UoV0JfYWRqX3llYXIgPSBzdW0oV0JfYWRqLCBuYS5ybSA9IFQpIC8gbigpLA0KICAgICAgICAgICAgSU1GX2Fkal95ZWFyID0gc3VtKElNRl9hZGosIG5hLnJtID0gVCkgLyBuKCkpICU+JSANCiAgZ2F0aGVyKGtleSA9IGFkal9kb25vciwgdmFsdWUsIC15ZWFyLCAtcGNzYW1wbGVkdW1teSkgJT4lIA0KICBmaWx0ZXIoeWVhciA8PSAyMDA0ICYgeWVhciA+PSAxOTkwKQ0KDQoNCiMgZ2VuZXJhdGUgcGxvdA0KcGxvdF9hZGogPC0gZ2dwbG90KGFsbF9jb3VudHJpZXMgJT4lIGZpbHRlcihhZGpfZG9ub3IgPT0gIldCX2Fkal95ZWFyIiksIA0KICAgICAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSB2YWx1ZSwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZmFjdG9yKHBjc2FtcGxlZHVtbXkpKSkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMikgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDAuOCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIlNhbXBsZToiLCANCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIiNiM2NkZTMiLCAiI2U0MWExYyIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQWxsIGNvdW50cmllcyIsICJQb3N0LUNvbmZsaWN0IENvdW50cmllcyIpKSArDQogIGxhYnMoeCA9ICIiLCB5ID0gIlNoYXJlIG9mIFxuIFN0cnVjdHVyYWwgQWRqdXN0bWVudCBcblByb2dyYW1zIFxuIHBlciB5ZWFyIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgDQoNCg0KIyBEZW1vY3JhY3kgQWlkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmRnYV9wbG90X2RmIDwtIGRpc3NfZGYgJT4lIA0KICBncm91cF9ieSh5ZWFyKSAlPiUgDQogIHN1bW1hcmlzZShkZ2FfeWVhciA9IHN1bShkZ2EsIG5hLnJtID0gVCksDQogICAgICAgICAgICBhbGxfYWlkID0gc3VtKGFpZGRhdGFfQWlkLCBuYS5ybSA9IFQpKQ0KDQpkZ2FfcGxvdCA8LSBnZ3Bsb3QoZGdhX3Bsb3RfZGYsIA0KICAgICAgICAgICAgICAgICAgIGFlcyh4ID0geWVhciwgDQogICAgICAgICAgICAgICAgICAgICAgIHkgPSBkZ2FfeWVhciAvIDEwMDAwMDApKSArDQogIGdlb21fbGluZShzaXplID0wLjgpICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiRGVtb2NyYWN5IGFuZCBHb3Zlcm5hbmNlIEFpZCBcbihpbiAyMDExIFVTRCBNaWxsaW9ucykiKQ0KDQoNCg0KDQojIEFpZCBhZnRlciBjb25mbGljdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KYWdfc2VxIDwtIGZ1bmN0aW9uKHgpIHsNCiAgcnVucyA8LSBjdW1zdW0oYygwLCBkaWZmKHgpICE9IDEgKSkNCiAgcmV0dXJuKHJ1bnMpDQp9DQoNCnNvdXJjZSgiLi9mdW5jdGlvbnMvaWRlbnRpZnlQb3N0Q29uZmxpY3RZZWFycy5SIikNCg0KdWNkcF9jeSA8LSByZWFkX2NzdigiLi9kYXRhLzEzMzI4MF9vbnNldDIwMTJjc3YuY3N2IikgJT4lIA0KICBhcnJhbmdlKGd3bm8sIHllYXIpICU+JSANCiAgZ3JvdXBfYnkoZ3dubykgJT4lIA0KICBtdXRhdGUoaXNvMmMgPSBjb3VudHJ5Y29kZShnd25vLCAiY293biIsICJpc28yYyIpLA0KICAgICAgICAgdWNkcF9kdW1teSA9IGlmZWxzZShpbmNpZGVuY2V2NDEyID09IDEsIDEsIDApLA0KICAgICAgICAgcGMgPSBwY0lkZW50aWZpZXIodWNkcF9kdW1teSksDQogICAgICAgICBwYyA9IGlmZWxzZShwYyA9PSAyLCAxLCAwKSwNCiAgICAgICAgIGNvbmZsaWN0X2VwX2lkID0gY3Vtc3VtKGMoaWZlbHNlKGZpcnN0KHVjZHBfZHVtbXkpID09IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZih1Y2RwX2R1bW15KSAhPSAwKSksIA0KICAgICAgICAgY29uZmxpY3RfZXBfaWQgPSBhcy5udW1lcmljKGlmZWxzZSh1Y2RwX2R1bW15ID09IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9lcF9pZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSksDQogICAgICAgICBwZWFjZV9lcF9pZCA9IGN1bXN1bShjKGlmZWxzZShmaXJzdChwYykgPT0gMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYocGMpICE9IDApKSwNCiAgICAgICAgIHBlYWNlX2VwX2lkID0gYXMubnVtZXJpYyhpZmVsc2UocGMgPT0gMSwgcGVhY2VfZXBfaWQsIE5BKSkpJT4lIA0KICBncm91cF9ieShnd25vLCBjb25mbGljdF9lcF9pZCkgJT4lIA0KICBtdXRhdGUoY29uZmxpY3RfeWVhciA9IC0xICogcmV2KGN1bXN1bSh1Y2RwX2R1bW15ID09IDEpKSkgJT4lIA0KICBncm91cF9ieShnd25vLCBwZWFjZV9lcF9pZCkgJT4lIA0KICBtdXRhdGUocGVhY2VfeWVhciA9IGN1bXN1bShwYyA9PSAxKSkgJT4lIA0KICBncm91cF9ieShnd25vKSAlPiUgDQogIG11dGF0ZShjb25mX2FuZF9wZWFjZV95ZWFycyA9IGNvbmZsaWN0X3llYXIgKyBwZWFjZV95ZWFyKQ0KDQojIGFkZCBhaWRkYXRhDQoNCg0KdWNkcF9jeSA8LSBsZWZ0X2pvaW4odWNkcF9jeSwgDQogICAgICAgICAgICAgICAgICAgICBhaWQsIA0KICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJpc28yYyIgPSAiaXNvMiIsICJ5ZWFyIikpICU+JSANCiAgZmlsdGVyKHllYXIgPj0gMTk4OSkNCg0KdWNkcF9jeV9kZiA8LSB1Y2RwX2N5ICU+JSANCiAgZmlsdGVyKGNvbmZfYW5kX3BlYWNlX3llYXJzID49IC0xMCAmDQogICAgICAgICAgIGNvbmZfYW5kX3BlYWNlX3llYXJzIDw9IDEwICYNCiAgICAgICAgICAgY29uZl9hbmRfcGVhY2VfeWVhcnMgIT0gMCkgJT4lIA0KICBncm91cF9ieShjb25mX2FuZF9wZWFjZV95ZWFycykgDQoNCg0KY29uZl9wY19haWRfcGxvdCA8LSBnZ3Bsb3QodWNkcF9jeV9kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNvbmZfYW5kX3BlYWNlX3llYXJzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nKCBjb21taXRtZW50X2Ftb3VudF91c2RfY29uc3RhbnQgLyBwb3B1bGF0aW9uKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGZhY3RvcihwYykpKSArICANCiAgIyBnZW9tX2ppdHRlcihkYXRhID0gdWNkcF9jeV9kZiAlPiUgDQogICMgICAgICAgICAgICAgICBmaWx0ZXIobG9nKGFpZGRhdGFfQWlkIC8gcG9wdWxhdGlvbikgPiAwICksDQogICMgICAgICAgICAgICAgd2lkdGggPSAwLjIsDQogICMgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsgIA0KICBnZW9tX3Ntb290aChkYXRhID0gdWNkcF9jeV9kZiAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHBjID09IDEpLCANCiAgICAgICAgICAgICAgaW5oZXJpdC5hZXMgPSBULCANCiAgICAgICAgICAgICAgbWV0aG9kID0gImxvZXNzIikgKyAgDQogIGdlb21fc21vb3RoKGRhdGEgPSB1Y2RwX2N5X2RmICU+JSANCiAgICAgICAgICAgICAgICBmaWx0ZXIocGMgPT0gMCksDQogICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IC0xMDoxMCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYyggIiNmYzhkNTkiLCAiIzQ1NzViNCIpKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSAwKSwgY29sb3IgPSAiI2U0MWExYyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9ICJZZWFycyBiZWZvcmUgLyBhZnRlciBlbmQgb2YgaW50ZXJuYWwgYXJtZWQgY29uZmxpY3QiLA0KICAgICAgIHkgPSAiQWlkIHBlciBjYXBpdGEgKGxvZykiKQ0KDQojICMgYWlkIC8gR0RQDQojIGNvbmZfcGNfYWlkZ2RwX3Bsb3QgPC0gZ2dwbG90KHVjZHBfY3lfZGYsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNvbmZfYW5kX3BlYWNlX3llYXJzLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBsb2coYWlkZGF0YV9BaWQgLyBHRFApLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBmYWN0b3IocGMpKSkgKyAgDQojICAgZ2VvbV9zbW9vdGgoZGF0YSA9IHVjZHBfY3lfZGYgJT4lIA0KIyAgICAgICAgICAgICAgICAgZmlsdGVyKHBjID09IDEpLCANCiMgICAgICAgICAgICAgICBpbmhlcml0LmFlcyA9IFQsIA0KIyAgICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIpICsgIA0KIyAgIGdlb21fc21vb3RoKGRhdGEgPSB1Y2RwX2N5X2RmICU+JSANCiMgICAgICAgICAgICAgICAgIGZpbHRlcihwYyA9PSAwKSwNCiMgICAgICAgICAgICAgICBtZXRob2QgPSAibG9lc3MiKSArDQojICAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IC0xMDoxMCkgKw0KIyAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCAiI2ZjOGQ1OSIsICIjNDU3NWI0IikpICsNCiMgICBnZW9tX3ZsaW5lKGFlcyh4aW50ZXJjZXB0ID0gMCksIGNvbG9yID0gIiNlNDFhMWMiKSArDQojICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQojICAgbGFicyh4ID0gIlllYXJzIGJlZm9yZSAvIGFmdGVyIGVuZCBvZiBpbnRlcm5hbCBhcm1lZCBjb25mbGljdCIsDQojICAgICAgICB5ID0gIkFpZCAvIEdEUCAobG9nKSIpDQoNCg0KIyBQbG90IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMgT3V0cHV0IHBsb3QgZm9yIG1hbnVzY3JpcHQNCiMgbGlicmFyeSh0aWt6RGV2aWNlKQ0KIyBsaWJyYXJ5KGNvd3Bsb3QpDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyANCiMgdGlreigiLi4vZmlndXJlcy9XQl9JTUYudGV4IiwgaGVpZ2h0ID0gNikNCiMgDQojIA0KIyBwbG90X2dyaWQocGxvdF9hZGosIA0KIyAgICAgICAgICAgZGdhX3Bsb3QsIA0KIyAgICAgICAgICAgIyBjb25mX3BjX2FpZF9wbG90LA0KIyAgICAgICAgICAgYWxpZ24gPSAidiIsIG5yb3cgPSAyKQ0KIyANCiMgDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBwbG90IGZvciByZXBsaWNhdGlvbiBhcmNoaXZlDQpsaWJyYXJ5KGNvd3Bsb3QpDQoNCnBsb3RfZ3JpZChwbG90X2FkaiwgDQogICAgICAgICAgZGdhX3Bsb3QsIA0KICAgICAgICAgICMgY29uZl9wY19haWRfcGxvdCwNCiAgICAgICAgICBhbGlnbiA9ICJ2IiwgbnJvdyA9IDIpDQoNCg0KYGBgDQoNCg==