# Libraries
library(texreg)
source("functions/extract_ols_custom.R")
source("./functions/custom_texreg.R")

Table D.1: Individual Effects of Power-Sharing and Foreign Aid on Post-Conflict

Rule of Law (V-Dem Results)

# Libraries
library(texreg)
# source("functions/extract_ols_custom.R")
# source("./functions/custom_texreg.R")
library(rms)
# load Data
load("./data/diss_df.rda")


# Models 
model_ps_v2x_jucon_cabcount <- rms::ols(v2x_jucon_t2 ~
                               cabinetCOUNT +
                               aiddata_AidGDP_ln +
                               ln_gdp_pc +
                               ln_pop +
                               conf_intens +
                               nonstate + 
                               WBnatres + 
                               fh
                             ,
                             data = diss_df, 
                             x = T, y = T)
model_ps_v2x_jucon_cabcount <- rms::robcov(model_ps_v2x_jucon_cabcount, diss_df$GWNo)

model_ps_v2x_jucon_seniorcount <- rms::ols(v2x_jucon_t2 ~
                                  seniorCOUNT +
                                  aiddata_AidGDP_ln +
                                  ln_gdp_pc +
                                  ln_pop +
                                  conf_intens +
                                  nonstate + 
                                  WBnatres + 
                                  fh
                                ,
                                data = diss_df, 
                                x = T, y = T)
model_ps_v2x_jucon_seniorcount <- rms::robcov(model_ps_v2x_jucon_seniorcount, diss_df$GWNo)

model_ps_v2x_jucon_nonseniorcount <- rms::ols(v2x_jucon_t2 ~
                                     nonseniorCOUNT +
                                     aiddata_AidGDP_ln +
                                     ln_gdp_pc +
                                     ln_pop +
                                     conf_intens +
                                     nonstate + 
                                     WBnatres + 
                                     fh
                                   ,
                                   data = diss_df, 
                                   x = T, y = T)
model_ps_v2x_jucon_nonseniorcount <- rms::robcov(model_ps_v2x_jucon_nonseniorcount, diss_df$GWNo)

# Aid
model_dga_v2x_jucon_cabcount <- rms::ols(v2x_jucon_t2 ~
                                cabinetCOUNT +
                                log(dga_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_dga_v2x_jucon_cabcount <- rms::robcov(model_dga_v2x_jucon_cabcount, diss_df$GWNo)


model_pga_v2x_jucon_cabcount <- rms::ols(v2x_jucon_t2 ~
                                cabinetCOUNT +
                                log(program_aid_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_pga_v2x_jucon_cabcount <- rms::robcov(model_pga_v2x_jucon_cabcount, diss_df$GWNo)

model_bga_v2x_jucon_cabcount <- rms::ols(v2x_jucon_t2 ~
                                cabinetCOUNT +
                                log(commodity_aid_gdp_zero  + 1) +
                                aiddata_AidGDP_ln +
                                ln_gdp_pc +
                                ln_pop +
                                conf_intens +
                                nonstate + 
                                WBnatres + 
                                fh
                              ,
                              data = diss_df, 
                              x = T, y = T)
model_bga_v2x_jucon_cabcount <- rms::robcov(model_bga_v2x_jucon_cabcount, diss_df$GWNo)

# Output
model_list <- list(model_ps_v2x_jucon_cabcount, 
                   model_ps_v2x_jucon_seniorcount, 
                   model_ps_v2x_jucon_nonseniorcount, 
                   model_dga_v2x_jucon_cabcount, 
                   model_pga_v2x_jucon_cabcount, 
                   model_bga_v2x_jucon_cabcount)

coef_name_map <- list(cabinetCOUNT = "Power-Sharing (cabinet)",
                      seniorCOUNT = "Power-Sharing (senior)",
                      nonseniorCOUNT = "Power-Sharing (nonsenior)",
                      "cabinetCOUNT * aiddata_AidGDP_ln" = "PS (cabinet) * Aid", 
                      "cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
                      ps_share = "PS (cabinet share)",
                      "ps_share * aiddata_AidGDP_ln" = "PS (cabinet share) * Aid",
                      dga_gdp_zero = "DGA/GDP (log)", 
                      program_aid_gdp_zero = "Program Aid/GDP (log)", 
                      commodity_aid_gdp_zero = "Budget Aid/GDP (log)", 
                      aiddata_AidGDP_ln = "Aid / GDP (log)",
                      
                      ln_gdp_pc = "GDP p/c",
                      ln_pop = "Population",
                      conf_intens = "Conflict Intensity",
                      nonstate = "Non-State Violence",
                      WBnatres = "Nat. Res. Rents",
                      polity2 = "Polity",
                      fh = "Regime Type (FH)",
                      Ethnic = "Ethnic Frac.",
                      DS_ordinal = "UN PKO")


# custom functions to write tex output
source("./functions/custom_texreg.R")
environment(custom_texreg) <- asNamespace('texreg')


# # Output Manuscript
# custom_texreg(model_list, 
#               file = "../output/aid_ps_indeff_judind_vdem.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,
#               dcolumn = T,
#               include.rsquared = F,
#               include.cluster = T, 
#               star.symbol = "\\*", 
#               caption = "",
#               include.lr = F,
#               custom.multicol = T, 
#               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(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,
        include.cluster = T, 
        dcolumn = T,
        star.symbol = "\\*", 
        caption = "",
        include.lr = F)
Model 1 Model 2 Model 3 Model 4 Model 5 Model 6
Power-Sharing (cabinet) 0.02* 0.02* 0.02* 0.02*
(0.01) (0.01) (0.01) (0.01)
Power-Sharing (senior) 0.05*
(0.02)
Power-Sharing (nonsenior) 0.03*
(0.01)
DGA/GDP (log) 0.06
(0.04)
Program Aid/GDP (log) -0.00
(0.04)
Budget Aid/GDP (log) 0.02
(0.02)
Aid / GDP (log) -0.02** -0.02** -0.02** -0.03*** -0.02+ -0.03**
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
GDP p/c -0.05+ -0.05+ -0.05+ -0.04 -0.05 -0.05
(0.03) (0.03) (0.03) (0.03) (0.03) (0.03)
Population -0.00 -0.00 -0.00 -0.00 -0.00 -0.00
(0.02) (0.02) (0.02) (0.01) (0.02) (0.02)
Conflict Intensity -0.02 -0.02 -0.02 -0.04 -0.02 -0.03
(0.04) (0.05) (0.04) (0.04) (0.05) (0.04)
Non-State Violence -0.00 -0.00 -0.00 0.01 -0.00 0.00
(0.05) (0.05) (0.05) (0.06) (0.05) (0.05)
Nat. Res. Rents -0.00 -0.00 -0.00 -0.00 -0.00 -0.00
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type (FH) 0.13*** 0.13*** 0.13*** 0.13*** 0.13*** 0.13***
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Num. obs. 273 273 273 273 273 273
R2 0.55 0.54 0.55 0.56 0.55 0.55
Adj. R2 0.53 0.53 0.53 0.54 0.53 0.53
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table D.2: Technical Robustness Checks: Outliers, Time, and Power-Sharing Codings

# Libraries
library(texreg)
source("./functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")
library(tidyverse)
library(rms)

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

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

# Estimate baseline model
model_judind_cabcount <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh ,
                      data=diss_df, x=T, y=T)
model_judind_cabcount <- rms::robcov(model_judind_cabcount, diss_df$GWNo)

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

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




# Time 
model_judind_time <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh +
                          pcy + pcy2 + pcy3,
                      data=diss_df, x=T, y=T)
model_judind_time <- rms::robcov(model_judind_time, diss_df$GWNo)

# year FE
diss_df$yearFE <- as.factor(diss_df$year)
model_judind_yearfe <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh +
                        yearFE,
                      data=diss_df, x=T, y=T)
