Table C.1: Robustness checks: Individual Effect of Power-Sharing

# Libraries
library(rms)
library(texreg)

# Load data
load("./data/nelda_ps.rda") 

# Models
model_ps_quality_cabinc <- ols(quality ~
                                 cabinetINC.12 +
                                 aid_ln +
                                 WBnatres +
                                 fh +
                                 nonstate +
                                 conf_intens +
                                 log(gdp_per_capita_un) +
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_ps_quality_cabinc <- robcov(model_ps_quality_cabinc, nelda_ps$country)


model_ps_quality_seniorinc <- ols(quality ~
                                 seniorINC.12 +
                                 aid_ln +
                                 WBnatres +
                                 fh +
                                 nonstate +
                                 conf_intens +
                                 log(gdp_per_capita_un) +
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_ps_quality_seniorinc <- robcov(model_ps_quality_seniorinc, nelda_ps$country)


model_ps_quality_nonseniorinc <- ols(quality ~
                                 nonseniorINC.12 +
                                 aid_ln +
                                 WBnatres +
                                 fh +
                                 nonstate +
                                 conf_intens +
                                 log(gdp_per_capita_un) +
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_ps_quality_nonseniorinc <- robcov(model_ps_quality_nonseniorinc, nelda_ps$country)

model_ps_v2xel_frefair_cabinc <- ols(v2xel_frefair ~
                                 cabinetINC.12 +
                                 aid_ln +
                                 WBnatres +
                                 fh +
                                 nonstate +
                                 conf_intens +
                                 log(gdp_per_capita_un) +
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_cabinc <- robcov(model_ps_v2xel_frefair_cabinc, nelda_ps$country)


model_ps_v2xel_frefair_seniorinc <- ols(v2xel_frefair ~
                                    seniorINC.12 +
                                    aid_ln +
                                    WBnatres +
                                    fh +
                                    nonstate +
                                    conf_intens +
                                    log(gdp_per_capita_un) +
                                    log(population)
                                  ,
                                  data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_seniorinc <- robcov(model_ps_v2xel_frefair_seniorinc, nelda_ps$country)


model_ps_v2xel_frefair_nonseniorinc <- ols(v2xel_frefair ~
                                       nonseniorINC.12 +
                                       aid_ln +
                                       WBnatres +
                                       fh +
                                       nonstate +
                                       conf_intens +
                                       log(gdp_per_capita_un) +
                                       log(population)
                                     ,
                                     data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_nonseniorinc <- robcov(model_ps_v2xel_frefair_nonseniorinc, nelda_ps$country)


# Output
model_list_ps_indrob <- list(model_ps_quality_cabinc, 
                             model_ps_quality_seniorinc,
                             model_ps_quality_nonseniorinc,
                             model_ps_v2xel_frefair_cabinc, 
                             model_ps_v2xel_frefair_seniorinc, 
                             model_ps_v2xel_frefair_nonseniorinc)

coef_name_map <- list(
                      cabinetINC.12 = "Power-Sharing (binary)",
                 # seniorCOUNT.12 = "Power-Sharing (senior)", 
                 seniorINC.12 = "Senior Power-Sharing (binary)",
                 # nonseniorCOUNT.12 = "Power-Sharing (nonsenior)", 
                 nonseniorINC.12 = "Nonsenior Power-Sharing (binary)",
                 aid_ln = "Aid/GDP (log)", 
                 # dga_gdp_null = "DGA/GDP (log)", 
                 # program_aid_gdp_null= "Program Aid / GDP (log)", 
                 # budget_aid_gdp_null = "Budget Aid / GDP (log", 
                 WBnatres = "Nat. Res. Rents", 
                 fh = "Regime Type (FH)", 
                 nonstate = "Nonstate Conflict", 
                 conf_intens =  "Conflict Intensity", 
                 population = "Population (log)", 
                 gdp_per_capita_un = "GDP p/c (log)")
# 
# # Output for Manuscript
# texreg(l = model_list_ps_indrob, 
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           custom.coef.map = coef_name_map,
#        file = "../output/aid_ps_indeff_elections_rob.tex", 
#         symbol = "+",
#           table = F,
#           booktabs = T,
#           use.packages = F,
#           dcolumn = T,
#           include.lr = F,
#           include.rsquared = F,
#         include.cluster = T,
#           include.adjrs = T,
#         caption = "")

# Output for Replication Archive
htmlreg(l = model_list_ps_indrob, 
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
        symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
          dcolumn = T,
          include.lr = F,
          include.rsquared = F,
        include.cluster = T,
          include.adjrs = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (binary) 0.80+ 0.20**
(0.44) (0.07)
Senior Power-Sharing (binary) 1.53* 0.22**
(0.65) (0.08)
Nonsenior Power-Sharing (binary) 0.96+ 0.17*
(0.54) (0.07)
Aid/GDP (log) -0.10 -0.11 -0.11 -0.02 -0.02 -0.02
(0.09) (0.08) (0.09) (0.01) (0.01) (0.01)
Nat. Res. Rents -0.02 -0.02+ -0.02 -0.01** -0.01*** -0.01**
(0.01) (0.01) (0.01) (0.00) (0.00) (0.00)
Regime Type (FH) 0.36* 0.31* 0.34* 0.10*** 0.09*** 0.09***
(0.16) (0.15) (0.16) (0.02) (0.02) (0.02)
Nonstate Conflict -2.62** -2.55** -2.58** -0.27*** -0.27*** -0.27***
(0.87) (0.86) (0.85) (0.05) (0.04) (0.05)
Conflict Intensity -0.62 -0.72 -0.59 0.00 -0.01 0.01
(0.46) (0.47) (0.47) (0.06) (0.06) (0.06)
Population (log) 0.10 0.10 0.09 0.03* 0.03* 0.03+
(0.22) (0.21) (0.21) (0.01) (0.01) (0.01)
GDP p/c (log) -0.28 -0.32 -0.29 0.01 -0.00 0.00
(0.22) (0.21) (0.22) (0.02) (0.02) (0.02)
Num. obs. 142 142 142 141 141 141
Adj. R2 0.16 0.20 0.17 0.49 0.46 0.45
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table C.2: Individual Effects (V-Dem Election Quality)

# Libraries
library(rms)
library(texreg)

# Load data
load("./data/nelda_ps.rda") 

# Models
model_ps_v2xel_frefair_cabcount <- ols(v2xel_frefair ~ 
                                   cabinetCOUNT.12 +
                                   aid_ln +  
                                   WBnatres + 
                                   fh + 
                                   nonstate + 
                                   conf_intens + 
                                   log(gdp_per_capita_un) + 
                                   log(population)
                                 ,
                                 data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_cabcount <- robcov(model_ps_v2xel_frefair_cabcount, nelda_ps$country)

model_ps_v2xel_frefair_seniorcount <- ols(v2xel_frefair ~ 
                                      seniorCOUNT.12 +
                                      aid_ln +  
                                      WBnatres + 
                                      fh + 
                                      nonstate + 
                                      conf_intens + 
                                      log(gdp_per_capita_un) + 
                                      log(population)
                                    ,
                                    data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_seniorcount <- robcov(model_ps_v2xel_frefair_seniorcount, nelda_ps$country)


model_ps_v2xel_frefair_nonseniorcount <- ols(v2xel_frefair ~ 
                                         nonseniorCOUNT.12 +
                                         aid_ln +  
                                         WBnatres + 
                                         fh + 
                                         nonstate + 
                                         conf_intens + 
                                         log(gdp_per_capita_un) + 
                                         log(population)
                                       ,
                                       data = nelda_ps, x = T, y = T)
model_ps_v2xel_frefair_nonseniorcount <- robcov(model_ps_v2xel_frefair_nonseniorcount, nelda_ps$country)


# Models Aid

model_dga_v2xel_frefair <- ols(v2xel_frefair ~ 
                           cabinetCOUNT.12 +
                           log(dga_gdp_null + 1 )+ 
                           aid_ln +  
                           WBnatres + 
                           fh + 
                           nonstate + 
                           conf_intens + 
                           log(gdp_per_capita_un) + 
                           log(population)
                         ,
                         data = nelda_ps, x = T, y = T)
model_dga_v2xel_frefair <- robcov(model_dga_v2xel_frefair, nelda_ps$country)

# program aid
model_prog_aid_v2xel_frefair <- ols(v2xel_frefair ~ 
                                cabinetCOUNT.12 +
                                log(program_aid_gdp_null + 1 )+ 
                                aid_ln +  
                                WBnatres + 
                                fh + 
                                nonstate + 
                                conf_intens + 
                                log(gdp_per_capita_un) + 
                                log(population)
                              ,
                              data = nelda_ps, x = T, y = T)
model_prog_aid_v2xel_frefair <- robcov(model_prog_aid_v2xel_frefair, nelda_ps$country)

# budget aid
model_budgetaid_v2xel_frefair <- ols(v2xel_frefair ~ 
                                 cabinetCOUNT.12 +
                                 log(budget_aid_gdp_null + 1 )+ 
                                 aid_ln +  
                                 WBnatres + 
                                 fh + 
                                 nonstate + 
                                 conf_intens + 
                                 log(gdp_per_capita_un) + 
                                 log(population)
                               ,
                               data = nelda_ps, x = T, y = T)
model_budgetaid_v2xel_frefair <- robcov(model_budgetaid_v2xel_frefair, nelda_ps$country)


# Output 
# individual effects model list
ind_effect_models_app <- list(model_ps_v2xel_frefair_cabcount, 
                         model_ps_v2xel_frefair_seniorcount, 
                         model_ps_v2xel_frefair_nonseniorcount, 
                         model_dga_v2xel_frefair, 
                         model_prog_aid_v2xel_frefair, 
                         model_budgetaid_v2xel_frefair)


coef_name_map <- list(cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                 seniorCOUNT.12 = "Power-Sharing (senior)", 
                 nonseniorCOUNT.12 = "Power-Sharing (nonsenior)", 
                 aid_ln = "Aid/GDP (log)", 
                 dga_gdp_null = "DGA/GDP (log)", 
                 program_aid_gdp_null= "Program Aid / GDP (log)", 
                 budget_aid_gdp_null = "Budget Aid / GDP (log", 
                 WBnatres = "Nat. Res. Rents", 
                 fh = "Regime Type (FH)", 
                 nonstate = "Nonstate Conflict", 
                 conf_intens =  "Conflict Intensity", 
                 population = "Population (log)", 
                 gdp_per_capita_un = "GDP p/c (log)")

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

# Output Manuscript
# texreg(l = ind_effect_models_app, 
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           custom.coef.map = coef_name_map,
#         symbol = "+",
#        file = "../output/aid_ps_indeff_elections_vdem.tex",
#           table = F,
#           booktabs = T,
#           use.packages = F,
#           dcolumn = T,
#           include.lr = F,
#           include.rsquared = F,
#           include.adjrs = T,
#         include.cluster = T,
#         caption = "", 
#         star.symbol = "\\*")


# Output Replication Archive
htmlreg(l = ind_effect_models_app, 
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
        symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
          dcolumn = T,
          include.lr = F,
          include.rsquared = F,
          include.adjrs = T,
        include.cluster = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) 0.02** 0.02** 0.02*** 0.02*
(0.01) (0.01) (0.01) (0.01)
Power-Sharing (senior) 0.07***
(0.02)
Power-Sharing (nonsenior) 0.03*
(0.01)
Aid/GDP (log) -0.01 -0.01 -0.01 -0.02** -0.04*** -0.02+
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
DGA/GDP (log) 0.13***
(0.04)
Program Aid / GDP (log) 0.12*
(0.05)
Budget Aid / GDP (log 0.06
(0.04)
Nat. Res. Rents -0.01*** -0.01*** -0.01*** -0.01*** -0.01*** -0.01***
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type (FH) 0.09*** 0.08*** 0.09*** 0.08*** 0.09*** 0.08***
(0.02) (0.02) (0.02) (0.02) (0.02) (0.02)
Nonstate Conflict -0.25*** -0.25*** -0.26*** -0.24*** -0.23*** -0.26***
(0.05) (0.05) (0.05) (0.05) (0.05) (0.05)
Conflict Intensity -0.01 0.00 -0.00 -0.02 -0.04 -0.02
(0.07) (0.07) (0.07) (0.08) (0.06) (0.07)
Population (log) 0.02 0.02+ 0.02 0.03* 0.03* 0.03+
(0.01) (0.01) (0.01) (0.01) (0.01) (0.02)
GDP p/c (log) 0.01 0.02 0.01 0.03 0.05 0.02
(0.02) (0.02) (0.03) (0.02) (0.03) (0.02)
Num. obs. 141 141 141 141 141 141
Countries 41 41 41 41 41 41
Adj. R2 0.45 0.48 0.43 0.53 0.50 0.48
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table C.3: Outlier Analysis

# Libraries
library(rms)
library(texreg)
library(tidyverse)

# Load data
load("./data/nelda_ps.rda") 


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


# define selectvars which is necessary for the custom 'check_outliers()' 
# function 

selectvars = c("electionid", "country", "year", "identifiers")

outlierfit_nelda <- lm(quality ~ 
                         aid_ln *  
                         cabinetCOUNT.12 +
                         WBnatres + 
                         fh + 
                         conf_intens + 
                         # nonstate +
                         
                         log(gdp_per_capita_un) + 
                         log(population)
                       ,
                       data = nelda_ps, x = T, y = T)


outlierfit_vdem <- lm(v2xel_frefair ~ 
                        aid_ln *  
                        cabinetCOUNT.12 +
                        WBnatres + 
                        fh + 
                        conf_intens + 
                        # nonstate +
                        log(gdp_per_capita_un) + 
                        log(population)
                      ,
                      data = nelda_ps, x = T, y = T)


outliers_election_nelda <- check_outlier(outlierfit_nelda,
                                         data = nelda_ps, 
                                         selectvars = selectvars)
outliers_election_vdem <- check_outlier(outlierfit_vdem,
                                    data = nelda_ps, 
                                    selectvars = selectvars)

## Output
coef_name_map <- list( cabinetINC.12 = "Power-Sharing (binary)",
                       "aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid", 
                       cabinetCOUNT.12 = "Power-Sharing (cabinet)",
                       "aid_ln * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid", 
                       aid_ln = "Aid/GDP (log)", 
                       dga_gdp_null = "DGA/GDP (log)", 
                       program_aid_gdp_null= "Program Aid / GDP (log)", 
                       budget_aid_gdp_null = "Budget Aid / GDP (log", 
                       WBnatres = "Nat. Res. Rents", 
                       fh = "Regime Type (FH)", 
                       nonstate = "Nonstate Conflict", 
                       conf_intens =  "Conflict Intensity", 
                       population = "Population (log)", 
                       gdp_per_capita_un = "GDP p/c (log)")


source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')


# # Output Maucsript
# custom_texreg(l = list(outliers_election_nelda[[2]],
#                    outliers_election_nelda[[4]], 
#                    outliers_election_nelda[[6]], 
#                    outliers_election_vdem[[2]], 
#                    outliers_election_vdem[[4]], 
#                    outliers_election_vdem[[6]]),
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           custom.coef.map = coef_name_map,
#         symbol = "+",
#           table = F,
#         file = "../output/aidps_elections_outlierrobust.tex",
#           custom.multicol = T, 
#            custom.model.names = c(" \\multicolumn{3}{c}{\\textbf{NELDA Election Quality}} & 
#                               \\multicolumn{3}{c}{\\textbf{V-Dem Clean Elections Index}} \\\\ 
#                               \\cmidrule(r){2-4} \\cmidrule(r){5-7} 
#                               & \\multicolumn{1}{c}{(1) Hat Values }",
#                               "\\multicolumn{1}{c}{(2)  Cook's Distance}",
#                               "\\multicolumn{1}{c}{(3)  DFBETA}",
#                               "\\multicolumn{1}{c}{(4)  Hat Values}",
#                               "\\multicolumn{1}{c}{(5)  Cook's Distance}",
#                               "\\multicolumn{1}{c}{(6)  DFBETA}"),
#           booktabs = T,
#           use.packages = F,
#           dcolumn = T,
#           include.lr = F,
#           include.rsquared = F,
#         include.cluster = T,
#           include.adjrs = T,
#         caption = "")

# Output Replication Archive
htmlreg(l = list(outliers_election_nelda[[2]],
                   outliers_election_nelda[[4]], 
                   outliers_election_nelda[[6]], 
                   outliers_election_vdem[[2]], 
                   outliers_election_vdem[[4]], 
                   outliers_election_vdem[[6]]),
          stars = c(0.001, 0.01, 0.05, 0.1),
          custom.coef.map = coef_name_map,
        symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
          dcolumn = T,
          include.lr = F,
          include.rsquared = F,
        include.cluster = T,
          include.adjrs = T,
        caption = "", 
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) -2.85*** -0.23** -0.19 -0.17+ -0.06*** -0.04**
(0.68) (0.09) (0.12) (0.09) (0.01) (0.01)
Power-Sharing (cabinet) * Aid 1.34*** 0.13*** 0.11** 0.09+ 0.03*** 0.02***
(0.35) (0.04) (0.04) (0.05) (0.00) (0.00)
Aid/GDP (log) -0.16 -0.04 -0.15** 0.01 -0.02 0.01
(0.19) (0.10) (0.05) (0.02) (0.01) (0.02)
Nat. Res. Rents -0.05** -0.03+ -0.05*** -0.01*** -0.01*** -0.01***
(0.02) (0.02) (0.01) (0.00) (0.00) (0.00)
Regime Type (FH) 0.24 0.17 0.23 0.07*** 0.06** 0.07***
(0.23) (0.21) (0.15) (0.02) (0.02) (0.02)
Conflict Intensity -0.50 -0.60 -1.15*** 0.01 0.04 -0.03
(0.43) (0.44) (0.34) (0.07) (0.07) (0.07)
Population (log) -0.01 0.06 0.04 0.02 0.02 0.02
(0.23) (0.20) (0.18) (0.02) (0.02) (0.01)
GDP p/c (log) -0.22 -0.00 -0.51* 0.04+ 0.04+ 0.05*
(0.30) (0.28) (0.20) (0.02) (0.02) (0.03)
Num. obs. 129 140 99 128 138 102
Adj. R2 0.13 0.07 0.25 0.42 0.46 0.61
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table C.4 and Figure C.1: Matching Diagnostics

library(MatchIt)
library(dplyr)
library(tidyr)
library(xtable)
library(rms)
library(texreg)


# Create matched data set for elections

# First: create values for matching at the beginning of post-conflict period. This
# serves the purpose of creating pre-treatment (or approximation to pre-treatment) 
# values of the covariates

nelda_ps_matching <- nelda_ps %>% 
  ungroup() %>% 
  arrange(country, year) %>% 
  group_by(country, pc_period) %>% 
  mutate(matchyear = first(year)) %>%
  mutate(match_natres = first(WBnatres),
         match_aiddata_AidGDP = first(aiddata_AidGDP),
         match_pop = first(population),
         match_conf_intens = first(conf_intens),
         match_nonstate = first(nonstate),
         match_fh = first(fh),
         match_nelda45 = first(nelda45),
         match_gdp_per_capita_un = first(gdp_per_capita_un)) 

# add additional rebel parity variable as predictor
# parity_to_join_nelda <- psed_ag_y %>% 
#   dplyr::select(iso3c, pc_period, minyear, parity) %>% 
#   group_by(iso3c, pc_period) %>%  
#   dplyr::summarise(parity = unique(parity))
# 
# nelda_ps_matching <- left_join(nelda_ps_matching, parity_to_join_nelda)
  
match_data_elections <- nelda_ps_matching %>% 
  dplyr::select(cabinetINC.12, 
                aiddata_AidGDP, 
                gdp_per_capita_un, 
                year, 
                country,
                seniorINC.12, 
                nonseniorINC.12, 
                seniorCOUNT.12, 
                nonseniorCOUNT.12,
                cabinetCOUNT.12, 
                population, conf_intens, nonstate, WBnatres, fh, nelda45,
                quality, v2xel_frefair, electionid, 
                iso2c, aiddata_Aid, GDP,
                match_natres, match_aiddata_AidGDP, match_pop, match_conf_intens,
                match_nonstate, match_fh, match_nelda45, match_gdp_per_capita_un)



match_data_elections <- match_data_elections[complete.cases(match_data_elections), ]
match_data_elections <- as.data.frame(match_data_elections)


# Matching Mahalanobis

#I match only on post-conflict controls at the beginning of the pc period

match_data_elections <- match_data_elections %>% 
  arrange(country, pc_period, year)

set.seed(1234)

match_res <- matchit(cabinetINC.12 ~ 
                       log(match_aiddata_AidGDP) + 
                       log(match_gdp_per_capita_un) + 
                       log(match_pop) + 
                       match_conf_intens + 
                       log(match_natres + 1)  + 
                       match_nonstate +
                       match_fh , 
                     data = match_data_elections, 
                     method = "nearest",
                     ratio = 2,
                     distance = "mahalanobis")

match_df_elec_reg <- match.data(match_res)


# Imbalance Reduction Tables ----------------------------------------------

# This section creates the matching diagnostics: First the imbalance reduction as
# tables including the t-test and K-S test for significant difference between treated
# and control. And also a balance improvment plot. 

# First: the imbalance reduction tables before and after matching.

library(ebal)
library(Matching)

# before matching

imb_before <- MatchBalance(cabinetINC.12 ~ 
                             log(match_aiddata_AidGDP) + 
                             log(match_gdp_per_capita_un) + 
                             log(match_pop) + 
                             match_conf_intens + 
                             log(match_natres + 1)  + 
                             match_nonstate +
                             match_fh, 
                           data = match_data_elections, 
                           digits = 2,
                           ks = T, print.level = 0) # data before matching

# note that order of covariates in MatchBalance is important to get row names right
imbalance_tab_before <- baltest.collect(imb_before, 
                                        c("Aid / GDP (log)", "GDP / PC (log)",
                                          "Population (log)", "Conflict Intensity",
                                          "Natural Resource Rents (log)", "Nonstate Conflict",
                                          "Regime Type (FH)"), 
                                        after = F)
# do not report all statistics
imbalance_tab_before <- imbalance_tab_before[, c("mean.Tr", 
                                                 "mean.Co", 
                                                 "T pval", 
                                                 "KS pval")]

colnames(imbalance_tab_before) <-  c("Mean Treated", "Mean Control", "P-Value T-Test", "P-Value K-S Test")

# After Matching

imb_after <- MatchBalance(cabinetINC.12 ~ 
                             log(match_aiddata_AidGDP) + 
                             log(match_gdp_per_capita_un) + 
                             log(match_pop) + 
                             match_conf_intens + 
                             log(match_natres + 1)  + 
                             match_nonstate +
                             match_fh, 
                           data = match_df_elec_reg, 
                           digits = 2,
                           ks = T, print.level = 0) # data before matching

# note that order of covariates in MatchBalance is important to get row names right
imbalance_tab_after<- baltest.collect(imb_after, 
                                      c("Aid / GDP (log)", 
                                        "GDP / PC (log)",
                                        "Population (log)", 
                                        "Conflict Intensity",
                                        "Natural Resource Rents (log)", 
                                        "Nonstate Conflict",
                                        "Regime Type (FH)"), 
                                      after = F)
imbalance_tab_after <- imbalance_tab_after[, c("mean.Tr", 
                                               "mean.Co", 
                                               "T pval", 
                                               "KS pval")]

colnames(imbalance_tab_after) <- c("Mean Treated", 
                                   "Mean Control", 
                                   "P-Value T-Test", 
                                   "P-Value K-S Test")

# output imbalance tables
print(xtable(imbalance_tab_before), booktabs = T, type = "latex", floating = F,
      file = "../output/matching_imbalance_reduction_elections_before.tex")
print(xtable(imbalance_tab_after), booktabs = T, type = "latex", floating = F,
      file = "../output/matching_imbalance_reduction_elections_after.tex")


print(xtable(imbalance_tab_before), booktabs = T, type = "html", floating = F)
Mean Treated Mean Control P-Value T-Test P-Value K-S Test
Aid / GDP (log) 2.51 1.23 0.00 0.00
GDP / PC (log) 6.07 6.78 0.00 0.00
Population (log) 15.36 15.92 0.07 0.00
Conflict Intensity 0.38 0.18 0.08
Natural Resource Rents (log) 1.48 1.54 0.85 0.06
Nonstate Conflict 0.00 0.07 0.00
Regime Type (FH) 2.77 3.37 0.00 0.06
print(xtable(imbalance_tab_after), booktabs = T, type = "html", floating = F)
Mean Treated Mean Control P-Value T-Test P-Value K-S Test
Aid / GDP (log) 2.51 2.14 0.05 0.02
GDP / PC (log) 6.07 6.30 0.27 0.30
Population (log) 15.36 15.38 0.95 0.06
Conflict Intensity 0.38 0.38 1.00
Natural Resource Rents (log) 1.48 1.34 0.67 0.17
Nonstate Conflict 0.00 0.00 1.00
Regime Type (FH) 2.77 3.15 0.07 0.22
# imbalance reduction plot, see http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2943670/
library(tidyr)
library(ggplot2)
library(ggrepel)

balance_improvement <- summary(match_res)$reduction
row.names(balance_improvement) <- c("Aid / GDP (log)", "GDP / PC (log)",
                                    "Population (log)", "Conflict Intensity",
                                    "Natural Resource Rents (log)", "Nonstate Conflict",
                                    "Regime Type (FH)")

balance_improvement <- data.frame(variable = 
                                    row.names(balance_improvement), 
                                  percent_balance_improvement = round(balance_improvement[, 1], 2))


plot_balanceimpr <- data.frame(`All Data` = abs(summary(match_res, 
                                                        standardize = T)$sum.all$`Std. Mean Diff.`), 
                               `Matched Data` = abs(summary(match_res, 
                                                            standardize = T)$sum.matched$`Std. Mean Diff.`),
                               cov = balance_improvement$variable) %>% 
  gather(key, value, -cov) %>% 
  filter(!is.nan(value) & !is.infinite(value)) %>% 
  mutate(key = gsub("\\.", " ", key))


plot_balanceimpr_out <- plot_balanceimpr %>% 
  ggplot(., aes(x = key, y = value)) + 
  geom_point(size = 2.5) + 
  geom_line(aes(group = cov),
            linemitre = 2, size = 0.6) + 
  geom_hline(yintercept = 0.25, aes(group = key)) +
  geom_label_repel(data = plot_balanceimpr %>% filter(key == "All Data"),
                   aes(label = cov),
                   nudge_x = -.4,
                   nudge_y = -.1) +
  theme_bw() +
  labs(x = "", y = "Absolute Standardized Difference in Means")

print(plot_balanceimpr_out)

Table C.5: First Stage and Reduced Form Regressions for Instrumental Variable Analysis

# Libraries
library(tidyverse)
library(texreg)


# Load elections data
load("./data/nelda_ps.rda")

# load instrument data for aid
load(file = "./data/instrumentedAid2.RData")

nelda_ivreg <- left_join(nelda_ps, instrument_df,
                         by = c("year", "iso2c"))

nelda_ivreg$total_sum_except <- as.numeric(nelda_ivreg$total_sum_except)

nelda_ivreg$instr_aid_gdp <- log(nelda_ivreg$total_sum_except / nelda_ivreg$GDP)

nelda_ivreg$date <- NULL
nelda_ivreg$StartDate2 <- NULL
nelda_ivreg$yearmon.x <- NULL
nelda_ivreg$yearmon.y <- NULL
nelda_ivreg[nelda_ivreg == ""] <- NA



# first stage and reduced form models

firststage <- ols(log(aiddata_Aid / GDP)  ~ 
                    cabinetCOUNT.12 +
                    instr_aid_gdp  + 
                    WBnatres + 
                    fh + 
                    nonstate + 
                    conf_intens + 
                    log(gdp_per_capita_un) + 
                    log(population),
                  data = nelda_ivreg, x = T, y = T)

firststage <- robcov(firststage, nelda_ivreg$country)

firststage_inter <- ols(log(aiddata_Aid / GDP) * cabinetCOUNT.12  ~ 
                    cabinetCOUNT.12 * instr_aid_gdp  + 
                    WBnatres + 
                    fh + 
                    nonstate + 
                    conf_intens + 
                    log(gdp_per_capita_un) + 
                    log(population),
                  data = nelda_ivreg, x = T, y = T)

firststage_inter <- robcov(firststage_inter, nelda_ivreg$country)

reduced_form <- ols(v2xel_frefair ~
                    instr_aid_gdp *
                    cabinetCOUNT.12 +
                    WBnatres + 
                    fh + 
                    nonstate + 
                    conf_intens + 
                    log(gdp_per_capita_un) + 
                    log(population),
                  data = nelda_ivreg, x = T, y = T)
reduced_form <- robcov(reduced_form, nelda_ivreg$country)


reduced_form_nelda <- ols(quality ~
                      instr_aid_gdp *
                      cabinetCOUNT.12 +
                      WBnatres + 
                      fh + 
                      nonstate + 
                      conf_intens + 
                      log(gdp_per_capita_un) + 
                      log(population),
                    data = nelda_ivreg, x = T, y = T)
reduced_form_nelda <- robcov(reduced_form_nelda, nelda_ivreg$country)

source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')

# custom_texreg(l = list(firststage, 
#                        firststage_inter,
#                        reduced_form, reduced_form_nelda),
#               omit.coef = "Intercept",
#               file = "../output/iv_elections_firststage_reduced.tex",
#                custom.model.names = c("\\multicolumn{2}{c}{\\textbf{First Stage}} &
# \\multicolumn{2}{c}{\\textbf{Reduced Form}}   \\\\                              \\cmidrule(r){2-3} \\cmidrule(r){4-5}
#                               & \\multicolumn{1}{c}{ (1) DV: Aid / GDP (log)}",
# "\\multicolumn{1}{c}{ (2) DV: Aid /GDP * P-S}",
# "\\multicolumn{1}{c}{ (3) V-Dem CEI) }",
# "\\multicolumn{1}{c}{ (4) NELDA)}"),
#               custom.coef.names = c("Intercept",
#                                     "Power-Sharing (cabinet)",
#                                     "Aid / GDP (log) - Instrumented",
#                                     "Natural Resource Rents",
#                                     "Regime Type (FH)",
#                                     "Nonstate Conflict",
#                                     "Conflict Intensity",
#                                     "GDP / PC (log)",
#                                     "Population (log)",
#                                     "Aid  / GDP (log) - Instrumented * Power-Sharing (cabinet)",
#                                     "Aid  / GDP (log) - Instrumented * Power-Sharing (cabinet)"),
#               reorder.coef = c(1, 2, 9, 3:8),
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               booktabs = TRUE,
#               center = TRUE,
#               symbol = "+",
#               table = FALSE,
#               custom.multicol = TRUE,
#               column = T,
#               dcolumn = TRUE,
#               include.rsquared = F,
#               include.cluster = T,
#               use.packages = F)

htmlreg(l = list(firststage, firststage_inter, 
                reduced_form, reduced_form_nelda),
       omit.coef = "Intercept",
  
       custom.coef.names = c("Intercept", 
                             "Power-Sharing (cabinet)", 
                             "Aid / GDP (log) - Instrumented",
                             "Natural Resource Rents", 
                             "Regime Type (FH)",
                             "Nonstate Conflict",
                             "Conflict Intensity",
                             "GDP / PC (log)",
                             "Population (log)",
                             "Aid  / GDP (log) - Instrumented * Power-Sharing (cabinet)",
                             "Aid  / GDP (log) - Instrumented * Power-Sharing (cabinet)"),
       reorder.coef = c(1, 2, 9, 3:8),
       stars = c(0.001, 0.01, 0.05, 0.1),
       booktabs = TRUE,
       center = TRUE,
       symbol = "+",
       caption = "",
       table = FALSE, 
       custom.multicol = TRUE,
       column = T,
       dcolumn = TRUE,
       use.packages = F)
Model 1 Model 2 Model 3 Model 4
Power-Sharing (cabinet) 0.02 -17.16*** -0.38*** -1.83**
(0.03) (1.13) (0.07) (0.70)
Aid / GDP (log) - Instrumented 0.40*** -0.02 -0.01 -0.01
(0.06) (0.02) (0.01) (0.08)
Aid / GDP (log) - Instrumented * Power-Sharing (cabinet) 0.72*** 0.02*** 0.09**
(0.05) (0.00) (0.03)
Natural Resource Rents 0.01 0.01* -0.01*** -0.03*
(0.01) (0.01) (0.00) (0.02)
Regime Type (FH) 0.08 0.02 0.08*** 0.27+
(0.11) (0.04) (0.02) (0.16)
Nonstate Conflict 0.70 -0.16 -0.26*** -2.52**
(0.60) (0.15) (0.06) (0.83)
Conflict Intensity 0.71*** 0.02 0.01 -0.64
(0.18) (0.17) (0.07) (0.50)
GDP / PC (log) -0.68*** -0.15 0.02 -0.12
(0.13) (0.10) (0.02) (0.24)
Population (log) -0.28*** 0.11 0.03* 0.11
(0.07) (0.07) (0.01) (0.21)
Num. obs. 142 142 141 142
Adj. R2 0.62 0.98 0.50 0.18
L.R. 144.69 597.46 106.55 37.05
p < 0.001, p < 0.01, p < 0.05, +p < 0.1

Figure C.2: The Relationship between Foreign Aid and Aid (Instrumented) in the Election Sample

# Libraries
library(tidyverse)

# Load elections data
load("./data/nelda_ps.rda")

# load instrument data for aid
load(file = "./data/instrumentedAid2.RData")

nelda_ivreg <- left_join(nelda_ps, instrument_df,
                         by = c("year", "iso2c"))

nelda_ivreg$total_sum_except <- as.numeric(nelda_ivreg$total_sum_except)

nelda_ivreg$instr_aid_gdp <- log(nelda_ivreg$total_sum_except / nelda_ivreg$GDP)

nelda_ivreg$date <- NULL
nelda_ivreg$StartDate2 <- NULL
nelda_ivreg$yearmon.x <- NULL
nelda_ivreg$yearmon.y <- NULL
nelda_ivreg[nelda_ivreg == ""] <- NA

# write to Stata file, so we can compute F statistics later
foreign::write.dta(nelda_ivreg, file = "./data/ivelections.dta", 
          version = 10)

# plot relationship between instrument and aid
plot_instrument <- ggplot(nelda_ivreg, aes(x = log(total_sum_except),
                                           y = log(aiddata_Aid))) +
  geom_point(alpha = 0.7, size = 3) + 
  geom_smooth(method = "lm") +
  theme_bw() + 
  labs(x = "Aid (instrumented) Log",
       y = "Aid (AidData) Log ")


# Output
library(tikzDevice)
# options( tikzDocumentDeclaration = "\\documentclass[10pt]{article}" )
# tikz("../figures/aid_instr_elections.tex", height = 4)
# print(plot_instrument)
# dev.off()

print(plot_instrument)

LS0tDQp0aXRsZTogIkFwcGVuZGl4OiBDaGFwdGVyIDYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQotLS0NCg0KDQoNCiMgVGFibGUgQy4xOiBSb2J1c3RuZXNzIGNoZWNrczogSW5kaXZpZHVhbCBFZmZlY3Qgb2YgUG93ZXItU2hhcmluZw0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpIA0KDQojIE1vZGVscw0KbW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc19xdWFsaXR5X2NhYmluYyA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3JpbmMgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuaW9ySU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3F1YWxpdHlfc2VuaW9yaW5jIDwtIHJvYmNvdihtb2RlbF9wc19xdWFsaXR5X3NlbmlvcmluYywgbmVsZGFfcHMkY291bnRyeSkNCg0KDQptb2RlbF9wc19xdWFsaXR5X25vbnNlbmlvcmluYyA8LSBvbHMocXVhbGl0eSB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3JpbmMgPC0gcm9iY292KG1vZGVsX3BzX3F1YWxpdHlfbm9uc2VuaW9yaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmluYyA8LSBvbHModjJ4ZWxfZnJlZmFpciB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiaW5jIDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmluYywgbmVsZGFfcHMkY291bnRyeSkNCg0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmluYyA8LSBvbHModjJ4ZWxfZnJlZmFpciB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9zZW5pb3JpbmMgPC0gcm9iY292KG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfc2VuaW9yaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yaW5jIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvcklOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmluYyA8LSByb2Jjb3YobW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9ub25zZW5pb3JpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBPdXRwdXQNCm1vZGVsX2xpc3RfcHNfaW5kcm9iIDwtIGxpc3QobW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc19xdWFsaXR5X3NlbmlvcmluYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3JpbmMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9zZW5pb3JpbmMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmluYykNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICMgc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAoc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgPSAiU2VuaW9yIFBvd2VyLVNoYXJpbmcgKGJpbmFyeSkiLA0KICAgICAgICAgICAgICAgICAjIG5vbnNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9ySU5DLjEyID0gIk5vbnNlbmlvciBQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgIyBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAjIHByb2dyYW1fYWlkX2dkcF9udWxsPSAiUHJvZ3JhbSBBaWQgLyBHRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgIyBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCiMgDQojICMgT3V0cHV0IGZvciBNYW51c2NyaXB0DQojIHRleHJlZyhsID0gbW9kZWxfbGlzdF9wc19pbmRyb2IsIA0KIyAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZF9wc19pbmRlZmZfZWxlY3Rpb25zX3JvYi50ZXgiLCANCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBtb2RlbF9saXN0X3BzX2luZHJvYiwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCg0KIyBUYWJsZSBDLjI6ICBJbmRpdmlkdWFsIEVmZmVjdHMgKFYtRGVtIEVsZWN0aW9uIFF1YWxpdHkpDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRleHJlZykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKSANCg0KIyBNb2RlbHMNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50IDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQgPC0gcm9iY292KG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBNb2RlbHMgQWlkDQoNCm1vZGVsX2RnYV92MnhlbF9mcmVmYWlyIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGRnYV9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfZGdhX3YyeGVsX2ZyZWZhaXIgPC0gcm9iY292KG1vZGVsX2RnYV92MnhlbF9mcmVmYWlyLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIHByb2dyYW0gYWlkDQptb2RlbF9wcm9nX2FpZF92MnhlbF9mcmVmYWlyIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwcm9ncmFtX2FpZF9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciA8LSByb2Jjb3YobW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBidWRnZXQgYWlkDQptb2RlbF9idWRnZXRhaWRfdjJ4ZWxfZnJlZmFpciA8LSBvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhidWRnZXRfYWlkX2dkcF9udWxsICsgMSApKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9idWRnZXRhaWRfdjJ4ZWxfZnJlZmFpciA8LSByb2Jjb3YobW9kZWxfYnVkZ2V0YWlkX3YyeGVsX2ZyZWZhaXIsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBPdXRwdXQgDQojIGluZGl2aWR1YWwgZWZmZWN0cyBtb2RlbCBsaXN0DQppbmRfZWZmZWN0X21vZGVsc19hcHAgPC0gbGlzdChtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9kZ2FfdjJ4ZWxfZnJlZmFpciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYnVkZ2V0YWlkX3YyeGVsX2ZyZWZhaXIpDQoNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCg0KIyBPdXRwdXQgTWFudXNjcmlwdA0KIyB0ZXhyZWcobCA9IGluZF9lZmZlY3RfbW9kZWxzX2FwcCwgDQojICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KIyAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZF9wc19pbmRlZmZfZWxlY3Rpb25zX3ZkZW0udGV4IiwNCiMgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgIGNhcHRpb24gPSAiIiwgDQojICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIikNCg0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBpbmRfZWZmZWN0X21vZGVsc19hcHAsIA0KICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiKQ0KDQpgYGANCg0KIyBUYWJsZSBDLjM6IE91dGxpZXIgQW5hbHlzaXMNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikgDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9vdXRsaWVyX2FuYWx5c2lzLlIiKQ0KDQoNCiMgZGVmaW5lIHNlbGVjdHZhcnMgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGUgY3VzdG9tICdjaGVja19vdXRsaWVycygpJyANCiMgZnVuY3Rpb24gDQoNCnNlbGVjdHZhcnMgPSBjKCJlbGVjdGlvbmlkIiwgImNvdW50cnkiLCAieWVhciIsICJpZGVudGlmaWVycyIpDQoNCm91dGxpZXJmaXRfbmVsZGEgPC0gbG0ocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCg0KDQpvdXRsaWVyZml0X3ZkZW0gPC0gbG0odjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KDQoNCm91dGxpZXJzX2VsZWN0aW9uX25lbGRhIDwtIGNoZWNrX291dGxpZXIob3V0bGllcmZpdF9uZWxkYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0dmFycyA9IHNlbGVjdHZhcnMpDQpvdXRsaWVyc19lbGVjdGlvbl92ZGVtIDwtIGNoZWNrX291dGxpZXIob3V0bGllcmZpdF92ZGVtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdHZhcnMgPSBzZWxlY3R2YXJzKQ0KDQojIyBPdXRwdXQNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdCggY2FiaW5ldElOQy4xMiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRJTkMuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF9udWxsID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9haWRfZ2RwX251bGw9ICJQcm9ncmFtIEFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCg0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCg0KDQojICMgT3V0cHV0IE1hdWNzcmlwdA0KIyBjdXN0b21fdGV4cmVnKGwgPSBsaXN0KG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1syXV0sDQojICAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl9uZWxkYVtbNF1dLCANCiMgICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1s2XV0sIA0KIyAgICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fdmRlbVtbMl1dLCANCiMgICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX3ZkZW1bWzRdXSwgDQojICAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl92ZGVtW1s2XV0pLA0KIyAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfZWxlY3Rpb25zX291dGxpZXJyb2J1c3QudGV4IiwNCiMgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsIA0KIyAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezN9e2N9e1xcdGV4dGJme05FTERBIEVsZWN0aW9uIFF1YWxpdHl9fSAmIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXG11bHRpY29sdW1uezN9e2N9e1xcdGV4dGJme1YtRGVtIENsZWFuIEVsZWN0aW9ucyBJbmRleH19IFxcXFwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcY21pZHJ1bGUocil7Mi00fSBcXGNtaWRydWxlKHIpezUtN30gDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgSGF0IFZhbHVlcyB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICBDb29rJ3MgRGlzdGFuY2V9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICBERkJFVEF9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDQpICBIYXQgVmFsdWVzfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg1KSAgQ29vaydzIERpc3RhbmNlfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg2KSAgREZCRVRBfSIpLA0KIyAgICAgICAgICAgYm9va3RhYnMgPSBULA0KIyAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQojICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQojICAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBsaXN0KG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1syXV0sDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fbmVsZGFbWzRdXSwgDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fbmVsZGFbWzZdXSwgDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fdmRlbVtbMl1dLCANCiAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl92ZGVtW1s0XV0sIA0KICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX3ZkZW1bWzZdXSksDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCmBgYA0KDQoNCiMgVGFibGUgQy40IGFuZCBGaWd1cmUgQy4xOiBNYXRjaGluZyBEaWFnbm9zdGljcw0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQpsaWJyYXJ5KE1hdGNoSXQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoeHRhYmxlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRleHJlZykNCg0KDQojIENyZWF0ZSBtYXRjaGVkIGRhdGEgc2V0IGZvciBlbGVjdGlvbnMNCg0KIyBGaXJzdDogY3JlYXRlIHZhbHVlcyBmb3IgbWF0Y2hpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBwb3N0LWNvbmZsaWN0IHBlcmlvZC4gVGhpcw0KIyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgY3JlYXRpbmcgcHJlLXRyZWF0bWVudCAob3IgYXBwcm94aW1hdGlvbiB0byBwcmUtdHJlYXRtZW50KSANCiMgdmFsdWVzIG9mIHRoZSBjb3ZhcmlhdGVzDQoNCm5lbGRhX3BzX21hdGNoaW5nIDwtIG5lbGRhX3BzICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgYXJyYW5nZShjb3VudHJ5LCB5ZWFyKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHBjX3BlcmlvZCkgJT4lIA0KICBtdXRhdGUobWF0Y2h5ZWFyID0gZmlyc3QoeWVhcikpICU+JQ0KICBtdXRhdGUobWF0Y2hfbmF0cmVzID0gZmlyc3QoV0JuYXRyZXMpLA0KICAgICAgICAgbWF0Y2hfYWlkZGF0YV9BaWRHRFAgPSBmaXJzdChhaWRkYXRhX0FpZEdEUCksDQogICAgICAgICBtYXRjaF9wb3AgPSBmaXJzdChwb3B1bGF0aW9uKSwNCiAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zID0gZmlyc3QoY29uZl9pbnRlbnMpLA0KICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgPSBmaXJzdChub25zdGF0ZSksDQogICAgICAgICBtYXRjaF9maCA9IGZpcnN0KGZoKSwNCiAgICAgICAgIG1hdGNoX25lbGRhNDUgPSBmaXJzdChuZWxkYTQ1KSwNCiAgICAgICAgIG1hdGNoX2dkcF9wZXJfY2FwaXRhX3VuID0gZmlyc3QoZ2RwX3Blcl9jYXBpdGFfdW4pKSANCg0KIyBhZGQgYWRkaXRpb25hbCByZWJlbCBwYXJpdHkgdmFyaWFibGUgYXMgcHJlZGljdG9yDQojIHBhcml0eV90b19qb2luX25lbGRhIDwtIHBzZWRfYWdfeSAlPiUgDQojICAgZHBseXI6OnNlbGVjdChpc28zYywgcGNfcGVyaW9kLCBtaW55ZWFyLCBwYXJpdHkpICU+JSANCiMgICBncm91cF9ieShpc28zYywgcGNfcGVyaW9kKSAlPiUgIA0KIyAgIGRwbHlyOjpzdW1tYXJpc2UocGFyaXR5ID0gdW5pcXVlKHBhcml0eSkpDQojIA0KIyBuZWxkYV9wc19tYXRjaGluZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHNfbWF0Y2hpbmcsIHBhcml0eV90b19qb2luX25lbGRhKQ0KICANCm1hdGNoX2RhdGFfZWxlY3Rpb25zIDwtIG5lbGRhX3BzX21hdGNoaW5nICU+JSANCiAgZHBseXI6OnNlbGVjdChjYWJpbmV0SU5DLjEyLCANCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUCwgDQogICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4sIA0KICAgICAgICAgICAgICAgIHllYXIsIA0KICAgICAgICAgICAgICAgIGNvdW50cnksDQogICAgICAgICAgICAgICAgc2VuaW9ySU5DLjEyLCANCiAgICAgICAgICAgICAgICBub25zZW5pb3JJTkMuMTIsIA0KICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyLCANCiAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVC4xMiwNCiAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIsIA0KICAgICAgICAgICAgICAgIHBvcHVsYXRpb24sIGNvbmZfaW50ZW5zLCBub25zdGF0ZSwgV0JuYXRyZXMsIGZoLCBuZWxkYTQ1LA0KICAgICAgICAgICAgICAgIHF1YWxpdHksIHYyeGVsX2ZyZWZhaXIsIGVsZWN0aW9uaWQsIA0KICAgICAgICAgICAgICAgIGlzbzJjLCBhaWRkYXRhX0FpZCwgR0RQLA0KICAgICAgICAgICAgICAgIG1hdGNoX25hdHJlcywgbWF0Y2hfYWlkZGF0YV9BaWRHRFAsIG1hdGNoX3BvcCwgbWF0Y2hfY29uZl9pbnRlbnMsDQogICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUsIG1hdGNoX2ZoLCBtYXRjaF9uZWxkYTQ1LCBtYXRjaF9nZHBfcGVyX2NhcGl0YV91bikNCg0KDQoNCm1hdGNoX2RhdGFfZWxlY3Rpb25zIDwtIG1hdGNoX2RhdGFfZWxlY3Rpb25zW2NvbXBsZXRlLmNhc2VzKG1hdGNoX2RhdGFfZWxlY3Rpb25zKSwgXQ0KbWF0Y2hfZGF0YV9lbGVjdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShtYXRjaF9kYXRhX2VsZWN0aW9ucykNCg0KDQojIE1hdGNoaW5nIE1haGFsYW5vYmlzDQoNCiNJIG1hdGNoIG9ubHkgb24gcG9zdC1jb25mbGljdCBjb250cm9scyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYyBwZXJpb2QNCg0KbWF0Y2hfZGF0YV9lbGVjdGlvbnMgPC0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMgJT4lIA0KICBhcnJhbmdlKGNvdW50cnksIHBjX3BlcmlvZCwgeWVhcikNCg0Kc2V0LnNlZWQoMTIzNCkNCg0KbWF0Y2hfcmVzIDwtIG1hdGNoaXQoY2FiaW5ldElOQy4xMiB+IA0KICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfYWlkZGF0YV9BaWRHRFApICsgDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX25hdHJlcyArIDEpICArIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9ub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2ZoICwgDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5lYXJlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSAyLA0KICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiKQ0KDQptYXRjaF9kZl9lbGVjX3JlZyA8LSBtYXRjaC5kYXRhKG1hdGNoX3JlcykNCg0KDQojIEltYmFsYW5jZSBSZWR1Y3Rpb24gVGFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBUaGlzIHNlY3Rpb24gY3JlYXRlcyB0aGUgbWF0Y2hpbmcgZGlhZ25vc3RpY3M6IEZpcnN0IHRoZSBpbWJhbGFuY2UgcmVkdWN0aW9uIGFzDQojIHRhYmxlcyBpbmNsdWRpbmcgdGhlIHQtdGVzdCBhbmQgSy1TIHRlc3QgZm9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0cmVhdGVkDQojIGFuZCBjb250cm9sLiBBbmQgYWxzbyBhIGJhbGFuY2UgaW1wcm92bWVudCBwbG90LiANCg0KIyBGaXJzdDogdGhlIGltYmFsYW5jZSByZWR1Y3Rpb24gdGFibGVzIGJlZm9yZSBhbmQgYWZ0ZXIgbWF0Y2hpbmcuDQoNCmxpYnJhcnkoZWJhbCkNCmxpYnJhcnkoTWF0Y2hpbmcpDQoNCiMgYmVmb3JlIG1hdGNoaW5nDQoNCmltYl9iZWZvcmUgPC0gTWF0Y2hCYWxhbmNlKGNhYmluZXRJTkMuMTIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2FpZGRhdGFfQWlkR0RQKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9wb3ApICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9uYXRyZXMgKyAxKSAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gVCwgcHJpbnQubGV2ZWwgPSAwKSAjIGRhdGEgYmVmb3JlIG1hdGNoaW5nDQoNCiMgbm90ZSB0aGF0IG9yZGVyIG9mIGNvdmFyaWF0ZXMgaW4gTWF0Y2hCYWxhbmNlIGlzIGltcG9ydGFudCB0byBnZXQgcm93IG5hbWVzIHJpZ2h0DQppbWJhbGFuY2VfdGFiX2JlZm9yZSA8LSBiYWx0ZXN0LmNvbGxlY3QoaW1iX2JlZm9yZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQWlkIC8gR0RQIChsb2cpIiwgIkdEUCAvIFBDIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaW1lIFR5cGUgKEZIKSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IEYpDQojIGRvIG5vdCByZXBvcnQgYWxsIHN0YXRpc3RpY3MNCmltYmFsYW5jZV90YWJfYmVmb3JlIDwtIGltYmFsYW5jZV90YWJfYmVmb3JlWywgYygibWVhbi5UciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWFuLkNvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQgcHZhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUyBwdmFsIildDQoNCmNvbG5hbWVzKGltYmFsYW5jZV90YWJfYmVmb3JlKSA8LSAgYygiTWVhbiBUcmVhdGVkIiwgIk1lYW4gQ29udHJvbCIsICJQLVZhbHVlIFQtVGVzdCIsICJQLVZhbHVlIEstUyBUZXN0IikNCg0KIyBBZnRlciBNYXRjaGluZw0KDQppbWJfYWZ0ZXIgPC0gTWF0Y2hCYWxhbmNlKGNhYmluZXRJTkMuMTIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2FpZGRhdGFfQWlkR0RQKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9wb3ApICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9uYXRyZXMgKyAxKSAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gVCwgcHJpbnQubGV2ZWwgPSAwKSAjIGRhdGEgYmVmb3JlIG1hdGNoaW5nDQoNCiMgbm90ZSB0aGF0IG9yZGVyIG9mIGNvdmFyaWF0ZXMgaW4gTWF0Y2hCYWxhbmNlIGlzIGltcG9ydGFudCB0byBnZXQgcm93IG5hbWVzIHJpZ2h0DQppbWJhbGFuY2VfdGFiX2FmdGVyPC0gYmFsdGVzdC5jb2xsZWN0KGltYl9hZnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2ltZSBUeXBlIChGSCkiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gRikNCmltYmFsYW5jZV90YWJfYWZ0ZXIgPC0gaW1iYWxhbmNlX3RhYl9hZnRlclssIGMoIm1lYW4uVHIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW4uQ28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQgcHZhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS1MgcHZhbCIpXQ0KDQpjb2xuYW1lcyhpbWJhbGFuY2VfdGFiX2FmdGVyKSA8LSBjKCJNZWFuIFRyZWF0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lYW4gQ29udHJvbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1WYWx1ZSBULVRlc3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgSy1TIFRlc3QiKQ0KDQojIG91dHB1dCBpbWJhbGFuY2UgdGFibGVzDQpwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAibGF0ZXgiLCBmbG9hdGluZyA9IEYsDQogICAgICBmaWxlID0gIi4uL291dHB1dC9tYXRjaGluZ19pbWJhbGFuY2VfcmVkdWN0aW9uX2VsZWN0aW9uc19iZWZvcmUudGV4IikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImxhdGV4IiwgZmxvYXRpbmcgPSBGLA0KICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvbWF0Y2hpbmdfaW1iYWxhbmNlX3JlZHVjdGlvbl9lbGVjdGlvbnNfYWZ0ZXIudGV4IikNCg0KDQpwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAiaHRtbCIsIGZsb2F0aW5nID0gRikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImh0bWwiLCBmbG9hdGluZyA9IEYpDQoNCg0KIyBpbWJhbGFuY2UgcmVkdWN0aW9uIHBsb3QsIHNlZSBodHRwOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzI5NDM2NzAvDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQpiYWxhbmNlX2ltcHJvdmVtZW50IDwtIHN1bW1hcnkobWF0Y2hfcmVzKSRyZWR1Y3Rpb24NCnJvdy5uYW1lcyhiYWxhbmNlX2ltcHJvdmVtZW50KSA8LSBjKCJBaWQgLyBHRFAgKGxvZykiLCAiR0RQIC8gUEMgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLCAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXR1cmFsIFJlc291cmNlIFJlbnRzIChsb2cpIiwgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIikNCg0KYmFsYW5jZV9pbXByb3ZlbWVudCA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cubmFtZXMoYmFsYW5jZV9pbXByb3ZlbWVudCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfYmFsYW5jZV9pbXByb3ZlbWVudCA9IHJvdW5kKGJhbGFuY2VfaW1wcm92ZW1lbnRbLCAxXSwgMikpDQoNCg0KcGxvdF9iYWxhbmNlaW1wciA8LSBkYXRhLmZyYW1lKGBBbGwgRGF0YWAgPSBhYnMoc3VtbWFyeShtYXRjaF9yZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSA9IFQpJHN1bS5hbGwkYFN0ZC4gTWVhbiBEaWZmLmApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTWF0Y2hlZCBEYXRhYCA9IGFicyhzdW1tYXJ5KG1hdGNoX3JlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSA9IFQpJHN1bS5tYXRjaGVkJGBTdGQuIE1lYW4gRGlmZi5gKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBiYWxhbmNlX2ltcHJvdmVtZW50JHZhcmlhYmxlKSAlPiUgDQogIGdhdGhlcihrZXksIHZhbHVlLCAtY292KSAlPiUgDQogIGZpbHRlcighaXMubmFuKHZhbHVlKSAmICFpcy5pbmZpbml0ZSh2YWx1ZSkpICU+JSANCiAgbXV0YXRlKGtleSA9IGdzdWIoIlxcLiIsICIgIiwga2V5KSkNCg0KDQpwbG90X2JhbGFuY2VpbXByX291dCA8LSBwbG90X2JhbGFuY2VpbXByICU+JSANCiAgZ2dwbG90KC4sIGFlcyh4ID0ga2V5LCB5ID0gdmFsdWUpKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAyLjUpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb3YpLA0KICAgICAgICAgICAgbGluZW1pdHJlID0gMiwgc2l6ZSA9IDAuNikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yNSwgYWVzKGdyb3VwID0ga2V5KSkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBwbG90X2JhbGFuY2VpbXByICU+JSBmaWx0ZXIoa2V5ID09ICJBbGwgRGF0YSIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IGNvdiksDQogICAgICAgICAgICAgICAgICAgbnVkZ2VfeCA9IC0uNCwNCiAgICAgICAgICAgICAgICAgICBudWRnZV95ID0gLS4xKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICJBYnNvbHV0ZSBTdGFuZGFyZGl6ZWQgRGlmZmVyZW5jZSBpbiBNZWFucyIpDQoNCnByaW50KHBsb3RfYmFsYW5jZWltcHJfb3V0KQ0KDQpgYGANCg0KIyBUYWJsZSBDLjU6ICBGaXJzdCBTdGFnZSBhbmQgUmVkdWNlZCBGb3JtIFJlZ3Jlc3Npb25zIGZvciBJbnN0cnVtZW50YWwgVmFyaWFibGUgQW5hbHlzaXMNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0ZXhyZWcpDQoNCg0KIyBMb2FkIGVsZWN0aW9ucyBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBsb2FkIGluc3RydW1lbnQgZGF0YSBmb3IgYWlkDQpsb2FkKGZpbGUgPSAiLi9kYXRhL2luc3RydW1lbnRlZEFpZDIuUkRhdGEiKQ0KDQpuZWxkYV9pdnJlZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHMsIGluc3RydW1lbnRfZGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJ5ZWFyIiwgImlzbzJjIikpDQoNCm5lbGRhX2l2cmVnJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0KQ0KDQpuZWxkYV9pdnJlZyRpbnN0cl9haWRfZ2RwIDwtIGxvZyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IC8gbmVsZGFfaXZyZWckR0RQKQ0KDQpuZWxkYV9pdnJlZyRkYXRlIDwtIE5VTEwNCm5lbGRhX2l2cmVnJFN0YXJ0RGF0ZTIgPC0gTlVMTA0KbmVsZGFfaXZyZWckeWVhcm1vbi54IDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueSA8LSBOVUxMDQpuZWxkYV9pdnJlZ1tuZWxkYV9pdnJlZyA9PSAiIl0gPC0gTkENCg0KDQoNCiMgZmlyc3Qgc3RhZ2UgYW5kIHJlZHVjZWQgZm9ybSBtb2RlbHMNCg0KZmlyc3RzdGFnZSA8LSBvbHMobG9nKGFpZGRhdGFfQWlkIC8gR0RQKSAgfiANCiAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgaW5zdHJfYWlkX2dkcCAgKyANCiAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCg0KZmlyc3RzdGFnZSA8LSByb2Jjb3YoZmlyc3RzdGFnZSwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KZmlyc3RzdGFnZV9pbnRlciA8LSBvbHMobG9nKGFpZGRhdGFfQWlkIC8gR0RQKSAqIGNhYmluZXRDT1VOVC4xMiAgfiANCiAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICogaW5zdHJfYWlkX2dkcCAgKyANCiAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCg0KZmlyc3RzdGFnZV9pbnRlciA8LSByb2Jjb3YoZmlyc3RzdGFnZV9pbnRlciwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KcmVkdWNlZF9mb3JtIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4NCiAgICAgICAgICAgICAgICAgICAgaW5zdHJfYWlkX2dkcCAqDQogICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX2l2cmVnLCB4ID0gVCwgeSA9IFQpDQpyZWR1Y2VkX2Zvcm0gPC0gcm9iY292KHJlZHVjZWRfZm9ybSwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KDQpyZWR1Y2VkX2Zvcm1fbmVsZGEgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgIGluc3RyX2FpZF9nZHAgKg0KICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCnJlZHVjZWRfZm9ybV9uZWxkYSA8LSByb2Jjb3YocmVkdWNlZF9mb3JtX25lbGRhLCBuZWxkYV9pdnJlZyRjb3VudHJ5KQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCg0KIyBjdXN0b21fdGV4cmVnKGwgPSBsaXN0KGZpcnN0c3RhZ2UsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0c3RhZ2VfaW50ZXIsDQojICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtLCByZWR1Y2VkX2Zvcm1fbmVsZGEpLA0KIyAgICAgICAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2l2X2VsZWN0aW9uc19maXJzdHN0YWdlX3JlZHVjZWQudGV4IiwNCiMgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntGaXJzdCBTdGFnZX19ICYNCiMgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntSZWR1Y2VkIEZvcm19fSAgIFxcXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGNtaWRydWxlKHIpezItM30gXFxjbWlkcnVsZShyKXs0LTV9DQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsgKDEpIERWOiBBaWQgLyBHRFAgKGxvZyl9IiwNCiMgIlxcbXVsdGljb2x1bW57MX17Y317ICgyKSBEVjogQWlkIC9HRFAgKiBQLVN9IiwNCiMgIlxcbXVsdGljb2x1bW57MX17Y317ICgzKSBWLURlbSBDRUkpIH0iLA0KIyAiXFxtdWx0aWNvbHVtbnsxfXtjfXsgKDQpIE5FTERBKX0iKSwNCiMgICAgICAgICAgICAgICBjdXN0b20uY29lZi5uYW1lcyA9IGMoIkludGVyY2VwdCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgIC8gR0RQIChsb2cpIC0gSW5zdHJ1bWVudGVkICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiKSwNCiMgICAgICAgICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCksDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVFJVRSwNCiMgICAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICB0YWJsZSA9IEZBTFNFLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFRSVUUsDQojICAgICAgICAgICAgICAgY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVFJVRSwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYpDQoNCmh0bWxyZWcobCA9IGxpc3QoZmlyc3RzdGFnZSwgZmlyc3RzdGFnZV9pbnRlciwgDQogICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtLCByZWR1Y2VkX2Zvcm1fbmVsZGEpLA0KICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KICANCiAgICAgICBjdXN0b20uY29lZi5uYW1lcyA9IGMoIkludGVyY2VwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAvIEdEUCAobG9nKSAtIEluc3RydW1lbnRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXR1cmFsIFJlc291cmNlIFJlbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgIC8gR0RQIChsb2cpIC0gSW5zdHJ1bWVudGVkICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiKSwNCiAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCksDQogICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgIGJvb2t0YWJzID0gVFJVRSwNCiAgICAgICBjZW50ZXIgPSBUUlVFLA0KICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICBjYXB0aW9uID0gIiIsDQogICAgICAgdGFibGUgPSBGQUxTRSwgDQogICAgICAgY3VzdG9tLm11bHRpY29sID0gVFJVRSwNCiAgICAgICBjb2x1bW4gPSBULA0KICAgICAgIGRjb2x1bW4gPSBUUlVFLA0KICAgICAgIHVzZS5wYWNrYWdlcyA9IEYpDQoNCg0KYGBgDQoNCiMgRmlndXJlIEMuMjogVGhlIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEZvcmVpZ24gQWlkIGFuZCBBaWQgKEluc3RydW1lbnRlZCkgaW4gdGhlIEVsZWN0aW9uIFNhbXBsZQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZGV2ID0gIkNhaXJvUE5HIn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBMb2FkIGVsZWN0aW9ucyBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBsb2FkIGluc3RydW1lbnQgZGF0YSBmb3IgYWlkDQpsb2FkKGZpbGUgPSAiLi9kYXRhL2luc3RydW1lbnRlZEFpZDIuUkRhdGEiKQ0KDQpuZWxkYV9pdnJlZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHMsIGluc3RydW1lbnRfZGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJ5ZWFyIiwgImlzbzJjIikpDQoNCm5lbGRhX2l2cmVnJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0KQ0KDQpuZWxkYV9pdnJlZyRpbnN0cl9haWRfZ2RwIDwtIGxvZyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IC8gbmVsZGFfaXZyZWckR0RQKQ0KDQpuZWxkYV9pdnJlZyRkYXRlIDwtIE5VTEwNCm5lbGRhX2l2cmVnJFN0YXJ0RGF0ZTIgPC0gTlVMTA0KbmVsZGFfaXZyZWckeWVhcm1vbi54IDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueSA8LSBOVUxMDQpuZWxkYV9pdnJlZ1tuZWxkYV9pdnJlZyA9PSAiIl0gPC0gTkENCg0KIyB3cml0ZSB0byBTdGF0YSBmaWxlLCBzbyB3ZSBjYW4gY29tcHV0ZSBGIHN0YXRpc3RpY3MgbGF0ZXINCmZvcmVpZ246OndyaXRlLmR0YShuZWxkYV9pdnJlZywgZmlsZSA9ICIuL2RhdGEvaXZlbGVjdGlvbnMuZHRhIiwgDQogICAgICAgICAgdmVyc2lvbiA9IDEwKQ0KDQojIHBsb3QgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5zdHJ1bWVudCBhbmQgYWlkDQpwbG90X2luc3RydW1lbnQgPC0gZ2dwbG90KG5lbGRhX2l2cmVnLCBhZXMoeCA9IGxvZyh0b3RhbF9zdW1fZXhjZXB0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nKGFpZGRhdGFfQWlkKSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgdGhlbWVfYncoKSArIA0KICBsYWJzKHggPSAiQWlkIChpbnN0cnVtZW50ZWQpIExvZyIsDQogICAgICAgeSA9ICJBaWQgKEFpZERhdGEpIExvZyAiKQ0KDQoNCiMgT3V0cHV0DQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMHB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9pbnN0cl9lbGVjdGlvbnMudGV4IiwgaGVpZ2h0ID0gNCkNCiMgcHJpbnQocGxvdF9pbnN0cnVtZW50KQ0KIyBkZXYub2ZmKCkNCg0KcHJpbnQocGxvdF9pbnN0cnVtZW50KQ0KDQoNCg0KDQoNCmBgYA0K