Table B.1: Individual Effects of Power-Sharing and Foreign Aid on Freedom House scores

# Libraries
library(texreg)
library(rms)

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

# specify vector with control vars
controlvars <- c("log(aiddata_AidGDP)",
                 "log(GDP_per_capita)",
                 "log(population)",
                 "conf_intens", 
                 "nonstate",
                 "WBnatres",
                 "fh")

#### Power-Sharing only Models ####

# PS only + cabinetCOUNT
model_ps <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + ", 
                               paste0(controlvars, collapse = " + "))),
                data = diss_df, x = T, y = T)
model_ps <- robcov(model_ps, diss_df$GWNo)

# PS only + seniorCOUNT
model_seniorCOUNT <- ols(formula(paste0("fh_t2 ~ seniorCOUNT + ", 
                                        paste0(controlvars, collapse = " + "))),
                         data = diss_df, x = T, y = T)
model_seniorCOUNT <- robcov(model_seniorCOUNT, diss_df$GWNo)

# PS only + nonseniorCOUNT
model_nonseniorCOUNT <- ols(formula(paste0("fh_t2 ~ nonseniorCOUNT + ", 
                                           paste0(controlvars, collapse = " + "))),
                            data = diss_df, x = T, y = T)
model_nonseniorCOUNT <- robcov(model_nonseniorCOUNT, diss_df$GWNo)

#### Aid-only Models ####

# DGA
model_gov_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(dga_gdp_zero + 1) + ", 
                                    paste0(controlvars, collapse = " + ")))
                     ,
                     data=diss_df, x=T, y=T)
model_gov_aid <- robcov(model_gov_aid, diss_df$GWNo)

# Program Aid
model_program_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(program_aid_gdp_zero + 1) + ", 
                                        paste0(controlvars, collapse = " + ")))
                         ,
                         data=diss_df, x=T, y=T)
model_program_aid <- robcov(model_program_aid, diss_df$GWNo)

# Budget Aid
model_commodity_aid <- ols(formula(paste0("fh_t2 ~ cabinetCOUNT + log(commodity_aid_gdp_zero + 1) + ", 
                                          paste0(controlvars, collapse = " + ")))
                           ,
                           data=diss_df, x=T, y=T)
model_commodity_aid <- robcov(model_commodity_aid, diss_df$GWNo)


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

# custom_texreg(l = list(model_ps, 
#                        model_seniorCOUNT, 
#                        model_nonseniorCOUNT, 
#                        model_gov_aid, 
#                        model_program_aid, 
#                        model_commodity_aid), 
#               file = "../output/ind_effects_fh.tex",
#               reorder.coef = c(1, 9, 10, 11:13, 2:8),
#               stars = c(0.001, 0.01, 0.05, 0.1),
#               symbol = "+", 
#               custom.multicol = T,
#               custom.coef.names = c("Intercept",
#                                     "Power-Sharing (cabinet)",
#                                     "Aid / GDP (log)",
#                                     "GDP p/c (log)",
#                                     "Population (log)",
#                                     "Conflict intensity",
#                                     "Non-State Violence",
#                                     "Nat. res. rents",
#                                     "Regime Type (Freedom House)",
#                                     "Power-Sharing (senior)",
#                                     "Power-Sharing (nonsenior)", 
#                                     "Democracy Aid/GDP (log)", 
#                                     "Program Aid/GDP (log)", 
#                                     "Budget Aid/GDP (log)"),
#               omit.coef = "Intercept",
#               table = FALSE, 
#               dcolumn = T,
#               groups = list("Power-Sharing" = 1:3, "Aid" = 4:7, "Controls"  = 8:13),
#               booktabs = T,
#               # add.lines = list(c("Controls", rep("\\multicolumn{1}{c}{Yes}", 6))), 
#               use.packages = F,
#               center = TRUE,
#               include.lr = F,
#               custom.model.names = c(" \\multicolumn{3}{c}{ \\textbf{Power-Sharing}} & \\multicolumn{3}{c}{ \\textbf{Foreign Aid}} \\\\ \\cmidrule(r){2-4} \\cmidrule(l){5-7} & \\multicolumn{1}{c}{(1)  }",
#                                      "\\multicolumn{1}{c}{(2)  }",
#                                      "\\multicolumn{1}{c}{(3)  }",
#                                      "\\multicolumn{1}{c}{(4)  }",
#                                      "\\multicolumn{1}{c}{(5)   }",
#                                      "\\multicolumn{1}{c}{(6)   }"))
# Output replication archive

htmlreg(l = list(model_ps, 
                 model_seniorCOUNT, 
                 model_nonseniorCOUNT, 
                 model_gov_aid, 
                 model_program_aid, 
                 model_commodity_aid), 
        reorder.coef = c(1, 9, 10, 11:13, 2:8),
        stars = c(0.001, 0.01, 0.05, 0.1),
        symbol = "+",
        caption = "", 
        custom.multicol = T,
        custom.coef.names = c("Intercept",
                              "Power-Sharing (cabinet)",
                              "Aid / GDP (log)",
                              "GDP p/c (log)",
                              "Population (log)",
                              "Conflict intensity",
                              "Non-State Violence",
                              "Nat. res. rents",
                              "Regime Type (Freedom House)",
                              "Power-Sharing (senior)",
                              "Power-Sharing (nonsenior)", 
                              "Democracy Aid/GDP (log)", 
                              "Program Aid/GDP (log)", 
                              "Budget Aid/GDP (log)"),
        omit.coef = "Intercept",
        table = FALSE, 
        dcolumn = T,
        booktabs = T,
        use.packages = F,
        center = TRUE,
        include.lr = F,
        star.symbol = "\\*")
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) 0.01 0.01 0.01 0.01
(0.02) (0.02) (0.02) (0.02)
Power-Sharing (senior) 0.04
(0.05)
Power-Sharing (nonsenior) 0.01
(0.02)
Democracy Aid/GDP (log) 0.13
(0.09)
Program Aid/GDP (log) 0.08
(0.11)
Budget Aid/GDP (log) 0.04
(0.07)
Aid / GDP (log) -0.03 -0.03 -0.03 -0.05 -0.05 -0.04
(0.04) (0.04) (0.04) (0.04) (0.05) (0.05)
GDP p/c (log) -0.11+ -0.11+ -0.11+ -0.10+ -0.09 -0.11+
(0.06) (0.06) (0.06) (0.06) (0.07) (0.06)
Population (log) 0.00 0.00 0.00 0.00 0.01 0.00
(0.03) (0.03) (0.03) (0.03) (0.03) (0.03)
Conflict intensity -0.05 -0.06 -0.05 -0.09 -0.07 -0.06
(0.08) (0.09) (0.08) (0.09) (0.09) (0.09)
Non-State Violence -0.36*** -0.36*** -0.36*** -0.33** -0.35** -0.35***
(0.11) (0.11) (0.11) (0.11) (0.11) (0.11)
Nat. res. rents -0.01+ -0.01* -0.01+ -0.01* -0.01* -0.01+
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type (Freedom House) 0.87*** 0.87*** 0.87*** 0.87*** 0.87*** 0.87***
(0.04) (0.04) (0.04) (0.04) (0.04) (0.04)
Num. obs. 272 272 272 272 272 272
R2 0.80 0.80 0.80 0.81 0.80 0.80
Adj. R2 0.80 0.80 0.80 0.80 0.80 0.80
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table B.2: Temporal Dynamics for the Interaction Effect between Power-Sharing and Foreign aid on Democracy Score

# Libraries
library(tidyverse)
library(cowplot)
library(lfe)
library(tikzDevice)

# Data
load("./data/diss_df.rda")

# Prepare data frame for multiple plots
polity_vars <- list(
  polity2_t1 = diss_df,
  polity2_t2 = diss_df, 
  polity2_t3 = diss_df, 
  polity2_t4 = diss_df, 
  polity2_t5 = diss_df, 
  fh_t1 = diss_df,
  fh_t2 = diss_df, 
  fh_t3 = diss_df, 
  fh_t4 = diss_df, 
  fh_t5 = diss_df
)

# create data frame with list column
polity_vars <- enframe(polity_vars)

# define function that will be applied to every data frame in the list column
main_model <- function(lead_type, data) {
  data <- as.data.frame(data)
  data$lead_var <- data[, grep(lead_type, names(data), value =T)]
   
  if(grepl("fh", lead_type)) {
      model <- lfe::felm(lead_var ~
                       cabinetCOUNT *
                       aiddata_AidGDP_ln +
                       log(GDP_per_capita) +
                       log(population) +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       fh | 0 | 0 | GWNo,
                       data=data)
    return(model)
  } else {
    model <- lfe::felm(lead_var ~
                       cabinetCOUNT *
                       aiddata_AidGDP_ln +
                       log(GDP_per_capita) +
                       log(population) +
                       conf_intens +
                       nonstate +
                       WBnatres +
                       polity2 | 0 | 0 | GWNo,
                       data=data)
    return(model)
  }
}


# fit models & post-process data for plotting
model_all <- polity_vars %>% 
  mutate(model = map2(name, value, ~ main_model(.x, .y))) 

# output for manuscript
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')
# 
# custom_texreg(model_all$model,
#               file = "../output/temp_dynamics_democ_app.tex",
#               stars = c(0.001, 0.01, 0.05, 0.1),
#         include.adjrs = T, 
#         include.rsquared = F,
#               center = TRUE,
#               symbol = "+",
#               reorder.coef = c(1, 2, 9, 3:8, 10),
#         custom.coef.names = c("Intercept",
#                               "Power-sharing (binary)",
#                               "Aid / GDP (log)",
#                               "GDP p/c (log)",
#                               "Population (log)",
#                               "Conflict intensity",
#                               "Non-State Violence",
#                               "Nat. res. rents",
#                               "Polity",
#                               "Power-sharing (cabinet) * Aid",
#                               "Freedom House"),
#         omit.coef = "Intercept",
#         table = FALSE, 
#         custom.multicol = F, 
#         dcolumn = T,
#         booktabs = T,
#         use.packages = F)

