Figure 6.3: Marginal Effect Plots for the Interaction between Foreign Aid and Power-Sharing
# Libraries
library(tidyverse)
library(rms)
library(tikzDevice)
# load data
load("./data/nelda_ps.rda")
# Reestimate Models
# Models NELDA
model_aidps_quality_cabinc <- ols(quality ~
aid_ln *
cabinetINC.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabinc <- robcov(model_aidps_quality_cabinc, nelda_ps$country)
model_aidps_quality_cabcount <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)
# Plot ME
source("./functions/interaction_plots.R")
# Output for manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/interaction_aidpselections.tex", height = 3.5)
# par(mfrow=c(1,3),
# mar = c(4, 5, 4, 2),
# cex.lab = 1.1,
# cex.axis = 0.9,
# mgp = c(3, 0.7, 0))
#
# interaction_plot_continuous(model_aidps_quality_cabcount,
# "cabinetCOUNT.12",
# "aid_ln",
# "aid_ln * cabinetCOUNT.12",
# title = "",
# ylab = "Marginal effect of Power-Sharing (cabinet) \n on Election Quality ",
# xlab = "a) Aid / GDP (Log)\n",
# add_median_effect = T,
#
# conf = .90)
#
# interaction_plot_continuous(model_aidps_quality_cabcount,
# "aid_ln",
# "cabinetCOUNT.12",
# "aid_ln * cabinetCOUNT.12",
# title = "",
# xlab = "\n Power-Sharing (cabinet) - \nNumber of rebel seats",
# ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
# conf = .90)
#
# interaction_plot_binary(model_aidps_quality_cabinc,
# "aid_ln",
# "cabinetINC.12",
# "aid_ln * cabinetINC.12",
# title = "",
# xlab = "\n Power-Sharing (cabinet) - \nBinary",
# ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
# conf = .90)
#
# dev.off()
# Output for Replication Archive:
par(mfrow=c(1,3),
mar = c(4, 5, 4, 2),
cex.lab = 1.1,
cex.axis = 0.9,
mgp = c(3, 0.7, 0))
interaction_plot_continuous(model_aidps_quality_cabcount,
"cabinetCOUNT.12",
"aid_ln",
"aid_ln * cabinetCOUNT.12",
title = "",
ylab = "Marginal effect of Power-Sharing (cabinet) \n on Election Quality ",
xlab = "a) Aid / GDP (Log)\n",
add_median_effect = T,
conf = .90)
interaction_plot_continuous(model_aidps_quality_cabcount,
"aid_ln",
"cabinetCOUNT.12",
"aid_ln * cabinetCOUNT.12",
title = "",
xlab = "\n Power-Sharing (cabinet) - \nNumber of rebel seats",
ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
conf = .90)
interaction_plot_binary(model_aidps_quality_cabinc,
"aid_ln",
"cabinetINC.12",
"aid_ln * cabinetINC.12",
title = "",
xlab = "\n Power-Sharing (cabinet) - \nBinary",
ylab = "Estimated marginal coefficient of\n Aid / GDP (log)",
conf = .90)

Figure 6.3: Model Predictions for the Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality
# Libraries
library(tidyverse)
library(rms)
# Load Data
load("./data/nelda_ps.rda")
# Estimate Model
datadist_nelda <- datadist(nelda_ps); options(datadist='datadist_nelda')
model_aidps_quality_cabcount <- ols(v2xel_frefair ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)
# Generate Predictions
prediction_nelda <- Predict(model_aidps_quality_cabcount,
cabinetCOUNT.12 = c(0, 10), # no / much power-sharing
aid_ln = seq(-6, 3.9, 0.1),
fh = 3.57,
WBnatres = 7.860124) # range of aid
# generate plot
ME_aidps_interaction_nelda <- ggplot(data.frame(prediction_nelda),
aes(x = exp(aid_ln),
y = yhat,
group = as.factor(cabinetCOUNT.12))) +
geom_line( color = "black", size = 1) +
geom_ribbon(aes(ymax = upper,
ymin = lower,
fill = as.factor(cabinetCOUNT.12)),
alpha = 0.7) +
scale_fill_manual(values = c("#b3cde3", "#e41a1c"),
name = "Number of Rebels \nin the Power-Sharing Coalition:") +
theme_bw() +
theme(text = element_text(size=8)) +
labs(x = "Aid / GDP",
y = "Election Quality") +
theme(legend.position = "bottom")
prediction_nelda_ps <- Predict(model_aidps_quality_cabcount,
cabinetCOUNT.12 = seq(0, 10, 1),
aid_ln = c(0, 3.4),
fh = 3.57,
WBnatres = 7.860124)
prediction_nelda_ps$aid_ln <- round(exp(prediction_nelda_ps$aid_ln), 0)
meplot_aidps_nelda_interaction_ps <- ggplot(data.frame(prediction_nelda_ps),
aes(x = cabinetCOUNT.12,
y = yhat,
group = as.factor(aid_ln))) +
geom_line( color = "black", size = 1) +
geom_ribbon(aes(ymax = upper,
ymin = lower,
fill = as.factor(aid_ln)),
alpha = 0.7) +
scale_x_continuous(breaks = seq(0, 10, 2)) +
scale_fill_manual(values = c("#b3cde3", "#e41a1c"),
name = "Aid in per cent of GDP:") +
theme_bw() +
theme(text = element_text(size=8)) +
labs(x = "Power-Sharing (No. of Rebel Seats)",
y = "Election Quality") +
theme(legend.position = "bottom")
# Outut Manuscript
# options( tikzDocumentDeclaration = "\\documentclass[11pt]{article}" )
# tikz("../figures/aidps_elections_ME.tex", height = 4.5, width = 6.5)
# grid.arrange(meplot_aidps_nelda_interaction_ps,
# ME_aidps_interaction_nelda,
# nrow = 1)
# dev.off()
# Output Replication Archive
gridExtra::grid.arrange(meplot_aidps_nelda_interaction_ps,
ME_aidps_interaction_nelda,
nrow = 1)

