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
|
LS0tDQp0aXRsZTogIkFwcGVuZGl4OiBDaGFwdGVyIDYiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQotLS0NCg0KDQoNCiMgVGFibGUgQy4xOiBSb2J1c3RuZXNzIGNoZWNrczogSW5kaXZpZHVhbCBFZmZlY3Qgb2YgUG93ZXItU2hhcmluZw0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpIA0KDQojIE1vZGVscw0KbW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc19xdWFsaXR5X2NhYmluYyA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3JpbmMgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuaW9ySU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3F1YWxpdHlfc2VuaW9yaW5jIDwtIHJvYmNvdihtb2RlbF9wc19xdWFsaXR5X3NlbmlvcmluYywgbmVsZGFfcHMkY291bnRyeSkNCg0KDQptb2RlbF9wc19xdWFsaXR5X25vbnNlbmlvcmluYyA8LSBvbHMocXVhbGl0eSB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3JpbmMgPC0gcm9iY292KG1vZGVsX3BzX3F1YWxpdHlfbm9uc2VuaW9yaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmluYyA8LSBvbHModjJ4ZWxfZnJlZmFpciB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiaW5jIDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmluYywgbmVsZGFfcHMkY291bnRyeSkNCg0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmluYyA8LSBvbHModjJ4ZWxfZnJlZmFpciB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9zZW5pb3JpbmMgPC0gcm9iY292KG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfc2VuaW9yaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yaW5jIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvcklOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmluYyA8LSByb2Jjb3YobW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9ub25zZW5pb3JpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBPdXRwdXQNCm1vZGVsX2xpc3RfcHNfaW5kcm9iIDwtIGxpc3QobW9kZWxfcHNfcXVhbGl0eV9jYWJpbmMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc19xdWFsaXR5X3NlbmlvcmluYywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3JpbmMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHNfdjJ4ZWxfZnJlZmFpcl9zZW5pb3JpbmMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmluYykNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICMgc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAoc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgPSAiU2VuaW9yIFBvd2VyLVNoYXJpbmcgKGJpbmFyeSkiLA0KICAgICAgICAgICAgICAgICAjIG5vbnNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9ySU5DLjEyID0gIk5vbnNlbmlvciBQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgIyBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAjIHByb2dyYW1fYWlkX2dkcF9udWxsPSAiUHJvZ3JhbSBBaWQgLyBHRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgIyBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCiMgDQojICMgT3V0cHV0IGZvciBNYW51c2NyaXB0DQojIHRleHJlZyhsID0gbW9kZWxfbGlzdF9wc19pbmRyb2IsIA0KIyAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZF9wc19pbmRlZmZfZWxlY3Rpb25zX3JvYi50ZXgiLCANCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBtb2RlbF9saXN0X3BzX2luZHJvYiwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCg0KIyBUYWJsZSBDLjI6ICBJbmRpdmlkdWFsIEVmZmVjdHMgKFYtRGVtIEVsZWN0aW9uIFF1YWxpdHkpDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRleHJlZykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKSANCg0KIyBNb2RlbHMNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50IDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50IDwtIHJvYmNvdihtb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQgPC0gcm9iY292KG1vZGVsX3BzX3YyeGVsX2ZyZWZhaXJfbm9uc2VuaW9yY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBNb2RlbHMgQWlkDQoNCm1vZGVsX2RnYV92MnhlbF9mcmVmYWlyIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGRnYV9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfZGdhX3YyeGVsX2ZyZWZhaXIgPC0gcm9iY292KG1vZGVsX2RnYV92MnhlbF9mcmVmYWlyLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIHByb2dyYW0gYWlkDQptb2RlbF9wcm9nX2FpZF92MnhlbF9mcmVmYWlyIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwcm9ncmFtX2FpZF9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciA8LSByb2Jjb3YobW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBidWRnZXQgYWlkDQptb2RlbF9idWRnZXRhaWRfdjJ4ZWxfZnJlZmFpciA8LSBvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhidWRnZXRfYWlkX2dkcF9udWxsICsgMSApKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9idWRnZXRhaWRfdjJ4ZWxfZnJlZmFpciA8LSByb2Jjb3YobW9kZWxfYnVkZ2V0YWlkX3YyeGVsX2ZyZWZhaXIsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KIyBPdXRwdXQgDQojIGluZGl2aWR1YWwgZWZmZWN0cyBtb2RlbCBsaXN0DQppbmRfZWZmZWN0X21vZGVsc19hcHAgPC0gbGlzdChtb2RlbF9wc192MnhlbF9mcmVmYWlyX2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX3NlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhlbF9mcmVmYWlyX25vbnNlbmlvcmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9kZ2FfdjJ4ZWxfZnJlZmFpciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJvZ19haWRfdjJ4ZWxfZnJlZmFpciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYnVkZ2V0YWlkX3YyeGVsX2ZyZWZhaXIpDQoNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCg0KIyBPdXRwdXQgTWFudXNjcmlwdA0KIyB0ZXhyZWcobCA9IGluZF9lZmZlY3RfbW9kZWxzX2FwcCwgDQojICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KIyAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZF9wc19pbmRlZmZfZWxlY3Rpb25zX3ZkZW0udGV4IiwNCiMgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgIGNhcHRpb24gPSAiIiwgDQojICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIikNCg0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBpbmRfZWZmZWN0X21vZGVsc19hcHAsIA0KICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiKQ0KDQpgYGANCg0KIyBUYWJsZSBDLjM6IE91dGxpZXIgQW5hbHlzaXMNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikgDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9vdXRsaWVyX2FuYWx5c2lzLlIiKQ0KDQoNCiMgZGVmaW5lIHNlbGVjdHZhcnMgd2hpY2ggaXMgbmVjZXNzYXJ5IGZvciB0aGUgY3VzdG9tICdjaGVja19vdXRsaWVycygpJyANCiMgZnVuY3Rpb24gDQoNCnNlbGVjdHZhcnMgPSBjKCJlbGVjdGlvbmlkIiwgImNvdW50cnkiLCAieWVhciIsICJpZGVudGlmaWVycyIpDQoNCm91dGxpZXJmaXRfbmVsZGEgPC0gbG0ocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCg0KDQpvdXRsaWVyZml0X3ZkZW0gPC0gbG0odjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICMgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KDQoNCm91dGxpZXJzX2VsZWN0aW9uX25lbGRhIDwtIGNoZWNrX291dGxpZXIob3V0bGllcmZpdF9uZWxkYSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0dmFycyA9IHNlbGVjdHZhcnMpDQpvdXRsaWVyc19lbGVjdGlvbl92ZGVtIDwtIGNoZWNrX291dGxpZXIob3V0bGllcmZpdF92ZGVtLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdHZhcnMgPSBzZWxlY3R2YXJzKQ0KDQojIyBPdXRwdXQNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdCggY2FiaW5ldElOQy4xMiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRJTkMuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF9udWxsID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9haWRfZ2RwX251bGw9ICJQcm9ncmFtIEFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCg0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCg0KDQojICMgT3V0cHV0IE1hdWNzcmlwdA0KIyBjdXN0b21fdGV4cmVnKGwgPSBsaXN0KG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1syXV0sDQojICAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl9uZWxkYVtbNF1dLCANCiMgICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1s2XV0sIA0KIyAgICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fdmRlbVtbMl1dLCANCiMgICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX3ZkZW1bWzRdXSwgDQojICAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl92ZGVtW1s2XV0pLA0KIyAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfZWxlY3Rpb25zX291dGxpZXJyb2J1c3QudGV4IiwNCiMgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsIA0KIyAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezN9e2N9e1xcdGV4dGJme05FTERBIEVsZWN0aW9uIFF1YWxpdHl9fSAmIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXG11bHRpY29sdW1uezN9e2N9e1xcdGV4dGJme1YtRGVtIENsZWFuIEVsZWN0aW9ucyBJbmRleH19IFxcXFwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcY21pZHJ1bGUocil7Mi00fSBcXGNtaWRydWxlKHIpezUtN30gDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgSGF0IFZhbHVlcyB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICBDb29rJ3MgRGlzdGFuY2V9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICBERkJFVEF9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDQpICBIYXQgVmFsdWVzfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg1KSAgQ29vaydzIERpc3RhbmNlfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg2KSAgREZCRVRBfSIpLA0KIyAgICAgICAgICAgYm9va3RhYnMgPSBULA0KIyAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQojICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQojICAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKGwgPSBsaXN0KG91dGxpZXJzX2VsZWN0aW9uX25lbGRhW1syXV0sDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fbmVsZGFbWzRdXSwgDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fbmVsZGFbWzZdXSwgDQogICAgICAgICAgICAgICAgICAgb3V0bGllcnNfZWxlY3Rpb25fdmRlbVtbMl1dLCANCiAgICAgICAgICAgICAgICAgICBvdXRsaWVyc19lbGVjdGlvbl92ZGVtW1s0XV0sIA0KICAgICAgICAgICAgICAgICAgIG91dGxpZXJzX2VsZWN0aW9uX3ZkZW1bWzZdXSksDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCmBgYA0KDQoNCiMgVGFibGUgQy40IGFuZCBGaWd1cmUgQy4xOiBNYXRjaGluZyBEaWFnbm9zdGljcw0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQpsaWJyYXJ5KE1hdGNoSXQpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoeHRhYmxlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRleHJlZykNCg0KDQojIENyZWF0ZSBtYXRjaGVkIGRhdGEgc2V0IGZvciBlbGVjdGlvbnMNCg0KIyBGaXJzdDogY3JlYXRlIHZhbHVlcyBmb3IgbWF0Y2hpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBwb3N0LWNvbmZsaWN0IHBlcmlvZC4gVGhpcw0KIyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgY3JlYXRpbmcgcHJlLXRyZWF0bWVudCAob3IgYXBwcm94aW1hdGlvbiB0byBwcmUtdHJlYXRtZW50KSANCiMgdmFsdWVzIG9mIHRoZSBjb3ZhcmlhdGVzDQoNCm5lbGRhX3BzX21hdGNoaW5nIDwtIG5lbGRhX3BzICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgYXJyYW5nZShjb3VudHJ5LCB5ZWFyKSAlPiUgDQogIGdyb3VwX2J5KGNvdW50cnksIHBjX3BlcmlvZCkgJT4lIA0KICBtdXRhdGUobWF0Y2h5ZWFyID0gZmlyc3QoeWVhcikpICU+JQ0KICBtdXRhdGUobWF0Y2hfbmF0cmVzID0gZmlyc3QoV0JuYXRyZXMpLA0KICAgICAgICAgbWF0Y2hfYWlkZGF0YV9BaWRHRFAgPSBmaXJzdChhaWRkYXRhX0FpZEdEUCksDQogICAgICAgICBtYXRjaF9wb3AgPSBmaXJzdChwb3B1bGF0aW9uKSwNCiAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zID0gZmlyc3QoY29uZl9pbnRlbnMpLA0KICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgPSBmaXJzdChub25zdGF0ZSksDQogICAgICAgICBtYXRjaF9maCA9IGZpcnN0KGZoKSwNCiAgICAgICAgIG1hdGNoX25lbGRhNDUgPSBmaXJzdChuZWxkYTQ1KSwNCiAgICAgICAgIG1hdGNoX2dkcF9wZXJfY2FwaXRhX3VuID0gZmlyc3QoZ2RwX3Blcl9jYXBpdGFfdW4pKSANCg0KIyBhZGQgYWRkaXRpb25hbCByZWJlbCBwYXJpdHkgdmFyaWFibGUgYXMgcHJlZGljdG9yDQojIHBhcml0eV90b19qb2luX25lbGRhIDwtIHBzZWRfYWdfeSAlPiUgDQojICAgZHBseXI6OnNlbGVjdChpc28zYywgcGNfcGVyaW9kLCBtaW55ZWFyLCBwYXJpdHkpICU+JSANCiMgICBncm91cF9ieShpc28zYywgcGNfcGVyaW9kKSAlPiUgIA0KIyAgIGRwbHlyOjpzdW1tYXJpc2UocGFyaXR5ID0gdW5pcXVlKHBhcml0eSkpDQojIA0KIyBuZWxkYV9wc19tYXRjaGluZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHNfbWF0Y2hpbmcsIHBhcml0eV90b19qb2luX25lbGRhKQ0KICANCm1hdGNoX2RhdGFfZWxlY3Rpb25zIDwtIG5lbGRhX3BzX21hdGNoaW5nICU+JSANCiAgZHBseXI6OnNlbGVjdChjYWJpbmV0SU5DLjEyLCANCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUCwgDQogICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4sIA0KICAgICAgICAgICAgICAgIHllYXIsIA0KICAgICAgICAgICAgICAgIGNvdW50cnksDQogICAgICAgICAgICAgICAgc2VuaW9ySU5DLjEyLCANCiAgICAgICAgICAgICAgICBub25zZW5pb3JJTkMuMTIsIA0KICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyLCANCiAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVC4xMiwNCiAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIsIA0KICAgICAgICAgICAgICAgIHBvcHVsYXRpb24sIGNvbmZfaW50ZW5zLCBub25zdGF0ZSwgV0JuYXRyZXMsIGZoLCBuZWxkYTQ1LA0KICAgICAgICAgICAgICAgIHF1YWxpdHksIHYyeGVsX2ZyZWZhaXIsIGVsZWN0aW9uaWQsIA0KICAgICAgICAgICAgICAgIGlzbzJjLCBhaWRkYXRhX0FpZCwgR0RQLA0KICAgICAgICAgICAgICAgIG1hdGNoX25hdHJlcywgbWF0Y2hfYWlkZGF0YV9BaWRHRFAsIG1hdGNoX3BvcCwgbWF0Y2hfY29uZl9pbnRlbnMsDQogICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUsIG1hdGNoX2ZoLCBtYXRjaF9uZWxkYTQ1LCBtYXRjaF9nZHBfcGVyX2NhcGl0YV91bikNCg0KDQoNCm1hdGNoX2RhdGFfZWxlY3Rpb25zIDwtIG1hdGNoX2RhdGFfZWxlY3Rpb25zW2NvbXBsZXRlLmNhc2VzKG1hdGNoX2RhdGFfZWxlY3Rpb25zKSwgXQ0KbWF0Y2hfZGF0YV9lbGVjdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShtYXRjaF9kYXRhX2VsZWN0aW9ucykNCg0KDQojIE1hdGNoaW5nIE1haGFsYW5vYmlzDQoNCiNJIG1hdGNoIG9ubHkgb24gcG9zdC1jb25mbGljdCBjb250cm9scyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYyBwZXJpb2QNCg0KbWF0Y2hfZGF0YV9lbGVjdGlvbnMgPC0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMgJT4lIA0KICBhcnJhbmdlKGNvdW50cnksIHBjX3BlcmlvZCwgeWVhcikNCg0Kc2V0LnNlZWQoMTIzNCkNCg0KbWF0Y2hfcmVzIDwtIG1hdGNoaXQoY2FiaW5ldElOQy4xMiB+IA0KICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfYWlkZGF0YV9BaWRHRFApICsgDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX25hdHJlcyArIDEpICArIA0KICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9ub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2ZoICwgDQogICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5lYXJlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSAyLA0KICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiKQ0KDQptYXRjaF9kZl9lbGVjX3JlZyA8LSBtYXRjaC5kYXRhKG1hdGNoX3JlcykNCg0KDQojIEltYmFsYW5jZSBSZWR1Y3Rpb24gVGFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBUaGlzIHNlY3Rpb24gY3JlYXRlcyB0aGUgbWF0Y2hpbmcgZGlhZ25vc3RpY3M6IEZpcnN0IHRoZSBpbWJhbGFuY2UgcmVkdWN0aW9uIGFzDQojIHRhYmxlcyBpbmNsdWRpbmcgdGhlIHQtdGVzdCBhbmQgSy1TIHRlc3QgZm9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0cmVhdGVkDQojIGFuZCBjb250cm9sLiBBbmQgYWxzbyBhIGJhbGFuY2UgaW1wcm92bWVudCBwbG90LiANCg0KIyBGaXJzdDogdGhlIGltYmFsYW5jZSByZWR1Y3Rpb24gdGFibGVzIGJlZm9yZSBhbmQgYWZ0ZXIgbWF0Y2hpbmcuDQoNCmxpYnJhcnkoZWJhbCkNCmxpYnJhcnkoTWF0Y2hpbmcpDQoNCiMgYmVmb3JlIG1hdGNoaW5nDQoNCmltYl9iZWZvcmUgPC0gTWF0Y2hCYWxhbmNlKGNhYmluZXRJTkMuMTIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2FpZGRhdGFfQWlkR0RQKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9wb3ApICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9uYXRyZXMgKyAxKSAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGF0YV9lbGVjdGlvbnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gVCwgcHJpbnQubGV2ZWwgPSAwKSAjIGRhdGEgYmVmb3JlIG1hdGNoaW5nDQoNCiMgbm90ZSB0aGF0IG9yZGVyIG9mIGNvdmFyaWF0ZXMgaW4gTWF0Y2hCYWxhbmNlIGlzIGltcG9ydGFudCB0byBnZXQgcm93IG5hbWVzIHJpZ2h0DQppbWJhbGFuY2VfdGFiX2JlZm9yZSA8LSBiYWx0ZXN0LmNvbGxlY3QoaW1iX2JlZm9yZSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiQWlkIC8gR0RQIChsb2cpIiwgIkdEUCAvIFBDIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaW1lIFR5cGUgKEZIKSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlciA9IEYpDQojIGRvIG5vdCByZXBvcnQgYWxsIHN0YXRpc3RpY3MNCmltYmFsYW5jZV90YWJfYmVmb3JlIDwtIGltYmFsYW5jZV90YWJfYmVmb3JlWywgYygibWVhbi5UciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZWFuLkNvIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQgcHZhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUyBwdmFsIildDQoNCmNvbG5hbWVzKGltYmFsYW5jZV90YWJfYmVmb3JlKSA8LSAgYygiTWVhbiBUcmVhdGVkIiwgIk1lYW4gQ29udHJvbCIsICJQLVZhbHVlIFQtVGVzdCIsICJQLVZhbHVlIEstUyBUZXN0IikNCg0KIyBBZnRlciBNYXRjaGluZw0KDQppbWJfYWZ0ZXIgPC0gTWF0Y2hCYWxhbmNlKGNhYmluZXRJTkMuMTIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX2FpZGRhdGFfQWlkR0RQKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9wb3ApICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2NvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9uYXRyZXMgKyAxKSAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9maCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzID0gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtzID0gVCwgcHJpbnQubGV2ZWwgPSAwKSAjIGRhdGEgYmVmb3JlIG1hdGNoaW5nDQoNCiMgbm90ZSB0aGF0IG9yZGVyIG9mIGNvdmFyaWF0ZXMgaW4gTWF0Y2hCYWxhbmNlIGlzIGltcG9ydGFudCB0byBnZXQgcm93IG5hbWVzIHJpZ2h0DQppbWJhbGFuY2VfdGFiX2FmdGVyPC0gYmFsdGVzdC5jb2xsZWN0KGltYl9hZnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2ltZSBUeXBlIChGSCkiKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gRikNCmltYmFsYW5jZV90YWJfYWZ0ZXIgPC0gaW1iYWxhbmNlX3RhYl9hZnRlclssIGMoIm1lYW4uVHIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW4uQ28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlQgcHZhbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS1MgcHZhbCIpXQ0KDQpjb2xuYW1lcyhpbWJhbGFuY2VfdGFiX2FmdGVyKSA8LSBjKCJNZWFuIFRyZWF0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lYW4gQ29udHJvbCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1WYWx1ZSBULVRlc3QiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgSy1TIFRlc3QiKQ0KDQojIG91dHB1dCBpbWJhbGFuY2UgdGFibGVzDQpwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAibGF0ZXgiLCBmbG9hdGluZyA9IEYsDQogICAgICBmaWxlID0gIi4uL291dHB1dC9tYXRjaGluZ19pbWJhbGFuY2VfcmVkdWN0aW9uX2VsZWN0aW9uc19iZWZvcmUudGV4IikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImxhdGV4IiwgZmxvYXRpbmcgPSBGLA0KICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvbWF0Y2hpbmdfaW1iYWxhbmNlX3JlZHVjdGlvbl9lbGVjdGlvbnNfYWZ0ZXIudGV4IikNCg0KDQpwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAiaHRtbCIsIGZsb2F0aW5nID0gRikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImh0bWwiLCBmbG9hdGluZyA9IEYpDQoNCg0KIyBpbWJhbGFuY2UgcmVkdWN0aW9uIHBsb3QsIHNlZSBodHRwOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcG1jL2FydGljbGVzL1BNQzI5NDM2NzAvDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3JlcGVsKQ0KDQpiYWxhbmNlX2ltcHJvdmVtZW50IDwtIHN1bW1hcnkobWF0Y2hfcmVzKSRyZWR1Y3Rpb24NCnJvdy5uYW1lcyhiYWxhbmNlX2ltcHJvdmVtZW50KSA8LSBjKCJBaWQgLyBHRFAgKGxvZykiLCAiR0RQIC8gUEMgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLCAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXR1cmFsIFJlc291cmNlIFJlbnRzIChsb2cpIiwgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIikNCg0KYmFsYW5jZV9pbXByb3ZlbWVudCA8LSBkYXRhLmZyYW1lKHZhcmlhYmxlID0gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cubmFtZXMoYmFsYW5jZV9pbXByb3ZlbWVudCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRfYmFsYW5jZV9pbXByb3ZlbWVudCA9IHJvdW5kKGJhbGFuY2VfaW1wcm92ZW1lbnRbLCAxXSwgMikpDQoNCg0KcGxvdF9iYWxhbmNlaW1wciA8LSBkYXRhLmZyYW1lKGBBbGwgRGF0YWAgPSBhYnMoc3VtbWFyeShtYXRjaF9yZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSA9IFQpJHN1bS5hbGwkYFN0ZC4gTWVhbiBEaWZmLmApLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTWF0Y2hlZCBEYXRhYCA9IGFicyhzdW1tYXJ5KG1hdGNoX3JlcywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZSA9IFQpJHN1bS5tYXRjaGVkJGBTdGQuIE1lYW4gRGlmZi5gKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3YgPSBiYWxhbmNlX2ltcHJvdmVtZW50JHZhcmlhYmxlKSAlPiUgDQogIGdhdGhlcihrZXksIHZhbHVlLCAtY292KSAlPiUgDQogIGZpbHRlcighaXMubmFuKHZhbHVlKSAmICFpcy5pbmZpbml0ZSh2YWx1ZSkpICU+JSANCiAgbXV0YXRlKGtleSA9IGdzdWIoIlxcLiIsICIgIiwga2V5KSkNCg0KDQpwbG90X2JhbGFuY2VpbXByX291dCA8LSBwbG90X2JhbGFuY2VpbXByICU+JSANCiAgZ2dwbG90KC4sIGFlcyh4ID0ga2V5LCB5ID0gdmFsdWUpKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAyLjUpICsgDQogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBjb3YpLA0KICAgICAgICAgICAgbGluZW1pdHJlID0gMiwgc2l6ZSA9IDAuNikgKyANCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC4yNSwgYWVzKGdyb3VwID0ga2V5KSkgKw0KICBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBwbG90X2JhbGFuY2VpbXByICU+JSBmaWx0ZXIoa2V5ID09ICJBbGwgRGF0YSIpLA0KICAgICAgICAgICAgICAgICAgIGFlcyhsYWJlbCA9IGNvdiksDQogICAgICAgICAgICAgICAgICAgbnVkZ2VfeCA9IC0uNCwNCiAgICAgICAgICAgICAgICAgICBudWRnZV95ID0gLS4xKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHggPSAiIiwgeSA9ICJBYnNvbHV0ZSBTdGFuZGFyZGl6ZWQgRGlmZmVyZW5jZSBpbiBNZWFucyIpDQoNCnByaW50KHBsb3RfYmFsYW5jZWltcHJfb3V0KQ0KDQpgYGANCg0KIyBUYWJsZSBDLjU6ICBGaXJzdCBTdGFnZSBhbmQgUmVkdWNlZCBGb3JtIFJlZ3Jlc3Npb25zIGZvciBJbnN0cnVtZW50YWwgVmFyaWFibGUgQW5hbHlzaXMNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeSh0ZXhyZWcpDQoNCg0KIyBMb2FkIGVsZWN0aW9ucyBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBsb2FkIGluc3RydW1lbnQgZGF0YSBmb3IgYWlkDQpsb2FkKGZpbGUgPSAiLi9kYXRhL2luc3RydW1lbnRlZEFpZDIuUkRhdGEiKQ0KDQpuZWxkYV9pdnJlZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHMsIGluc3RydW1lbnRfZGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJ5ZWFyIiwgImlzbzJjIikpDQoNCm5lbGRhX2l2cmVnJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0KQ0KDQpuZWxkYV9pdnJlZyRpbnN0cl9haWRfZ2RwIDwtIGxvZyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IC8gbmVsZGFfaXZyZWckR0RQKQ0KDQpuZWxkYV9pdnJlZyRkYXRlIDwtIE5VTEwNCm5lbGRhX2l2cmVnJFN0YXJ0RGF0ZTIgPC0gTlVMTA0KbmVsZGFfaXZyZWckeWVhcm1vbi54IDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueSA8LSBOVUxMDQpuZWxkYV9pdnJlZ1tuZWxkYV9pdnJlZyA9PSAiIl0gPC0gTkENCg0KDQoNCiMgZmlyc3Qgc3RhZ2UgYW5kIHJlZHVjZWQgZm9ybSBtb2RlbHMNCg0KZmlyc3RzdGFnZSA8LSBvbHMobG9nKGFpZGRhdGFfQWlkIC8gR0RQKSAgfiANCiAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgaW5zdHJfYWlkX2dkcCAgKyANCiAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCg0KZmlyc3RzdGFnZSA8LSByb2Jjb3YoZmlyc3RzdGFnZSwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KZmlyc3RzdGFnZV9pbnRlciA8LSBvbHMobG9nKGFpZGRhdGFfQWlkIC8gR0RQKSAqIGNhYmluZXRDT1VOVC4xMiAgfiANCiAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICogaW5zdHJfYWlkX2dkcCAgKyANCiAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbiksDQogICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCg0KZmlyc3RzdGFnZV9pbnRlciA8LSByb2Jjb3YoZmlyc3RzdGFnZV9pbnRlciwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KcmVkdWNlZF9mb3JtIDwtIG9scyh2MnhlbF9mcmVmYWlyIH4NCiAgICAgICAgICAgICAgICAgICAgaW5zdHJfYWlkX2dkcCAqDQogICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pLA0KICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX2l2cmVnLCB4ID0gVCwgeSA9IFQpDQpyZWR1Y2VkX2Zvcm0gPC0gcm9iY292KHJlZHVjZWRfZm9ybSwgbmVsZGFfaXZyZWckY291bnRyeSkNCg0KDQpyZWR1Y2VkX2Zvcm1fbmVsZGEgPC0gb2xzKHF1YWxpdHkgfg0KICAgICAgICAgICAgICAgICAgICAgIGluc3RyX2FpZF9nZHAgKg0KICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pLA0KICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfaXZyZWcsIHggPSBULCB5ID0gVCkNCnJlZHVjZWRfZm9ybV9uZWxkYSA8LSByb2Jjb3YocmVkdWNlZF9mb3JtX25lbGRhLCBuZWxkYV9pdnJlZyRjb3VudHJ5KQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCg0KIyBjdXN0b21fdGV4cmVnKGwgPSBsaXN0KGZpcnN0c3RhZ2UsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0c3RhZ2VfaW50ZXIsDQojICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtLCByZWR1Y2VkX2Zvcm1fbmVsZGEpLA0KIyAgICAgICAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2l2X2VsZWN0aW9uc19maXJzdHN0YWdlX3JlZHVjZWQudGV4IiwNCiMgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntGaXJzdCBTdGFnZX19ICYNCiMgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntSZWR1Y2VkIEZvcm19fSAgIFxcXFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGNtaWRydWxlKHIpezItM30gXFxjbWlkcnVsZShyKXs0LTV9DQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsgKDEpIERWOiBBaWQgLyBHRFAgKGxvZyl9IiwNCiMgIlxcbXVsdGljb2x1bW57MX17Y317ICgyKSBEVjogQWlkIC9HRFAgKiBQLVN9IiwNCiMgIlxcbXVsdGljb2x1bW57MX17Y317ICgzKSBWLURlbSBDRUkpIH0iLA0KIyAiXFxtdWx0aWNvbHVtbnsxfXtjfXsgKDQpIE5FTERBKX0iKSwNCiMgICAgICAgICAgICAgICBjdXN0b20uY29lZi5uYW1lcyA9IGMoIkludGVyY2VwdCIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgIC8gR0RQIChsb2cpIC0gSW5zdHJ1bWVudGVkICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiKSwNCiMgICAgICAgICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCksDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVFJVRSwNCiMgICAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICB0YWJsZSA9IEZBTFNFLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFRSVUUsDQojICAgICAgICAgICAgICAgY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVFJVRSwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYpDQoNCmh0bWxyZWcobCA9IGxpc3QoZmlyc3RzdGFnZSwgZmlyc3RzdGFnZV9pbnRlciwgDQogICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtLCByZWR1Y2VkX2Zvcm1fbmVsZGEpLA0KICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KICANCiAgICAgICBjdXN0b20uY29lZi5uYW1lcyA9IGMoIkludGVyY2VwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAvIEdEUCAobG9nKSAtIEluc3RydW1lbnRlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXR1cmFsIFJlc291cmNlIFJlbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgLyBQQyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFpZCAgLyBHRFAgKGxvZykgLSBJbnN0cnVtZW50ZWQgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgIC8gR0RQIChsb2cpIC0gSW5zdHJ1bWVudGVkICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiKSwNCiAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCksDQogICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgIGJvb2t0YWJzID0gVFJVRSwNCiAgICAgICBjZW50ZXIgPSBUUlVFLA0KICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICBjYXB0aW9uID0gIiIsDQogICAgICAgdGFibGUgPSBGQUxTRSwgDQogICAgICAgY3VzdG9tLm11bHRpY29sID0gVFJVRSwNCiAgICAgICBjb2x1bW4gPSBULA0KICAgICAgIGRjb2x1bW4gPSBUUlVFLA0KICAgICAgIHVzZS5wYWNrYWdlcyA9IEYpDQoNCg0KYGBgDQoNCiMgRmlndXJlIEMuMjogVGhlIFJlbGF0aW9uc2hpcCBiZXR3ZWVuIEZvcmVpZ24gQWlkIGFuZCBBaWQgKEluc3RydW1lbnRlZCkgaW4gdGhlIEVsZWN0aW9uIFNhbXBsZQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZGV2ID0gIkNhaXJvUE5HIn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCg0KIyBMb2FkIGVsZWN0aW9ucyBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBsb2FkIGluc3RydW1lbnQgZGF0YSBmb3IgYWlkDQpsb2FkKGZpbGUgPSAiLi9kYXRhL2luc3RydW1lbnRlZEFpZDIuUkRhdGEiKQ0KDQpuZWxkYV9pdnJlZyA8LSBsZWZ0X2pvaW4obmVsZGFfcHMsIGluc3RydW1lbnRfZGYsDQogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJ5ZWFyIiwgImlzbzJjIikpDQoNCm5lbGRhX2l2cmVnJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0KQ0KDQpuZWxkYV9pdnJlZyRpbnN0cl9haWRfZ2RwIDwtIGxvZyhuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IC8gbmVsZGFfaXZyZWckR0RQKQ0KDQpuZWxkYV9pdnJlZyRkYXRlIDwtIE5VTEwNCm5lbGRhX2l2cmVnJFN0YXJ0RGF0ZTIgPC0gTlVMTA0KbmVsZGFfaXZyZWckeWVhcm1vbi54IDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueSA8LSBOVUxMDQpuZWxkYV9pdnJlZ1tuZWxkYV9pdnJlZyA9PSAiIl0gPC0gTkENCg0KIyB3cml0ZSB0byBTdGF0YSBmaWxlLCBzbyB3ZSBjYW4gY29tcHV0ZSBGIHN0YXRpc3RpY3MgbGF0ZXINCmZvcmVpZ246OndyaXRlLmR0YShuZWxkYV9pdnJlZywgZmlsZSA9ICIuL2RhdGEvaXZlbGVjdGlvbnMuZHRhIiwgDQogICAgICAgICAgdmVyc2lvbiA9IDEwKQ0KDQojIHBsb3QgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5zdHJ1bWVudCBhbmQgYWlkDQpwbG90X2luc3RydW1lbnQgPC0gZ2dwbG90KG5lbGRhX2l2cmVnLCBhZXMoeCA9IGxvZyh0b3RhbF9zdW1fZXhjZXB0KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gbG9nKGFpZGRhdGFfQWlkKSkpICsNCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMpICsgDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsNCiAgdGhlbWVfYncoKSArIA0KICBsYWJzKHggPSAiQWlkIChpbnN0cnVtZW50ZWQpIExvZyIsDQogICAgICAgeSA9ICJBaWQgKEFpZERhdGEpIExvZyAiKQ0KDQoNCiMgT3V0cHV0DQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMHB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9pbnN0cl9lbGVjdGlvbnMudGV4IiwgaGVpZ2h0ID0gNCkNCiMgcHJpbnQocGxvdF9pbnN0cnVtZW50KQ0KIyBkZXYub2ZmKCkNCg0KcHJpbnQocGxvdF9pbnN0cnVtZW50KQ0KDQoNCg0KDQoNCmBgYA0K