# output replication archive
htmlreg(model_all$model,
        stars = c(0.001, 0.01, 0.05, 0.1),
        include.adjrs = T, 
        caption = "", 
        include.rsquared = F,
        center = TRUE,
        symbol = "+",
        reorder.coef = c(1, 2, 9, 3:8, 10),
        custom.coef.names = c("Intercept",
                              "Power-sharing (binary)",
                              "Aid / GDP (log)",
                              "GDP p/c (log)",
                              "Population (log)",
                              "Conflict intensity",
                              "Non-State Violence",
                              "Nat. res. rents",
                              "Polity",
                              "Power-sharing (cabinet) * Aid",
                              "Freedom House"),
        omit.coef = "Intercept",
        table = FALSE, 
        custom.multicol = T, 
        dcolumn = T,
        booktabs = T,
        use.packages = F,
        star.symbol = "\\*", 
        include.lr = F)
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6 Model 7 Model 8 Model 9 Model 10
Power-sharing (binary) -0.10+ -0.17+ -0.22+ -0.26+ -0.31+ -0.01 -0.05+ -0.09** -0.09* -0.05
(0.06) (0.09) (0.12) (0.14) (0.17) (0.02) (0.03) (0.03) (0.04) (0.05)
Aid / GDP (log) -0.02 -0.02 -0.01 0.02 0.08 -0.01 -0.03 -0.03 -0.01 0.02
(0.09) (0.15) (0.18) (0.20) (0.21) (0.03) (0.04) (0.04) (0.05) (0.06)
Power-sharing (cabinet) * Aid 0.06*** 0.11*** 0.14** 0.17** 0.19** 0.01 0.02* 0.04** 0.03** 0.02
(0.02) (0.03) (0.04) (0.05) (0.06) (0.01) (0.01) (0.01) (0.01) (0.02)
GDP p/c (log) -0.15 -0.08 0.19 0.56 0.83 -0.06+ -0.10+ -0.08 -0.03 0.04
(0.16) (0.32) (0.44) (0.52) (0.53) (0.04) (0.06) (0.09) (0.12) (0.15)
Population (log) 0.03 -0.02 -0.03 -0.11 -0.04 0.00 0.00 0.01 0.00 0.02
(0.09) (0.12) (0.14) (0.19) (0.24) (0.02) (0.03) (0.04) (0.06) (0.07)
Conflict intensity 0.08 0.09 0.16 0.01 -0.21 -0.03 -0.07 -0.08 -0.10 -0.12
(0.31) (0.47) (0.61) (0.72) (0.83) (0.06) (0.09) (0.12) (0.14) (0.19)
Non-State Violence -0.52 -0.45 -0.19 0.39 0.37 -0.22** -0.38*** -0.36* -0.33+ -0.34
(0.35) (0.51) (0.65) (0.80) (0.88) (0.07) (0.11) (0.15) (0.19) (0.24)
Nat. res. rents -0.02* -0.04* -0.05+ -0.07* -0.07* -0.01** -0.01+ -0.01 -0.01 -0.01
(0.01) (0.02) (0.03) (0.03) (0.03) (0.00) (0.00) (0.01) (0.01) (0.01)
Polity 0.90*** 0.82*** 0.75*** 0.66*** 0.58***
(0.04) (0.07) (0.09) (0.10) (0.11)
Freedom House 0.94*** 0.87*** 0.83*** 0.80*** 0.75***
(0.03) (0.04) (0.05) (0.06) (0.08)
Num. obs. 263 263 255 244 233 273 272 271 263 252
Adj. R2 (full model) 0.85 0.76 0.69 0.62 0.57 0.89 0.80 0.74 0.69 0.62
Adj. R2 (proj model) 0.85 0.76 0.69 0.62 0.57 0.89 0.80 0.74 0.69 0.62
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table B.3: Technical Robustness Checks I: Outlier Test and XPOLITY and Interregnum Bias Correction

# Library
library(rms)
library(dplyr)

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

##### Outlier #####

# Load outlier function
source("./functions/outlier_analysis.R")

# Estimate baseline model
model_polity_cabcount <- ols(polity2_t2 ~  
                        cabinetCOUNT * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        polity2 ,
                      data=diss_df, x=T, y=T)
model_polity_cabcount <- robcov(model_polity_cabcount, diss_df$GWNo)

# selector variables
selectvars = c("Location", "year", "identifiers")
diss_df$identifiers <- paste(diss_df$GWNo, diss_df$year, sep = "-")

# Estimate outliers
democ_outliers <- check_outlier(model_polity_cabcount, 
                                      data = diss_df,
                                      selectvars = selectvars, 
                                clustervar = "GWNo")

#### XPOLITY & Interregnum Bias ####

# First load regular Plumper & Neumayer correction
load("./data/polity2_xpolity_plumper_corrected.rdata")
names(polity_rev)[2] <- "GWNo"

# Fix Serbia for correct merging
polity_rev$GWNo <- ifelse(polity_rev$country == "Yugoslavia", 345, polity_rev$GWNo)
polity_rev$GWNo <- ifelse(polity_rev$country == "Serbia and Montenegro", 345, polity_rev$GWNo)

polity_rev_orig <- polity_rev


# Second load xpolity combined with Plumper & Neumayer correction
load("./data/polity2_xpolity_plumper_corrected_combined.rdata")
names(polity_rev)[2] <- "GWNo"

# Fix Serbia
polity_rev$GWNo <- ifelse(polity_rev$country == "Yugoslavia", 345, polity_rev$GWNo)
polity_rev$GWNo <- ifelse(polity_rev$country == "Serbia and Montenegro", 345, polity_rev$GWNo)


polity_rev <- left_join(polity_rev_orig, polity_rev[, c("GWNo", "year", "xpolity_inter", 
                                                        "xpolity_max", 
                                                        "xpolity_min")], 
                        by = c("GWNo", "year"))

# merge xpolity & interregnum data in main data set
testdf <- merge(diss_df, polity_rev[, c("GWNo", "year", 
                                       "polity2min", "polity2max", "polity2inter",
                                       "xpolity_inter", 
                                       "xpolity_max", 
                                       "xpolity_min")], by = c("GWNo", "year"), all.x = TRUE)



# Data transformations -----------------------------------------------------

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

#### For Plumper & Neumayer correction

# Polity 2 Min
testdf <- laggedVar(testdf, polity_rev, lVar="polity2min", tID ="year", gID="GWNo", lagBy = -2)

# Polity2 Max
testdf <- laggedVar(testdf, polity_rev, lVar="polity2max", tID ="year", gID="GWNo", lagBy = -2)

# Polity2 Inter
testdf <- laggedVar(testdf, polity_rev, lVar="polity2inter", tID ="year", gID="GWNo", lagBy = -2)

#### XPOLITY

# xpolity min
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_min", tID ="year", gID="GWNo", lagBy = -2)

# xpolity max
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_max", tID ="year", gID="GWNo", lagBy = -2)

# xpolity inter
testdf <- laggedVar(testdf, polity_rev, lVar="xpolity_inter", tID ="year", gID="GWNo", lagBy = -2)


## Run XPOLITY & Interregnum Bias models

# xpolity min
model_xpol_min <- ols(xpolity_min_t2 ~  
                          cabinetCOUNT + 
                          aiddata_AidGDP_ln +
                          cabinetCOUNT : aiddata_AidGDP_ln +
                          log(GDP_per_capita) +
                          log(population) +
                          conf_intens +
                          nonstate + 
                          WBnatres +
                          xpolity_min,
                        data=testdf, x=T, y=T)
model_xpol_min <- robcov(model_xpol_min, testdf$GWNo)


# xpolity min
model_xpol_max <- ols(xpolity_max_t2 ~  
                        cabinetCOUNT + 
                        aiddata_AidGDP_ln +
                        cabinetCOUNT : aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        xpolity_max,
                      data=testdf, x=T, y=T)
model_xpol_max <- robcov(model_xpol_max, testdf$GWNo)


# xpolity inter
model_xpol_inter <- ols(xpolity_inter_t2 ~  
                    cabinetCOUNT + 
                    aiddata_AidGDP_ln +
                    cabinetCOUNT : aiddata_AidGDP_ln +
                    log(GDP_per_capita) +
                    log(population) +
                    conf_intens +
                    nonstate + 
                    WBnatres +
                    xpolity_inter,
                  data=testdf, x=T, y=T)
model_xpol_inter <- robcov(model_xpol_inter, testdf$GWNo)

# Models for Plumper & Neumayer (interregnum bias) ------------------------

# polity 2 min
model_pchng_p2min <- ols(polity2min_t2 ~  
                     cabinetCOUNT + 
                     aiddata_AidGDP_ln +
                     cabinetCOUNT : aiddata_AidGDP_ln +
                     log(GDP_per_capita) +
                     log(population) +
                     conf_intens +
                     nonstate + 
                     WBnatres +
                     polity2min,
                   data=testdf, x=T, y=T)
model_pchng_p2min <- robcov(model_pchng_p2min, testdf$GWNo)

# polity 2 max
model_pchng_p2max <- ols(polity2max_t2 ~  
                           cabinetCOUNT + 
                           aiddata_AidGDP_ln +
                           cabinetCOUNT : aiddata_AidGDP_ln +
                           log(GDP_per_capita) +
                           log(population) +
                           conf_intens +
                           nonstate + 
                           WBnatres +
                           polity2max ,
                         data=testdf, x=T, y=T)
model_pchng_p2max <- robcov(model_pchng_p2max, testdf$GWNo)

# polity 2 interpolated
model_pchng_p2inter <- ols(polity2inter_t2 ~  
                           cabinetCOUNT * 
                           aiddata_AidGDP_ln +
                           log(GDP_per_capita) +
                           log(population) +
                           conf_intens +
                           nonstate + 
                           WBnatres +
                           polity2inter,
                         data=testdf, x=T, y=T)
model_pchng_p2inter <- robcov(model_pchng_p2inter, testdf$GWNo)


# Output Replication Archive

## Determine order of coefficients in output table
name_map_robustness <- list(cabinetCOUNT = "PS (cabinet)",
                            aiddata_AidGDP_ln = "Aid / GDP (log)",
                            "cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid", 
                            GDP_per_capita = "GDP p/c",
                            population = "Population",
                            conf_intens = "Conflict Intensity",
                            nonstate = "Non-State Violence",
                            WBnatres = "Nat. Res. Rents",
                            polity2 = "Polity", 
                            polity2inter = "Polity (Interpolated)", 
                            polity2max = "Polity (Max)", 
                            polity2min = "Polity (Min)", 
                            xpolity_inter = "XPOLITY (Interpolated)", 
                            xpolity_max = "XPOLITY (Max)", 
                            xpolity_min = "XPOLITY (Min)")

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

# Model list
app_rob_models <- list(democ_outliers[[2]], 
                       democ_outliers[[4]], 
                       democ_outliers[[6]], 
                       model_pchng_p2inter, 
                       model_pchng_p2max, 
                       model_pchng_p2min, 
                       model_xpol_inter, 
                       model_xpol_max, 
                       model_xpol_min)

oldnames <- all.varnames.dammit(app_rob_models)
ror <- build.ror(oldnames, name_map_robustness)

# texreg
# texreg(l = app_rob_models,
#         stars = c(0.001, 0.01, 0.05, 0.1),
#         symbol = "+",
#         table = F,
#         booktabs = T,
#         use.packages = F,
#         dcolumn = T,
#         file = "../output/democ_app_tech_robustness.tex",
#         # custom.model.names = c("(1) ELF",
#         #                        "(2) PKO",
#         #                        "(3) Cabinet Size",
#         #                        "(4) Random Effects",
#         #                        "(5) Region FE",
#         #                        "(6) Country FE"),
#         custom.coef.names = ror$ccn, 
#         omit.coef = ror$oc, 
#         reorder.coef = unique(ror$rc),
#         include.lr = F)