Table 6.1: Individual Effects of Power-Sharing and Foreign Aid on Post-Conflict Election Quality
# Libraries
library(rms)
library(texreg)
# Load data
load("./data/nelda_ps.rda")
## Models NELDA (V-Dem Models see Appendix)
model_ps_quality_cabcount <- ols(quality ~
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_quality_cabcount <- robcov(model_ps_quality_cabcount, nelda_ps$country)
model_ps_quality_seniorcount <- ols(quality ~
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_quality_seniorcount <- robcov(model_ps_quality_seniorcount, nelda_ps$country)
model_ps_quality_nonseniorcount <- ols(quality ~
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_quality_nonseniorcount <- robcov(model_ps_quality_nonseniorcount, nelda_ps$country)
# Models Aid
# DGA
model_dga_quality <- ols(quality ~
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_quality <- robcov(model_dga_quality, nelda_ps$country)
# program aid
model_prog_aid_quality <- ols(quality ~
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_quality <- robcov(model_prog_aid_quality, nelda_ps$country)
# budget aid
model_budgetaid_quality <- ols(quality ~
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_quality <- robcov(model_budgetaid_quality, nelda_ps$country)
# individual effects model list
ind_effect_models <- list(model_ps_quality_cabcount,
model_ps_quality_seniorcount,
model_ps_quality_nonseniorcount,
model_dga_quality,
model_prog_aid_quality,
model_budgetaid_quality)
# Output
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)")
# Get number of clusters
source("./functions/extract_ols_custom.R")
# Output Manuscript
# texreg(l = ind_effect_models,
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# file = "../output/aid_ps_indeff_elections.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 Replication Archive
htmlreg(l = ind_effect_models,
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.12*
|
|
|
0.10+
|
0.11*
|
0.13*
|
|
(0.05)
|
|
|
(0.05)
|
(0.05)
|
(0.05)
|
Power-Sharing (senior)
|
|
0.42**
|
|
|
|
|
|
|
(0.14)
|
|
|
|
|
Power-Sharing (nonsenior)
|
|
|
0.15*
|
|
|
|
|
|
|
(0.07)
|
|
|
|
Aid/GDP (log)
|
-0.08
|
-0.09
|
-0.07
|
-0.12
|
-0.18*
|
-0.14
|
|
(0.09)
|
(0.09)
|
(0.09)
|
(0.09)
|
(0.09)
|
(0.09)
|
DGA/GDP (log)
|
|
|
|
0.47
|
|
|
|
|
|
|
(0.38)
|
|
|
Program Aid / GDP (log)
|
|
|
|
|
0.36
|
|
|
|
|
|
|
(0.42)
|
|
Budget Aid / GDP (log
|
|
|
|
|
|
0.31
|
|
|
|
|
|
|
(0.27)
|
Nat. Res. Rents
|
-0.03+
|
-0.03*
|
-0.02
|
-0.03+
|
-0.03+
|
-0.03*
|
|
(0.01)
|
(0.02)
|
(0.01)
|
(0.02)
|
(0.02)
|
(0.01)
|
Regime Type (FH)
|
0.31*
|
0.29+
|
0.32*
|
0.28+
|
0.31*
|
0.27+
|
|
(0.15)
|
(0.15)
|
(0.16)
|
(0.16)
|
(0.16)
|
(0.15)
|
Nonstate Conflict
|
-2.52**
|
-2.47**
|
-2.56**
|
-2.48**
|
-2.46**
|
-2.55**
|
|
(0.83)
|
(0.82)
|
(0.84)
|
(0.81)
|
(0.82)
|
(0.88)
|
Conflict Intensity
|
-0.68
|
-0.65
|
-0.66
|
-0.72
|
-0.78+
|
-0.77
|
|
(0.49)
|
(0.47)
|
(0.50)
|
(0.49)
|
(0.46)
|
(0.50)
|
Population (log)
|
0.06
|
0.07
|
0.06
|
0.09
|
0.09
|
0.09
|
|
(0.22)
|
(0.21)
|
(0.22)
|
(0.21)
|
(0.22)
|
(0.22)
|
GDP p/c (log)
|
-0.24
|
-0.22
|
-0.25
|
-0.18
|
-0.13
|
-0.18
|
|
(0.24)
|
(0.24)
|
(0.24)
|
(0.25)
|
(0.30)
|
(0.24)
|
Num. obs.
|
142
|
142
|
142
|
142
|
142
|
142
|
Countries
|
41
|
41
|
41
|
41
|
41
|
41
|
Adj. R2
|
0.17
|
0.19
|
0.16
|
0.18
|
0.17
|
0.18
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 6.2: The Interactive Effect of Aid and Power-Sharing on Election Quality
# Libraries
library(rms)
# Load data
load("./data/nelda_ps.rda")
# nelda_ps <- filter(nelda_ps, country != "Bosnia-Herzegovina")
# Models NELDA
model_aidps_quality_cabinc <- ols(quality ~
aid_ln *
cabinetINC.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabinc <- robcov(model_aidps_quality_cabinc, nelda_ps$country)
model_aidps_quality_cabcount <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount <- robcov(model_aidps_quality_cabcount, nelda_ps$country)
# Model Vdem
model_aidps_vdem_cabinc <- ols(v2xel_frefair ~
aid_ln *
cabinetINC.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_vdem_cabinc <- robcov(model_aidps_vdem_cabinc, nelda_ps$country)
model_aidps_vdem_cabcount <- ols(v2xel_frefair ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_vdem_cabcount <- robcov(model_aidps_vdem_cabcount, nelda_ps$country)
# Output
int_eff_model_list <- list(model_aidps_quality_cabinc,
model_aidps_quality_cabcount,
model_aidps_vdem_cabinc,
model_aidps_vdem_cabcount)
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')
# custom_texreg(l = int_eff_model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# file = "../output/aidps_elections_interaction_mainresults.tex",
# symbol = "+",
# table = F,
# booktabs = T,
# custom.multicol = T,
# custom.model.names = c(" \\multicolumn{2}{c}{\\textbf{NELDA Election Quality}} &
# \\multicolumn{2}{c}{\\textbf{V-Dem Clean Elections Index}} \\\\
# \\cmidrule(r){2-3} \\cmidrule(r){4-5}
# & \\multicolumn{1}{c}{(1) }",
# "\\multicolumn{1}{c}{(2) }",
# "\\multicolumn{1}{c}{(3) }",
# "\\multicolumn{1}{c}{(4) }"),
# use.packages = F,
# dcolumn = T,
# include.lr = F,
# include.cluster = T,
# include.rsquared = F,
# include.adjrs = T)
htmlreg(l = int_eff_model_list,
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.cluster = T,
include.rsquared = F,
include.adjrs = T,
caption = "",
star.symbol = "\\*")
|
Model 1
|
Model 2
|
Model 3
|
Model 4
|
Power-Sharing (binary)
|
-2.97**
|
|
-0.24*
|
|
|
(1.12)
|
|
(0.11)
|
|
Power-Sharing (binary) * Aid
|
1.49***
|
|
0.17***
|
|
|
(0.43)
|
|
(0.04)
|
|
Power-Sharing (cabinet)
|
|
-0.22*
|
|
-0.04*
|
|
|
(0.09)
|
|
(0.02)
|
Power-Sharing (cabinet) * Aid
|
|
0.12***
|
|
0.02***
|
|
|
(0.04)
|
|
(0.01)
|
Aid/GDP (log)
|
-0.12
|
-0.08
|
-0.02+
|
-0.01
|
|
(0.08)
|
(0.09)
|
(0.01)
|
(0.01)
|
Nat. Res. Rents
|
-0.03*
|
-0.03*
|
-0.01***
|
-0.01***
|
|
(0.01)
|
(0.02)
|
(0.00)
|
(0.00)
|
Regime Type (FH)
|
0.33*
|
0.29+
|
0.09***
|
0.08***
|
|
(0.15)
|
(0.15)
|
(0.02)
|
(0.02)
|
Nonstate Conflict
|
-2.48**
|
-2.46**
|
-0.25***
|
-0.24***
|
|
(0.80)
|
(0.80)
|
(0.05)
|
(0.05)
|
Conflict Intensity
|
-0.47
|
-0.58
|
0.02
|
0.01
|
|
(0.45)
|
(0.49)
|
(0.05)
|
(0.07)
|
Population (log)
|
0.08
|
0.07
|
0.03*
|
0.02
|
|
(0.21)
|
(0.21)
|
(0.01)
|
(0.01)
|
GDP p/c (log)
|
-0.20
|
-0.18
|
0.02
|
0.02
|
|
(0.23)
|
(0.25)
|
(0.02)
|
(0.02)
|
Num. obs.
|
142
|
142
|
141
|
141
|
Countries
|
41
|
41
|
41
|
41
|
Adj. R2
|
0.21
|
0.18
|
0.53
|
0.49
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 6.3: Probing Mechanisms II: Aid Cut-Offs, Election Monitors, and Post-Conflict Election Quality
# Libraries
library(rms)
library(plm)
library(countrycode)
# load data
load("./data/nelda_ps.rda")
# aid cutoffs
model_aidps_aidcutoff <- ols(quality ~
aid_ln +
nelda57 * # aid cutoff
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_aidcutoff <- robcov(model_aidps_aidcutoff, nelda_ps$country)
# election monitors
model_aidps_elmons <- ols(quality ~
aid_ln +
nelda45 * # aid cutoff
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_elmons <- robcov(model_aidps_elmons, nelda_ps$country)
# aid cutoffs
model_aidps_aidcutoff_vdem <- ols(v2xel_frefair ~
aid_ln +
nelda57 * # aid cutoff
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_aidcutoff_vdem <- robcov(model_aidps_aidcutoff_vdem, nelda_ps$country)
# election monitors
model_aidps_elmons_vdem <- ols(v2xel_frefair ~
aid_ln +
nelda45 * # election monitors
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps, x = T, y = T)
model_aidps_elmons_vdem <- robcov(model_aidps_elmons_vdem, nelda_ps$country)
# Output
model_list <- list(model_aidps_aidcutoff,
model_aidps_elmons,
model_aidps_aidcutoff_vdem,
model_aidps_elmons_vdem)
coef_name_map <- list( cabinetINC.12 = "Power-Sharing (binary)",
cabinetCOUNT.12 = "Power-Sharing (cabinet)",
nelda57 = "Aid Cut-Off",
"nelda57 * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid Cut-Off",
nelda45 = "Election Monitors",
"nelda45 * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Election Monitors",
"aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid",
"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')
#
# custom_texreg(l = model_list,
# stars = c(0.001, 0.01, 0.05, 0.1),
# file = "../output/aidcutoff_elmon_elections.tex",
# custom.coef.map = coef_name_map,
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# custom.multicol = T,
# custom.model.names = c(" \\multicolumn{2}{c}{\\textbf{NELDA Election Quality}} &
# \\multicolumn{2}{c}{\\textbf{V-Dem Clean Elections Index}} \\\\
# \\cmidrule(r){2-3} \\cmidrule(r){4-5}
# & \\multicolumn{1}{c}{(1) }",
# "\\multicolumn{1}{c}{(2) }",
# "\\multicolumn{1}{c}{(3) }",
# "\\multicolumn{1}{c}{(4) }"),
# dcolumn = T,
# include.lr = F,
# include.rsquared = F,
# include.adjrs = T,
# include.cluster = T)
htmlreg(l = model_list,
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
|
Power-Sharing (cabinet)
|
0.11*
|
0.48
|
0.02*
|
0.02
|
|
(0.05)
|
(0.63)
|
(0.01)
|
(0.09)
|
Aid Cut-Off
|
-0.41
|
|
-0.02
|
|
|
(0.83)
|
|
(0.09)
|
|
Power-Sharing (cabinet) * Aid Cut-Off
|
1.43**
|
|
0.15**
|
|
|
(0.47)
|
|
(0.05)
|
|
Election Monitors
|
|
0.57
|
|
0.03
|
|
|
(0.71)
|
|
(0.05)
|
Power-Sharing (cabinet) * Election Monitors
|
|
-0.36
|
|
0.00
|
|
|
(0.63)
|
|
(0.09)
|
Aid/GDP (log)
|
-0.09
|
-0.10
|
-0.01
|
-0.01
|
|
(0.08)
|
(0.09)
|
(0.01)
|
(0.01)
|
Nat. Res. Rents
|
-0.03+
|
-0.03+
|
-0.01***
|
-0.01***
|
|
(0.01)
|
(0.01)
|
(0.00)
|
(0.00)
|
Regime Type (FH)
|
0.32*
|
0.35*
|
0.09***
|
0.09***
|
|
(0.15)
|
(0.17)
|
(0.02)
|
(0.02)
|
Nonstate Conflict
|
-2.60**
|
-2.27**
|
-0.26***
|
-0.24***
|
|
(0.90)
|
(0.87)
|
(0.05)
|
(0.05)
|
Conflict Intensity
|
-0.76
|
-0.67
|
-0.01
|
-0.01
|
|
(0.49)
|
(0.50)
|
(0.07)
|
(0.07)
|
Population (log)
|
0.08
|
0.02
|
0.02
|
0.02
|
|
(0.22)
|
(0.18)
|
(0.01)
|
(0.02)
|
GDP p/c (log)
|
-0.29
|
-0.28
|
0.01
|
0.01
|
|
(0.24)
|
(0.24)
|
(0.02)
|
(0.03)
|
Num. obs.
|
142
|
142
|
141
|
141
|
Countries
|
41
|
41
|
41
|
41
|
Adj. R2
|
0.17
|
0.16
|
0.46
|
0.45
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 6.4: Robustness Checks and Alternative Specifications for the Interaction Effect of Aid and Power-Sharing on Election Quality
# Libraries
library(rms)
library(plm)
library(countrycode)
library(texreg)
# load data
load("./data/nelda_ps.rda")
# Ethnic Fractionalization
model_aidps_quality_cabcount_elf <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population) +
Ethnic
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_elf <- robcov(model_aidps_quality_cabcount_elf, nelda_ps$country)
# PKO
model_aidps_quality_cabcount_pko <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population) +
DS_ordinal
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_pko <- robcov(model_aidps_quality_cabcount_pko, nelda_ps$country)
# cabinet size
library(readxl)
cnts <- read_excel("./data/CNTSDATA.xls")
DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00 DEFINEDNAME: 21 00 00 01 0b 00 00 00 01 00 00 00 00 00 00 0d 3b 00 00 00 00 e5 3b 00 00 c1 00
cnts <- cnts %>% filter(year >= 1989)
cnts$iso3c <- countrycode(cnts$country, "country.name", "iso3c")
cnts <- cnts %>% filter(country != "SOMALILAND")
testcabsize <- left_join(nelda_ps, cnts[, c("iso3c", "year", "polit10")])
testcabsize$ps_share <- testcabsize$cabinetCOUNT / testcabsize$polit10 * 100
model_el_cabshare <- ols(quality ~
aid_ln *
ps_share +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = testcabsize, x = T, y = T)
model_el_cabshare <- robcov(model_el_cabshare, testcabsize$country)
# Was Incumbent contested: nelda20
nelda_ps <- as.data.frame(nelda_ps)
nelda_ps$nelda20 <- ifelse(nelda_ps$nelda20 == "yes", 1, 0)
inc_contested <- nelda_ps %>%
filter(nelda20 == 1)
inc_notcontested <- nelda_ps %>%
filter(nelda20 == 0)
inc_contested_model <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = inc_contested, x = T, y = T)
inc_contested_model <- robcov(inc_contested_model, inc_contested$country)
inc_notcontested_model <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = inc_notcontested, x = T, y = T)
inc_notcontested_model <- robcov(inc_notcontested_model, inc_notcontested$country)
# Type of Election
model_aidps_quality_cabcount_eltype <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population) +
types
,
data = nelda_ps, x = T, y = T)
model_aidps_quality_cabcount_eltype <- robcov(model_aidps_quality_cabcount_eltype, nelda_ps$country)
# Random Effects
countryre_aidps_quality_cabcount <- plm(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps,
index = c("country", "electionid"),
model = "random")
series nelda16, nelda23notes, nelda41notes, nelda42notes, longenough, Item, newconflictinyearv412, onset5v412, onset8v412, onset20v412, bothgovterrv412 are constants and have been removed
countryre_aidps_quality_cabcount$vcov <- vcovHC(countryre_aidps_quality_cabcount)
# Region FE
nelda_ps$region_fe <- countrycode(nelda_ps$country, "country.name", "region")
regionfe_aidps_quality_cabcount <- ols(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)+
region_fe
,
data = nelda_ps, y = T, x = T)
regionfe_aidps_quality_cabcount <- robcov(regionfe_aidps_quality_cabcount, nelda_ps$country)
# Country FE
countryfe_aidps_quality_cabcount <- plm(quality ~
aid_ln *
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
,
data = nelda_ps,
index = c("country", "electionid"),
model = "within")
series nelda16, nelda23notes, nelda41notes, nelda42notes, longenough, Item, newconflictinyearv412, onset5v412, onset8v412, onset20v412, bothgovterrv412 are constants and have been removed
countryfe_aidps_quality_cabcount$vcov <- vcovHC(countryfe_aidps_quality_cabcount)
# Output
# First: create model list
rob_election_modellist <- list(model_aidps_quality_cabcount_elf,
model_aidps_quality_cabcount_pko,
model_el_cabshare,
inc_contested_model,
inc_notcontested_model,
# model_aidps_quality_cabcount_eltype,
countryre_aidps_quality_cabcount,
regionfe_aidps_quality_cabcount)
coef_name_map <- list(cabinetINC.12 = "Power-Sharing (binary)",
cabinetCOUNT.12 = "Power-Sharing (cabinet)",
"aid_ln:cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid",
"aid_ln * cabinetCOUNT.12" = "Power-Sharing (cabinet) * Aid",
ps_share = "Power-Sharing (cabinet share)",
"aid_ln * ps_share" = "Power-Sharing (cabinet share) * Aid",
aid_ln = "Aid/GDP (log)",
WBnatres = "Nat. Res. Rents",
fh = "Regime Type (FH)",
nonstate = "Nonstate Conflict",
conf_intens = "Conflict Intensity",
population = "Population (log)",
"log(population)" = "Population (log)",
gdp_per_capita_un = "GDP p/c (log)",
"log(gdp_per_capita_un)" = "GDP p/c (log)",
Ethnic = "Ethnic Fractionalization",
DS_ordinal = "UN PKO",
nelda45 = "Election Monitors",
types = "Type of Election")
source("./functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")
# Output Manuscript
texreg(rob_election_modellist,
stars = c(0.001, 0.01, 0.05, 0.1),
custom.coef.map = coef_name_map,
file = "../output/aidps_elections_interaction_robustness.tex",
symbol = "+",
table = F,
booktabs = T,
custom.model.names = c("(1) ELF",
"(2) UN PKO",
"(3) Cab. Size",
"(4) Inc. Contest.",
"(5) Inc. Not Cont.",
"(6) RE",
"(6) Region FE" ),
use.packages = F,
dcolumn = T,
include.lr = F,
include.adjrs = T,
caption = "",
star.symbol = "\\*",
include.rsquared = F,
include.cluster = T,
include.variance = F)
# Output Replication Archive
texreg::htmlreg(rob_election_modellist,
stars = c(0.001, 0.01, 0.05, 0.1),
custom.coef.map = coef_name_map,
symbol = "+",
table = F,
custom.model.names = c("(1) ELF",
"(2) UN PKO",
"(3) Cab. Size",
"(4) Inc. Contest.",
"(5) Inc. Not Cont.",
"(6) RE",
"(6) Region FE" ),
booktabs = T,
use.packages = F,
dcolumn = T,
include.lr = F,
include.adjrs = T,
caption = "",
star.symbol = "\\*",
include.rsquared = F,
include.cluster = T,
include.variance = F)
|
(1) ELF
|
(2) UN PKO
|
(3) Cab. Size
|
(4) Inc. Contest.
|
(5) Inc. Not Cont.
|
(6) RE
|
(6) Region FE
|
Power-Sharing (cabinet)
|
-0.18+
|
-0.17+
|
|
-0.11
|
-0.33**
|
-0.27*
|
-0.21+
|
|
(0.11)
|
(0.09)
|
|
(0.11)
|
(0.12)
|
(0.12)
|
(0.11)
|
Power-Sharing (cabinet) * Aid
|
0.09*
|
0.09*
|
|
0.10**
|
0.15**
|
0.12*
|
0.10**
|
|
(0.04)
|
(0.04)
|
|
(0.04)
|
(0.05)
|
(0.05)
|
(0.04)
|
Power-Sharing (cabinet share)
|
|
|
-0.05+
|
|
|
|
|
|
|
|
(0.02)
|
|
|
|
|
Power-Sharing (cabinet share) * Aid
|
|
|
0.03**
|
|
|
|
|
|
|
|
(0.01)
|
|
|
|
|
Aid/GDP (log)
|
-0.16+
|
-0.09
|
-0.04
|
-0.18
|
0.02
|
-0.02
|
-0.09
|
|
(0.08)
|
(0.09)
|
(0.10)
|
(0.12)
|
(0.09)
|
(0.11)
|
(0.10)
|
Nat. Res. Rents
|
-0.04***
|
-0.03+
|
-0.02
|
-0.04*
|
-0.03+
|
-0.01
|
-0.04**
|
|
(0.01)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.02)
|
(0.01)
|
Regime Type (FH)
|
0.26+
|
0.32*
|
0.19
|
0.44*
|
0.24
|
0.35+
|
0.33*
|
|
(0.14)
|
(0.16)
|
(0.20)
|
(0.21)
|
(0.16)
|
(0.18)
|
(0.16)
|
Nonstate Conflict
|
-2.86**
|
-2.46**
|
-1.99*
|
-1.07
|
-3.59***
|
-2.99***
|
-3.02***
|
|
(1.03)
|
(0.80)
|
(0.94)
|
(1.15)
|
(0.47)
|
(0.75)
|
(0.81)
|
Conflict Intensity
|
-0.70
|
-0.78
|
-0.61
|
-0.65
|
-0.67
|
-0.63
|
-0.07
|
|
(0.45)
|
(0.51)
|
(0.52)
|
(0.55)
|
(0.56)
|
(0.67)
|
(0.52)
|
Population (log)
|
-0.01
|
0.07
|
0.21
|
-0.09
|
0.30
|
-0.08
|
-0.01
|
|
(0.14)
|
(0.21)
|
(0.25)
|
(0.22)
|
(0.19)
|
(0.19)
|
(0.18)
|
GDP p/c (log)
|
-0.29
|
-0.16
|
-0.00
|
-0.36
|
-0.15
|
-0.21
|
-0.32
|
|
(0.24)
|
(0.24)
|
(0.33)
|
(0.30)
|
(0.26)
|
(0.33)
|
(0.31)
|
Ethnic Fractionalization
|
2.69***
|
|
|
|
|
|
|
|
(0.68)
|
|
|
|
|
|
|
UN PKO
|
|
0.17
|
|
|
|
|
|
|
|
(0.19)
|
|
|
|
|
|
Num. obs.
|
142
|
142
|
114
|
74
|
68
|
142
|
142
|
Countries
|
41
|
41
|
36
|
41
|
34
|
41
|
41
|
Adj. R2
|
0.31
|
0.19
|
0.10
|
0.13
|
0.22
|
0.40
|
0.36
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 6.5: Matching Results for the Interactive Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality
# Libraries
library(rms)
library(texreg)
# Load matched data set
load("./data/nelda_ps_matched.rda")
match_df_elec_reg$aid_ln <- log(match_df_elec_reg$aiddata_AidGDP)
# NELDA
model_matched_aidps_cabINC_nelda <- rms::ols(quality ~
aid_ln * cabinetINC.12 +
log(gdp_per_capita_un) +
log(population) +
conf_intens +
# nonstate +
WBnatres +
fh,
data = match_df_elec_reg ,
x = T , y = T)
model_matched_aidps_cabINC_nelda <- robcov(model_matched_aidps_cabINC_nelda , match_df_elec_reg$country)
# cabinetINC * Aid; V-Dem
model_matched_aidps_cabINC_vdem <- rms::ols(v2xel_frefair ~
aid_ln * cabinetINC.12 +
log(gdp_per_capita_un) +
log(population) +
conf_intens +
# nonstate +
WBnatres +
fh ,
data = match_df_elec_reg ,
x = T , y = T)
model_matched_aidps_cabINC_vdem <- robcov(model_matched_aidps_cabINC_vdem , match_df_elec_reg$country)
# Output
matched_election_modellist <- list(model_matched_aidps_cabINC_nelda,
model_matched_aidps_cabINC_vdem)
coef_name_map <- list(cabinetINC.12 = "Power-Sharing (binary)",
"aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid",
ps_share = "Power-Sharing (cabinet share)",
aid_ln = "Aid/GDP (log)",
WBnatres = "Nat. Res. Rents",
fh = "Regime Type (FH)",
nonstate = "Nonstate Conflict",
conf_intens = "Conflict Intensity",
population = "Population (log)",
"log(population)" = "Population (log)",
gdp_per_capita_un = "GDP p/c (log)",
"log(gdp_per_capita_un)" = "GDP p/c (log)",
Ethnic = "Ethnic Fractionalization",
DS_ordinal = "UN PKO",
nelda45 = "Election Monitors",
types = "Type of Election")
source("./functions/extract_ols_custom.R")
# texreg(matched_election_modellist,
# file = "../output/matched_results_elections.tex",
# stars = c(0.001, 0.01, 0.05, 0.1),
# custom.coef.map = coef_name_map,
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# custom.model.names = c("(1) NELDA", "(2) V-Dem"),
# dcolumn = T,
# include.lr = F,
# include.adjrs = T,
# caption = "",
# star.symbol = "\\*",
# include.rsquared = F,
# include.cluster = T,
# include.variance = F)
texreg::htmlreg(matched_election_modellist,
stars = c(0.001, 0.01, 0.05, 0.1),
custom.coef.map = coef_name_map,
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
custom.model.names = c("(1) NELDA", "V-Dem"),
dcolumn = T,
include.lr = F,
include.adjrs = T,
caption = "",
star.symbol = "\\*",
include.rsquared = F,
include.cluster = T,
include.variance = F)
|
(1) NELDA
|
V-Dem
|
Power-Sharing (binary)
|
-2.30*
|
-0.16+
|
|
(1.08)
|
(0.08)
|
Power-Sharing (binary) * Aid
|
1.11*
|
0.13***
|
|
(0.46)
|
(0.03)
|
Aid/GDP (log)
|
0.18
|
-0.00
|
|
(0.39)
|
(0.04)
|
Nat. Res. Rents
|
-0.02
|
-0.00
|
|
(0.02)
|
(0.00)
|
Regime Type (FH)
|
0.16
|
0.10+
|
|
(0.37)
|
(0.05)
|
Conflict Intensity
|
-1.75***
|
-0.02
|
|
(0.51)
|
(0.08)
|
Population (log)
|
0.58*
|
0.04+
|
|
(0.29)
|
(0.02)
|
GDP p/c (log)
|
0.12
|
0.03
|
|
(0.59)
|
(0.06)
|
Num. obs.
|
72
|
72
|
Countries
|
26
|
26
|
Adj. R2
|
0.18
|
0.33
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Table 6.6 Instrumental Variable Results for the Interactive Effect of Foreign Aid and Power-Sharing on Post-Conflict Election Quality
# Libraries
library(tidyverse)
library(lfe)
# 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
# hard code interactions for felm
nelda_ivreg$cabXaid_instr <- nelda_ivreg$cabinetCOUNT.12 * nelda_ivreg$instr_aid_gdp
nelda_ivreg$cabXaid <- nelda_ivreg$cabinetCOUNT.12 * nelda_ivreg$aid_ln
# Models
model_iv_aidps_nelda <- felm(quality ~
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
| 0 | (cabXaid_instr | aid_ln ~ cabXaid + instr_aid_gdp ) | country, data = nelda_ivreg)
# V-Dem
model_iv_aidps_vdem <- felm(v2xel_frefair ~
cabinetCOUNT.12 +
WBnatres +
fh +
nonstate +
conf_intens +
log(gdp_per_capita_un) +
log(population)
| 0 | (cabXaid_instr | aid_ln ~ cabXaid + instr_aid_gdp ) | country, data = nelda_ivreg)
# Output
model_list <- list(model_iv_aidps_nelda,
model_iv_aidps_vdem)
# coef name map
coef_name_map <- list(cabinetCOUNT.12 = "Power-Sharing (cabinet)",
"`aid_ln(fit)`" = "Aid / GDP (instrumented)",
"`cabXaid_instr(fit)`" = "Power-Sharing (cabinet) * Aid (instrumented)",
"aid_ln * cabinetINC.12" = "Power-Sharing (binary) * Aid",
aid_ln = "Aid/GDP (log)",
WBnatres = "Nat. Res. Rents",
fh = "Regime Type (FH)",
nonstate = "Nonstate Conflict",
conf_intens = "Conflict Intensity",
population = "Population (log)",
"log(population)" = "Population (log)",
gdp_per_capita_un = "GDP p/c (log)",
"log(gdp_per_capita_un)" = "GDP p/c (log)")
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# Output Manuscript
# custom_texreg(model_list,
# custom.coef.map = coef_name_map,
# file = "../output/iv_results_elections.tex",
# add.lines = list(c("Kleibergen-Paap rk Wald F statistic",
# "17.50",
# "17.50"),
# c("Adj. R$^2$",
# round(summary(model_iv_aidps_nelda)$adj.r.squared, 2),
# round(summary(model_iv_aidps_vdem)$adj.r.squared, 2)),
# c("Countries",
# length(unique(nelda_ivreg$country)),
# length(unique(nelda_ivreg$country)))),
# stars = c(0.001, 0.01, 0.05, 0.1),
# symbol = "+",
# table = F,
# booktabs = T,
# use.packages = F,
# custom.model.names = c("(1) NELDA", "(2) V-Dem"),
# dcolumn = T,
# include.lr = F,
# caption = "",
# star.symbol = "\\*",
# include.rsquared = F,
# include.adjrs = F,
# include.cluster = T,
# include.variance = F)
# output replication archive
texreg::htmlreg(model_list,
custom.coef.map = coef_name_map,
stars = c(0.001, 0.01, 0.05, 0.1),
symbol = "+",
table = F,
booktabs = T,
use.packages = F,
custom.model.names = c("(1) NELDA", "(2) V-Dem"),
dcolumn = T,
include.lr = F,
caption = "",
star.symbol = "\\*",
include.rsquared = F,
include.adjrs = T,
include.cluster = T,
include.variance = F)
|
(1) NELDA
|
(2) V-Dem
|
Power-Sharing (cabinet)
|
-2.03*
|
-0.37***
|
|
(0.80)
|
(0.07)
|
Aid / GDP (instrumented)
|
-0.04
|
-0.03
|
|
(0.22)
|
(0.03)
|
Power-Sharing (cabinet) * Aid (instrumented)
|
0.10**
|
0.02***
|
|
(0.04)
|
(0.00)
|
Nat. Res. Rents
|
-0.03+
|
-0.01***
|
|
(0.02)
|
(0.00)
|
Regime Type (FH)
|
0.27
|
0.09***
|
|
(0.18)
|
(0.02)
|
Nonstate Conflict
|
-2.49**
|
-0.24***
|
|
(0.86)
|
(0.05)
|
Conflict Intensity
|
-0.61
|
0.03
|
|
(0.53)
|
(0.08)
|
Population (log)
|
0.10
|
0.02
|
|
(0.24)
|
(0.02)
|
GDP p/c (log)
|
-0.14
|
0.00
|
|
(0.34)
|
(0.04)
|
Num. obs.
|
142
|
141
|
Adj. R2 (full model)
|
0.18
|
0.49
|
Adj. R2 (proj model)
|
0.18
|
0.49
|
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
|
Supplement: Stata code to generate F-Statistics for IV/2SLS models
use ".\data\ivelections.dta", replace
*gen aid_ln = log(aiddata_AidGDP)
gen gdp_pc_ln = log(gdp_per_capita_un)
gen ln_pop = log(population)
gen cabXaid = cabinetINC_12 * aid_ln
gen cabXinsaid = cabinetINC_12 * instr_aid_gdp
* 2SLS for NELDA election quality to extract F-Statistic
ivreg2 quality cabinetINC_12 ///
nonstate WBnatres fh gdp_pc_ln ln_pop conf_intens (aid_ln cabXaid = instr_aid_gdp cabXinsaid) , cluster(country) ffirst
ivreg2 v2xel_frefair cabinetINC_12 ///
nonstate WBnatres fh gdp_pc_ln ln_pop conf_intens (aid_ln cabXaid = instr_aid_gdp cabXinsaid) , cluster(country) ffirst
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNjogRWxlY3Rpb24gUXVhbGl0eSINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiAiaGlkZSINCg0KLS0tDQoNCg0KIyBGaWd1cmUgNi4xOiBFbGVjdGlvbiBRdWFsaXR5LCBQb3dlci1TaGFyaW5nIEdvdmVybm1lbnRzLCBhbmQgQWlkOiBJbmRpdmlkdWFsDQpQYXR0ZXJucw0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9RixmaWcuaGVpZ2h0ID0gMy41LCAgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZGV2ID0gIkNhaXJvUE5HIn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkodGlrekRldmljZSkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShjb3dwbG90KQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpDQoNCiMgUGxvdCBQb3dlci1TaGFyaW5nDQpuZWxkYV9wcyRjYWJpbmV0SU5DbGFiZWwgPC0gaWZlbHNlKG5lbGRhX3BzJGNhYmluZXRJTkMuMTIgPT0gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFBvd2VyLVNoYXJpbmciKQ0KDQpuZWxkYV9xdWFsaXR5X2JveHBsb3QgPC0gZ2dwbG90KG5lbGRhX3BzLCBhZXMoeCA9IGNhYmluZXRJTkNsYWJlbCwgeSA9IHF1YWxpdHkpKSArDQogIGdlb21faml0dGVyKGhlaWdodCA9IDAuMSwgc2l6ZSA9IDEuNywgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyhmaWxsID0gY2FiaW5ldElOQ2xhYmVsKSwgYWxwaGEgPSAwLjYpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJCbHVlcyIpICsgDQogIHN0YXRfc3VtbWFyeShhZXMoZ3JvdXAgPSAxKSwgZnVuLnkgPSBtZWFuLCBnZW9tID0gInBvaW50Iiwgc2hhcGUgPSAyMywNCiAgICAgICAgICAgICAgIHNpemUgPSA0LCBmaWxsID0gIiNkNzE5MWMiLCBjb2xvciA9ICIjZDcxOTFjIikgKyANCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyANCiAgbGFicyh4ID0gIiIsIHkgPSAiTkVMREEgRWxlY3Rpb24gUXVhbGl0eSBJbmRleCIpDQoNCg0KIyBQbG90IEFpZA0KbmVsZGFfYWlkX3Bsb3QgPC0gZ2dwbG90KG5lbGRhX3BzLCBhZXMoeCA9IGxvZyhhaWRkYXRhX0FpZEdEUCksIHkgPSBxdWFsaXR5KSkgKyANCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICAgIHdpZHRoID0gMC4xLCANCiAgICAgICAgICAgICAgaGVpZ2h0ID0gMC4xLA0KICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIHRoZW1lX2J3KCkgKw0KICBsYWJzKHkgPSAiTkVMREEgRWxlY3Rpb24gUXVhbGl0eSBJbmRleCIsIHggPSAiQWxsIEFpZCAvIEdEUCAobG9nKSIpDQoNCiMgT3V0cHV0IGZvciBNYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9wc19pbmRpdmlkX25lbGRhLnRleCIsIGhlaWdodCA9IDMuNSkNCiMgcGxvdF9ncmlkKG5lbGRhX3F1YWxpdHlfYm94cGxvdCwgbmVsZGFfYWlkX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgUmVwLiBBcmNoaXZlDQpwbG90X2dyaWQobmVsZGFfcXVhbGl0eV9ib3hwbG90LCBuZWxkYV9haWRfcGxvdCkNCg0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjI6IEZvcmVpZ24gQWlkIGFuZCBFbGVjdGlvbiBRdWFsaXR5IGluIEVsZWN0aW9uIFJvdW5kcyB3aXRoIGFuZCB3aXRob3V0IFBvd2VyLVNoYXJpbmcNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLGZpZy5oZWlnaHQgPSAzLjUsICBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEYsIGRldiA9ICJDYWlyb1BORyJ9DQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGdncmVwZWwpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKQ0KDQoNCmFpZF9wc19lbGVjdGlvbl9uZWxkYV9wbG90IDwtIGdncGxvdChuZWxkYV9wcywgYWVzKHggPSBhaWRfbG4sIHkgPSBxdWFsaXR5KSkgKw0KICBnZW9tX2ppdHRlcihzaXplID0gMiwgd2lkdGggPSAwLjEsIGhlaWdodCA9IDAuMSwgIGFscGhhID0gMC41KSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArDQogIGZhY2V0X3dyYXAoIH4gY2FiaW5ldElOQy4xMiwgbnJvdyA9IDEsDQogICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoY2FiaW5ldElOQy4xMiA9IGMoIjAiID0gIk5vIFBvd2VyLVNoYXJpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMSIgPSAiUG93ZXItU2hhcmluZyIpKSkgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTExKSkgKw0KICBsYWJzKHggPSAiQWlkIC8gR0RQIChsb2cpIiwgeSA9ICJORUxEQSBFbGVjdGlvbiBRdWFsaXR5IEluZGV4IikNCg0KDQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZF9wc19pbnRlcmFjdGlvbl9yYXdkYXRhLnRleCIsIGhlaWdodCA9IDMuNSwgd2lkdGggPSA2LjUpDQojIGdyaWQuYXJyYW5nZShhaWRfcHNfZWxlY3Rpb25fbmVsZGFfcGxvdCkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCnByaW50KGFpZF9wc19lbGVjdGlvbl9uZWxkYV9wbG90KQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjM6IE1hcmdpbmFsIEVmZmVjdCBQbG90cyBmb3IgdGhlIEludGVyYWN0aW9uIGJldHdlZW4gRm9yZWlnbiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcNCg0KYGBge3IsIGZpZy5hbGlnbiA9ICJjZW50ZXIiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBmaWcud2lkdGggPSA4LCBmaWcuaGVpZ2h0PTMuNSwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpa3pEZXZpY2UpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBSZWVzdGltYXRlIE1vZGVscw0KDQojIE1vZGVscyBORUxEQQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBQbG90IE1FDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2ludGVyYWN0aW9uX3Bsb3RzLlIiKQ0KDQojIE91dHB1dCBmb3IgbWFudXNjcmlwdA0KIyBvcHRpb25zKCB0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9pbnRlcmFjdGlvbl9haWRwc2VsZWN0aW9ucy50ZXgiLCBoZWlnaHQgPSAzLjUpDQojIHBhcihtZnJvdz1jKDEsMyksDQojICAgICBtYXIgPSBjKDQsIDUsIDQsIDIpLA0KIyAgICAgY2V4LmxhYiA9IDEuMSwNCiMgICAgIGNleC5heGlzID0gMC45LA0KIyAgICAgbWdwID0gYygzLCAwLjcsIDApKQ0KIyANCiMgaW50ZXJhY3Rpb25fcGxvdF9jb250aW51b3VzKG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVC4xMiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgXG4gb24gRWxlY3Rpb24gUXVhbGl0eSAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJhKSBBaWQgLyBHRFAgKExvZylcbiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbWVkaWFuX2VmZmVjdCA9IFQsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIA0KIyBpbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5ULjEyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFiID0gIlxuIFBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIC0gXG5OdW1iZXIgb2YgcmViZWwgc2VhdHMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJFc3RpbWF0ZWQgbWFyZ2luYWwgY29lZmZpY2llbnQgb2ZcbiBBaWQgLyBHRFAgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZiA9IC45MCkNCiMgDQojIGludGVyYWN0aW9uX3Bsb3RfYmluYXJ5KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0SU5DLjEyIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgLSBcbkJpbmFyeSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiRXN0aW1hdGVkIG1hcmdpbmFsIGNvZWZmaWNpZW50IG9mXG4gQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQojIA0KIyBkZXYub2ZmKCkNCg0KIyBPdXRwdXQgZm9yIFJlcGxpY2F0aW9uIEFyY2hpdmU6DQpwYXIobWZyb3c9YygxLDMpLA0KICAgIG1hciA9IGMoNCwgNSwgNCwgMiksDQogICAgY2V4LmxhYiA9IDEuMSwNCiAgICBjZXguYXhpcyA9IDAuOSwNCiAgICBtZ3AgPSBjKDMsIDAuNywgMCkpDQoNCmludGVyYWN0aW9uX3Bsb3RfY29udGludW91cyhtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5ULjEyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0Q09VTlQuMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJNYXJnaW5hbCBlZmZlY3Qgb2YgUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgXG4gb24gRWxlY3Rpb24gUXVhbGl0eSAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiYSkgQWlkIC8gR0RQIChMb2cpXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9tZWRpYW5fZWZmZWN0ID0gVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KDQppbnRlcmFjdGlvbl9wbG90X2NvbnRpbnVvdXMobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQuMTIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiXG4gUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgLSBcbk51bWJlciBvZiByZWJlbCBzZWF0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWxhYiA9ICJFc3RpbWF0ZWQgbWFyZ2luYWwgY29lZmZpY2llbnQgb2ZcbiBBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYgPSAuOTApDQoNCmludGVyYWN0aW9uX3Bsb3RfYmluYXJ5KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMuMTIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJcbiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAtIFxuQmluYXJ5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiRXN0aW1hdGVkIG1hcmdpbmFsIGNvZWZmaWNpZW50IG9mXG4gQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mID0gLjkwKQ0KDQoNCmBgYA0KDQojIEZpZ3VyZSA2LjM6IE1vZGVsIFByZWRpY3Rpb25zIGZvciB0aGUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRiwgZmlnLndpZHRoID0gNi41LCBmaWcuaGVpZ2h0ID0gNC41LGRldiA9ICJDYWlyb1BORyJ9DQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCg0KIyBMb2FkIERhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKQ0KDQojIEVzdGltYXRlIE1vZGVsDQpkYXRhZGlzdF9uZWxkYSA8LSBkYXRhZGlzdChuZWxkYV9wcyk7IG9wdGlvbnMoZGF0YWRpc3Q9J2RhdGFkaXN0X25lbGRhJykNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgR2VuZXJhdGUgUHJlZGljdGlvbnMNCnByZWRpY3Rpb25fbmVsZGEgPC0gUHJlZGljdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgPSBjKDAsIDEwKSwgIyBubyAvIG11Y2ggcG93ZXItc2hhcmluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9IHNlcSgtNiwgMy45LCAwLjEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCA9IDMuNTcsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gNy44NjAxMjQpICMgcmFuZ2Ugb2YgYWlkDQoNCg0KDQojIGdlbmVyYXRlIHBsb3QNCk1FX2FpZHBzX2ludGVyYWN0aW9uX25lbGRhIDwtIGdncGxvdChkYXRhLmZyYW1lKHByZWRpY3Rpb25fbmVsZGEpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gZXhwKGFpZF9sbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSB5aGF0LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGFzLmZhY3RvcihjYWJpbmV0Q09VTlQuMTIpKSkgKyANCiAgZ2VvbV9saW5lKCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArIA0KICBnZW9tX3JpYmJvbihhZXMoeW1heCA9IHVwcGVyLCANCiAgICAgICAgICAgICAgICAgIHltaW4gPSBsb3dlciwgDQogICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGNhYmluZXRDT1VOVC4xMikpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2IzY2RlMyIsICIjZTQxYTFjIiksIA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIk51bWJlciBvZiBSZWJlbHMgXG5pbiB0aGUgUG93ZXItU2hhcmluZyBDb2FsaXRpb246IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArDQogIGxhYnMoeCA9ICJBaWQgLyBHRFAiLCANCiAgICAgICB5ID0gIkVsZWN0aW9uIFF1YWxpdHkiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSANCg0KDQpwcmVkaWN0aW9uX25lbGRhX3BzIDwtIFByZWRpY3QobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gc2VxKDAsIDEwLCAxKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gYygwLCAzLjQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoID0gMy41NywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSA3Ljg2MDEyNCkNCg0KcHJlZGljdGlvbl9uZWxkYV9wcyRhaWRfbG4gPC0gcm91bmQoZXhwKHByZWRpY3Rpb25fbmVsZGFfcHMkYWlkX2xuKSwgMCkNCg0KDQptZXBsb3RfYWlkcHNfbmVsZGFfaW50ZXJhY3Rpb25fcHMgPC0gZ2dwbG90KGRhdGEuZnJhbWUocHJlZGljdGlvbl9uZWxkYV9wcyksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGNhYmluZXRDT1VOVC4xMiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0geWhhdCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGFzLmZhY3RvcihhaWRfbG4pKSkgKyANCiAgZ2VvbV9saW5lKCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxKSArIA0KICBnZW9tX3JpYmJvbihhZXMoeW1heCA9IHVwcGVyLCANCiAgICAgICAgICAgICAgICAgIHltaW4gPSBsb3dlciwgDQogICAgICAgICAgICAgICAgICBmaWxsID0gYXMuZmFjdG9yKGFpZF9sbikpLCANCiAgICAgICAgICAgICAgYWxwaGEgPSAwLjcpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMCwgMikpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2IzY2RlMyIsICIjZTQxYTFjIiksIA0KICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkFpZCBpbiBwZXIgY2VudCBvZiBHRFA6IikgKw0KICB0aGVtZV9idygpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTgpKSArDQogIGxhYnMoeCA9ICJQb3dlci1TaGFyaW5nIChOby4gb2YgUmViZWwgU2VhdHMpIiwgDQogICAgICAgeSA9ICJFbGVjdGlvbiBRdWFsaXR5IikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgDQoNCg0KIyBPdXR1dCBNYW51c2NyaXB0DQojIG9wdGlvbnMoIHRpa3pEb2N1bWVudERlY2xhcmF0aW9uID0gIlxcZG9jdW1lbnRjbGFzc1sxMXB0XXthcnRpY2xlfSIgKQ0KIyB0aWt6KCIuLi9maWd1cmVzL2FpZHBzX2VsZWN0aW9uc19NRS50ZXgiLCBoZWlnaHQgPSA0LjUsIHdpZHRoID0gNi41KQ0KIyBncmlkLmFycmFuZ2UobWVwbG90X2FpZHBzX25lbGRhX2ludGVyYWN0aW9uX3BzLA0KIyAgICAgICAgICAgICAgTUVfYWlkcHNfaW50ZXJhY3Rpb25fbmVsZGEsDQojICAgICAgICAgICAgICBucm93ID0gMSkNCiMgZGV2Lm9mZigpDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG1lcGxvdF9haWRwc19uZWxkYV9pbnRlcmFjdGlvbl9wcywgDQogICAgICAgICAgICAgICAgICAgICAgICBNRV9haWRwc19pbnRlcmFjdGlvbl9uZWxkYSwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5yb3cgPSAxKQ0KDQpgYGANCg0KDQojIEZpZ3VyZSA2LjQ6IFByb2JpbmcgTWVjaGFuaXNtcyBJOiBWYXJpYXRpb24gaW4gVHlwZXMgb2YgUG93ZXItU2hhcmluZyBhbmQgQWlkIGFuZCAgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgZmlnLmFsaWduID0gImNlbnRlciIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsZmlnLmhlaWdodCA9IDMuNSwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KDQojIExpYnJhcmllcw0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGxmZSkNCg0KIyBMb2FkIGRhdGEgDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9zZW5pbmMgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAgfCAwIHwgY291bnRyeSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcykNCg0KDQptb2RlbF9haWRwc19xdWFsaXR5X25vbnNlbmluYyA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnNlbmlvcklOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IDAgfCBjb3VudHJ5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzKQ0KDQptb2RlbF9haWRwc19xdWFsaXR5X2RnYSA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX251bGwgKyAxKSAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IDAgfCBjb3VudHJ5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzKQ0KDQoNCm1vZGVsX2FpZHBzX3F1YWxpdHlfcHJvZ2FpZCA8LSBmZWxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwcm9ncmFtX2FpZF9nZHBfbnVsbCArIDEpICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9idWRnZXRhaWQgPC0gZmVsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYnVkZ2V0X2FpZF9nZHBfbnVsbCArIDEpICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwIHwgMCB8IGNvdW50cnksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMpDQoNCiMgZXh0cmFjdCBjb2VmZmljaWVudHMgZm9yIGludGVyYWN0aW9uIHRlcm0NCm1lY2hhbmlzbV9tb2RlbHMgPC0gbGlzdCgiQ2FiaW5ldCBQUyAoQmFzZWxpbmUpIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuaW9yIFBTIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfc2VuaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uc2VuaW9yIFBTIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfbm9uc2VuaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiREdBIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfZGdhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQiPSBtb2RlbF9haWRwc19xdWFsaXR5X3Byb2dhaWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkIiA9IG1vZGVsX2FpZHBzX3F1YWxpdHlfYnVkZ2V0YWlkKSAlPiUgDQogICBlbmZyYW1lKCkgJT4lIA0KICBtdXRhdGUodGlkeW1vZGVsID0gbWFwKHZhbHVlLCBicm9vbTo6dGlkeSkpICU+JSANCiAgdW5uZXN0KHRpZHltb2RlbCkgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoIjoiLCB0ZXJtKSkgJT4lIA0KICBtdXRhdGUobmFtZSA9IGZvcmNhdHM6OmZjdF9yZWxldmVsKG5hbWUsIGMoIkNhYmluZXQgUFMgKEJhc2VsaW5lKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VuaW9yIFBTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zZW5pb3IgUFMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRHQSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGdldCBBaWQiKSkpDQptZWNoYW5pc21fbW9kZWxzX2VsZWMgPC0gbWVjaGFuaXNtX21vZGVscw0Kc2F2ZShtZWNoYW5pc21fbW9kZWxzX2VsZWMsIGZpbGU9ICIuL2RhdGEvbWVjaGFuaXNtX21vZGVsc19lbGVjLnJkYSIpDQoNCg0KbWVjaGFuaXNtc19lbGVjX21vZGVsc19wbG90IDwtIGdncGxvdChtZWNoYW5pc21fbW9kZWxzLCBhZXMoeCA9IG5hbWUsIHkgPSBlc3RpbWF0ZSkgKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBlc3RpbWF0ZSAtIDEuNjcgKiBzdGQuZXJyb3IsIA0KICAgICAgICAgICAgICAgICAgICB5bWF4ID0gZXN0aW1hdGUgKyAxLjY3ICogc3RkLmVycm9yKSwgDQogICAgICAgICAgICAgICAgd2lkdGggPSAwKSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9IDIpICsNCiAgbGFicyh4ID0gIiIsIHkgPSAiQ29lZmZpY2llbnQgRXN0aW1hdGUgb2YgSW50ZXJhY3Rpb24gYmV0d2VlbiBcbiBEaWZmZXJlbnQgVHlwZXMgb2YgUG93ZXItU2hhcmluZyAoYmluYXJ5KSBcbiBhbmQgRGlmZmVyZW50IEFpZCBUeXBlcyIpDQoNCg0KIyBPdXRwdXQgZm9yIG1hbnVzY3JpcHQNCiMgb3B0aW9ucyh0aWt6RG9jdW1lbnREZWNsYXJhdGlvbiA9ICJcXGRvY3VtZW50Y2xhc3NbMTFwdF17YXJ0aWNsZX0iICkNCiMgdGlreigiLi4vZmlndXJlcy9tZWNoYW5pbXNfZWxlY19tb2RlbHNfcGxvdC50ZXgiLCBoZWlnaHQgPSAyLjc1KQ0KIyBwcmludChtZWNoYW5pc21zX2VsZWNfbW9kZWxzX3Bsb3QpDQojIGRldi5vZmYoKQ0KDQojIE91dHB1dCBmb3IgcmVwbGljYXRpb24gYXJjaGl2ZQ0KDQpwcmludChtZWNoYW5pc21zX2VsZWNfbW9kZWxzX3Bsb3QpDQoNCmBgYA0KDQoNCg0KIyBUYWJsZSA2LjE6IEluZGl2aWR1YWwgRWZmZWN0cyBvZiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBQb3N0LUNvbmZsaWN0IEVsZWN0aW9uIFF1YWxpdHkNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpIA0KDQojIyBNb2RlbHMgTkVMREEgKFYtRGVtIE1vZGVscyBzZWUgQXBwZW5kaXgpDQptb2RlbF9wc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9jYWJjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9jYWJjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5pb3JDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9zZW5pb3Jjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiArICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCA8LSByb2Jjb3YobW9kZWxfcHNfcXVhbGl0eV9ub25zZW5pb3Jjb3VudCwgbmVsZGFfcHMkY291bnRyeSkNCg0KDQojIE1vZGVscyBBaWQNCiMgREdBDQptb2RlbF9kZ2FfcXVhbGl0eSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX251bGwgKyAxICkrIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICsgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2RnYV9xdWFsaXR5IDwtIHJvYmNvdihtb2RlbF9kZ2FfcXVhbGl0eSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBwcm9ncmFtIGFpZA0KbW9kZWxfcHJvZ19haWRfcXVhbGl0eSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocHJvZ3JhbV9haWRfZ2RwX251bGwgKyAxICkrIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX3Byb2dfYWlkX3F1YWxpdHkgPC0gcm9iY292KG1vZGVsX3Byb2dfYWlkX3F1YWxpdHksIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgYnVkZ2V0IGFpZA0KbW9kZWxfYnVkZ2V0YWlkX3F1YWxpdHkgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYnVkZ2V0X2FpZF9nZHBfbnVsbCArIDEgKSsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYnVkZ2V0YWlkX3F1YWxpdHkgPC0gcm9iY292KG1vZGVsX2J1ZGdldGFpZF9xdWFsaXR5LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIGluZGl2aWR1YWwgZWZmZWN0cyBtb2RlbCBsaXN0DQppbmRfZWZmZWN0X21vZGVscyA8LSBsaXN0KG1vZGVsX3BzX3F1YWxpdHlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3F1YWxpdHlfc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3F1YWxpdHlfbm9uc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2RnYV9xdWFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wcm9nX2FpZF9xdWFsaXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9idWRnZXRhaWRfcXVhbGl0eSkNCg0KDQojIE91dHB1dA0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQuMTIgPSAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yKSIsIA0KICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQojIEdldCBudW1iZXIgb2YgY2x1c3RlcnMNCnNvdXJjZSgiLi9mdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0KDQojIE91dHB1dCBNYW51c2NyaXB0DQojIHRleHJlZyhsID0gaW5kX2VmZmVjdF9tb2RlbHMsDQojICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KIyAgICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkX3BzX2luZGVmZl9lbGVjdGlvbnMudGV4IiwNCiMgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiMgDQojICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCg0KIyBPdXRwdXQgUmVwbGljYXRpb24gQXJjaGl2ZQ0KaHRtbHJlZyhsID0gaW5kX2VmZmVjdF9tb2RlbHMsIA0KICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICANCiAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiKQ0KDQoNCmBgYA0KDQoNCg0KIyBUYWJsZSA2LjI6IFRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIEVsZWN0aW9uIFF1YWxpdHkNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9uZWxkYV9wcy5yZGEiKSANCg0KIyBuZWxkYV9wcyA8LSBmaWx0ZXIobmVsZGFfcHMsIGNvdW50cnkgIT0gIkJvc25pYS1IZXJ6ZWdvdmluYSIpDQoNCiMgTW9kZWxzIE5FTERBDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYyA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldElOQy4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJpbmMsIG5lbGRhX3BzJGNvdW50cnkpDQoNCg0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnQsIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgTW9kZWwgVmRlbQ0KbW9kZWxfYWlkcHNfdmRlbV9jYWJpbmMgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfdmRlbV9jYWJpbmMgPC0gcm9iY292KG1vZGVsX2FpZHBzX3ZkZW1fY2FiaW5jLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCm1vZGVsX2FpZHBzX3ZkZW1fY2FiY291bnQgPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc192ZGVtX2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9haWRwc192ZGVtX2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCiMgT3V0cHV0DQppbnRfZWZmX21vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmluYywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX3ZkZW1fY2FiaW5jLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX3ZkZW1fY2FiY291bnQpDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdCggY2FiaW5ldElOQy4xMiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRJTkMuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuID0gIkFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF9udWxsID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbV9haWRfZ2RwX251bGw9ICJQcm9ncmFtIEFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBidWRnZXRfYWlkX2dkcF9udWxsID0gIkJ1ZGdldCBBaWQgLyBHRFAgKGxvZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSA9ICJOb25zdGF0ZSBDb25mbGljdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBnZHBfcGVyX2NhcGl0YV91biA9ICJHRFAgcC9jIChsb2cpIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgY3VzdG9tX3RleHJlZyhsID0gaW50X2VmZl9tb2RlbF9saXN0LCANCiMgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9haWRwc19lbGVjdGlvbnNfaW50ZXJhY3Rpb25fbWFpbnJlc3VsdHMudGV4IiwgDQojICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULCANCiMgICAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntORUxEQSBFbGVjdGlvbiBRdWFsaXR5fX0gJiANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxtdWx0aWNvbHVtbnsyfXtjfXtcXHRleHRiZntWLURlbSBDbGVhbiBFbGVjdGlvbnMgSW5kZXh9fSBcXFxcIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXGNtaWRydWxlKHIpezItM30gXFxjbWlkcnVsZShyKXs0LTV9IA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFxcbXVsdGljb2x1bW57MX17Y317KDEpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDMpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDQpICB9IiksDQojICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULCANCiMgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQpDQoNCmh0bWxyZWcobCA9IGludF9lZmZfbW9kZWxfbGlzdCwgDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwgDQogICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCg0KDQojIFRhYmxlIDYuMzogUHJvYmluZyBNZWNoYW5pc21zIElJOiBBaWQgQ3V0LU9mZnMsIEVsZWN0aW9uIE1vbml0b3JzLCBhbmQgUG9zdC1Db25mbGljdCBFbGVjdGlvbiBRdWFsaXR5DQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHBsbSkNCmxpYnJhcnkoY291bnRyeWNvZGUpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBhaWQgY3V0b2Zmcw0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE1NyAqICMgYWlkIGN1dG9mZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19haWRjdXRvZmYgPC0gcm9iY292KG1vZGVsX2FpZHBzX2FpZGN1dG9mZiwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBlbGVjdGlvbiBtb25pdG9ycw0KbW9kZWxfYWlkcHNfZWxtb25zIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE0NSAqICMgYWlkIGN1dG9mZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pDQogICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19lbG1vbnMgPC0gcm9iY292KG1vZGVsX2FpZHBzX2VsbW9ucywgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBhaWQgY3V0b2Zmcw0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0gPC0gb2xzKHYyeGVsX2ZyZWZhaXIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWxkYTU3ICogIyBhaWQgY3V0b2ZmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0gPC0gcm9iY292KG1vZGVsX2FpZHBzX2FpZGN1dG9mZl92ZGVtLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIGVsZWN0aW9uIG1vbml0b3JzDQptb2RlbF9haWRwc19lbG1vbnNfdmRlbSA8LSBvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgKiAjIGVsZWN0aW9uIG1vbml0b3JzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX2VsbW9uc192ZGVtIDwtIHJvYmNvdihtb2RlbF9haWRwc19lbG1vbnNfdmRlbSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBPdXRwdXQNCm1vZGVsX2xpc3QgPC0gbGlzdChtb2RlbF9haWRwc19haWRjdXRvZmYsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2VsbW9ucywgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfYWlkY3V0b2ZmX3ZkZW0sIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2FpZHBzX2VsbW9uc192ZGVtKQ0KDQpjb2VmX25hbWVfbWFwIDwtIGxpc3QoIGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICBuZWxkYTU3ID0gIkFpZCBDdXQtT2ZmIiwgDQogICAgICAgICAgICAgICAgICAgICAgICJuZWxkYTU3ICogY2FiaW5ldENPVU5ULjEyIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCBDdXQtT2ZmIiwNCiAgICAgICAgICAgICAgICAgICAgICAgbmVsZGE0NSA9ICJFbGVjdGlvbiBNb25pdG9ycyIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAibmVsZGE0NSAqIGNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBFbGVjdGlvbiBNb25pdG9ycyIsDQogICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldElOQy4xMiIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuICogY2FiaW5ldENPVU5ULjEyIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBkZ2FfZ2RwX251bGwgPSAiREdBL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfbnVsbD0gIlByb2dyYW0gQWlkIC8gR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGJ1ZGdldF9haWRfZ2RwX251bGwgPSAiQnVkZ2V0IEFpZCAvIEdEUCAobG9nIiwgDQogICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gICJDb25mbGljdCBJbnRlbnNpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiKQ0KDQoNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgDQojIGN1c3RvbV90ZXhyZWcobCA9IG1vZGVsX2xpc3QsDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZGN1dG9mZl9lbG1vbl9lbGVjdGlvbnMudGV4IiwgDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezJ9e2N9e1xcdGV4dGJme05FTERBIEVsZWN0aW9uIFF1YWxpdHl9fSAmIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXG11bHRpY29sdW1uezJ9e2N9e1xcdGV4dGJme1YtRGVtIENsZWFuIEVsZWN0aW9ucyBJbmRleH19IFxcXFwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcY21pZHJ1bGUocil7Mi0zfSBcXGNtaWRydWxlKHIpezQtNX0gDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMikgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMykgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBUKQ0KDQoNCmh0bWxyZWcobCA9IG1vZGVsX2xpc3QsDQogICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgIA0KICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KDQpgYGANCg0KIyBUYWJsZSA2LjQ6IFJvYnVzdG5lc3MgQ2hlY2tzIGFuZCBBbHRlcm5hdGl2ZSBTcGVjaWZpY2F0aW9ucyBmb3IgdGhlIEludGVyYWN0aW9uIEVmZmVjdCBvZiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcgb24gRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkocm1zKQ0KbGlicmFyeShwbG0pDQpsaWJyYXJ5KGNvdW50cnljb2RlKQ0KbGlicmFyeSh0ZXhyZWcpDQoNCiMgbG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvbmVsZGFfcHMucmRhIikNCg0KIyBFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24NCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWxmIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9lbGYgPC0gcm9iY292KG1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWxmLCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQoNCiMgUEtPDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X3BrbyA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X3BrbyA8LSByb2Jjb3YobW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9wa28sIG5lbGRhX3BzJGNvdW50cnkpDQoNCiMgY2FiaW5ldCBzaXplDQpsaWJyYXJ5KHJlYWR4bCkNCmNudHMgPC0gcmVhZF9leGNlbCgiLi9kYXRhL0NOVFNEQVRBLnhscyIpDQoNCmNudHMgPC0gY250cyAlPiUgZmlsdGVyKHllYXIgPj0gMTk4OSkNCg0KY250cyRpc28zYyA8LSBjb3VudHJ5Y29kZShjbnRzJGNvdW50cnksICJjb3VudHJ5Lm5hbWUiLCAiaXNvM2MiKQ0KY250cyA8LSBjbnRzICU+JSBmaWx0ZXIoY291bnRyeSAhPSAiU09NQUxJTEFORCIpDQoNCnRlc3RjYWJzaXplIDwtIGxlZnRfam9pbihuZWxkYV9wcywgY250c1ssIGMoImlzbzNjIiwgInllYXIiLCAicG9saXQxMCIpXSkNCg0KdGVzdGNhYnNpemUkcHNfc2hhcmUgPC0gdGVzdGNhYnNpemUkY2FiaW5ldENPVU5UIC8gdGVzdGNhYnNpemUkcG9saXQxMCAqIDEwMA0KDQptb2RlbF9lbF9jYWJzaGFyZSA8LSBvbHMocXVhbGl0eSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICogIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfc2hhcmUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHRlc3RjYWJzaXplLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9lbF9jYWJzaGFyZSA8LSByb2Jjb3YobW9kZWxfZWxfY2Fic2hhcmUsIHRlc3RjYWJzaXplJGNvdW50cnkpDQoNCiMgV2FzIEluY3VtYmVudCBjb250ZXN0ZWQ6IG5lbGRhMjANCm5lbGRhX3BzIDwtIGFzLmRhdGEuZnJhbWUobmVsZGFfcHMpDQpuZWxkYV9wcyRuZWxkYTIwIDwtIGlmZWxzZShuZWxkYV9wcyRuZWxkYTIwID09ICJ5ZXMiLCAxLCAwKQ0KDQppbmNfY29udGVzdGVkIDwtIG5lbGRhX3BzICU+JSANCiAgZmlsdGVyKG5lbGRhMjAgPT0gMSkNCg0KaW5jX25vdGNvbnRlc3RlZCA8LSBuZWxkYV9wcyAlPiUgDQogIGZpbHRlcihuZWxkYTIwID09IDApDQoNCmluY19jb250ZXN0ZWRfbW9kZWwgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpbmNfY29udGVzdGVkLCB4ID0gVCwgeSA9IFQpDQppbmNfY29udGVzdGVkX21vZGVsIDwtIHJvYmNvdihpbmNfY29udGVzdGVkX21vZGVsLCBpbmNfY29udGVzdGVkJGNvdW50cnkpDQoNCmluY19ub3Rjb250ZXN0ZWRfbW9kZWwgPC0gb2xzKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkX2xuICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyICArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpbmNfbm90Y29udGVzdGVkLCB4ID0gVCwgeSA9IFQpDQppbmNfbm90Y29udGVzdGVkX21vZGVsIDwtIHJvYmNvdihpbmNfbm90Y29udGVzdGVkX21vZGVsLCBpbmNfbm90Y29udGVzdGVkJGNvdW50cnkpDQoNCiMgVHlwZSBvZiBFbGVjdGlvbiANCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWx0eXBlIDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsIHggPSBULCB5ID0gVCkNCm1vZGVsX2FpZHBzX3F1YWxpdHlfY2FiY291bnRfZWx0eXBlIDwtIHJvYmNvdihtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsdHlwZSwgbmVsZGFfcHMkY291bnRyeSkNCg0KIyBSYW5kb20gRWZmZWN0cw0KY291bnRyeXJlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQgPC0gcGxtKHF1YWxpdHkgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiAqICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBuZWxkYV9wcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGMoImNvdW50cnkiLCAiZWxlY3Rpb25pZCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gInJhbmRvbSIpDQpjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCR2Y292IDwtIHZjb3ZIQyhjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCkNCg0KDQoNCiMgUmVnaW9uIEZFDQpuZWxkYV9wcyRyZWdpb25fZmUgPC0gY291bnRyeWNvZGUobmVsZGFfcHMkY291bnRyeSwgImNvdW50cnkubmFtZSIsICJyZWdpb24iKQ0KDQpyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIG9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb25fZmUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG5lbGRhX3BzLCB5ID0gVCwgeCA9IFQpDQpyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIHJvYmNvdihyZWdpb25mZV9haWRwc19xdWFsaXR5X2NhYmNvdW50LCBuZWxkYV9wcyRjb3VudHJ5KQ0KDQojIENvdW50cnkgRkUNCmNvdW50cnlmZV9haWRwc19xdWFsaXR5X2NhYmNvdW50IDwtIHBsbShxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQuMTIgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbmVsZGFfcHMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBjKCJjb3VudHJ5IiwgImVsZWN0aW9uaWQiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9ICJ3aXRoaW4iKQ0KY291bnRyeWZlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQkdmNvdiA8LSB2Y292SEMoY291bnRyeWZlX2FpZHBzX3F1YWxpdHlfY2FiY291bnQpDQoNCg0KIyBPdXRwdXQNCg0KIyBGaXJzdDogY3JlYXRlIG1vZGVsIGxpc3QNCnJvYl9lbGVjdGlvbl9tb2RlbGxpc3QgPC0gbGlzdChtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfYWlkcHNfcXVhbGl0eV9jYWJjb3VudF9wa28sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2VsX2NhYnNoYXJlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY19jb250ZXN0ZWRfbW9kZWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jX25vdGNvbnRlc3RlZF9tb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb2RlbF9haWRwc19xdWFsaXR5X2NhYmNvdW50X2VsdHlwZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5cmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uZmVfYWlkcHNfcXVhbGl0eV9jYWJjb3VudCkNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRJTkMuMTIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5ULjEyID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAiYWlkX2xuOmNhYmluZXRDT1VOVC4xMiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0Q09VTlQuMTIiID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgImFpZF9sbiAqIHBzX3NoYXJlIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9ICJBaWQvR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uc3RhdGUgQ29uZmxpY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4gPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhnZHBfcGVyX2NhcGl0YV91bikiID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgPSAiRWxlY3Rpb24gTW9uaXRvcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICB0eXBlcyA9ICJUeXBlIG9mIEVsZWN0aW9uIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3RfcGxtX2N1c3RvbS5SIikNCg0KIyBPdXRwdXQgTWFudXNjcmlwdA0KdGV4cmVnKHJvYl9lbGVjdGlvbl9tb2RlbGxpc3QsDQogICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgZmlsZSA9ICIuLi9vdXRwdXQvYWlkcHNfZWxlY3Rpb25zX2ludGVyYWN0aW9uX3JvYnVzdG5lc3MudGV4IiwNCiAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgdGFibGUgPSBGLA0KICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIoMSkgRUxGIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBDYWIuIFNpemUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNCkgSW5jLiBDb250ZXN0LiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig1KSBJbmMuIE5vdCBDb250LiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBSRSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBSZWdpb24gRkUiICksDQogICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICBpbmNsdWRlLmxyID0gRiwNCiAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiAgICAgICBjYXB0aW9uID0gIiIsDQogICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQp0ZXhyZWc6Omh0bWxyZWcocm9iX2VsZWN0aW9uX21vZGVsbGlzdCwgDQogICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQogICAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEVMRiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBVTiBQS08iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiLiBTaXplIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIEluYy4gQ29udGVzdC4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgSW5jLiBOb3QgQ29udC4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUkUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUmVnaW9uIEZFIiApLA0KICAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiAgICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCiMgVGFibGUgNi41OiBNYXRjaGluZyBSZXN1bHRzIGZvciB0aGUgSW50ZXJhY3RpdmUgRWZmZWN0IG9mIEZvcmVpZ24gQWlkIGFuZCBQb3dlci1TaGFyaW5nIG9uIFBvc3QtQ29uZmxpY3QgRWxlY3Rpb24gUXVhbGl0eQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkodGV4cmVnKQ0KDQojIExvYWQgbWF0Y2hlZCBkYXRhIHNldA0KbG9hZCgiLi9kYXRhL25lbGRhX3BzX21hdGNoZWQucmRhIikNCg0KbWF0Y2hfZGZfZWxlY19yZWckYWlkX2xuIDwtIGxvZyhtYXRjaF9kZl9lbGVjX3JlZyRhaWRkYXRhX0FpZEdEUCkNCg0KDQojIE5FTERBDQptb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSA8LSBybXM6Om9scyhxdWFsaXR5IH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhnZHBfcGVyX2NhcGl0YV91bikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgIG5vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCAsIHkgPSBUKQ0KDQptb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSAgPC0gcm9iY292KG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX25lbGRhICwgbWF0Y2hfZGZfZWxlY19yZWckY291bnRyeSkNCg0KDQoNCiMgY2FiaW5ldElOQyAqIEFpZDsgVi1EZW0NCm1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0gPC0gcm1zOjpvbHModjJ4ZWxfZnJlZmFpciB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gKiBjYWJpbmV0SU5DLjEyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coZ2RwX3Blcl9jYXBpdGFfdW4pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoICwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGZfZWxlY19yZWcgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQgLCB5ID0gVCkNCg0KbW9kZWxfbWF0Y2hlZF9haWRwc19jYWJJTkNfdmRlbSAgPC0gcm9iY292KG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0gLCBtYXRjaF9kZl9lbGVjX3JlZyRjb3VudHJ5KQ0KDQoNCiMgT3V0cHV0IA0KbWF0Y2hlZF9lbGVjdGlvbl9tb2RlbGxpc3QgPC0gbGlzdChtb2RlbF9tYXRjaGVkX2FpZHBzX2NhYklOQ19uZWxkYSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX21hdGNoZWRfYWlkcHNfY2FiSU5DX3ZkZW0pDQoNCmNvZWZfbmFtZV9tYXAgPC0gbGlzdChjYWJpbmV0SU5DLjEyID0gIlBvd2VyLVNoYXJpbmcgKGJpbmFyeSkiLA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0SU5DLjEyIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgICBwc19zaGFyZSA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIGFpZF9sbiA9ICJBaWQvR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwgDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uc3RhdGUgQ29uZmxpY3QiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwgDQogICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgZ2RwX3Blcl9jYXBpdGFfdW4gPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgImxvZyhnZHBfcGVyX2NhcGl0YV91bikiID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIEV0aG5pYyA9ICJFdGhuaWMgRnJhY3Rpb25hbGl6YXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5lbGRhNDUgPSAiRWxlY3Rpb24gTW9uaXRvcnMiLCANCiAgICAgICAgICAgICAgICAgICAgICB0eXBlcyA9ICJUeXBlIG9mIEVsZWN0aW9uIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X29sc19jdXN0b20uUiIpDQoNCiMgdGV4cmVnKG1hdGNoZWRfZWxlY3Rpb25fbW9kZWxsaXN0LCANCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L21hdGNoZWRfcmVzdWx0c19lbGVjdGlvbnMudGV4IiwNCiMgICAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIE5FTERBIiwgIigyKSBWLURlbSIpLA0KIyAgICAgICAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KIyAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLCANCiMgICAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KIyAgICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgICAgaW5jbHVkZS52YXJpYW5jZSA9IEYpDQoNCg0KdGV4cmVnOjpodG1scmVnKG1hdGNoZWRfZWxlY3Rpb25fbW9kZWxsaXN0LCANCiAgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQogICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwNCiAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBORUxEQSIsICJWLURlbSIpLA0KICAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULA0KICAgICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQogICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwNCiAgICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KDQpgYGANCg0KIyBUYWJsZSA2LjYgSW5zdHJ1bWVudGFsIFZhcmlhYmxlIFJlc3VsdHMgZm9yIHRoZSBJbnRlcmFjdGl2ZSBFZmZlY3Qgb2YgRm9yZWlnbiBBaWQgYW5kIFBvd2VyLVNoYXJpbmcgb24gUG9zdC1Db25mbGljdCBFbGVjdGlvbiBRdWFsaXR5DQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGLCBkZXYgPSAiQ2Fpcm9QTkcifQ0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsZmUpDQoNCiMgTG9hZCBlbGVjdGlvbnMgZGF0YQ0KbG9hZCgiLi9kYXRhL25lbGRhX3BzLnJkYSIpDQoNCiMgbG9hZCBpbnN0cnVtZW50IGRhdGEgZm9yIGFpZA0KbG9hZChmaWxlID0gIi4vZGF0YS9pbnN0cnVtZW50ZWRBaWQyLlJEYXRhIikNCg0KbmVsZGFfaXZyZWcgPC0gbGVmdF9qb2luKG5lbGRhX3BzLCBpbnN0cnVtZW50X2RmLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJpc28yYyIpKQ0KDQpuZWxkYV9pdnJlZyR0b3RhbF9zdW1fZXhjZXB0IDwtIGFzLm51bWVyaWMobmVsZGFfaXZyZWckdG90YWxfc3VtX2V4Y2VwdCkNCg0KbmVsZGFfaXZyZWckaW5zdHJfYWlkX2dkcCA8LSBsb2cobmVsZGFfaXZyZWckdG90YWxfc3VtX2V4Y2VwdCAvIG5lbGRhX2l2cmVnJEdEUCkNCg0KbmVsZGFfaXZyZWckZGF0ZSA8LSBOVUxMDQpuZWxkYV9pdnJlZyRTdGFydERhdGUyIDwtIE5VTEwNCm5lbGRhX2l2cmVnJHllYXJtb24ueCA8LSBOVUxMDQpuZWxkYV9pdnJlZyR5ZWFybW9uLnkgPC0gTlVMTA0KbmVsZGFfaXZyZWdbbmVsZGFfaXZyZWcgPT0gIiJdIDwtIE5BDQoNCg0KIyBoYXJkIGNvZGUgaW50ZXJhY3Rpb25zIGZvciBmZWxtDQpuZWxkYV9pdnJlZyRjYWJYYWlkX2luc3RyIDwtIG5lbGRhX2l2cmVnJGNhYmluZXRDT1VOVC4xMiAqIG5lbGRhX2l2cmVnJGluc3RyX2FpZF9nZHANCm5lbGRhX2l2cmVnJGNhYlhhaWQgPC0gbmVsZGFfaXZyZWckY2FiaW5ldENPVU5ULjEyICogbmVsZGFfaXZyZWckYWlkX2xuDQoNCiMgTW9kZWxzDQptb2RlbF9pdl9haWRwc19uZWxkYSA8LSBmZWxtKHF1YWxpdHkgIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IChjYWJYYWlkX2luc3RyIHwgYWlkX2xuIH4gY2FiWGFpZCArIGluc3RyX2FpZF9nZHAgKSB8IGNvdW50cnksIGRhdGEgPSBuZWxkYV9pdnJlZykNCg0KIyBWLURlbQ0KbW9kZWxfaXZfYWlkcHNfdmRlbSA8LSBmZWxtKHYyeGVsX2ZyZWZhaXIgIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVC4xMiAgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmggKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGdkcF9wZXJfY2FwaXRhX3VuKSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgDQogICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCB8IChjYWJYYWlkX2luc3RyIHwgYWlkX2xuIH4gY2FiWGFpZCArIGluc3RyX2FpZF9nZHAgKSB8IGNvdW50cnksIGRhdGEgPSBuZWxkYV9pdnJlZykNCg0KDQojIE91dHB1dA0KDQptb2RlbF9saXN0IDwtIGxpc3QobW9kZWxfaXZfYWlkcHNfbmVsZGEsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX2l2X2FpZHBzX3ZkZW0pDQojIGNvZWYgbmFtZSBtYXANCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVC4xMiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgImBhaWRfbG4oZml0KWAiID0gIkFpZCAvIEdEUCAoaW5zdHJ1bWVudGVkKSIsDQogICAgICAgICAgICAgICAgICAgICAgImBjYWJYYWlkX2luc3RyKGZpdClgIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCAoaW5zdHJ1bWVudGVkKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJhaWRfbG4gKiBjYWJpbmV0SU5DLjEyIiA9ICJQb3dlci1TaGFyaW5nIChiaW5hcnkpICogQWlkIiwNCg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBhaWRfbG4gPSAiQWlkL0dEUCAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgZmggPSAiUmVnaW1lIFR5cGUgKEZIKSIsIA0KICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbnN0YXRlIENvbmZsaWN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgPSAgIkNvbmZsaWN0IEludGVuc2l0eSIsIA0KICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb24gPSAiUG9wdWxhdGlvbiAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICJsb2cocG9wdWxhdGlvbikiID0gIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIGdkcF9wZXJfY2FwaXRhX3VuID0gIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICJsb2coZ2RwX3Blcl9jYXBpdGFfdW4pIiA9ICJHRFAgcC9jIChsb2cpIikNCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9jdXN0b21fdGV4cmVnLlIiKQ0KZW52aXJvbm1lbnQoY3VzdG9tX3RleHJlZykgPC0gYXNOYW1lc3BhY2UoJ3RleHJlZycpDQoNCiMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgY3VzdG9tX3RleHJlZyhtb2RlbF9saXN0LCANCiMgICAgICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLCANCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9pdl9yZXN1bHRzX2VsZWN0aW9ucy50ZXgiLA0KIyAgICAgICAgICAgICAgIGFkZC5saW5lcyA9IGxpc3QoYygiS2xlaWJlcmdlbi1QYWFwIHJrIFdhbGQgRiBzdGF0aXN0aWMiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTcuNTAiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTcuNTAiKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFkai4gUiReMiQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChzdW1tYXJ5KG1vZGVsX2l2X2FpZHBzX25lbGRhKSRhZGouci5zcXVhcmVkLCAyKSwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoc3VtbWFyeShtb2RlbF9pdl9haWRwc192ZGVtKSRhZGouci5zcXVhcmVkLCAyKSksIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkNvdW50cmllcyIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgodW5pcXVlKG5lbGRhX2l2cmVnJGNvdW50cnkpKSwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCh1bmlxdWUobmVsZGFfaXZyZWckY291bnRyeSkpKSksIA0KIyAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBORUxEQSIsICIoMikgVi1EZW0iKSwNCiMgICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICAgICAgICBjYXB0aW9uID0gIiIsIA0KIyAgICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBGLCANCiMgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQojIG91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQp0ZXhyZWc6Omh0bWxyZWcobW9kZWxfbGlzdCwNCiAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubWFwID0gY29lZl9uYW1lX21hcCwgDQogICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIE5FTERBIiwgIigyKSBWLURlbSIpLA0KICAgICAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsIA0KICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICAgICAgICBpbmNsdWRlLnZhcmlhbmNlID0gRikNCg0KYGBgDQoNCiMgU3VwcGxlbWVudDogU3RhdGEgY29kZSB0byBnZW5lcmF0ZSBGLVN0YXRpc3RpY3MgZm9yIElWLzJTTFMgbW9kZWxzDQpgYGB7ciwgZW5naW5lID0gInN0YXRhIiwgZXZhbCA9IEZ9DQoNCnVzZSAiLlxkYXRhXGl2ZWxlY3Rpb25zLmR0YSIsIHJlcGxhY2UNCg0KKmdlbiBhaWRfbG4gPSBsb2coYWlkZGF0YV9BaWRHRFApDQpnZW4gZ2RwX3BjX2xuID0gbG9nKGdkcF9wZXJfY2FwaXRhX3VuKQ0KZ2VuIGxuX3BvcCA9IGxvZyhwb3B1bGF0aW9uKQ0KDQpnZW4gY2FiWGFpZCA9IGNhYmluZXRJTkNfMTIgKiBhaWRfbG4NCmdlbiBjYWJYaW5zYWlkID0gY2FiaW5ldElOQ18xMiAqIGluc3RyX2FpZF9nZHANCg0KKiAyU0xTIGZvciBORUxEQSBlbGVjdGlvbiBxdWFsaXR5IHRvIGV4dHJhY3QgRi1TdGF0aXN0aWMNCml2cmVnMiBxdWFsaXR5IGNhYmluZXRJTkNfMTIgLy8vIA0Kbm9uc3RhdGUgV0JuYXRyZXMgZmggZ2RwX3BjX2xuIGxuX3BvcCBjb25mX2ludGVucyAoYWlkX2xuIGNhYlhhaWQgPSAgaW5zdHJfYWlkX2dkcCBjYWJYaW5zYWlkKSAsIGNsdXN0ZXIoY291bnRyeSkgZmZpcnN0DQoNCml2cmVnMiB2MnhlbF9mcmVmYWlyIGNhYmluZXRJTkNfMTIgLy8vIA0Kbm9uc3RhdGUgV0JuYXRyZXMgZmggZ2RwX3BjX2xuIGxuX3BvcCBjb25mX2ludGVucyAoYWlkX2xuIGNhYlhhaWQgPSAgaW5zdHJfYWlkX2dkcCBjYWJYaW5zYWlkKSAsIGNsdXN0ZXIoY291bnRyeSkgZmZpcnN0DQoNCg0KYGBgDQoNCg==