model_judind_yearfe <- rms::robcov(model_judind_yearfe, diss_df$GWNo)


# different cabinet aggregation types
model_judind_cabmax <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT_max * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh ,
                      data=diss_df, x=T, y=T)
model_judind_cabmax <- rms::robcov(model_judind_cabmax, diss_df$GWNo)

model_judind_cabmin <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT_min * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh ,
                      data=diss_df, x=T, y=T)
model_judind_cabmin <- rms::robcov(model_judind_cabmin, diss_df$GWNo)


model_judind_cabsix <- rms::ols(LJI_t2 ~  
                        cabinetCOUNT_six * 
                        aiddata_AidGDP_ln +
                        log(GDP_per_capita) +
                        log(population) +
                        conf_intens +
                        nonstate + 
                        WBnatres +
                        fh ,
                      data=diss_df, x=T, y=T)
model_judind_cabsix <- rms::robcov(model_judind_cabsix, diss_df$GWNo)

model_list <- list(judind_outliers[[2]], 
          judind_outliers[[4]],
          judind_outliers[[6]],
          model_judind_time, 
          model_judind_yearfe, 
          model_judind_cabmax, 
          model_judind_cabmin, 
          model_judind_cabsix)

coef_map <- list(cabinetCOUNT = "Power-Sharing (cabinet)",
                   cabinetCOUNT_max = "Power-Sharing (cabinet)",
                   cabinetCOUNT_min = "Power-Sharing (cabinet)",
                   cabinetCOUNT_six = "Power-Sharing (cabinet)",
                   "cabinetCOUNT * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                   "cabinetCOUNT_max * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                   "cabinetCOUNT_min * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                   "cabinetCOUNT_six * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                   aiddata_AidGDP_ln = "Aid / GDP (log)",
                   GDP_per_capita = "GDP p/c",
                   population = "Population",
                   conf_intens = "Conflict Intensity",
                   nonstate = "Non-State Violence",
                   WBnatres = "Nat. Res. Rents",
                   polity2 = "Polity", 
                 fh = "Regime Type", 
                   pcy = "Time", 
                   pcy2 = "Time$^2$", 
                   pcy3 = "Time$^3$")
# 
texreg::texreg(model_list,
       stars = c(0.001, 0.01, 0.05, 0.1),
       custom.coef.map = coef_map,
       file = "../output/aidps_judind_tech_rob.tex",
       symbol = "+",
       table = F,
       booktabs = T,
       use.packages = F,
       dcolumn = T,
       include.lr = F,
       custom.model.names = c("(1) Hat Values",
                              "(2) Cook's Distance",
                              "(3) DFBETA",

                              "(4) Cubic Time Trend",
                               "(5) Year FE",
                               "(6) PS: Max",
                               "(7) PS: Min",
                               "(8) PS: Six Months"),
       include.adjrs = T,
       caption = "",
       star.symbol = "\\*",
       include.rsquared = F,
       include.cluster = T,
       include.variance = F)

# Output Replication Archive
htmlreg(model_list, 
                stars = c(0.001, 0.01, 0.05, 0.1),
                custom.coef.map = coef_map,
                symbol = "+",
                table = F,
                booktabs = T,
                use.packages = F,
                dcolumn = T,
                 custom.model.names = c("(1) Hat Values",
                              "(2) Cook's Distance", 
                              "(3) DFBETA", 
                              
                              "(2) Cubic Time Trend", 
                               "(3) Year FE",
                               "(4) PS: Max", 
                               "(5) PS: Min", 
                               "(6) PS: Six Months"),
                include.lr = F,
                include.adjrs = T,
                caption = "", 
                star.symbol = "\\*", 
                include.rsquared = F,
                include.cluster = T,
                include.variance = F)
(1) Hat Values (2) Cook’s Distance (3) DFBETA (2) Cubic Time Trend (3) Year FE (4) PS: Max (5) PS: Min (6) PS: Six Months
Power-Sharing (cabinet) 0.08*** 0.02*** 0.04*** 0.02** 0.03*** 0.02** 0.02** 0.02**
(0.02) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Power-Sharing (cabinet) * Aid -0.04*** -0.01*** -0.01*** -0.01** -0.01** -0.01** -0.01** -0.01**
(0.01) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Aid / GDP (log) -0.02+ -0.01+ -0.01* -0.02* -0.02+ -0.02* -0.02* -0.02*
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
GDP p/c -0.02 -0.00 -0.01 -0.02 -0.02 -0.02 -0.02 -0.02
(0.03) (0.02) (0.01) (0.02) (0.02) (0.02) (0.02) (0.02)
Population -0.02 -0.01 -0.01* -0.02+ -0.02+ -0.02+ -0.02+ -0.02+
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Conflict Intensity 0.02 0.04 0.03 0.02 0.02 0.02 0.02 0.02
(0.04) (0.03) (0.02) (0.04) (0.03) (0.04) (0.04) (0.04)
Non-State Violence -0.01 -0.01 0.00 0.01 0.02 0.01 0.01 0.01
(0.04) (0.02) (0.03) (0.04) (0.03) (0.04) (0.04) (0.04)
Nat. Res. Rents -0.00* -0.00* -0.00*** -0.00* -0.00** -0.00* -0.00* -0.00**
(0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00) (0.00)
Regime Type 0.10*** 0.10*** 0.10*** 0.10*** 0.10*** 0.10*** 0.10*** 0.10***
(0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01) (0.01)
Time -0.11*
(0.04)
Time\(^2\) 0.04*
(0.02)
Time\(^3\) -0.00*
(0.00)
Num. obs. 250 257 204 272 272 272 272 272
Countries 45 45 42 46 46 46 46 46
Adj. R2 0.54 0.70 0.76 0.58 0.59 0.59 0.58 0.58
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1