# Replication Archive output
htmlreg(l = app_rob_models,
        stars = c(0.001, 0.01, 0.05, 0.1),
        symbol = "+",
        table = F,
        booktabs = T,
        caption = "", 
        use.packages = F,
        dcolumn = T,
        custom.coef.names = ror$ccn, 
        omit.coef = ror$oc, 
        reorder.coef = unique(ror$rc),
        star.symbol = "\\*", 
        include.lr = F)
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6 Model 7 Model 8 Model 9
PS (cabinet) -0.60 -0.17*** -0.14*** -0.09 -0.09 -0.13 -0.07 -0.07 -0.11+
(0.55) (0.04) (0.04) (0.07) (0.08) (0.08) (0.05) (0.05) (0.06)
Aid / GDP (log) -0.01 -0.02 -0.02 -0.02 -0.00 -0.01 0.01 0.02 0.02
(0.16) (0.07) (0.05) (0.15) (0.14) (0.15) (0.11) (0.11) (0.11)
PS (cabinet) * Aid 0.28 0.10*** 0.08*** 0.08** 0.06+ 0.13*** 0.06** 0.05* 0.09***
(0.26) (0.02) (0.02) (0.03) (0.03) (0.03) (0.02) (0.02) (0.02)
GDP p/c 0.00 0.08 -0.02 -0.11 -0.07 -0.11 -0.03 -0.01 -0.03
(0.35) (0.16) (0.10) (0.32) (0.31) (0.32) (0.23) (0.23) (0.23)
Population 0.01 -0.06 -0.05 -0.03 -0.03 0.01 0.01 0.02 0.04
(0.12) (0.07) (0.06) (0.11) (0.11) (0.11) (0.09) (0.09) (0.09)
Conflict Intensity 0.25 0.02 0.04 0.05 0.05 0.11 -0.02 -0.02 0.03
(0.54) (0.25) (0.16) (0.53) (0.53) (0.55) (0.39) (0.39) (0.41)
Non-State Violence -0.55 -0.10 -0.20 -0.04 -0.23 0.04 -0.24 -0.34 -0.09
(0.58) (0.23) (0.14) (0.52) (0.50) (0.59) (0.45) (0.44) (0.49)
Nat. Res. Rents -0.05** -0.01 -0.01+ -0.04+ -0.04* -0.04+ -0.03+ -0.03* -0.03+
(0.02) (0.01) (0.00) (0.02) (0.02) (0.02) (0.01) (0.01) (0.01)
Polity 0.80*** 0.94*** 0.97***
(0.07) (0.03) (0.02)
Polity (Interpolated) 0.82***
(0.07)
Polity (Max) 0.82***
(0.07)
Polity (Min) 0.80***
(0.07)
XPOLITY (Interpolated) 0.82***
(0.07)
XPOLITY (Max) 0.82***
(0.06)
XPOLITY (Min) 0.80***
(0.07)
Num. obs. 242 252 223 254 254 254 254 254 254
R2 0.76 0.90 0.97 0.78 0.78 0.78 0.77 0.77 0.76
Adj. R2 0.75 0.89 0.97 0.77 0.77 0.77 0.76 0.76 0.76
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table B.5: Matching Tables and Balance Diagnostics

# Balance diagnostics (table) ---------------------------------

# Libraries
library(dplyr)
library(MatchIt)
library(texreg)
library(rms)
library(tidyr)
library(ggplot2)
library(tikzDevice)
library(xtable)

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

# select relevant variables
match_democ_data <- diss_df %>% 
  ungroup() %>% 
  dplyr::select(cabinetINC, cabinetCOUNT, seniorINC,
                seniorCOUNT, nonseniorINC, nonseniorCOUNT,
                aiddata_AidGDP, population, nonstate,
                WBnatres, fh, GDP_per_capita, conf_intens,
                aiddata_AidGDP_ln, 
                GWNo, year, 
                polity_chng, polity2, polity2_t2, # check 
                fh, fh_chng, fh_t2,
                pc_period, Location, ln_pop, ln_gdp_pc)

# keep only complete cases (necessary for matching)
match_democ_data <- match_democ_data[complete.cases(match_democ_data), ]

# generate pretreatment controls: control variables in first post-conflict year
match_democ_data <- match_democ_data %>% 
  arrange(GWNo, pc_period, year) %>% 
  group_by(GWNo, pc_period) %>% 
  mutate(match_aiddata_AidGDP_ln = first(aiddata_AidGDP_ln),
         match_pop = first(population),
         match_gdp = first(GDP_per_capita),
         match_nonstate = first(nonstate),
         match_WBnatres = first(WBnatres),
         match_polity = first(polity2), 
         match_fh = first(fh))

# explicitly convert to data frame
match_democ_data <- as.data.frame(match_democ_data)


# Perform matching algorithm ------------------------------------------

set.seed(123)
match_democ_res <- matchit(cabinetINC ~
                          match_aiddata_AidGDP_ln +
                          log(match_gdp) +
                          log(match_pop) +
                          conf_intens + # conf_intens is already pre-treatment
                          match_nonstate +
                          log(match_WBnatres + 1)  +
                          match_polity,
                        method = "nearest",
                        distance = "mahalanobis",
                        ratio = 2,
                        data = match_democ_data)

# extract data
match_democ_df <- match.data(match_democ_res)

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

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

# First: the imbalance reduction tables before and after matching.
library(ebal)

# before matching
imb_before <- Matching::MatchBalance(cabinetINC ~ 
                             match_aiddata_AidGDP_ln +
                             log(match_gdp) +
                             log(match_pop) +
                             conf_intens + # conf_intens is already pre-treatment
                             match_nonstate +
                             log(match_WBnatres + 1)  +
                             match_polity, 
                           data = match_democ_data, 
                           digits = 2,
                           ks = T, print.level = 0) # data before matching

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

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

# Imbalance After Matching
imb_after <- Matching::MatchBalance(cabinetINC ~ 
                            match_aiddata_AidGDP_ln +
                            log(match_gdp) +
                            log(match_pop) +
                            conf_intens + # conf_intens is already pre-treatment
                            match_nonstate +
                            log(match_WBnatres + 1)  +
                            match_polity, 
                          data = match_democ_df, 
                          digits = 2,
                          ks = T, print.level = 0) # data before matching

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

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


# Balance tables before / after output

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

# output imbalance tables fro replication archive
print(xtable(imbalance_tab_before), booktabs = T, type = "html")
Mean Treated Mean Control P-Value T-Test P-Value K-S Test
Aid / GDP (log) 2.16 1.41 0.00 0.00
GDP / PC (log) 6.32 6.55 0.13 0.07
Population (log) 15.54 15.91 0.17 0.02
Conflict Intensity 0.29 0.26 0.70
Nonstate Conflict 0.45 0.12 0.00
Natural Resource Rents (log) 1.71 1.78 0.78 0.17
Regime Type (Polity) 2.05 1.70 0.68 0.34
print(xtable(imbalance_tab_after), booktabs = T, type = "html")
Mean Treated Mean Control P-Value T-Test P-Value K-S Test
Aid / GDP (log) 2.16 2.09 0.74 0.40
GDP / PC (log) 6.32 6.34 0.89 0.17
Population (log) 15.54 15.77 0.44 0.01
Conflict Intensity 0.29 0.26 0.77
Nonstate Conflict 0.45 0.33 0.23
Natural Resource Rents (log) 1.71 1.75 0.91 0.44
Regime Type (Polity) 2.05 1.82 0.80 0.56

Table B.6: First Stage and Reduced Form Results

# load libraries
library(AER)
library(ivpack)
library(lmtest)
library(lfe)
library(rms)
library(tikzDevice)

# load data with instrument; this gives "instrument_df" data frame
load(file = "./data/instrumentedAid2.RData")
load("./data/diss_df.rda")

diss_df_iv <- merge(diss_df, 
                      instrument_df, 
                      by = c("iso2c", "year"), all.x = TRUE)


# subset only complete.cases / necessary for cluster.robust.se()
iv_na <- na.omit(diss_df_iv[, c("polity_chng", 
                               "cabinetCOUNT", 
                               "cabinetINC", 
                               "aiddata_Aid",
                               "aiddata_AidGDP_ln",
                               "aiddata_AidPC_ln",
                               "fh",
                               "fh_t2",
                               "GDP_per_capita", 
                               "population", 
                               "conf_intens", 
                               "WBnatres", 
                               "polity2", 
                               "polity2_t2",
                               "total_sum_except", 
                               "year", 
                               "GWNo", 
                               "GDP",
                               "nonstate")])

# to proceed with IV estimation I first hard-code the instrument
iv_na$instr_aid_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)

# data transformation for Stata
iv_na$ln_gdp_pc <- log(iv_na$GDP_per_capita)
iv_na$ln_pop <- log(iv_na$population)


# First Stage Results
iv_fs_aid <- ols(aiddata_AidGDP_ln ~
                   log(total_sum_except / GDP) + 
                   cabinetCOUNT  +
                   log(GDP_per_capita) +
                   log(population) +
                   conf_intens +
                   nonstate + 
                   WBnatres +
                   polity2, 
                 data = iv_na, x = T, y = T)

iv_fs_aid <- robcov(iv_fs_aid, iv_na$GWNo)

# IV * cabinetCOUNT => aid * cabinetCOUNT
iv_fs_aidinteraction <- ols(aiddata_AidGDP_ln * cabinetCOUNT ~
                   log(total_sum_except / GDP) * 
                   cabinetCOUNT  +
                   log(GDP_per_capita) +
                   log(population) +
                   conf_intens +
                   nonstate + 
                   WBnatres +
                   polity2, 
                 data = iv_na, x = T, y = T)

iv_fs_aidinteraction <- robcov(iv_fs_aidinteraction, iv_na$GWNo)


# reduced form: Polity
reduced_form_polity <- ols(polity2_t2 ~  
                             cabinetCOUNT * 
                             log(total_sum_except / GDP) +
                             log(GDP_per_capita) +
                             log(population) +
                             conf_intens +
                             nonstate + 
                             WBnatres +
                             polity2,
                           data=iv_na, x=T, y=T)
reduced_form_polity <- robcov(reduced_form_polity, iv_na$GWNo)

# reduced form: Freedom House
reduced_form_fh <- ols(fh_t2 ~  
                             cabinetCOUNT * 
                             log(total_sum_except / GDP) +
                             log(GDP_per_capita) +
                             log(population) +
                             conf_intens +
                             nonstate + 
                             WBnatres +
                             fh,
                           data=iv_na, x=T, y=T)
reduced_form_fh <- robcov(reduced_form_fh, iv_na$GWNo)


# Output: create variable list order

name_map <- list(total_sum_except = "Aid/GDP (Instrumented)",
                 "total_sum_except * cabinetCOUNT"  = "Aid/GDP (Instrumented) * Power-Sharing (cabinet)",
                 "cabinetCOUNT * total_sum_except"  = "Aid/GDP (Instrumented) * Power-Sharing (cabinet)",
                 cabinetCOUNT = "Power-Sharing (cabinet)",
                 "log(GDP_per_capita)" = "GDP p/c",
                 "log(population)" = "Population",
                 conf_intens = "Conflict Intensity",
                 nonstate = "Non-State Violence",
                 WBnatres = "Nat. Res. Rents",
                 polity2 = "Regime Type (Polity)",
                 fh = "Regime Type (Freedom House)")

# Output for Manuscript
# texreg(l = list(iv_fs_aid, 
#                  iv_fs_aidinteraction, 
#                  reduced_form_polity, 
#                  reduced_form_fh),
#         custom.coef.map = name_map,
#        file = "../output/iv_democ_firststage_reduced.tex",
#         stars = c(0.001, 0.01, 0.05, 0.1),
#         symbol = "+",
#         table = F,
#         custom.model.names = c("(1) DV: Aid", "(2) Aid * PS Interaction", 
#                                "(3) Reduced Form - Polity", "(4) Reduced Form - FH"),
#         booktabs = T,
#         use.packages = F,
#         dcolumn = T,
#         include.lr = F)

