Table B.1: Individual Effects of Power-Sharing and Foreign Aid on Freedom House scores
# Libraries
library(texreg)
library(rms)
# Load data
load("./data/diss_df.rda")
# specify vector with control vars
controlvars <- c("log(aiddata_AidGDP)",
"log(GDP_per_capita)",
"log(population)",
"conf_intens",
"nonstate",
"WBnatres",
"fh")
#### Power-Sharing only Models ####
# PS only + cabinetCOUNT
model_ps <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + ",
paste0(controlvars, collapse = " + "))),
data = diss_df, x = T, y = T)
model_ps <- robcov(model_ps, diss_df$GWNo)
# PS only + seniorCOUNT
model_seniorCOUNT <- ols(formula(paste0("fh_t2 ~ seniorCOUNT + ",
paste0(controlvars, collapse = " + "))),
data = diss_df, x = T, y = T)
model_seniorCOUNT <- robcov(model_seniorCOUNT, diss_df$GWNo)
# PS only + nonseniorCOUNT
model_nonseniorCOUNT <- ols(formula(paste0("fh_t2 ~ nonseniorCOUNT + ",
paste0(controlvars, collapse = " + "))),
data = diss_df, x = T, y = T)
model_nonseniorCOUNT <- robcov(model_nonseniorCOUNT, diss_df$GWNo)
#### Aid-only Models ####
# DGA
model_gov_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(dga_gdp_zero + 1) + ",
paste0(controlvars, collapse = " + ")))
,
data=diss_df, x=T, y=T)
model_gov_aid <- robcov(model_gov_aid, diss_df$GWNo)
# Program Aid
model_program_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(program_aid_gdp_zero + 1) + ",
paste0(controlvars, collapse = " + ")))
,
data=diss_df, x=T, y=T)
model_program_aid <- robcov(model_program_aid, diss_df$GWNo)
# Budget Aid
model_commodity_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(commodity_aid_gdp_zero + 1) + ",
paste0(controlvars, collapse = " + ")))
,
data=diss_df, x=T, y=T)
model_commodity_aid <- robcov(model_commodity_aid, diss_df$GWNo)
# Output manuscript
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# custom_texreg(l = list(model_ps,
# model_seniorCOUNT,
# model_nonseniorCOUNT,
# model_gov_aid,
# model_program_aid,
# model_commodity_aid),
# file = "../output/ind_effects_fh.tex",
# reorder.coef = c(1, 9, 10, 11:13, 2:8),
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# custom.multicol = T,
# custom.coef.names = c("Intercept",
# "Power-Sharing (cabinet)",
# "Aid / GDP (log)",
# "GDP p/c (log)",
# "Population (log)",
# "Conflict intensity",
# "Non-State Violence",
# "Nat. res. rents",
# "Regime Type (Freedom House)",
# "Power-Sharing (senior)",
# "Power-Sharing (nonsenior)",
# "Democracy Aid/GDP (log)",
# "Program Aid/GDP (log)",
# "Budget Aid/GDP (log)"),
# omit.coef = "Intercept",
# table = FALSE,
# dcolumn = T,
# groups = list("Power-Sharing" = 1:3, "Aid" = 4:7, "Controls" = 8:13),
# booktabs = T,
# # add.lines = list(c("Controls", rep("\\multicolumn{1}{c}{Yes}", 6))),
# use.packages = F,
# center = TRUE,
# include.lr = F,
# custom.model.names = c(" \\multicolumn{3}{c}{ \\textbf{Power-Sharing}} & \\multicolumn{3}{c}{ \\textbf{Foreign Aid}} \\\\ \\cmidrule(r){2-4} \\cmidrule(l){5-7} & \\multicolumn{1}{c}{(1) }",
# "\\multicolumn{1}{c}{(2) }",
# "\\multicolumn{1}{c}{(3) }",
# "\\multicolumn{1}{c}{(4) }",
# "\\multicolumn{1}{c}{(5) }",
# "\\multicolumn{1}{c}{(6) }"))
# Output replication archive
htmlreg(l = list(model_ps,
model_seniorCOUNT,
model_nonseniorCOUNT,
model_gov_aid,
model_program_aid,
model_commodity_aid),
reorder.coef = c(1, 9, 10, 11:13, 2:8),
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
caption = "",
custom.multicol = T,
custom.coef.names = c("Intercept",
"Power-Sharing (cabinet)",
"Aid / GDP (log)",
"GDP p/c (log)",
"Population (log)",
"Conflict intensity",
"Non-State Violence",
"Nat. res. rents",
"Regime Type (Freedom House)",
"Power-Sharing (senior)",
"Power-Sharing (nonsenior)",
"Democracy Aid/GDP (log)",
"Program Aid/GDP (log)",
"Budget Aid/GDP (log)"),
omit.coef = "Intercept",
table = FALSE,
dcolumn = T,
booktabs = T,
use.packages = F,
center = TRUE,
include.lr = F,
star.symbol = "\\*")
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Model 5
|
Model 6
|
Power-Sharing (cabinet)
|
0.01
|
|
|
0.01
|
0.01
|
0.01
|
|
(0.02)
|
|
|
(0.02)
|
(0.02)
|
(0.02)
|
Power-Sharing (senior)
|
|
0.04
|
|
|
|
|
|
|
(0.05)
|
|
|
|
|
Power-Sharing (nonsenior)
|
|
|
0.01
|
|
|
|
|
|
|
(0.02)
|
|
|
|
Democracy Aid/GDP (log)
|
|
|
|
0.13
|
|
|
|
|
|
|
(0.09)
|
|
|
Program Aid/GDP (log)
|
|
|
|
|
0.08
|
|
|
|
|
|
|
(0.11)
|
|
Budget Aid/GDP (log)
|
|
|
|
|
|
0.04
|
|
|
|
|
|
|
(0.07)
|
Aid / GDP (log)
|
-0.03
|
-0.03
|
-0.03
|
-0.05
|
-0.05
|
-0.04
|
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.05)
|
(0.05)
|
GDP p/c (log)
|
-0.11+
|
-0.11+
|
-0.11+
|
-0.10+
|
-0.09
|
-0.11+
|
|
(0.06)
|
(0.06)
|
(0.06)
|
(0.06)
|
(0.07)
|
(0.06)
|
Population (log)
|
0.00
|
0.00
|
0.00
|
0.00
|
0.01
|
0.00
|
|
(0.03)
|
(0.03)
|
(0.03)
|
(0.03)
|
(0.03)
|
(0.03)
|
Conflict intensity
|
-0.05
|
-0.06
|
-0.05
|
-0.09
|
-0.07
|
-0.06
|
|
(0.08)
|
(0.09)
|
(0.08)
|
(0.09)
|
(0.09)
|
(0.09)
|
Non-State Violence
|
-0.36***
|
-0.36***
|
-0.36***
|
-0.33**
|
-0.35**
|
-0.35***
|
|
(0.11)
|
(0.11)
|
(0.11)
|
(0.11)
|
(0.11)
|
(0.11)
|
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 (Freedom House)
|
0.87***
|
0.87***
|
0.87***
|
0.87***
|
0.87***
|
0.87***
|
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
(0.04)
|
Num. obs.
|
272
|
272
|
272
|
272
|
272
|
272
|
R2
|
0.80
|
0.80
|
0.80
|
0.81
|
0.80
|
0.80
|
Adj. R2
|
0.80
|
0.80
|
0.80
|
0.80
|
0.80
|
0.80
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table B.2: Temporal Dynamics for the Interaction Effect between Power-Sharing and Foreign aid on Democracy Score
# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)
# Data
load("./data/diss_df.rda")
# Prepare data frame for multiple plots
polity_vars <- list(
polity2_t1 = diss_df,
polity2_t2 = diss_df,
polity2_t3 = diss_df,
polity2_t4 = diss_df,
polity2_t5 = diss_df,
fh_t1 = diss_df,
fh_t2 = diss_df,
fh_t3 = diss_df,
fh_t4 = diss_df,
fh_t5 = diss_df
)
# create data frame with list column
polity_vars <- enframe(polity_vars)
# define function that will be applied to every data frame in the list column
main_model <- function(lead_type, data) {
data <- as.data.frame(data)
data$lead_var <- data[, grep(lead_type, names(data), value =T)]
if(grepl("fh", lead_type)) {
model <- lfe::felm(lead_var ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
fh | 0 | 0 | GWNo,
data=data)
return(model)
} else {
model <- lfe::felm(lead_var ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 | 0 | 0 | GWNo,
data=data)
return(model)
}
}
# fit models & post-process data for plotting
model_all <- polity_vars %>%
mutate(model = map2(name, value, ~ main_model(.x, .y)))
# output for manuscript
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
#
# custom_texreg(model_all$model,
# file = "../output/temp_dynamics_democ_app.tex",
# stars = c(0.001, 0.01, 0.05, 0.1),
# include.adjrs = T,
# include.rsquared = F,
# center = TRUE,
# symbol = "+",
# reorder.coef = c(1, 2, 9, 3:8, 10),
# custom.coef.names = c("Intercept",
# "Power-sharing (binary)",
# "Aid / GDP (log)",
# "GDP p/c (log)",
# "Population (log)",
# "Conflict intensity",
# "Non-State Violence",
# "Nat. res. rents",
# "Polity",
# "Power-sharing (cabinet) * Aid",
# "Freedom House"),
# omit.coef = "Intercept",
# table = FALSE,
# custom.multicol = F,
# dcolumn = T,
# booktabs = T,
# use.packages = F)
# output replication archive
htmlreg(model_all$model,
stars = c(0.001, 0.01, 0.05, 0.1),
include.adjrs = T,
caption = "",
include.rsquared = F,
center = TRUE,
symbol = "+",
reorder.coef = c(1, 2, 9, 3:8, 10),
custom.coef.names = c("Intercept",
"Power-sharing (binary)",
"Aid / GDP (log)",
"GDP p/c (log)",
"Population (log)",
"Conflict intensity",
"Non-State Violence",
"Nat. res. rents",
"Polity",
"Power-sharing (cabinet) * Aid",
"Freedom House"),
omit.coef = "Intercept",
table = FALSE,
custom.multicol = T,
dcolumn = T,
booktabs = T,
use.packages = F,
star.symbol = "\\*",
include.lr = F)
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Model 5
|
Model 6
|
Model 7
|
Model 8
|
Model 9
|
Model 10
|
Power-sharing (binary)
|
-0.10+
|
-0.17+
|
-0.22+
|
-0.26+
|
-0.31+
|
-0.01
|
-0.05+
|
-0.09**
|
-0.09*
|
-0.05
|
|
(0.06)
|
(0.09)
|
(0.12)
|
(0.14)
|
(0.17)
|
(0.02)
|
(0.03)
|
(0.03)
|
(0.04)
|
(0.05)
|
Aid / GDP (log)
|
-0.02
|
-0.02
|
-0.01
|
0.02
|
0.08
|
-0.01
|
-0.03
|
-0.03
|
-0.01
|
0.02
|
|
(0.09)
|
(0.15)
|
(0.18)
|
(0.20)
|
(0.21)
|
(0.03)
|
(0.04)
|
(0.04)
|
(0.05)
|
(0.06)
|
Power-sharing (cabinet) * Aid
|
0.06***
|
0.11***
|
0.14**
|
0.17**
|
0.19**
|
0.01
|
0.02*
|
0.04**
|
0.03**
|
0.02
|
|
(0.02)
|
(0.03)
|
(0.04)
|
(0.05)
|
(0.06)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.01)
|
(0.02)
|
GDP p/c (log)
|
-0.15
|
-0.08
|
0.19
|
0.56
|
0.83
|
-0.06+
|
-0.10+
|
-0.08
|
-0.03
|
0.04
|
|
(0.16)
|
(0.32)
|
(0.44)
|
(0.52)
|
(0.53)
|
(0.04)
|
(0.06)
|
(0.09)
|
(0.12)
|
(0.15)
|
Population (log)
|
0.03
|
-0.02
|
-0.03
|
-0.11
|
-0.04
|
0.00
|
0.00
|
0.01
|
0.00
|
0.02
|
|
(0.09)
|
(0.12)
|
(0.14)
|
(0.19)
|
(0.24)
|
(0.02)
|
(0.03)
|
(0.04)
|
(0.06)
|
(0.07)
|
Conflict intensity
|
0.08
|
0.09
|
0.16
|
0.01
|
-0.21
|
-0.03
|
-0.07
|
-0.08
|
-0.10
|
-0.12
|
|
(0.31)
|
(0.47)
|
(0.61)
|
(0.72)
|
(0.83)
|
(0.06)
|
(0.09)
|
(0.12)
|
(0.14)
|
(0.19)
|
Non-State Violence
|
-0.52
|
-0.45
|
-0.19
|
0.39
|
0.37
|
-0.22**
|
-0.38***
|
-0.36*
|
-0.33+
|
-0.34
|
|
(0.35)
|
(0.51)
|
(0.65)
|
(0.80)
|
(0.88)
|
(0.07)
|
(0.11)
|
(0.15)
|
(0.19)
|
(0.24)
|
Nat. res. rents
|
-0.02*
|
-0.04*
|
-0.05+
|
-0.07*
|
-0.07*
|
-0.01**
|
-0.01+
|
-0.01
|
-0.01
|
-0.01
|
|
(0.01)
|
(0.02)
|
(0.03)
|
(0.03)
|
(0.03)
|
(0.00)
|
(0.00)
|
(0.01)
|
(0.01)
|
(0.01)
|
Polity
|
0.90***
|
0.82***
|
0.75***
|
0.66***
|
0.58***
|
|
|
|
|
|
|
(0.04)
|
(0.07)
|
(0.09)
|
(0.10)
|
(0.11)
|
|
|
|
|
|
Freedom House
|
|
|
|
|
|
0.94***
|
0.87***
|
0.83***
|
0.80***
|
0.75***
|
|
|
|
|
|
|
(0.03)
|
(0.04)
|
(0.05)
|
(0.06)
|
(0.08)
|
Num. obs.
|
263
|
263
|
255
|
244
|
233
|
273
|
272
|
271
|
263
|
252
|
Adj. R2 (full model)
|
0.85
|
0.76
|
0.69
|
0.62
|
0.57
|
0.89
|
0.80
|
0.74
|
0.69
|
0.62
|
Adj. R2 (proj model)
|
0.85
|
0.76
|
0.69
|
0.62
|
0.57
|
0.89
|
0.80
|
0.74
|
0.69
|
0.62
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table B.3: Technical Robustness Checks I: Outlier Test and XPOLITY and Interregnum Bias Correction
# Library
library(rms)
library(dplyr)
# Load data
load("./data/diss_df.rda")
##### Outlier #####
# Load outlier function
source("./functions/outlier_analysis.R")
# Estimate baseline model
model_polity_cabcount <- ols(polity2_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 ,
data=diss_df, x=T, y=T)
model_polity_cabcount <- robcov(model_polity_cabcount, diss_df$GWNo)
# selector variables
selectvars = c("Location", "year", "identifiers")
diss_df$identifiers <- paste(diss_df$GWNo, diss_df$year, sep = "-")
# Estimate outliers
democ_outliers <- check_outlier(model_polity_cabcount,
data = diss_df,
selectvars = selectvars,
clustervar = "GWNo")
#### XPOLITY & Interregnum Bias ####
# First load regular Plumper & Neumayer correction
load("./data/polity2_xpolity_plumper_corrected.rdata")
names(polity_rev)[2] <- "GWNo"
# Fix Serbia for correct merging
polity_rev$GWNo <- ifelse(polity_rev$country == "Yugoslavia", 345, polity_rev$GWNo)
polity_rev$GWNo <- ifelse(polity_rev$country == "Serbia and Montenegro", 345, polity_rev$GWNo)
polity_rev_orig <- polity_rev
# Second load xpolity combined with Plumper & Neumayer correction
load("./data/polity2_xpolity_plumper_corrected_combined.rdata")
names(polity_rev)[2] <- "GWNo"
# Fix Serbia
polity_rev$GWNo <- ifelse(polity_rev$country == "Yugoslavia", 345, polity_rev$GWNo)
polity_rev$GWNo <- ifelse(polity_rev$country == "Serbia and Montenegro", 345, polity_rev$GWNo)
polity_rev <- left_join(polity_rev_orig, polity_rev[, c("GWNo", "year", "xpolity_inter",
"xpolity_max",
"xpolity_min")],
by = c("GWNo", "year"))
# merge xpolity & interregnum data in main data set
testdf <- merge(diss_df, polity_rev[, c("GWNo", "year",
"polity2min", "polity2max", "polity2inter",
"xpolity_inter",
"xpolity_max",
"xpolity_min")], by = c("GWNo", "year"), all.x = TRUE)
# Data transformations -----------------------------------------------------
source("./functions/laggedVar.R")
#### For Plumper & Neumayer correction
# Polity 2 Min
testdf <- laggedVar(testdf, polity_rev, lVar="polity2min", tID ="year", gID="GWNo", lagBy = -2)
# Polity2 Max
testdf <- laggedVar(testdf, polity_rev, lVar="polity2max", tID ="year", gID="GWNo", lagBy = -2)
# Polity2 Inter
testdf <- laggedVar(testdf, polity_rev, lVar="polity2inter", tID ="year", gID="GWNo", lagBy = -2)
#### XPOLITY
# xpolity min
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_min", tID ="year", gID="GWNo", lagBy = -2)
# xpolity max
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_max", tID ="year", gID="GWNo", lagBy = -2)
# xpolity inter
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_inter", tID ="year", gID="GWNo", lagBy = -2)
## Run XPOLITY & Interregnum Bias models
# xpolity min
model_xpol_min <- ols(xpolity_min_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
cabinetCOUNT : aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
xpolity_min,
data=testdf, x=T, y=T)
model_xpol_min <- robcov(model_xpol_min, testdf$GWNo)
# xpolity min
model_xpol_max <- ols(xpolity_max_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
cabinetCOUNT : aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
xpolity_max,
data=testdf, x=T, y=T)
model_xpol_max <- robcov(model_xpol_max, testdf$GWNo)
# xpolity inter
model_xpol_inter <- ols(xpolity_inter_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
cabinetCOUNT : aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
xpolity_inter,
data=testdf, x=T, y=T)
model_xpol_inter <- robcov(model_xpol_inter, testdf$GWNo)
# Models for Plumper & Neumayer (interregnum bias) ------------------------
# polity 2 min
model_pchng_p2min <- ols(polity2min_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
cabinetCOUNT : aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2min,
data=testdf, x=T, y=T)
model_pchng_p2min <- robcov(model_pchng_p2min, testdf$GWNo)
# polity 2 max
model_pchng_p2max <- ols(polity2max_t2 ~
cabinetCOUNT +
aiddata_AidGDP_ln +
cabinetCOUNT : aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2max ,
data=testdf, x=T, y=T)
model_pchng_p2max <- robcov(model_pchng_p2max, testdf$GWNo)
# polity 2 interpolated
model_pchng_p2inter <- ols(polity2inter_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2inter,
data=testdf, x=T, y=T)
model_pchng_p2inter <- robcov(model_pchng_p2inter, testdf$GWNo)
# Output Replication Archive
## Determine order of coefficients in output table
name_map_robustness <- list(cabinetCOUNT = "PS (cabinet)",
aiddata_AidGDP_ln = "Aid / GDP (log)",
"cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
GDP_per_capita = "GDP p/c",
population = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Polity",
polity2inter = "Polity (Interpolated)",
polity2max = "Polity (Max)",
polity2min = "Polity (Min)",
xpolity_inter = "XPOLITY (Interpolated)",
xpolity_max = "XPOLITY (Max)",
xpolity_min = "XPOLITY (Min)")
source("./functions/will_lowe_texreg_reorder.R")
# Model list
app_rob_models <- list(democ_outliers[[2]],
democ_outliers[[4]],
democ_outliers[[6]],
model_pchng_p2inter,
model_pchng_p2max,
model_pchng_p2min,
model_xpol_inter,
model_xpol_max,
model_xpol_min)
oldnames <- all.varnames.dammit(app_rob_models)
ror <- build.ror(oldnames, name_map_robustness)
# texreg
# texreg(l = app_rob_models,
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# file = "../output/democ_app_tech_robustness.tex",
# # custom.model.names = c("(1) ELF",
# # "(2) PKO",
# # "(3) Cabinet Size",
# # "(4) Random Effects",
# # "(5) Region FE",
# # "(6) Country FE"),
# custom.coef.names = ror$ccn,
# omit.coef = ror$oc,
# reorder.coef = unique(ror$rc),
# include.lr = F)
# Replication Archive output
htmlreg(l = app_rob_models,
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
table = F,
booktabs = T,
caption = "",
use.packages = F,
dcolumn = T,
custom.coef.names = ror$ccn,
omit.coef = ror$oc,
reorder.coef = unique(ror$rc),
star.symbol = "\\*",
include.lr = F)
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Model 5
|
Model 6
|
Model 7
|
Model 8
|
Model 9
|
PS (cabinet)
|
-0.60
|
-0.17***
|
-0.14***
|
-0.09
|
-0.09
|
-0.13
|
-0.07
|
-0.07
|
-0.11+
|
|
(0.55)
|
(0.04)
|
(0.04)
|
(0.07)
|
(0.08)
|
(0.08)
|
(0.05)
|
(0.05)
|
(0.06)
|
Aid / GDP (log)
|
-0.01
|
-0.02
|
-0.02
|
-0.02
|
-0.00
|
-0.01
|
0.01
|
0.02
|
0.02
|
|
(0.16)
|
(0.07)
|
(0.05)
|
(0.15)
|
(0.14)
|
(0.15)
|
(0.11)
|
(0.11)
|
(0.11)
|
PS (cabinet) * Aid
|
0.28
|
0.10***
|
0.08***
|
0.08**
|
0.06+
|
0.13***
|
0.06**
|
0.05*
|
0.09***
|
|
(0.26)
|
(0.02)
|
(0.02)
|
(0.03)
|
(0.03)
|
(0.03)
|
(0.02)
|
(0.02)
|
(0.02)
|
GDP p/c
|
0.00
|
0.08
|
-0.02
|
-0.11
|
-0.07
|
-0.11
|
-0.03
|
-0.01
|
-0.03
|
|
(0.35)
|
(0.16)
|
(0.10)
|
(0.32)
|
(0.31)
|
(0.32)
|
(0.23)
|
(0.23)
|
(0.23)
|
Population
|
0.01
|
-0.06
|
-0.05
|
-0.03
|
-0.03
|
0.01
|
0.01
|
0.02
|
0.04
|
|
(0.12)
|
(0.07)
|
(0.06)
|
(0.11)
|
(0.11)
|
(0.11)
|
(0.09)
|
(0.09)
|
(0.09)
|
Conflict Intensity
|
0.25
|
0.02
|
0.04
|
0.05
|
0.05
|
0.11
|
-0.02
|
-0.02
|
0.03
|
|
(0.54)
|
(0.25)
|
(0.16)
|
(0.53)
|
(0.53)
|
(0.55)
|
(0.39)
|
(0.39)
|
(0.41)
|
Non-State Violence
|
-0.55
|
-0.10
|
-0.20
|
-0.04
|
-0.23
|
0.04
|
-0.24
|
-0.34
|
-0.09
|
|
(0.58)
|
(0.23)
|
(0.14)
|
(0.52)
|
(0.50)
|
(0.59)
|
(0.45)
|
(0.44)
|
(0.49)
|
Nat. Res. Rents
|
-0.05**
|
-0.01
|
-0.01+
|
-0.04+
|
-0.04*
|
-0.04+
|
-0.03+
|
-0.03*
|
-0.03+
|
|
(0.02)
|
(0.01)
|
(0.00)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.01)
|
(0.01)
|
(0.01)
|
Polity
|
0.80***
|
0.94***
|
0.97***
|
|
|
|
|
|
|
|
(0.07)
|
(0.03)
|
(0.02)
|
|
|
|
|
|
|
Polity (Interpolated)
|
|
|
|
0.82***
|
|
|
|
|
|
|
|
|
|
(0.07)
|
|
|
|
|
|
Polity (Max)
|
|
|
|
|
0.82***
|
|
|
|
|
|
|
|
|
|
(0.07)
|
|
|
|
|
Polity (Min)
|
|
|
|
|
|
0.80***
|
|
|
|
|
|
|
|
|
|
(0.07)
|
|
|
|
XPOLITY (Interpolated)
|
|
|
|
|
|
|
0.82***
|
|
|
|
|
|
|
|
|
|
(0.07)
|
|
|
XPOLITY (Max)
|
|
|
|
|
|
|
|
0.82***
|
|
|
|
|
|
|
|
|
|
(0.06)
|
|
XPOLITY (Min)
|
|
|
|
|
|
|
|
|
0.80***
|
|
|
|
|
|
|
|
|
|
(0.07)
|
Num. obs.
|
242
|
252
|
223
|
254
|
254
|
254
|
254
|
254
|
254
|
R2
|
0.76
|
0.90
|
0.97
|
0.78
|
0.78
|
0.78
|
0.77
|
0.77
|
0.76
|
Adj. R2
|
0.75
|
0.89
|
0.97
|
0.77
|
0.77
|
0.77
|
0.76
|
0.76
|
0.76
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table B.4: Technical Robustness Checks II: Binary DV, Time Trends, and Power-Sharing Aggregation
# Library
library(rms)
library(dplyr)
library(texreg)
# Load data
load("./data/diss_df.rda")
# Binary DV
model_polinc <- lrm(pol_inc ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 + pcy + pcy2 + pcy3 ,
data=diss_df, x=T, y=T)
model_polinc <- robcov(model_polinc, diss_df$GWNo)
# Time Trend
model_polity_time <- ols(polity2_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 +
pcy + pcy2 + pcy3,
data=diss_df, x=T, y=T)
model_polity_time <- robcov(model_polity_time, diss_df$GWNo)
# year FE
diss_df$yearFE <- as.factor(diss_df$year)
model_polity_yearfe <- ols(polity2_t2 ~
cabinetCOUNT *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 +
yearFE,
data=diss_df, x=T, y=T)
model_polity_yearfe <- robcov(model_polity_yearfe, diss_df$GWNo)
# different cabinet aggregation types
model_polity_cabmax <- ols(polity2_t2 ~
cabinetCOUNT_max *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 ,
data=diss_df, x=T, y=T)
model_polity_cabmax <- robcov(model_polity_cabmax, diss_df$GWNo)
model_polity_cabmin <- ols(polity2_t2 ~
cabinetCOUNT_min *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 ,
data=diss_df, x=T, y=T)
model_polity_cabmin <- robcov(model_polity_cabmin, diss_df$GWNo)
model_polity_cabsix <- ols(polity2_t2 ~
cabinetCOUNT_six *
aiddata_AidGDP_ln +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2 ,
data=diss_df, x=T, y=T)
model_polity_cabsix <- robcov(model_polity_cabsix, diss_df$GWNo)
# list models
tech_rob_models <- list(model_polinc, model_polity_time,
model_polity_yearfe, model_polity_cabmax,
model_polity_cabmin, model_polity_cabsix)
coef_map <- list(cabinetCOUNT = "Power-Sharing (cabinet)",
cabinetCOUNT_max = "Power-Sharing (cabinet)",
cabinetCOUNT_min = "Power-Sharing (cabinet)",
cabinetCOUNT_six = "Power-Sharing (cabinet)",
"cabinetCOUNT * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid",
"cabinetCOUNT_max * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid",
"cabinetCOUNT_min * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid",
"cabinetCOUNT_six * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid",
aiddata_AidGDP_ln = "Aid / GDP (log)",
GDP_per_capita = "GDP p/c",
population = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Polity",
pcy = "Time",
pcy2 = "Time$^2$",
pcy3 = "Time$^3$")
# Output Manuscript
#
# texreg(tech_rob_models,
# custom.coef.map = coef_map,
# file = "../output/democ_app_tech_robustness2.tex",
# custom.model.names = c("(1) Logit: Binary DV",
# "(2) OLS: Cubic Time Trend",
# "(3) OLS: Year FE",
# "(4) PS: Max",
# "(5) PS: Min",
# "(6) PS: Six Months"),
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# include.lr = F,
# include.rsquared = F,
# caption = "")
# Output Replication Archive
htmlreg(tech_rob_models,
custom.coef.map = coef_map,
custom.model.names = c("(1) Logit: Binary DV",
"(2) OLS: Cubic Time Trend",
"(3) OLS: Year FE",
"(4) PS: Max",
"(5) PS: Min",
"(6) PS: Six Months"),
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
dcolumn = T,
include.lr = F,
include.rsquared = F,
caption = "")
|
(1) Logit: Binary DV
|
(2) OLS: Cubic Time Trend
|
(3) OLS: Year FE
|
(4) PS: Max
|
(5) PS: Min
|
(6) PS: Six Months
|
Power-Sharing (cabinet)
|
-2.75***
|
-0.14
|
-0.05
|
-0.14+
|
-0.18
|
-0.16+
|
|
(0.76)
|
(0.09)
|
(0.09)
|
(0.07)
|
(0.11)
|
(0.09)
|
Power-Sharing (cabinet) * Aid
|
0.83***
|
0.09**
|
0.06*
|
0.09***
|
0.11**
|
0.11***
|
|
(0.21)
|
(0.04)
|
(0.03)
|
(0.03)
|
(0.04)
|
(0.03)
|
Aid / GDP (log)
|
0.27
|
-0.03
|
0.10
|
-0.03
|
-0.01
|
-0.03
|
|
(0.22)
|
(0.14)
|
(0.16)
|
(0.14)
|
(0.14)
|
(0.14)
|
GDP p/c
|
0.09
|
-0.08
|
0.00
|
-0.08
|
-0.08
|
-0.08
|
|
(0.34)
|
(0.31)
|
(0.30)
|
(0.31)
|
(0.32)
|
(0.31)
|
Population
|
-0.27
|
-0.02
|
0.10
|
-0.02
|
-0.01
|
-0.02
|
|
(0.23)
|
(0.11)
|
(0.13)
|
(0.11)
|
(0.11)
|
(0.11)
|
Conflict Intensity
|
-0.27
|
0.07
|
0.02
|
0.09
|
0.14
|
0.10
|
|
(0.76)
|
(0.45)
|
(0.43)
|
(0.46)
|
(0.46)
|
(0.46)
|
Non-State Violence
|
-1.23
|
-0.46
|
-0.77
|
-0.44
|
-0.37
|
-0.46
|
|
(1.36)
|
(0.51)
|
(0.52)
|
(0.50)
|
(0.52)
|
(0.50)
|
Nat. Res. Rents
|
-0.07*
|
-0.04*
|
-0.03+
|
-0.04*
|
-0.04*
|
-0.04*
|
|
(0.03)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
Polity
|
-0.20***
|
0.82***
|
0.82***
|
0.82***
|
0.82***
|
0.82***
|
|
(0.05)
|
(0.07)
|
(0.07)
|
(0.07)
|
(0.07)
|
(0.07)
|
Time
|
-1.83
|
-2.82+
|
|
|
|
|
|
(2.42)
|
(1.54)
|
|
|
|
|
Time\(^2\)
|
0.46
|
0.90+
|
|
|
|
|
|
(1.00)
|
(0.54)
|
|
|
|
|
Time\(^3\)
|
-0.04
|
-0.09
|
|
|
|
|
|
(0.12)
|
(0.06)
|
|
|
|
|
Num. obs.
|
263
|
263
|
263
|
263
|
263
|
263
|
Pseudo R2
|
0.31
|
|
|
|
|
|
Adj. R2
|
|
0.76
|
0.76
|
0.76
|
0.76
|
0.76
|
p < 0.001, p < 0.01, p < 0.05, +p < 0.1
|
Table B.5: Matching Tables and Balance Diagnostics
# Balance diagnostics (table) ---------------------------------
# Libraries
library(dplyr)
library(MatchIt)
library(texreg)
library(rms)
library(tidyr)
library(ggplot2)
library(tikzDevice)
library(xtable)
# Load data
load("./data/diss_df.rda")
# select relevant variables
match_democ_data <- diss_df %>%
ungroup() %>%
dplyr::select(cabinetINC, cabinetCOUNT, seniorINC,
seniorCOUNT, nonseniorINC, nonseniorCOUNT,
aiddata_AidGDP, population, nonstate,
WBnatres, fh, GDP_per_capita, conf_intens,
aiddata_AidGDP_ln,
GWNo, year,
polity_chng, polity2, polity2_t2, # check
fh, fh_chng, fh_t2,
pc_period, Location, ln_pop, ln_gdp_pc)
# keep only complete cases (necessary for matching)
match_democ_data <- match_democ_data[complete.cases(match_democ_data), ]
# generate pretreatment controls: control variables in first post-conflict year
match_democ_data <- match_democ_data %>%
arrange(GWNo, pc_period, year) %>%
group_by(GWNo, pc_period) %>%
mutate(match_aiddata_AidGDP_ln = first(aiddata_AidGDP_ln),
match_pop = first(population),
match_gdp = first(GDP_per_capita),
match_nonstate = first(nonstate),
match_WBnatres = first(WBnatres),
match_polity = first(polity2),
match_fh = first(fh))
# explicitly convert to data frame
match_democ_data <- as.data.frame(match_democ_data)
# Perform matching algorithm ------------------------------------------
set.seed(123)
match_democ_res <- matchit(cabinetINC ~
match_aiddata_AidGDP_ln +
log(match_gdp) +
log(match_pop) +
conf_intens + # conf_intens is already pre-treatment
match_nonstate +
log(match_WBnatres + 1) +
match_polity,
method = "nearest",
distance = "mahalanobis",
ratio = 2,
data = match_democ_data)
# extract data
match_democ_df <- match.data(match_democ_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)
# before matching
imb_before <- Matching::MatchBalance(cabinetINC ~
match_aiddata_AidGDP_ln +
log(match_gdp) +
log(match_pop) +
conf_intens + # conf_intens is already pre-treatment
match_nonstate +
log(match_WBnatres + 1) +
match_polity,
data = match_democ_data,
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 <- ebal::baltest.collect(imb_before,
c("Aid / GDP (log)",
"GDP / PC (log)",
"Population (log)",
"Conflict Intensity",
"Nonstate Conflict",
"Natural Resource Rents (log)",
"Regime Type (Polity)"),
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")
# Imbalance After Matching
imb_after <- Matching::MatchBalance(cabinetINC ~
match_aiddata_AidGDP_ln +
log(match_gdp) +
log(match_pop) +
conf_intens + # conf_intens is already pre-treatment
match_nonstate +
log(match_WBnatres + 1) +
match_polity,
data = match_democ_df,
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<- ebal::baltest.collect(imb_after,
c("Aid / GDP (log)",
"GDP / PC (log)",
"Population (log)",
"Conflict Intensity",
"Nonstate Conflict",
"Natural Resource Rents (log)",
"Regime Type (Polity)"),
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")
# Balance tables before / after output
# output imbalance tables
# print(xtable(imbalance_tab_before), booktabs = T, type = "latex", floating = F,
# file = "../output/matching_imbalance_reduction_democ_before.tex")
# print(xtable(imbalance_tab_after), booktabs = T, type = "latex", floating = F,
# file = "../output/matching_imbalance_reduction_democ_after.tex")
# output imbalance tables fro replication archive
print(xtable(imbalance_tab_before), booktabs = T, type = "html")
|
Mean Treated
|
Mean Control
|
P-Value T-Test
|
P-Value K-S Test
|
Aid / GDP (log)
|
2.16
|
1.41
|
0.00
|
0.00
|
GDP / PC (log)
|
6.32
|
6.55
|
0.13
|
0.07
|
Population (log)
|
15.54
|
15.91
|
0.17
|
0.02
|
Conflict Intensity
|
0.29
|
0.26
|
0.70
|
|
Nonstate Conflict
|
0.45
|
0.12
|
0.00
|
|
Natural Resource Rents (log)
|
1.71
|
1.78
|
0.78
|
0.17
|
Regime Type (Polity)
|
2.05
|
1.70
|
0.68
|
0.34
|
print(xtable(imbalance_tab_after), booktabs = T, type = "html")
|
Mean Treated
|
Mean Control
|
P-Value T-Test
|
P-Value K-S Test
|
Aid / GDP (log)
|
2.16
|
2.09
|
0.74
|
0.40
|
GDP / PC (log)
|
6.32
|
6.34
|
0.89
|
0.17
|
Population (log)
|
15.54
|
15.77
|
0.44
|
0.01
|
Conflict Intensity
|
0.29
|
0.26
|
0.77
|
|
Nonstate Conflict
|
0.45
|
0.33
|
0.23
|
|
Natural Resource Rents (log)
|
1.71
|
1.75
|
0.91
|
0.44
|
Regime Type (Polity)
|
2.05
|
1.82
|
0.80
|
0.56
|
Table B.6: First Stage and Reduced Form Results
# load libraries
library(AER)
library(ivpack)
library(lmtest)
library(lfe)
library(rms)
library(tikzDevice)
# load data with instrument; this gives "instrument_df" data frame
load(file = "./data/instrumentedAid2.RData")
load("./data/diss_df.rda")
diss_df_iv <- merge(diss_df,
instrument_df,
by = c("iso2c", "year"), all.x = TRUE)
# subset only complete.cases / necessary for cluster.robust.se()
iv_na <- na.omit(diss_df_iv[, c("polity_chng",
"cabinetCOUNT",
"cabinetINC",
"aiddata_Aid",
"aiddata_AidGDP_ln",
"aiddata_AidPC_ln",
"fh",
"fh_t2",
"GDP_per_capita",
"population",
"conf_intens",
"WBnatres",
"polity2",
"polity2_t2",
"total_sum_except",
"year",
"GWNo",
"GDP",
"nonstate")])
# to proceed with IV estimation I first hard-code the instrument
iv_na$instr_aid_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)
# data transformation for Stata
iv_na$ln_gdp_pc <- log(iv_na$GDP_per_capita)
iv_na$ln_pop <- log(iv_na$population)
# First Stage Results
iv_fs_aid <- ols(aiddata_AidGDP_ln ~
log(total_sum_except / GDP) +
cabinetCOUNT +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2,
data = iv_na, x = T, y = T)
iv_fs_aid <- robcov(iv_fs_aid, iv_na$GWNo)
# IV * cabinetCOUNT => aid * cabinetCOUNT
iv_fs_aidinteraction <- ols(aiddata_AidGDP_ln * cabinetCOUNT ~
log(total_sum_except / GDP) *
cabinetCOUNT +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2,
data = iv_na, x = T, y = T)
iv_fs_aidinteraction <- robcov(iv_fs_aidinteraction, iv_na$GWNo)
# reduced form: Polity
reduced_form_polity <- ols(polity2_t2 ~
cabinetCOUNT *
log(total_sum_except / GDP) +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
polity2,
data=iv_na, x=T, y=T)
reduced_form_polity <- robcov(reduced_form_polity, iv_na$GWNo)
# reduced form: Freedom House
reduced_form_fh <- ols(fh_t2 ~
cabinetCOUNT *
log(total_sum_except / GDP) +
log(GDP_per_capita) +
log(population) +
conf_intens +
nonstate +
WBnatres +
fh,
data=iv_na, x=T, y=T)
reduced_form_fh <- robcov(reduced_form_fh, iv_na$GWNo)
# Output: create variable list order
name_map <- list(total_sum_except = "Aid/GDP (Instrumented)",
"total_sum_except * cabinetCOUNT" = "Aid/GDP (Instrumented) * Power-Sharing (cabinet)",
"cabinetCOUNT * total_sum_except" = "Aid/GDP (Instrumented) * Power-Sharing (cabinet)",
cabinetCOUNT = "Power-Sharing (cabinet)",
"log(GDP_per_capita)" = "GDP p/c",
"log(population)" = "Population",
conf_intens = "Conflict Intensity",
nonstate = "Non-State Violence",
WBnatres = "Nat. Res. Rents",
polity2 = "Regime Type (Polity)",
fh = "Regime Type (Freedom House)")
# Output for Manuscript
# texreg(l = list(iv_fs_aid,
# iv_fs_aidinteraction,
# reduced_form_polity,
# reduced_form_fh),
# custom.coef.map = name_map,
# file = "../output/iv_democ_firststage_reduced.tex",
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# table = F,
# custom.model.names = c("(1) DV: Aid", "(2) Aid * PS Interaction",
# "(3) Reduced Form - Polity", "(4) Reduced Form - FH"),
# booktabs = T,
# use.packages = F,
# dcolumn = T,
# include.lr = F)
# Output for Replication Archivie
htmlreg(l = list(iv_fs_aid,
iv_fs_aidinteraction,
reduced_form_polity,
reduced_form_fh),
custom.coef.map = name_map,
caption = "",
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
table = F,
custom.model.names = c("(1) DV: Aid", "(2) Aid * PS Interaction",
"(3) Reduced Form - Polity", "(4) Reduced Form - FH"),
booktabs = T,
use.packages = F,
dcolumn = T,
star.symbol = "\\*",
include.lr = F)
|
(1) DV: Aid
|
(2) Aid * PS Interaction
|
(3) Reduced Form - Polity
|
(4) Reduced Form - FH
|
Aid/GDP (Instrumented)
|
0.70***
|
-0.09
|
0.26
|
0.10***
|
|
(0.08)
|
(0.07)
|
(0.17)
|
(0.03)
|
Aid/GDP (Instrumented) * Power-Sharing (cabinet)
|
|
1.03***
|
0.10*
|
0.03**
|
|
|
(0.22)
|
(0.05)
|
(0.01)
|
Power-Sharing (cabinet)
|
0.04*
|
-19.18***
|
-2.08*
|
-0.72**
|
|
(0.02)
|
(4.67)
|
(0.99)
|
(0.25)
|
Conflict Intensity
|
0.51**
|
0.37*
|
0.00
|
-0.12
|
|
(0.19)
|
(0.18)
|
(0.43)
|
(0.10)
|
Non-State Violence
|
0.02
|
0.74
|
-0.29
|
-0.31*
|
|
(0.31)
|
(0.57)
|
(0.53)
|
(0.13)
|
Nat. Res. Rents
|
-0.00
|
0.00
|
-0.04*
|
-0.01*
|
|
(0.01)
|
(0.01)
|
(0.02)
|
(0.00)
|
Regime Type (Polity)
|
-0.00
|
-0.01
|
0.80***
|
|
|
(0.02)
|
(0.02)
|
(0.07)
|
|
Regime Type (Freedom House)
|
|
|
|
0.84***
|
|
|
|
|
(0.04)
|
Num. obs.
|
260
|
260
|
260
|
260
|
R2
|
0.68
|
0.94
|
0.77
|
0.81
|
Adj. R2
|
0.67
|
0.94
|
0.76
|
0.80
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
LS0tDQp0aXRsZTogIkFwcGVuZGl4IGZvciBDaGFwdGVyIDU6IERlbW9jcmF0aXphdGlvbiBTY29yZXMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQotLS0NCg0KIyBUYWJsZSBCLjE6IEluZGl2aWR1YWwgRWZmZWN0cyBvZiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBGcmVlZG9tIEhvdXNlIHNjb3Jlcw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeShybXMpDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIHNwZWNpZnkgdmVjdG9yIHdpdGggY29udHJvbCB2YXJzDQpjb250cm9sdmFycyA8LSBjKCJsb2coYWlkZGF0YV9BaWRHRFApIiwNCiAgICAgICAgICAgICAgICAgImxvZyhHRFBfcGVyX2NhcGl0YSkiLA0KICAgICAgICAgICAgICAgICAibG9nKHBvcHVsYXRpb24pIiwNCiAgICAgICAgICAgICAgICAgImNvbmZfaW50ZW5zIiwgDQogICAgICAgICAgICAgICAgICJub25zdGF0ZSIsDQogICAgICAgICAgICAgICAgICJXQm5hdHJlcyIsDQogICAgICAgICAgICAgICAgICJmaCIpDQoNCiMjIyMgUG93ZXItU2hhcmluZyBvbmx5IE1vZGVscyAjIyMjDQoNCiMgUFMgb25seSArIGNhYmluZXRDT1VOVA0KbW9kZWxfcHMgPC0gb2xzKGZvcm11bGEocGFzdGUwKCJmaF90MiB+IGNhYmluZXRDT1VOVCArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjb250cm9sdmFycywgY29sbGFwc2UgPSAiICsgIikpKSwNCiAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHMgPC0gcm9iY292KG1vZGVsX3BzLCBkaXNzX2RmJEdXTm8pDQoNCiMgUFMgb25seSArIHNlbmlvckNPVU5UDQptb2RlbF9zZW5pb3JDT1VOVCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gc2VuaW9yQ09VTlQgKyAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoY29udHJvbHZhcnMsIGNvbGxhcHNlID0gIiArICIpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIHggPSBULCB5ID0gVCkNCm1vZGVsX3NlbmlvckNPVU5UIDwtIHJvYmNvdihtb2RlbF9zZW5pb3JDT1VOVCwgZGlzc19kZiRHV05vKQ0KDQojIFBTIG9ubHkgKyBub25zZW5pb3JDT1VOVA0KbW9kZWxfbm9uc2VuaW9yQ09VTlQgPC0gb2xzKGZvcm11bGEocGFzdGUwKCJmaF90MiB+IG5vbnNlbmlvckNPVU5UICsgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKGNvbnRyb2x2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9ub25zZW5pb3JDT1VOVCA8LSByb2Jjb3YobW9kZWxfbm9uc2VuaW9yQ09VTlQsIGRpc3NfZGYkR1dObykNCg0KIyMjIyBBaWQtb25seSBNb2RlbHMgIyMjIw0KDQojIERHQQ0KbW9kZWxfZ292X2FpZCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gY2FiaW5ldENPVU5UICsgbG9nKGRnYV9nZHBfemVybyArIDEpICsgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoY29udHJvbHZhcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9nb3ZfYWlkIDwtIHJvYmNvdihtb2RlbF9nb3ZfYWlkLCBkaXNzX2RmJEdXTm8pDQoNCiMgUHJvZ3JhbSBBaWQNCm1vZGVsX3Byb2dyYW1fYWlkIDwtIG9scyhmb3JtdWxhKHBhc3RlMCgiZmhfdDIgfiBjYWJpbmV0Q09VTlQgKyBsb2cocHJvZ3JhbV9haWRfZ2RwX3plcm8gKyAxKSArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjb250cm9sdmFycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcHJvZ3JhbV9haWQgPC0gcm9iY292KG1vZGVsX3Byb2dyYW1fYWlkLCBkaXNzX2RmJEdXTm8pDQoNCiMgQnVkZ2V0IEFpZA0KbW9kZWxfY29tbW9kaXR5X2FpZCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gY2FiaW5ldENPVU5UICsgbG9nKGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gKyAxKSArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKGNvbnRyb2x2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfY29tbW9kaXR5X2FpZCA8LSByb2Jjb3YobW9kZWxfY29tbW9kaXR5X2FpZCwgZGlzc19kZiRHV05vKQ0KDQoNCiMgT3V0cHV0IG1hbnVzY3JpcHQNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0KDQojIGN1c3RvbV90ZXhyZWcobCA9IGxpc3QobW9kZWxfcHMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3NlbmlvckNPVU5ULCANCiMgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9ub25zZW5pb3JDT1VOVCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZ292X2FpZCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJvZ3JhbV9haWQsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2NvbW1vZGl0eV9haWQpLCANCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9pbmRfZWZmZWN0c19maC50ZXgiLA0KIyAgICAgICAgICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMSwgOSwgMTAsIDExOjEzLCAyOjgpLA0KIyAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSBjKCJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbiAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdC4gcmVzLiByZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoc2VuaW9yKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChub25zZW5pb3IpIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhY3kgQWlkL0dEUCAobG9nKSIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQvR0RQIChsb2cpIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkL0dEUCAobG9nKSIpLA0KIyAgICAgICAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRkFMU0UsIA0KIyAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgICAgIGdyb3VwcyA9IGxpc3QoIlBvd2VyLVNoYXJpbmciID0gMTozLCAiQWlkIiA9IDQ6NywgIkNvbnRyb2xzIiAgPSA4OjEzKSwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgIyBhZGQubGluZXMgPSBsaXN0KGMoIkNvbnRyb2xzIiwgcmVwKCJcXG11bHRpY29sdW1uezF9e2N9e1llc30iLCA2KSkpLCANCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGNlbnRlciA9IFRSVUUsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQojICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme1Bvd2VyLVNoYXJpbmd9fSAmIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme0ZvcmVpZ24gQWlkfX0gXFxcXCBcXGNtaWRydWxlKHIpezItNH0gXFxjbWlkcnVsZShsKXs1LTd9ICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eygzKSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDUpICAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNikgICB9IikpDQojIE91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQoNCmh0bWxyZWcobCA9IGxpc3QobW9kZWxfcHMsIA0KICAgICAgICAgICAgICAgICBtb2RlbF9zZW5pb3JDT1VOVCwgDQogICAgICAgICAgICAgICAgIG1vZGVsX25vbnNlbmlvckNPVU5ULCANCiAgICAgICAgICAgICAgICAgbW9kZWxfZ292X2FpZCwgDQogICAgICAgICAgICAgICAgIG1vZGVsX3Byb2dyYW1fYWlkLCANCiAgICAgICAgICAgICAgICAgbW9kZWxfY29tbW9kaXR5X2FpZCksIA0KICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDksIDEwLCAxMToxMywgMjo4KSwNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQogICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgcC9jIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0LiByZXMuIHJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhY3kgQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW0gQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGdldCBBaWQvR0RQIChsb2cpIiksDQogICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KICAgICAgICB0YWJsZSA9IEZBTFNFLCANCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgY2VudGVyID0gVFJVRSwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCiMgVGFibGUgQi4yOiBUZW1wb3JhbCBEeW5hbWljcyBmb3IgdGhlIEludGVyYWN0aW9uIEVmZmVjdCBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgYW5kIEZvcmVpZ24gYWlkIG9uIERlbW9jcmFjeSBTY29yZQ0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkobGZlKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KDQojIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgUHJlcGFyZSBkYXRhIGZyYW1lIGZvciBtdWx0aXBsZSBwbG90cw0KcG9saXR5X3ZhcnMgPC0gbGlzdCgNCiAgcG9saXR5Ml90MSA9IGRpc3NfZGYsDQogIHBvbGl0eTJfdDIgPSBkaXNzX2RmLCANCiAgcG9saXR5Ml90MyA9IGRpc3NfZGYsIA0KICBwb2xpdHkyX3Q0ID0gZGlzc19kZiwgDQogIHBvbGl0eTJfdDUgPSBkaXNzX2RmLCANCiAgZmhfdDEgPSBkaXNzX2RmLA0KICBmaF90MiA9IGRpc3NfZGYsIA0KICBmaF90MyA9IGRpc3NfZGYsIA0KICBmaF90NCA9IGRpc3NfZGYsIA0KICBmaF90NSA9IGRpc3NfZGYNCikNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIGxpc3QgY29sdW1uDQpwb2xpdHlfdmFycyA8LSBlbmZyYW1lKHBvbGl0eV92YXJzKQ0KDQojIGRlZmluZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBldmVyeSBkYXRhIGZyYW1lIGluIHRoZSBsaXN0IGNvbHVtbg0KbWFpbl9tb2RlbCA8LSBmdW5jdGlvbihsZWFkX3R5cGUsIGRhdGEpIHsNCiAgZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEpDQogIGRhdGEkbGVhZF92YXIgPC0gZGF0YVssIGdyZXAobGVhZF90eXBlLCBuYW1lcyhkYXRhKSwgdmFsdWUgPVQpXQ0KICAgDQogIGlmKGdyZXBsKCJmaCIsIGxlYWRfdHlwZSkpIHsNCiAgICAgIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGEpDQogICAgcmV0dXJuKG1vZGVsKQ0KICB9IGVsc2Ugew0KICAgIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgfCAwIHwgMCB8IEdXTm8sDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgICByZXR1cm4obW9kZWwpDQogIH0NCn0NCg0KDQojIGZpdCBtb2RlbHMgJiBwb3N0LXByb2Nlc3MgZGF0YSBmb3IgcGxvdHRpbmcNCm1vZGVsX2FsbCA8LSBwb2xpdHlfdmFycyAlPiUgDQogIG11dGF0ZShtb2RlbCA9IG1hcDIobmFtZSwgdmFsdWUsIH4gbWFpbl9tb2RlbCgueCwgLnkpKSkgDQoNCiMgb3V0cHV0IGZvciBtYW51c2NyaXB0DQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCiMgDQojIGN1c3RvbV90ZXhyZWcobW9kZWxfYWxsJG1vZGVsLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L3RlbXBfZHluYW1pY3NfZGVtb2NfYXBwLnRleCIsDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULCANCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCwgMTApLA0KIyAgICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLXNoYXJpbmcgKGJpbmFyeSkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbiAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdC4gcmVzLiByZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb2xpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItc2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJlZWRvbSBIb3VzZSIpLA0KIyAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgIHRhYmxlID0gRkFMU0UsIA0KIyAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IEYsIA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGKQ0KDQojIG91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQpodG1scmVnKG1vZGVsX2FsbCRtb2RlbCwNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwgDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICBjZW50ZXIgPSBUUlVFLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMSwgMiwgOSwgMzo4LCAxMCksDQogICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1zaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IGludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXQuIHJlcy4gcmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvbGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItc2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZWVkb20gSG91c2UiKSwNCiAgICAgICAgb21pdC5jb2VmID0gIkludGVyY2VwdCIsDQogICAgICAgIHRhYmxlID0gRkFMU0UsIA0KICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULCANCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KDQpgYGANCg0KDQoNCiMgVGFibGUgQi4zOiBUZWNobmljYWwgUm9idXN0bmVzcyBDaGVja3MgSTogT3V0bGllciBUZXN0IGFuZCBYUE9MSVRZIGFuZCBJbnRlcnJlZ251bSBCaWFzIENvcnJlY3Rpb24NCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyeQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyMjIyMgT3V0bGllciAjIyMjIw0KDQojIExvYWQgb3V0bGllciBmdW5jdGlvbg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9vdXRsaWVyX2FuYWx5c2lzLlIiKQ0KDQojIEVzdGltYXRlIGJhc2VsaW5lIG1vZGVsDQptb2RlbF9wb2xpdHlfY2FiY291bnQgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBzZWxlY3RvciB2YXJpYWJsZXMNCnNlbGVjdHZhcnMgPSBjKCJMb2NhdGlvbiIsICJ5ZWFyIiwgImlkZW50aWZpZXJzIikNCmRpc3NfZGYkaWRlbnRpZmllcnMgPC0gcGFzdGUoZGlzc19kZiRHV05vLCBkaXNzX2RmJHllYXIsIHNlcCA9ICItIikNCg0KIyBFc3RpbWF0ZSBvdXRsaWVycw0KZGVtb2Nfb3V0bGllcnMgPC0gY2hlY2tfb3V0bGllcihtb2RlbF9wb2xpdHlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0dmFycyA9IHNlbGVjdHZhcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVydmFyID0gIkdXTm8iKQ0KDQojIyMjIFhQT0xJVFkgJiBJbnRlcnJlZ251bSBCaWFzICMjIyMNCg0KIyBGaXJzdCBsb2FkIHJlZ3VsYXIgUGx1bXBlciAmIE5ldW1heWVyIGNvcnJlY3Rpb24NCmxvYWQoIi4vZGF0YS9wb2xpdHkyX3hwb2xpdHlfcGx1bXBlcl9jb3JyZWN0ZWQucmRhdGEiKQ0KbmFtZXMocG9saXR5X3JldilbMl0gPC0gIkdXTm8iDQoNCiMgRml4IFNlcmJpYSBmb3IgY29ycmVjdCBtZXJnaW5nDQpwb2xpdHlfcmV2JEdXTm8gPC0gaWZlbHNlKHBvbGl0eV9yZXYkY291bnRyeSA9PSAiWXVnb3NsYXZpYSIsIDM0NSwgcG9saXR5X3JldiRHV05vKQ0KcG9saXR5X3JldiRHV05vIDwtIGlmZWxzZShwb2xpdHlfcmV2JGNvdW50cnkgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsIDM0NSwgcG9saXR5X3JldiRHV05vKQ0KDQpwb2xpdHlfcmV2X29yaWcgPC0gcG9saXR5X3Jldg0KDQoNCiMgU2Vjb25kIGxvYWQgeHBvbGl0eSBjb21iaW5lZCB3aXRoIFBsdW1wZXIgJiBOZXVtYXllciBjb3JyZWN0aW9uDQpsb2FkKCIuL2RhdGEvcG9saXR5Ml94cG9saXR5X3BsdW1wZXJfY29ycmVjdGVkX2NvbWJpbmVkLnJkYXRhIikNCm5hbWVzKHBvbGl0eV9yZXYpWzJdIDwtICJHV05vIg0KDQojIEZpeCBTZXJiaWENCnBvbGl0eV9yZXYkR1dObyA8LSBpZmVsc2UocG9saXR5X3JldiRjb3VudHJ5ID09ICJZdWdvc2xhdmlhIiwgMzQ1LCBwb2xpdHlfcmV2JEdXTm8pDQpwb2xpdHlfcmV2JEdXTm8gPC0gaWZlbHNlKHBvbGl0eV9yZXYkY291bnRyeSA9PSAiU2VyYmlhIGFuZCBNb250ZW5lZ3JvIiwgMzQ1LCBwb2xpdHlfcmV2JEdXTm8pDQoNCg0KcG9saXR5X3JldiA8LSBsZWZ0X2pvaW4ocG9saXR5X3Jldl9vcmlnLCBwb2xpdHlfcmV2WywgYygiR1dObyIsICJ5ZWFyIiwgInhwb2xpdHlfaW50ZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhwb2xpdHlfbWF4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4cG9saXR5X21pbiIpXSwgDQogICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIkdXTm8iLCAieWVhciIpKQ0KDQojIG1lcmdlIHhwb2xpdHkgJiBpbnRlcnJlZ251bSBkYXRhIGluIG1haW4gZGF0YSBzZXQNCnRlc3RkZiA8LSBtZXJnZShkaXNzX2RmLCBwb2xpdHlfcmV2WywgYygiR1dObyIsICJ5ZWFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9saXR5Mm1pbiIsICJwb2xpdHkybWF4IiwgInBvbGl0eTJpbnRlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHBvbGl0eV9pbnRlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhwb2xpdHlfbWF4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHBvbGl0eV9taW4iKV0sIGJ5ID0gYygiR1dObyIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KDQoNCiMgRGF0YSB0cmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9sYWdnZWRWYXIuUiIpDQoNCiMjIyMgRm9yIFBsdW1wZXIgJiBOZXVtYXllciBjb3JyZWN0aW9uDQoNCiMgUG9saXR5IDIgTWluDQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0icG9saXR5Mm1pbiIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIFBvbGl0eTIgTWF4DQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0icG9saXR5Mm1heCIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIFBvbGl0eTIgSW50ZXINCnRlc3RkZiA8LSBsYWdnZWRWYXIodGVzdGRmLCBwb2xpdHlfcmV2LCBsVmFyPSJwb2xpdHkyaW50ZXIiLCB0SUQgPSJ5ZWFyIiwgZ0lEPSJHV05vIiwgbGFnQnkgPSAtMikNCg0KIyMjIyBYUE9MSVRZDQoNCiMgeHBvbGl0eSBtaW4NCnRlc3RkZiA8LSBsYWdnZWRWYXIodGVzdGRmLCBwb2xpdHlfcmV2LCBsVmFyPSJ4cG9saXR5X21pbiIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIHhwb2xpdHkgbWF4DQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0ieHBvbGl0eV9tYXgiLCB0SUQgPSJ5ZWFyIiwgZ0lEPSJHV05vIiwgbGFnQnkgPSAtMikNCg0KIyB4cG9saXR5IGludGVyDQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0ieHBvbGl0eV9pbnRlciIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQoNCiMjIFJ1biBYUE9MSVRZICYgSW50ZXJyZWdudW0gQmlhcyBtb2RlbHMNCg0KIyB4cG9saXR5IG1pbg0KbW9kZWxfeHBvbF9taW4gPC0gb2xzKHhwb2xpdHlfbWluX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9taW4sDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF94cG9sX21pbiA8LSByb2Jjb3YobW9kZWxfeHBvbF9taW4sIHRlc3RkZiRHV05vKQ0KDQoNCiMgeHBvbGl0eSBtaW4NCm1vZGVsX3hwb2xfbWF4IDwtIG9scyh4cG9saXR5X21heF90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UIDogYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhwb2xpdHlfbWF4LA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3hwb2xfbWF4IDwtIHJvYmNvdihtb2RlbF94cG9sX21heCwgdGVzdGRmJEdXTm8pDQoNCg0KIyB4cG9saXR5IGludGVyDQptb2RlbF94cG9sX2ludGVyIDwtIG9scyh4cG9saXR5X2ludGVyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9pbnRlciwNCiAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3hwb2xfaW50ZXIgPC0gcm9iY292KG1vZGVsX3hwb2xfaW50ZXIsIHRlc3RkZiRHV05vKQ0KDQojIE1vZGVscyBmb3IgUGx1bXBlciAmIE5ldW1heWVyIChpbnRlcnJlZ251bSBiaWFzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBwb2xpdHkgMiBtaW4NCm1vZGVsX3BjaG5nX3AybWluIDwtIG9scyhwb2xpdHkybWluX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsgDQogICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgcG9saXR5Mm1pbiwNCiAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF9wY2huZ19wMm1pbiA8LSByb2Jjb3YobW9kZWxfcGNobmdfcDJtaW4sIHRlc3RkZiRHV05vKQ0KDQojIHBvbGl0eSAyIG1heA0KbW9kZWxfcGNobmdfcDJtYXggPC0gb2xzKHBvbGl0eTJtYXhfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA6IGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkybWF4ICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF9wY2huZ19wMm1heCA8LSByb2Jjb3YobW9kZWxfcGNobmdfcDJtYXgsIHRlc3RkZiRHV05vKQ0KDQojIHBvbGl0eSAyIGludGVycG9sYXRlZA0KbW9kZWxfcGNobmdfcDJpbnRlciA8LSBvbHMocG9saXR5MmludGVyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MmludGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3BjaG5nX3AyaW50ZXIgPC0gcm9iY292KG1vZGVsX3BjaG5nX3AyaW50ZXIsIHRlc3RkZiRHV05vKQ0KDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCg0KIyMgRGV0ZXJtaW5lIG9yZGVyIG9mIGNvZWZmaWNpZW50cyBpbiBvdXRwdXQgdGFibGUNCm5hbWVfbWFwX3JvYnVzdG5lc3MgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUFMgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RQX3Blcl9jYXBpdGEgPSAiR0RQIHAvYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyID0gIlBvbGl0eSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTJpbnRlciA9ICJQb2xpdHkgKEludGVycG9sYXRlZCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkybWF4ID0gIlBvbGl0eSAoTWF4KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTJtaW4gPSAiUG9saXR5IChNaW4pIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9pbnRlciA9ICJYUE9MSVRZIChJbnRlcnBvbGF0ZWQpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9tYXggPSAiWFBPTElUWSAoTWF4KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwb2xpdHlfbWluID0gIlhQT0xJVFkgKE1pbikiKQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL3dpbGxfbG93ZV90ZXhyZWdfcmVvcmRlci5SIikNCg0KIyBNb2RlbCBsaXN0DQphcHBfcm9iX21vZGVscyA8LSBsaXN0KGRlbW9jX291dGxpZXJzW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBkZW1vY19vdXRsaWVyc1tbNF1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGVtb2Nfb3V0bGllcnNbWzZdXSwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BjaG5nX3AyaW50ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wY2huZ19wMm1heCwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BjaG5nX3AybWluLCANCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfeHBvbF9pbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3hwb2xfbWF4LCANCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfeHBvbF9taW4pDQoNCm9sZG5hbWVzIDwtIGFsbC52YXJuYW1lcy5kYW1taXQoYXBwX3JvYl9tb2RlbHMpDQpyb3IgPC0gYnVpbGQucm9yKG9sZG5hbWVzLCBuYW1lX21hcF9yb2J1c3RuZXNzKQ0KDQojIHRleHJlZw0KIyB0ZXhyZWcobCA9IGFwcF9yb2JfbW9kZWxzLA0KIyAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2RlbW9jX2FwcF90ZWNoX3JvYnVzdG5lc3MudGV4IiwNCiMgICAgICAgICAjIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBFTEYiLA0KIyAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFBLTyIsDQojICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiaW5ldCBTaXplIiwNCiMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIig0KSBSYW5kb20gRWZmZWN0cyIsDQojICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgUmVnaW9uIEZFIiwNCiMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBDb3VudHJ5IEZFIiksDQojICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSByb3IkY2NuLCANCiMgICAgICAgICBvbWl0LmNvZWYgPSByb3Ikb2MsIA0KIyAgICAgICAgIHJlb3JkZXIuY29lZiA9IHVuaXF1ZShyb3IkcmMpLA0KIyAgICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KDQojIFJlcGxpY2F0aW9uIEFyY2hpdmUgb3V0cHV0DQpodG1scmVnKGwgPSBhcHBfcm9iX21vZGVscywNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSByb3IkY2NuLCANCiAgICAgICAgb21pdC5jb2VmID0gcm9yJG9jLCANCiAgICAgICAgcmVvcmRlci5jb2VmID0gdW5pcXVlKHJvciRyYyksDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRikNCg0KDQpgYGANCg0KDQojIFRhYmxlIEIuNDogVGVjaG5pY2FsIFJvYnVzdG5lc3MgQ2hlY2tzIElJOiBCaW5hcnkgRFYsIFRpbWUgVHJlbmRzLCBhbmQgUG93ZXItU2hhcmluZyBBZ2dyZWdhdGlvbg0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJ5DQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRleHJlZykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgQmluYXJ5IERWIA0KbW9kZWxfcG9saW5jIDwtIGxybShwb2xfaW5jIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiArICBwY3kgKyBwY3kyICsgcGN5MyAsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGluYyA8LSByb2Jjb3YobW9kZWxfcG9saW5jLCBkaXNzX2RmJEdXTm8pDQoNCiMgVGltZSBUcmVuZA0KbW9kZWxfcG9saXR5X3RpbWUgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGN5ICsgcGN5MiArIHBjeTMsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGl0eV90aW1lIDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfdGltZSwgZGlzc19kZiRHV05vKQ0KDQojIHllYXIgRkUNCmRpc3NfZGYkeWVhckZFIDwtIGFzLmZhY3RvcihkaXNzX2RmJHllYXIpDQptb2RlbF9wb2xpdHlfeWVhcmZlIDwtIG9scyhwb2xpdHkyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiArDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyRkUsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGl0eV95ZWFyZmUgPC0gcm9iY292KG1vZGVsX3BvbGl0eV95ZWFyZmUsIGRpc3NfZGYkR1dObykNCg0KIyBkaWZmZXJlbnQgY2FiaW5ldCBhZ2dyZWdhdGlvbiB0eXBlcw0KbW9kZWxfcG9saXR5X2NhYm1heCA8LSBvbHMocG9saXR5Ml90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVF9tYXggKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYm1heCA8LSByb2Jjb3YobW9kZWxfcG9saXR5X2NhYm1heCwgZGlzc19kZiRHV05vKQ0KDQptb2RlbF9wb2xpdHlfY2FibWluIDwtIG9scyhwb2xpdHkyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UX21pbiAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9wb2xpdHlfY2FibWluIDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfY2FibWluLCBkaXNzX2RmJEdXTm8pDQoNCg0KbW9kZWxfcG9saXR5X2NhYnNpeCA8LSBvbHMocG9saXR5Ml90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVF9zaXggKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYnNpeCA8LSByb2Jjb3YobW9kZWxfcG9saXR5X2NhYnNpeCwgZGlzc19kZiRHV05vKQ0KDQoNCiMgbGlzdCBtb2RlbHMNCg0KdGVjaF9yb2JfbW9kZWxzIDwtIGxpc3QobW9kZWxfcG9saW5jLCBtb2RlbF9wb2xpdHlfdGltZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wb2xpdHlfeWVhcmZlLCBtb2RlbF9wb2xpdHlfY2FibWF4LCANCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BvbGl0eV9jYWJtaW4sIG1vZGVsX3BvbGl0eV9jYWJzaXgpDQoNCmNvZWZfbWFwIDwtIGxpc3QoY2FiaW5ldENPVU5UID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWF4ID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWluID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfc2l4ID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVF9tYXggKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UX21pbiAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlRfc2l4ICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICBHRFBfcGVyX2NhcGl0YSA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW9uID0gIlBvcHVsYXRpb24iLA0KICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwgDQogICAgICAgICAgICAgICAgICAgcGN5ID0gIlRpbWUiLCANCiAgICAgICAgICAgICAgICAgICBwY3kyID0gIlRpbWUkXjIkIiwgDQogICAgICAgICAgICAgICAgICAgcGN5MyA9ICJUaW1lJF4zJCIpDQoNCiMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgDQojIHRleHJlZyh0ZWNoX3JvYl9tb2RlbHMsIA0KIyAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbWFwLCANCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2RlbW9jX2FwcF90ZWNoX3JvYnVzdG5lc3MyLnRleCIsIA0KIyAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBMb2dpdDogQmluYXJ5IERWIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIE9MUzogQ3ViaWMgVGltZSBUcmVuZCIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBPTFM6IFllYXIgRkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig0KSBQUzogTWF4IiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIFBTOiBNaW4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUFM6IFNpeCBNb250aHMiKSwNCiMgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCg0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKHRlY2hfcm9iX21vZGVscywgDQogICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbWFwLCANCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIExvZ2l0OiBCaW5hcnkgRFYiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIE9MUzogQ3ViaWMgVGltZSBUcmVuZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgT0xTOiBZZWFyIEZFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFBTOiBNYXgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIFBTOiBNaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDYpIFBTOiBTaXggTW9udGhzIiksDQogICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQoNCmBgYA0KDQoNCiMgVGFibGUgQi41OiBNYXRjaGluZyBUYWJsZXMgYW5kIEJhbGFuY2UgRGlhZ25vc3RpY3MNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgQmFsYW5jZSBkaWFnbm9zdGljcyAodGFibGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoTWF0Y2hJdCkNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KbGlicmFyeSh4dGFibGUpDQoNCiMgTG9hZCBkYXRhIA0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBzZWxlY3QgcmVsZXZhbnQgdmFyaWFibGVzDQptYXRjaF9kZW1vY19kYXRhIDwtIGRpc3NfZGYgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGNhYmluZXRJTkMsIGNhYmluZXRDT1VOVCwgc2VuaW9ySU5DLA0KICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULCBub25zZW5pb3JJTkMsIG5vbnNlbmlvckNPVU5ULA0KICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQLCBwb3B1bGF0aW9uLCBub25zdGF0ZSwNCiAgICAgICAgICAgICAgICBXQm5hdHJlcywgZmgsIEdEUF9wZXJfY2FwaXRhLCBjb25mX2ludGVucywNCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiwgDQogICAgICAgICAgICAgICAgR1dObywgeWVhciwgDQogICAgICAgICAgICAgICAgcG9saXR5X2NobmcsIHBvbGl0eTIsIHBvbGl0eTJfdDIsICMgY2hlY2sgDQogICAgICAgICAgICAgICAgZmgsIGZoX2NobmcsIGZoX3QyLA0KICAgICAgICAgICAgICAgIHBjX3BlcmlvZCwgTG9jYXRpb24sIGxuX3BvcCwgbG5fZ2RwX3BjKQ0KDQojIGtlZXAgb25seSBjb21wbGV0ZSBjYXNlcyAobmVjZXNzYXJ5IGZvciBtYXRjaGluZykNCm1hdGNoX2RlbW9jX2RhdGEgPC0gbWF0Y2hfZGVtb2NfZGF0YVtjb21wbGV0ZS5jYXNlcyhtYXRjaF9kZW1vY19kYXRhKSwgXQ0KDQojIGdlbmVyYXRlIHByZXRyZWF0bWVudCBjb250cm9sczogY29udHJvbCB2YXJpYWJsZXMgaW4gZmlyc3QgcG9zdC1jb25mbGljdCB5ZWFyDQptYXRjaF9kZW1vY19kYXRhIDwtIG1hdGNoX2RlbW9jX2RhdGEgJT4lIA0KICBhcnJhbmdlKEdXTm8sIHBjX3BlcmlvZCwgeWVhcikgJT4lIA0KICBncm91cF9ieShHV05vLCBwY19wZXJpb2QpICU+JSANCiAgbXV0YXRlKG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuID0gZmlyc3QoYWlkZGF0YV9BaWRHRFBfbG4pLA0KICAgICAgICAgbWF0Y2hfcG9wID0gZmlyc3QocG9wdWxhdGlvbiksDQogICAgICAgICBtYXRjaF9nZHAgPSBmaXJzdChHRFBfcGVyX2NhcGl0YSksDQogICAgICAgICBtYXRjaF9ub25zdGF0ZSA9IGZpcnN0KG5vbnN0YXRlKSwNCiAgICAgICAgIG1hdGNoX1dCbmF0cmVzID0gZmlyc3QoV0JuYXRyZXMpLA0KICAgICAgICAgbWF0Y2hfcG9saXR5ID0gZmlyc3QocG9saXR5MiksIA0KICAgICAgICAgbWF0Y2hfZmggPSBmaXJzdChmaCkpDQoNCiMgZXhwbGljaXRseSBjb252ZXJ0IHRvIGRhdGEgZnJhbWUNCm1hdGNoX2RlbW9jX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShtYXRjaF9kZW1vY19kYXRhKQ0KDQoNCiMgUGVyZm9ybSBtYXRjaGluZyBhbGdvcml0aG0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnNldC5zZWVkKDEyMykNCm1hdGNoX2RlbW9jX3JlcyA8LSBtYXRjaGl0KGNhYmluZXRJTkMgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArICMgY29uZl9pbnRlbnMgaXMgYWxyZWFkeSBwcmUtdHJlYXRtZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX25vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcG9saXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5lYXJlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1hdGNoX2RlbW9jX2RhdGEpDQoNCiMgZXh0cmFjdCBkYXRhDQptYXRjaF9kZW1vY19kZiA8LSBtYXRjaC5kYXRhKG1hdGNoX2RlbW9jX3JlcykNCg0KIyBJbWJhbGFuY2UgUmVkdWN0aW9uIFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBUaGlzIHNlY3Rpb24gY3JlYXRlcyB0aGUgbWF0Y2hpbmcgZGlhZ25vc3RpY3M6IEZpcnN0IHRoZSBpbWJhbGFuY2UgcmVkdWN0aW9uIGFzDQojIHRhYmxlcyBpbmNsdWRpbmcgdGhlIHQtdGVzdCBhbmQgSy1TIHRlc3QgZm9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0cmVhdGVkDQojIGFuZCBjb250cm9sLiBBbmQgYWxzbyBhIGJhbGFuY2UgaW1wcm92bWVudCBwbG90LiANCg0KIyBGaXJzdDogdGhlIGltYmFsYW5jZSByZWR1Y3Rpb24gdGFibGVzIGJlZm9yZSBhbmQgYWZ0ZXIgbWF0Y2hpbmcuDQpsaWJyYXJ5KGViYWwpDQoNCiMgYmVmb3JlIG1hdGNoaW5nDQppbWJfYmVmb3JlIDwtIE1hdGNoaW5nOjpNYXRjaEJhbGFuY2UoY2FiaW5ldElOQyB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArICMgY29uZl9pbnRlbnMgaXMgYWxyZWFkeSBwcmUtdHJlYXRtZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX25vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcG9saXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtYXRjaF9kZW1vY19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IFQsIHByaW50LmxldmVsID0gMCkgIyBkYXRhIGJlZm9yZSBtYXRjaGluZw0KDQojIG5vdGUgdGhhdCBvcmRlciBvZiBjb3ZhcmlhdGVzIGluIE1hdGNoQmFsYW5jZSBpcyBpbXBvcnRhbnQgdG8gZ2V0IHJvdyBuYW1lcyByaWdodA0KaW1iYWxhbmNlX3RhYl9iZWZvcmUgPC0gZWJhbDo6YmFsdGVzdC5jb2xsZWN0KGltYl9iZWZvcmUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCAvIFBDIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2ltZSBUeXBlIChQb2xpdHkpIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gRikNCiMgZG8gbm90IHJlcG9ydCBhbGwgc3RhdGlzdGljcw0KaW1iYWxhbmNlX3RhYl9iZWZvcmUgPC0gaW1iYWxhbmNlX3RhYl9iZWZvcmVbLCBjKCJtZWFuLlRyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW4uQ28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVCBwdmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktTIHB2YWwiKV0NCg0KY29sbmFtZXMoaW1iYWxhbmNlX3RhYl9iZWZvcmUpIDwtICBjKCJNZWFuIFRyZWF0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhbiBDb250cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgVC1UZXN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgSy1TIFRlc3QiKQ0KDQojIEltYmFsYW5jZSBBZnRlciBNYXRjaGluZw0KaW1iX2FmdGVyIDwtIE1hdGNoaW5nOjpNYXRjaEJhbGFuY2UoY2FiaW5ldElOQyB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgIyBjb25mX2ludGVucyBpcyBhbHJlYWR5IHByZS10cmVhdG1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9ub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9wb2xpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGVtb2NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IFQsIHByaW50LmxldmVsID0gMCkgIyBkYXRhIGJlZm9yZSBtYXRjaGluZw0KDQojIG5vdGUgdGhhdCBvcmRlciBvZiBjb3ZhcmlhdGVzIGluIE1hdGNoQmFsYW5jZSBpcyBpbXBvcnRhbnQgdG8gZ2V0IHJvdyBuYW1lcyByaWdodA0KaW1iYWxhbmNlX3RhYl9hZnRlcjwtIGViYWw6OmJhbHRlc3QuY29sbGVjdChpbWJfYWZ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJBaWQgLyBHRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQIC8gUEMgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoUG9saXR5KSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBGKQ0KaW1iYWxhbmNlX3RhYl9hZnRlciA8LSBpbWJhbGFuY2VfdGFiX2FmdGVyWywgYygibWVhbi5UciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVhbi5DbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVCBwdmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUyBwdmFsIildDQoNCmNvbG5hbWVzKGltYmFsYW5jZV90YWJfYWZ0ZXIpIDwtIGMoIk1lYW4gVHJlYXRlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhbiBDb250cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQLVZhbHVlIFQtVGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1WYWx1ZSBLLVMgVGVzdCIpDQoNCg0KIyBCYWxhbmNlIHRhYmxlcyBiZWZvcmUgLyBhZnRlciBvdXRwdXQNCg0KIyBvdXRwdXQgaW1iYWxhbmNlIHRhYmxlcw0KIyBwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAibGF0ZXgiLCBmbG9hdGluZyA9IEYsDQojICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L21hdGNoaW5nX2ltYmFsYW5jZV9yZWR1Y3Rpb25fZGVtb2NfYmVmb3JlLnRleCIpDQojIHByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImxhdGV4IiwgZmxvYXRpbmcgPSBGLA0KIyAgICAgICBmaWxlID0gIi4uL291dHB1dC9tYXRjaGluZ19pbWJhbGFuY2VfcmVkdWN0aW9uX2RlbW9jX2FmdGVyLnRleCIpDQoNCiMgb3V0cHV0IGltYmFsYW5jZSB0YWJsZXMgZnJvIHJlcGxpY2F0aW9uIGFyY2hpdmUNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2JlZm9yZSksIGJvb2t0YWJzID0gVCwgdHlwZSA9ICJodG1sIikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImh0bWwiKQ0KDQoNCmBgYA0KDQoNCg0KDQojIFRhYmxlIEIuNjogRmlyc3QgU3RhZ2UgYW5kIFJlZHVjZWQgRm9ybSBSZXN1bHRzDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIGxvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoaXZwYWNrKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KGxmZSkNCmxpYnJhcnkocm1zKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KDQojIGxvYWQgZGF0YSB3aXRoIGluc3RydW1lbnQ7IHRoaXMgZ2l2ZXMgImluc3RydW1lbnRfZGYiIGRhdGEgZnJhbWUNCmxvYWQoZmlsZSA9ICIuL2RhdGEvaW5zdHJ1bWVudGVkQWlkMi5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmX2l2IDwtIG1lcmdlKGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiaXNvMmMiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpDQoNCg0KIyBzdWJzZXQgb25seSBjb21wbGV0ZS5jYXNlcyAvIG5lY2Vzc2FyeSBmb3IgY2x1c3Rlci5yb2J1c3Quc2UoKQ0KaXZfbmEgPC0gbmEub21pdChkaXNzX2RmX2l2WywgYygicG9saXR5X2NobmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkUENfbG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZoX3QyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQX3Blcl9jYXBpdGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mX2ludGVucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQm5hdHJlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2xpdHkyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvbGl0eTJfdDIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbF9zdW1fZXhjZXB0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllYXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1dObyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25zdGF0ZSIpXSkNCg0KIyB0byBwcm9jZWVkIHdpdGggSVYgZXN0aW1hdGlvbiBJIGZpcnN0IGhhcmQtY29kZSB0aGUgaW5zdHJ1bWVudA0KaXZfbmEkaW5zdHJfYWlkX2dkcF9sbiA8LSBsb2coaXZfbmEkdG90YWxfc3VtX2V4Y2VwdCAvIGl2X25hJEdEUCkNCg0KIyBkYXRhIHRyYW5zZm9ybWF0aW9uIGZvciBTdGF0YQ0KaXZfbmEkbG5fZ2RwX3BjIDwtIGxvZyhpdl9uYSRHRFBfcGVyX2NhcGl0YSkNCml2X25hJGxuX3BvcCA8LSBsb2coaXZfbmEkcG9wdWxhdGlvbikNCg0KDQojIEZpcnN0IFN0YWdlIFJlc3VsdHMNCml2X2ZzX2FpZCA8LSBvbHMoYWlkZGF0YV9BaWRHRFBfbG4gfg0KICAgICAgICAgICAgICAgICAgIGxvZyh0b3RhbF9zdW1fZXhjZXB0IC8gR0RQKSArIA0KICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gaXZfbmEsIHggPSBULCB5ID0gVCkNCg0KaXZfZnNfYWlkIDwtIHJvYmNvdihpdl9mc19haWQsIGl2X25hJEdXTm8pDQoNCiMgSVYgKiBjYWJpbmV0Q09VTlQgPT4gYWlkICogY2FiaW5ldENPVU5UDQppdl9mc19haWRpbnRlcmFjdGlvbiA8LSBvbHMoYWlkZGF0YV9BaWRHRFBfbG4gKiBjYWJpbmV0Q09VTlQgfg0KICAgICAgICAgICAgICAgICAgIGxvZyh0b3RhbF9zdW1fZXhjZXB0IC8gR0RQKSAqIA0KICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gaXZfbmEsIHggPSBULCB5ID0gVCkNCg0KaXZfZnNfYWlkaW50ZXJhY3Rpb24gPC0gcm9iY292KGl2X2ZzX2FpZGludGVyYWN0aW9uLCBpdl9uYSRHV05vKQ0KDQoNCiMgcmVkdWNlZCBmb3JtOiBQb2xpdHkNCnJlZHVjZWRfZm9ybV9wb2xpdHkgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2codG90YWxfc3VtX2V4Y2VwdCAvIEdEUCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWl2X25hLCB4PVQsIHk9VCkNCnJlZHVjZWRfZm9ybV9wb2xpdHkgPC0gcm9iY292KHJlZHVjZWRfZm9ybV9wb2xpdHksIGl2X25hJEdXTm8pDQoNCiMgcmVkdWNlZCBmb3JtOiBGcmVlZG9tIEhvdXNlDQpyZWR1Y2VkX2Zvcm1fZmggPC0gb2xzKGZoX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHRvdGFsX3N1bV9leGNlcHQgLyBHRFApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9aXZfbmEsIHg9VCwgeT1UKQ0KcmVkdWNlZF9mb3JtX2ZoIDwtIHJvYmNvdihyZWR1Y2VkX2Zvcm1fZmgsIGl2X25hJEdXTm8pDQoNCg0KIyBPdXRwdXQ6IGNyZWF0ZSB2YXJpYWJsZSBsaXN0IG9yZGVyDQoNCm5hbWVfbWFwIDwtIGxpc3QodG90YWxfc3VtX2V4Y2VwdCA9ICJBaWQvR0RQIChJbnN0cnVtZW50ZWQpIiwNCiAgICAgICAgICAgICAgICAgInRvdGFsX3N1bV9leGNlcHQgKiBjYWJpbmV0Q09VTlQiICA9ICJBaWQvR0RQIChJbnN0cnVtZW50ZWQpICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogdG90YWxfc3VtX2V4Y2VwdCIgID0gIkFpZC9HRFAgKEluc3RydW1lbnRlZCkgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICJsb2coR0RQX3Blcl9jYXBpdGEpIiA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiIsDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsDQogICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUmVnaW1lIFR5cGUgKFBvbGl0eSkiLA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiKQ0KDQojIE91dHB1dCBmb3IgTWFudXNjcmlwdA0KIyB0ZXhyZWcobCA9IGxpc3QoaXZfZnNfYWlkLCANCiMgICAgICAgICAgICAgICAgICBpdl9mc19haWRpbnRlcmFjdGlvbiwgDQojICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtX3BvbGl0eSwgDQojICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtX2ZoKSwNCiMgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcCwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2l2X2RlbW9jX2ZpcnN0c3RhZ2VfcmVkdWNlZC50ZXgiLA0KIyAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBEVjogQWlkIiwgIigyKSBBaWQgKiBQUyBJbnRlcmFjdGlvbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBSZWR1Y2VkIEZvcm0gLSBQb2xpdHkiLCAiKDQpIFJlZHVjZWQgRm9ybSAtIEZIIiksDQojICAgICAgICAgYm9va3RhYnMgPSBULA0KIyAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZpZQ0KaHRtbHJlZyhsID0gbGlzdChpdl9mc19haWQsIA0KICAgICAgICAgICAgICAgICBpdl9mc19haWRpbnRlcmFjdGlvbiwgDQogICAgICAgICAgICAgICAgIHJlZHVjZWRfZm9ybV9wb2xpdHksIA0KICAgICAgICAgICAgICAgICByZWR1Y2VkX2Zvcm1fZmgpLA0KICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcCwNCiAgICAgICAgY2FwdGlvbiA9ICIiLCANCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIERWOiBBaWQiLCAiKDIpIEFpZCAqIFBTIEludGVyYWN0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBSZWR1Y2VkIEZvcm0gLSBQb2xpdHkiLCAiKDQpIFJlZHVjZWQgRm9ybSAtIEZIIiksDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRikNCg0KYGBgDQoNCg==