Table D.3: Power-Sharing, Foreign Aid and Post-Conflict Rule of Law: Reduced

Form Results

# Libraries
library(texreg)
source("./functions/extract_ols_custom.R")
source("./functions/extract_plm_custom.R")
library(tidyverse)
library(rms)

# load instrument
load(file = "./data/instrumentedAid2.RData")
load("./data/diss_df.rda")

diss_df <- merge(diss_df, instrument_df, by = c("year", "iso2c"), all.x = TRUE)
diss_df$total_sum_except <- as.numeric(diss_df$total_sum_except)


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



##### IV #####

iv_na$aid_instrumented_gdp_ln <- log(iv_na$total_sum_except / iv_na$GDP)
diss_df$aid_instrumented_gdp_ln <- log(diss_df$total_sum_except / diss_df$GDP)

# 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)

# stuff for stata
# diss_df$region_num <- as.numeric(as.factor(diss_df$region))
# diss_df$country_year_num <- as.numeric(as.factor(diss_df$country_year))
foreign::write.dta(iv_na, "./data/diss_df_IV.dta")

# hard code interaction variable
iv_na$cabincXaid <- iv_na$aiddata_AidGDP_ln * iv_na$cabinetINC
iv_na$cabincXaid_instr <- iv_na$aid_instrumented_gdp_ln * iv_na$cabinetINC

# Estimate Models
reduced_form_LJI <- ols(LJI_t2 ~ 
                         cabinetINC * aid_instrumented_gdp_ln +
                         log(GDP_per_capita) +
                         log(population) +
                         nonstate +
                         conf_intens +
                         WBnatres +
                         fh,
                       data = iv_na, x = T, y = T)
reduced_form_LJI <- robcov(reduced_form_LJI, iv_na$GWNo)


reduced_form_vdem <- ols(v2x_jucon_t2 ~ 
                          cabinetINC * aid_instrumented_gdp_ln +
                          log(GDP_per_capita) +
                          log(population) +
                          nonstate +
                          conf_intens +
                          WBnatres +
                          fh,
                        data = iv_na, x = T, y = T)
reduced_form_vdem <- robcov(reduced_form_vdem, iv_na$GWNo)


# Output


coef_name_map <- list(
                      cabinetINC = "Power-Sharing (binary)",
                      "cabinetINC * aid_instrumented_gdp_ln" = "Power-Sharing (binary) * Aid",
                      cabinetCOUNT = "Power-Sharing (cabinet)",
                      "cabinetCOUNT * aiddata_AidGDP_ln" = "Power-Sharing (cabinet) * Aid", 
                      "cabinetCOUNT:aiddata_AidGDP_ln" = "PS (cabinet) * Aid",
                     
                      aid_instrumented_gdp_ln = "Aid / GDP (log) instrumented",
                      
                      "GDP_per_capita" = "GDP p/c (log)",
                      "population" = "Population (log)",
                      conf_intens = "Conflict Intensity",
                      nonstate = "Non-State Violence",
                      WBnatres = "Nat. Res. Rents",
                      polity2 = "Polity",
                      fh = "Regime Type (FH)",
                      Ethnic = "Ethnic Frac.",
                      DS_ordinal = "UN PKO")
# 
# texreg(l = list(reduced_form_LJI, 
#                    reduced_form_vdem),
#           stars = c(0.001, 0.01, 0.05, 0.1),
#           symbol = "+",
#        file = "../output/iv_judind_reducedform.tex",
#           table = F,
#           booktabs = T,
#           use.packages = F,
#           dcolumn = T,
#           custom.coef.map = coef_name_map,
#           custom.model.names = c("(1) LJI",
#                                  "(2) V-Dem"),
#        
#         star.symbol = "\\*",
#         include.lr = F, 
#         include.cluster = T, 
#         include.rsquared = F, 
#         include.variance = F)

htmlreg(l = list(reduced_form_LJI, 
                   reduced_form_vdem),
          stars = c(0.001, 0.01, 0.05, 0.1),
          symbol = "+",
          table = F,
          booktabs = T,
          use.packages = F,
          dcolumn = T,
          custom.coef.map = coef_name_map,
          custom.model.names = c("(1) LJI",
                                 "(2) V-Dem"),
       
        star.symbol = "\\*",
        include.lr = F, 
        include.cluster = T, 
        include.rsquared = F, 
        include.variance = F)