# Output for Replication Archivie
htmlreg(l = list(iv_fs_aid, 
                 iv_fs_aidinteraction, 
                 reduced_form_polity, 
                 reduced_form_fh),
        custom.coef.map = name_map,
        caption = "", 
        stars = c(0.001, 0.01, 0.05, 0.1),
        symbol = "+",
        table = F,
        custom.model.names = c("(1) DV: Aid", "(2) Aid * PS Interaction", 
                               "(3) Reduced Form - Polity", "(4) Reduced Form - FH"),
        booktabs = T,
        use.packages = F,
        dcolumn = T,
        star.symbol = "\\*", 
        include.lr = F)
(1) DV: Aid (2) Aid * PS Interaction (3) Reduced Form - Polity (4) Reduced Form - FH
Aid/GDP (Instrumented) 0.70*** -0.09 0.26 0.10***
(0.08) (0.07) (0.17) (0.03)
Aid/GDP (Instrumented) * Power-Sharing (cabinet) 1.03*** 0.10* 0.03**
(0.22) (0.05) (0.01)
Power-Sharing (cabinet) 0.04* -19.18*** -2.08* -0.72**
(0.02) (4.67) (0.99) (0.25)
Conflict Intensity 0.51** 0.37* 0.00 -0.12
(0.19) (0.18) (0.43) (0.10)
Non-State Violence 0.02 0.74 -0.29 -0.31*
(0.31) (0.57) (0.53) (0.13)
Nat. Res. Rents -0.00 0.00 -0.04* -0.01*
(0.01) (0.01) (0.02) (0.00)
Regime Type (Polity) -0.00 -0.01 0.80***
(0.02) (0.02) (0.07)
Regime Type (Freedom House) 0.84***
(0.04)
Num. obs. 260 260 260 260
R2 0.68 0.94 0.77 0.81
Adj. R2 0.67 0.94 0.76 0.80
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
LS0tDQp0aXRsZTogIkFwcGVuZGl4IGZvciBDaGFwdGVyIDU6IERlbW9jcmF0aXphdGlvbiBTY29yZXMiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQotLS0NCg0KIyBUYWJsZSBCLjE6IEluZGl2aWR1YWwgRWZmZWN0cyBvZiBQb3dlci1TaGFyaW5nIGFuZCBGb3JlaWduIEFpZCBvbiBGcmVlZG9tIEhvdXNlIHNjb3Jlcw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJpZXMNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeShybXMpDQoNCiMgTG9hZCBkYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQojIHNwZWNpZnkgdmVjdG9yIHdpdGggY29udHJvbCB2YXJzDQpjb250cm9sdmFycyA8LSBjKCJsb2coYWlkZGF0YV9BaWRHRFApIiwNCiAgICAgICAgICAgICAgICAgImxvZyhHRFBfcGVyX2NhcGl0YSkiLA0KICAgICAgICAgICAgICAgICAibG9nKHBvcHVsYXRpb24pIiwNCiAgICAgICAgICAgICAgICAgImNvbmZfaW50ZW5zIiwgDQogICAgICAgICAgICAgICAgICJub25zdGF0ZSIsDQogICAgICAgICAgICAgICAgICJXQm5hdHJlcyIsDQogICAgICAgICAgICAgICAgICJmaCIpDQoNCiMjIyMgUG93ZXItU2hhcmluZyBvbmx5IE1vZGVscyAjIyMjDQoNCiMgUFMgb25seSArIGNhYmluZXRDT1VOVA0KbW9kZWxfcHMgPC0gb2xzKGZvcm11bGEocGFzdGUwKCJmaF90MiB+IGNhYmluZXRDT1VOVCArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjb250cm9sdmFycywgY29sbGFwc2UgPSAiICsgIikpKSwNCiAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHMgPC0gcm9iY292KG1vZGVsX3BzLCBkaXNzX2RmJEdXTm8pDQoNCiMgUFMgb25seSArIHNlbmlvckNPVU5UDQptb2RlbF9zZW5pb3JDT1VOVCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gc2VuaW9yQ09VTlQgKyAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoY29udHJvbHZhcnMsIGNvbGxhcHNlID0gIiArICIpKSksDQogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIHggPSBULCB5ID0gVCkNCm1vZGVsX3NlbmlvckNPVU5UIDwtIHJvYmNvdihtb2RlbF9zZW5pb3JDT1VOVCwgZGlzc19kZiRHV05vKQ0KDQojIFBTIG9ubHkgKyBub25zZW5pb3JDT1VOVA0KbW9kZWxfbm9uc2VuaW9yQ09VTlQgPC0gb2xzKGZvcm11bGEocGFzdGUwKCJmaF90MiB+IG5vbnNlbmlvckNPVU5UICsgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKGNvbnRyb2x2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCB4ID0gVCwgeSA9IFQpDQptb2RlbF9ub25zZW5pb3JDT1VOVCA8LSByb2Jjb3YobW9kZWxfbm9uc2VuaW9yQ09VTlQsIGRpc3NfZGYkR1dObykNCg0KIyMjIyBBaWQtb25seSBNb2RlbHMgIyMjIw0KDQojIERHQQ0KbW9kZWxfZ292X2FpZCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gY2FiaW5ldENPVU5UICsgbG9nKGRnYV9nZHBfemVybyArIDEpICsgIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXN0ZTAoY29udHJvbHZhcnMsIGNvbGxhcHNlID0gIiArICIpKSkNCiAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9nb3ZfYWlkIDwtIHJvYmNvdihtb2RlbF9nb3ZfYWlkLCBkaXNzX2RmJEdXTm8pDQoNCiMgUHJvZ3JhbSBBaWQNCm1vZGVsX3Byb2dyYW1fYWlkIDwtIG9scyhmb3JtdWxhKHBhc3RlMCgiZmhfdDIgfiBjYWJpbmV0Q09VTlQgKyBsb2cocHJvZ3JhbV9haWRfZ2RwX3plcm8gKyAxKSArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3RlMChjb250cm9sdmFycywgY29sbGFwc2UgPSAiICsgIikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcHJvZ3JhbV9haWQgPC0gcm9iY292KG1vZGVsX3Byb2dyYW1fYWlkLCBkaXNzX2RmJEdXTm8pDQoNCiMgQnVkZ2V0IEFpZA0KbW9kZWxfY29tbW9kaXR5X2FpZCA8LSBvbHMoZm9ybXVsYShwYXN0ZTAoImZoX3QyIH4gY2FiaW5ldENPVU5UICsgbG9nKGNvbW1vZGl0eV9haWRfZ2RwX3plcm8gKyAxKSArICIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUwKGNvbnRyb2x2YXJzLCBjb2xsYXBzZSA9ICIgKyAiKSkpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfY29tbW9kaXR5X2FpZCA8LSByb2Jjb3YobW9kZWxfY29tbW9kaXR5X2FpZCwgZGlzc19kZiRHV05vKQ0KDQoNCiMgT3V0cHV0IG1hbnVzY3JpcHQNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0KDQojIGN1c3RvbV90ZXhyZWcobCA9IGxpc3QobW9kZWxfcHMsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3NlbmlvckNPVU5ULCANCiMgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9ub25zZW5pb3JDT1VOVCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfZ292X2FpZCwgDQojICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfcHJvZ3JhbV9haWQsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX2NvbW1vZGl0eV9haWQpLCANCiMgICAgICAgICAgICAgICBmaWxlID0gIi4uL291dHB1dC9pbmRfZWZmZWN0c19maC50ZXgiLA0KIyAgICAgICAgICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMSwgOSwgMTAsIDExOjEzLCAyOjgpLA0KIyAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQojICAgICAgICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSBjKCJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbiAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdC4gcmVzLiByZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItU2hhcmluZyAoc2VuaW9yKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChub25zZW5pb3IpIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhY3kgQWlkL0dEUCAobG9nKSIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbSBBaWQvR0RQIChsb2cpIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdWRnZXQgQWlkL0dEUCAobG9nKSIpLA0KIyAgICAgICAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgICAgICAgIHRhYmxlID0gRkFMU0UsIA0KIyAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgICAgICAgIGdyb3VwcyA9IGxpc3QoIlBvd2VyLVNoYXJpbmciID0gMTozLCAiQWlkIiA9IDQ6NywgIkNvbnRyb2xzIiAgPSA4OjEzKSwNCiMgICAgICAgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgICAgICAgIyBhZGQubGluZXMgPSBsaXN0KGMoIkNvbnRyb2xzIiwgcmVwKCJcXG11bHRpY29sdW1uezF9e2N9e1llc30iLCA2KSkpLCANCiMgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgICAgICAgIGNlbnRlciA9IFRSVUUsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQojICAgICAgICAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme1Bvd2VyLVNoYXJpbmd9fSAmIFxcbXVsdGljb2x1bW57M317Y317IFxcdGV4dGJme0ZvcmVpZ24gQWlkfX0gXFxcXCBcXGNtaWRydWxlKHIpezItNH0gXFxjbWlkcnVsZShsKXs1LTd9ICYgXFxtdWx0aWNvbHVtbnsxfXtjfXsoMSkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDIpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eygzKSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNCkgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDUpICAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoNikgICB9IikpDQojIE91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQoNCmh0bWxyZWcobCA9IGxpc3QobW9kZWxfcHMsIA0KICAgICAgICAgICAgICAgICBtb2RlbF9zZW5pb3JDT1VOVCwgDQogICAgICAgICAgICAgICAgIG1vZGVsX25vbnNlbmlvckNPVU5ULCANCiAgICAgICAgICAgICAgICAgbW9kZWxfZ292X2FpZCwgDQogICAgICAgICAgICAgICAgIG1vZGVsX3Byb2dyYW1fYWlkLCANCiAgICAgICAgICAgICAgICAgbW9kZWxfY29tbW9kaXR5X2FpZCksIA0KICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDksIDEwLCAxMToxMywgMjo4KSwNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsDQogICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAgcC9jIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0LiByZXMuIHJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKHNlbmlvcikiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLVNoYXJpbmcgKG5vbnNlbmlvcikiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEZW1vY3JhY3kgQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW0gQWlkL0dEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJ1ZGdldCBBaWQvR0RQIChsb2cpIiksDQogICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KICAgICAgICB0YWJsZSA9IEZBTFNFLCANCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgY2VudGVyID0gVFJVRSwNCiAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIpDQoNCg0KYGBgDQoNCiMgVGFibGUgQi4yOiBUZW1wb3JhbCBEeW5hbWljcyBmb3IgdGhlIEludGVyYWN0aW9uIEVmZmVjdCBiZXR3ZWVuIFBvd2VyLVNoYXJpbmcgYW5kIEZvcmVpZ24gYWlkIG9uIERlbW9jcmFjeSBTY29yZQ0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY293cGxvdCkNCmxpYnJhcnkobGZlKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KDQojIERhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgUHJlcGFyZSBkYXRhIGZyYW1lIGZvciBtdWx0aXBsZSBwbG90cw0KcG9saXR5X3ZhcnMgPC0gbGlzdCgNCiAgcG9saXR5Ml90MSA9IGRpc3NfZGYsDQogIHBvbGl0eTJfdDIgPSBkaXNzX2RmLCANCiAgcG9saXR5Ml90MyA9IGRpc3NfZGYsIA0KICBwb2xpdHkyX3Q0ID0gZGlzc19kZiwgDQogIHBvbGl0eTJfdDUgPSBkaXNzX2RmLCANCiAgZmhfdDEgPSBkaXNzX2RmLA0KICBmaF90MiA9IGRpc3NfZGYsIA0KICBmaF90MyA9IGRpc3NfZGYsIA0KICBmaF90NCA9IGRpc3NfZGYsIA0KICBmaF90NSA9IGRpc3NfZGYNCikNCg0KIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIGxpc3QgY29sdW1uDQpwb2xpdHlfdmFycyA8LSBlbmZyYW1lKHBvbGl0eV92YXJzKQ0KDQojIGRlZmluZSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgYXBwbGllZCB0byBldmVyeSBkYXRhIGZyYW1lIGluIHRoZSBsaXN0IGNvbHVtbg0KbWFpbl9tb2RlbCA8LSBmdW5jdGlvbihsZWFkX3R5cGUsIGRhdGEpIHsNCiAgZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGRhdGEpDQogIGRhdGEkbGVhZF92YXIgPC0gZGF0YVssIGdyZXAobGVhZF90eXBlLCBuYW1lcyhkYXRhKSwgdmFsdWUgPVQpXQ0KICAgDQogIGlmKGdyZXBsKCJmaCIsIGxlYWRfdHlwZSkpIHsNCiAgICAgIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIGZoIHwgMCB8IDAgfCBHV05vLA0KICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRhdGEpDQogICAgcmV0dXJuKG1vZGVsKQ0KICB9IGVsc2Ugew0KICAgIG1vZGVsIDwtIGxmZTo6ZmVsbShsZWFkX3ZhciB+DQogICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqDQogICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgfCAwIHwgMCB8IEdXTm8sDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGF0YSkNCiAgICByZXR1cm4obW9kZWwpDQogIH0NCn0NCg0KDQojIGZpdCBtb2RlbHMgJiBwb3N0LXByb2Nlc3MgZGF0YSBmb3IgcGxvdHRpbmcNCm1vZGVsX2FsbCA8LSBwb2xpdHlfdmFycyAlPiUgDQogIG11dGF0ZShtb2RlbCA9IG1hcDIobmFtZSwgdmFsdWUsIH4gbWFpbl9tb2RlbCgueCwgLnkpKSkgDQoNCiMgb3V0cHV0IGZvciBtYW51c2NyaXB0DQpzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQplbnZpcm9ubWVudChjdXN0b21fdGV4cmVnKSA8LSBhc05hbWVzcGFjZSgndGV4cmVnJykNCiMgDQojIGN1c3RvbV90ZXhyZWcobW9kZWxfYWxsJG1vZGVsLA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L3RlbXBfZHluYW1pY3NfZGVtb2NfYXBwLnRleCIsDQojICAgICAgICAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KIyAgICAgICAgIGluY2x1ZGUuYWRqcnMgPSBULCANCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICAgICAgICBjZW50ZXIgPSBUUlVFLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICByZW9yZGVyLmNvZWYgPSBjKDEsIDIsIDksIDM6OCwgMTApLA0KIyAgICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvd2VyLXNoYXJpbmcgKGJpbmFyeSkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWlkIC8gR0RQIChsb2cpIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG9wdWxhdGlvbiAobG9nKSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCBpbnRlbnNpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdC4gcmVzLiByZW50cyIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb2xpdHkiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItc2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJlZWRvbSBIb3VzZSIpLA0KIyAgICAgICAgIG9taXQuY29lZiA9ICJJbnRlcmNlcHQiLA0KIyAgICAgICAgIHRhYmxlID0gRkFMU0UsIA0KIyAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IEYsIA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGKQ0KDQojIG91dHB1dCByZXBsaWNhdGlvbiBhcmNoaXZlDQpodG1scmVnKG1vZGVsX2FsbCRtb2RlbCwNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBpbmNsdWRlLmFkanJzID0gVCwgDQogICAgICAgIGNhcHRpb24gPSAiIiwgDQogICAgICAgIGluY2x1ZGUucnNxdWFyZWQgPSBGLA0KICAgICAgICBjZW50ZXIgPSBUUlVFLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHJlb3JkZXIuY29lZiA9IGMoMSwgMiwgOSwgMzo4LCAxMCksDQogICAgICAgIGN1c3RvbS5jb2VmLm5hbWVzID0gYygiSW50ZXJjZXB0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3dlci1zaGFyaW5nIChiaW5hcnkpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCBwL2MgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IGludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOYXQuIHJlcy4gcmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvbGl0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUG93ZXItc2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZWVkb20gSG91c2UiKSwNCiAgICAgICAgb21pdC5jb2VmID0gIkludGVyY2VwdCIsDQogICAgICAgIHRhYmxlID0gRkFMU0UsIA0KICAgICAgICBjdXN0b20ubXVsdGljb2wgPSBULCANCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQogICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KDQpgYGANCg0KDQoNCiMgVGFibGUgQi4zOiBUZWNobmljYWwgUm9idXN0bmVzcyBDaGVja3MgSTogT3V0bGllciBUZXN0IGFuZCBYUE9MSVRZIGFuZCBJbnRlcnJlZ251bSBCaWFzIENvcnJlY3Rpb24NCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgTGlicmFyeQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIExvYWQgZGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyMjIyMgT3V0bGllciAjIyMjIw0KDQojIExvYWQgb3V0bGllciBmdW5jdGlvbg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9vdXRsaWVyX2FuYWx5c2lzLlIiKQ0KDQojIEVzdGltYXRlIGJhc2VsaW5lIG1vZGVsDQptb2RlbF9wb2xpdHlfY2FiY291bnQgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYmNvdW50IDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KIyBzZWxlY3RvciB2YXJpYWJsZXMNCnNlbGVjdHZhcnMgPSBjKCJMb2NhdGlvbiIsICJ5ZWFyIiwgImlkZW50aWZpZXJzIikNCmRpc3NfZGYkaWRlbnRpZmllcnMgPC0gcGFzdGUoZGlzc19kZiRHV05vLCBkaXNzX2RmJHllYXIsIHNlcCA9ICItIikNCg0KIyBFc3RpbWF0ZSBvdXRsaWVycw0KZGVtb2Nfb3V0bGllcnMgPC0gY2hlY2tfb3V0bGllcihtb2RlbF9wb2xpdHlfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0dmFycyA9IHNlbGVjdHZhcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVydmFyID0gIkdXTm8iKQ0KDQojIyMjIFhQT0xJVFkgJiBJbnRlcnJlZ251bSBCaWFzICMjIyMNCg0KIyBGaXJzdCBsb2FkIHJlZ3VsYXIgUGx1bXBlciAmIE5ldW1heWVyIGNvcnJlY3Rpb24NCmxvYWQoIi4vZGF0YS9wb2xpdHkyX3hwb2xpdHlfcGx1bXBlcl9jb3JyZWN0ZWQucmRhdGEiKQ0KbmFtZXMocG9saXR5X3JldilbMl0gPC0gIkdXTm8iDQoNCiMgRml4IFNlcmJpYSBmb3IgY29ycmVjdCBtZXJnaW5nDQpwb2xpdHlfcmV2JEdXTm8gPC0gaWZlbHNlKHBvbGl0eV9yZXYkY291bnRyeSA9PSAiWXVnb3NsYXZpYSIsIDM0NSwgcG9saXR5X3JldiRHV05vKQ0KcG9saXR5X3JldiRHV05vIDwtIGlmZWxzZShwb2xpdHlfcmV2JGNvdW50cnkgPT0gIlNlcmJpYSBhbmQgTW9udGVuZWdybyIsIDM0NSwgcG9saXR5X3JldiRHV05vKQ0KDQpwb2xpdHlfcmV2X29yaWcgPC0gcG9saXR5X3Jldg0KDQoNCiMgU2Vjb25kIGxvYWQgeHBvbGl0eSBjb21iaW5lZCB3aXRoIFBsdW1wZXIgJiBOZXVtYXllciBjb3JyZWN0aW9uDQpsb2FkKCIuL2RhdGEvcG9saXR5Ml94cG9saXR5X3BsdW1wZXJfY29ycmVjdGVkX2NvbWJpbmVkLnJkYXRhIikNCm5hbWVzKHBvbGl0eV9yZXYpWzJdIDwtICJHV05vIg0KDQojIEZpeCBTZXJiaWENCnBvbGl0eV9yZXYkR1dObyA8LSBpZmVsc2UocG9saXR5X3JldiRjb3VudHJ5ID09ICJZdWdvc2xhdmlhIiwgMzQ1LCBwb2xpdHlfcmV2JEdXTm8pDQpwb2xpdHlfcmV2JEdXTm8gPC0gaWZlbHNlKHBvbGl0eV9yZXYkY291bnRyeSA9PSAiU2VyYmlhIGFuZCBNb250ZW5lZ3JvIiwgMzQ1LCBwb2xpdHlfcmV2JEdXTm8pDQoNCg0KcG9saXR5X3JldiA8LSBsZWZ0X2pvaW4ocG9saXR5X3Jldl9vcmlnLCBwb2xpdHlfcmV2WywgYygiR1dObyIsICJ5ZWFyIiwgInhwb2xpdHlfaW50ZXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhwb2xpdHlfbWF4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4cG9saXR5X21pbiIpXSwgDQogICAgICAgICAgICAgICAgICAgICAgICBieSA9IGMoIkdXTm8iLCAieWVhciIpKQ0KDQojIG1lcmdlIHhwb2xpdHkgJiBpbnRlcnJlZ251bSBkYXRhIGluIG1haW4gZGF0YSBzZXQNCnRlc3RkZiA8LSBtZXJnZShkaXNzX2RmLCBwb2xpdHlfcmV2WywgYygiR1dObyIsICJ5ZWFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9saXR5Mm1pbiIsICJwb2xpdHkybWF4IiwgInBvbGl0eTJpbnRlciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHBvbGl0eV9pbnRlciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhwb2xpdHlfbWF4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieHBvbGl0eV9taW4iKV0sIGJ5ID0gYygiR1dObyIsICJ5ZWFyIiksIGFsbC54ID0gVFJVRSkNCg0KDQoNCiMgRGF0YSB0cmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0Kc291cmNlKCIuL2Z1bmN0aW9ucy9sYWdnZWRWYXIuUiIpDQoNCiMjIyMgRm9yIFBsdW1wZXIgJiBOZXVtYXllciBjb3JyZWN0aW9uDQoNCiMgUG9saXR5IDIgTWluDQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0icG9saXR5Mm1pbiIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIFBvbGl0eTIgTWF4DQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0icG9saXR5Mm1heCIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIFBvbGl0eTIgSW50ZXINCnRlc3RkZiA8LSBsYWdnZWRWYXIodGVzdGRmLCBwb2xpdHlfcmV2LCBsVmFyPSJwb2xpdHkyaW50ZXIiLCB0SUQgPSJ5ZWFyIiwgZ0lEPSJHV05vIiwgbGFnQnkgPSAtMikNCg0KIyMjIyBYUE9MSVRZDQoNCiMgeHBvbGl0eSBtaW4NCnRlc3RkZiA8LSBsYWdnZWRWYXIodGVzdGRmLCBwb2xpdHlfcmV2LCBsVmFyPSJ4cG9saXR5X21pbiIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQojIHhwb2xpdHkgbWF4DQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0ieHBvbGl0eV9tYXgiLCB0SUQgPSJ5ZWFyIiwgZ0lEPSJHV05vIiwgbGFnQnkgPSAtMikNCg0KIyB4cG9saXR5IGludGVyDQp0ZXN0ZGYgPC0gbGFnZ2VkVmFyKHRlc3RkZiwgcG9saXR5X3JldiwgbFZhcj0ieHBvbGl0eV9pbnRlciIsIHRJRCA9InllYXIiLCBnSUQ9IkdXTm8iLCBsYWdCeSA9IC0yKQ0KDQoNCiMjIFJ1biBYUE9MSVRZICYgSW50ZXJyZWdudW0gQmlhcyBtb2RlbHMNCg0KIyB4cG9saXR5IG1pbg0KbW9kZWxfeHBvbF9taW4gPC0gb2xzKHhwb2xpdHlfbWluX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9taW4sDQogICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF94cG9sX21pbiA8LSByb2Jjb3YobW9kZWxfeHBvbF9taW4sIHRlc3RkZiRHV05vKQ0KDQoNCiMgeHBvbGl0eSBtaW4NCm1vZGVsX3hwb2xfbWF4IDwtIG9scyh4cG9saXR5X21heF90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UIDogYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhwb2xpdHlfbWF4LA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3hwb2xfbWF4IDwtIHJvYmNvdihtb2RlbF94cG9sX21heCwgdGVzdGRmJEdXTm8pDQoNCg0KIyB4cG9saXR5IGludGVyDQptb2RlbF94cG9sX2ludGVyIDwtIG9scyh4cG9saXR5X2ludGVyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9pbnRlciwNCiAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3hwb2xfaW50ZXIgPC0gcm9iY292KG1vZGVsX3hwb2xfaW50ZXIsIHRlc3RkZiRHV05vKQ0KDQojIE1vZGVscyBmb3IgUGx1bXBlciAmIE5ldW1heWVyIChpbnRlcnJlZ251bSBiaWFzKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBwb2xpdHkgMiBtaW4NCm1vZGVsX3BjaG5nX3AybWluIDwtIG9scyhwb2xpdHkybWluX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsgDQogICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgOiBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgcG9saXR5Mm1pbiwNCiAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF9wY2huZ19wMm1pbiA8LSByb2Jjb3YobW9kZWxfcGNobmdfcDJtaW4sIHRlc3RkZiRHV05vKQ0KDQojIHBvbGl0eSAyIG1heA0KbW9kZWxfcGNobmdfcDJtYXggPC0gb2xzKHBvbGl0eTJtYXhfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA6IGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkybWF4ICwNCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPXRlc3RkZiwgeD1ULCB5PVQpDQptb2RlbF9wY2huZ19wMm1heCA8LSByb2Jjb3YobW9kZWxfcGNobmdfcDJtYXgsIHRlc3RkZiRHV05vKQ0KDQojIHBvbGl0eSAyIGludGVycG9sYXRlZA0KbW9kZWxfcGNobmdfcDJpbnRlciA8LSBvbHMocG9saXR5MmludGVyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MmludGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9dGVzdGRmLCB4PVQsIHk9VCkNCm1vZGVsX3BjaG5nX3AyaW50ZXIgPC0gcm9iY292KG1vZGVsX3BjaG5nX3AyaW50ZXIsIHRlc3RkZiRHV05vKQ0KDQoNCiMgT3V0cHV0IFJlcGxpY2F0aW9uIEFyY2hpdmUNCg0KIyMgRGV0ZXJtaW5lIG9yZGVyIG9mIGNvZWZmaWNpZW50cyBpbiBvdXRwdXQgdGFibGUNCm5hbWVfbWFwX3JvYnVzdG5lc3MgPC0gbGlzdChjYWJpbmV0Q09VTlQgPSAiUFMgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiA9ICJBaWQgLyBHRFAgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlQgKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RQX3Blcl9jYXBpdGEgPSAiR0RQIHAvYyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyID0gIlBvbGl0eSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTJpbnRlciA9ICJQb2xpdHkgKEludGVycG9sYXRlZCkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkybWF4ID0gIlBvbGl0eSAoTWF4KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTJtaW4gPSAiUG9saXR5IChNaW4pIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9pbnRlciA9ICJYUE9MSVRZIChJbnRlcnBvbGF0ZWQpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBvbGl0eV9tYXggPSAiWFBPTElUWSAoTWF4KSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwb2xpdHlfbWluID0gIlhQT0xJVFkgKE1pbikiKQ0KDQpzb3VyY2UoIi4vZnVuY3Rpb25zL3dpbGxfbG93ZV90ZXhyZWdfcmVvcmRlci5SIikNCg0KIyBNb2RlbCBsaXN0DQphcHBfcm9iX21vZGVscyA8LSBsaXN0KGRlbW9jX291dGxpZXJzW1syXV0sIA0KICAgICAgICAgICAgICAgICAgICAgICBkZW1vY19vdXRsaWVyc1tbNF1dLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGVtb2Nfb3V0bGllcnNbWzZdXSwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BjaG5nX3AyaW50ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wY2huZ19wMm1heCwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BjaG5nX3AybWluLCANCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfeHBvbF9pbnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3hwb2xfbWF4LCANCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZWxfeHBvbF9taW4pDQoNCm9sZG5hbWVzIDwtIGFsbC52YXJuYW1lcy5kYW1taXQoYXBwX3JvYl9tb2RlbHMpDQpyb3IgPC0gYnVpbGQucm9yKG9sZG5hbWVzLCBuYW1lX21hcF9yb2J1c3RuZXNzKQ0KDQojIHRleHJlZw0KIyB0ZXhyZWcobCA9IGFwcF9yb2JfbW9kZWxzLA0KIyAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KIyAgICAgICAgIGRjb2x1bW4gPSBULA0KIyAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2RlbW9jX2FwcF90ZWNoX3JvYnVzdG5lc3MudGV4IiwNCiMgICAgICAgICAjIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBFTEYiLA0KIyAgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIFBLTyIsDQojICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICIoMykgQ2FiaW5ldCBTaXplIiwNCiMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIig0KSBSYW5kb20gRWZmZWN0cyIsDQojICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgUmVnaW9uIEZFIiwNCiMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBDb3VudHJ5IEZFIiksDQojICAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSByb3IkY2NuLCANCiMgICAgICAgICBvbWl0LmNvZWYgPSByb3Ikb2MsIA0KIyAgICAgICAgIHJlb3JkZXIuY29lZiA9IHVuaXF1ZShyb3IkcmMpLA0KIyAgICAgICAgIGluY2x1ZGUubHIgPSBGKQ0KDQojIFJlcGxpY2F0aW9uIEFyY2hpdmUgb3V0cHV0DQpodG1scmVnKGwgPSBhcHBfcm9iX21vZGVscywNCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgICBjYXB0aW9uID0gIiIsIA0KICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgY3VzdG9tLmNvZWYubmFtZXMgPSByb3IkY2NuLCANCiAgICAgICAgb21pdC5jb2VmID0gcm9yJG9jLCANCiAgICAgICAgcmVvcmRlci5jb2VmID0gdW5pcXVlKHJvciRyYyksDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRikNCg0KDQpgYGANCg0KDQojIFRhYmxlIEIuNDogVGVjaG5pY2FsIFJvYnVzdG5lc3MgQ2hlY2tzIElJOiBCaW5hcnkgRFYsIFRpbWUgVHJlbmRzLCBhbmQgUG93ZXItU2hhcmluZyBBZ2dyZWdhdGlvbg0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCg0KIyBMaWJyYXJ5DQpsaWJyYXJ5KHJtcykNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRleHJlZykNCg0KIyBMb2FkIGRhdGENCmxvYWQoIi4vZGF0YS9kaXNzX2RmLnJkYSIpDQoNCiMgQmluYXJ5IERWIA0KbW9kZWxfcG9saW5jIDwtIGxybShwb2xfaW5jIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiArICBwY3kgKyBwY3kyICsgcGN5MyAsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGluYyA8LSByb2Jjb3YobW9kZWxfcG9saW5jLCBkaXNzX2RmJEdXTm8pDQoNCiMgVGltZSBUcmVuZA0KbW9kZWxfcG9saXR5X3RpbWUgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGN5ICsgcGN5MiArIHBjeTMsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGl0eV90aW1lIDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfdGltZSwgZGlzc19kZiRHV05vKQ0KDQojIHllYXIgRkUNCmRpc3NfZGYkeWVhckZFIDwtIGFzLmZhY3RvcihkaXNzX2RmJHllYXIpDQptb2RlbF9wb2xpdHlfeWVhcmZlIDwtIG9scyhwb2xpdHkyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgcG9saXR5MiArDQogICAgICAgICAgICAgICAgICAgICAgICB5ZWFyRkUsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX3BvbGl0eV95ZWFyZmUgPC0gcm9iY292KG1vZGVsX3BvbGl0eV95ZWFyZmUsIGRpc3NfZGYkR1dObykNCg0KIyBkaWZmZXJlbnQgY2FiaW5ldCBhZ2dyZWdhdGlvbiB0eXBlcw0KbW9kZWxfcG9saXR5X2NhYm1heCA8LSBvbHMocG9saXR5Ml90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVF9tYXggKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYm1heCA8LSByb2Jjb3YobW9kZWxfcG9saXR5X2NhYm1heCwgZGlzc19kZiRHV05vKQ0KDQptb2RlbF9wb2xpdHlfY2FibWluIDwtIG9scyhwb2xpdHkyX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UX21pbiAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9wb2xpdHlfY2FibWluIDwtIHJvYmNvdihtb2RlbF9wb2xpdHlfY2FibWluLCBkaXNzX2RmJEdXTm8pDQoNCg0KbW9kZWxfcG9saXR5X2NhYnNpeCA8LSBvbHMocG9saXR5Ml90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVF9zaXggKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBwb2xpdHkyICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfcG9saXR5X2NhYnNpeCA8LSByb2Jjb3YobW9kZWxfcG9saXR5X2NhYnNpeCwgZGlzc19kZiRHV05vKQ0KDQoNCiMgbGlzdCBtb2RlbHMNCg0KdGVjaF9yb2JfbW9kZWxzIDwtIGxpc3QobW9kZWxfcG9saW5jLCBtb2RlbF9wb2xpdHlfdGltZSwgDQogICAgICAgICAgICAgICAgICAgICAgICBtb2RlbF9wb2xpdHlfeWVhcmZlLCBtb2RlbF9wb2xpdHlfY2FibWF4LCANCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsX3BvbGl0eV9jYWJtaW4sIG1vZGVsX3BvbGl0eV9jYWJzaXgpDQoNCmNvZWZfbWFwIDwtIGxpc3QoY2FiaW5ldENPVU5UID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWF4ID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWluID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfc2l4ID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVF9tYXggKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UX21pbiAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlRfc2l4ICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICBHRFBfcGVyX2NhcGl0YSA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW9uID0gIlBvcHVsYXRpb24iLA0KICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwgDQogICAgICAgICAgICAgICAgICAgcGN5ID0gIlRpbWUiLCANCiAgICAgICAgICAgICAgICAgICBwY3kyID0gIlRpbWUkXjIkIiwgDQogICAgICAgICAgICAgICAgICAgcGN5MyA9ICJUaW1lJF4zJCIpDQoNCiMgT3V0cHV0IE1hbnVzY3JpcHQNCiMgDQojIHRleHJlZyh0ZWNoX3JvYl9tb2RlbHMsIA0KIyAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbWFwLCANCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2RlbW9jX2FwcF90ZWNoX3JvYnVzdG5lc3MyLnRleCIsIA0KIyAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBMb2dpdDogQmluYXJ5IERWIiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIE9MUzogQ3ViaWMgVGltZSBUcmVuZCIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBPTFM6IFllYXIgRkUiLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig0KSBQUzogTWF4IiwgDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIFBTOiBNaW4iLCANCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNikgUFM6IFNpeCBNb250aHMiKSwNCiMgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgc3ltYm9sID0gIisiLA0KIyAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICBib29rdGFicyA9IFQsDQojICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiMgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICBpbmNsdWRlLmxyID0gRiwNCiMgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiMgICAgICAgICBjYXB0aW9uID0gIiIpDQoNCg0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKHRlY2hfcm9iX21vZGVscywgDQogICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbWFwLCANCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIExvZ2l0OiBCaW5hcnkgRFYiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIE9MUzogQ3ViaWMgVGltZSBUcmVuZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMykgT0xTOiBZZWFyIEZFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFBTOiBNYXgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIFBTOiBNaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDYpIFBTOiBTaXggTW9udGhzIiksDQogICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIGluY2x1ZGUubHIgPSBGLA0KICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgY2FwdGlvbiA9ICIiKQ0KDQoNCmBgYA0KDQoNCiMgVGFibGUgQi41OiBNYXRjaGluZyBUYWJsZXMgYW5kIEJhbGFuY2UgRGlhZ25vc3RpY3MNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQoNCiMgQmFsYW5jZSBkaWFnbm9zdGljcyAodGFibGUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIExpYnJhcmllcw0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoTWF0Y2hJdCkNCmxpYnJhcnkodGV4cmVnKQ0KbGlicmFyeShybXMpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KbGlicmFyeSh4dGFibGUpDQoNCiMgTG9hZCBkYXRhIA0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBzZWxlY3QgcmVsZXZhbnQgdmFyaWFibGVzDQptYXRjaF9kZW1vY19kYXRhIDwtIGRpc3NfZGYgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGNhYmluZXRJTkMsIGNhYmluZXRDT1VOVCwgc2VuaW9ySU5DLA0KICAgICAgICAgICAgICAgIHNlbmlvckNPVU5ULCBub25zZW5pb3JJTkMsIG5vbnNlbmlvckNPVU5ULA0KICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQLCBwb3B1bGF0aW9uLCBub25zdGF0ZSwNCiAgICAgICAgICAgICAgICBXQm5hdHJlcywgZmgsIEdEUF9wZXJfY2FwaXRhLCBjb25mX2ludGVucywNCiAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiwgDQogICAgICAgICAgICAgICAgR1dObywgeWVhciwgDQogICAgICAgICAgICAgICAgcG9saXR5X2NobmcsIHBvbGl0eTIsIHBvbGl0eTJfdDIsICMgY2hlY2sgDQogICAgICAgICAgICAgICAgZmgsIGZoX2NobmcsIGZoX3QyLA0KICAgICAgICAgICAgICAgIHBjX3BlcmlvZCwgTG9jYXRpb24sIGxuX3BvcCwgbG5fZ2RwX3BjKQ0KDQojIGtlZXAgb25seSBjb21wbGV0ZSBjYXNlcyAobmVjZXNzYXJ5IGZvciBtYXRjaGluZykNCm1hdGNoX2RlbW9jX2RhdGEgPC0gbWF0Y2hfZGVtb2NfZGF0YVtjb21wbGV0ZS5jYXNlcyhtYXRjaF9kZW1vY19kYXRhKSwgXQ0KDQojIGdlbmVyYXRlIHByZXRyZWF0bWVudCBjb250cm9sczogY29udHJvbCB2YXJpYWJsZXMgaW4gZmlyc3QgcG9zdC1jb25mbGljdCB5ZWFyDQptYXRjaF9kZW1vY19kYXRhIDwtIG1hdGNoX2RlbW9jX2RhdGEgJT4lIA0KICBhcnJhbmdlKEdXTm8sIHBjX3BlcmlvZCwgeWVhcikgJT4lIA0KICBncm91cF9ieShHV05vLCBwY19wZXJpb2QpICU+JSANCiAgbXV0YXRlKG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuID0gZmlyc3QoYWlkZGF0YV9BaWRHRFBfbG4pLA0KICAgICAgICAgbWF0Y2hfcG9wID0gZmlyc3QocG9wdWxhdGlvbiksDQogICAgICAgICBtYXRjaF9nZHAgPSBmaXJzdChHRFBfcGVyX2NhcGl0YSksDQogICAgICAgICBtYXRjaF9ub25zdGF0ZSA9IGZpcnN0KG5vbnN0YXRlKSwNCiAgICAgICAgIG1hdGNoX1dCbmF0cmVzID0gZmlyc3QoV0JuYXRyZXMpLA0KICAgICAgICAgbWF0Y2hfcG9saXR5ID0gZmlyc3QocG9saXR5MiksIA0KICAgICAgICAgbWF0Y2hfZmggPSBmaXJzdChmaCkpDQoNCiMgZXhwbGljaXRseSBjb252ZXJ0IHRvIGRhdGEgZnJhbWUNCm1hdGNoX2RlbW9jX2RhdGEgPC0gYXMuZGF0YS5mcmFtZShtYXRjaF9kZW1vY19kYXRhKQ0KDQoNCiMgUGVyZm9ybSBtYXRjaGluZyBhbGdvcml0aG0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCnNldC5zZWVkKDEyMykNCm1hdGNoX2RlbW9jX3JlcyA8LSBtYXRjaGl0KGNhYmluZXRJTkMgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArICMgY29uZl9pbnRlbnMgaXMgYWxyZWFkeSBwcmUtdHJlYXRtZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX25vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcG9saXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gIm5lYXJlc3QiLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSAibWFoYWxhbm9iaXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW8gPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG1hdGNoX2RlbW9jX2RhdGEpDQoNCiMgZXh0cmFjdCBkYXRhDQptYXRjaF9kZW1vY19kZiA8LSBtYXRjaC5kYXRhKG1hdGNoX2RlbW9jX3JlcykNCg0KIyBJbWJhbGFuY2UgUmVkdWN0aW9uIFRhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBUaGlzIHNlY3Rpb24gY3JlYXRlcyB0aGUgbWF0Y2hpbmcgZGlhZ25vc3RpY3M6IEZpcnN0IHRoZSBpbWJhbGFuY2UgcmVkdWN0aW9uIGFzDQojIHRhYmxlcyBpbmNsdWRpbmcgdGhlIHQtdGVzdCBhbmQgSy1TIHRlc3QgZm9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0cmVhdGVkDQojIGFuZCBjb250cm9sLiBBbmQgYWxzbyBhIGJhbGFuY2UgaW1wcm92bWVudCBwbG90LiANCg0KIyBGaXJzdDogdGhlIGltYmFsYW5jZSByZWR1Y3Rpb24gdGFibGVzIGJlZm9yZSBhbmQgYWZ0ZXIgbWF0Y2hpbmcuDQpsaWJyYXJ5KGViYWwpDQoNCiMgYmVmb3JlIG1hdGNoaW5nDQppbWJfYmVmb3JlIDwtIE1hdGNoaW5nOjpNYXRjaEJhbGFuY2UoY2FiaW5ldElOQyB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9haWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhtYXRjaF9nZHApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArICMgY29uZl9pbnRlbnMgaXMgYWxyZWFkeSBwcmUtdHJlYXRtZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX25vbnN0YXRlICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfcG9saXR5LCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBtYXRjaF9kZW1vY19kYXRhLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IFQsIHByaW50LmxldmVsID0gMCkgIyBkYXRhIGJlZm9yZSBtYXRjaGluZw0KDQojIG5vdGUgdGhhdCBvcmRlciBvZiBjb3ZhcmlhdGVzIGluIE1hdGNoQmFsYW5jZSBpcyBpbXBvcnRhbnQgdG8gZ2V0IHJvdyBuYW1lcyByaWdodA0KaW1iYWxhbmNlX3RhYl9iZWZvcmUgPC0gZWJhbDo6YmFsdGVzdC5jb2xsZWN0KGltYl9iZWZvcmUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkFpZCAvIEdEUCAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUCAvIFBDIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29uZmxpY3QgSW50ZW5zaXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb25zdGF0ZSBDb25mbGljdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2ltZSBUeXBlIChQb2xpdHkpIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gRikNCiMgZG8gbm90IHJlcG9ydCBhbGwgc3RhdGlzdGljcw0KaW1iYWxhbmNlX3RhYl9iZWZvcmUgPC0gaW1iYWxhbmNlX3RhYl9iZWZvcmVbLCBjKCJtZWFuLlRyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lYW4uQ28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVCBwdmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktTIHB2YWwiKV0NCg0KY29sbmFtZXMoaW1iYWxhbmNlX3RhYl9iZWZvcmUpIDwtICBjKCJNZWFuIFRyZWF0ZWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhbiBDb250cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgVC1UZXN0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlAtVmFsdWUgSy1TIFRlc3QiKQ0KDQojIEltYmFsYW5jZSBBZnRlciBNYXRjaGluZw0KaW1iX2FmdGVyIDwtIE1hdGNoaW5nOjpNYXRjaEJhbGFuY2UoY2FiaW5ldElOQyB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX2FpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cobWF0Y2hfZ2RwKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX3BvcCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsgIyBjb25mX2ludGVucyBpcyBhbHJlYWR5IHByZS10cmVhdG1lbnQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9ub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKG1hdGNoX1dCbmF0cmVzICsgMSkgICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaF9wb2xpdHksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbWF0Y2hfZGVtb2NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMgPSAyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBrcyA9IFQsIHByaW50LmxldmVsID0gMCkgIyBkYXRhIGJlZm9yZSBtYXRjaGluZw0KDQojIG5vdGUgdGhhdCBvcmRlciBvZiBjb3ZhcmlhdGVzIGluIE1hdGNoQmFsYW5jZSBpcyBpbXBvcnRhbnQgdG8gZ2V0IHJvdyBuYW1lcyByaWdodA0KaW1iYWxhbmNlX3RhYl9hZnRlcjwtIGViYWw6OmJhbHRlc3QuY29sbGVjdChpbWJfYWZ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJBaWQgLyBHRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQIC8gUEMgKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQb3B1bGF0aW9uIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbnN0YXRlIENvbmZsaWN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCBSZXNvdXJjZSBSZW50cyAobG9nKSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWdpbWUgVHlwZSAoUG9saXR5KSIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSBGKQ0KaW1iYWxhbmNlX3RhYl9hZnRlciA8LSBpbWJhbGFuY2VfdGFiX2FmdGVyWywgYygibWVhbi5UciIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVhbi5DbyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVCBwdmFsIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLUyBwdmFsIildDQoNCmNvbG5hbWVzKGltYmFsYW5jZV90YWJfYWZ0ZXIpIDwtIGMoIk1lYW4gVHJlYXRlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVhbiBDb250cm9sIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQLVZhbHVlIFQtVGVzdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUC1WYWx1ZSBLLVMgVGVzdCIpDQoNCg0KIyBCYWxhbmNlIHRhYmxlcyBiZWZvcmUgLyBhZnRlciBvdXRwdXQNCg0KIyBvdXRwdXQgaW1iYWxhbmNlIHRhYmxlcw0KIyBwcmludCh4dGFibGUoaW1iYWxhbmNlX3RhYl9iZWZvcmUpLCBib29rdGFicyA9IFQsIHR5cGUgPSAibGF0ZXgiLCBmbG9hdGluZyA9IEYsDQojICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L21hdGNoaW5nX2ltYmFsYW5jZV9yZWR1Y3Rpb25fZGVtb2NfYmVmb3JlLnRleCIpDQojIHByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImxhdGV4IiwgZmxvYXRpbmcgPSBGLA0KIyAgICAgICBmaWxlID0gIi4uL291dHB1dC9tYXRjaGluZ19pbWJhbGFuY2VfcmVkdWN0aW9uX2RlbW9jX2FmdGVyLnRleCIpDQoNCiMgb3V0cHV0IGltYmFsYW5jZSB0YWJsZXMgZnJvIHJlcGxpY2F0aW9uIGFyY2hpdmUNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2JlZm9yZSksIGJvb2t0YWJzID0gVCwgdHlwZSA9ICJodG1sIikNCnByaW50KHh0YWJsZShpbWJhbGFuY2VfdGFiX2FmdGVyKSwgYm9va3RhYnMgPSBULCB0eXBlID0gImh0bWwiKQ0KDQoNCmBgYA0KDQoNCg0KDQojIFRhYmxlIEIuNjogRmlyc3QgU3RhZ2UgYW5kIFJlZHVjZWQgRm9ybSBSZXN1bHRzDQoNCmBgYHtyLCByZXN1bHRzPSJhc2lzIiwgbWVzc2FnZT1GLCB3YXJuaW5nPUYsIGNhY2hlID0gVCwgY29tbWVudHMgPSBGfQ0KDQojIGxvYWQgbGlicmFyaWVzDQpsaWJyYXJ5KEFFUikNCmxpYnJhcnkoaXZwYWNrKQ0KbGlicmFyeShsbXRlc3QpDQpsaWJyYXJ5KGxmZSkNCmxpYnJhcnkocm1zKQ0KbGlicmFyeSh0aWt6RGV2aWNlKQ0KDQojIGxvYWQgZGF0YSB3aXRoIGluc3RydW1lbnQ7IHRoaXMgZ2l2ZXMgImluc3RydW1lbnRfZGYiIGRhdGEgZnJhbWUNCmxvYWQoZmlsZSA9ICIuL2RhdGEvaW5zdHJ1bWVudGVkQWlkMi5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmX2l2IDwtIG1lcmdlKGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgIGluc3RydW1lbnRfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygiaXNvMmMiLCAieWVhciIpLCBhbGwueCA9IFRSVUUpDQoNCg0KIyBzdWJzZXQgb25seSBjb21wbGV0ZS5jYXNlcyAvIG5lY2Vzc2FyeSBmb3IgY2x1c3Rlci5yb2J1c3Quc2UoKQ0KaXZfbmEgPC0gbmEub21pdChkaXNzX2RmX2l2WywgYygicG9saXR5X2NobmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkUENfbG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZoX3QyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQX3Blcl9jYXBpdGEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9wdWxhdGlvbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25mX2ludGVucyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXQm5hdHJlcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb2xpdHkyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvbGl0eTJfdDIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbF9zdW1fZXhjZXB0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllYXIiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1dObyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRFAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25zdGF0ZSIpXSkNCg0KIyB0byBwcm9jZWVkIHdpdGggSVYgZXN0aW1hdGlvbiBJIGZpcnN0IGhhcmQtY29kZSB0aGUgaW5zdHJ1bWVudA0KaXZfbmEkaW5zdHJfYWlkX2dkcF9sbiA8LSBsb2coaXZfbmEkdG90YWxfc3VtX2V4Y2VwdCAvIGl2X25hJEdEUCkNCg0KIyBkYXRhIHRyYW5zZm9ybWF0aW9uIGZvciBTdGF0YQ0KaXZfbmEkbG5fZ2RwX3BjIDwtIGxvZyhpdl9uYSRHRFBfcGVyX2NhcGl0YSkNCml2X25hJGxuX3BvcCA8LSBsb2coaXZfbmEkcG9wdWxhdGlvbikNCg0KDQojIEZpcnN0IFN0YWdlIFJlc3VsdHMNCml2X2ZzX2FpZCA8LSBvbHMoYWlkZGF0YV9BaWRHRFBfbG4gfg0KICAgICAgICAgICAgICAgICAgIGxvZyh0b3RhbF9zdW1fZXhjZXB0IC8gR0RQKSArIA0KICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gaXZfbmEsIHggPSBULCB5ID0gVCkNCg0KaXZfZnNfYWlkIDwtIHJvYmNvdihpdl9mc19haWQsIGl2X25hJEdXTm8pDQoNCiMgSVYgKiBjYWJpbmV0Q09VTlQgPT4gYWlkICogY2FiaW5ldENPVU5UDQppdl9mc19haWRpbnRlcmFjdGlvbiA8LSBvbHMoYWlkZGF0YV9BaWRHRFBfbG4gKiBjYWJpbmV0Q09VTlQgfg0KICAgICAgICAgICAgICAgICAgIGxvZyh0b3RhbF9zdW1fZXhjZXB0IC8gR0RQKSAqIA0KICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsIA0KICAgICAgICAgICAgICAgICBkYXRhID0gaXZfbmEsIHggPSBULCB5ID0gVCkNCg0KaXZfZnNfYWlkaW50ZXJhY3Rpb24gPC0gcm9iY292KGl2X2ZzX2FpZGludGVyYWN0aW9uLCBpdl9uYSRHV05vKQ0KDQoNCiMgcmVkdWNlZCBmb3JtOiBQb2xpdHkNCnJlZHVjZWRfZm9ybV9wb2xpdHkgPC0gb2xzKHBvbGl0eTJfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2codG90YWxfc3VtX2V4Y2VwdCAvIEdEUCkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPWl2X25hLCB4PVQsIHk9VCkNCnJlZHVjZWRfZm9ybV9wb2xpdHkgPC0gcm9iY292KHJlZHVjZWRfZm9ybV9wb2xpdHksIGl2X25hJEdXTm8pDQoNCiMgcmVkdWNlZCBmb3JtOiBGcmVlZG9tIEhvdXNlDQpyZWR1Y2VkX2Zvcm1fZmggPC0gb2xzKGZoX3QyIH4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHRvdGFsX3N1bV9leGNlcHQgLyBHRFApICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9aXZfbmEsIHg9VCwgeT1UKQ0KcmVkdWNlZF9mb3JtX2ZoIDwtIHJvYmNvdihyZWR1Y2VkX2Zvcm1fZmgsIGl2X25hJEdXTm8pDQoNCg0KIyBPdXRwdXQ6IGNyZWF0ZSB2YXJpYWJsZSBsaXN0IG9yZGVyDQoNCm5hbWVfbWFwIDwtIGxpc3QodG90YWxfc3VtX2V4Y2VwdCA9ICJBaWQvR0RQIChJbnN0cnVtZW50ZWQpIiwNCiAgICAgICAgICAgICAgICAgInRvdGFsX3N1bV9leGNlcHQgKiBjYWJpbmV0Q09VTlQiICA9ICJBaWQvR0RQIChJbnN0cnVtZW50ZWQpICogUG93ZXItU2hhcmluZyAoY2FiaW5ldCkiLA0KICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogdG90YWxfc3VtX2V4Y2VwdCIgID0gIkFpZC9HRFAgKEluc3RydW1lbnRlZCkgKiBQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICJsb2coR0RQX3Blcl9jYXBpdGEpIiA9ICJHRFAgcC9jIiwNCiAgICAgICAgICAgICAgICAgImxvZyhwb3B1bGF0aW9uKSIgPSAiUG9wdWxhdGlvbiIsDQogICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgIFdCbmF0cmVzID0gIk5hdC4gUmVzLiBSZW50cyIsDQogICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUmVnaW1lIFR5cGUgKFBvbGl0eSkiLA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRnJlZWRvbSBIb3VzZSkiKQ0KDQojIE91dHB1dCBmb3IgTWFudXNjcmlwdA0KIyB0ZXhyZWcobCA9IGxpc3QoaXZfZnNfYWlkLCANCiMgICAgICAgICAgICAgICAgICBpdl9mc19haWRpbnRlcmFjdGlvbiwgDQojICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtX3BvbGl0eSwgDQojICAgICAgICAgICAgICAgICAgcmVkdWNlZF9mb3JtX2ZoKSwNCiMgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcCwNCiMgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2l2X2RlbW9jX2ZpcnN0c3RhZ2VfcmVkdWNlZC50ZXgiLA0KIyAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiMgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICAgdGFibGUgPSBGLA0KIyAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBEVjogQWlkIiwgIigyKSBBaWQgKiBQUyBJbnRlcmFjdGlvbiIsIA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBSZWR1Y2VkIEZvcm0gLSBQb2xpdHkiLCAiKDQpIFJlZHVjZWQgRm9ybSAtIEZIIiksDQojICAgICAgICAgYm9va3RhYnMgPSBULA0KIyAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgaW5jbHVkZS5sciA9IEYpDQoNCiMgT3V0cHV0IGZvciBSZXBsaWNhdGlvbiBBcmNoaXZpZQ0KaHRtbHJlZyhsID0gbGlzdChpdl9mc19haWQsIA0KICAgICAgICAgICAgICAgICBpdl9mc19haWRpbnRlcmFjdGlvbiwgDQogICAgICAgICAgICAgICAgIHJlZHVjZWRfZm9ybV9wb2xpdHksIA0KICAgICAgICAgICAgICAgICByZWR1Y2VkX2Zvcm1fZmgpLA0KICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBuYW1lX21hcCwNCiAgICAgICAgY2FwdGlvbiA9ICIiLCANCiAgICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIERWOiBBaWQiLCAiKDIpIEFpZCAqIFBTIEludGVyYWN0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBSZWR1Y2VkIEZvcm0gLSBQb2xpdHkiLCAiKDQpIFJlZHVjZWQgRm9ybSAtIEZIIiksDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgIHN0YXIuc3ltYm9sID0gIlxcKiIsIA0KICAgICAgICBpbmNsdWRlLmxyID0gRikNCg0KYGBgDQoNCg==