Statistical models
(1) LJI (2) V-Dem
Power-Sharing (binary) 1.18** 1.47+
(0.44) (0.83)
Power-Sharing (binary) * Aid -0.06** -0.07+
(0.02) (0.04)
Aid / GDP (log) instrumented -0.00 0.01
(0.01) (0.02)
GDP p/c (log) 0.00 -0.02
(0.02) (0.03)
Population (log) -0.02+ 0.01
(0.01) (0.02)
Conflict Intensity 0.00 -0.03
(0.04) (0.05)
Non-State Violence 0.01 0.00
(0.04) (0.05)
Nat. Res. Rents -0.00* -0.00
(0.00) (0.00)
Regime Type (FH) 0.10*** 0.13***
(0.01) (0.01)
Num. obs. 270 270
Countries 46 46
Adj. R2 0.58 0.53
***p < 0.001, **p < 0.01, *p < 0.05, +p < 0.1
LS0tDQp0aXRsZTogIkNoYXB0ZXIgNzogUnVsZSBvZiBMYXciDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogDQogICAgICBjb2xsYXBzZWQ6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogImhpZGUiDQoNCi0tLQ0KDQoNCmBgYHtyLCBldmFsPUYsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IEYsIGNvbW1lbnRzID0gRn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRleHJlZykNCnNvdXJjZSgiZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCg0KYGBgDQoNCiMgVGFibGUgRC4xOiAgSW5kaXZpZHVhbCBFZmZlY3RzIG9mIFBvd2VyLVNoYXJpbmcgYW5kIEZvcmVpZ24gQWlkIG9uIFBvc3QtQ29uZmxpY3QNClJ1bGUgb2YgTGF3IChWLURlbSBSZXN1bHRzKQ0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IEYsIGNvbW1lbnRzID0gRn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRleHJlZykNCiMgc291cmNlKCJmdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0KIyBzb3VyY2UoIi4vZnVuY3Rpb25zL2N1c3RvbV90ZXhyZWcuUiIpDQpsaWJyYXJ5KHJtcykNCiMgbG9hZCBEYXRhDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQoNCiMgTW9kZWxzIA0KbW9kZWxfcHNfdjJ4X2p1Y29uX2NhYmNvdW50IDwtIHJtczo6b2xzKHYyeF9qdWNvbl90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX3BzX3YyeF9qdWNvbl9jYWJjb3VudCA8LSBybXM6OnJvYmNvdihtb2RlbF9wc192MnhfanVjb25fY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfcHNfdjJ4X2p1Y29uX3NlbmlvcmNvdW50IDwtIHJtczo6b2xzKHYyeF9qdWNvbl90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuaW9yQ09VTlQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfcHNfdjJ4X2p1Y29uX3NlbmlvcmNvdW50IDwtIHJtczo6cm9iY292KG1vZGVsX3BzX3YyeF9qdWNvbl9zZW5pb3Jjb3VudCwgZGlzc19kZiRHV05vKQ0KDQptb2RlbF9wc192MnhfanVjb25fbm9uc2VuaW9yY291bnQgPC0gcm1zOjpvbHModjJ4X2p1Y29uX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zZW5pb3JDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9wc192MnhfanVjb25fbm9uc2VuaW9yY291bnQgPC0gcm1zOjpyb2Jjb3YobW9kZWxfcHNfdjJ4X2p1Y29uX25vbnNlbmlvcmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgQWlkDQptb2RlbF9kZ2FfdjJ4X2p1Y29uX2NhYmNvdW50IDwtIHJtczo6b2xzKHYyeF9qdWNvbl90MiB+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhkZ2FfZ2RwX3plcm8gICsgMSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX2dkcF9wYyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuX3BvcCArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkaXNzX2RmLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBULCB5ID0gVCkNCm1vZGVsX2RnYV92MnhfanVjb25fY2FiY291bnQgPC0gcm1zOjpyb2Jjb3YobW9kZWxfZGdhX3YyeF9qdWNvbl9jYWJjb3VudCwgZGlzc19kZiRHV05vKQ0KDQoNCm1vZGVsX3BnYV92MnhfanVjb25fY2FiY291bnQgPC0gcm1zOjpvbHModjJ4X2p1Y29uX3QyIH4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHByb2dyYW1fYWlkX2dkcF96ZXJvICArIDEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbl9wb3AgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0gVCwgeSA9IFQpDQptb2RlbF9wZ2FfdjJ4X2p1Y29uX2NhYmNvdW50IDwtIHJtczo6cm9iY292KG1vZGVsX3BnYV92MnhfanVjb25fY2FiY291bnQsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfYmdhX3YyeF9qdWNvbl9jYWJjb3VudCA8LSBybXM6Om9scyh2MnhfanVjb25fdDIgfg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coY29tbW9kaXR5X2FpZF9nZHBfemVybyAgKyAxKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fZ2RwX3BjICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5fcG9wICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRpc3NfZGYsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IFQsIHkgPSBUKQ0KbW9kZWxfYmdhX3YyeF9qdWNvbl9jYWJjb3VudCA8LSBybXM6OnJvYmNvdihtb2RlbF9iZ2FfdjJ4X2p1Y29uX2NhYmNvdW50LCBkaXNzX2RmJEdXTm8pDQoNCiMgT3V0cHV0DQptb2RlbF9saXN0IDwtIGxpc3QobW9kZWxfcHNfdjJ4X2p1Y29uX2NhYmNvdW50LCANCiAgICAgICAgICAgICAgICAgICBtb2RlbF9wc192MnhfanVjb25fc2VuaW9yY291bnQsIA0KICAgICAgICAgICAgICAgICAgIG1vZGVsX3BzX3YyeF9qdWNvbl9ub25zZW5pb3Jjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfZGdhX3YyeF9qdWNvbl9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfcGdhX3YyeF9qdWNvbl9jYWJjb3VudCwgDQogICAgICAgICAgICAgICAgICAgbW9kZWxfYmdhX3YyeF9qdWNvbl9jYWJjb3VudCkNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgICAgc2VuaW9yQ09VTlQgPSAiUG93ZXItU2hhcmluZyAoc2VuaW9yKSIsDQogICAgICAgICAgICAgICAgICAgICAgbm9uc2VuaW9yQ09VTlQgPSAiUG93ZXItU2hhcmluZyAobm9uc2VuaW9yKSIsDQogICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UOmFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQUyAoY2FiaW5ldCkgKiBBaWQiLA0KICAgICAgICAgICAgICAgICAgICAgIHBzX3NoYXJlID0gIlBTIChjYWJpbmV0IHNoYXJlKSIsDQogICAgICAgICAgICAgICAgICAgICAgInBzX3NoYXJlICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBTIChjYWJpbmV0IHNoYXJlKSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgZGdhX2dkcF96ZXJvID0gIkRHQS9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX2FpZF9nZHBfemVybyA9ICJQcm9ncmFtIEFpZC9HRFAgKGxvZykiLCANCiAgICAgICAgICAgICAgICAgICAgICBjb21tb2RpdHlfYWlkX2dkcF96ZXJvID0gIkJ1ZGdldCBBaWQvR0RQIChsb2cpIiwgDQogICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gPSAiQWlkIC8gR0RQIChsb2cpIiwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBsbl9nZHBfcGMgPSAiR0RQIHAvYyIsDQogICAgICAgICAgICAgICAgICAgICAgbG5fcG9wID0gIlBvcHVsYXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgPSAiRXRobmljIEZyYWMuIiwNCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIpDQoNCg0KIyBjdXN0b20gZnVuY3Rpb25zIHRvIHdyaXRlIHRleCBvdXRwdXQNCnNvdXJjZSgiLi9mdW5jdGlvbnMvY3VzdG9tX3RleHJlZy5SIikNCmVudmlyb25tZW50KGN1c3RvbV90ZXhyZWcpIDwtIGFzTmFtZXNwYWNlKCd0ZXhyZWcnKQ0KDQoNCiMgIyBPdXRwdXQgTWFudXNjcmlwdA0KIyBjdXN0b21fdGV4cmVnKG1vZGVsX2xpc3QsIA0KIyAgICAgICAgICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZF9wc19pbmRlZmZfanVkaW5kX3ZkZW0udGV4IiwNCiMgICAgICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCAgPSBjb2VmX25hbWVfbWFwLA0KIyAgICAgICAgICAgICAgIHN5bWJvbCA9ICIrIiwNCiMgICAgICAgICAgICAgICB0YWJsZSA9IEYsDQojICAgICAgICAgICAgICAgYm9va3RhYnMgPSBULA0KIyAgICAgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICAgICAgZGNvbHVtbiA9IFQsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsDQojICAgICAgICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwgDQojICAgICAgICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwgDQojICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLA0KIyAgICAgICAgICAgICAgIGluY2x1ZGUubHIgPSBGLA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tdWx0aWNvbCA9IFQsIA0KIyAgICAgICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIiBcXG11bHRpY29sdW1uezN9e2N9eyBcXHRleHRiZntQb3dlci1TaGFyaW5nfX0gJiBcXG11bHRpY29sdW1uezN9e2N9eyBcXHRleHRiZntGb3JlaWduIEFpZH19IFxcXFwgXFxjbWlkcnVsZShyKXsyLTR9IFxcY21pZHJ1bGUobCl7NS03fSAmIFxcbXVsdGljb2x1bW57MX17Y317KDEpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eygyKSAgfSIsDQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXFxtdWx0aWNvbHVtbnsxfXtjfXsoMykgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDQpICB9IiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcXG11bHRpY29sdW1uezF9e2N9eyg1KSAgIH0iLA0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcbXVsdGljb2x1bW57MX17Y317KDYpICAgfSIpKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKG1vZGVsX2xpc3QsIA0KICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksIA0KICAgICAgICBjdXN0b20uY29lZi5tYXAgID0gY29lZl9uYW1lX21hcCwNCiAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICB0YWJsZSA9IEYsDQogICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwgDQogICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiAgICAgICAgY2FwdGlvbiA9ICIiLA0KICAgICAgICBpbmNsdWRlLmxyID0gRikNCg0KYGBgDQoNCg0KDQojIFRhYmxlIEQuMjogVGVjaG5pY2FsIFJvYnVzdG5lc3MgQ2hlY2tzOiBPdXRsaWVycywgVGltZSwgYW5kIFBvd2VyLVNoYXJpbmcgQ29kaW5ncw0KDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyIsIG1lc3NhZ2U9Riwgd2FybmluZz1GLCBjYWNoZSA9IFQsIGNvbW1lbnRzID0gRn0NCiMgTGlicmFyaWVzDQpsaWJyYXJ5KHRleHJlZykNCnNvdXJjZSgiLi9mdW5jdGlvbnMvZXh0cmFjdF9vbHNfY3VzdG9tLlIiKQ0Kc291cmNlKCIuL2Z1bmN0aW9ucy9leHRyYWN0X3BsbV9jdXN0b20uUiIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocm1zKQ0KDQojIGxvYWQgRGF0YQ0KbG9hZCgiLi9kYXRhL2Rpc3NfZGYucmRhIikNCg0KIyBPdXRsaWVycw0KIyBMb2FkIG91dGxpZXIgZnVuY3Rpb24NCnNvdXJjZSgiLi9mdW5jdGlvbnMvb3V0bGllcl9hbmFseXNpcy5SIikNCg0KIyBFc3RpbWF0ZSBiYXNlbGluZSBtb2RlbA0KbW9kZWxfanVkaW5kX2NhYmNvdW50IDwtIHJtczo6b2xzKExKSV90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZoICwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfanVkaW5kX2NhYmNvdW50IDwtIHJtczo6cm9iY292KG1vZGVsX2p1ZGluZF9jYWJjb3VudCwgZGlzc19kZiRHV05vKQ0KDQojIHNlbGVjdG9yIHZhcmlhYmxlcw0Kc2VsZWN0dmFycyA9IGMoIkxvY2F0aW9uIiwgInllYXIiLCAiaWRlbnRpZmllcnMiKQ0KZGlzc19kZiRpZGVudGlmaWVycyA8LSBwYXN0ZShkaXNzX2RmJEdXTm8sIGRpc3NfZGYkeWVhciwgc2VwID0gIi0iKQ0KDQojIEVzdGltYXRlIG91dGxpZXJzDQpqdWRpbmRfb3V0bGllcnMgPC0gY2hlY2tfb3V0bGllcihtb2RlbF9qdWRpbmRfY2FiY291bnQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGlzc19kZiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0dmFycyA9IHNlbGVjdHZhcnMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVydmFyID0gIkdXTm8iKQ0KDQoNCg0KDQojIFRpbWUgDQptb2RlbF9qdWRpbmRfdGltZSA8LSBybXM6Om9scyhMSklfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlQgKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBmaCArDQogICAgICAgICAgICAgICAgICAgICAgICAgIHBjeSArIHBjeTIgKyBwY3kzLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9qdWRpbmRfdGltZSA8LSBybXM6OnJvYmNvdihtb2RlbF9qdWRpbmRfdGltZSwgZGlzc19kZiRHV05vKQ0KDQojIHllYXIgRkUNCmRpc3NfZGYkeWVhckZFIDwtIGFzLmZhY3RvcihkaXNzX2RmJHllYXIpDQptb2RlbF9qdWRpbmRfeWVhcmZlIDwtIHJtczo6b2xzKExKSV90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVCAqIA0KICAgICAgICAgICAgICAgICAgICAgICAgYWlkZGF0YV9BaWRHRFBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKEdEUF9wZXJfY2FwaXRhKSArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZl9pbnRlbnMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKyANCiAgICAgICAgICAgICAgICAgICAgICAgIFdCbmF0cmVzICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZoICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHllYXJGRSwNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPWRpc3NfZGYsIHg9VCwgeT1UKQ0KbW9kZWxfanVkaW5kX3llYXJmZSA8LSBybXM6OnJvYmNvdihtb2RlbF9qdWRpbmRfeWVhcmZlLCBkaXNzX2RmJEdXTm8pDQoNCg0KIyBkaWZmZXJlbnQgY2FiaW5ldCBhZ2dyZWdhdGlvbiB0eXBlcw0KbW9kZWxfanVkaW5kX2NhYm1heCA8LSBybXM6Om9scyhMSklfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWF4ICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZmggLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9qdWRpbmRfY2FibWF4IDwtIHJtczo6cm9iY292KG1vZGVsX2p1ZGluZF9jYWJtYXgsIGRpc3NfZGYkR1dObykNCg0KbW9kZWxfanVkaW5kX2NhYm1pbiA8LSBybXM6Om9scyhMSklfdDIgfiAgDQogICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0Q09VTlRfbWluICogDQogICAgICAgICAgICAgICAgICAgICAgICBhaWRkYXRhX0FpZEdEUF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICBsb2coR0RQX3Blcl9jYXBpdGEpICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyArDQogICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArIA0KICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgZmggLA0KICAgICAgICAgICAgICAgICAgICAgIGRhdGE9ZGlzc19kZiwgeD1ULCB5PVQpDQptb2RlbF9qdWRpbmRfY2FibWluIDwtIHJtczo6cm9iY292KG1vZGVsX2p1ZGluZF9jYWJtaW4sIGRpc3NfZGYkR1dObykNCg0KDQptb2RlbF9qdWRpbmRfY2Fic2l4IDwtIHJtczo6b2xzKExKSV90MiB+ICANCiAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRDT1VOVF9zaXggKiANCiAgICAgICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgbG9nKHBvcHVsYXRpb24pICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlICsgDQogICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICBmaCAsDQogICAgICAgICAgICAgICAgICAgICAgZGF0YT1kaXNzX2RmLCB4PVQsIHk9VCkNCm1vZGVsX2p1ZGluZF9jYWJzaXggPC0gcm1zOjpyb2Jjb3YobW9kZWxfanVkaW5kX2NhYnNpeCwgZGlzc19kZiRHV05vKQ0KDQptb2RlbF9saXN0IDwtIGxpc3QoanVkaW5kX291dGxpZXJzW1syXV0sIA0KICAgICAgICAgIGp1ZGluZF9vdXRsaWVyc1tbNF1dLA0KICAgICAgICAgIGp1ZGluZF9vdXRsaWVyc1tbNl1dLA0KICAgICAgICAgIG1vZGVsX2p1ZGluZF90aW1lLCANCiAgICAgICAgICBtb2RlbF9qdWRpbmRfeWVhcmZlLCANCiAgICAgICAgICBtb2RlbF9qdWRpbmRfY2FibWF4LCANCiAgICAgICAgICBtb2RlbF9qdWRpbmRfY2FibWluLCANCiAgICAgICAgICBtb2RlbF9qdWRpbmRfY2Fic2l4KQ0KDQpjb2VmX21hcCA8LSBsaXN0KGNhYmluZXRDT1VOVCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UX21heCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UX21pbiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UX3NpeCA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSIsDQogICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVCAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgICJjYWJpbmV0Q09VTlRfbWF4ICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVF9taW4gKiBhaWRkYXRhX0FpZEdEUF9sbiIgPSAiUG93ZXItU2hhcmluZyAoY2FiaW5ldCkgKiBBaWQiLCANCiAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UX3NpeCAqIGFpZGRhdGFfQWlkR0RQX2xuIiA9ICJQb3dlci1TaGFyaW5nIChjYWJpbmV0KSAqIEFpZCIsIA0KICAgICAgICAgICAgICAgICAgIGFpZGRhdGFfQWlkR0RQX2xuID0gIkFpZCAvIEdEUCAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgR0RQX3Blcl9jYXBpdGEgPSAiR0RQIHAvYyIsDQogICAgICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9ICJQb3B1bGF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICBjb25mX2ludGVucyA9ICJDb25mbGljdCBJbnRlbnNpdHkiLA0KICAgICAgICAgICAgICAgICAgIG5vbnN0YXRlID0gIk5vbi1TdGF0ZSBWaW9sZW5jZSIsDQogICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgPSAiTmF0LiBSZXMuIFJlbnRzIiwNCiAgICAgICAgICAgICAgICAgICBwb2xpdHkyID0gIlBvbGl0eSIsIA0KICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSIsIA0KICAgICAgICAgICAgICAgICAgIHBjeSA9ICJUaW1lIiwgDQogICAgICAgICAgICAgICAgICAgcGN5MiA9ICJUaW1lJF4yJCIsIA0KICAgICAgICAgICAgICAgICAgIHBjeTMgPSAiVGltZSReMyQiKQ0KIyANCnRleHJlZzo6dGV4cmVnKG1vZGVsX2xpc3QsDQogICAgICAgc3RhcnMgPSBjKDAuMDAxLCAwLjAxLCAwLjA1LCAwLjEpLA0KICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbWFwLA0KICAgICAgIGZpbGUgPSAiLi4vb3V0cHV0L2FpZHBzX2p1ZGluZF90ZWNoX3JvYi50ZXgiLA0KICAgICAgIHN5bWJvbCA9ICIrIiwNCiAgICAgICB0YWJsZSA9IEYsDQogICAgICAgYm9va3RhYnMgPSBULA0KICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQogICAgICAgZGNvbHVtbiA9IFQsDQogICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgY3VzdG9tLm1vZGVsLm5hbWVzID0gYygiKDEpIEhhdCBWYWx1ZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBDb29rJ3MgRGlzdGFuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBERkJFVEEiLA0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIEN1YmljIFRpbWUgVHJlbmQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoNSkgWWVhciBGRSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIig2KSBQUzogTWF4IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDcpIFBTOiBNaW4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoOCkgUFM6IFNpeCBNb250aHMiKSwNCiAgICAgICBpbmNsdWRlLmFkanJzID0gVCwNCiAgICAgICBjYXB0aW9uID0gIiIsDQogICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQojIE91dHB1dCBSZXBsaWNhdGlvbiBBcmNoaXZlDQpodG1scmVnKG1vZGVsX2xpc3QsIA0KICAgICAgICAgICAgICAgIHN0YXJzID0gYygwLjAwMSwgMC4wMSwgMC4wNSwgMC4xKSwNCiAgICAgICAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX21hcCwNCiAgICAgICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQogICAgICAgICAgICAgICAgdGFibGUgPSBGLA0KICAgICAgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiAgICAgICAgICAgICAgICB1c2UucGFja2FnZXMgPSBGLA0KICAgICAgICAgICAgICAgIGRjb2x1bW4gPSBULA0KICAgICAgICAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIoMSkgSGF0IFZhbHVlcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDIpIENvb2sncyBEaXN0YW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBERkJFVEEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBDdWJpYyBUaW1lIFRyZW5kIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigzKSBZZWFyIEZFIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDQpIFBTOiBNYXgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDUpIFBTOiBNaW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKDYpIFBTOiBTaXggTW9udGhzIiksDQogICAgICAgICAgICAgICAgaW5jbHVkZS5sciA9IEYsDQogICAgICAgICAgICAgICAgaW5jbHVkZS5hZGpycyA9IFQsDQogICAgICAgICAgICAgICAgY2FwdGlvbiA9ICIiLCANCiAgICAgICAgICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLCANCiAgICAgICAgICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwNCiAgICAgICAgICAgICAgICBpbmNsdWRlLmNsdXN0ZXIgPSBULA0KICAgICAgICAgICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQoNCg0KYGBgDQoNCg0KIyBUYWJsZSBELjM6ICBQb3dlci1TaGFyaW5nLCBGb3JlaWduIEFpZCBhbmQgUG9zdC1Db25mbGljdCBSdWxlIG9mIExhdzogUmVkdWNlZA0KRm9ybSBSZXN1bHRzDQoNCg0KYGBge3IsIHJlc3VsdHM9ImFzaXMiLCBtZXNzYWdlPUYsIHdhcm5pbmc9RiwgY2FjaGUgPSBULCBjb21tZW50cyA9IEZ9DQojIExpYnJhcmllcw0KbGlicmFyeSh0ZXhyZWcpDQpzb3VyY2UoIi4vZnVuY3Rpb25zL2V4dHJhY3Rfb2xzX2N1c3RvbS5SIikNCnNvdXJjZSgiLi9mdW5jdGlvbnMvZXh0cmFjdF9wbG1fY3VzdG9tLlIiKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJtcykNCg0KIyBsb2FkIGluc3RydW1lbnQNCmxvYWQoZmlsZSA9ICIuL2RhdGEvaW5zdHJ1bWVudGVkQWlkMi5SRGF0YSIpDQpsb2FkKCIuL2RhdGEvZGlzc19kZi5yZGEiKQ0KDQpkaXNzX2RmIDwtIG1lcmdlKGRpc3NfZGYsIGluc3RydW1lbnRfZGYsIGJ5ID0gYygieWVhciIsICJpc28yYyIpLCBhbGwueCA9IFRSVUUpDQpkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQgPC0gYXMubnVtZXJpYyhkaXNzX2RmJHRvdGFsX3N1bV9leGNlcHQpDQoNCg0KIyBzdWJzZXQgb25seSBjb21wbGV0ZS5jYXNlcyAvIG5lY2Vzc2FyeSBmb3IgY2x1c3Rlci5yb2J1c3Quc2UoKQ0KaXZfbmEgPC0gbmEub21pdChkaXNzX2RmWywgYygNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlkZGF0YV9BaWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaWRkYXRhX0FpZEdEUF9sbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpZGRhdGFfQWlkUENfbG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdEUF9wZXJfY2FwaXRhIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZl9pbnRlbnMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV0JuYXRyZXMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWxfc3VtX2V4Y2VwdCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5ZWFyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdXTm8iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0RQIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uc3RhdGUiLCAiTEpJX3QyIiwgInYyeF9qdWNvbl90MiIpXSkNCg0KDQoNCiMjIyMjIElWICMjIyMjDQoNCml2X25hJGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuIDwtIGxvZyhpdl9uYSR0b3RhbF9zdW1fZXhjZXB0IC8gaXZfbmEkR0RQKQ0KZGlzc19kZiRhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiA8LSBsb2coZGlzc19kZiR0b3RhbF9zdW1fZXhjZXB0IC8gZGlzc19kZiRHRFApDQoNCiMgdG8gcHJvY2VlZCB3aXRoIElWIGVzdGltYXRpb24gSSBmaXJzdCBoYXJkLWNvZGUgdGhlIGluc3RydW1lbnQNCml2X25hJGluc3RyX2FpZF9nZHBfbG4gPC0gbG9nKGl2X25hJHRvdGFsX3N1bV9leGNlcHQgLyBpdl9uYSRHRFApDQoNCiMgZGF0YSB0cmFuc2Zvcm1hdGlvbiBmb3IgU3RhdGENCml2X25hJGxuX2dkcF9wYyA8LSBsb2coaXZfbmEkR0RQX3Blcl9jYXBpdGEpDQppdl9uYSRsbl9wb3AgPC0gbG9nKGl2X25hJHBvcHVsYXRpb24pDQoNCiMgc3R1ZmYgZm9yIHN0YXRhDQojIGRpc3NfZGYkcmVnaW9uX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJHJlZ2lvbikpDQojIGRpc3NfZGYkY291bnRyeV95ZWFyX251bSA8LSBhcy5udW1lcmljKGFzLmZhY3RvcihkaXNzX2RmJGNvdW50cnlfeWVhcikpDQpmb3JlaWduOjp3cml0ZS5kdGEoaXZfbmEsICIuL2RhdGEvZGlzc19kZl9JVi5kdGEiKQ0KDQojIGhhcmQgY29kZSBpbnRlcmFjdGlvbiB2YXJpYWJsZQ0KaXZfbmEkY2FiaW5jWGFpZCA8LSBpdl9uYSRhaWRkYXRhX0FpZEdEUF9sbiAqIGl2X25hJGNhYmluZXRJTkMNCml2X25hJGNhYmluY1hhaWRfaW5zdHIgPC0gaXZfbmEkYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gKiBpdl9uYSRjYWJpbmV0SU5DDQoNCiMgRXN0aW1hdGUgTW9kZWxzDQpyZWR1Y2VkX2Zvcm1fTEpJIDwtIG9scyhMSklfdDIgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICBjYWJpbmV0SU5DICogYWlkX2luc3RydW1lbnRlZF9nZHBfbG4gKw0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhwb3B1bGF0aW9uKSArDQogICAgICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgKw0KICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyArDQogICAgICAgICAgICAgICAgICAgICAgICAgZmgsDQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpdl9uYSwgeCA9IFQsIHkgPSBUKQ0KcmVkdWNlZF9mb3JtX0xKSSA8LSByb2Jjb3YocmVkdWNlZF9mb3JtX0xKSSwgaXZfbmEkR1dObykNCg0KDQpyZWR1Y2VkX2Zvcm1fdmRlbSA8LSBvbHModjJ4X2p1Y29uX3QyIH4gDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgKiBhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhHRFBfcGVyX2NhcGl0YSkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cocG9wdWxhdGlvbikgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBub25zdGF0ZSArDQogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zICsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgV0JuYXRyZXMgKw0KICAgICAgICAgICAgICAgICAgICAgICAgICBmaCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpdl9uYSwgeCA9IFQsIHkgPSBUKQ0KcmVkdWNlZF9mb3JtX3ZkZW0gPC0gcm9iY292KHJlZHVjZWRfZm9ybV92ZGVtLCBpdl9uYSRHV05vKQ0KDQoNCiMgT3V0cHV0DQoNCg0KY29lZl9uYW1lX21hcCA8LSBsaXN0KA0KICAgICAgICAgICAgICAgICAgICAgIGNhYmluZXRJTkMgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSIsDQogICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRJTkMgKiBhaWRfaW5zdHJ1bWVudGVkX2dkcF9sbiIgPSAiUG93ZXItU2hhcmluZyAoYmluYXJ5KSAqIEFpZCIsDQogICAgICAgICAgICAgICAgICAgICAgY2FiaW5ldENPVU5UID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpIiwNCiAgICAgICAgICAgICAgICAgICAgICAiY2FiaW5ldENPVU5UICogYWlkZGF0YV9BaWRHRFBfbG4iID0gIlBvd2VyLVNoYXJpbmcgKGNhYmluZXQpICogQWlkIiwgDQogICAgICAgICAgICAgICAgICAgICAgImNhYmluZXRDT1VOVDphaWRkYXRhX0FpZEdEUF9sbiIgPSAiUFMgKGNhYmluZXQpICogQWlkIiwNCiAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgIGFpZF9pbnN0cnVtZW50ZWRfZ2RwX2xuID0gIkFpZCAvIEdEUCAobG9nKSBpbnN0cnVtZW50ZWQiLA0KICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICJHRFBfcGVyX2NhcGl0YSIgPSAiR0RQIHAvYyAobG9nKSIsDQogICAgICAgICAgICAgICAgICAgICAgInBvcHVsYXRpb24iID0gIlBvcHVsYXRpb24gKGxvZykiLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmZfaW50ZW5zID0gIkNvbmZsaWN0IEludGVuc2l0eSIsDQogICAgICAgICAgICAgICAgICAgICAgbm9uc3RhdGUgPSAiTm9uLVN0YXRlIFZpb2xlbmNlIiwNCiAgICAgICAgICAgICAgICAgICAgICBXQm5hdHJlcyA9ICJOYXQuIFJlcy4gUmVudHMiLA0KICAgICAgICAgICAgICAgICAgICAgIHBvbGl0eTIgPSAiUG9saXR5IiwNCiAgICAgICAgICAgICAgICAgICAgICBmaCA9ICJSZWdpbWUgVHlwZSAoRkgpIiwNCiAgICAgICAgICAgICAgICAgICAgICBFdGhuaWMgPSAiRXRobmljIEZyYWMuIiwNCiAgICAgICAgICAgICAgICAgICAgICBEU19vcmRpbmFsID0gIlVOIFBLTyIpDQojIA0KIyB0ZXhyZWcobCA9IGxpc3QocmVkdWNlZF9mb3JtX0xKSSwgDQojICAgICAgICAgICAgICAgICAgICByZWR1Y2VkX2Zvcm1fdmRlbSksDQojICAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQojICAgICAgICAgICBzeW1ib2wgPSAiKyIsDQojICAgICAgICBmaWxlID0gIi4uL291dHB1dC9pdl9qdWRpbmRfcmVkdWNlZGZvcm0udGV4IiwNCiMgICAgICAgICAgIHRhYmxlID0gRiwNCiMgICAgICAgICAgIGJvb2t0YWJzID0gVCwNCiMgICAgICAgICAgIHVzZS5wYWNrYWdlcyA9IEYsDQojICAgICAgICAgICBkY29sdW1uID0gVCwNCiMgICAgICAgICAgIGN1c3RvbS5jb2VmLm1hcCA9IGNvZWZfbmFtZV9tYXAsDQojICAgICAgICAgICBjdXN0b20ubW9kZWwubmFtZXMgPSBjKCIoMSkgTEpJIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBWLURlbSIpLA0KIyAgICAgICAgDQojICAgICAgICAgc3Rhci5zeW1ib2wgPSAiXFwqIiwNCiMgICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQojICAgICAgICAgaW5jbHVkZS5jbHVzdGVyID0gVCwgDQojICAgICAgICAgaW5jbHVkZS5yc3F1YXJlZCA9IEYsIA0KIyAgICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQpodG1scmVnKGwgPSBsaXN0KHJlZHVjZWRfZm9ybV9MSkksIA0KICAgICAgICAgICAgICAgICAgIHJlZHVjZWRfZm9ybV92ZGVtKSwNCiAgICAgICAgICBzdGFycyA9IGMoMC4wMDEsIDAuMDEsIDAuMDUsIDAuMSksDQogICAgICAgICAgc3ltYm9sID0gIisiLA0KICAgICAgICAgIHRhYmxlID0gRiwNCiAgICAgICAgICBib29rdGFicyA9IFQsDQogICAgICAgICAgdXNlLnBhY2thZ2VzID0gRiwNCiAgICAgICAgICBkY29sdW1uID0gVCwNCiAgICAgICAgICBjdXN0b20uY29lZi5tYXAgPSBjb2VmX25hbWVfbWFwLA0KICAgICAgICAgIGN1c3RvbS5tb2RlbC5uYW1lcyA9IGMoIigxKSBMSkkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIigyKSBWLURlbSIpLA0KICAgICAgIA0KICAgICAgICBzdGFyLnN5bWJvbCA9ICJcXCoiLA0KICAgICAgICBpbmNsdWRlLmxyID0gRiwgDQogICAgICAgIGluY2x1ZGUuY2x1c3RlciA9IFQsIA0KICAgICAgICBpbmNsdWRlLnJzcXVhcmVkID0gRiwgDQogICAgICAgIGluY2x1ZGUudmFyaWFuY2UgPSBGKQ0KDQpgYGANCg0K