################
#####  Notes:
################
# Types of objects:
### Source ------->  Input & Model ------->  Policy Estimates (output)
###  (_so)           (_in)                           (_pe)
### values           functions                       values
###                  & values          
# Examples:                   
# - call_so_f       - tax_elas_in_f         - ten_year_revenue_pe
# - policy_so       - est_bill_in_f         - ten_year_top_tax_pe
#                                           - total_rev_pe
### arguments in functions should used "_var" and functions should used "_f"

# Each analytic code chunk will begin by listing all the inputs it needs, and
# the outputs it produces.
# - inputs: list
# - outputs: list
#### The key essential analytic steps are wrapted in a function   
#chunk_name_of_chunk <- function(){
##########################################
##########################################  
#
# here goes the essential analytic content
#
##########################################
##########################################  
#    return( )                         # A list with all the objects
#}                                     # generated inside the function
# The following line executes the code chunk and deposits its results
# into the current R enviornment:
#invisible( list2env(chunk_name_of_chunk(),.GlobalEnv) )
#
##### Execute values of the functions above when needed for the text:
# Anything under this comment is to create objects that are used in the body of
# text. Not to be used in the final results (could be deleted). Each of these
# object should end with the suffix _temp
#
# Use diagrams to represent complex nesting of functions. Example:
# # pv_costs_f
#  ├──── delta_ed_final_f
#  ├──── interest_f
#  └──── cost_per_student_f
#  |      └──── x
#  ├──── s2_f
#  └──── lambda2_in_f
# - inputs: none
# - outputs: all sources coming from data, research and guesswork
chunk_sources <- function(){
###############################################################################
###############################################################################  

    #############
    ##### Setup
    #############  
    nsims_so <- 1e4
    rescale_so <- FALSE
    policy_estimate_so <- "a3_inc_a2_all_sim"
    run_sim_so <- FALSE
    main_run_so <- TRUE
    periods_so <- 50               #Total number of periods to forecast wages
    costs_temp_so <- 1
    main_pe_so <- 289.8

    #############
    ##### Data  
    #############
    # ATTENTION!
    # costs2_ea_in
    ex_rate_so <- 74               #Exchange Rate - Central Bank of Kenya 74 , 85
    ex_rate_2018_so        <- 101.30  # Exchange rate (KES per international $)
                                    # - https://data.worldbank.org/indicator/PA.NUS.FCRF?locations=KE
    ex_rate_2018_ppp_so <- 50.058   # KLPS4_E+_globals.do (originally from the World Bank)
    ex_rate_2017_ppp_so <- 49.773   # KLPS4_E+_globals.do (originally from the World Bank)
    growth_rate_so <- 1.52/100     #Per-capita GDP growth, 2002-2011 (accessed 1/29/13) -   World Bank - see notes
    gov_bonds_so <-     0.1185       #Kenyan interest on sovereign debt - Central Bank of Kenya
    gov_bonds_new_so <- 0.09
    inflation_so <-  0.02          #Kenyan inflation rate - World Bank Development Indicators
    inflation_new_so <- 0.04
    tax_so <- 0.16575              #ADD INFO!

    # costs data
    df_costs_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
                           sheet = "DtW Costs")
    # crosswalk data on region and country
    df_costs_cw_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
                           sheet = "state_country")
    # data on number of treated children
    df_counts_so <- read_excel("rawdata/data/DtW Cost per Child Data.xlsx",
                           sheet = "DtW Treatment #s")
    # Prevalence data:
    # original study
    # Any infection on original study
    #prevalence_0_so <- c("hookworm" = 0.77, "roundworm" = 0.42, "whipworm" = 0.55,
    # "Schisto mansoni" = 0.22) # from Draft Cost-Effectiveness Model.xlsx ADD ORIGINAL SOURCE
    df_prevalence_so <- read_excel("data/prevalence_data.xlsx",
                           sheet = "Sheet1")
    # prevalence_0_so <- c("hookworm" = 0.77, "roundworm" = 0.42, "whipworm" =0.55, "Schisto mansoni" = 0.22) # from Draft Cost-Effectiveness Model.xlsx ADD ORIGINAL SOURCE
    new_costs_so <- NULL
    country_sel_so <- list("india", "kenya", "nigeria", "vietnam")
    country_sel_pop_so <- c(
      "india" = 1.366417750 * 1e9,
      "kenya" = 5.257397 * 1e7,
      "nigeria" = 2.0096360 * 1e8,
      "vietnam" = 9.646211 * 1e7
    )
    #https://data.worldbank.org/indicator/SP.POP.TOTL
    # options: "a1_tax_sim","a1_x_tax_sim","a1_all_sim", "a1_x_all_sim", "a2_tax_sim",
    # "a2_all_sim", "a3_inc_a1_all_sim", "a3_inc_a1_all_x_sim", "a3_inc_a2_all_sim"

    #############
    ##### Research
    #############
    df_research_so <- read_csv("rawdata/research/research_params.csv")   
    lambda1_so <- c(3.49, 0)            #Hrs per week increase for men and women, table 3, row 1, cols 2 & 3
    lambda1_sd_so <- c(1.42, 1.36)      #table 3, row 2, cols 2 & 3
    lambda1_new_so <- c(79.51)   # avg treatment effect from klps2-4 (already adjusted for ppp and inflation) - w@w
    lambda1_new_sd_so <- c(76)  # ADD SOURCE
    lambda2_so <- 10.2                  #Externality effect (proportional) - Table 3, row 1 col 4
    lambda2_sd_so <- 7.8                # Table 3, row 2 col 4
    #This is are the parameters labeled eta in the doc
    prevalence_0_so <- 0.92 # 0.92 doi: https://doi.org/10.1111/j.1468-0262.2004.00481.x  location: table 2, row 6, column 1
    wage_ag_so <-   11.84            #Mean hourly wage rate (KSH) - Suri 2011
    wage_ww_so <-   14.5850933     #Control group hourly wage, ww (cond >=10 hrs per week) - Table 4, Panel B (Source data took the log, here we recover it)
    profits_se_so <- 1766          #Control group monthly self-employed profits -
                                   #Table 4, Panel C, Column 5, Row 1
                                   #FIX: MOST REFERENCES FROM TABLE 4 ARE TABLE 3
    hours_se_cond_so <- 38.1       #Control group weekly self-employed hours, conditional on hrs >0 - Table D13, Panel D
    hours_ag_so <- 8.3             #Control group hrs per week, agriculture - Table 3, Panel B
    hours_ww_so <- 6.9             #Control group hrs per week, working for wages - Table 3, Panel B
    hours_se_so <- 3.3             #Control group hrs per week, self-employment - Table 3, Panel B
    coef_exp_so <- c(0.1019575, -0.0010413)         #Years of experience coefficients (1-linear, 2-cuadratic)
                                                    #- see notes(0.1019575, -0.0010413), (0,0)
    coverage_so  <- 0.681333333    # (R) Fraction of treated primary school students within 6 km - from W@W - see note
    q_full_so <- 0.75              #Take up rates with full subsidy. From Miguel and Kremmer (2007)
    q_zero_so <- 0                 #Take up rates with zero subsidy. From Miguel and Kremmer (2007)
    delta_ed_so <- c(-0.00176350949079451, 0.00696052250263997, 0.0258570306763183,     # (Delta E) Additional direct secondary schooling increase (from Joan)
                        0.0239963665555466, 0.027301406306074, 0.0234125454594173,
                       0.0279278879439199, 0.00647044449446303, 0.00835739437790601)                                     
    delta_ed_so <- cbind(delta_ed_so, 1999:2007)
    delta_ed_par_so <- 1
    delta_ed_ext_par_so <- 1
    delta_ed_ext_so <- c(-0.0110126908021048,   0.0140448546741008, -0.0034636291545585,  #Additional externality secondary schooling increase (from Joan)
                           0.0112940214439477,  0.0571608179771775, -0.0560546793186931,
                           0.0558284756343451,  0.1546264843901160, 0.0055961489945619)
    delta_ed_ext_so <- cbind(delta_ed_ext_so, 1999:2007)
    include_ext_so <- TRUE
    teach_sal_so <- 5041           #Yearly secondary schooling compensation 5041 - from ROI materials
    teach_ben_so <- 217.47         #Yearly secondary schooling teacher benefits 217.47
    teach_sal_new_so <- (50000 * 12 / 49.773)
    teach_ben_new_so <- 0
                                  #Monthly secondary schooling compensation (in 2017 KES) overestimated to account for benefits -
                                  #news sources * 12 / ex_rate_2017_ppp_so
                                  # https://www.tuko.co.ke/287766-secondary-school-teachers-salary-kenya.html
                                  # https://www.standardmedia.co.ke/article/2001249581/windfall-for-teachers-as-tsc-releases-new-salaries
    cpi_2018_so <- 251.10           # KLPS4_E+_globals.do (originally from the Bureau of Labor Statistics)
    cpi_2017_so <- 245.120          # KLPS4_E+_globals.do (originally from the Bureau of Labor Statistics)
    teach_sal_2017usdppp_so <- teach_sal_new_so * cpi_2017_so / cpi_2017_so # redundant, but for the sake of consistency

    n_students_so <- 45            #Average pupils per teacher  45
    #ATTENTION!
    years_of_treat_0_so <- 2.41      #Additional Years of Treatment - Table 1, Panel A
    unit_cost_local_so <- 43.66    #Deworm the World
    unit_cost_so <- 0.42           # Unit cost of deworming (in 2018 USD) - from Evidence Action
    #CALCULATIONS TO CONVERT ALL CURRENCY TO 2017 USD PPP
    unit_cost_ppp_so <- unit_cost_so*ex_rate_2018_so/ex_rate_2018_ppp_so
    unit_cost_2017usdppp_so <- unit_cost_ppp_so * cpi_2017_so / cpi_2018_so  # 0.8296927
    # Adjust for inflation: convert all costs to 2017 USD
    # Move this calculations into the body of the document (and outside of the sources chunk)
    costs_par_so <- 1
    costs_par_sd_so <- 0.1
    counts_par_so <- 1
    counts_par_sd_so <- 0.1

    #############
    ##### Guess work   
    #############
    # ATTENTION!
    # prevalence_r_in
    prevalence_r_so <- c("india" = 0.5665, "kenya" = 0.345, "nigeria" = 0.27, "vietnam" = 0.145)  #0.5665   0.5013121
    # based on https://docs.google.com/spreadsheets/d/1drKdU-kRjlRtwXq6nCqFC6gcoQ-eOaLfT9MWHSMZ0MA/edit?usp=sharing
    new_prevalence_r_so <- NULL
    years_of_treat_t_so <- 2.41      #Years of Treatment in new setting
    staff_time_so <- 0.3           #Added Deworming costs due to government staff time
    time_to_jm_so <- 10            #Time from initial period until individual join the labor force

    # Fix teach_sal_so       
    return( sapply( ls(pattern= "_so\\b"), function(x) get(x)) )
###############################################################################
###############################################################################    
}
invisible( list2env(chunk_sources(),.GlobalEnv) )
#############
##### Notes:
#############
# on growth_rate_so: (http://data.worldbank.org/indicator/NY.GDP.PCAP.KD/), see calculation
# on "Kenya GDP per capita" tab. In W@W this equals 1.52%. ISSUE: This growth number should
# be updated to be 2002-2014, I think.
#
# on coef_exp_so: 1998/1999 Kenyan labor force survey; regression of earnings on age, age^2,
# female dummy, indicators for attained primary/secondary/beyond, and province dummies.
# Estimate used in W@W: (0.1019575, -0.0010413). ISSUE: For now assume no further life cycle
# adjustment beyond KLPS-3 (likely a conservative assumption).
#
# coverage_so: Overall Saturation (0.511) / 0.75 - not reported in table, average of T & C
Main Policy Estimate

Figure 0.1: Main Policy Estimate

Executive Summary

This report is part of an Open Policy Analysis (OPA) on deworming interventions. An OPA is a policy analysis that emphasizes high levels of transparency and reproducibility. It contains one open output that best represents the facts to inform policy makers, one report (this document) that clearly explains all the analysis, and one repository that contains all the materials to reproduce the report and final output.

This report describes three approaches to compute the net present value of mass deworming interventions. The first two approaches are exact reproductions from previous research (Baird et al. 2016; Hamory et al. 2020), and the third approach is a combination of the previous two with some modification suggested by Evidence Action, a key policy partner in this area. This third approach uses the same benefits as the previous approaches and adjusts for different costs, prevalence rates and length of treatment across settings. We suggest that this final approach should be used as the best available policy estimate to compare costs and benefits of deworming in different settings.

The main policy estimate predicts that a mass deworming intervention will have a net present value (comparison of stream of benefits and costs from today’s perspective) of 289.8 for a setting with average prevalence and average unit costs (among the countries where Evidence Action has data for). Readers interested in learning about the predicted value for a specific setting are encourage to use the interactive app components of this OPA.

*

Open Policy Analysis

This report is part of an Open Policy Analysis (OPA) project on deworming interventions. A framework for making policy analyses transparent and reproducible (Hoces de la Guardia, Grant, and Miguel 2020), OPA’s goal is to clearly show how an analysis was conducted and how to best represent key figures or results for policy makers to use as a factual basis for deliberation. In addition, OPA facilitates the re-use of analyses across similar settings, and sheds light on how evidence generated by research is used in specific policy analyses.

This OPA project contains three components, following the OPA principles laid out in the aforementioned paper:

  1. One single output that best represents the factual information required by policy makers to inform their position regarding a policy of mass deworming. This output is presented in Figure 0.1, and described in the results section of this report. The connection between each component of the analysis and the final output can be explored interactively in this web app.

  2. This detailed report that describes how to obtain the policy estimate and describes each component of the analysis.

  3. A repository that contains all the materials needed to reproduce the analysis with minimal effort (report and interactive app).

This report provides a complete description of the analysis behind the results presented to inform a policy discussion on deworming interventions. It describes how to reproduce the analysis in its entirety, and includes all the methodological choices involved. In order to document all the steps without overwhelming the reader, the report is displayed in a layered fashion. The first layer consists of a narrative description of the analysis. The second layer, that appear after clicking in the screenshot contains equations that show how each piece of the analysis was carried out. And the third and final layer displays the code used to operationalize each equation. All this information is contained in this document using dynamic documentation (Xie 2015), so interested readers can access the source file of the report and reproduce the entire document in their own computing environments.

1 Introduction

Parasitic worm infections, also known as soil-transmitted helminths (STH) and schistosomiasis, are endemic in many countries across the globe, disproportionately affecting the poor. These parasitic worms interfere with regular bodily processes by decreasing nutrient uptake and can thus lead to serious consequences on human health, education outcomes, and long-term economic well being. In particular, evidence indicates that these worms contribute to malnourishment, impairment of mental and physical development, lower school attendance, and decreased wages (Croke 2014; Miguel and Kremer 2004; Baird et al. 2016).

Evidence from previous mass deworming interventions has demonstrated to be a highly effective public health policy. Here we provide a policy analysis that compares benefits and costs of deworming across different settings, allowing for the translation of research findings into different policy-relevant scenarios.

The goals of this OPA are three. First, to increase the transparency and reproducibility behind existing policy analyses on the costs and benefits of mass deworming programs. Second, to update this policy analyses with input from stakeholders closely involved in policy making around deworming. And third, to illustrate how an open policy analysis framework can be implemented in practice.

The Cost Benefit Analysis (CBA) of deworming is computed using three different approaches:

  1. Reproducing the original CBA produced by Baird et al. (2016), which estimates the net present value of a Kenya school-based deworming program after a 10 year follow-up for four different policy estimates.
  2. Reproducing an updated version of such analysis on the same intervention but with additional follow-up data (Hamory et al. 2020).
  3. Producing a new analysis that, building from the previous two approaches, focuses on one specific policy estimate, and allows for results to vary depending on key characteristics of current settings where deworming policies are being implemented. This new approach was developed in consultation with a key stakeholder in this area, the non-governmental organization (NGO) Evidence Action (EA)1.

2 Methodology

We first describe the common elements across all three approaches, and then describe each approach in detail.

Common structure

The starting point is a comparison of a stream of benefits and costs over the lifetime of the recipients of deworming. The final policy estimate is the discounted sum of all costs and benefits, known as the Net Present Value (NPV)2.

Show all the details

\[\begin{equation} NPV = B - C \\ \end{equation}\]

Where:

  • \(NPV\): net present value of the deworming treatment
  • \(B\): benefits of the deworming treatment
  • \(C\): costs of the deworming treatment


Benefits are equal to the additional lifetime earnings that individuals are expected to generate due to deworming treatment. These additional earnings are computed as a discounted sum over their working lifetime.

Show all the details

\[\begin{equation} B = \sum_{t=0}^{50}\left( \frac{1}{1 + r}\right)^{t} E_{t} \label{eq:1} \tag{1} \end{equation}\]

Where:

  • \(E_{t}\): earnings individuals are expected to generate at period t
  • \(r\): real interest rate as the discounting rate
  • \(t\): period t. Period 0 represents time of intervention. Individuals are assumed to enter the labor market 9 years after treatment.


At a high level all three approaches focus on the same type of benefits: the increase in incomes over the lifetime of beneficiaries of deworming. This is likely an under-estimate of the benefits as it does not quantify the non-pecuniary effects of improved health. The costs can be separated into direct costs of implementing and evaluating deworming programs, and indirect costs, such as additional costs to the education system as a result of increased child attendance, associated with the benefits of deworming.

The main differences in benefits across the three approaches have to do with how to predict the earnings profiles over a lifecycle, and how to account for differences in worm prevalence rates and length of treatment across settings. Approaches 1 and 2 use different earning profiles, and approach 3 combines both earning profiles and adjusts for possible differences in prevalence rates of worm infections and length of treatment.

The main differences in costs between scenarios have to do with a) whether indirect costs are included, and b) how to compute the relevant unit cost for the analysis. The first two approaches include indirect costs and use the unit costs of a specific country (Kenya) where the study was originally conducted, while the third approach does not include indirect costs and use unit costs of various countries from data provided by Evidence Action.

The discounting rate

All three approaches use the real interest rate (\(r\)) as the discounting rate. This is obtained from the interest rate on government bonds (\(i\)) minus the inflation rate (\(\pi\)).

Show all the details

\[\begin{equation} r = \frac{1 + i}{1 + \pi} - 1 \\ r \approx i - \pi \label{eq:2} \tag{2} \end{equation}\]

Where:

  • \(r\): real interest rate as the discounting rate
  • \(i\): interest rate on government bonds
  • \(\pi\): inflation rate


The actual value varies across approaches depending on the time and country chosen. For example approach 1 uses the return from government bonds and the inflation rate in Kenya for the year 2016, while approaches 2 and 3 uses the values for the same country for the year 2019. This results in discount rates of 9.85% and 5% for approach 1 and, 2 and 3 respectively.

2.1 Approach 1: Baird et al. (2016)

In this first approach, the effect on earnings over the entire lifecycle is predicted by extrapolating the effects on hours worked by individuals in the original treatment group, ten years after the intervention.

Two types of results are presented: the total effect on earnings projected over a lifetime and the estimated fiscal effect due to the government collecting additional taxes on higher earnings. The effects are calculated in two scenarios: with and without externalities over the population of children who did not receive deworming interventions. In the original deworming study conducted in Kenya, there is evidence of epidemiological externalities for children who remained untreated but who attended treatment schools, as well as for children living near treatment schools. Externality effects may not be as relevant for current-day deworming programs since most programs are national programs that target all school-aged children (and in some cases, preschool-aged children) in at-risk areas.

2.1.1 Gains in earnings

Gains in earnings (\(\Delta W_{t}\)) are the result of multiplying expected earnings in a certain period (\(w_t\)) with the effects of deworming on worked hours. This effect can have two components: a direct effect of deworming on the individual (\(\lambda_1\)) and the indirect effect on earnings due to externalities (\(\lambda_2\)). The indirect effects are considered within the context of the treatment coverage and saturation.

Show all the details

\[\begin{equation} \Delta W_{t} = w_{t}\left( \lambda_{1} + \frac{p \lambda_{2}}{R} \right) \label{eq:3} \tag{3} \end{equation}\]

Where3:

  • \(w_t\): the earnings in period \(t\)
  • \(\lambda_{1}\): the direct effects of deworming on earnings
  • \(\lambda_{2}\): the indirect effects of deworming on earnings
  • \(p\): saturation, measures the fraction of the population that is effectively using the treatment
  • \(R\): coverage, defined as the fraction, among all neighboring schools (within 6 km), that belongs to the treatment group


2.1.1.1 Earnings over time

Wages in year \(t\) correspond to the initial weekly wage (\(w_0\)) adjusted by an economy-wide increase in salaries and by an increase in salaries due to additional experience at the individual level. The economy-wide wage adjustment is assumed to be equal to the per capita GDP growth (\(g\)) applied to the total number of years of work (\(Xp\)). The life cycle path for wages increases at decreasing rates (wages typically increase with more years of work, then decline later in a life cycle). It is assumed that individuals enter the labor force 10 years after the treatment period. Weekly wages are multiplied by 52 weeks to obtain the annual rate.

The initial wage in dollars (\(w_{0}\)) is a weighted average of wages for the control group in agriculture, working wage, and self-employed sectors (\(ag, ww, se\)). The weights correspond to the fraction of all the average worked hours dedicated to each sector (\(h\)).

The wage in agriculture comes from Suri (2011), whereas the working wage comes from the study data and is defined as an hourly wage for those who reported more than 10 hrs of work per week in the control group. The self-employed wage (\(w_{se}\)) was constructed as the reported monthly earnings from self-employed profits, divided by the reported weekly number of hours worked in self-employment for those who worked a positive number of hours (multiplied by 4.5 to obtain the monthly total).

The monthly self-employed profits and self-employed hours for the control group, for those with positive hours, also comes from study data (Page 1168, Table 4, Panel C, Column 5, Row 1). The measure of hours in self employment used to compute wages is different from the one used to compute the weights above. The first one captures hours of work among those actively employed in the self-employed sector, and the second captures the average hours of work as self-employed among all the population of working age in the sample (hence capturing the relative importance of the self employed sector in the economy).

Show all the details

The wages/earnings are determined by:

\[\begin{equation} w_t = \text{#weeks} \times w_0 (1 + g)^{Xp}(1 + \hat{\beta_1} Xp + \hat{\beta_2} Xp^2) \quad \text{for } t=10, \dots, 50 \label{eq:4} \tag{4} \end{equation}\]

\[\begin{equation} w_0 = \frac{1}{ex} \sum_{l \in \{ag, ww, se\}}w_{l}\alpha_{l} \\ \quad \text{with: } \alpha_{l}= \frac{ h_{l}}{h_{ag} + h_{ww} + h_{se}} \label{eq:5} \tag{5} \end{equation}\]

\[\begin{equation} w_{se} = \frac{ \text{Monthly self-employed profits} }{4.5 \times E[h_{se}|h_{se}>0] } \label{eq:6} \tag{6} \end{equation}\]

Where:

  • \(w_t\): the weekly earnings in period \(t\)
  • \(w_0\): the initial weekly earnings
  • \(g\): per capita GDP growth
  • \(Xp\): years of work
  • \(\hat{\beta_1}\): coefficient estimate for \(Xp\)
  • \(\hat{\beta_2}\): coefficient estimate for \(Xp^2\)
  • \(ex\): exchange rate
  • \(h\): average worked hours dedicated to each sector
  • \(ag\): agriculture
  • \(ww\): working wage
  • \(se\): self-employed sectors
#inputs: wages (wage_ag_so, wage_ww_so) self employed income (profits_se_so,
#  hours_se_cond_so) hours of work (hours_ag_so, hours_ww_so, hours_se_so),
#  exchange rate (ex_rate_so), timing vars (periods_so, time_to_jm_so),
#  growth rate (growth_rate_so), mincer coef (coef_exp_so[1], coef_exp_so[2])
#
#outputs: Starting wages: value (wage_0_in) and function (wage_0_f),
# Wage trajectory: value (wage_t_in) and function (wage_t_f).
chunk_wages <- function(){
################################################################################
################################################################################  
    #close to value from spreadsheet (Assumps&Panel A Calcs!B137 = 0.1481084),
    #but I suspect diff due to computational precision

  wage_0_f <- function(wage_ag_var,
                          wage_ww_var,
                          profits_se_var,
                          hours_se_cond_var,
                          hours_ag_var,
                          hours_ww_var,
                          hours_se_var,
                          ex_rate_var){
        experience_aux <- 0:periods_so - time_to_jm_so
        wage_se <- profits_se_var / (4.5 * hours_se_cond_var)
        wage_ls <- c(wage_ag_var, wage_ww_var, wage_se)
        alpha_ls <- c(hours_ag_var, hours_ww_var, hours_se_var) /
          sum( c(hours_ag_var, hours_ww_var, hours_se_var) )
        res1 <- 1/ex_rate_var * sum( wage_ls * alpha_ls )
        return(res1)
    }

  wage_t_f <- function(wage_0_var,
                          growth_rate_var,
                          coef_exp1_var,
                          coef_exp2_var) {
        experience_aux <- 0:periods_so - time_to_jm_so
        res1 <- 52 * wage_0_var * ( ( 1 + growth_rate_var )^experience_aux ) *
          ( 1 + coef_exp1_var * experience_aux + coef_exp2_var *
              (experience_aux^2) ) * ifelse(0:periods_so >= time_to_jm_so, 1, 0)
        return(res1)
    }



################################################################################
################################################################################
    return(list("wage_0_f" = wage_0_f,
                "wage_t_f" = wage_t_f))
}

invisible( list2env(chunk_wages(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:
wage_0_in <- wage_0_f(wage_ag_var = wage_ag_so,  
                      wage_ww_var = wage_ww_so,
                      profits_se_var = profits_se_so,
                      hours_se_cond_var = hours_se_cond_so,  
                      hours_ag_var = hours_ag_so,
                      hours_ww_var = hours_ww_so,
                      hours_se_var = hours_se_so,
                      ex_rate_var = ex_rate_so)  

#close to value from spreadsheet (Calcs-Table 5!N21.. = 7.701634678),
#but I suspect diff due to computational precision
wage_t_in <- wage_t_f(wage_0_var = wage_0_in,
                      growth_rate_var = growth_rate_so,
                      coef_exp1_var = coef_exp_so[1],
                      coef_exp2_var = coef_exp_so[2])


2.1.1.2 Deworming effects: direct and externalities

The estimated impact of deworming on hours worked comes from Baird et al. (2016) and are estimated separately for men (\(\lambda_{1,male}\)) and women (\(\lambda_{1,female}\)). These two parameters are combined with a simple mean in the analysis.

The estimated externality effect (\(\lambda_{2}\)) reflects the additional hours worked due to individuals who did not receive the treatment but still saw reductions in the likelihood of infection due to lower worm prevalence in their community. Note that this parameter is not estimated by gender, so we repeat its value two times. All the components to the equation \ref{eq:7} come from Baird et al. (2016). The externalities effects are adjusted by the coverage and saturation of the original study.

Show all the details

\[\begin{equation} \lambda_{1} = \frac{1}{2} \lambda_{1,male} + \frac{1}{2} \lambda_{1,female}\\ \label{eq:7} \tag{7} \end{equation}\]

Where:

  • \(\lambda_1\): average impact of deworming on hours worked for both men and women
  • \(\lambda_{1,male}\): average impact of deworming on hours worked for men
  • \(\lambda_{1, female}\): average impact of deworming on hours worked for women


2.1.1.3 Coverage and saturation of the original study

The coverage (\(R\)) is defined as the fraction, among all neighboring schools (within 6 km), that were treated within the study. Since the treatment was applied to approximately two thirds of the population, \(R\) is set to: \(R = 0.68\)4.

The saturation of the intervention, \(p\), measures the fraction of the population that is effectively using the treatment. It is defined as a weighted average of the treatment take-up under a full subsidy for deworming and the take-up under zero subsidy.

For this setting Kremer and Miguel (2007) (Page 48, Table 1, Panel C, Col 1, Row 3) estimated that take-up with full subsidy (\(Q(full)\)) was 0.75. Miguel and Kremer (2004) (Table 3 and footnote 18) observed minimal to no take-up without subsidy (\(Q(0)\)), hence it is assigned the value of 0.

Show all the details

\[\begin{equation} p = R \times Q(full) + (1 - R) \times Q(0) \label{eq:8} \tag{8} \end{equation}\]

Where:

  • \(p\): saturation, measures the fraction of the population that is effectively using the treatment
  • \(R\): coverage, measures the fraction of the population that is effectively using the treatment
  • \(Q(full)\): take-up with full subsidy
  • \(Q(0)\): take-up without subsidy
# - inputs: coverage (coverage_so), take-up with full subsidy (q_full_so), and
# take-up with no subsidy (q_zero_so)
# - outputs: saturation (saturation_in)
chunk_coverage <- function(){
###############################################################################
###############################################################################  

  saturation_in_f <- function(coverage_var = coverage_so,
                              q_full_var = q_full_so,
                              q_zero_var = q_zero_so){
      saturation_in <- coverage_so * q_full_so + ( 1 - coverage_so ) * q_zero_so
      return(list("saturation_in" = saturation_in))
    }

###############################################################################
###############################################################################  
    return(list("saturation_in_f" = saturation_in_f))   
}
invisible( list2env(chunk_coverage(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:
saturation_in <- saturation_in_f()$saturation_in

# Computing values for inline text:

# pv_benef
# ├──── earnings_app1_f
# |      ├──── delta_ed_final_f
# |      ├──── saturation_in_f
# |      └──── wage_t_f()
# |      |      └──── wage_0_f()
# |      |            
# |      ├──── lambda1_in_f()
# |      └──── lambda2_in_f()
# └──── interest_f()

earnings_no_ext_in <- earnings_app1_f(
  wage_var = wage_t_in,
  lambda1_var = lambda1_in[1],
  saturation_var = saturation_in,
  lambda2_var = 0,
  coverage_var = coverage_so
)

earnings_yes_ext_in <- earnings_app1_f(
  wage_var = wage_t_in,
  lambda1_var = lambda1_in[1],
  saturation_var = saturation_in,
  lambda2_var = lambda2_in[1],
  coverage_var = coverage_so
)

pv_benef_no_ext_in <- pv_benef_f(
  earnings_var = earnings_no_ext_in,
  interest_r_var = interest_in,
  periods_var = periods_so
)

pv_benef_yes_ext_in <- pv_benef_f(
  earnings_var = earnings_yes_ext_in,
  interest_r_var = interest_in,
  periods_var = periods_so
)


2.1.1.4 Assessing computational reproducibility of original results

Without externalities, the original analysis (Baird et al. (2016)) obtains a present value of benefits of 142.43 (table 5, column 3, and row 9). Including externalities, they obtain a present value of benefits of 766.81 (table 5, column 3, and row 12). Following the steps described in this section, this analysis obtains the same result (142.4258784 and 766.8143995 respectively without rounding).

2.1.2 Costs

The costs are a combination of direct costs of mass deworming (relative to the status quo, which is no subsidy for deworming) and indirect costs on the education system due to the additional time treated individuals spend in school.

Show all the details \[\begin{equation} C = \left( S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \right) + K \sum_{t=0}^{50} \left( \frac{1}{1 + r}\right)^{t} \Delta \overline{E}_{t}(S1,S2) \label{eq:9} \tag{9} \end{equation}\]

Where:

  • \(S_2\): per-capita costs of deworming under the deworming intervention
  • \(S_1\): per-capita costs of deworming if the government does not provide any additional resources for deworming
  • \(Q(S_2)\): take-up under a mass deworming intervention
  • \(Q(S_1)\): take-up without additional resources from the government
  • \(K\): cost per student to get education
  • \(\Delta \overline{E}_{t}(S1, S2)\): estimated increase in school attendance


2.1.2.1 Direct costs: increase in deworming costs

Direct deworming costs (\(DC\)) are defined as the take-up under a mass deworming intervention (\(Q_{2}\)), times the per-capita costs of deworming under the intervention (\(S_{2}\)). These costs are compared to a status quo scenario where the government does not provide any additional resources for deworming. This analysis assumes that there is no subsidy for deworming under the status quo.

2.1.2.2 Indirect costs: additional years of education and its costs for government

As a result of deworming treatment, there is an estimated increase in school attendance, which is multiplied by the cost of education per student to calculate the additional indirect cost on the education system imposed by a treated individual. The additional costs on education are computed as follows: first compute a cost per student (\(K\)). This is calculated as the salary of the teacher plus benefits, divided by the average number of students per teacher. Second, the cost per student is multiplied by the estimated increase in school attendance (\(\Delta \overline{E}_{t}(S1,S2)\)). For this we use a series of estimated effects, including the additional direct increase in secondary schooling from 1999 to 2007 obtained from an additional analysis related to Baird et al. (2016). This series does not take into account the externality effects. To incorporate externality effects, we would need another series (from the same source) that estimates the additional secondary schooling increase due to the externality in order to add it to the original series.

Show all the details

\[\begin{equation} K = \frac{\text{teacher salary} + \text{teacher benefits}}{\text{# Students}} \label{eq:11} \tag{11} \end{equation}\]

# - inputs: teacher salary (teach_sal_so) and benefits (teach_ben_so), number
# of students (n_students_so), include externalities (include_ext_so), extra ed
# without ext (delta_ed_so), and extra ed due to ext (delta_ed_ext_so)
# - outputs: cost per student (cost_per_student_f), and total additional
# education (delta_ed_final_f)
chunk_edcosts <- function(){
###############################################################################
###############################################################################    

    cost_per_student_f <- function(teach_sal_var = teach_sal_so,
                                    teach_ben_var = teach_ben_so,
                                    n_students_var = n_students_so) {
        (teach_sal_var + teach_ben_var) / n_students_var
    }

    delta_ed_final_f <- function(include_ext_var = include_ext_so,
                                 delta_ed_var = delta_ed_so,
                                 delta_ed_ext_var = delta_ed_ext_so){
        if (include_ext_var == TRUE){
            delta_ed_final_in <-  delta_ed_ext_var[,1] + delta_ed_var[,1]
        }else{
            delta_ed_final_in <- delta_ed_var[,1]
        }
        return(delta_ed_final_in)
    }

###############################################################################
###############################################################################  
    return(list("cost_per_student_f" = cost_per_student_f,
                "delta_ed_final_f" = delta_ed_final_f))
}
invisible( list2env(chunk_edcosts(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:
cost_per_student_in <- cost_per_student_f()
delta_ed_final_no_ext_in <- delta_ed_final_f(include_ext_var = FALSE)
delta_ed_final_yes_ext_in <- delta_ed_final_f(include_ext_var = TRUE)

# Computing values for inline text:

# pv_costs_f
#  ├──── delta_ed_final_f
#  ├──── interest_f
#  └──── cost_per_student_f
#  |      └──── x
#  ├──── s2_f
#  └──── lambda2_in_f

pv_cost_no_ext_in <- pv_costs_f(
      periods_var = periods_so,
      delta_ed_var = delta_ed_final_no_ext_in,
      interest_r_var = interest_in,
      cost_of_schooling_var = cost_per_student_in,
      s1_var = 0,
      q1_var = 0,
      s2_var = s2_in,
      q2_var = q_full_so
    )

pv_cost_yes_ext_in <- pv_costs_f(
      periods_var = periods_so,
      delta_ed_var = delta_ed_final_yes_ext_in,
      interest_r_var = interest_in,
      cost_of_schooling_var = cost_per_student_in,
      s1_var = 0,
      q1_var = 0,
      s2_var = s2_in,
      q2_var = q_full_so
    )


2.1.2.3 Assessing computational reproducibility of original results

Without externalities, the original analysis (Baird et al. (2016)) obtains a present value of costs of 11.78 (table 5, column 3, and adding rows 6 and 3). Including externalities, they obtain a present value of benefits of 25.2 (table 5, column 3, and adding rows 6 and 3 and 7). Following the steps described in this section, this analysis obtains the same result (11.7761881 and 25.1962131 respectively without rounding).

2.2 Approach 2: Hamory et al. (2020)

In this second approach, benefits follow the same principle as in approach 1 (increase in lifetime earnings), but it uses updated data on the effects on the labor market outcomes. Instead of projecting a trend of earnings into the future (after the estimated impact of the 10 year follow-up), this analysis uses additional data from 15 and 20 year follow-ups after the original intervention. Costs are fairly similar to approach 1, with the addition that in this second approach, the costs also account for discounting of the several rounds of treatment required for effective deworming. Additionally, the interest rate is updated to current values of return on (Kenyan) government bonds and inflation.

2.2.1 Gains in earnings

Gains in earnings (\(\Delta W_{t}\)) from 10, 15, and 20 years after the intervention are used to measure the effect of multiple rounds of deworming on welfare over time. This is an important difference from approach 1, which only measures gains in earnings at year 10 and extrapolates them into the future. To extrapolate earnings after the 20-year measurement, the authors assume that the welfare gains disapear 25 years after the intervention. Hence the treatment effect over an individual’s working life is the sum of the treatment effects over their working lifetime5. This approach also disregards externality effects and measures the estimated effects directly on earnings (as opposed to approach 1 that measures effects on earnings indirectly through hours worked). The estimated treatment effects that pools years 10, 15, and 20, is $80 dollars per person per year.

Gains in yearly earnings represent the treatment effect on welfare (\(\alpha^{pooled}\)), which implicitly takes into consideration the life cycle profile of wages, economywide growth, etc.

Show all the details

\[\begin{equation} \Delta W_{t} = \mathbf{1}(10 < t \leq 25)\alpha^{pooled} \label{eq:12} \tag{12} \end{equation}\]

Where:

  • \(\Delta W_t\): gains in earnings from 10, 15, and 20 years after the intervention
  • \(\alpha^{pooled}\): pooled estimated treatment effects of 10, 15, 20 years after the intervention


2.2.2 Costs

2.2.2.1 Direct costs: increase in deworming costs

Similar to approach 1, the direct deworming costs under approach 2 are calculated by comparing the costs under a complete subsidy to the costs under the status quo of no subsidy. The two main differences with the previous cost estimates are 1) now the direct costs are summed and discounted over the treatment period, and 2) cost data has been updated after gathering more recent figures from Evidence Action.

Show all the details

\[\begin{equation} DC = \sum_{t=0}^{1.4} \left( \frac{1}{1 + r}\right)^{t} \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] \label{eq:13} \tag{13} \end{equation}\]

Since the analysis is discrete, and we cannot sum over a non-integer, we find

\[\begin{equation} DC = \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] + \left( \frac{1}{1 + r}\right)\big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] + \\ .4\left( \frac{1}{1 + r}\right)^2 \big[S_{2}Q(S_{2}) - S_{1}Q(S_{1}) \big] \label{eq:14} \tag{14} \end{equation}\]

Where:

  • \(DC\): direct deworming costs
  • \(r\): discounting rate, defined as the real interest rate
  • \(S_2\): per-capita costs of deworming under the deworming intervention
  • \(S_1\): per-capita costs of deworming if the government does not provide any additional resources for deworming
  • \(Q(S_2)\): take-up under a mass deworming intervention
  • \(Q(S_1)\): take-up without additional resources from the government


With complete subsidy, the costs of the intervention become the total direct costs of deworming each child (in USD). Most recent (2018) data from Evidence Action reveals this cost to be $0.42 per year. Adjusting for purchasing power and inflation, we get a per capita cost of $0.83. Adding all indirect cost over an average 2.4 years of treatment, the average cost of deworming each child over the entire treatment period is $1.44.

2.2.2.2 Indirect costs: additional years of education and its costs for government

The indirect cost on the education system is calculated similarly to approach 1: the cost per student is multiplied by the increase in school attendance due to deworming. The cost of additional schooling is given by the product of the annual cost of schooling each child and the number of additional years children attend school as a result of deworming. This analysis assumes that pressure is added to educational institutions for a maximum of nine years, starting at year zero. The cost per student (\(K\)) is updated with new information on annual teacher salary (including benefits)6, $12,055 (also adjusted for PPP), and the same average number of students per teacher (45).

Hence, the cost of schooling each child for an additional year is now $267.9 (USD).

Show all the details

\[\begin{equation} K \sum_{t=0}^{8} \left( \frac{1}{1 + r}\right)^{t} \Delta \overline{E}_t(S1,S2) \label{eq:15} \tag{15} \end{equation}\]

Where:

  • \(K\): cost per student to get education
  • \(\Delta \overline{E}_{t}(S1, S2)\): estimated increase in school attendance


Over this nine year period, treated students attended school for an additional 0.15 years on average. Then we get an average cost of additional schooling per child over the nine-year period, $32.40.

2.2.3 Assessing computational reproducibility of original results

The second approach does not report benefits and costs separatedly. With all these elements the main result from the original analysis that is comparable with the results discussed here is a NPV of 499.72 (table A12, column 3, and row 6) This result corresponds to a social internal rate of return of 40.7% located as an inline result in the paper - also in Figure 1 - and in the appendix at table A12, column 3, and row 9). Following the steps described in this section, this analysis obtains the same result (499.689353 and 40.7483155643791% respectively without rounding).

2.3 Approach 3: Combination of Previous Approaches and Input From Key Policy Partners

In this third and final approach, we borrowed some methodological elements from Baird et al. (2016) and Hamory et al. (2020) and sought feedback from a key policy partner to best identify one clear output to inform policy makers. We worked in collaboration with the NGO Evidence Action, a key technical assistance partner in this area. Evidence Action provided insights on what are the most relevant costs and benefits from the perspectives of policy makers, and on certain aspects of the analysis that could be updated with present-day data.

Under this approach, the benefits from deworming described in Approaches 1 and 2 are scaled to reflect differences in prevalence rates, and length of treatment. Additionally, the relevant costs are constrained to direct costs alone (excluding additional costs on education). Finally this approach uses inputs costs and prevalence that reflect the current settings where Evidence Action is currently supporting deworming interventions. As of 2020, Evidence Action supports deworming interventions in four countries.

2.3.1 Benefits

2.3.1.1 Adjusting for different prevalence rates

To account for different prevalence rates (\(\eta\)), the estimated treatment effect is decomposed in the impact of deworming on children who were treated and had a worm infection, or the effective treatment effect of deworming (\(\lambda_{1}^{eff}\)), and children who were treated and did not have a worm infection. By construction, the effect on this last group should be zero. Hence the effective treatment of deworming on infected populations will be equal to the estimated treatment (on the ovearll population), divided by the proportion of the prevalence of infections.

In the original evaluation, the prevalence rates were very high (0.92), hence the effect on the infected population was similar to that of the overall population. Currently deworming interventions are often implemented in geographies with much lower prevalence rates (though in populations with sufficient infection to justify treatment in accordance with World Health Organization guidelines), hence to obtain the expected effect over the new region, we need to multiply the effect on the infected population by the prevalence rate in the new region (\(\eta_{new}\)).

Show all the details

For approach 3, we will modify treatment effects of approaches 1 and 2 (equation 4 and 13 respectively) by the following:

\[\begin{equation} \lambda_{1} = \eta \lambda^{eff}_{1} + (1 - \eta) \times 0 \\ \lambda^{r}_{1} = \eta_{new}\lambda^{eff}_{1} \label{eq:16} \tag{16} \end{equation}\]

Where:

  • \(\lambda_1\): direct effects of deworming on individuals’ earnings. Here we use the symbol for treatment effect of approach 1, but the same logic applies to the treatment effect of approach 2 (\(\alpha^{pooled}\))
  • \(\lambda^{eff}_1\): impact of deworming on children who were treated and had a worm infection in the original evaluation
  • \(\lambda^r_1\): impact of deworming on children who were treated and had a worm infection in the new region
  • \(\eta\): prevalence rates in the original evaluation
  • \(\eta_{new}\): prevalence rates in the new region
# - inputs: previously estimated treatment effect (lambda1_in_f), prevalence
# rates in the original setting (prevalence_0_so), prevalence in the new setting
# (prevalence_r_so), countries included in the analysis (country_sel_so)
# and their population (country_sel_pop_so), or single input of new prevalence
# (new_prevalence_r_so)
# - outputs: effective treatment effect (lambda_eff_f)
chunk_lambdas_eff<- function(){
###############################################################################
###############################################################################    

    lambda_eff_f <- function(lambda1_var = lambda1_in_f(),
                           prevalence_0_var = prevalence_0_so,
                           prevalence_r_var = prevalence_r_so,
                           country_sel_var = country_sel_so,
                           country_sel_pop_var = country_sel_pop_so,
                           other_prevl_r_var = new_prevalence_r_so){
      temp_sel <- as.character(country_sel_var)  
      # if a positive number of countries is selected
      if (is.null(other_prevl_r_var)) {
        temp_weights <- country_sel_pop_var[temp_sel] /
          sum(country_sel_pop_var[temp_sel])
        prevalence_r_final <- sum( prevalence_r_var[temp_sel] * temp_weights )
      } else {
        prevalence_r_final <- other_prevl_r_var  
      }
      lambda1_eff_temp <- lambda1_var / prevalence_0_var
      lambda1_eff_in <- lambda1_eff_temp * prevalence_r_final
      return(  
        list("lambda1_eff_in" = lambda1_eff_in,
             "prevalence_r_final_in" = prevalence_r_final)
              )
    }  

###############################################################################
###############################################################################  
    return( list("lambda_eff_f" = lambda_eff_f) )
}
invisible( list2env(chunk_lambdas_eff(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:
lambda1_r_in <- lambda_eff_f()$lambda1_eff_in
prevalence_r_in <- lambda_eff_f()$prevalence_r_final_in


Evidence Action provided prevalence survey data for the geographies where they are involved. In order to be most analogous with the baseline prevalence estimate used in the original study, the prevalence estimates used are 1) the earliest point estimates available from before, or close to the time of, Evidence Action’s involvement in that geography, and 2) are representative of any STH infection.

2.3.1.2 Adjusting for different length of treatment

The number of consecutive years over which a population is exposed to deworming treatment determines the intensity of the effects over this population over time. The two approaches reproduced so far hold the length of treatment constant at the levels estimated by the original study (2.4 years). In this third approach we allow for the years of treatment to vary affecting both benefits and costs. We assume that the effects are linear in the number of years of treatment, with no additional effects after 6 years of treatment. We assumed a maximum of 6 years of impact in this case based on the 20 year KLPS follow-up research, which shows a levelling-off of treatment effect after approximately 6 years of deworming (Hamory et al. (2020); Figure A.5 in Appendix, page A-6).

Adding the element of treatment duration allows us to take into account differences in the number of years of deworming treatment across different country contexts depending on program dynamics. Although the counterfactual of worm prevalence in the absence of treatment is largely unknown, we know that consistent deworming continues to decrease worm prevalence over time, contributing to controlled worm environments and sustained benefits. In many deworming programs today, children receive regular treatment throughout a portion (and in some cases for the full term) of their primary schooling. It is worth noting that the assumption of linearity is an imperfect measure for various epidemiological reasons, though we include this variable of time into the equation as an estimate of the best guess at the differences in achieved impact over time, and in part because it helps capture that a new cohort enters primary school–and is therefore eligible for treatment–with each successive year of a deworming program.

Show all the details

For approach 3, we will modify treatment effects of approaches 1 and 2 (equations 4 and 13 respectively) by the following:

\[\begin{equation} \lambda_{1,t = 1} = \frac{\lambda_{1}}{L_{0}} \\ \lambda_{1,t} = \begin{cases} t \lambda_{1,t = 1} \quad \text{for } t=1, \dots, 6\\ \\ 6 \lambda_{1,t = 1} \quad \text{for } t > 6\\ \end{cases} \label{eq:17} \tag{17} \end{equation}\]

# - inputs: treatment effect (lambda1_in_f), length of treatment in original
# study (years_of_treat_0_so), length of treatment in new setting (years_of_treat_t_so)
# - outputs: per year treatment effect (lambda1_t1) and total treatment effect
# (lambda1_t)

chunk_lambdas_t<- function(){
###############################################################################
###############################################################################    

    lambda_t_f <- function(lambda1_var = lambda1_in_f(),
                           years_of_treat_0_var = years_of_treat_0_so,
                           years_of_treat_t_var = years_of_treat_0_so){
          lambda1_t1 <- lambda1_var / years_of_treat_0_var
          if (years_of_treat_t_var<=6){
            lambda1_t <- years_of_treat_t_var * lambda1_t1
          } else if  (years_of_treat_t_var>6) {
            lambda1_t <- 6 * lambda1_t1
          }
          return(
            list(
              "lambda1_t1" = lambda1_t1,
              "lambda1_t" = lambda1_t)
            )
    }  

###############################################################################
###############################################################################  
    return( list("lambda_t_f" = lambda_t_f) )
}
invisible( list2env(chunk_lambdas_t(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:

# # earnings_app1_f
#  ├──── delta_ed_final_f
#  ├──── interest_f
#  └──── lambda_eff_f
#  |      └──── lambda_t_f
#  |            └──── lambda_in_f
#  ├──── saturation_f
#  └──── wage_t_f
#         └──── wage_0_f

lambda1_t_in <- lambda_eff_f(
  lambda1_var = lambda_t_f(
    lambda1_var = lambda1_in_f(),
    years_of_treat_0_var =  years_of_treat_0_so,
    years_of_treat_t_var =  years_of_treat_t_so
  )$lambda1_t,
  prevalence_0_var = prevalence_0_so,
  country_sel_var = list("india", "kenya", "nigeria", "vietnam"),
  other_prevl_r_var = NULL
)$lambda1_eff_in


app3_earnings_no_ext_in <- earnings_app1_f(
  wage_var = wage_t_in,
  lambda1_var = lambda1_t_in[1],
  saturation_var = saturation_in,
  lambda2_var = 0,
  coverage_var = coverage_so
)

app3_earnings_yes_ext_in <- earnings_app1_f(
  wage_var = wage_t_in,
  lambda1_var = lambda1_t_in[1],
  saturation_var = saturation_in,
  lambda2_var = lambda2_in[1],
  coverage_var = coverage_so
)

app3_pv_benef_no_ext_in <- pv_benef_f(
  earnings_var = app3_earnings_no_ext_in,
  interest_r_var = interest_in,
  periods_var = periods_so
)

app3_pv_benef_yes_ext_in <- pv_benef_f(
  earnings_var = app3_earnings_yes_ext_in,
  interest_r_var = interest_in,
  periods_var = periods_so
)


lambda1_t_new_in <- lambda_eff_f(
  lambda1_var = lambda_t_f(
    lambda1_var = lambda1_new_so[1],
    years_of_treat_0_var =  years_of_treat_0_so,
    years_of_treat_t_var =  years_of_treat_t_so
  )$lambda1_t,
  prevalence_0_var = prevalence_0_so,
  country_sel_var = list("india", "kenya", "nigeria", "vietnam"),
  other_prevl_r_var = NULL
)$lambda1_eff_in


earnings_no_ext_new_in<- earnings_app2_f(t_var = 0:50,
                                      lambda1k1_var = lambda1_t_new_in)

app3_pv_benef_all_new_in <- pv_benef_f(earnings_var = earnings_no_ext_new_in,
                                interest_r_var = interest_new_in,
                                periods_var = periods_so)

To compute the benefits for this approach, this paper uses data on prevalence and length of treatment for the four countries that Evidence Action has records for. Readers interested in assessing the effects of deworming for a specific value of prevalence and length of treatment are referred to the interactive app (tab on key assumptions) where they can input the values that best reflect their setting. To facilitate comparison with the other two approaches, this paper presents here the results using the same length of treatment assumptions parameters as in approach 1 and 2.

Under approach 3, and using the same assumptions as above, the benefits will be: 77.61 and 702 when using benefits of approach 1 without and with externalities, and 289.88 when using the benefit structure of approach 2.

2.3.2 Costs

Evidence Action’s Deworm the World Initiative provides technical assistance to governments to implement school-based deworming programs. Deworm the World works closely with policymakers and government staff who are responsible for ensuring the implementation of deworming programs within their geographies to plan, scale, and sustain school-based deworming programs targeting at-risk children. Deworm the World works to gain and maintain critical support amongst these key stakeholders, thus having important influence over how policymakers take-in and use evidence for decision making. Through Evidence Action’s technical assistance, which typically includes financial support for program implementation, they have access to country-level government cost data on what it takes to implement and evaluate school-based deworming programs across different contexts. To estimate the costs in this analysis, we use costs of deworming provided by Evidence Action (detailed below) and follow a similar approach to GiveWell (2019), which takes those costs and includes an additional estimate around the amount of government staff time required to run deworming programs. The default cost is the per unit cost per treatment round per child across all countries. This is obtained as the weighted average of per unit costs (\(c_{i}\)) in all countries where Evidence Action currently has data on implementation of deworming interventions.7

Costs per country include Evidence Action’s technical assistance costs, government expenditure (including estimates of government staff time), and any other partner costs such as the cost of drugs donated by WHO. These items include: drug procurement and management, monitoring and evaluation, policy and advocacy, prevalence surveys, program management, public mobilization/community sensitization, and training and distribution. Costs can vary by geography due to factors of population size, treatment strategies, age of the program, and costs of “doing business.”

The country weights are computed as the fraction of all treated individuals that correspond to a given country. The per capita cost of each country is obtained by dividing the country’s total costs by the total number of treated individuals in a given period. Total costs for a country represent the total cost across country regions faced by three different payers: Evidence Action, country governments, and other partners.

Show all the details

\[\begin{equation} C = \sum_{i \in Countries } \omega_{i} c_{i} \label{eq:18} \tag{18} \end{equation}\]

\[\begin{equation} \omega_{i} = \frac{N_{i}}{\sum_{j}N_{j}} \\ c_{i} = \frac{C_{i}}{N_{i}} \\ \label{eq:19} \tag{19} \end{equation}\]

\[\begin{equation} C_{i} = (1 + \delta_{g})\sum_{k \in payers}C_{i,k} \\ C_{i,k} = \sum_{l \in items}\sum_{m \in regions}C_{i,k,l,m} \end{equation}\]

Where:

  • \(C\): weighted average of per unit costs in all countries
  • \(c_i\): per unit costs in different countries
  • \(\omega_i\): country weights for computing the costs
  • \(N\): the number of all treated individuals
  • \(C_{i,k}\): costs of a country at a specific payer level
  • \(\delta_g\): additional government staff time required to implement a typical deworming intervention
# - inputs: cost data by payer type at the contry/province level by year (df_costs_so)
#  crosswalk between country/state and region (df_costs_cw_so), treatment counts
#  by country/province and year (df_counts_so); staff time adjusment factor
#  (staff_time_so),
# - outputs: country level cost and population data (costs1_p1_f) and country
#  weights and per capita costs (costs1_p2_f)
#
chunk_cost1_inp <- function(){
###############################################################################
###############################################################################  
  # clean and aggreagate data at country level
  costs1_p1_f <- function(
    df_costs_var = df_costs_so,
    df_costs_cw_var = df_costs_cw_so,
    df_counts_var = df_counts_so) {
    ## Counts
    # Data cleanning:
    # Add country variable
    # anoying message: https://stackoverflow.com/questions/62140483/how-to-interpret-dplyr-message-summarise-regrouping-output-by-x-override

    df_counts_temp <- df_costs_cw_var %>%
      right_join(df_counts_var, by = "Country/State") %>%
      mutate(Country = tolower(Country))
    # keep only last year on record
    suppressMessages(            
        df_counts_last <- df_counts_temp %>%
          group_by(Country) %>%
          summarise("last_year" = max(Year)) %>%
          right_join(df_counts_temp, by = "Country") %>%
          filter(Year == last_year)          
    )
    # compute counts as the sum with-in country-year of treatments
    suppressMessages(            
        c_counts <- df_counts_last %>%
          group_by(Country, Year) %>%
          summarise("total" = sum(`# dewormed`))
    )

    ## Costs
    # Data cleaning:
    # Add country variable
    df_costs_temp <- df_costs_cw_var %>%
      right_join(df_costs_var, by = "Country/State") %>%
      select(-Country.y) %>% rename(Country = Country.x) %>%
      mutate(Country = tolower(Country))
    # values for last year with cost information
    suppressMessages(            
    df_costs_last <- df_costs_temp %>%
      group_by(Country) %>%
      summarise("last_year" = max(Year)) %>%
      right_join(df_costs_temp, by = "Country") %>%
      filter(Year == last_year)    
      )      
     # summing across payers and regions (last equation)
    suppressMessages(            
    costs_by_payer <- df_costs_last %>%
      filter(Payer != "Total") %>%
      group_by(Country, Payer) %>%
      summarise("costs_by_payer" =
                  sum(suppressWarnings( as.numeric(Cost) ), na.rm = TRUE))
    )    
    #sum across payers
    suppressMessages(            
    country_cost <- costs_by_payer %>%
      group_by(Country) %>%
      summarise("costs_by_country" =
                  sum(costs_by_payer) )  
    # Compute the per capita cost for each country (c_i and w_i)
    )
    costs_data_in <- country_cost %>%
       left_join(c_counts, by = "Country")

    return( costs_data_in )
  }

  # Compute weights and per capta costs
  costs1_p2_f <- function(country_total_var = costs_data_in$total,
                         country_cost_var = costs_data_in$costs_by_country,
                         staff_time_var = staff_time_so,
                         country_name_var = costs_data_in$Country,
                         select_var = list("india", "kenya", "nigeria",
                                           "vietnam"),
                         other_costs_var = NULL) {
      # select countries
      country_total_var_temp <- country_total_var[country_name_var %in% select_var]
      country_cost_var_temp <- country_cost_var[country_name_var %in% select_var]
      # create country weight
      c_weights <- country_total_var_temp / sum(country_total_var_temp)
      # create country per capita costs, adjusted by staff time
      per_cap <- country_cost_var_temp * (1 + staff_time_var) /
        country_total_var_temp
      # replace contry costs with new one if there is a new country
      # (only count that new country)
      # (the weighthed sum of this scalar will just be the same number)
      if (!is.null(other_costs_var)) {
      # if (FALSE) {  
        per_cap <- other_costs_var * (1 + staff_time_var)
      }
      return( sum(c_weights * per_cap) )
    }
###############################################################################
###############################################################################  
    return( list("costs1_p1_f" = costs1_p1_f,
                 "costs1_p2_f" = costs1_p2_f) )
}
invisible( list2env(chunk_cost1_inp(),.GlobalEnv) )

##### Execute values of the functions above when needed for the text:
costs_data_in <- costs1_p1_f()
costs1_p2_in <- costs1_p2_f(select_var = list("india", "kenya", "nigeria",
                                              "vietnam"))

The unit costs of treatments, although small, vary substantially across regions. When including cost information for all the countries where Evidence action has data (India, Kenya, Nigeria, Vietnam) the unit costs is $0.08 per round of treatment [CONFIRM WITH GRACE, HARMONIZE WITH FOOTNOTE]. This final cost is primarily driven by the cost, and large population, of India, with a unit cost of $0.06, the other 3 remaining countries have relatively larger unit costs: $0.54, $0.86, $0.52 for Kenya, Nigeria and Vietnam respectively.

2.4 Accounting for Uncertainty

This open policy analysis has aimed to make all the analysis presented so far highly reproducible. One direct result of this novel approach is that now it is possible to thoroughly assess how the final policy estimates change when any of the underlying sources of the analysis changes. In this OPA we have identified each source used in the analysis behind benefits and costs of Deworming interventions. Each of these sources in turn is measured with some uncertainty (either in prediction of future values or estimation of past ones). Traditional policy analysis assumes that each of these sources has no uncertainty, and in some cases incorporates uncertainty or performed sensitivity analysis for a few parameters of interest. By following the open policy analysis principles we now can allow for each source to vary and explore the overall uncertainty of the final policy estimate.

Our approach consists in assuming that each source used in the analysis can be represented as a random draw from a normal distribution. The mean corresponds to the measured value. The standard deviation corresponds to the estimated standard error when available, and to a fraction of the mean when not available. As a default analysis we suggest to set it these standard deviations to 10% of the mean. This choice is arbitrary, but unlike the default arbitrary choice of setting the standard deviations to zero, it makes explicit the uncertainty and it can be modified in the app.

Show all the details

Let \(x\) denote each source used in this analysis.

\[\begin{equation} x \sim N(\hat{x}, \sigma_{x}) \label{eq:20} \tag{20} \\ \sigma_{x} = \begin{cases} \hat{\sigma_{x}} \quad \text{If $\hat{\sigma_{x}}$ is available}\\ \\ \delta_{u}\hat{x} \quad \text{otherwise} \end{cases} \end{equation}\]

As a default \(\delta_{u} = 0.1\)

# This function takes as inputs means and standard deviations of source
# parameters and simualte draws of each source. When the source is a scalar,
# it generates a draw from a noromal dist (mean, sd). When it is a "small"
# (less than 4 elements) vector, generates independent multivariate normals.


#begin by cleaning up the cost data once
costs_data_in <- costs1_p1_f(df_costs_var = df_costs_so,
                          df_costs_cw_var = df_costs_cw_so,
                          df_counts_var = df_counts_so)


# Data: source comes from a standard data source. Government statistic or other
# publicly available statistic
# Research: any sources that requieres some type of investigation to obtain
# Guesswork: no clear source available

sim_data1_f <- function(nsims_var2 = 1e2,                   # "Setup" vars
                      main_run_var2,
                      periods_var2,
                      costs_data_var2 = costs_data_in,
                      run_sim_var2,
                      countries_var2,

                      ex_rate_var2,                  # "Data" vars
                      ex_rate_sd_var2,
                      growth_rate_var2,
                      growth_rate_sd_var2,
                      gov_bonds_var2,
                      gov_bonds_sd_var2,
                      gov_bonds_new_var2,                                                              
                      gov_bonds_new_sd_var2,                                                          
                      inflation_var2,
                      inflation_sd_var2,
                      inflation_new_var2,                          
                      inflation_new_sd_var2,                      
                      tax_var2,
                      tax_sd_var2,

                      lambda1_var2,                  # "Research" vars
                      lambda1_sd_var2,
                      lambda1_new_var2,
                      lambda1_new_sd_var2,
                      lambda2_var2,
                      lambda2_sd_var2,
                      wage_ag_var2,                 
                      wage_ag_sd_var2,
                      wage_ww_var2,
                      wage_ww_sd_var2,
                      profits_se_var2,
                      profits_se_sd_var2,
                      hours_se_cond_var2,
                      hours_se_cond_sd_var2,
                      hours_ag_var2,
                      hours_ag_sd_var2,
                      hours_ww_var2,
                      hours_ww_sd_var2,
                      hours_se_var2,
                      hours_se_sd_var2,
                      coef_exp_var2,         # sd for coef_exp is hard coded
                      prevalence_0_var2,
                      prevalence_0_sd_var2,
                      prevalence_r_var2,
                      prevalence_r_sd_var2,
                      new_prevl_r_var2,       # substitudes the prev_r above??
                      new_prevl_r_sd_var2,
                      coverage_var2,
                      coverage_sd_var2,
                      q_full_var2,
                      q_full_sd_var2,
                      q_zero_var2,
                      q_zero_sd_var2,
                      delta_ed_var2,
                      delta_ed_sd_var2,
                      delta_ed_ext_var2,
                      delta_ed_ext_sd_var2,
                      teach_sal_var2,
                      teach_sal_sd_var2,
                      teach_ben_var2,
                      teach_ben_sd_var2,
                      teach_sal_new_var2,
                      teach_sal_new_sd_var2,
                      teach_ben_new_var2,
                      teach_ben_new_sd_var2,
                      n_students_var2,
                      n_students_sd_var2,
                      years_of_treat_0_var2,
                      years_of_treat_0_sd_var2,
                      years_of_treat_t_var2,
                      years_of_treat_t_sd_var2,
                      unit_cost_local_var2,
                      unit_cost_local_sd_var2,
                      unit_cost_local_new_var2,
                      unit_cost_local_new_sd_var2,
                      costs_par_var2,
                      costs_par_sd_var2,
                      counts_par_var2,
                      counts_par_sd_var2,
                      staff_time_var2,      # Guesswork
                      staff_time_sd_var2,
                      new_costs_var2,
                      new_costs_sd_var2
                      ) {
    start_time <- Sys.time()
    ################
    ###### Draws
    ################
    set.seed(142857)
    #Default dist: normal, default sd: 0.1* mean
    #
    # Sources are separated into: data, research and guess work
    ## Data
    gov_bonds_sim <-        rnorm(n = nsims_var2, mean = gov_bonds_var2,
                                  sd = gov_bonds_sd_var2)
    inflation_sim <-        rnorm(nsims_var2, inflation_var2,
                                  inflation_sd_var2)
    gov_bonds_new_sim <-    rnorm(n = nsims_var2, mean = gov_bonds_new_var2,
                                  sd = gov_bonds_new_sd_var2)
    inflation_new_sim <-    rnorm(nsims_var2, inflation_new_var2,
                                  inflation_new_sd_var2)                  
    growth_rate_sim <-      rnorm(nsims_var2, growth_rate_var2, growth_rate_sd_var2)
    ex_rate_sim <-          rnorm(nsims_var2, ex_rate_var2, ex_rate_sd_var2)
    tax_sim <-              rnorm(nsims_var2, tax_var2, tax_sd_var2)

    ## Research
    aux1 <-0.1 * c(lambda1_var2[1], 0.01)
    # Each list is a pair mean, sd.
    aux2 <-  lapply(1:2, function(x) c(lambda1_var2[x], c(1.42, 1.36)[x] ) )
    lambda1_sim <- sapply(aux2,
                          function(x)  rnorm(nsims_var2, mean = x[1], sd = x[2]) )
    lambda2_sim <-          rnorm(nsims_var2, lambda2_var2,  lambda2_sd_var2)
    # New lambda here
    lambda1_new_sim <- rnorm(nsims_var2, lambda1_new_var2,  lambda1_new_sd_var2)

    wage_ag_sim <-          rnorm(nsims_var2, wage_ag_var2, wage_ag_sd_var2)
    wage_ww_sim <-          rnorm(nsims_var2, wage_ww_var2, wage_ww_sd_var2)
    profits_se_sim <-       rnorm(nsims_var2, profits_se_var2, profits_se_sd_var2)
    hours_se_cond_sim <-    rnorm(nsims_var2, hours_se_cond_var2,
                                  hours_se_cond_sd_var2)
    hours_ag_sim <-         rnorm(nsims_var2, hours_ag_var2, hours_ag_sd_var2)
    hours_ww_sim <-         rnorm(nsims_var2, hours_ww_var2, hours_ww_sd_var2)
    hours_se_sim <-         rnorm(nsims_var2, hours_se_var2, hours_se_sd_var2)
    coverage_sim <-         rnorm(nsims_var2, coverage_var2, coverage_sd_var2)

    unit_cost_local_sim <-  rnorm(nsims_var2, unit_cost_local_var2,
                                  unit_cost_local_sd_var2)
    unit_cost_local_new_sim <-  rnorm(nsims_var2, unit_cost_local_new_var2,
                              unit_cost_local_new_sd_var2)

    years_of_treat_0_sim <-   rnorm(nsims_var2, years_of_treat_0_var2,
                                  years_of_treat_0_sd_var2)
    years_of_treat_t_sim <-   rnorm(nsims_var2, years_of_treat_t_var2,
                                  years_of_treat_t_sd_var2)

    q_full_sim <-           rnorm(nsims_var2, q_full_var2, q_full_sd_var2)
    q_zero_sim <-           rnorm(nsims_var2, q_zero_var2, q_zero_sd_var2)

    # Prevalence here TO DO: draw from a beta instead of "truncated" normal
    prevalence_0_sim <- rnorm(nsims_var2, prevalence_0_var2, prevalence_0_sd_var2)
    prevalence_0_sim <- ifelse(
      prevalence_0_sim > 1,
      yes = 1,
      no = ifelse(prevalence_0_sim < 0, yes = 0, no = prevalence_0_sim)
    )

    aux4 <- lapply(countries_var2, #will have trouble when selecting no countries
                   function(x) c(prevalence_r_so[x],
                                 prevalence_r_so[x]) )

    # first draw samples of prevalence for each country
    prevalence_r_sim <- sapply(aux4,
                                function(x)
                                  rnorm(
                                    nsims_var2,
                                    mean = x[1] * prevalence_r_var2,
                                    sd = x[2] * prevalence_r_sd_var2
                                  ))
    prevalence_r_sim <- ifelse(
      prevalence_r_sim > 1,
      yes = 1,
      no = ifelse(prevalence_r_sim < 0, yes = 0, no = prevalence_r_sim)
    )
    colnames(prevalence_r_sim) <- as.character(countries_var2)  

    # if there is a new entry of prevalence, draw from it. If there is not
    # then leave as null
    if (!is.null(new_prevl_r_var2)){
          new_prevl_r_sim <- rnorm(nsims_var2, new_prevl_r_var2, new_prevl_r_sd_var2)
          new_prevl_r_sim <- ifelse(
            new_prevl_r_sim > 1,
            yes = 1,
            no = ifelse(new_prevl_r_sim < 0, 0, new_prevl_r_sim)
          )
    } else if (is.null(new_prevl_r_var2)){
          new_prevl_r_sim <- NULL
    }
    aux2 <- lapply(1:2, function(x) c(coef_exp_var2[x],c(0.001 , 0.001)[x]) )
    coef_exp_sim <- sapply(aux2, function(x)  rnorm(nsims_var2, mean = x[1],
                                                    sd = x[2]) )     
    teach_sal_sim <-    rnorm(nsims_var2, teach_sal_var2, teach_sal_sd_var2)
    teach_ben_sim <-    rnorm(nsims_var2, teach_ben_var2, teach_ben_sd_var2)

    teach_sal_new_sim <-    rnorm(nsims_var2, teach_sal_new_var2,
                                  teach_sal_new_sd_var2)
    teach_ben_new_sim <-    rnorm(nsims_var2, teach_ben_new_var2,
                                  teach_ben_new_sd_var2)

    n_students_sim <-   rnorm(nsims_var2, n_students_var2, n_students_sd_var2)
    # TO DO: modify to have a scalar multlying the series, and have that
    # scalar being N(1,0.1)
    delta_ed_sim <- sapply(delta_ed_so[,1],
                           function(x) rnorm(
                             nsims_var2,
                             mean = x * delta_ed_var2,
                             sd = delta_ed_sd_var2 * sd(delta_ed_so[, 1])) )
    colnames(delta_ed_sim) <- 1999:2007
    # modify to have a scalar multlying the series, and have that scalar
    # being N(1,0.1)
    delta_ed_ext_sim <- sapply(delta_ed_ext_so[,1],
                               function(x)  {
                                 rnorm(
                                   nsims_var2,
                                   mean = x * delta_ed_ext_var2,
                                   sd =  sd(delta_ed_ext_so[, 1]) *
                                     delta_ed_ext_sd_var2
                                 )
                                 }
                               )
    colnames(delta_ed_ext_sim) <- 1999:2007

    counts_in <- costs_data_var2$total
    costs_no_staff_in <- costs_data_var2$costs_by_country

    # drawing samples form counts
    costs1_counts_sim <- sapply(counts_in,
                                function(x)  rnorm(nsims_var2,
                                                   mean = x * counts_par_var2,  
                                                   sd = x * counts_par_sd_var2)
                                )
    # drawing samples from costs
    costs1_all_costs_sim <- sapply(costs_no_staff_in,
                                function(x)  rnorm(nsims_var2,
                                                   mean = x * costs_par_var2,  
                                                   sd = x * costs_par_sd_var2)
                                )

    #computing unit cost for each simulation draw
    costs1_df_sim <- NULL

    #building "nsims_var2" simulated data sets (corresponding to costs_data_in)
    for (aux1_i in 1:nsims_var2){
      costs1_df_sim[[aux1_i]] <- data.frame(
        "Country" = costs_data_var2$Country,
        "total" = costs1_counts_sim[aux1_i,],
        "costs_by_country" = costs1_all_costs_sim[aux1_i,]
        )
    }
    temp_cost_sim <- rnorm(nsims_var2,
                           mean = new_costs_var2,
                           sd = new_costs_sd_var2)
    ## Guess work
    # drawing samples from staff time
    staff_time_sim <- rnorm(nsims_var2, staff_time_var2, staff_time_sd_var2)      
    periods_val <- 50           #Total number of periods to forecast wages
    time_to_jm_val <- 10        #periods until individual join the labor force

    ######    
    ######    

    ################
    ###### Runs    
    ################

    #Vectors to store the results of each simulation
    a1_tax_sim           <- rep(NA, nsims_var2) #a1_tax_pe
    a1_x_tax_sim         <- rep(NA, nsims_var2) #a1_x_tax_pe
    a1_all_sim           <- rep(NA, nsims_var2) #a1_all_pe
    a1_x_all_sim         <- rep(NA, nsims_var2) #a1_x_all_pe
    a2_tax_sim           <- rep(NA, nsims_var2) #a2_tax
    a2_all_sim           <- rep(NA, nsims_var2) #a2_all
    a3_inc_a1_all_sim    <- rep(NA, nsims_var2) #a3_inc_a1_all
    a3_inc_a1_all_x_sim  <- rep(NA, nsims_var2) #a3_inc_a1_all_x
    a3_inc_a2_all_sim    <- rep(NA, nsims_var2) #a3_inc_a2_all_mpe

    for (i in 1:nsims_var2) {
    # one_run_f, for the most part, does not include standard deviations   
      invisible( list2env(
        one_run_f(main_run_var1 = FALSE,              # HERE I NEED TO PLUG costs1_costs_sim
                run_sim_var1 = TRUE,
                wage_ag_var1 = wage_ag_sim[i],
                wage_ww_var1 = wage_ww_sim[i],
                profits_se_var1 = profits_se_sim[i],
                hours_se_cond_var1 = hours_se_cond_sim[i],
                hours_ag_var1 = hours_ag_sim[i],
                hours_ww_var1 = hours_ww_sim[i],
                hours_se_var1 = hours_se_sim[i],
                ex_rate_var1 = ex_rate_sim[i],
                growth_rate_var1 = growth_rate_sim[i],
                coef_exp_var1 = coef_exp_sim[i, 1], coef_exp2_var1 = coef_exp_sim[i,2],
                lambda1_var1 = lambda1_in_f(lambda1_var = lambda1_sim[i,]),
                prevalence_0_var1 = prevalence_0_sim[i],
                prevalence_r_var1 = prevalence_r_sim[i, ],
                new_prevl_r_var1 = new_prevl_r_sim[i],
                lambda2_var1 = lambda2_sim[i],
                coverage_var1 = coverage_sim[i],
                q_full_var1 = q_full_sim[i],
                q_zero_var1 = q_zero_sim[i],
                lambda1_new_var1 = lambda1_new_sim[i],
                gov_bonds_var1 = gov_bonds_sim[i],
                inflation_var1 = inflation_sim[i],
                gov_bonds_new_var1 = gov_bonds_new_sim[i],
                inflation_new_var1 = inflation_new_sim[i],
                delta_ed_var1 = cbind(delta_ed_sim[i,], 1999:2007),
                delta_ed_ext_var1 = cbind(delta_ed_ext_sim[i,], 1999:2007),
                teach_sal_var1 = teach_sal_sim[i],
                teach_ben_var1 = teach_ben_sim[i],
                teach_sal_new_var1 = teach_sal_new_sim[i],
                teach_ben_new_var1 = teach_ben_new_sim[i],
                n_students_var1 = n_students_sim[i],
                unit_cost_local_var1 = unit_cost_local_sim[i],
                unit_cost_local_new_var1 = unit_cost_local_new_sim[i],
                years_of_treat_0_var1 = years_of_treat_0_sim[i],
                years_of_treat_t_var1 = years_of_treat_t_sim[i],
                tax_var1 = tax_sim[i],
                periods_var1 = periods_so,
                df_costs_var1 = costs1_df_sim[[i]],
                new_costs_var1 = temp_cost_sim[i],    
                staff_time_var1 = staff_time_sim[i],
                countries_var1 = countries_var2
                ),.GlobalEnv) ) # add costs here
      #Baird 1: Costs = Baird w/tax and no externalities (no ext); Benef = Baird no ext
      a1_tax_sim[i] <- NPV_pe_f(benefits_var = pv_benef_tax_nx_in, costs_var = costs2_in)
      #Baird 2: Costs = Baird w/tax and yes externalities (no ext); Benef = Baird yes ext
      a1_x_tax_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_tax_yx_in, costs_var = costs2_x_in)
      # Baird 3: Benefits = Baird all and no ext; Costs = Baird no ext
      a1_all_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_nx_in, costs_var = costs2_in)
      # Baird 4: Benefits = Baird all and yes ext; Costs = Baird yes ext
      a1_x_all_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_yx_in, costs_var = costs2_x_in)
      #KLPS4_1: benefits = KLPS4 w/t and no ext; Costs =    Baird no ext
      a2_tax_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_tax_new_in, costs_var = costs_a2_in)
      #KLPS4_2:benefits = KLPS4 all and no ext; Costs = Baird no ext
      a2_all_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_new_in, costs_var = costs_a2_in)
      # EA1: no externality NPV using EAs costs
      a3_inc_a1_all_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_nx_prevl_in, costs_var = costs2_ea_in)
      # EA2: yes externality NPV using EAs costs
      a3_inc_a1_all_x_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_yx_prevl_in, costs_var = costs2_ea_in)
      # EA3: benef= KLPS all and no ext; Costs=EA
      a3_inc_a2_all_sim[i]  <- NPV_pe_f(benefits_var = pv_benef_all_prevl_new_in, costs_var = costs2_ea_in)
    }

    total_time_sim <- Sys.time() - start_time

    ######    
    ######     
    return( list(
      "a1_tax_sim"          = a1_tax_sim,         
      "a1_x_tax_sim"        = a1_x_tax_sim,         
      "a1_all_sim"          = a1_all_sim,         
      "a1_x_all_sim"        = a1_x_all_sim,         
      "a2_tax_sim"          = a2_tax_sim,        
      "a2_all_sim"          = a2_all_sim,        
      "a3_inc_a1_all_sim"   = a3_inc_a1_all_sim,            
      "a3_inc_a1_all_x_sim" = a3_inc_a1_all_x_sim,            
      "a3_inc_a2_all_sim"   = a3_inc_a2_all_sim,            
      "total_time_sim"      = total_time_sim
    ) )
}

policy_estimates_varnames <- c(
  "a1_tax_sim",
  "a1_x_tax_sim",
  "a1_all_sim",
  "a1_x_all_sim",
  "a2_tax_sim",
  "a2_all_sim",
  "a3_inc_a1_all_sim",
  "a3_inc_a1_all_x_sim",
  "a3_inc_a2_all_sim"            
)

policy_estimates_text <- c(
  "A1. Tax revenue",
  "A1. With externalities. Tax",
  "A1. All income",
  "A1. With ext. All income",
  "A2. Tax",
  "A2. All income",
  "A3. All income of A1",
  "A3. All income of A1, with ext.",
  "A3. All income of A2. Main Policy Estimate"
  )

3 Main Results

In this document we have presented three different approaches to measuring the welfare effects of deworming interventions. The first approach was based on the original paper that measured the welfare effects of deworming (Baird et al. (2016)) and proposed four different ways to compute this effect (with and without externalities, and from a societal or fiscal perspective). The second approach, based on more recent data, focused only on direct effects, and relies less on predictive effects over the lifecycle. Results for the second approach are also separated between the societal and fiscal perspective.

The third and final approach uses similar methodologies with three main differences. First, we allow the benefits to be scaled to account for differences in the prevalence of worm infections in settings different from the original study. Second, we allow the benefits to be scaled by the length of treatment provided to children within a particular setting. Finally, based on feedback from Evidence Action on the relevant costs from present-day deworming programs, this approach uses more up to date information on treatment costs and it does not take into account the knock-on effects of additional schooling costs as a result of increased school attendance, which are accounted for in approaches #1 and #28.

The table below summarises the three different approaches and the different alternatives within each approach. The main policy estimate is defined as that of Evidence Action (approach 3) using the latest research (Hamory et al. (2020)): approach 3.3 in the table (in bold).

Show all the details

# TODO: Wrap this code chunk in chunk_xxxfunction

#chunk_runvalues <- function(){
# Function dependency is depicted as follows:
# f(g()) =
# f
# └──── g
#
#       ##     ###    ####    #####
# 1     2       3     4       5
#       ##     ###    ####    #####
# NPV_pe_f
# ├──── pv_benef_f
# │      ├──── earnings_app1_f
# │      |      ├──── wage_t_f
# │      |      |      └──── wage_0_f
# |      |      ├──── lambda_eff_f
# │      |      |      └────lambda1_t_f
# │      |      |            └────lambda1_in_f
# |      |      ├──── lambda1_in_f
# |      |      ├──── lambda2_in_f
# │      |      └──── saturation_in_f
# │      ├──── earnings_app2_f
# │      |      └────lambda_eff_f
# │      |           └────lambda1_t_f
# │      └──── interest_f
# └──── pv_costs_f (pv_costs_f)
#        ├──── delta_ed_final_f
#        ├──── interest_f
#        └──── s2_new_f
#        |      └──── costs1_p2_f
#        |             └──── costs1_p1_f
#        ├──── s2_f
#        └──── cost_per_student_f
#       ##     ###    ####    #####


# Approach 1
# NPV_pe_f --> a1_tax_pe
#     └────pv_benef_f --> pv_benef_tax_nx_in
#     |     ├────earnings_app1_f --> earnings_no_ext_in * tax_var1
#     |     |     ├────wage_t_f --> wage_t_in
#     |     |     |     └────wage_0_f --> wage_0_in
#     |     |     ├────lambda1_in_f --> lambda1_in
#     |     |     └────saturation_in_f --> saturation_in
#     |     └────interest_f --> interest_in
#     |
#     |
#     └────pv_costs_f --> costs2_in
#           ├────delta_ed_final_f --> delta_ed_final_in
#           ├────cost_per_student_f --> cost_per_student_in
#           ├────s2_f --> s2_in
#           └────interest_f --> interest_in


# unit test function
unit_test_f <- function(to_test_var, original_var, main_run_var = TRUE){
    if (main_run_var == TRUE) {
        if (length(to_test_var) > 1) {
            fails_test <- ( abs(sd(to_test_var) - original_var) > 0.0001 )
            text_val <- sd(to_test_var)
        } else {
            fails_test <- ( abs(to_test_var - original_var) > 0.0001 )
            text_val <- to_test_var
        }
        if (fails_test) {
            print(paste("Output has changed at",
                        deparse(substitute(to_test_var) ),
                        " to ", text_val) )
        }
      }
}

# TODO: update values of unit test within one_run_f
# one run of all the steps to get one policy estimate
one_run_f <-
  function(main_run_var1 = main_run_so,
           run_sim_var1 = run_sim_so,
           wage_ag_var1 = wage_ag_so,
           wage_ww_var1 = wage_ww_so,
           profits_se_var1 = profits_se_so,
           hours_se_cond_var1 = hours_se_cond_so,
           hours_ag_var1 = hours_ag_so,
           hours_ww_var1 = hours_ww_so,
           hours_se_var1 = hours_se_so,
           ex_rate_var1 = ex_rate_so,
           growth_rate_var1 = growth_rate_so,
           coef_exp_var1 = coef_exp_so[1],
           coef_exp2_var1 = coef_exp_so[2],
           lambda1_var1 = lambda1_in_f(lambda1_var = lambda1_so),
           prevalence_0_var1 = prevalence_0_so,
           prevalence_r_var1 = prevalence_r_so,
           new_prevl_r_var1 = new_prevalence_r_so,
           lambda2_var1 = lambda2_so,                                        
           coverage_var1 = coverage_so,                                        
           q_full_var1 = q_full_so,                                        
           q_zero_var1 = q_zero_so,                                        
           lambda1_new_var1 = lambda1_new_so,                                        
           gov_bonds_var1 = gov_bonds_so,                                        
           inflation_var1 = inflation_so,                                        
           gov_bonds_new_var1 = gov_bonds_new_so,                                                     
           inflation_new_var1 = inflation_new_so,                                       
           df_costs_var1 = costs_data_in,                                        
           staff_time_var1 = staff_time_so,                                        
           delta_ed_var1 = delta_ed_so,                                        
           delta_ed_ext_var1 = delta_ed_ext_so,                                        
           teach_sal_var1 = teach_sal_so,                                        
           teach_ben_var1 = teach_ben_so,                                        
           n_students_var1 = n_students_so,                                        
           teach_sal_new_var1 = teach_sal_new_so,                                            
           teach_ben_new_var1 = teach_ben_new_so,                              
           unit_cost_local_var1 = unit_cost_local_so,     
           unit_cost_local_new_var1 = unit_cost_2017usdppp_so,
           new_costs_var1 = new_costs_so,    
           countries_var1 = country_sel_so,
           years_of_treat_0_var1 = years_of_treat_0_so,
           years_of_treat_t_var1 = years_of_treat_t_so,
           tax_var1 = tax_so,                                        
           periods_var1 = periods_so) {                                        
    ####------------ Inputs for wage_t -----------------------------------------
    wage_0_in <- wage_0_f(
      wage_ag_var = wage_ag_var1,
      wage_ww_var = wage_ww_var1,
      profits_se_var = profits_se_var1,
      hours_se_cond_var = hours_se_cond_var1,
      hours_ag_var = hours_ag_var1,
      hours_ww_var = hours_ww_var1,
      hours_se_var = hours_se_var1,
      ex_rate_var = ex_rate_var1
    )
    unit_test_f(wage_0_in, 0.170124466664436, main_run_var = main_run_var1)
    ###---------- Inputs for earnings_app1_f ---------------------------------------
    wage_t_in <- wage_t_f(
      wage_0_var = wage_0_in,
      growth_rate_var = growth_rate_var1,
      coef_exp1_var = coef_exp_var1,
      coef_exp2_var = coef_exp2_var1
    )
    unit_test_f(wage_t_in, 17.8464946727946, main_run_var = main_run_var1)

    lambda1_in <- lambda1_in_f(lambda1_var = lambda1_var1)
    unit_test_f(lambda1_in[1], 1.745, main_run_var = main_run_var1)

    lambda1_t_temp = lambda_t_f(
        lambda1_var = lambda1_in_f(lambda1_var = lambda1_var1),
        years_of_treat_0_var = years_of_treat_0_var1,
        years_of_treat_t_var = years_of_treat_t_var1  
        )$lambda1_t

    lambda1_prevl_in <- lambda_eff_f(
      lambda1_var = lambda1_t_temp,
      prevalence_0_var = prevalence_0_var1,
      prevalence_r_var = prevalence_r_var1,
      other_prevl_r_var = new_prevl_r_var1,
      country_sel_var = countries_var1
      )$lambda1_eff_in
    unit_test_f(lambda1_prevl_in[1], 0.9508583060968, main_run_var = main_run_var1)

    lambda2_in <- lambda2_in_f(lambda2_var = lambda2_var1)
    unit_test_f(lambda2_in[1], 10.2 , main_run_var = main_run_var1)

    saturation_in <- saturation_in_f(coverage_var = coverage_var1,
                                     q_full_var = q_full_var1,
                                     q_zero_var = q_zero_var1)$saturation_in
    unit_test_f(saturation_in, 0.511, main_run_var = main_run_var1)

    ###------------ Inputs for earnings_app2_f--------------------------------------
    lambda1_new_in <- lambda1_new_var1
    unit_test_f(lambda1_new_in, 79.51465,
              main_run_var = main_run_var1)
    lambda1_t_temp = lambda_t_f(
      lambda1_var = lambda1_new_var1,
      years_of_treat_0_var = years_of_treat_0_var1,
      years_of_treat_t_var = years_of_treat_t_var1  
    )$lambda1_t
    lambda1_prevl_new_in <- lambda_eff_f(lambda1_var = lambda1_t_temp,
                             prevalence_0_var = prevalence_0_var1,
                             prevalence_r_var = prevalence_r_var1,
                             other_prevl_r_var = new_prevl_r_var1,
                            country_sel_var = countries_var1
                            )$lambda1_eff_in
    unit_test_f(lambda1_prevl_new_in[1], 43.3278884864681, main_run_var = main_run_var1)

    ##------------ Inputs for pv_benef_f ---------------------------------------
    # earnings1
    earnings_no_ext_in <- earnings_app1_f(
      wage_var = wage_t_in,
      lambda1_var = lambda1_in[1],
      lambda2_var = 0,
      saturation_var = saturation_in,
      coverage_var = coverage_var1
    )
    earnings_yes_ext_in <- earnings_app1_f(
      wage_var = wage_t_in,
      lambda1_var = lambda1_in[1],
      lambda2_var = lambda2_in[1],
      saturation_var = saturation_in,
      coverage_var = coverage_var1
    )

    # earnings1 with prevalence
    earnings_no_ext_prevl_in <- earnings_app1_f(
      wage_var = wage_t_in,
      lambda1_var = lambda1_prevl_in[1],
      lambda2_var = 0,
      saturation_var = saturation_in,
      coverage_var = coverage_var1
    )
    earnings_yes_ext_prevl_in <- earnings_app1_f(
      wage_var = wage_t_in,
      lambda1_var = lambda1_prevl_in[1],
      lambda2_var = lambda2_in[1],
      saturation_var = saturation_in,
      coverage_var = coverage_var1
    )

    # earnings2
    earnings_no_ext_new_in <- earnings_app2_f(t_var = 0:50,
                                          lambda1k1_var = lambda1_new_in[1])
    # earnings2 with prevalence
    earnings_no_ext_prevl_new_in <- earnings_app2_f(t_var = 0:50,
                                          lambda1k1_var = lambda1_prevl_new_in[1])

    # interest rate NEED TO UPDATE TO EXACT RESULT
    interest_in <- interest_f(gov_bonds_var = gov_bonds_var1,
                              inflation_var = inflation_var1)$interest_in
    unit_test_f(earnings_no_ext_in, 31.1421332040266,
              main_run_var = main_run_var1)
    unit_test_f(earnings_yes_ext_in, 167.667817450905,
              main_run_var = main_run_var1)
    unit_test_f(earnings_no_ext_prevl_in, 16.9694876943406,
              main_run_var = main_run_var1)
    unit_test_f(earnings_yes_ext_prevl_in, 153.495171941219,
              main_run_var = main_run_var1)    
    unit_test_f(interest_in, 0.0985, main_run_var = main_run_var1)

    ##-------------- Inputs for costs2_f----------------------------------------
    # Make explicit non-function inputs:
    delta_ed_final_in <- delta_ed_final_f(include_ext_var = FALSE,
                                          delta_ed_var = delta_ed_var1,
                                          delta_ed_ext_var = delta_ed_ext_var1)
    unit_test_f(delta_ed_final_in, 0.01134819, main_run_var = main_run_var1)

    delta_ed_final_x_in <- delta_ed_final_f(
      include_ext_var = TRUE,
      delta_ed_var = delta_ed_var1,
      delta_ed_ext_var = delta_ed_ext_var1
    )
    unit_test_f(delta_ed_final_x_in,  0.05911765, main_run_var = main_run_var1)

    interest_in <- interest_f(gov_bonds_var = gov_bonds_var1,
                              inflation_var = inflation_var1)$interest_in
    unit_test_f(interest_in, 0.0985, main_run_var = main_run_var1)

    interest_new_in <- interest_f(
      gov_bonds_var = gov_bonds_new_var1,
      inflation_var = inflation_new_var1)$interest_in

    cost_per_student_in <-  cost_per_student_f(teach_sal_var = teach_sal_var1,
                                               teach_ben_var = teach_ben_var1,
                                               n_students_var = n_students_var1)
    unit_test_f(cost_per_student_in,  116.8549, main_run_var = main_run_var1)

    cost_per_student_new_in <- cost_per_student_f(
      teach_sal_var = teach_sal_new_var1,
      teach_ben_var = teach_ben_new_var1,
      n_students_var = n_students_var1
    )

    s2_in <- s2_f(
      unit_cost_local_var = unit_cost_local_var1,
      ex_rate_var = ex_rate_var1,
      years_of_treat_var = years_of_treat_0_var1
    )
    unit_test_f(s2_in, 1.4219, main_run_var = main_run_var1)
    #--------------- Inputs for NPV_pe_f--------------------
    # Make explicit non-function inputs:
    #Benefits:
    #Baird w/tax and no externalities (no ext)
    pv_benef_tax_nx_in <- pv_benef_f(
      earnings_var = earnings_no_ext_in * tax_var1,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_tax_nx_in, 23.6070893378784,
              main_run_var = main_run_var1)
    #Baird w/t and ext
    pv_benef_tax_yx_in <- pv_benef_f(
      earnings_var = earnings_yes_ext_in * tax_var1,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_tax_yx_in, 127.0994867217, main_run_var = main_run_var1)
    #Baird all and no
    pv_benef_all_nx_in <- pv_benef_f(
      earnings_var = earnings_no_ext_in,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_all_nx_in, 142.42587835824, main_run_var = main_run_var1)
    #Baird all and no ext + prevalence
    pv_benef_all_nx_prevl_in <- pv_benef_f(
      earnings_var = earnings_no_ext_prevl_in,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_all_nx_prevl_in, 77.608498246463, main_run_var = main_run_var1)
    #Baird all and ext
    pv_benef_all_yx_in <- pv_benef_f(
      earnings_var = earnings_yes_ext_in,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_all_yx_in, 766.814399527604,
              main_run_var = main_run_var1)
    #Baird all and ext
    pv_benef_all_yx_prevl_in <- pv_benef_f(
      earnings_var = earnings_yes_ext_prevl_in,
      interest_r_var = interest_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_all_yx_prevl_in, 701.997019415827,
              main_run_var = main_run_var1)

    #KLPS4 w/t and no ext
    pv_benef_tax_new_in <- pv_benef_f(
      earnings_var = earnings_no_ext_new_in * tax_var1,
      interest_r_var = interest_new_in,
      periods_var = periods_var1
    )
    unit_test_f(pv_benef_tax_new_in, 88.1820199569814,
              main_run_var = main_run_var1)

    # KLPS4 all and no ext
    pv_benef_all_new_in <- pv_benef_f(earnings_var = earnings_no_ext_new_in,
                                   interest_r_var = interest_new_in,
                                   periods_var = periods_var1)
    unit_test_f(pv_benef_all_new_in, 532.018219951622, main_run_var = main_run_var1)
    # KLPS4 all and no ext + prevalence
    pv_benef_all_prevl_new_in <- pv_benef_f(earnings_var = earnings_no_ext_prevl_new_in,
                                   interest_r_var = interest_new_in,
                                   periods_var = periods_var1)
    unit_test_f(pv_benef_all_prevl_new_in, 289.899107986178, main_run_var = main_run_var1)
    #Costs asd
    # costs1: EA costs no externalities
    cost1_in <- costs1_p2_f(country_total_var = df_costs_var1$total,
                            country_cost_var = df_costs_var1$costs_by_country,
                            staff_time_var = staff_time_var1,
                            country_name_var = df_costs_var1$Country,
                            select_var = countries_var1,
                            other_costs_var = new_costs_var1)
    unit_test_f(cost1_in,  0.08480686,
              main_run_var = main_run_var1)
    # s2_ea_in <-- cost1_in (costs1_p2_f) <-- cost_data (costs1_p1_f())
    s2_ea_in <- s2_new_f(interest_var = interest_new_in,
                      unit_cost_local_var = cost1_in,
                      ex_rate_var = 1,
                      year_of_treat_var = years_of_treat_t_var1)
    unit_test_f(s2_ea_in,  0.19634422968991, main_run_var = main_run_var1)
    costs2_ea_in <- pv_costs_f(
      periods_var = periods_var1,
      delta_ed_var = delta_ed_final_in,
      interest_r_var = interest_new_in,
      cost_of_schooling_var = 0,
      s1_var = 0,
      q1_var = 0,
      s2_var = s2_ea_in,
      q2_var = q_full_var1
    )
    unit_test_f(costs2_ea_in,  0.147258172267433, main_run_var = main_run_var1)
    # costs2: Baird no externalities
    costs2_in <- pv_costs_f(
      periods_var = periods_var1,
      delta_ed_var = delta_ed_final_in,
      interest_r_var = interest_in,
      cost_of_schooling_var = cost_per_student_in,
      s1_var = 0,
      q1_var = q_zero_var1,
      s2_var = s2_in,
      q2_var = q_full_var1
    )
    unit_test_f(costs2_in, 11.776188118988, main_run_var = main_run_var1)
earnings_no_ext_in
    # Baird yes externalities
    costs2_x_in <- pv_costs_f(
      periods_var = periods_var1,
      delta_ed_var = delta_ed_final_x_in,
      interest_r_var = interest_in,
      cost_of_schooling_var = cost_per_student_in,
      s1_var = 0,
      q1_var = q_zero_var1,
      s2_var = s2_in,
      q2_var = q_full_var1
    )
    unit_test_f(costs2_x_in,  25.1962130559894, main_run_var = main_run_var1)

    s2_new_in <- s2_new_f(interest_var = interest_new_in,
                          unit_cost_local_var = unit_cost_local_new_var1,
                          ex_rate_var = 1,
                          year_of_treat_var = years_of_treat_t_var1)
    # costs2: KLPS4
    costs_a2_in <- pv_costs_f(
      periods_var = periods_var1,
      delta_ed_var = delta_ed_final_in,
      interest_r_var = interest_new_in,
      cost_of_schooling_var = cost_per_student_new_in,
      s1_var = 0,
      q1_var = q_zero_var1,
      s2_var = s2_new_in,
      q2_var = q_full_var1
    )
    unit_test_f(costs_a2_in, 32.2977546110344, main_run_var = main_run_var1)
    return( list(
      "wage_0_in" = wage_0_in,
      "wage_t_in" = wage_t_in,
      "lambda1_in" = lambda1_in,
      "lambda1_prevl_in" = lambda1_prevl_in,
      "lambda2_in" = lambda2_in,
      "saturation_in" = saturation_in,
      "lambda1_new_in" = lambda1_new_in,
      "lambda1_prevl_new_in" = lambda1_prevl_new_in,
      "earnings_no_ext_in" = earnings_no_ext_in,
      "earnings_no_ext_prevl_in" = earnings_no_ext_prevl_in,
      "earnings_yes_ext_in" = earnings_yes_ext_in,
      "earnings_yes_ext_prevl_in" = earnings_yes_ext_prevl_in,
      "earnings_no_ext_new_in" = earnings_no_ext_new_in,
      "earnings_no_ext_prevl_new_in" = earnings_no_ext_prevl_new_in,
      "interest_in" = interest_in,
      "costs1_country_in" = costs_data_in,
      "delta_ed_final_in" = delta_ed_final_in,
      "delta_ed_final_x_in" = delta_ed_final_x_in,
      "cost_per_student_in" = cost_per_student_in,
      "s2_in" = s2_in,
      "pv_benef_tax_nx_in" = pv_benef_tax_nx_in,
      "pv_benef_tax_yx_in" = pv_benef_tax_yx_in,
      "pv_benef_all_nx_in" = pv_benef_all_nx_in,
      "pv_benef_all_nx_prevl_in" = pv_benef_all_nx_prevl_in,
      "pv_benef_all_yx_in" =  pv_benef_all_yx_in,
      "pv_benef_all_yx_prevl_in" = pv_benef_all_yx_prevl_in,
      "pv_benef_tax_new_in" = pv_benef_tax_new_in,
      "pv_benef_all_new_in" = pv_benef_all_new_in,
      "pv_benef_all_prevl_new_in" = pv_benef_all_prevl_new_in,
      "costs2_ea_in" = costs2_ea_in,
      "costs2_in" = costs2_in,
      "costs2_x_in" = costs2_x_in,
      "costs_a2_in" = costs_a2_in,
      "cost1_in" = cost1_in
    ) )
  }

invisible( list2env(one_run_f(),.GlobalEnv) )
## [1] "Output has changed at lambda1_new_in  to  79.51"
## [1] "Output has changed at lambda1_prevl_new_in[1]  to  43.3253546806668"
## [1] "Output has changed at pv_benef_tax_new_in  to  88.1768630910102"
## [1] "Output has changed at pv_benef_all_new_in  to  531.98710763807"
## [1] "Output has changed at pv_benef_all_prevl_new_in  to  289.882154747346"
## [1] "Output has changed at klps4_1_pe  to  55.8791084799758"
## [1] "Output has changed at klps4_2_pe  to  499.689353027036"
## [1] "Output has changed at ea3_pe  to  289.734896575078"
Approach Benefits Costs NPV
1.1 Baird et al. (2016) w/tax and no externalities (no ext) Treatment, Education 11.8
1.2 Baird et al. (2016) w/t and ext Treatment, Education (w/ext) 101.9
1.3 Baird et al. (2016) all and no ext Treatment, Education 130.6
1.4 Baird et al. (2016) all and ext Treatment, Education (w/ext) 741.6
2.1 Hamory et al. (2020) w/t and no ext Treatment, Education 55.9
2.2 Hamory et al. (2020) all and no ext Treatment, Education 499.7
3.1 1.3 + prevalence + length of treatment Treatment (EA) 77.5
3.2 1.4 + prevalence + length Treatment (EA) 701.8
3.3 2.2 + prevalence + length Treatment (EA) 289.7


References

Baird, Sarah, Joan Hamory Hicks, Michael Kremer, and Edward Miguel. 2016. “Worms at Work: Long-Run Impacts of a Child Health Investment.” The Quarterly Journal of Economics 131 (4). MIT Press: 1637–80. http://emiguel.econ.berkeley.edu/research/worms-at-work-long-run-impacts-of-a-child-health-investment.

Croke, Kevin. 2014. “The Long Run Effects of Early Childhood Deworming on Literacy and Numeracy: Evidence from Uganda.” Unpublished Manuscript.

GiveWell. 2019. “2019 Givewell Cost-Effectiveness Analysis — Version 3.” https://tinyurl.com/givewell-cea.

Hamory, Joan, Edward Miguel, Michael Walker, Michael Kremer, and Sarah Baird. 2020. “Twenty Year Economic Impacts of Deworming.” Working Paper. https://www.nber.org/papers/w27611.

Hoces de la Guardia, Fernando, Sean Grant, and Edward Miguel. 2020. “A Framework for Open Policy Analysis.” Science and Public Policy. https://osf.io/preprints/metaarxiv/jnyqh/.

Kremer, Michael, and Edward Miguel. 2007. “The Illusion of Sustainability.” The Quarterly Journal of Economics 122 (3). MIT Press: 1007–65. https://www.povertyactionlab.org/evaluation/illusion-sustainability-comparing-free-provision-deworming-drugs-and-other-sustainable.

Miguel, Edward, and Michael Kremer. 2004. “Worms: Identifying Impacts on Education and Health in the Presence of Treatment Externalities.” Econometrica 72 (1). Wiley Online Library: 159–217. http://emiguel.econ.berkeley.edu/research/worms-identifying-impacts-on-education-and-health-in-the-presence-of-treatment-externalities.

Nyanchama, Venic. 2018. “New Tsc Salaries and Grading System for Teachers 2020.” TUKO. https://www.tuko.co.ke/281149-new-tsc-salaries-grading-system-teachers-2020.html.

Oduor, Augustine. 2017. “Windfall for Teachers as Tsc Releases New Salaries.” The Standard. https://standardmedia.co.ke/education/article/2001249581/windfall-for-teachers-as-tsc-releases-new-salaries.

Suri, Tavneet. 2011. “Selection and Comparative Advantage in Technology Adoption.” Econometrica 79 (1). Wiley Online Library: 159–209.

Xie, Yihui. 2015. Dynamic Documents with R and Knitr. Vol. 29. CRC Press.


  1. EAs version of the analysis follows a similar structure than the cost effectiveness analysis performed by the charity evaluator GiveWell (GiveWell 2019).

  2. Approaches 1 and 2 also present results in the format of internal rates of return (IRR). Following the principle of open output, we restrict the presentation of results to just one format. NPV was chosen over IRR in consultation with Evidence Action to clearly communicate the scale of the welfare effects. [CONFIRM WITH GRACE]

  3. Last paragraph of page 9(1645) of Baird et al. (2016)

  4. Last paragraph of page 9(1645) of Baird et al. (2016)

  5. In another specification the authors assume that effects persist through the rest of an individual’s working life. Here we select the specification that is most highlighted in the paper (most conservative specification). The authors also analyse the welfare effects over consumption, but given that they do not aggregate both outcomes in the welfare effect we only choose one and focus on earning for comparability with the approach 1).

  6. Based on the upper tier of monthly teacher salaries reported by two Kenyan news sources: Nyanchama (2018) and Oduor (2017). Since compensation for teachers in rural villages where the treatment was administered is below the national average, we are overestimating the costs for a conservative analysis. The average number of students per teacher is 45.

  7. In some settings Evidence Action provides two rounds of treatment per year. In those cases, the unit costs discussed here represent the sum of both rounds [CONFIRM WITH GRACE]

  8. Evidence Action suggests that the added costs on education will not be considered as costs from a policy makers perspective. Those costs corresponds to another intervention on itself (education) and incorporating its costs would also require to incorporate its benefits. [CONFIRM WITH GRACE]

LS0tCnRpdGxlOiAiPGNlbnRlcj48ZGl2IGNsYXNzPSAnbXl0aXRsZSc+T3BlbiBQb2xpY3kgQW5hbHlzaXMgZm9yIERld29ybWluZzwvZGl2PjwvY2VudGVyPiIKZGF0ZTogIjxjZW50ZXI+PGRpdiBjbGFzcz0nbXlzdWJ0aXRsZSc+YHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWA8L2Rpdj48L2NlbnRlcj4iCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCm91dHB1dDoKICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6CiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY3NzOiBzdHlsZS5jc3MKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbAogICAga2VlcF9tZDogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgc21vb3RoX3Njcm9sbDogbm8KICAgIHRoZW1lOiBjZXJ1bGVhbgogICAgdG9jOiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IG5vCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDogeWVzCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzMnCiAgd29yZF9kb2N1bWVudDogbnVsbApsaW5rLWNpdGF0aW9uczogeWVzCnBkZl9kb2N1bWVudDoKICBleHRyYV9kZXBlbmRlbmNpZXM6IHhjb2xvcgogIGZpZ19jYXB0aW9uOiBubwpiaWJsaW9ncmFwaHk6IGJpYmxpb2dyYXBoeS5iaWIKLS0tClxkZWZcYmx1ZXtcY29sb3J7Ymx1ZX19ClxkZWZccmVke1xjb2xvcntyZWR9fQoKCgoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFLCBwdXJsPVRSVUV9Cmh0bWxfZm9ybWF0IDwtIFRSVUUKIyBMb2FkaW5nIHJlcXVpcmVkIGxpYnJhcmllcwojIGJlZm9yZSBkZXBsb3lpbmcgaW4gc2hpbnlhcHBzLmlvLCB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgojICJwbG90bHkiLCAiYm9va2Rvd24iLCAicm9vdFNvbHZlIgppZiAoVFJVRSkgewogIGxpc3Qub2YucGFja2FnZXMgPC0gYygidGlkeXZlcnNlIiwgImhlcmUiLCAia2FibGVFeHRyYSIsICJyZWFkeGwiLCJwbG90bHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiYm9va2Rvd24iLCAicm9vdFNvbHZlIiwic2hpbnlCUyIsICJzaGlueXRoZW1lcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJnZ3Bsb3QyIikKCiAgIyBzYXBwbHkobGlzdC5vZi5wYWNrYWdlcywgZnVuY3Rpb24oeCkgcGFjbWFuOjpwX2xvYWQoZ2V0KHgpKSkKCiAgbmV3LnBhY2thZ2VzIDwtIGxpc3Qub2YucGFja2FnZXNbCiAgICAhKCBsaXN0Lm9mLnBhY2thZ2VzICVpbiUgaW5zdGFsbGVkLnBhY2thZ2VzKClbLCJQYWNrYWdlIl0gKQogICAgXQogIGlmKGxlbmd0aChuZXcucGFja2FnZXMpKSBpbnN0YWxsLnBhY2thZ2VzKG5ldy5wYWNrYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQoKICBsYXBwbHkobGlzdC5vZi5wYWNrYWdlcywgbGlicmFyeSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQp9Cgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IGhlcmUoKSkKCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCnByaW50X2NvZGUgPC0gaHRtbF9mb3JtYXQKc2hvd19zdW1tYXJ5X3RhYmxlcyA8LSBGQUxTRQoKZXF1YXRpb25JbmRleCA8LSAwCnN1bV90YWJsZV9pbmRleCA8LSAwCgpzZXR3ZChoZXJlKCkpCgpjb2xvcml6ZV9mID0gZnVuY3Rpb24oeCwgY29sb3IpewogIGlmIChrbml0cjo6aXNfbGF0ZXhfb3V0cHV0KCkpIHsKICAgIHNwcmludGYoIlxcdGV4dGNvbG9yeyVzfSglcykiLCBjb2xvciwgeCkKICB9IGVsc2UgaWYgKGtuaXRyOjppc19odG1sX291dHB1dCgpKSB7CiAgICBzcHJpbnRmKCI8Zm9udCBjb2xvcj0nJXMnPiVzPC9mb250PiIsIGNvbG9yLCB4KQogIH0gZWxzZSB4Cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KHdhcm5pbmcgPSBGQUxTRSkKa25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD04KQpvcHRpb25zKGtuaXRyLmR1cGxpY2F0ZS5sYWJlbCA9ICJhbGxvdyIpICMgd29ya2Fyb3VuZCBmb3IgcHVybCBlcnJvcgprbml0cjo6cHVybCgiY29kZS8wNV9maW5hbF9vcGEuUm1kIiwgImNvZGUvc2hpbnlfYXBwL2FsbF9hbmFseXNpcy5SIikKYGBgCgoKYGBge3Igbm90ZXMsIHB1cmw9RkFMU0UsIGVjaG89cHJpbnRfY29kZX0KIyMjIyMjIyMjIyMjIyMjIwojIyMjIyAgTm90ZXM6CiMjIyMjIyMjIyMjIyMjIyMKIyBUeXBlcyBvZiBvYmplY3RzOgojIyMgU291cmNlIC0tLS0tLS0+ICBJbnB1dCAmIE1vZGVsIC0tLS0tLS0+ICBQb2xpY3kgRXN0aW1hdGVzIChvdXRwdXQpCiMjIyAgKF9zbykgICAgICAgICAgIChfaW4pICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9wZSkKIyMjIHZhbHVlcyAgICAgICAgICAgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMKIyMjICAgICAgICAgICAgICAgICAgJiB2YWx1ZXMgICAgICAgICAgCiMgRXhhbXBsZXM6ICAgICAgICAgICAgICAgICAgIAojIC0gY2FsbF9zb19mICAgICAgIC0gdGF4X2VsYXNfaW5fZiAgICAgICAgIC0gdGVuX3llYXJfcmV2ZW51ZV9wZQojIC0gcG9saWN5X3NvICAgICAgIC0gZXN0X2JpbGxfaW5fZiAgICAgICAgIC0gdGVuX3llYXJfdG9wX3RheF9wZQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gdG90YWxfcmV2X3BlCiMjIyBhcmd1bWVudHMgaW4gZnVuY3Rpb25zIHNob3VsZCB1c2VkICJfdmFyIiBhbmQgZnVuY3Rpb25zIHNob3VsZCB1c2VkICJfZiIKCiMgRWFjaCBhbmFseXRpYyBjb2RlIGNodW5rIHdpbGwgYmVnaW4gYnkgbGlzdGluZyBhbGwgdGhlIGlucHV0cyBpdCBuZWVkcywgYW5kCiMgdGhlIG91dHB1dHMgaXQgcHJvZHVjZXMuCiMgLSBpbnB1dHM6IGxpc3QKIyAtIG91dHB1dHM6IGxpc3QKIyMjIyBUaGUga2V5IGVzc2VudGlhbCBhbmFseXRpYyBzdGVwcyBhcmUgd3JhcHRlZCBpbiBhIGZ1bmN0aW9uICAgCiNjaHVua19uYW1lX29mX2NodW5rIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAojCiMgaGVyZSBnb2VzIHRoZSBlc3NlbnRpYWwgYW5hbHl0aWMgY29udGVudAojCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAojICAgIHJldHVybiggKSAgICAgICAgICAgICAgICAgICAgICAgICAjIEEgbGlzdCB3aXRoIGFsbCB0aGUgb2JqZWN0cwojfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlZCBpbnNpZGUgdGhlIGZ1bmN0aW9uCiMgVGhlIGZvbGxvd2luZyBsaW5lIGV4ZWN1dGVzIHRoZSBjb2RlIGNodW5rIGFuZCBkZXBvc2l0cyBpdHMgcmVzdWx0cwojIGludG8gdGhlIGN1cnJlbnQgUiBlbnZpb3JubWVudDoKI2ludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbmFtZV9vZl9jaHVuaygpLC5HbG9iYWxFbnYpICkKIwojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKIyBBbnl0aGluZyB1bmRlciB0aGlzIGNvbW1lbnQgaXMgdG8gY3JlYXRlIG9iamVjdHMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgYm9keSBvZgojIHRleHQuIE5vdCB0byBiZSB1c2VkIGluIHRoZSBmaW5hbCByZXN1bHRzIChjb3VsZCBiZSBkZWxldGVkKS4gRWFjaCBvZiB0aGVzZQojIG9iamVjdCBzaG91bGQgZW5kIHdpdGggdGhlIHN1ZmZpeCBfdGVtcAojCiMgVXNlIGRpYWdyYW1zIHRvIHJlcHJlc2VudCBjb21wbGV4IG5lc3Rpbmcgb2YgZnVuY3Rpb25zLiBFeGFtcGxlOgojICMgcHZfY29zdHNfZgojICDilJzilIDilIDilIDilIAgZGVsdGFfZWRfZmluYWxfZgojICDilJzilIDilIDilIDilIAgaW50ZXJlc3RfZgojICDilJTilIDilIDilIDilIAgY29zdF9wZXJfc3R1ZGVudF9mCiMgIHwgICAgICDilJTilIDilIDilIDilIAgeAojICDilJzilIDilIDilIDilIAgczJfZgojICDilJTilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCmBgYAoKCmBgYHtyIHNvdXJjZXMsIGV2YWwgPSBUUlVFLCBlY2hvPXByaW50X2NvZGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgLSBpbnB1dHM6IG5vbmUKIyAtIG91dHB1dHM6IGFsbCBzb3VyY2VzIGNvbWluZyBmcm9tIGRhdGEsIHJlc2VhcmNoIGFuZCBndWVzc3dvcmsKY2h1bmtfc291cmNlcyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgICMjIyMjIyMjIyMjIyMKICAgICMjIyMjIFNldHVwCiAgICAjIyMjIyMjIyMjIyMjICAKICAgIG5zaW1zX3NvIDwtIDFlNAogICAgcmVzY2FsZV9zbyA8LSBGQUxTRQogICAgcG9saWN5X2VzdGltYXRlX3NvIDwtICJhM19pbmNfYTJfYWxsX3NpbSIKICAgIHJ1bl9zaW1fc28gPC0gRkFMU0UKICAgIG1haW5fcnVuX3NvIDwtIFRSVUUKICAgIHBlcmlvZHNfc28gPC0gNTAgICAgICAgICAgICAgICAjVG90YWwgbnVtYmVyIG9mIHBlcmlvZHMgdG8gZm9yZWNhc3Qgd2FnZXMKICAgIGNvc3RzX3RlbXBfc28gPC0gMQogICAgbWFpbl9wZV9zbyA8LSAyODkuOAoKCiAgICAjIyMjIyMjIyMjIyMjCiAgICAjIyMjIyBEYXRhICAKICAgICMjIyMjIyMjIyMjIyMKICAgICMgQVRURU5USU9OIQogICAgIyBjb3N0czJfZWFfaW4KICAgIGV4X3JhdGVfc28gPC0gNzQgICAgICAgICAgICAgICAjRXhjaGFuZ2UgUmF0ZSAtIENlbnRyYWwgQmFuayBvZiBLZW55YSA3NCAsIDg1CiAgICBleF9yYXRlXzIwMThfc28gICAgICAgIDwtIDEwMS4zMCAgIyBFeGNoYW5nZSByYXRlIChLRVMgcGVyIGludGVybmF0aW9uYWwgJCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAtIGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9QQS5OVVMuRkNSRj9sb2NhdGlvbnM9S0UKICAgIGV4X3JhdGVfMjAxOF9wcHBfc28gPC0gNTAuMDU4ICAgIyBLTFBTNF9FK19nbG9iYWxzLmRvIChvcmlnaW5hbGx5IGZyb20gdGhlIFdvcmxkIEJhbmspCiAgICBleF9yYXRlXzIwMTdfcHBwX3NvIDwtIDQ5Ljc3MyAgICMgS0xQUzRfRStfZ2xvYmFscy5kbyAob3JpZ2luYWxseSBmcm9tIHRoZSBXb3JsZCBCYW5rKQogICAgZ3Jvd3RoX3JhdGVfc28gPC0gMS41Mi8xMDAgICAgICNQZXItY2FwaXRhIEdEUCBncm93dGgsIDIwMDItMjAxMSAoYWNjZXNzZWQgMS8yOS8xMykgLQlXb3JsZCBCYW5rIC0gc2VlIG5vdGVzCiAgICBnb3ZfYm9uZHNfc28gPC0gCTAuMTE4NQkgICAgICNLZW55YW4gaW50ZXJlc3Qgb24gc292ZXJlaWduIGRlYnQgLSBDZW50cmFsIEJhbmsgb2YgS2VueWEKICAgIGdvdl9ib25kc19uZXdfc28gPC0gMC4wOQogICAgaW5mbGF0aW9uX3NvIDwtICAwLjAyICAgICAgICAgICNLZW55YW4gaW5mbGF0aW9uIHJhdGUgLSBXb3JsZCBCYW5rIERldmVsb3BtZW50IEluZGljYXRvcnMKICAgIGluZmxhdGlvbl9uZXdfc28gPC0gMC4wNAogICAgdGF4X3NvIDwtIDAuMTY1NzUgICAgICAgICAgICAgICNBREQgSU5GTyEKCiAgICAjIGNvc3RzIGRhdGEKICAgIGRmX2Nvc3RzX3NvIDwtIHJlYWRfZXhjZWwoInJhd2RhdGEvZGF0YS9EdFcgQ29zdCBwZXIgQ2hpbGQgRGF0YS54bHN4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiRHRXIENvc3RzIikKICAgICMgY3Jvc3N3YWxrIGRhdGEgb24gcmVnaW9uIGFuZCBjb3VudHJ5CiAgICBkZl9jb3N0c19jd19zbyA8LSByZWFkX2V4Y2VsKCJyYXdkYXRhL2RhdGEvRHRXIENvc3QgcGVyIENoaWxkIERhdGEueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gInN0YXRlX2NvdW50cnkiKQogICAgIyBkYXRhIG9uIG51bWJlciBvZiB0cmVhdGVkIGNoaWxkcmVuCiAgICBkZl9jb3VudHNfc28gPC0gcmVhZF9leGNlbCgicmF3ZGF0YS9kYXRhL0R0VyBDb3N0IHBlciBDaGlsZCBEYXRhLnhsc3giLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICJEdFcgVHJlYXRtZW50ICNzIikKICAgICMgUHJldmFsZW5jZSBkYXRhOgogICAgIyBvcmlnaW5hbCBzdHVkeQogICAgIyBBbnkgaW5mZWN0aW9uIG9uIG9yaWdpbmFsIHN0dWR5CiAgICAjcHJldmFsZW5jZV8wX3NvIDwtIGMoImhvb2t3b3JtIiA9IDAuNzcsICJyb3VuZHdvcm0iID0gMC40MiwgIndoaXB3b3JtIiA9IDAuNTUsCiAgICAjICJTY2hpc3RvIG1hbnNvbmkiID0gMC4yMikgIyBmcm9tIERyYWZ0IENvc3QtRWZmZWN0aXZlbmVzcyBNb2RlbC54bHN4IEFERCBPUklHSU5BTCBTT1VSQ0UKICAgIGRmX3ByZXZhbGVuY2Vfc28gPC0gcmVhZF9leGNlbCgiZGF0YS9wcmV2YWxlbmNlX2RhdGEueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIlNoZWV0MSIpCiAgICAjIHByZXZhbGVuY2VfMF9zbyA8LSBjKCJob29rd29ybSIgPSAwLjc3LCAicm91bmR3b3JtIiA9IDAuNDIsICJ3aGlwd29ybSIgPTAuNTUsICJTY2hpc3RvIG1hbnNvbmkiID0gMC4yMikgIyBmcm9tIERyYWZ0IENvc3QtRWZmZWN0aXZlbmVzcyBNb2RlbC54bHN4IEFERCBPUklHSU5BTCBTT1VSQ0UKICAgIG5ld19jb3N0c19zbyA8LSBOVUxMCiAgICBjb3VudHJ5X3NlbF9zbyA8LSBsaXN0KCJpbmRpYSIsICJrZW55YSIsICJuaWdlcmlhIiwgInZpZXRuYW0iKQogICAgY291bnRyeV9zZWxfcG9wX3NvIDwtIGMoCiAgICAgICJpbmRpYSIgPSAxLjM2NjQxNzc1MCAqIDFlOSwKICAgICAgImtlbnlhIiA9IDUuMjU3Mzk3ICogMWU3LAogICAgICAibmlnZXJpYSIgPSAyLjAwOTYzNjAgKiAxZTgsCiAgICAgICJ2aWV0bmFtIiA9IDkuNjQ2MjExICogMWU3CiAgICApCiAgICAjaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NQLlBPUC5UT1RMCiAgICAjIG9wdGlvbnM6ICJhMV90YXhfc2ltIiwiYTFfeF90YXhfc2ltIiwiYTFfYWxsX3NpbSIsICJhMV94X2FsbF9zaW0iLCAiYTJfdGF4X3NpbSIsCiAgICAjICJhMl9hbGxfc2ltIiwgImEzX2luY19hMV9hbGxfc2ltIiwgImEzX2luY19hMV9hbGxfeF9zaW0iLCAiYTNfaW5jX2EyX2FsbF9zaW0iCgoKCgogICAgIyMjIyMjIyMjIyMjIwogICAgIyMjIyMgUmVzZWFyY2gKICAgICMjIyMjIyMjIyMjIyMKICAgIGRmX3Jlc2VhcmNoX3NvIDwtIHJlYWRfY3N2KCJyYXdkYXRhL3Jlc2VhcmNoL3Jlc2VhcmNoX3BhcmFtcy5jc3YiKSAgIAogICAgbGFtYmRhMV9zbyA8LSBjKDMuNDksIDApICAgICAgICAgICAgI0hycyBwZXIgd2VlayBpbmNyZWFzZSBmb3IgbWVuIGFuZCB3b21lbiwgdGFibGUgMywgcm93IDEsIGNvbHMgMiAmIDMKICAgIGxhbWJkYTFfc2Rfc28gPC0gYygxLjQyLCAxLjM2KSAgICAgICN0YWJsZSAzLCByb3cgMiwgY29scyAyICYgMwogICAgbGFtYmRhMV9uZXdfc28gPC0gYyg3OS41MSkgICAjIGF2ZyB0cmVhdG1lbnQgZWZmZWN0IGZyb20ga2xwczItNCAoYWxyZWFkeSBhZGp1c3RlZCBmb3IgcHBwIGFuZCBpbmZsYXRpb24pIC0gd0B3CiAgICBsYW1iZGExX25ld19zZF9zbyA8LSBjKDc2KSAgIyBBREQgU09VUkNFCiAgICBsYW1iZGEyX3NvIDwtIDEwLjIgICAgICAgICAgICAgICAgICAjRXh0ZXJuYWxpdHkgZWZmZWN0IChwcm9wb3J0aW9uYWwpIC0gVGFibGUgMywgcm93IDEgY29sIDQKICAgIGxhbWJkYTJfc2Rfc28gPC0gNy44ICAgICAgICAgICAgICAgICMgVGFibGUgMywgcm93IDIgY29sIDQKICAgICNUaGlzIGlzIGFyZSB0aGUgcGFyYW1ldGVycyBsYWJlbGVkIGV0YSBpbiB0aGUgZG9jCiAgICBwcmV2YWxlbmNlXzBfc28gPC0gMC45MiAjIDAuOTIgZG9pOiBodHRwczovL2RvaS5vcmcvMTAuMTExMS9qLjE0NjgtMDI2Mi4yMDA0LjAwNDgxLnggIGxvY2F0aW9uOiB0YWJsZSAyLCByb3cgNiwgY29sdW1uIDEKICAgIHdhZ2VfYWdfc28gPC0gCTExLjg0CSAgICAgICAgICNNZWFuIGhvdXJseSB3YWdlIHJhdGUgKEtTSCkgLSBTdXJpIDIwMTEKICAgIHdhZ2Vfd3dfc28gPC0gCTE0LjU4NTA5MzMgICAgICNDb250cm9sIGdyb3VwIGhvdXJseSB3YWdlLCB3dyAoY29uZCA+PTEwIGhycyBwZXIgd2VlaykgLSBUYWJsZSA0LCBQYW5lbCBCIChTb3VyY2UgZGF0YSB0b29rIHRoZSBsb2csIGhlcmUgd2UgcmVjb3ZlciBpdCkKICAgIHByb2ZpdHNfc2Vfc28gPC0gMTc2NiAgICAgICAgICAjQ29udHJvbCBncm91cCBtb250aGx5IHNlbGYtZW1wbG95ZWQgcHJvZml0cyAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI1RhYmxlIDQsIFBhbmVsIEMsIENvbHVtbiA1LCBSb3cgMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNGSVg6IE1PU1QgUkVGRVJFTkNFUyBGUk9NIFRBQkxFIDQgQVJFIFRBQkxFIDMKICAgIGhvdXJzX3NlX2NvbmRfc28gPC0gMzguMSAgICAgICAjQ29udHJvbCBncm91cCB3ZWVrbHkgc2VsZi1lbXBsb3llZCBob3VycywgY29uZGl0aW9uYWwgb24gaHJzID4wIC0gVGFibGUgRDEzLCBQYW5lbCBECiAgICBob3Vyc19hZ19zbyA8LSA4LjMgICAgICAgICAgICAgI0NvbnRyb2wgZ3JvdXAgaHJzIHBlciB3ZWVrLCBhZ3JpY3VsdHVyZSAtIFRhYmxlIDMsIFBhbmVsIEIKICAgIGhvdXJzX3d3X3NvIDwtIDYuOSAgICAgICAgICAgICAjQ29udHJvbCBncm91cCBocnMgcGVyIHdlZWssIHdvcmtpbmcgZm9yIHdhZ2VzIC0gVGFibGUgMywgUGFuZWwgQgogICAgaG91cnNfc2Vfc28gPC0gMy4zICAgICAgICAgICAgICNDb250cm9sIGdyb3VwIGhycyBwZXIgd2Vlaywgc2VsZi1lbXBsb3ltZW50IC0gVGFibGUgMywgUGFuZWwgQgogICAgY29lZl9leHBfc28gPC0gYygwLjEwMTk1NzUsIC0wLjAwMTA0MTMpICAgICAgICAgI1llYXJzIG9mIGV4cGVyaWVuY2UgY29lZmZpY2llbnRzICgxLWxpbmVhciwgMi1jdWFkcmF0aWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjLSBzZWUgbm90ZXMoMC4xMDE5NTc1LCAtMC4wMDEwNDEzKSwgKDAsMCkKICAgIGNvdmVyYWdlX3NvICA8LSAwLjY4MTMzMzMzMyAgICAjIChSKSBGcmFjdGlvbiBvZiB0cmVhdGVkIHByaW1hcnkgc2Nob29sIHN0dWRlbnRzIHdpdGhpbiA2IGttIC0gZnJvbSBXQFcgLSBzZWUgbm90ZQogICAgcV9mdWxsX3NvIDwtIDAuNzUgICAgICAgICAgICAgICNUYWtlIHVwIHJhdGVzIHdpdGggZnVsbCBzdWJzaWR5LiBGcm9tIE1pZ3VlbCBhbmQgS3JlbW1lciAoMjAwNykKICAgIHFfemVyb19zbyA8LSAwICAgICAgICAgICAgICAgICAjVGFrZSB1cCByYXRlcyB3aXRoIHplcm8gc3Vic2lkeS4gRnJvbSBNaWd1ZWwgYW5kIEtyZW1tZXIgKDIwMDcpCiAgICBkZWx0YV9lZF9zbyA8LSBjKC0wLjAwMTc2MzUwOTQ5MDc5NDUxLCAwLjAwNjk2MDUyMjUwMjYzOTk3LCAwLjAyNTg1NzAzMDY3NjMxODMsICAgICAjIChEZWx0YSBFKSBBZGRpdGlvbmFsIGRpcmVjdCBzZWNvbmRhcnkgc2Nob29saW5nIGluY3JlYXNlIChmcm9tIEpvYW4pCiAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIzOTk2MzY2NTU1NTQ2NiwgMC4wMjczMDE0MDYzMDYwNzQsIDAuMDIzNDEyNTQ1NDU5NDE3MywKICAgICAgICAgICAgICAgICAgICAgICAwLjAyNzkyNzg4Nzk0MzkxOTksIDAuMDA2NDcwNDQ0NDk0NDYzMDMsIDAuMDA4MzU3Mzk0Mzc3OTA2MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgZGVsdGFfZWRfc28gPC0gY2JpbmQoZGVsdGFfZWRfc28sIDE5OTk6MjAwNykKICAgIGRlbHRhX2VkX3Bhcl9zbyA8LSAxCiAgICBkZWx0YV9lZF9leHRfcGFyX3NvIDwtIDEKICAgIGRlbHRhX2VkX2V4dF9zbyA8LSBjKC0wLjAxMTAxMjY5MDgwMjEwNDgsCTAuMDE0MDQ0ODU0Njc0MTAwOCwJLTAuMDAzNDYzNjI5MTU0NTU4NSwgICNBZGRpdGlvbmFsIGV4dGVybmFsaXR5IHNlY29uZGFyeSBzY2hvb2xpbmcgaW5jcmVhc2UgKGZyb20gSm9hbikKICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMTEyOTQwMjE0NDM5NDc3LAkwLjA1NzE2MDgxNzk3NzE3NzUsCS0wLjA1NjA1NDY3OTMxODY5MzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDU1ODI4NDc1NjM0MzQ1MSwJMC4xNTQ2MjY0ODQzOTAxMTYwLAkwLjAwNTU5NjE0ODk5NDU2MTkpCiAgICBkZWx0YV9lZF9leHRfc28gPC0gY2JpbmQoZGVsdGFfZWRfZXh0X3NvLCAxOTk5OjIwMDcpCiAgICBpbmNsdWRlX2V4dF9zbyA8LSBUUlVFCiAgICB0ZWFjaF9zYWxfc28gPC0gNTA0MSAgICAgICAgICAgI1llYXJseSBzZWNvbmRhcnkgc2Nob29saW5nIGNvbXBlbnNhdGlvbgk1MDQxIC0gZnJvbSBST0kgbWF0ZXJpYWxzCiAgICB0ZWFjaF9iZW5fc28gPC0gMjE3LjQ3ICAgICAgICAgI1llYXJseSBzZWNvbmRhcnkgc2Nob29saW5nIHRlYWNoZXIgYmVuZWZpdHMJMjE3LjQ3CiAgICB0ZWFjaF9zYWxfbmV3X3NvIDwtICg1MDAwMCAqIDEyIC8gNDkuNzczKQogICAgdGVhY2hfYmVuX25ld19zbyA8LSAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjTW9udGhseSBzZWNvbmRhcnkgc2Nob29saW5nIGNvbXBlbnNhdGlvbgkoaW4gMjAxNyBLRVMpIG92ZXJlc3RpbWF0ZWQgdG8gYWNjb3VudCBmb3IgYmVuZWZpdHMgLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI25ld3Mgc291cmNlcyAqIDEyIC8gZXhfcmF0ZV8yMDE3X3BwcF9zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwczovL3d3dy50dWtvLmNvLmtlLzI4Nzc2Ni1zZWNvbmRhcnktc2Nob29sLXRlYWNoZXJzLXNhbGFyeS1rZW55YS5odG1sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vd3d3LnN0YW5kYXJkbWVkaWEuY28ua2UvYXJ0aWNsZS8yMDAxMjQ5NTgxL3dpbmRmYWxsLWZvci10ZWFjaGVycy1hcy10c2MtcmVsZWFzZXMtbmV3LXNhbGFyaWVzCiAgICBjcGlfMjAxOF9zbyA8LSAyNTEuMTAgICAgICAgICAgICMgS0xQUzRfRStfZ2xvYmFscy5kbyAob3JpZ2luYWxseSBmcm9tIHRoZSBCdXJlYXUgb2YgTGFib3IgU3RhdGlzdGljcykKICAgIGNwaV8yMDE3X3NvIDwtIDI0NS4xMjAgICAgICAgICAgIyBLTFBTNF9FK19nbG9iYWxzLmRvIChvcmlnaW5hbGx5IGZyb20gdGhlIEJ1cmVhdSBvZiBMYWJvciBTdGF0aXN0aWNzKQogICAgdGVhY2hfc2FsXzIwMTd1c2RwcHBfc28gPC0gdGVhY2hfc2FsX25ld19zbyAqIGNwaV8yMDE3X3NvIC8gY3BpXzIwMTdfc28gIyByZWR1bmRhbnQsIGJ1dCBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kKCiAgICBuX3N0dWRlbnRzX3NvIDwtIDQ1ICAgICAgICAgICAgI0F2ZXJhZ2UgcHVwaWxzIHBlciB0ZWFjaGVyCTQ1CiAgICAjQVRURU5USU9OIQogICAgeWVhcnNfb2ZfdHJlYXRfMF9zbyA8LSAyLjQxICAgICAgI0FkZGl0aW9uYWwgWWVhcnMgb2YgVHJlYXRtZW50IC0gVGFibGUgMSwgUGFuZWwgQQogICAgdW5pdF9jb3N0X2xvY2FsX3NvIDwtIDQzLjY2ICAgICNEZXdvcm0gdGhlIFdvcmxkCiAgICB1bml0X2Nvc3Rfc28gPC0gMC40MiAgICAgICAgICAgIyBVbml0IGNvc3Qgb2YgZGV3b3JtaW5nIChpbiAyMDE4IFVTRCkgLSBmcm9tIEV2aWRlbmNlIEFjdGlvbgogICAgI0NBTENVTEFUSU9OUyBUTyBDT05WRVJUIEFMTCBDVVJSRU5DWSBUTyAyMDE3IFVTRCBQUFAKICAgIHVuaXRfY29zdF9wcHBfc28gPC0gdW5pdF9jb3N0X3NvKmV4X3JhdGVfMjAxOF9zby9leF9yYXRlXzIwMThfcHBwX3NvCiAgICB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbyA8LSB1bml0X2Nvc3RfcHBwX3NvICogY3BpXzIwMTdfc28gLyBjcGlfMjAxOF9zbyAgIyAwLjgyOTY5MjcKICAgICMgQWRqdXN0IGZvciBpbmZsYXRpb246IGNvbnZlcnQgYWxsIGNvc3RzIHRvIDIwMTcgVVNECiAgICAjIE1vdmUgdGhpcyBjYWxjdWxhdGlvbnMgaW50byB0aGUgYm9keSBvZiB0aGUgZG9jdW1lbnQgKGFuZCBvdXRzaWRlIG9mIHRoZSBzb3VyY2VzIGNodW5rKQogICAgY29zdHNfcGFyX3NvIDwtIDEKICAgIGNvc3RzX3Bhcl9zZF9zbyA8LSAwLjEKICAgIGNvdW50c19wYXJfc28gPC0gMQogICAgY291bnRzX3Bhcl9zZF9zbyA8LSAwLjEKCgoKCgoKICAgICMjIyMjIyMjIyMjIyMKICAgICMjIyMjIEd1ZXNzIHdvcmsgICAKICAgICMjIyMjIyMjIyMjIyMKICAgICMgQVRURU5USU9OIQogICAgIyBwcmV2YWxlbmNlX3JfaW4KICAgIHByZXZhbGVuY2Vfcl9zbyA8LSBjKCJpbmRpYSIgPSAwLjU2NjUsICJrZW55YSIgPSAwLjM0NSwgIm5pZ2VyaWEiID0gMC4yNywgInZpZXRuYW0iID0gMC4xNDUpICAjMC41NjY1ICAgMC41MDEzMTIxCiAgICAjIGJhc2VkIG9uIGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFkcktkVS1rUmpsUnR3WHE2bkNxRkM2Z2NvUS1lT2FMZlQ5TVdIU01aME1BL2VkaXQ/dXNwPXNoYXJpbmcKICAgIG5ld19wcmV2YWxlbmNlX3Jfc28gPC0gTlVMTAogICAgeWVhcnNfb2ZfdHJlYXRfdF9zbyA8LSAyLjQxICAgICAgI1llYXJzIG9mIFRyZWF0bWVudCBpbiBuZXcgc2V0dGluZwogICAgc3RhZmZfdGltZV9zbyA8LSAwLjMgICAgICAgICAgICNBZGRlZCBEZXdvcm1pbmcgY29zdHMgZHVlIHRvIGdvdmVybm1lbnQgc3RhZmYgdGltZQogICAgdGltZV90b19qbV9zbyA8LSAxMCAgICAgICAgICAgICNUaW1lIGZyb20gaW5pdGlhbCBwZXJpb2QgdW50aWwgaW5kaXZpZHVhbCBqb2luIHRoZSBsYWJvciBmb3JjZQoKCiAgICAjIEZpeCB0ZWFjaF9zYWxfc28gICAgICAgCiAgICByZXR1cm4oIHNhcHBseSggbHMocGF0dGVybj0gIl9zb1xcYiIpLCBmdW5jdGlvbih4KSBnZXQoeCkpICkKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAgIAp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfc291cmNlcygpLC5HbG9iYWxFbnYpICkKIyMjIyMjIyMjIyMjIwojIyMjIyBOb3RlczoKIyMjIyMjIyMjIyMjIwojIG9uIGdyb3d0aF9yYXRlX3NvOiAoaHR0cDovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTlkuR0RQLlBDQVAuS0QvKSwgc2VlIGNhbGN1bGF0aW9uCiMgb24gIktlbnlhIEdEUCBwZXIgY2FwaXRhIiB0YWIuIEluIFdAVyB0aGlzIGVxdWFscyAxLjUyJS4gSVNTVUU6IFRoaXMgZ3Jvd3RoIG51bWJlciBzaG91bGQKIyBiZSB1cGRhdGVkIHRvIGJlIDIwMDItMjAxNCwgSSB0aGluay4KIwojIG9uIGNvZWZfZXhwX3NvOiAxOTk4LzE5OTkgS2VueWFuIGxhYm9yIGZvcmNlIHN1cnZleTsgcmVncmVzc2lvbiBvZiBlYXJuaW5ncyBvbiBhZ2UsIGFnZV4yLAojIGZlbWFsZSBkdW1teSwgaW5kaWNhdG9ycyBmb3IgYXR0YWluZWQgcHJpbWFyeS9zZWNvbmRhcnkvYmV5b25kLCBhbmQgcHJvdmluY2UgZHVtbWllcy4KIyBFc3RpbWF0ZSB1c2VkIGluIFdAVzogKDAuMTAxOTU3NSwgLTAuMDAxMDQxMykuIElTU1VFOiBGb3Igbm93IGFzc3VtZSBubyBmdXJ0aGVyIGxpZmUgY3ljbGUKIyBhZGp1c3RtZW50IGJleW9uZCBLTFBTLTMgKGxpa2VseSBhIGNvbnNlcnZhdGl2ZSBhc3N1bXB0aW9uKS4KIwojIGNvdmVyYWdlX3NvOiBPdmVyYWxsIFNhdHVyYXRpb24gKDAuNTExKSAvIDAuNzUgLSBub3QgcmVwb3J0ZWQgaW4gdGFibGUsIGF2ZXJhZ2Ugb2YgVCAmIEMKYGBgCgoKCmBgYHtyIG1haW4tcGUtcHJpbnQsIG91dC53aWR0aCA9ICcxMDAlJywgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuY2FwID0gIk1haW4gUG9saWN5IEVzdGltYXRlIiwgZWNobz1GQUxTRSwgcHVybD1GQUxTRX0KIyB1cmwKa25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MocGF0aCA9IHBhc3RlMChoZXJlKCksIi9jb2RlL21haW5fcGUucG5nIikpCmBgYAoKPGRpdiBjbGFzcyA9ICJkaXZpZGVyIj48c3Bhbj48L3NwYW4+PHNwYW4+CkV4ZWN1dGl2ZSBTdW1tYXJ5Cjwvc3Bhbj48c3Bhbj48L3NwYW4+PC9kaXY+CgpUaGlzIHJlcG9ydCBpcyBwYXJ0IG9mIGFuIE9wZW4gUG9saWN5IEFuYWx5c2lzIChPUEEpIG9uIGRld29ybWluZyBpbnRlcnZlbnRpb25zLiBBbiBPUEEgaXMgYSBwb2xpY3kgYW5hbHlzaXMgdGhhdCBlbXBoYXNpemVzIGhpZ2ggbGV2ZWxzIG9mIHRyYW5zcGFyZW5jeSBhbmQgcmVwcm9kdWNpYmlsaXR5LiBJdCBjb250YWlucyBvbmUgW29wZW4gb3V0cHV0XShodHRwczovL2Zob2Nlcy5zaGlueWFwcHMuaW8vc2hpbnlfYXBwX3Rlc3QvKSB0aGF0IGJlc3QgcmVwcmVzZW50cyB0aGUgZmFjdHMgdG8gaW5mb3JtIHBvbGljeSBtYWtlcnMsIG9uZSByZXBvcnQgKHRoaXMgZG9jdW1lbnQpIHRoYXQgY2xlYXJseSBleHBsYWlucyBhbGwgdGhlIGFuYWx5c2lzLCBhbmQgW29uZSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5vcmcvYml0c3Mvb3BhLWRld29ybWluZykgdGhhdCBjb250YWlucyBhbGwgdGhlIG1hdGVyaWFscyB0byByZXByb2R1Y2UgdGhlIHJlcG9ydCBhbmQgZmluYWwgb3V0cHV0LgoKVGhpcyByZXBvcnQgZGVzY3JpYmVzIHRocmVlIGFwcHJvYWNoZXMgdG8gY29tcHV0ZSB0aGUgbmV0IHByZXNlbnQgdmFsdWUgb2YgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucy4gVGhlIGZpcnN0IHR3byBhcHByb2FjaGVzIGFyZSBleGFjdCByZXByb2R1Y3Rpb25zIGZyb20gcHJldmlvdXMgcmVzZWFyY2ggW0BiYWlyZDIwMTZ3b3JtczsgQGtscHM0XSwgYW5kIHRoZSB0aGlyZCBhcHByb2FjaCBpcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBwcmV2aW91cyB0d28gd2l0aCBzb21lIG1vZGlmaWNhdGlvbiBzdWdnZXN0ZWQgYnkgRXZpZGVuY2UgQWN0aW9uLCBhIGtleSBwb2xpY3kgcGFydG5lciBpbiB0aGlzIGFyZWEuIFRoaXMgdGhpcmQgYXBwcm9hY2ggdXNlcyB0aGUgc2FtZSBiZW5lZml0cyBhcyB0aGUgcHJldmlvdXMgYXBwcm9hY2hlcyBhbmQgYWRqdXN0cyBmb3IgZGlmZmVyZW50IGNvc3RzLCBwcmV2YWxlbmNlIHJhdGVzIGFuZCBsZW5ndGggb2YgdHJlYXRtZW50IGFjcm9zcyBzZXR0aW5ncy4gV2Ugc3VnZ2VzdCB0aGF0IHRoaXMgZmluYWwgYXBwcm9hY2ggc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGJlc3QgYXZhaWxhYmxlIHBvbGljeSBlc3RpbWF0ZSB0byBjb21wYXJlIGNvc3RzIGFuZCBiZW5lZml0cyBvZiBkZXdvcm1pbmcgaW4gZGlmZmVyZW50IHNldHRpbmdzLgoKVGhlICBtYWluIHBvbGljeSBlc3RpbWF0ZSBwcmVkaWN0cyB0aGF0IGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uIHdpbGwgaGF2ZSBhIG5ldCBwcmVzZW50IHZhbHVlIChjb21wYXJpc29uIG9mIHN0cmVhbSBvZiBiZW5lZml0cyBhbmQgY29zdHMgZnJvbSB0b2RheSdzIHBlcnNwZWN0aXZlKSBvZiBgciBtYWluX3BlX3NvYCBmb3IgYSBzZXR0aW5nIHdpdGggYXZlcmFnZSBwcmV2YWxlbmNlIGFuZCBhdmVyYWdlIHVuaXQgY29zdHMgKGFtb25nIHRoZSBjb3VudHJpZXMgd2hlcmUgRXZpZGVuY2UgQWN0aW9uIGhhcyBkYXRhIGZvcikuIFJlYWRlcnMgaW50ZXJlc3RlZCBpbiBsZWFybmluZyBhYm91dCB0aGUgcHJlZGljdGVkIHZhbHVlIGZvciBhIHNwZWNpZmljIHNldHRpbmcgYXJlIGVuY291cmFnZSB0byB1c2UgdGhlIFtpbnRlcmFjdGl2ZSBhcHBdKGh0dHBzOi8vZmhvY2VzLnNoaW55YXBwcy5pby9zaGlueV9hcHBfdGVzdC8pIGNvbXBvbmVudHMgb2YgdGhpcyBPUEEuCgo8ZGl2IGNsYXNzID0gImRpdmlkZXIiPjxzcGFuPjwvc3Bhbj48c3Bhbj4KKgo8L3NwYW4+PHNwYW4+PC9zcGFuPjwvZGl2PgoKCiMgT3BlbiBQb2xpY3kgQW5hbHlzaXMgey19CgpUaGlzIHJlcG9ydCBpcyBwYXJ0IG9mIGFuIE9wZW4gUG9saWN5IEFuYWx5c2lzIChPUEEpIHByb2plY3Qgb24gZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEEgZnJhbWV3b3JrIGZvciBtYWtpbmcgcG9saWN5IGFuYWx5c2VzIHRyYW5zcGFyZW50IGFuZCByZXByb2R1Y2libGUgW0Bob2NlczIwMjBmcmFtZXdvcmtdLCBPUEHigJlzIGdvYWwgaXMgdG8gY2xlYXJseSBzaG93IGhvdyBhbiBhbmFseXNpcyB3YXMgY29uZHVjdGVkIGFuZCBob3cgdG8gYmVzdCByZXByZXNlbnQga2V5IGZpZ3VyZXMgb3IgcmVzdWx0cyBmb3IgcG9saWN5IG1ha2VycyB0byB1c2UgYXMgYSBmYWN0dWFsIGJhc2lzIGZvciBkZWxpYmVyYXRpb24uIEluIGFkZGl0aW9uLCBPUEEgZmFjaWxpdGF0ZXMgdGhlIHJlLXVzZSBvZiBhbmFseXNlcyBhY3Jvc3Mgc2ltaWxhciBzZXR0aW5ncywgYW5kIHNoZWRzIGxpZ2h0IG9uIGhvdyBldmlkZW5jZSBnZW5lcmF0ZWQgYnkgcmVzZWFyY2ggaXMgdXNlZCBpbiBzcGVjaWZpYyBwb2xpY3kgYW5hbHlzZXMuCgogVGhpcyBPUEEgcHJvamVjdCBjb250YWlucyB0aHJlZSBjb21wb25lbnRzLCBmb2xsb3dpbmcgdGhlIE9QQSBwcmluY2lwbGVzIGxhaWQgb3V0IGluIHRoZSBhZm9yZW1lbnRpb25lZCBwYXBlcjoKCiAgMS4gT25lIHNpbmdsZSBvdXRwdXQgdGhhdCBiZXN0IHJlcHJlc2VudHMgdGhlIGZhY3R1YWwgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgcG9saWN5IG1ha2VycyB0byBpbmZvcm0gdGhlaXIgcG9zaXRpb24gcmVnYXJkaW5nIGEgcG9saWN5IG9mIG1hc3MgZGV3b3JtaW5nLiBUaGlzIG91dHB1dCBpcyBwcmVzZW50ZWQgaW4gRmlndXJlICBcQHJlZihmaWc6bWFpbi1wZS1wcmludCksIGFuZCBkZXNjcmliZWQgaW4gdGhlIFtyZXN1bHRzIHNlY3Rpb25dKCNwb2xpY3ktZXN0aW1hdGUpIG9mIHRoaXMgcmVwb3J0LiBUaGUgY29ubmVjdGlvbiBiZXR3ZWVuIGVhY2ggY29tcG9uZW50IG9mIHRoZSBhbmFseXNpcyBhbmQgdGhlIGZpbmFsIG91dHB1dCBjYW4gYmUgZXhwbG9yZWQgaW50ZXJhY3RpdmVseSBpbiBbdGhpcyB3ZWIgYXBwXShodHRwczovL2Zob2Nlcy5zaGlueWFwcHMuaW8vc2hpbnlfYXBwX3Rlc3QvKS4KCiAgMi4gVGhpcyBkZXRhaWxlZCByZXBvcnQgdGhhdCBkZXNjcmliZXMgaG93IHRvIG9idGFpbiB0aGUgcG9saWN5IGVzdGltYXRlIGFuZCBkZXNjcmliZXMgZWFjaCBjb21wb25lbnQgb2YgdGhlIGFuYWx5c2lzLgoKICAzLiBbQSByZXBvc2l0b3J5XShodHRwczovL2dpdGh1Yi5vcmcvYml0c3Mvb3BhLWRld29ybWluZykgdGhhdCBjb250YWlucyBhbGwgdGhlIG1hdGVyaWFscyBuZWVkZWQgdG8gcmVwcm9kdWNlIHRoZSBhbmFseXNpcyB3aXRoIG1pbmltYWwgZWZmb3J0IChyZXBvcnQgYW5kIGludGVyYWN0aXZlIGFwcCkuICAKClRoaXMgcmVwb3J0IHByb3ZpZGVzIGEgY29tcGxldGUgZGVzY3JpcHRpb24gb2YgdGhlIGFuYWx5c2lzIGJlaGluZCB0aGUgcmVzdWx0cyBwcmVzZW50ZWQgdG8gaW5mb3JtIGEgcG9saWN5IGRpc2N1c3Npb24gb24gZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEl0IGRlc2NyaWJlcyBob3cgdG8gcmVwcm9kdWNlIHRoZSBhbmFseXNpcyBpbiBpdHMgZW50aXJldHksIGFuZCBpbmNsdWRlcyBhbGwgdGhlIG1ldGhvZG9sb2dpY2FsIGNob2ljZXMgaW52b2x2ZWQuIEluIG9yZGVyIHRvIGRvY3VtZW50IGFsbCB0aGUgc3RlcHMgd2l0aG91dCBvdmVyd2hlbG1pbmcgdGhlIHJlYWRlciwgdGhlIHJlcG9ydCBpcyBkaXNwbGF5ZWQgaW4gYSBsYXllcmVkIGZhc2hpb24uIFRoZSBmaXJzdCBsYXllciBjb25zaXN0cyBvZiBhIG5hcnJhdGl2ZSBkZXNjcmlwdGlvbiBvZiB0aGUgYW5hbHlzaXMuIFRoZSBzZWNvbmQgbGF5ZXIsIHRoYXQgYXBwZWFyIGFmdGVyIGNsaWNraW5nIGluIHRoZSAhW3NjcmVlbnNob3RdKHNob3dfZGV0YWlscy5wbmc/ZGlzcGxheSA9IGlubGluZS1ibG9jaykgY29udGFpbnMgZXF1YXRpb25zIHRoYXQgc2hvdyBob3cgZWFjaCBwaWVjZSBvZiB0aGUgYW5hbHlzaXMgd2FzIGNhcnJpZWQgb3V0LiBBbmQgdGhlIHRoaXJkIGFuZCBmaW5hbCBsYXllciBkaXNwbGF5cyB0aGUgY29kZSB1c2VkIHRvIG9wZXJhdGlvbmFsaXplIGVhY2ggZXF1YXRpb24uIEFsbCB0aGlzIGluZm9ybWF0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGlzIGRvY3VtZW50IHVzaW5nIGR5bmFtaWMgZG9jdW1lbnRhdGlvbiBbQHhpZTIwMTVkeW5hbWljXSwgc28gaW50ZXJlc3RlZCByZWFkZXJzIGNhbiBhY2Nlc3MgdGhlIHNvdXJjZSBmaWxlIG9mIHRoZSByZXBvcnQgYW5kIHJlcHJvZHVjZSB0aGUgZW50aXJlIGRvY3VtZW50IGluIHRoZWlyIG93biBjb21wdXRpbmcgZW52aXJvbm1lbnRzLgoKCiMgSW50cm9kdWN0aW9uICAKClBhcmFzaXRpYyB3b3JtIGluZmVjdGlvbnMsIGFsc28ga25vd24gYXMgc29pbC10cmFuc21pdHRlZCBoZWxtaW50aHMgKFNUSCkgYW5kIHNjaGlzdG9zb21pYXNpcywgYXJlIGVuZGVtaWMgaW4gbWFueSBjb3VudHJpZXMgYWNyb3NzIHRoZSBnbG9iZSwgZGlzcHJvcG9ydGlvbmF0ZWx5IGFmZmVjdGluZyB0aGUgcG9vci4gVGhlc2UgcGFyYXNpdGljIHdvcm1zIGludGVyZmVyZSB3aXRoIHJlZ3VsYXIgYm9kaWx5IHByb2Nlc3NlcyBieSBkZWNyZWFzaW5nIG51dHJpZW50IHVwdGFrZSBhbmQgY2FuIHRodXMgbGVhZCB0byBzZXJpb3VzIGNvbnNlcXVlbmNlcyBvbiBodW1hbiBoZWFsdGgsIGVkdWNhdGlvbiBvdXRjb21lcywgYW5kIGxvbmctdGVybSBlY29ub21pYyB3ZWxsIGJlaW5nLiBJbiBwYXJ0aWN1bGFyLCBldmlkZW5jZSBpbmRpY2F0ZXMgdGhhdCB0aGVzZSB3b3JtcyBjb250cmlidXRlIHRvIG1hbG5vdXJpc2htZW50LCBpbXBhaXJtZW50IG9mIG1lbnRhbCBhbmQgcGh5c2ljYWwgZGV2ZWxvcG1lbnQsIGxvd2VyIHNjaG9vbCBhdHRlbmRhbmNlLCBhbmQgZGVjcmVhc2VkIHdhZ2VzIFtAY3Jva2UyMDE0bG9uZzsgQG1pZ3VlbDIwMDR3b3JtczsgQGJhaXJkMjAxNndvcm1zXS4KCkV2aWRlbmNlIGZyb20gcHJldmlvdXMgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBoYXMgZGVtb25zdHJhdGVkIHRvIGJlIGEgaGlnaGx5IGVmZmVjdGl2ZSBwdWJsaWMgaGVhbHRoIHBvbGljeS4gSGVyZSB3ZSBwcm92aWRlIGEgcG9saWN5IGFuYWx5c2lzIHRoYXQgY29tcGFyZXMgYmVuZWZpdHMgYW5kIGNvc3RzIG9mIGRld29ybWluZyBhY3Jvc3MgZGlmZmVyZW50IHNldHRpbmdzLCBhbGxvd2luZyBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIHJlc2VhcmNoIGZpbmRpbmdzIGludG8gZGlmZmVyZW50IHBvbGljeS1yZWxldmFudCBzY2VuYXJpb3MuCgpUaGUgZ29hbHMgb2YgdGhpcyBPUEEgYXJlIHRocmVlLiBGaXJzdCwgdG8gaW5jcmVhc2UgdGhlIHRyYW5zcGFyZW5jeSBhbmQgcmVwcm9kdWNpYmlsaXR5IGJlaGluZCBleGlzdGluZyBwb2xpY3kgYW5hbHlzZXMgb24gdGhlIGNvc3RzIGFuZCBiZW5lZml0cyBvZiBtYXNzIGRld29ybWluZyBwcm9ncmFtcy4gU2Vjb25kLCB0byB1cGRhdGUgdGhpcyBwb2xpY3kgYW5hbHlzZXMgd2l0aCBpbnB1dCBmcm9tIHN0YWtlaG9sZGVycyBjbG9zZWx5IGludm9sdmVkIGluIHBvbGljeSBtYWtpbmcgYXJvdW5kIGRld29ybWluZy4gQW5kIHRoaXJkLCB0byBpbGx1c3RyYXRlIGhvdyBhbiBvcGVuIHBvbGljeSBhbmFseXNpcyBmcmFtZXdvcmsgY2FuIGJlIGltcGxlbWVudGVkIGluIHByYWN0aWNlLgoKVGhlIENvc3QgQmVuZWZpdCBBbmFseXNpcyAoQ0JBKSBvZiBkZXdvcm1pbmcgaXMgY29tcHV0ZWQgdXNpbmcgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXM6ICAgICAKCiAgMS4gUmVwcm9kdWNpbmcgdGhlIG9yaWdpbmFsIENCQSBwcm9kdWNlZCBieSBAYmFpcmQyMDE2d29ybXMsIHdoaWNoIGVzdGltYXRlcyB0aGUgbmV0IHByZXNlbnQgdmFsdWUgb2YgYSBLZW55YSBzY2hvb2wtYmFzZWQgZGV3b3JtaW5nIHByb2dyYW0gYWZ0ZXIgYSAxMCB5ZWFyIGZvbGxvdy11cCBmb3IgZm91ciBkaWZmZXJlbnQgcG9saWN5IGVzdGltYXRlcy4gICAgIAogIDIuIFJlcHJvZHVjaW5nIGFuIHVwZGF0ZWQgdmVyc2lvbiBvZiBzdWNoIGFuYWx5c2lzIG9uIHRoZSBzYW1lIGludGVydmVudGlvbiBidXQgd2l0aCBhZGRpdGlvbmFsIGZvbGxvdy11cCBkYXRhIFtAa2xwczRdLgogIDMuIFByb2R1Y2luZyBhIG5ldyBhbmFseXNpcyB0aGF0LCBidWlsZGluZyBmcm9tIHRoZSBwcmV2aW91cyB0d28gYXBwcm9hY2hlcywgZm9jdXNlcyBvbiBvbmUgc3BlY2lmaWMgcG9saWN5IGVzdGltYXRlLCBhbmQgYWxsb3dzIGZvciByZXN1bHRzIHRvIHZhcnkgZGVwZW5kaW5nIG9uIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY3VycmVudCBzZXR0aW5ncyB3aGVyZSBkZXdvcm1pbmcgcG9saWNpZXMgYXJlIGJlaW5nIGltcGxlbWVudGVkLiBUaGlzIG5ldyBhcHByb2FjaCB3YXMgZGV2ZWxvcGVkIGluIGNvbnN1bHRhdGlvbiB3aXRoIGEga2V5IHN0YWtlaG9sZGVyIGluIHRoaXMgYXJlYSwgdGhlIG5vbi1nb3Zlcm5tZW50YWwgb3JnYW5pemF0aW9uIChOR08pIEV2aWRlbmNlIEFjdGlvbiAoRUEpW14xXS4KCgoKCiMgTWV0aG9kb2xvZ3kgIAoKV2UgZmlyc3QgZGVzY3JpYmUgdGhlIGNvbW1vbiBlbGVtZW50cyBhY3Jvc3MgYWxsIHRocmVlIGFwcHJvYWNoZXMsIGFuZCB0aGVuIGRlc2NyaWJlIGVhY2ggYXBwcm9hY2ggaW4gZGV0YWlsLgoKIyMgQ29tbW9uIHN0cnVjdHVyZSB7LX0KClRoZSBzdGFydGluZyBwb2ludCBpcyBhIGNvbXBhcmlzb24gb2YgYSBzdHJlYW0gb2YgYmVuZWZpdHMgYW5kIGNvc3RzIG92ZXIgdGhlIGxpZmV0aW1lIG9mIHRoZSByZWNpcGllbnRzIG9mIGRld29ybWluZy4gVGhlIGZpbmFsIHBvbGljeSBlc3RpbWF0ZSBpcyB0aGUgZGlzY291bnRlZCBzdW0gb2YgYWxsIGNvc3RzIGFuZCBiZW5lZml0cywga25vd24gYXMgdGhlIE5ldCBQcmVzZW50IFZhbHVlIChOUFYpW14xMl0uCgpbXjEyXTogQXBwcm9hY2hlcyAxIGFuZCAyIGFsc28gcHJlc2VudCByZXN1bHRzIGluIHRoZSBmb3JtYXQgb2YgaW50ZXJuYWwgcmF0ZXMgb2YgcmV0dXJuIChJUlIpLiBGb2xsb3dpbmcgdGhlIHByaW5jaXBsZSBvZiBvcGVuIG91dHB1dCwgd2UgcmVzdHJpY3QgdGhlIHByZXNlbnRhdGlvbiBvZiByZXN1bHRzIHRvIGp1c3Qgb25lIGZvcm1hdC4gTlBWIHdhcyBjaG9zZW4gb3ZlciBJUlIgaW4gY29uc3VsdGF0aW9uIHdpdGggRXZpZGVuY2UgQWN0aW9uIHRvIGNsZWFybHkgY29tbXVuaWNhdGUgdGhlIHNjYWxlIG9mIHRoZSB3ZWxmYXJlIGVmZmVjdHMuIFtDT05GSVJNIFdJVEggR1JBQ0VdICAKCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KTlBWID0gQiAtIEMgXFwKXGVuZHtlcXVhdGlvbn0KCldoZXJlOiAgCgotICROUFYkOiBuZXQgcHJlc2VudCB2YWx1ZSBvZiB0aGUgZGV3b3JtaW5nIHRyZWF0bWVudCAgIAotICRCJDogYmVuZWZpdHMgb2YgdGhlIGRld29ybWluZyB0cmVhdG1lbnQgIAotICRDJDogY29zdHMgb2YgdGhlIGRld29ybWluZyB0cmVhdG1lbnQgIAoKCmBgYHtyIGZpbmFsLXBlLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHRvdGFsIHBlciBjYXBpdGEgYmVuZWZpdHMsIHRvdGFsIHBlciBjYXBpdGEgY29zdHMKIyAtIG91dHB1dHM6IE5ldCBQcmVzZW50IFZhbHVlIChOUFYpCmNodW5rX2ZpbmFsX3BlIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogICAgTlBWX3BlX2YgPC0gZnVuY3Rpb24oYmVuZWZpdHNfdmFyID0gMSwgY29zdHNfdmFyID0gMSl7CiAgICAgICAgYmVuZWZpdHNfdmFyIC0gY29zdHNfdmFyCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoIk5QVl9wZV9mIiA9IE5QVl9wZV9mKSkKfQojIEV4Y2VjdXRlIHRoZSBwcmV2aW9zIGZ1bmN0aW9uIGFuZCBsb2FkIHRoZSBsaXN0ZWQgb2JqZWN0cyBpbiB0byB0aGUgY3VycmVudCBSCiMgc2Vzc2lvbiAoZ2xvYmFsIGVudmlyb25tZW50KQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2ZpbmFsX3BlKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmBgYAoKCjwvZGV0YWlscz4KPGJyPgoKQmVuZWZpdHMgYXJlIGVxdWFsIHRvIHRoZSBhZGRpdGlvbmFsIGxpZmV0aW1lIGVhcm5pbmdzIHRoYXQgaW5kaXZpZHVhbHMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGR1ZSB0byBkZXdvcm1pbmcgdHJlYXRtZW50LiBUaGVzZSBhZGRpdGlvbmFsIGVhcm5pbmdzIGFyZSBjb21wdXRlZCBhcyBhIGRpc2NvdW50ZWQgc3VtIG92ZXIgdGhlaXIgd29ya2luZyBsaWZldGltZS4gIAoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKClxiZWdpbntlcXVhdGlvbn0KQiA9ICAgXHN1bV97dD0wfV57NTB9XGxlZnQoICBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBFX3t0fQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJEVfe3R9JDogZWFybmluZ3MgaW5kaXZpZHVhbHMgYXJlIGV4cGVjdGVkIHRvIGdlbmVyYXRlIGF0IHBlcmlvZCB0ICAKLSAkciQ6IHJlYWwgaW50ZXJlc3QgcmF0ZSBhcyB0aGUgZGlzY291bnRpbmcgcmF0ZSAgCi0gJHQkOiBwZXJpb2QgdC4gUGVyaW9kIDAgcmVwcmVzZW50cyB0aW1lIG9mIGludGVydmVudGlvbi4gSW5kaXZpZHVhbHMgYXJlIGFzc3VtZWQgdG8gZW50ZXIgdGhlIGxhYm9yIG1hcmtldCA5IHllYXJzIGFmdGVyIHRyZWF0bWVudC4gIAoKYGBge3IgYmVuZWZpdHMsIGVjaG89cHJpbnRfY29kZX0KIyAtIGlucHV0czogc3RyZWFtIGVhcm5pbmdzLCBkaXNjb3VudGluZyByYXRlLCBudW1iZXIgb2YgcGVyaW9kcwojIC0gb3V0cHV0czogZnVuY3Rpb24gdGhhdCBjb21wdXRlcyB0aGUgcHJlc2VudCB2YWx1ZSBvZiBiZW5lZml0cwpjaHVua19iZW5lZml0cyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICBwdl9iZW5lZl9mIDwtIGZ1bmN0aW9uKAogICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3NfaW4sCiAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCiAgKSB7CiAgICAgIGluZGV4X3QgPC0gMDpwZXJpb2RzX3ZhcgogICAgICByZXMxIDwtIHN1bSggKCAxIC8gKDEgKyBpbnRlcmVzdF9yX3ZhcikgKV5pbmRleF90ICogZWFybmluZ3NfdmFyICkKICAgICAgcmV0dXJuKHJlczEpICAgCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoInB2X2JlbmVmX2YiID0gcHZfYmVuZWZfZikpCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19iZW5lZml0cygpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OgpgYGAKPC9kZXRhaWxzPgo8YnI+CgpBdCBhIGhpZ2ggbGV2ZWwgYWxsIHRocmVlIGFwcHJvYWNoZXMgZm9jdXMgb24gdGhlIHNhbWUgdHlwZSBvZiBiZW5lZml0czogdGhlIGluY3JlYXNlIGluIGluY29tZXMgb3ZlciB0aGUgbGlmZXRpbWUgb2YgYmVuZWZpY2lhcmllcyBvZiBkZXdvcm1pbmcuIFRoaXMgaXMgbGlrZWx5IGFuIHVuZGVyLWVzdGltYXRlIG9mIHRoZSBiZW5lZml0cyBhcyBpdCBkb2VzIG5vdCBxdWFudGlmeSB0aGUgbm9uLXBlY3VuaWFyeSBlZmZlY3RzIG9mIGltcHJvdmVkIGhlYWx0aC4gIFRoZSBjb3N0cyBjYW4gYmUgc2VwYXJhdGVkIGludG8gZGlyZWN0IGNvc3RzIG9mIGltcGxlbWVudGluZyBhbmQgZXZhbHVhdGluZyBkZXdvcm1pbmcgcHJvZ3JhbXMsIGFuZCBpbmRpcmVjdCBjb3N0cywgc3VjaCBhcyBhZGRpdGlvbmFsIGNvc3RzIHRvIHRoZSBlZHVjYXRpb24gc3lzdGVtIGFzIGEgcmVzdWx0IG9mIGluY3JlYXNlZCBjaGlsZCBhdHRlbmRhbmNlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGJlbmVmaXRzIG9mIGRld29ybWluZy4KClRoZSBtYWluIGRpZmZlcmVuY2VzIGluIGJlbmVmaXRzIGFjcm9zcyB0aGUgdGhyZWUgYXBwcm9hY2hlcyBoYXZlIHRvIGRvIHdpdGggaG93IHRvIHByZWRpY3QgdGhlIGVhcm5pbmdzIHByb2ZpbGVzIG92ZXIgYSBsaWZlY3ljbGUsIGFuZCBob3cgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMgaW4gd29ybSBwcmV2YWxlbmNlIHJhdGVzIGFuZCBsZW5ndGggb2YgdHJlYXRtZW50IGFjcm9zcyBzZXR0aW5ncy4gQXBwcm9hY2hlcyAxIGFuZCAyIHVzZSBkaWZmZXJlbnQgZWFybmluZyBwcm9maWxlcywgYW5kIGFwcHJvYWNoIDMgY29tYmluZXMgYm90aCBlYXJuaW5nIHByb2ZpbGVzIGFuZCBhZGp1c3RzIGZvciBwb3NzaWJsZSBkaWZmZXJlbmNlcyBpbiBwcmV2YWxlbmNlIHJhdGVzIG9mIHdvcm0gaW5mZWN0aW9ucyBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudC4KClRoZSBtYWluIGRpZmZlcmVuY2VzIGluIGNvc3RzIGJldHdlZW4gc2NlbmFyaW9zIGhhdmUgdG8gZG8gd2l0aCBhKSB3aGV0aGVyIGluZGlyZWN0IGNvc3RzIGFyZSBpbmNsdWRlZCwgYW5kIGIpIGhvdyB0byBjb21wdXRlIHRoZSByZWxldmFudCB1bml0IGNvc3QgZm9yIHRoZSBhbmFseXNpcy4gVGhlIGZpcnN0IHR3byBhcHByb2FjaGVzIGluY2x1ZGUgaW5kaXJlY3QgY29zdHMgYW5kIHVzZSB0aGUgdW5pdCBjb3N0cyBvZiBhIHNwZWNpZmljIGNvdW50cnkgKEtlbnlhKSB3aGVyZSB0aGUgc3R1ZHkgd2FzIG9yaWdpbmFsbHkgY29uZHVjdGVkLCB3aGlsZSB0aGUgdGhpcmQgYXBwcm9hY2ggZG9lcyBub3QgaW5jbHVkZSBpbmRpcmVjdCBjb3N0cyBhbmQgdXNlIHVuaXQgY29zdHMgb2YgdmFyaW91cyBjb3VudHJpZXMgZnJvbSBkYXRhIHByb3ZpZGVkIGJ5IEV2aWRlbmNlIEFjdGlvbi4KCgojIyMgVGhlIGRpc2NvdW50aW5nIHJhdGUgIHstfQoKQWxsIHRocmVlIGFwcHJvYWNoZXMgdXNlIHRoZSByZWFsIGludGVyZXN0IHJhdGUgKCRyJCkgYXMgdGhlIGRpc2NvdW50aW5nIHJhdGUuIFRoaXMgaXMgb2J0YWluZWQgZnJvbSB0aGUgaW50ZXJlc3QgcmF0ZSBvbiBnb3Zlcm5tZW50IGJvbmRzICgkaSQpIG1pbnVzIHRoZSBpbmZsYXRpb24gcmF0ZSAoJFxwaSQpLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CnIgPSBcZnJhY3sxICsgaX17MSArIFxwaX0gLSAxIFxcCnIgXGFwcHJveCBpIC0gXHBpCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOiAgIAoKLSAkciQ6IHJlYWwgaW50ZXJlc3QgcmF0ZSBhcyB0aGUgZGlzY291bnRpbmcgcmF0ZSAgCi0gJGkkOiBpbnRlcmVzdCByYXRlIG9uIGdvdmVybm1lbnQgYm9uZHMgIAotICRccGkkOiBpbmZsYXRpb24gcmF0ZSAgCgpgYGB7ciBpbnRlcmVzdC1yYXRlLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IG5vbWluYWwgaW50ZXJlc3QgcmF0ZSwgaW5mbGF0aW9uIHJhdGUKIyAtIG91dHB1dHM6IHJlYWwgaW50ZXJlc3QgcmF0ZS4gZXhhY3QgYW5kIGFwcHJveGltYXRlIGZvcm11bGEKY2h1bmtfaW50ZXJlc3QgPC0gZnVuY3Rpb24oKXsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKCiAgICBpbnRlcmVzdF9mIDwtIGZ1bmN0aW9uKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfc28gLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fdmFyID0gaW5mbGF0aW9uX3NvKSB7ICAKICAgICAgICBpbnRlcmVzdF9leGN0X2luIDwtICgxICsgZ292X2JvbmRzX3ZhcikgLyAoMSArIGluZmxhdGlvbl92YXIpIC0gMQogICAgICAgIGludGVyZXN0X2luID0gZ292X2JvbmRzX3ZhciAtIGluZmxhdGlvbl92YXIKICAgICAgICByZXR1cm4obGlzdCgiaW50ZXJlc3RfaW4iID0gaW50ZXJlc3RfaW4sCiAgICAgICAgICAgICAgICAgICAgImludGVyZXN0X2V4Y3RfaW4iID0gaW50ZXJlc3RfZXhjdF9pbikpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoImludGVyZXN0X2YiID0gaW50ZXJlc3RfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfaW50ZXJlc3QoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKCmludGVyZXN0X2luIDwtIGFzLm51bWVyaWMoCiAgaW50ZXJlc3RfZihnb3ZfYm9uZHNfdmFyID0gZ292X2JvbmRzX3NvLAogICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9zbykkaW50ZXJlc3RfaW4KICApCgppbnRlcmVzdF9uZXdfaW4gPC0gYXMubnVtZXJpYygKICBpbnRlcmVzdF9mKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfbmV3X3NvLAogICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9uZXdfc28pJGludGVyZXN0X2luICAKICApCgpgYGAKCjwvZGV0YWlscz4KPGJyPgoKVGhlIGFjdHVhbCB2YWx1ZSB2YXJpZXMgYWNyb3NzIGFwcHJvYWNoZXMgZGVwZW5kaW5nIG9uIHRoZSB0aW1lIGFuZCBjb3VudHJ5IGNob3Nlbi4gRm9yIGV4YW1wbGUgYXBwcm9hY2ggMSB1c2VzIHRoZSByZXR1cm4gZnJvbSBnb3Zlcm5tZW50IGJvbmRzIGFuZCB0aGUgaW5mbGF0aW9uIHJhdGUgaW4gS2VueWEgZm9yIHRoZSB5ZWFyIDIwMTYsIHdoaWxlIGFwcHJvYWNoZXMgMiBhbmQgMyB1c2VzIHRoZSB2YWx1ZXMgZm9yIHRoZSBzYW1lIGNvdW50cnkgZm9yIHRoZSB5ZWFyIDIwMTkuIFRoaXMgcmVzdWx0cyBpbiBkaXNjb3VudCByYXRlcyBvZiBgciBwYXN0ZShyb3VuZCgxMDAgKiBpbnRlcmVzdF9pbiwyKSwgIiUiLCBzZXA9IiIpYCBhbmQgYHIgcGFzdGUocm91bmQoMTAwICogaW50ZXJlc3RfbmV3X2luLDIpLCAiJSIsIHNlcD0iIilgIGZvciBhcHByb2FjaCAxIGFuZCwgMiBhbmQgMyByZXNwZWN0aXZlbHkuCgoKCmBgYHtyIHN1bS10YWJsZXMyLCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9CiMgU3VtbWFyeSB0YWJsZXMsIG5vdCB1c2VkIGZvciBub3cuCnRhYmxlXzEgPC0gbWF0cml4KCIiLCBucm93ID0gMSwgbmNvbCA9IDMpCnRhYmxlXzIgPC0gbWF0cml4KCIiLCBucm93ID0gMSwgbmNvbCA9IDIpCgp0YWJsZV8xWzEsMV0gPC0gcGFzdGUwKCIkXFxwaV97MTZ9PSIgLCBpbmZsYXRpb25fc28sICIkIikKCnRhYmxlXzEgPC0gcmJpbmQodGFibGVfMSwKICAgICAgICAgICAgICAgICBjKCBwYXN0ZTAoIiRpX3sxNn09IiAsIGdvdl9ib25kc19zbywgIiQiKSwgICIiLCAiIiApLAogICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJFxccGlfezE5fT0iICwgaW5mbGF0aW9uX25ld19zbywgIiQiKSwgICIiLCAiIiApLAogICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJGlfezE5fT0iICwgZ292X2JvbmRzX25ld19zbywgIiQiKSwgICIiLCAiIiApCiAgICApCgoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkTlBWID0gQiAtIEMkIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLHN1bV90YWJsZV9pbmRleCwiKSQiICkpCiAgICApCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJEI9XFxzdW1fe3Q9MH1eezUwfVxcbGVmdChcXGZyYWN7MX17MStyfVxccmlnaHQpXnt0fUVfe3R9JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIixzdW1fdGFibGVfaW5kZXgsIikkIiApKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkcj1cXGZyYWN7MStpfXsxK1xccGl9LTEkIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKIygjdGFiOnN1bV90YWJsZXMyKVN1bW1hcnkgb2YgZXF1YXRpb25zIHVzZSB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudAoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKCiMjIEFwcHJvYWNoIDE6IEBiYWlyZDIwMTZ3b3JtcwoKSW4gdGhpcyBmaXJzdCBhcHByb2FjaCwgdGhlIGVmZmVjdCBvbiBlYXJuaW5ncyBvdmVyIHRoZSBlbnRpcmUgbGlmZWN5Y2xlIGlzIHByZWRpY3RlZCBieSBleHRyYXBvbGF0aW5nIHRoZSBlZmZlY3RzIG9uIGhvdXJzIHdvcmtlZCBieSBpbmRpdmlkdWFscyBpbiB0aGUgb3JpZ2luYWwgdHJlYXRtZW50IGdyb3VwLCB0ZW4geWVhcnMgYWZ0ZXIgdGhlIGludGVydmVudGlvbi4KClR3byB0eXBlcyBvZiByZXN1bHRzIGFyZSBwcmVzZW50ZWQ6IHRoZSB0b3RhbCBlZmZlY3Qgb24gZWFybmluZ3MgcHJvamVjdGVkIG92ZXIgYSBsaWZldGltZSBhbmQgdGhlIGVzdGltYXRlZCBmaXNjYWwgZWZmZWN0IGR1ZSB0byB0aGUgZ292ZXJubWVudCBjb2xsZWN0aW5nIGFkZGl0aW9uYWwgdGF4ZXMgb24gaGlnaGVyIGVhcm5pbmdzLiBUaGUgZWZmZWN0cyBhcmUgY2FsY3VsYXRlZCBpbiB0d28gc2NlbmFyaW9zOiB3aXRoIGFuZCB3aXRob3V0IGV4dGVybmFsaXRpZXMgb3ZlciB0aGUgcG9wdWxhdGlvbiBvZiBjaGlsZHJlbiB3aG8gZGlkIG5vdCByZWNlaXZlIGRld29ybWluZyBpbnRlcnZlbnRpb25zLiBJbiB0aGUgb3JpZ2luYWwgZGV3b3JtaW5nIHN0dWR5IGNvbmR1Y3RlZCBpbiBLZW55YSwgdGhlcmUgaXMgZXZpZGVuY2Ugb2YgZXBpZGVtaW9sb2dpY2FsIGV4dGVybmFsaXRpZXMgZm9yIGNoaWxkcmVuIHdobyByZW1haW5lZCB1bnRyZWF0ZWQgYnV0IHdobyBhdHRlbmRlZCB0cmVhdG1lbnQgc2Nob29scywgYXMgd2VsbCBhcyBmb3IgY2hpbGRyZW4gbGl2aW5nIG5lYXIgdHJlYXRtZW50IHNjaG9vbHMuIEV4dGVybmFsaXR5IGVmZmVjdHMgbWF5IG5vdCBiZSBhcyByZWxldmFudCBmb3IgY3VycmVudC1kYXkgZGV3b3JtaW5nIHByb2dyYW1zIHNpbmNlIG1vc3QgcHJvZ3JhbXMgYXJlIG5hdGlvbmFsIHByb2dyYW1zIHRoYXQgdGFyZ2V0IGFsbCBzY2hvb2wtYWdlZCBjaGlsZHJlbiAoYW5kIGluIHNvbWUgY2FzZXMsIHByZXNjaG9vbC1hZ2VkIGNoaWxkcmVuKSBpbiBhdC1yaXNrIGFyZWFzLgoKCiMjIyAgR2FpbnMgaW4gZWFybmluZ3MKCkdhaW5zIGluIGVhcm5pbmdzICgkXERlbHRhIFdfe3R9JCkgYXJlIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgZXhwZWN0ZWQgZWFybmluZ3MgaW4gYSBjZXJ0YWluIHBlcmlvZCAoJHdfdCQpIHdpdGggdGhlIGVmZmVjdHMgb2YgZGV3b3JtaW5nIG9uIHdvcmtlZCBob3Vycy4gVGhpcyBlZmZlY3QgY2FuIGhhdmUgdHdvIGNvbXBvbmVudHM6IGEgZGlyZWN0IGVmZmVjdCBvZiBkZXdvcm1pbmcgb24gdGhlIGluZGl2aWR1YWwgKCRcbGFtYmRhXzEkKSBhbmQgdGhlIGluZGlyZWN0IGVmZmVjdCBvbiBlYXJuaW5ncyBkdWUgdG8gZXh0ZXJuYWxpdGllcyAoJFxsYW1iZGFfMiQpLiBUaGUgaW5kaXJlY3QgZWZmZWN0cyBhcmUgY29uc2lkZXJlZCB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRyZWF0bWVudCBjb3ZlcmFnZSBhbmQgc2F0dXJhdGlvbi4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcRGVsdGEgV197dH0gPSB3X3t0fVxsZWZ0KCBcbGFtYmRhX3sxfSArIFxmcmFje3AgXGxhbWJkYV97Mn19e1J9IFxyaWdodCkKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmVbXjZdOiAgIAoKIC0gJHdfdCQ6IHRoZSBlYXJuaW5ncyBpbiBwZXJpb2QgJHQkICAgCiAtICRcbGFtYmRhX3sxfSQ6IHRoZSBkaXJlY3QgZWZmZWN0cyBvZiBkZXdvcm1pbmcgb24gZWFybmluZ3MgIAogLSAkXGxhbWJkYV97Mn0kOiB0aGUgaW5kaXJlY3QgZWZmZWN0cyBvZiBkZXdvcm1pbmcgb24gZWFybmluZ3MgICAKIC0gJHAkOiBzYXR1cmF0aW9uLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKIC0gJFIkOiBjb3ZlcmFnZSwgZGVmaW5lZCBhcyB0aGUgZnJhY3Rpb24sIGFtb25nIGFsbCBuZWlnaGJvcmluZyBzY2hvb2xzICh3aXRoaW4gNiBrbSksIHRoYXQgYmVsb25ncyB0byB0aGUgdHJlYXRtZW50IGdyb3VwICAKClteNl06IFRoZSBvcmlnaW5hbCBlcXVhdGlvbiBzZXBhcmF0ZXMgZWZmZWN0cyBieSBnZW5kZXIuIEJ1dCB0aGUgZmluYWwgY2FsY3VsYXRpb24gKGJlaGluZCB0YWJsZSA1IGluIHBhcGVyKSBkb2VzIG5vdCBzZXBhcmF0ZSBieSBnZW5kZXIuCgoKYGBge3IgZWFybmluZ3MxLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IGVhcm5pbmdzIHdpaHRvdXQgdHJlYXRtZW50ICh3YWdlX2luKSwgZGlyZWN0IHRyZWF0bWVudCBlZmYKIyAobGFtYmRhMV9zbyksIGluZGlyZWN0IHRyZWF0bWVudCBlZmYgKGxhbWJkYTJfc28pLCBzYXR1cmF0aW9uIGFuZCBjb3ZlcmFnZSAoY292ZXJhZ2Vfc28pCiMgLSBvdXRwdXRzOiBlYXJuaW5ncyAobm8gbmFtZSBzcGVjaWZpZWQpCmNodW5rX2Vhcm5pbmdzMSA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgIGVhcm5pbmdzX2FwcDFfZiA8LSBmdW5jdGlvbih3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMl92YXIgPSBsYW1iZGEyX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV92YXIgPSBjb3ZlcmFnZV9zbykgeyAgCiAgICAgICAgcmVzMSA8LSB3YWdlX3ZhciAqICggbGFtYmRhMV92YXIgKyBzYXR1cmF0aW9uX3ZhciAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3ZhciAvIGNvdmVyYWdlX3ZhciApCiAgICAgICAgcmV0dXJuKHJlczEpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgcmV0dXJuKGxpc3QoImVhcm5pbmdzX2FwcDFfZiIgPSBlYXJuaW5nc19hcHAxX2YpKQp9CgppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2Vhcm5pbmdzMSgpLC5HbG9iYWxFbnYpICkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgRWFybmluZ3Mgb3ZlciB0aW1lCgpXYWdlcyBpbiB5ZWFyICR0JCBjb3JyZXNwb25kIHRvIHRoZSBpbml0aWFsIHdlZWtseSB3YWdlICgkd18wJCkgYWRqdXN0ZWQgYnkgYW4gZWNvbm9teS13aWRlIGluY3JlYXNlIGluIHNhbGFyaWVzIGFuZCBieSBhbiBpbmNyZWFzZSBpbiBzYWxhcmllcyBkdWUgdG8gYWRkaXRpb25hbCBleHBlcmllbmNlIGF0IHRoZSBpbmRpdmlkdWFsIGxldmVsLiBUaGUgZWNvbm9teS13aWRlIHdhZ2UgYWRqdXN0bWVudCBpcyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBwZXIgY2FwaXRhIEdEUCBncm93dGggKCRnJCkgYXBwbGllZCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIHllYXJzIG9mIHdvcmsgKCRYcCQpLiBUaGUgbGlmZSBjeWNsZSBwYXRoIGZvciB3YWdlcyBpbmNyZWFzZXMgYXQgZGVjcmVhc2luZyByYXRlcyAod2FnZXMgdHlwaWNhbGx5IGluY3JlYXNlIHdpdGggbW9yZSB5ZWFycyBvZiB3b3JrLCB0aGVuIGRlY2xpbmUgbGF0ZXIgaW4gYSBsaWZlIGN5Y2xlKS4gSXQgaXMgYXNzdW1lZCB0aGF0IGluZGl2aWR1YWxzIGVudGVyIHRoZSBsYWJvciBmb3JjZSAxMCB5ZWFycyBhZnRlciB0aGUgdHJlYXRtZW50IHBlcmlvZC4gV2Vla2x5IHdhZ2VzIGFyZSBtdWx0aXBsaWVkIGJ5IDUyIHdlZWtzIHRvIG9idGFpbiB0aGUgYW5udWFsIHJhdGUuCgpUaGUgaW5pdGlhbCB3YWdlIGluIGRvbGxhcnMgKCR3X3swfSQpIGlzIGEgd2VpZ2h0ZWQgYXZlcmFnZSBvZiB3YWdlcyBmb3IgdGhlIGNvbnRyb2wgZ3JvdXAgaW4gYWdyaWN1bHR1cmUsIHdvcmtpbmcgd2FnZSwgYW5kIHNlbGYtZW1wbG95ZWQgc2VjdG9ycyAoJGFnLCB3dywgc2UkKS4gVGhlIHdlaWdodHMgY29ycmVzcG9uZCB0byB0aGUgZnJhY3Rpb24gb2YgYWxsIHRoZSBhdmVyYWdlIHdvcmtlZCBob3VycyBkZWRpY2F0ZWQgdG8gZWFjaCBzZWN0b3IgKCRoJCkuICAKCjwhLS1UbyBkbzogZmluZCB0aGUgc3BlY2lmaWMgcmVmZXJlbmNlIGZyb20gaW4gU3VyaSAocGFnZSwgYW5kIHRhYmxlICMsICBsb2NhdGlvbiksIGFuZCBhZGQgdXNpbmcgdGhlIEBub3RhdGlvbiAoeW91IHdpbGwgbmVlZCB0byBlZGl0IHRoZSBiaWJsaW9ncmFwaHkuYmliIGZpbGUpLiBJZiB5b3UgY2Fubm90IGZpbmQgdGhlIFN1cmkgcmVmZXJlbmNlLCBzZW5kIG1lIGFuIGVtYWlsIGFuZCBJIHdpbGwgbG9vayBmb3IgaXQtLT4KClRoZSB3YWdlIGluIGFncmljdWx0dXJlIGNvbWVzIGZyb20gQHN1cmkyMDExc2VsZWN0aW9uLCB3aGVyZWFzIHRoZSB3b3JraW5nIHdhZ2UgY29tZXMgZnJvbSB0aGUgc3R1ZHkgZGF0YSBhbmQgaXMgZGVmaW5lZCBhcyBhbiBob3VybHkgd2FnZSBmb3IgdGhvc2Ugd2hvIHJlcG9ydGVkIG1vcmUgdGhhbiAxMCBocnMgb2Ygd29yayBwZXIgd2VlayBpbiB0aGUgY29udHJvbCBncm91cC4gVGhlIHNlbGYtZW1wbG95ZWQgd2FnZSAoJHdfe3NlfSQpIHdhcyBjb25zdHJ1Y3RlZCBhcyB0aGUgcmVwb3J0ZWQgbW9udGhseSBlYXJuaW5ncyBmcm9tIHNlbGYtZW1wbG95ZWQgcHJvZml0cywgZGl2aWRlZCBieSB0aGUgcmVwb3J0ZWQgd2Vla2x5IG51bWJlciBvZiBob3VycyB3b3JrZWQgaW4gc2VsZi1lbXBsb3ltZW50IGZvciB0aG9zZSB3aG8gd29ya2VkIGEgcG9zaXRpdmUgbnVtYmVyIG9mIGhvdXJzIChtdWx0aXBsaWVkIGJ5IDQuNSB0byBvYnRhaW4gdGhlIG1vbnRobHkgdG90YWwpLgoKVGhlIG1vbnRobHkgc2VsZi1lbXBsb3llZCBwcm9maXRzIGFuZCBzZWxmLWVtcGxveWVkIGhvdXJzIGZvciB0aGUgY29udHJvbCBncm91cCwgZm9yIHRob3NlIHdpdGggcG9zaXRpdmUgaG91cnMsIGFsc28gY29tZXMgZnJvbSBzdHVkeSBkYXRhIChQYWdlIDExNjgsIFRhYmxlIDQsIFBhbmVsIEMsIENvbHVtbiA1LCBSb3cgMSkuIFRoZSBtZWFzdXJlIG9mIGhvdXJzIGluIHNlbGYgZW1wbG95bWVudCB1c2VkIHRvIGNvbXB1dGUgd2FnZXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHdlaWdodHMgYWJvdmUuIFRoZSBmaXJzdCBvbmUgY2FwdHVyZXMgaG91cnMgb2Ygd29yayBhbW9uZyB0aG9zZSBhY3RpdmVseSBlbXBsb3llZCBpbiB0aGUgc2VsZi1lbXBsb3llZCBzZWN0b3IsIGFuZCB0aGUgc2Vjb25kIGNhcHR1cmVzIHRoZSBhdmVyYWdlIGhvdXJzIG9mIHdvcmsgYXMgc2VsZi1lbXBsb3llZCBhbW9uZyBhbGwgdGhlIHBvcHVsYXRpb24gb2Ygd29ya2luZyBhZ2UgaW4gdGhlIHNhbXBsZSAoaGVuY2UgY2FwdHVyaW5nIHRoZSByZWxhdGl2ZSBpbXBvcnRhbmNlIG9mIHRoZSBzZWxmIGVtcGxveWVkIHNlY3RvciBpbiB0aGUgZWNvbm9teSkuCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpUaGUgd2FnZXMvZWFybmluZ3MgYXJlIGRldGVybWluZWQgYnk6ICAKClxiZWdpbntlcXVhdGlvbn0Kd190ID0gIFx0ZXh0eyN3ZWVrc30gXHRpbWVzIHdfMCAoMSArIGcpXntYcH0oMSArIFxoYXR7XGJldGFfMX0gWHAgKyBcaGF0e1xiZXRhXzJ9IFhwXjIpIFxxdWFkIFx0ZXh0e2ZvciB9IHQ9MTAsIFxkb3RzLCA1MApgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpcYmVnaW57ZXF1YXRpb259CndfMCA9IFxmcmFjezF9e2V4fSBcc3VtX3tsIFxpbiBce2FnLCB3dywgc2VcfX13X3tsfVxhbHBoYV97bH0KXFwgXHF1YWQgXHRleHR7d2l0aDogfSBcYWxwaGFfe2x9PSBcZnJhY3sgaF97bH19e2hfe2FnfSArIGhfe3d3fSArIGhfe3NlfX0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKXGJlZ2lue2VxdWF0aW9ufQp3X3tzZX0gPSAgXGZyYWN7IFx0ZXh0e01vbnRobHkgc2VsZi1lbXBsb3llZCBwcm9maXRzfSB9ezQuNSBcdGltZXMgRVtoX3tzZX18aF97c2V9PjBdIH0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6ICAKCi0gJHdfdCQ6IHRoZSB3ZWVrbHkgZWFybmluZ3MgaW4gcGVyaW9kICR0JCAgCi0gJHdfMCQ6IHRoZSBpbml0aWFsIHdlZWtseSBlYXJuaW5ncyAgCi0gJGckOiBwZXIgY2FwaXRhIEdEUCBncm93dGggIAotICRYcCQ6IHllYXJzIG9mIHdvcmsgIAotICRcaGF0e1xiZXRhXzF9JDogY29lZmZpY2llbnQgZXN0aW1hdGUgZm9yICRYcCQgIAotICRcaGF0e1xiZXRhXzJ9JDogY29lZmZpY2llbnQgZXN0aW1hdGUgZm9yICRYcF4yJCAgCi0gJGV4JDogZXhjaGFuZ2UgcmF0ZQotICRoJDogYXZlcmFnZSB3b3JrZWQgaG91cnMgZGVkaWNhdGVkIHRvIGVhY2ggc2VjdG9yICAKLSAkYWckOiBhZ3JpY3VsdHVyZSAgCi0gJHd3JDogd29ya2luZyB3YWdlICAKLSAkc2UkOiBzZWxmLWVtcGxveWVkIHNlY3RvcnMgIAoKCmBgYHtyIHdhZ2VfdCwgZWNobz1wcmludF9jb2RlfQojaW5wdXRzOiB3YWdlcyAod2FnZV9hZ19zbywgd2FnZV93d19zbykgc2VsZiBlbXBsb3llZCBpbmNvbWUgKHByb2ZpdHNfc2Vfc28sCiMgIGhvdXJzX3NlX2NvbmRfc28pIGhvdXJzIG9mIHdvcmsgKGhvdXJzX2FnX3NvLCBob3Vyc193d19zbywgaG91cnNfc2Vfc28pLAojICBleGNoYW5nZSByYXRlIChleF9yYXRlX3NvKSwgdGltaW5nIHZhcnMgKHBlcmlvZHNfc28sIHRpbWVfdG9fam1fc28pLAojICBncm93dGggcmF0ZSAoZ3Jvd3RoX3JhdGVfc28pLCBtaW5jZXIgY29lZiAoY29lZl9leHBfc29bMV0sIGNvZWZfZXhwX3NvWzJdKQojCiNvdXRwdXRzOiBTdGFydGluZyB3YWdlczogdmFsdWUgKHdhZ2VfMF9pbikgYW5kIGZ1bmN0aW9uICh3YWdlXzBfZiksCiMgV2FnZSB0cmFqZWN0b3J5OiB2YWx1ZSAod2FnZV90X2luKSBhbmQgZnVuY3Rpb24gKHdhZ2VfdF9mKS4KY2h1bmtfd2FnZXMgPC0gZnVuY3Rpb24oKXsKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICAgI2Nsb3NlIHRvIHZhbHVlIGZyb20gc3ByZWFkc2hlZXQgKEFzc3VtcHMmUGFuZWwgQSBDYWxjcyFCMTM3ID0gMC4xNDgxMDg0KSwKICAgICNidXQgSSBzdXNwZWN0IGRpZmYgZHVlIHRvIGNvbXB1dGF0aW9uYWwgcHJlY2lzaW9uCgogIHdhZ2VfMF9mIDwtIGZ1bmN0aW9uKHdhZ2VfYWdfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBob3Vyc193d192YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyKXsKICAgICAgICBleHBlcmllbmNlX2F1eCA8LSAwOnBlcmlvZHNfc28gLSB0aW1lX3RvX2ptX3NvCiAgICAgICAgd2FnZV9zZSA8LSBwcm9maXRzX3NlX3ZhciAvICg0LjUgKiBob3Vyc19zZV9jb25kX3ZhcikKICAgICAgICB3YWdlX2xzIDwtIGMod2FnZV9hZ192YXIsIHdhZ2Vfd3dfdmFyLCB3YWdlX3NlKQogICAgICAgIGFscGhhX2xzIDwtIGMoaG91cnNfYWdfdmFyLCBob3Vyc193d192YXIsIGhvdXJzX3NlX3ZhcikgLwogICAgICAgICAgc3VtKCBjKGhvdXJzX2FnX3ZhciwgaG91cnNfd3dfdmFyLCBob3Vyc19zZV92YXIpICkKICAgICAgICByZXMxIDwtIDEvZXhfcmF0ZV92YXIgKiBzdW0oIHdhZ2VfbHMgKiBhbHBoYV9scyApCiAgICAgICAgcmV0dXJuKHJlczEpCiAgICB9CgogIHdhZ2VfdF9mIDwtIGZ1bmN0aW9uKHdhZ2VfMF92YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3Jvd3RoX3JhdGVfdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfZXhwMV92YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAyX3ZhcikgewogICAgICAgIGV4cGVyaWVuY2VfYXV4IDwtIDA6cGVyaW9kc19zbyAtIHRpbWVfdG9fam1fc28KICAgICAgICByZXMxIDwtIDUyICogd2FnZV8wX3ZhciAqICggKCAxICsgZ3Jvd3RoX3JhdGVfdmFyICleZXhwZXJpZW5jZV9hdXggKSAqCiAgICAgICAgICAoIDEgKyBjb2VmX2V4cDFfdmFyICogZXhwZXJpZW5jZV9hdXggKyBjb2VmX2V4cDJfdmFyICoKICAgICAgICAgICAgICAoZXhwZXJpZW5jZV9hdXheMikgKSAqIGlmZWxzZSgwOnBlcmlvZHNfc28gPj0gdGltZV90b19qbV9zbywgMSwgMCkKICAgICAgICByZXR1cm4ocmVzMSkKICAgIH0KCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICAgIHJldHVybihsaXN0KCJ3YWdlXzBfZiIgPSB3YWdlXzBfZiwKICAgICAgICAgICAgICAgICJ3YWdlX3RfZiIgPSB3YWdlX3RfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfd2FnZXMoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKd2FnZV8wX2luIDwtIHdhZ2VfMF9mKHdhZ2VfYWdfdmFyID0gd2FnZV9hZ19zbywgIAogICAgICAgICAgICAgICAgICAgICAgd2FnZV93d192YXIgPSB3YWdlX3d3X3NvLAogICAgICAgICAgICAgICAgICAgICAgcHJvZml0c19zZV92YXIgPSBwcm9maXRzX3NlX3NvLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfY29uZF92YXIgPSBob3Vyc19zZV9jb25kX3NvLCAgCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19hZ192YXIgPSBob3Vyc19hZ19zbywKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3d3X3ZhciA9IGhvdXJzX3d3X3NvLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyID0gaG91cnNfc2Vfc28sCiAgICAgICAgICAgICAgICAgICAgICBleF9yYXRlX3ZhciA9IGV4X3JhdGVfc28pICAKCiNjbG9zZSB0byB2YWx1ZSBmcm9tIHNwcmVhZHNoZWV0IChDYWxjcy1UYWJsZSA1IU4yMS4uID0gNy43MDE2MzQ2NzgpLAojYnV0IEkgc3VzcGVjdCBkaWZmIGR1ZSB0byBjb21wdXRhdGlvbmFsIHByZWNpc2lvbgp3YWdlX3RfaW4gPC0gd2FnZV90X2Yod2FnZV8wX3ZhciA9IHdhZ2VfMF9pbiwKICAgICAgICAgICAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhciA9IGdyb3d0aF9yYXRlX3NvLAogICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAxX3ZhciA9IGNvZWZfZXhwX3NvWzFdLAogICAgICAgICAgICAgICAgICAgICAgY29lZl9leHAyX3ZhciA9IGNvZWZfZXhwX3NvWzJdKQoKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgRGV3b3JtaW5nIGVmZmVjdHM6IGRpcmVjdCBhbmQgZXh0ZXJuYWxpdGllcwoKVGhlIGVzdGltYXRlZCBpbXBhY3Qgb2YgZGV3b3JtaW5nIG9uIGhvdXJzIHdvcmtlZCBjb21lcyBmcm9tIEBiYWlyZDIwMTZ3b3JtcyBhbmQgYXJlIGVzdGltYXRlZCBzZXBhcmF0ZWx5IGZvciBtZW4gKCRcbGFtYmRhX3sxLG1hbGV9JCkgYW5kIHdvbWVuICgkXGxhbWJkYV97MSxmZW1hbGV9JCkuIFRoZXNlIHR3byBwYXJhbWV0ZXJzIGFyZSBjb21iaW5lZCB3aXRoIGEgc2ltcGxlIG1lYW4gaW4gdGhlIGFuYWx5c2lzLgoKVGhlIGVzdGltYXRlZCBleHRlcm5hbGl0eSBlZmZlY3QgKCRcbGFtYmRhX3syfSQpIHJlZmxlY3RzIHRoZSBhZGRpdGlvbmFsIGhvdXJzIHdvcmtlZCBkdWUgdG8gaW5kaXZpZHVhbHMgd2hvIGRpZCBub3QgcmVjZWl2ZSB0aGUgdHJlYXRtZW50IGJ1dCBzdGlsbCBzYXcgcmVkdWN0aW9ucyBpbiB0aGUgbGlrZWxpaG9vZCBvZiBpbmZlY3Rpb24gZHVlIHRvIGxvd2VyIHdvcm0gcHJldmFsZW5jZSBpbiB0aGVpciBjb21tdW5pdHkuICBOb3RlIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IGVzdGltYXRlZCBieSBnZW5kZXIsIHNvIHdlIHJlcGVhdCBpdHMgdmFsdWUgdHdvIHRpbWVzLiBBbGwgdGhlIGNvbXBvbmVudHMgdG8gdGhlIGVxdWF0aW9uIFxccmVme2VxOmByIGVxdWF0aW9uSW5kZXggKyAxYH0gY29tZSBmcm9tIEBiYWlyZDIwMTZ3b3Jtcy4gVGhlIGV4dGVybmFsaXRpZXMgZWZmZWN0cyBhcmUgYWRqdXN0ZWQgYnkgdGhlIGNvdmVyYWdlIGFuZCBzYXR1cmF0aW9uIG9mIHRoZSBvcmlnaW5hbCBzdHVkeS4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcbGFtYmRhX3sxfSA9IFxmcmFjezF9ezJ9IFxsYW1iZGFfezEsbWFsZX0gKyBcZnJhY3sxfXsyfSBcbGFtYmRhX3sxLGZlbWFsZX1cXApgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJFxsYW1iZGFfMSQ6IGF2ZXJhZ2UgaW1wYWN0IG9mIGRld29ybWluZyBvbiBob3VycyB3b3JrZWQgZm9yIGJvdGggbWVuIGFuZCB3b21lbiAgCi0gJFxsYW1iZGFfezEsbWFsZX0kOiBhdmVyYWdlIGltcGFjdCBvZiBkZXdvcm1pbmcgb24gaG91cnMgd29ya2VkIGZvciBtZW4gICAKLSAkXGxhbWJkYV97MSwgZmVtYWxlfSQ6IGF2ZXJhZ2UgaW1wYWN0IG9mIGRld29ybWluZyBvbiBob3VycyB3b3JrZWQgZm9yIHdvbWVuICAKCgpgYGB7ciBsYW1iZGFzLCBlY2hvPXByaW50X2NvZGV9CiMgLSBpbnB1dHM6IGRpcmVjdCAobGFtYmRhMV9zbyksIGFuZCBpbmRpcmVjdCAobGFtYmRhMl9zbykgdHJlYXRtZW50IGVmZmVjdHMgYnkgZ2VuZGVyCiMgLSBvdXRwdXRzOiBzaW1wbGUgYXZlcmFnZSBvZiBkaXJlY3QgYW5kIGluZGlyZWN0IHRyZWF0bWVudCBlZmYuCmNodW5rX2xhbWJkYXM8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgbGFtYmRhMV9pbl9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9zbykgewogICAgICAgIHJlcCgwLjUgKiBsYW1iZGExX3ZhclsxXSArIDAuNSAqbGFtYmRhMV92YXJbMl0sIDIpCiAgICB9CiAgICBsYW1iZGEyX2luX2YgPC0gZnVuY3Rpb24obGFtYmRhMl92YXIgPSBsYW1iZGEyX3NvKXsKICAgICAgICByZXAobGFtYmRhMl92YXIsIDIpCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgibGFtYmRhMV9pbl9mIiA9IGxhbWJkYTFfaW5fZiwKICAgICAgICAgICAgICAgICJsYW1iZGEyX2luX2YiID0gbGFtYmRhMl9pbl9mICkgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhcygpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OgpsYW1iZGExX2luIDwtIGxhbWJkYTFfaW5fZigpCmxhbWJkYTJfaW4gPC0gbGFtYmRhMl9pbl9mKCkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgQ292ZXJhZ2UgYW5kIHNhdHVyYXRpb24gb2YgdGhlIG9yaWdpbmFsIHN0dWR5CgpUaGUgY292ZXJhZ2UgKCRSJCkgaXMgZGVmaW5lZCBhcyB0aGUgZnJhY3Rpb24sIGFtb25nIGFsbCBuZWlnaGJvcmluZyBzY2hvb2xzICh3aXRoaW4gNiBrbSksIHRoYXQgd2VyZSB0cmVhdGVkIHdpdGhpbiB0aGUgc3R1ZHkuIFNpbmNlIHRoZSB0cmVhdG1lbnQgd2FzIGFwcGxpZWQgdG8gYXBwcm94aW1hdGVseSB0d28gdGhpcmRzIG9mIHRoZSBwb3B1bGF0aW9uLCAkUiQgaXMgc2V0IHRvOiAkUiAgPSBgciByb3VuZChjb3ZlcmFnZV9zbywgMilgJFteNl0uICAKClRoZSBzYXR1cmF0aW9uIG9mIHRoZSBpbnRlcnZlbnRpb24sICRwJCwgbWVhc3VyZXMgdGhlIGZyYWN0aW9uIG9mIHRoZSBwb3B1bGF0aW9uIHRoYXQgaXMgZWZmZWN0aXZlbHkgdXNpbmcgdGhlIHRyZWF0bWVudC4gSXQgaXMgZGVmaW5lZCBhcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHRyZWF0bWVudCB0YWtlLXVwIHVuZGVyIGEgZnVsbCBzdWJzaWR5IGZvciBkZXdvcm1pbmcgYW5kIHRoZSB0YWtlLXVwIHVuZGVyIHplcm8gc3Vic2lkeS4gICAKCgpbXjZdOiBMYXN0IHBhcmFncmFwaCBvZiBwYWdlIDkoMTY0NSkgb2YgQGJhaXJkMjAxNndvcm1zCgoKRm9yIHRoaXMgc2V0dGluZyBAa3JlbWVyMjAwN2lsbHVzaW9uIChQYWdlIDQ4LCBUYWJsZSAxLCBQYW5lbCBDLCBDb2wgMSwgUm93IDMpIGVzdGltYXRlZCB0aGF0IHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgKCRRKGZ1bGwpJCkgd2FzIGByIHFfZnVsbF9zb2AuIE1pZ3VlbCBhbmQgS3JlbWVyICgyMDA0KSAoVGFibGUgMyBhbmQgZm9vdG5vdGUgMTgpIG9ic2VydmVkIG1pbmltYWwgdG8gbm8gdGFrZS11cCB3aXRob3V0IHN1YnNpZHkgKCRRKDApJCksIGhlbmNlIGl0IGlzIGFzc2lnbmVkIHRoZSB2YWx1ZSBvZiBgciBxX3plcm9fc29gLiAgCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KcCA9IFIgXHRpbWVzIFEoZnVsbCkgICsgKDEgLSBSKSBcdGltZXMgUSgwKQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJHAkOiBzYXR1cmF0aW9uLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKLSAkUiQ6IGNvdmVyYWdlLCBtZWFzdXJlcyB0aGUgZnJhY3Rpb24gb2YgdGhlIHBvcHVsYXRpb24gdGhhdCBpcyBlZmZlY3RpdmVseSB1c2luZyB0aGUgdHJlYXRtZW50ICAKLSAkUShmdWxsKSQ6IHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgIAotICRRKDApJDogdGFrZS11cCB3aXRob3V0IHN1YnNpZHkgIAoKCmBgYHtyIGNvdmVyYWdlLWFuZC1zYXR1cmF0aW9uLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogY292ZXJhZ2UgKGNvdmVyYWdlX3NvKSwgdGFrZS11cCB3aXRoIGZ1bGwgc3Vic2lkeSAocV9mdWxsX3NvKSwgYW5kCiMgdGFrZS11cCB3aXRoIG5vIHN1YnNpZHkgKHFfemVyb19zbykKIyAtIG91dHB1dHM6IHNhdHVyYXRpb24gKHNhdHVyYXRpb25faW4pCmNodW5rX2NvdmVyYWdlIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogIHNhdHVyYXRpb25faW5fZiA8LSBmdW5jdGlvbihjb3ZlcmFnZV92YXIgPSBjb3ZlcmFnZV9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9mdWxsX3ZhciA9IHFfZnVsbF9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV96ZXJvX3ZhciA9IHFfemVyb19zbyl7CiAgICAgIHNhdHVyYXRpb25faW4gPC0gY292ZXJhZ2Vfc28gKiBxX2Z1bGxfc28gKyAoIDEgLSBjb3ZlcmFnZV9zbyApICogcV96ZXJvX3NvCiAgICAgIHJldHVybihsaXN0KCJzYXR1cmF0aW9uX2luIiA9IHNhdHVyYXRpb25faW4pKQogICAgfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybihsaXN0KCJzYXR1cmF0aW9uX2luX2YiID0gc2F0dXJhdGlvbl9pbl9mKSkgICAKfQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX2NvdmVyYWdlKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CnNhdHVyYXRpb25faW4gPC0gc2F0dXJhdGlvbl9pbl9mKCkkc2F0dXJhdGlvbl9pbgoKIyBDb21wdXRpbmcgdmFsdWVzIGZvciBpbmxpbmUgdGV4dDoKCiMgcHZfYmVuZWYKIyDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMV9mCiMgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCBkZWx0YV9lZF9maW5hbF9mCiMgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCBzYXR1cmF0aW9uX2luX2YKIyB8ICAgICAg4pSU4pSA4pSA4pSA4pSAIHdhZ2VfdF9mKCkKIyB8ICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCB3YWdlXzBfZigpCiMgfCAgICAgIHwgICAgICAgICAgICAKIyB8ICAgICAg4pSc4pSA4pSA4pSA4pSAIGxhbWJkYTFfaW5fZigpCiMgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGEyX2luX2YoKQojIOKUlOKUgOKUgOKUgOKUgCBpbnRlcmVzdF9mKCkKCmVhcm5pbmdzX25vX2V4dF9pbiA8LSBlYXJuaW5nc19hcHAxX2YoCiAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IDAsCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKZWFybmluZ3NfeWVzX2V4dF9pbiA8LSBlYXJuaW5nc19hcHAxX2YoCiAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKcHZfYmVuZWZfbm9fZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKCnB2X2JlbmVmX3llc19leHRfaW4gPC0gcHZfYmVuZWZfZigKICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKYGBgCgo8L2RldGFpbHM+Cjxicj4KCiMjIyMgQXNzZXNzaW5nIGNvbXB1dGF0aW9uYWwgcmVwcm9kdWNpYmlsaXR5IG9mIG9yaWdpbmFsIHJlc3VsdHMgIAoKV2l0aG91dCBleHRlcm5hbGl0aWVzLCB0aGUgb3JpZ2luYWwgYW5hbHlzaXMgKEBiYWlyZDIwMTZ3b3Jtcykgb2J0YWlucyBhIHByZXNlbnQgdmFsdWUgb2YgYmVuZWZpdHMgb2YgYHIgZGZfcmVzZWFyY2hfc28kcGFyYW1bMV1gICh0YWJsZSBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZW51bVsxXWAsIGNvbHVtbiBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9jb2xbMV1gLCBhbmQgcm93IGByIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1sxXWApLiBJbmNsdWRpbmcgZXh0ZXJuYWxpdGllcywgdGhleSBvYnRhaW4gYSBwcmVzZW50IHZhbHVlIG9mIGJlbmVmaXRzIG9mIGByIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzNdYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bM11gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzNdYCwgYW5kIHJvdyBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbM11gKS4gRm9sbG93aW5nIHRoZSBzdGVwcyBkZXNjcmliZWQgaW4gdGhpcyBzZWN0aW9uLCB0aGlzIGFuYWx5c2lzIG9idGFpbnMgdGhlIHNhbWUgcmVzdWx0IChgciBwdl9iZW5lZl9ub19leHRfaW5gIGFuZCBgciBwdl9iZW5lZl95ZXNfZXh0X2luYCByZXNwZWN0aXZlbHkgd2l0aG91dCByb3VuZGluZykuICAKCgpgYGB7ciBzdW0tdGFibGVzMywgcHVybD1GQUxTRSwgZWNobz1GQUxTRSwgZXZhbD1zaG93X3N1bW1hcnlfdGFibGVzfQp0YWJsZV8xWzEsM10gPC0gcGFzdGUwKCIkUj0iICwgcm91bmQoY292ZXJhZ2Vfc28sMiksICIkIikKdGFibGVfMVsxLDJdIDwtIHBhc3RlMCgiJFxcbGFtYmRhXzE9IiAsIGxhbWJkYTFfaW5fZihsYW1iZGExX3ZhciA9IGxhbWJkYTFfc28pWzFdLCAiJCIpCnRhYmxlXzFbMiwyXSA8LSBwYXN0ZTAoIiRcXGxhbWJkYV8yPSIgLCBsYW1iZGEyX3NvLCAiJCIpCgp0YWJsZV8xWzMsMl0gPC0gcGFzdGUwKCIkXFxoYXR7XFxiZXRhfV8xPSIgLCByb3VuZChjb2VmX2V4cF9zb1sxXSwyKSwgIiQiKQp0YWJsZV8xWzQsMl0gPC0gcGFzdGUwKCIkXFxoYXR7XFxiZXRhfV8yPSIgLCByb3VuZChjb2VmX2V4cF9zb1syXSwyKSwgIiQiKQoKI3dfe3NlfSBjb3BpZWQgZnJvbSA1ODkgaW4gd2FnZV8wX2luIGJ1dCB3YWdlX3NlIGlzIG5ldmVyIGNhbGN1bGF0ZWQgb3V0c2lkZSB0aGUgZm4KCnRhYmxlXzEgPC1yYmluZCh0YWJsZV8xLAogICAgICAgICAgICAgICAgYyggcGFzdGUwKCIkd197d3d9PSIgLCByb3VuZCh3YWdlX3d3X3NvLDIpLCAiJCIpLCBwYXN0ZTAoIiRRKGZ1bGwpPSIgLCBxX2Z1bGxfc28sICIkIiksICIiKSwKICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJHdfe3NlfT0iICwgcm91bmQocHJvZml0c19zZV9zbyAvICg0LjUgKiBob3Vyc19zZV9jb25kX3NvKSwyKSwgIiQiKSAsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiRRKDApPSIgLCBxX3plcm9fc28sICIkIiksICIiKSwKICAgICAgICAgICAgICAgIGMoIHBhc3RlMCgiJGhfe2FnfT0iICwgaG91cnNfYWdfc28sICIkIiksICIiLCAiIiksCiAgICAgICAgICAgICAgICBjKCBwYXN0ZTAoIiRoX3t3d309IiAsIGhvdXJzX3d3X3NvLCAiJCIpLCAiIiwgIiIpLAogICAgICAgICAgICAgICAgYyggcGFzdGUwKCIkaF97c2V9PSIgLCBob3Vyc19zZV9zbywgIiQiKSwgIiIsICIiKQogICAgICAgICAgICAgICAgKQoKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJFxcRGVsdGEgV197dH0gPSB3X3t0fVxcbGVmdCggXFxsYW1iZGFfezF9ICsgXFxmcmFje3AgXFxsYW1iZGFfezJ9fXtSfSBcXHJpZ2h0KSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkd190ID0gIFxcdGV4dHsjd2Vla3N9IFxcdGltZXMgd18wICgxICsgZylee1hwfSgxICsgXFxoYXR7XFxiZXRhXzF9IFhwICsgXFxoYXR7XFxiZXRhXzJ9IFhwXjIpJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiR3XzAgPSBcXGZyYWN7MX17ZXh9IFxcc3VtX3tsIFxcaW4gXFx7YWcsIHd3LCBzZVxcfX13X3tsfVxcYWxwaGFfe2x9CiAgICAgICAgICAgICAgICAgICAgIFxccXVhZCBcXHRleHR7d2l0aDogfSBcXGFscGhhX3tsfT0gXFxmcmFjeyBoX3tsfX17aF97YWd9ICsgaF97d3d9ICsgaF97c2V9fSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkd197c2V9ID0gXFxmcmFje1xcdGV4dHtNb250aGx5IHNlbGYtZW1wbG95ZWQgcHJvZml0c319ezQuNSBcXHRpbWVzIEVbaF97c2V9fGhfe3NlfSBcXHRleHR7Pn0gMF19JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkXFxsYW1iZGFfezF9ID0gXFxmcmFjezF9ezJ9IFxcbGFtYmRhX3sxLG1hbGV9ICsgXFxmcmFjezF9ezJ9IFxcbGFtYmRhX3sxLGZlbWFsZX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkgKQoKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJHAgPSBSIFxcdGltZXMgUShmdWxsKSAgKyAoMSAtIFIpIFxcdGltZXMgUSgwKSQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKCiMjIyBDb3N0cwoKVGhlIGNvc3RzIGFyZSBhIGNvbWJpbmF0aW9uIG9mIGRpcmVjdCBjb3N0cyBvZiBtYXNzIGRld29ybWluZyAocmVsYXRpdmUgdG8gdGhlIHN0YXR1cyBxdW8sIHdoaWNoIGlzIG5vIHN1YnNpZHkgZm9yIGRld29ybWluZykgYW5kIGluZGlyZWN0IGNvc3RzIG9uIHRoZSBlZHVjYXRpb24gc3lzdGVtIGR1ZSB0byB0aGUgYWRkaXRpb25hbCB0aW1lIHRyZWF0ZWQgaW5kaXZpZHVhbHMgc3BlbmQgaW4gc2Nob29sLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+ClxiZWdpbntlcXVhdGlvbn0KQyA9ICBcbGVmdCggU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXHJpZ2h0KSArIEsgXHN1bV97dD0wfV57NTB9IFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBcRGVsdGEgXG92ZXJsaW5le0V9X3t0fShTMSxTMikKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6CgotICRTXzIkOiBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgZGV3b3JtaW5nIGludGVydmVudGlvbiAgCi0gJFNfMSQ6IHBlci1jYXBpdGEgY29zdHMgb2YgZGV3b3JtaW5nIGlmIHRoZSBnb3Zlcm5tZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZvciBkZXdvcm1pbmcgIAotICRRKFNfMikkOiB0YWtlLXVwIHVuZGVyIGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uICAKLSAkUShTXzEpJDogdGFrZS11cCB3aXRob3V0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZyb20gdGhlIGdvdmVybm1lbnQgIAotICRLJDogY29zdCBwZXIgc3R1ZGVudCB0byBnZXQgZWR1Y2F0aW9uICAgCi0gJFxEZWx0YSBcb3ZlcmxpbmV7RX1fe3R9KFMxLCBTMikkOiBlc3RpbWF0ZWQgaW5jcmVhc2UgaW4gc2Nob29sIGF0dGVuZGFuY2UgIAoKYGBge3IgY29zdDIsIGVjaG8gPSBwcmludF9jb2RlfQojIC0gaW5wdXRzOiBwZXJpb2RzIChwZXJpb2RzX3NvKSwgYWRkaXRpb25hbCBlZHVjYXRpb24gKGRlbHRhX2VkX2ZpbmFsX2luKSwKIyAgZGlzY291bnQgcmF0ZSAoaW50ZXJlc3QpICh2YXJpZXMgYnkgYXBwcm9hY2gpLCBjb3N0IHBlciBzdHVkZW50CiMgIChjb3N0X3Blcl9zdHVkZW50X2luKSwgY29zdCBwZXIgdHJlYXRtZW50IChzMl9pbiksIHRha2UtdXAgd2l0aCB0cmVhdG1lbnQKIyAgKHEyX2luKQojIC0gb3V0cHV0czogcHJlc2VudCB2YWx1ZSBvZiBhbGwgY29zdHMgKHB2X2Nvc3RzX2YpCmNodW5rX2Nvc3QyIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogIHB2X2Nvc3RzX2YgPC0gZnVuY3Rpb24oCiAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28sCiAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgIGludGVyZXN0X3JfdmFyID0gTlVMTCwKICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IGNvc3RfcGVyX3N0dWRlbnRfaW4sCiAgICBzMV92YXIgPSAwLAogICAgcTFfdmFyID0gMCwKICAgIHMyX3ZhciA9IHMyX2luLAogICAgcTJfdmFyID0gcTJfaW4pIHsKICAgICAgICBpbmRleF90IDwtIDA6cGVyaW9kc192YXIKICAgICAgICAjIEVmZmVjdHMgb3ZlciA5IHllYXJzIG9mIGVkdWNhdGlvbiAocG9zdCB0cmVhdG1lbnQpCiAgICAgICAgZGVsdGFfZWRfcyA8LSBjKDAsIGRlbHRhX2VkX3ZhciwgcmVwKDAsNDEpKQogICAgICAgIChzMl92YXIgKiBxMl92YXIgIC0gczFfdmFyICogcTFfdmFyKSArCiAgICAgICAgICBzdW0oICggMSAvICgxICsgaW50ZXJlc3Rfcl92YXIpICleaW5kZXhfdCAqCiAgICAgICAgICAgICAgICAgZGVsdGFfZWRfcyAqIGNvc3Rfb2Zfc2Nob29saW5nX3ZhcikKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgicHZfY29zdHNfZiIgPSBwdl9jb3N0c19mKSkgICAgIyBUcnkgdG8gcmV0dXJuIG9ubHkgZnVuY3Rpb25zCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19jb3N0MigpLC5HbG9iYWxFbnYpICkKCiMjIyMjIEV4ZWN1dGUgdmFsdWVzIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUgd2hlbiBuZWVkZWQgZm9yIHRoZSB0ZXh0OiAgCmBgYAoKPC9kZXRhaWxzPgo8YnI+CgojIyMjIERpcmVjdCBjb3N0czogaW5jcmVhc2UgaW4gZGV3b3JtaW5nIGNvc3RzCgpEaXJlY3QgZGV3b3JtaW5nIGNvc3RzICgkREMkKSBhcmUgZGVmaW5lZCBhcyB0aGUgdGFrZS11cCB1bmRlciBhIG1hc3MgZGV3b3JtaW5nIGludGVydmVudGlvbiAoJFFfezJ9JCksIHRpbWVzIHRoZSBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgaW50ZXJ2ZW50aW9uICgkU197Mn0kKS4gVGhlc2UgY29zdHMgYXJlIGNvbXBhcmVkIHRvIGEgc3RhdHVzIHF1byBzY2VuYXJpbyB3aGVyZSB0aGUgZ292ZXJubWVudCBkb2VzIG5vdCBwcm92aWRlIGFueSBhZGRpdGlvbmFsIHJlc291cmNlcyBmb3IgZGV3b3JtaW5nLiBUaGlzIGFuYWx5c2lzIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBubyBzdWJzaWR5IGZvciBkZXdvcm1pbmcgdW5kZXIgdGhlIHN0YXR1cyBxdW8uICAgIAoKIyMjIyMgQ29tcGxldGUgc3Vic2lkeSB0byBwZXIgY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZwoKV2l0aCBjb21wbGV0ZSBzdWJzaWR5LCB0aGUgcmVsZXZhbnQgY29zdHMgcmVwcmVzZW50IHRoZSB0b3RhbCBkaXJlY3QgY29zdHMgb2YgZGV3b3JtaW5nIGluIFVTRC4gVGhlIHRha2UtdXAgd2l0aCBmdWxsIHN1YnNpZHkgKCRRXzIkKSBjb21lcyBmcm9tIGEgcHJldmlvdXMgc3R1ZHkgW0BrcmVtZXIyMDA3aWxsdXNpb25dIGFuZCB0YWtlcyB0aGUgdmFsdWUgb2YgYHIgcV9mdWxsX3NvYC4KCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpTX3syfSA9IFxmcmFje1x0ZXh0e0Nvc3QgcGVyIHBlcnNvbiBwZXIgeWVhciAoS1NIKX0JfXtleH1cdGltZXMgXHRleHR7QWRkaXRpb25hbCB5ZWFycyBvZiB0cmVhdG1lbnR9IFxcCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCmBgYHtyIHVuaXRfY29zdHMyLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdW5pdCBjb3N0cyBpbiBsb2NhbCBjdXJyZW5jeSAodW5pdF9jb3N0X2xvY2FsX3NvKSwgZXhjaGFuZ2UgcmF0ZQojICAoZXhfcmF0ZV9zbyksIHllYXJzIG9mIHRyZWF0bWVudCAoeWVhcnNfb2ZfdHJlYXRfMF9zbykKIyAtIG91dHB1dHM6IHVuaXQgY29zdHMgb2YgdHJlYXRtZW50IChzMl9mKQpjaHVua191bml0X2Nvc3RzMiA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICAgIHMyX2YgPC0gZnVuY3Rpb24odW5pdF9jb3N0X2xvY2FsX3ZhciA9IHVuaXRfY29zdF9sb2NhbF9zbywKICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIgPSBleF9yYXRlX3NvLAogICAgICAgICAgICAgICAgICAgICB5ZWFyc19vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3NvKSB7CiAgICAgICggdW5pdF9jb3N0X2xvY2FsX3ZhciAvIGV4X3JhdGVfdmFyICkgKiB5ZWFyc19vZl90cmVhdF92YXIKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgiczJfZiIgPSBzMl9mKSApCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua191bml0X2Nvc3RzMigpLC5HbG9iYWxFbnYpICkKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CnMyX2luIDwtIHMyX2YoKQpgYGAKCjwvZGV0YWlscz4KPGJyPgoKCiMjIyMgSW5kaXJlY3QgY29zdHM6IGFkZGl0aW9uYWwgeWVhcnMgb2YgZWR1Y2F0aW9uIGFuZCBpdHMgY29zdHMgZm9yIGdvdmVybm1lbnQKCkFzIGEgcmVzdWx0IG9mIGRld29ybWluZyB0cmVhdG1lbnQsIHRoZXJlIGlzIGFuIGVzdGltYXRlZCBpbmNyZWFzZSBpbiBzY2hvb2wgYXR0ZW5kYW5jZSwgd2hpY2ggaXMgbXVsdGlwbGllZCBieSB0aGUgY29zdCBvZiBlZHVjYXRpb24gcGVyIHN0dWRlbnQgdG8gY2FsY3VsYXRlIHRoZSBhZGRpdGlvbmFsIGluZGlyZWN0IGNvc3Qgb24gdGhlIGVkdWNhdGlvbiBzeXN0ZW0gaW1wb3NlZCBieSBhIHRyZWF0ZWQgaW5kaXZpZHVhbC4gVGhlIGFkZGl0aW9uYWwgY29zdHMgb24gZWR1Y2F0aW9uIGFyZSBjb21wdXRlZCBhcyBmb2xsb3dzOiBmaXJzdCBjb21wdXRlIGEgY29zdCBwZXIgc3R1ZGVudCAoJEskKS4gVGhpcyBpcyBjYWxjdWxhdGVkIGFzIHRoZSBzYWxhcnkgb2YgdGhlIHRlYWNoZXIgcGx1cyBiZW5lZml0cywgZGl2aWRlZCBieSB0aGUgYXZlcmFnZSBudW1iZXIgb2Ygc3R1ZGVudHMgcGVyIHRlYWNoZXIuIFNlY29uZCwgdGhlIGNvc3QgcGVyIHN0dWRlbnQgaXMgbXVsdGlwbGllZCBieSB0aGUgZXN0aW1hdGVkIGluY3JlYXNlIGluIHNjaG9vbCBhdHRlbmRhbmNlICgkXERlbHRhIFxvdmVybGluZXtFfV97dH0oUzEsUzIpJCkuIEZvciB0aGlzIHdlIHVzZSBhIHNlcmllcyBvZiBlc3RpbWF0ZWQgZWZmZWN0cywgaW5jbHVkaW5nIHRoZSBhZGRpdGlvbmFsIGRpcmVjdCBpbmNyZWFzZSBpbiBzZWNvbmRhcnkgc2Nob29saW5nIGZyb20gMTk5OSB0byAyMDA3IG9idGFpbmVkIGZyb20gYW4gYWRkaXRpb25hbCBhbmFseXNpcyByZWxhdGVkIHRvIEBiYWlyZDIwMTZ3b3Jtcy4gVGhpcyBzZXJpZXMgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhlIGV4dGVybmFsaXR5IGVmZmVjdHMuIFRvIGluY29ycG9yYXRlIGV4dGVybmFsaXR5IGVmZmVjdHMsIHdlIHdvdWxkIG5lZWQgYW5vdGhlciBzZXJpZXMgKGZyb20gdGhlIHNhbWUgc291cmNlKSB0aGF0IGVzdGltYXRlcyB0aGUgYWRkaXRpb25hbCBzZWNvbmRhcnkgc2Nob29saW5nIGluY3JlYXNlIGR1ZSB0byB0aGUgZXh0ZXJuYWxpdHkgaW4gb3JkZXIgdG8gYWRkIGl0IHRvIHRoZSBvcmlnaW5hbCBzZXJpZXMuCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KClxiZWdpbntlcXVhdGlvbn0KSyA9IFxmcmFje1x0ZXh0e3RlYWNoZXIgc2FsYXJ5fSArIFx0ZXh0e3RlYWNoZXIgYmVuZWZpdHN9fXtcdGV4dHsjIFN0dWRlbnRzfX0KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKCmBgYHtyIGVkLWNvc3RzLCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdGVhY2hlciBzYWxhcnkgKHRlYWNoX3NhbF9zbykgYW5kIGJlbmVmaXRzICh0ZWFjaF9iZW5fc28pLCBudW1iZXIKIyBvZiBzdHVkZW50cyAobl9zdHVkZW50c19zbyksIGluY2x1ZGUgZXh0ZXJuYWxpdGllcyAoaW5jbHVkZV9leHRfc28pLCBleHRyYSBlZAojIHdpdGhvdXQgZXh0IChkZWx0YV9lZF9zbyksIGFuZCBleHRyYSBlZCBkdWUgdG8gZXh0IChkZWx0YV9lZF9leHRfc28pCiMgLSBvdXRwdXRzOiBjb3N0IHBlciBzdHVkZW50IChjb3N0X3Blcl9zdHVkZW50X2YpLCBhbmQgdG90YWwgYWRkaXRpb25hbAojIGVkdWNhdGlvbiAoZGVsdGFfZWRfZmluYWxfZikKY2h1bmtfZWRjb3N0cyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgY29zdF9wZXJfc3R1ZGVudF9mIDwtIGZ1bmN0aW9uKHRlYWNoX3NhbF92YXIgPSB0ZWFjaF9zYWxfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIgPSB0ZWFjaF9iZW5fc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyID0gbl9zdHVkZW50c19zbykgewogICAgICAgICh0ZWFjaF9zYWxfdmFyICsgdGVhY2hfYmVuX3ZhcikgLyBuX3N0dWRlbnRzX3ZhcgogICAgfQoKICAgIGRlbHRhX2VkX2ZpbmFsX2YgPC0gZnVuY3Rpb24oaW5jbHVkZV9leHRfdmFyID0gaW5jbHVkZV9leHRfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyID0gZGVsdGFfZWRfZXh0X3NvKXsKICAgICAgICBpZiAoaW5jbHVkZV9leHRfdmFyID09IFRSVUUpewogICAgICAgICAgICBkZWx0YV9lZF9maW5hbF9pbiA8LSAgZGVsdGFfZWRfZXh0X3ZhclssMV0gKyBkZWx0YV9lZF92YXJbLDFdCiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGRlbHRhX2VkX2ZpbmFsX2luIDwtIGRlbHRhX2VkX3ZhclssMV0KICAgICAgICB9CiAgICAgICAgcmV0dXJuKGRlbHRhX2VkX2ZpbmFsX2luKQogICAgfQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybihsaXN0KCJjb3N0X3Blcl9zdHVkZW50X2YiID0gY29zdF9wZXJfc3R1ZGVudF9mLAogICAgICAgICAgICAgICAgImRlbHRhX2VkX2ZpbmFsX2YiID0gZGVsdGFfZWRfZmluYWxfZikpCn0KaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19lZGNvc3RzKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmNvc3RfcGVyX3N0dWRlbnRfaW4gPC0gY29zdF9wZXJfc3R1ZGVudF9mKCkKZGVsdGFfZWRfZmluYWxfbm9fZXh0X2luIDwtIGRlbHRhX2VkX2ZpbmFsX2YoaW5jbHVkZV9leHRfdmFyID0gRkFMU0UpCmRlbHRhX2VkX2ZpbmFsX3llc19leHRfaW4gPC0gZGVsdGFfZWRfZmluYWxfZihpbmNsdWRlX2V4dF92YXIgPSBUUlVFKQoKIyBDb21wdXRpbmcgdmFsdWVzIGZvciBpbmxpbmUgdGV4dDoKCiMgcHZfY29zdHNfZgojICDilJzilIDilIDilIDilIAgZGVsdGFfZWRfZmluYWxfZgojICDilJzilIDilIDilIDilIAgaW50ZXJlc3RfZgojICDilJTilIDilIDilIDilIAgY29zdF9wZXJfc3R1ZGVudF9mCiMgIHwgICAgICDilJTilIDilIDilIDilIAgeAojICDilJzilIDilIDilIDilIAgczJfZgojICDilJTilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCgpwdl9jb3N0X25vX2V4dF9pbiA8LSBwdl9jb3N0c19mKAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28sCiAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2ZpbmFsX25vX2V4dF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gMCwKICAgICAgczJfdmFyID0gczJfaW4sCiAgICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICAgKQoKcHZfY29zdF95ZXNfZXh0X2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbywKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfZmluYWxfeWVzX2V4dF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gMCwKICAgICAgczJfdmFyID0gczJfaW4sCiAgICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICAgKQpgYGAKCjwvZGV0YWlscz4KPGJyPgoKIyMjIyBBc3Nlc3NpbmcgY29tcHV0YXRpb25hbCByZXByb2R1Y2liaWxpdHkgb2Ygb3JpZ2luYWwgcmVzdWx0cyAgCgpXaXRob3V0IGV4dGVybmFsaXRpZXMsIHRoZSBvcmlnaW5hbCBhbmFseXNpcyAoQGJhaXJkMjAxNndvcm1zKSBvYnRhaW5zIGEgcHJlc2VudCB2YWx1ZSBvZiBjb3N0cyBvZiBgciBkZl9yZXNlYXJjaF9zbyRwYXJhbVs1XSArIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzZdYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bNV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzVdYCwgYW5kIGFkZGluZyByb3dzIGByIHBhc3RlMChkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbNV0sICIgYW5kICIsIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s2XSlgKS4gSW5jbHVkaW5nIGV4dGVybmFsaXRpZXMsIHRoZXkgb2J0YWluIGEgcHJlc2VudCB2YWx1ZSBvZiBiZW5lZml0cyBvZiAgYHIgZGZfcmVzZWFyY2hfc28kcGFyYW1bNV0gKyBkZl9yZXNlYXJjaF9zbyRwYXJhbVs2XSArIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzddYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bNV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzVdYCwgYW5kIGFkZGluZyByb3dzIGByIHBhc3RlMChkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbNV0sICIgYW5kICIsIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s2XSwiIGFuZCAiLCBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbN10pYCkuIEZvbGxvd2luZyB0aGUgc3RlcHMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiwgdGhpcyBhbmFseXNpcyBvYnRhaW5zIHRoZSBzYW1lIHJlc3VsdCAoYHIgcHZfY29zdF9ub19leHRfaW5gIGFuZCBgciBwdl9jb3N0X3llc19leHRfaW5gIHJlc3BlY3RpdmVseSB3aXRob3V0IHJvdW5kaW5nKS4gIAoKYGBge3IsIGV2YWw9RkFMU0UsZWNobz1GQUxTRSwgcHVybD1GQUxTRX0KIyBOdW1iZXJzIGFyZSByZXByb2R1Y2VkLCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgIEJhaXJkIGV0IGFsLCBwcmVzZW50cyB0aGVtIGluIGEgZGlmZmVyZW50IHdheS4KIyBFcXVpdmFsZW5jZSBiZWxvdzoKIyBCYWlyZCBldCBhbCAyMDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVyZQojIDE0Mi40MyAtIDEwLjcxIC0gMS4wNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxMzAuNjUKIyAoMTQyLjQzICogMC4xNjU3NSAtIDEwLjcxID0gMTIuODk3NzcpIC0gMS4wNyAgICAgICAgICAgID0gMTEuODI3NzcKIyA3NjYuODEgLSAxMC43MSAtIDEzLjQyIC0gMS4wNyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gNzQxLjYxCiMgKDc2Ni44MSAqIDAuMTY1NzUgLSAxMC43MSAtIDEzLjQyID0gMTAyLjk2ODgpIC0gMS4wNyAgICA9IDEwMS44OTg4CmBgYAoKYGBge3Igc3VtLXRhYmxlczE2LCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9Cgp0YWJsZV8xWzcsIDJdIDwtIHBhc3RlMCgiJEs9IiAsIHJvdW5kKGNvc3RfcGVyX3N0dWRlbnRfZigpLDIpLCAiJCIpCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRLID0gXFxmcmFje1xcdGV4dHt0ZWFjaGVyIHNhbGFyeX0gKyBcXHRleHR7dGVhY2hlciBiZW5lZml0c319e1xcdGV4dHsjIFN0dWRlbnRzfX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKIyMgQXBwcm9hY2ggMjogQGtscHM0CgpJbiB0aGlzIHNlY29uZCBhcHByb2FjaCwgYmVuZWZpdHMgZm9sbG93IHRoZSBzYW1lIHByaW5jaXBsZSBhcyBpbiBhcHByb2FjaCAxIChpbmNyZWFzZSBpbiBsaWZldGltZSBlYXJuaW5ncyksIGJ1dCBpdCB1c2VzIHVwZGF0ZWQgZGF0YSBvbiB0aGUgZWZmZWN0cyBvbiB0aGUgbGFib3IgbWFya2V0IG91dGNvbWVzLiBJbnN0ZWFkIG9mIHByb2plY3RpbmcgYSB0cmVuZCBvZiBlYXJuaW5ncyBpbnRvIHRoZSBmdXR1cmUgKGFmdGVyIHRoZSBlc3RpbWF0ZWQgaW1wYWN0IG9mIHRoZSAxMCB5ZWFyIGZvbGxvdy11cCksIHRoaXMgYW5hbHlzaXMgdXNlcyBhZGRpdGlvbmFsIGRhdGEgZnJvbSAxNSBhbmQgMjAgeWVhciBmb2xsb3ctdXBzIGFmdGVyIHRoZSBvcmlnaW5hbCBpbnRlcnZlbnRpb24uICBDb3N0cyBhcmUgZmFpcmx5IHNpbWlsYXIgdG8gYXBwcm9hY2ggMSwgd2l0aCB0aGUgYWRkaXRpb24gdGhhdCBpbiB0aGlzIHNlY29uZCBhcHByb2FjaCwgdGhlIGNvc3RzIGFsc28gYWNjb3VudCBmb3IgZGlzY291bnRpbmcgb2YgdGhlIHNldmVyYWwgcm91bmRzIG9mIHRyZWF0bWVudCByZXF1aXJlZCBmb3IgZWZmZWN0aXZlIGRld29ybWluZy4gIEFkZGl0aW9uYWxseSwgdGhlIGludGVyZXN0IHJhdGUgaXMgdXBkYXRlZCB0byBjdXJyZW50IHZhbHVlcyBvZiByZXR1cm4gb24gKEtlbnlhbikgZ292ZXJubWVudCBib25kcyBhbmQgaW5mbGF0aW9uLgoKCiMjIyBHYWlucyBpbiBlYXJuaW5ncwoKR2FpbnMgaW4gZWFybmluZ3MgKCRcRGVsdGEgV197dH0kKSBmcm9tIDEwLCAxNSwgYW5kIDIwIHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24gYXJlIHVzZWQgdG8gbWVhc3VyZSB0aGUgZWZmZWN0IG9mIG11bHRpcGxlIHJvdW5kcyBvZiBkZXdvcm1pbmcgb24gd2VsZmFyZSBvdmVyIHRpbWUuIFRoaXMgaXMgYW4gaW1wb3J0YW50IGRpZmZlcmVuY2UgZnJvbSBhcHByb2FjaCAxLCB3aGljaCBvbmx5IG1lYXN1cmVzIGdhaW5zIGluIGVhcm5pbmdzIGF0IHllYXIgMTAgYW5kIGV4dHJhcG9sYXRlcyB0aGVtIGludG8gdGhlIGZ1dHVyZS4gVG8gZXh0cmFwb2xhdGUgZWFybmluZ3MgYWZ0ZXIgdGhlIDIwLXllYXIgbWVhc3VyZW1lbnQsIHRoZSBhdXRob3JzIGFzc3VtZSB0aGF0IHRoZSB3ZWxmYXJlIGdhaW5zIGRpc2FwZWFyIDI1IHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24uIEhlbmNlIHRoZSB0cmVhdG1lbnQgZWZmZWN0IG92ZXIgYW4gaW5kaXZpZHVhbCdzIHdvcmtpbmcgbGlmZSBpcyB0aGUgc3VtIG9mIHRoZSB0cmVhdG1lbnQgZWZmZWN0cyBvdmVyIHRoZWlyIHdvcmtpbmcgbGlmZXRpbWVbXjhdLiBUaGlzIGFwcHJvYWNoIGFsc28gZGlzcmVnYXJkcyBleHRlcm5hbGl0eSBlZmZlY3RzIGFuZCBtZWFzdXJlcyB0aGUgZXN0aW1hdGVkIGVmZmVjdHMgZGlyZWN0bHkgb24gZWFybmluZ3MgKGFzIG9wcG9zZWQgdG8gYXBwcm9hY2ggMSB0aGF0IG1lYXN1cmVzIGVmZmVjdHMgb24gZWFybmluZ3MgaW5kaXJlY3RseSB0aHJvdWdoIGhvdXJzIHdvcmtlZCkuIFRoZSBlc3RpbWF0ZWQgdHJlYXRtZW50IGVmZmVjdHMgdGhhdCBwb29scyB5ZWFycyAxMCwgMTUsIGFuZCAyMCwgaXMgYHIgcGFzdGUwKCIkIiwgcm91bmQobWVhbihsYW1iZGExX25ld19zbyksMCkgKWAgZG9sbGFycyBwZXIgcGVyc29uIHBlciB5ZWFyLgoKR2FpbnMgaW4geWVhcmx5IGVhcm5pbmdzIHJlcHJlc2VudCB0aGUgdHJlYXRtZW50IGVmZmVjdCBvbiB3ZWxmYXJlICgkXGFscGhhXntwb29sZWR9JCksIHdoaWNoIGltcGxpY2l0bHkgdGFrZXMgaW50byBjb25zaWRlcmF0aW9uIHRoZSBsaWZlIGN5Y2xlIHByb2ZpbGUgb2Ygd2FnZXMsIGVjb25vbXl3aWRlIGdyb3d0aCwgZXRjLgoKW144XTogSW4gYW5vdGhlciBzcGVjaWZpY2F0aW9uIHRoZSBhdXRob3JzIGFzc3VtZSB0aGF0IGVmZmVjdHMgcGVyc2lzdCB0aHJvdWdoIHRoZSByZXN0IG9mIGFuIGluZGl2aWR1YWwncyB3b3JraW5nIGxpZmUuIEhlcmUgd2Ugc2VsZWN0IHRoZSBzcGVjaWZpY2F0aW9uIHRoYXQgaXMgbW9zdCBoaWdobGlnaHRlZCBpbiB0aGUgcGFwZXIgKG1vc3QgY29uc2VydmF0aXZlIHNwZWNpZmljYXRpb24pLiBUaGUgYXV0aG9ycyBhbHNvIGFuYWx5c2UgdGhlIHdlbGZhcmUgZWZmZWN0cyBvdmVyIGNvbnN1bXB0aW9uLCBidXQgZ2l2ZW4gdGhhdCB0aGV5IGRvIG5vdCBhZ2dyZWdhdGUgYm90aCBvdXRjb21lcyBpbiB0aGUgd2VsZmFyZSBlZmZlY3Qgd2Ugb25seSBjaG9vc2Ugb25lIGFuZCBmb2N1cyBvbiBlYXJuaW5nIGZvciBjb21wYXJhYmlsaXR5IHdpdGggdGhlIGFwcHJvYWNoIDEpLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpcRGVsdGEgV197dH0gPSBcbWF0aGJmezF9KDEwIDwgdCBcbGVxIDI1KVxhbHBoYV57cG9vbGVkfQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgpXaGVyZToKCi0gJFxEZWx0YSBXX3QkOiBnYWlucyBpbiBlYXJuaW5ncyBmcm9tIDEwLCAxNSwgYW5kIDIwIHllYXJzIGFmdGVyIHRoZSBpbnRlcnZlbnRpb24gIAotICRcYWxwaGFee3Bvb2xlZH0kOiBwb29sZWQgZXN0aW1hdGVkIHRyZWF0bWVudCBlZmZlY3RzIG9mIDEwLCAxNSwgMjAgeWVhcnMgYWZ0ZXIgdGhlIGludGVydmVudGlvbgoKCmBgYHtyIGRlbHRhLWVhcm5pbmdzLCBldmFsPVRSVUUsIGVjaG8gPSBwcmludF9jb2RlfQojIC0gaW5wdXRzOiBpbmRleCBmb3IgdGltZSAodF92YXIpLCBwb29sZWQgdHJlYXRtZW50IGVmZmVjdCAobGFtYmRhMV9uZXdfc29bMV0pCiMgLSBvdXRwdXRzOiBlZmZlY3Qgb24gbGlmZXRpbWUgZWFybmluZ3MgKGVhcm5pbmdzX2FwcDJfZikKY2h1bmtfbmV3X2Vhcm5pbmdzIDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCgogICAgZWFybmluZ3NfYXBwMl9mIDwtIGZ1bmN0aW9uKHRfdmFyID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19zb1sxXSkgewogICAgICAgIDEqKDEwIDw9IHRfdmFyICYgdF92YXIgPCAyNSkgKiBsYW1iZGExazFfdmFyCiAgICB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgICAgICAgICAgCiAgICByZXR1cm4obGlzdCgiZWFybmluZ3NfYXBwMl9mIiA9IGVhcm5pbmdzX2FwcDJfZikpCn0KCmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbmV3X2Vhcm5pbmdzKCksLkdsb2JhbEVudikgKQojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKZWFybmluZ3Nfbm9fZXh0X25ld19pbiA8LSBlYXJuaW5nc19hcHAyX2YodF92YXIgPSAwOjUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19zb1sxXSkKYGBgCgo8L2RldGFpbHM+Cjxicj4KCgpgYGB7ciBzdW0tdGFibGVzMTcsIHB1cmw9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9c2hvd19zdW1tYXJ5X3RhYmxlc30KCnRhYmxlXzFbOCwyXSA8LSBwYXN0ZTAoIiRcXGFscGhhXntLTFBTfT0iICwgcm91bmQobGFtYmRhMV9uZXdfc29bMV0sMiksICIkIikKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJFxcRGVsdGEgV197dH0gPSBcXG1hdGhiZnsxfSgxMCBcXGx0IHQgXFxsZXEgNTApXFxhbHBoYV57S0xQU30kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKCmtuaXRyOjprYWJsZSh0YWJsZV8yLCBjb2wubmFtZXMgPSBjKCJFcXVhdGlvbiIsICIjIiksIGNhcHRpb24gPSAiU3VtbWFyeSBvZiBlcXVhdGlvbnMgdXNlZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQoKa25pdHI6OmthYmxlKHRhYmxlXzEsIGNvbC5uYW1lcyA9IGMoIkRhdGEiLCAiUmVzZWFyY2giLCAiR3Vlc3N3b3JrIiksIGNhcHRpb24gPSAiU291cmNlczogc3VtbWFyeSBvZiBpbnB1dHMgc3BlY2lmaWVkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCmBgYAoKIyMjIENvc3RzCgojIyMjIERpcmVjdCBjb3N0czogaW5jcmVhc2UgaW4gZGV3b3JtaW5nIGNvc3RzCgpTaW1pbGFyIHRvIGFwcHJvYWNoIDEsIHRoZSBkaXJlY3QgZGV3b3JtaW5nIGNvc3RzIHVuZGVyIGFwcHJvYWNoIDIgYXJlIGNhbGN1bGF0ZWQgYnkgY29tcGFyaW5nIHRoZSBjb3N0cyB1bmRlciBhIGNvbXBsZXRlIHN1YnNpZHkgdG8gdGhlIGNvc3RzIHVuZGVyIHRoZSBzdGF0dXMgcXVvIG9mIG5vIHN1YnNpZHkuIFRoZSB0d28gbWFpbiBkaWZmZXJlbmNlcyB3aXRoIHRoZSBwcmV2aW91cyBjb3N0IGVzdGltYXRlcyBhcmUgMSkgbm93IHRoZSBkaXJlY3QgY29zdHMgYXJlIHN1bW1lZCBhbmQgZGlzY291bnRlZCBvdmVyIHRoZSB0cmVhdG1lbnQgcGVyaW9kLCBhbmQgMikgY29zdCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgYWZ0ZXIgZ2F0aGVyaW5nIG1vcmUgcmVjZW50IGZpZ3VyZXMgZnJvbSBFdmlkZW5jZSBBY3Rpb24uCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CkRDID0gXHN1bV97dD0wfV57YHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywxKS0xYH0gXGxlZnQoIFxmcmFjezF9ezEgKyByfVxyaWdodClee3R9IFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXGJpZ10KYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKClNpbmNlIHRoZSBhbmFseXNpcyBpcyBkaXNjcmV0ZSwgYW5kIHdlIGNhbm5vdCBzdW0gb3ZlciBhIG5vbi1pbnRlZ2VyLCB3ZSBmaW5kCgpcYmVnaW57ZXF1YXRpb259CkRDID0gXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcYmlnXSArIFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcYmlnXSArIFxcCi40XGxlZnQoIFxmcmFjezF9ezEgKyByfVxyaWdodCleMiBcYmlnW1NfezJ9UShTX3syfSkgLSBTX3sxfVEoU197MX0pIFxiaWddCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkREMkOiBkaXJlY3QgZGV3b3JtaW5nIGNvc3RzICAgCi0gJHIkOiBkaXNjb3VudGluZyByYXRlLCBkZWZpbmVkIGFzIHRoZSByZWFsIGludGVyZXN0IHJhdGUgIAotICRTXzIkOiBwZXItY2FwaXRhIGNvc3RzIG9mIGRld29ybWluZyB1bmRlciB0aGUgZGV3b3JtaW5nIGludGVydmVudGlvbiAgCi0gJFNfMSQ6IHBlci1jYXBpdGEgY29zdHMgb2YgZGV3b3JtaW5nIGlmIHRoZSBnb3Zlcm5tZW50IGRvZXMgbm90IHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZvciBkZXdvcm1pbmcgIAotICRRKFNfMikkOiB0YWtlLXVwIHVuZGVyIGEgbWFzcyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9uICAKLSAkUShTXzEpJDogdGFrZS11cCB3aXRob3V0IGFkZGl0aW9uYWwgcmVzb3VyY2VzIGZyb20gdGhlIGdvdmVybm1lbnQgIAoKCmBgYHtyIHVuaXRfY29zdHMyX25ldywgZWNobyA9IHByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHVuaXQgY29zdHMgKHVuaXRfY29zdF9sb2NhbF9zbyksIGV4Y2hhbmdlIHJhdGUgKGV4X3JhdGVfc28pLAojICBuZXcgaW50ZXJlc3QgcmF0ZSAoaW50ZXJlc3RfbmV3X2luKQojIC0gb3V0cHV0czogdG90YWwgdW5pdCBjb3N0cyAoczJfbmV3X2YpCmNodW5rX3VuaXRfY29zdHMyX25ldyA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAoKICBzMl9uZXdfZiA8LSBmdW5jdGlvbigKICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfbG9jYWxfc28sCiAgICBleF9yYXRlX3ZhciA9IGV4X3JhdGVfc28sCiAgICBpbnRlcmVzdF92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICB5ZWFyX29mX3RyZWF0X3ZhciA9IHllYXJzX29mX3RyZWF0X3Rfc28pIHsKICAgICAgdW5pdF9jb3N0IDwtICggdW5pdF9jb3N0X2xvY2FsX3ZhciAvIGV4X3JhdGVfdmFyICkKICAgICAgcGVyaW9kc190ZW1wIDwtIGZsb29yKHllYXJfb2ZfdHJlYXRfdmFyKQogICAgICBwYXJ0X29mX2xhc3RfeWVhcl90ZW1wIDwtIHJvdW5kKHllYXJfb2ZfdHJlYXRfdmFyIC0gcGVyaW9kc190ZW1wLCAxKQogICAgICBzdW0oCiAgICAgICAgKCB1bml0X2Nvc3QgKiAoMSArIGludGVyZXN0X3ZhcileKC0oMDpwZXJpb2RzX3RlbXApKSApICoKICAgICAgICAgICAgYyhyZXAoMSxwZXJpb2RzX3RlbXApLCBwYXJ0X29mX2xhc3RfeWVhcl90ZW1wKQogICAgICAgICkKICAgIH0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4obGlzdCgiczJfbmV3X2YiID0gczJfbmV3X2YpICkKfQppbnZpc2libGUoIGxpc3QyZW52KGNodW5rX3VuaXRfY29zdHMyX25ldygpLC5HbG9iYWxFbnYpICkKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CiMgTmV3IGNvc3RzIGFyZSBhbGwgaW4gZG9sbGFycyBzbywgd2lsbCBjb21wdXRlIHRoZW0gdXNpbmcgZXggcmF0ZSBvZiAxLgpzMl9uZXdfaW4gPC0gczJfbmV3X2YoCiAgaW50ZXJlc3RfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbywKICBleF9yYXRlX3ZhciA9IDEsCiAgeWVhcl9vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF90X3NvCikKcTJfaW4gPC0gcV9mdWxsX3NvCmBgYAoKPC9kZXRhaWxzPgo8YnI+CgpXaXRoIGNvbXBsZXRlIHN1YnNpZHksIHRoZSBjb3N0cyBvZiB0aGUgaW50ZXJ2ZW50aW9uIGJlY29tZSB0aGUgdG90YWwgZGlyZWN0IGNvc3RzIG9mIGRld29ybWluZyBlYWNoIGNoaWxkIChpbiBVU0QpLiBNb3N0IHJlY2VudCAoMjAxOCkgZGF0YSBmcm9tIEV2aWRlbmNlIEFjdGlvbiByZXZlYWxzIHRoaXMgY29zdCB0byBiZSBcJGByIHVuaXRfY29zdF9zb2AgcGVyIHllYXIuIEFkanVzdGluZyBmb3IgcHVyY2hhc2luZyBwb3dlciBhbmQgaW5mbGF0aW9uLCB3ZSBnZXQgYSBwZXIgY2FwaXRhIGNvc3Qgb2YgXCRgciByb3VuZCh1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbywyKWAuIEFkZGluZyBhbGwgaW5kaXJlY3QgY29zdCBvdmVyIGFuIGF2ZXJhZ2UgYHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywxKWAgeWVhcnMgb2YgdHJlYXRtZW50LCB0aGUgYXZlcmFnZSBjb3N0IG9mIGRld29ybWluZyBlYWNoIGNoaWxkIG92ZXIgdGhlIGVudGlyZSB0cmVhdG1lbnQgcGVyaW9kIGlzICRgciBmb3JtYXQocm91bmQoczJfbmV3X2luICogcTJfaW4sMiksIG5zbWFsbCA9IDIpYC4KCgojIyMjIEluZGlyZWN0IGNvc3RzOiBhZGRpdGlvbmFsIHllYXJzIG9mIGVkdWNhdGlvbiBhbmQgaXRzIGNvc3RzIGZvciBnb3Zlcm5tZW50ICAKClRoZSBpbmRpcmVjdCBjb3N0IG9uIHRoZSBlZHVjYXRpb24gc3lzdGVtIGlzIGNhbGN1bGF0ZWQgc2ltaWxhcmx5IHRvIGFwcHJvYWNoIDE6IHRoZSBjb3N0IHBlciBzdHVkZW50IGlzIG11bHRpcGxpZWQgYnkgdGhlIGluY3JlYXNlIGluIHNjaG9vbCBhdHRlbmRhbmNlIGR1ZSB0byBkZXdvcm1pbmcuIFRoZSBjb3N0IG9mIGFkZGl0aW9uYWwgc2Nob29saW5nIGlzIGdpdmVuIGJ5IHRoZSBwcm9kdWN0IG9mIHRoZSBhbm51YWwgY29zdCBvZiBzY2hvb2xpbmcgZWFjaCBjaGlsZCBhbmQgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHllYXJzIGNoaWxkcmVuIGF0dGVuZCBzY2hvb2wgYXMgYSByZXN1bHQgb2YgZGV3b3JtaW5nLiBUaGlzIGFuYWx5c2lzIGFzc3VtZXMgdGhhdCBwcmVzc3VyZSBpcyBhZGRlZCB0byBlZHVjYXRpb25hbCBpbnN0aXR1dGlvbnMgZm9yIGEgbWF4aW11bSBvZiBuaW5lIHllYXJzLCBzdGFydGluZyBhdCB5ZWFyIHplcm8uIFRoZSBjb3N0IHBlciBzdHVkZW50ICgkSyQpIGlzIHVwZGF0ZWQgd2l0aCBuZXcgaW5mb3JtYXRpb24gb24gYW5udWFsIHRlYWNoZXIgc2FsYXJ5IChpbmNsdWRpbmcgYmVuZWZpdHMpW145XSwgJGByIGZvcm1hdChyb3VuZCh0ZWFjaF9zYWxfMjAxN3VzZHBwcF9zbywwKSwgc2NpZW50aWZpYz1GQUxTRSwgYmlnLm1hcmsgPSAiLCIpYCAoYWxzbyBhZGp1c3RlZCBmb3IgUFBQKSwgYW5kIHRoZSBzYW1lIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0dWRlbnRzIHBlciB0ZWFjaGVyIChgciBuX3N0dWRlbnRzX3NvYCkuCgpIZW5jZSwgdGhlIGNvc3Qgb2Ygc2Nob29saW5nIGVhY2ggY2hpbGQgZm9yIGFuIGFkZGl0aW9uYWwgeWVhciBpcyBub3cgJGByIHJvdW5kKHRlYWNoX3NhbF8yMDE3dXNkcHBwX3NvL25fc3R1ZGVudHNfc28sIDEpYCAoVVNEKS4KClteOV06IEJhc2VkIG9uIHRoZSB1cHBlciB0aWVyIG9mIG1vbnRobHkgdGVhY2hlciBzYWxhcmllcyByZXBvcnRlZCBieSB0d28gS2VueWFuIG5ld3Mgc291cmNlczogQG55YW5jaGFtYTIwMTggYW5kIEBvZHVvcjIwMTcuIFNpbmNlIGNvbXBlbnNhdGlvbiBmb3IgdGVhY2hlcnMgaW4gcnVyYWwgdmlsbGFnZXMgd2hlcmUgdGhlIHRyZWF0bWVudCB3YXMgYWRtaW5pc3RlcmVkIGlzIGJlbG93IHRoZSBuYXRpb25hbCBhdmVyYWdlLCB3ZSBhcmUgb3ZlcmVzdGltYXRpbmcgdGhlIGNvc3RzIGZvciBhIGNvbnNlcnZhdGl2ZSBhbmFseXNpcy4gVGhlIGF2ZXJhZ2UgbnVtYmVyIG9mIHN0dWRlbnRzIHBlciB0ZWFjaGVyIGlzIGByIG5fc3R1ZGVudHNfc29gLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKXGJlZ2lue2VxdWF0aW9ufQpLIFxzdW1fe3Q9MH1ee2ByIGRpbShkZWx0YV9lZF9zbylbMV0tMWB9IFxsZWZ0KCBcZnJhY3sxfXsxICsgcn1ccmlnaHQpXnt0fSBcRGVsdGEgXG92ZXJsaW5le0V9X3QoUzEsUzIpCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkSyQ6IGNvc3QgcGVyIHN0dWRlbnQgdG8gZ2V0IGVkdWNhdGlvbiAgCi0gJFxEZWx0YSBcb3ZlcmxpbmV7RX1fe3R9KFMxLCBTMikkOiBlc3RpbWF0ZWQgaW5jcmVhc2UgaW4gc2Nob29sIGF0dGVuZGFuY2UgIAoKCmBgYHtyIGVkLWNvc3RzLW5ldywgcHVybD1GQUxTRSwgZWNobz1GQUxTRX0KbGlicmFyeShyb290U29sdmUpCgpkZWx0YV9lZF9pbiA8LSBkZWx0YV9lZF9zb1ssMV0KY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4gPC0gY29zdF9wZXJfc3R1ZGVudF9mKAogIHRlYWNoX3NhbF92YXIgPSB0ZWFjaF9zYWxfbmV3X3NvLAogIHRlYWNoX2Jlbl92YXIgPSAwLAogIG5fc3R1ZGVudHNfdmFyID0gbl9zdHVkZW50c19zbwopCgoKcHZfY29zdHMyX2luIDwtIHB2X2Nvc3RzX2YoCiAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbywKICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfaW4sCiAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICBjb3N0X29mX3NjaG9vbGluZ192YXIgPSBjb3N0X3Blcl9zdHVkZW50X25ld19pbiwKICAgczFfdmFyID0gMCwKICAgcTFfdmFyID0gMCwKICAgczJfdmFyID0gczJfbmV3X2luLAogICBxMl92YXIgPSBxX2Z1bGxfc28KKQoKCnB2X2JlbmVmX2FsbF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbykKCmEyX2FsbF9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgY29zdHNfdmFyID0gcHZfY29zdHMyX2luKQoKZ2V0X2lyciA8LSBmdW5jdGlvbihyYXRlX3ZhcikgewogIHB2X2JlbmVmX2YoCiAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X25ld19pbiwKICAgICBpbnRlcmVzdF9yX3ZhciA9IHJhdGVfdmFyLAogICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbwogICkgLQogIHB2X2Nvc3RzX2YoCiAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvLAogICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2luLAogICAgIGludGVyZXN0X3JfdmFyID0gcmF0ZV92YXIsCiAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4sCiAgICAgczFfdmFyID0gMCwKICAgICBxMV92YXIgPSAwLAogICAgIHMyX3ZhciA9IHMyX25ld19mKAogICAgICAgaW50ZXJlc3RfdmFyID0gcmF0ZV92YXIsCiAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyID0gdW5pdF9jb3N0XzIwMTd1c2RwcHBfc28sCiAgICAgICBleF9yYXRlX3ZhciA9IDEsCiAgICAgICB5ZWFyX29mX3RyZWF0X3ZhciA9IHllYXJzX29mX3RyZWF0X3Rfc28KICAgICApLAogICAgIHEyX3ZhciA9IHFfZnVsbF9zbwogICkKfQoKaXJyX2luIDwtIChtdWx0aXJvb3QoZnVuY3Rpb24oeCkgZ2V0X2lycihyYXRlX3ZhciA9IHgpLCAuMSwgbWF4aXRlcj0xMDAwMDAwMCwgcG9zaXRpdmUgPSBUKSkkcm9vdApgYGAKPC9kZXRhaWxzPgo8YnI+CgpPdmVyIHRoaXMgbmluZSB5ZWFyIHBlcmlvZCwgdHJlYXRlZCBzdHVkZW50cyBhdHRlbmRlZCBzY2hvb2wgZm9yIGFuIGFkZGl0aW9uYWwgYHIgcm91bmQoc3VtKGRlbHRhX2VkX3NvWywxXSksMilgIHllYXJzIG9uIGF2ZXJhZ2UuIFRoZW4gd2UgZ2V0IGFuIGF2ZXJhZ2UgY29zdCBvZiBhZGRpdGlvbmFsIHNjaG9vbGluZyBwZXIgY2hpbGQgb3ZlciB0aGUgbmluZS15ZWFyIHBlcmlvZCwgJGByIGZvcm1hdChyb3VuZCgoY29zdF9wZXJfc3R1ZGVudF9uZXdfaW4qc3VtKCAoMS8oMStpbnRlcmVzdF9uZXdfaW4pKV4oMDo4KSAqIGRlbHRhX2VkX2luICkpLDIpLCBuc21hbGwgPSAyKWAuCgoKIyMjIEFzc2Vzc2luZyBjb21wdXRhdGlvbmFsIHJlcHJvZHVjaWJpbGl0eSBvZiBvcmlnaW5hbCByZXN1bHRzICAKClRoZSBzZWNvbmQgYXBwcm9hY2ggZG9lcyBub3QgcmVwb3J0IGJlbmVmaXRzIGFuZCBjb3N0cyBzZXBhcmF0ZWRseS4gV2l0aCBhbGwgdGhlc2UgZWxlbWVudHMgdGhlIG1haW4gcmVzdWx0IGZyb20gdGhlIG9yaWdpbmFsIGFuYWx5c2lzIHRoYXQgaXMgY29tcGFyYWJsZSB3aXRoIHRoZSByZXN1bHRzIGRpc2N1c3NlZCBoZXJlIGlzIGEgTlBWIG9mIGByIGRmX3Jlc2VhcmNoX3NvJHBhcmFtWzldYCAodGFibGUgYHIgZGZfcmVzZWFyY2hfc28kdGFibGVudW1bOV1gLCBjb2x1bW4gYHIgZGZfcmVzZWFyY2hfc28kdGFibGVfY29sWzldYCwgYW5kIHJvdyBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9yb3dbOV1gKSBUaGlzIHJlc3VsdCBjb3JyZXNwb25kcyB0byBhIHNvY2lhbCBpbnRlcm5hbCByYXRlIG9mIHJldHVybiBvZiBgciBwYXN0ZTAoZGZfcmVzZWFyY2hfc28kcGFyYW1bOF0sICIlIilgIGxvY2F0ZWQgYXMgYW4gaW5saW5lIHJlc3VsdCBpbiB0aGUgcGFwZXIgLSBhbHNvIGluIGByIGRmX3Jlc2VhcmNoX3NvJGZpZ3VyZV9udW1bOF1gIC0gYW5kIGluIHRoZSBhcHBlbmRpeCBhdCB0YWJsZSBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZW51bVs4XWAsIGNvbHVtbiBgciBkZl9yZXNlYXJjaF9zbyR0YWJsZV9jb2xbOF1gLCBhbmQgcm93IGByIGRmX3Jlc2VhcmNoX3NvJHRhYmxlX3Jvd1s4XWApLiBGb2xsb3dpbmcgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24sIHRoaXMgYW5hbHlzaXMgb2J0YWlucyB0aGUgc2FtZSByZXN1bHQgKGByIGEyX2FsbF9wZWAgYW5kIGByIHBhc3RlMChpcnJfaW4gKiAxMDAsICIlIilgIHJlc3BlY3RpdmVseSB3aXRob3V0IHJvdW5kaW5nKS4KCgpgYGB7ciBzdW0tdGFibGVzMjAsIHB1cmw9RkFMU0UsIGVjaG89RkFMU0UsIGV2YWw9c2hvd19zdW1tYXJ5X3RhYmxlc30KdGFibGVfMVs5LDJdIDwtIHBhc3RlMCgiJHJfezE2fT0iLCBpbnRlcmVzdF9pbiwgIiQiKQoKdGFibGVfMSA8LSByYmluZCh0YWJsZV8xLCBjKCIiLCBwYXN0ZTAoIiRyX3sxOX09IiwgaW50ZXJlc3RfbmV3X2luLCAiJCIpLCAiIikpCnRhYmxlXzEgPC0gcmJpbmQodGFibGVfMSwgYyggIiIsIHBhc3RlMCgiJFNfMj0iLCAxLCAiJCIpLCAiIiksICNTMiBpcyBhIGNvbXBsZXRlIHN1YnNpZHkKICAgICAgICAgICAgICAgICBjKCAiIixwYXN0ZTAoIiRcXG92ZXJsaW5le1xcRGVsdGEgXFxvdmVybGluZXtFfV97dH0oUzEsUzIpfT0iLCByb3VuZChtZWFuKGRlbHRhX2VkX3NvWywxXSksMiksICIkIiksICIiKSkKCnN1bV90YWJsZV9pbmRleCA8LSBzdW1fdGFibGVfaW5kZXgrMQp0YWJsZV8yIDwtIHJiaW5kKHRhYmxlXzIsCiAgICAgICAgICAgICAgICAgYygiJERDID0gXFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXFxiaWddICsgXFxsZWZ0KCBcXGZyYWN7MX17MSArIHJ9XFxyaWdodClcXGJpZ1tTX3syfVEoU197Mn0pIC0gU197MX1RKFNfezF9KSBcXGJpZ10gKyBcXAouNFxcbGVmdCggXFxmcmFjezF9ezEgKyByfVxccmlnaHQpXjIgXFxiaWdbU197Mn1RKFNfezJ9KSAtIFNfezF9UShTX3sxfSkgXFxiaWddJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRLIFxcc3VtX3t0PTB9Xns4fSBcXGxlZnQoIFxcZnJhY3sxfXsxICsgcn1cXHJpZ2h0KV57dH0gXFxEZWx0YSBcXG92ZXJsaW5le0V9X3QoUzEsUzIpJCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgprbml0cjo6a2FibGUodGFibGVfMiwgY29sLm5hbWVzID0gYygiRXF1YXRpb24iLCAiIyIpLCBjYXB0aW9uID0gIlN1bW1hcnkgb2YgZXF1YXRpb25zIHVzZWQgdW50aWwgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkKCmtuaXRyOjprYWJsZSh0YWJsZV8xLCBjb2wubmFtZXMgPSBjKCJEYXRhIiwgIlJlc2VhcmNoIiwgIkd1ZXNzd29yayIpLCBjYXB0aW9uID0gIlNvdXJjZXM6IHN1bW1hcnkgb2YgaW5wdXRzIHNwZWNpZmllZCB1bnRpbCB0aGlzIHBvaW50IGluIHRoZSBkb2N1bWVudCIpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQpgYGAKCiMjIEFwcHJvYWNoIDM6IENvbWJpbmF0aW9uIG9mIFByZXZpb3VzIEFwcHJvYWNoZXMgYW5kIElucHV0IEZyb20gS2V5IFBvbGljeSBQYXJ0bmVycwoKSW4gdGhpcyB0aGlyZCBhbmQgZmluYWwgYXBwcm9hY2gsIHdlIGJvcnJvd2VkIHNvbWUgbWV0aG9kb2xvZ2ljYWwgZWxlbWVudHMgZnJvbSBAYmFpcmQyMDE2d29ybXMgYW5kIEBrbHBzNCBhbmQgc291Z2h0IGZlZWRiYWNrIGZyb20gYSBrZXkgcG9saWN5IHBhcnRuZXIgdG8gYmVzdCBpZGVudGlmeSBvbmUgY2xlYXIgb3V0cHV0IHRvIGluZm9ybSBwb2xpY3kgbWFrZXJzLiBXZSB3b3JrZWQgaW4gY29sbGFib3JhdGlvbiB3aXRoIHRoZSBOR08gRXZpZGVuY2UgQWN0aW9uLCBhIGtleSB0ZWNobmljYWwgYXNzaXN0YW5jZSBwYXJ0bmVyIGluIHRoaXMgYXJlYS4gRXZpZGVuY2UgQWN0aW9uIHByb3ZpZGVkIGluc2lnaHRzIG9uIHdoYXQgYXJlIHRoZSBtb3N0IHJlbGV2YW50IGNvc3RzIGFuZCBiZW5lZml0cyBmcm9tIHRoZSBwZXJzcGVjdGl2ZXMgb2YgcG9saWN5IG1ha2VycywgYW5kIG9uIGNlcnRhaW4gYXNwZWN0cyBvZiB0aGUgYW5hbHlzaXMgdGhhdCBjb3VsZCBiZSB1cGRhdGVkIHdpdGggcHJlc2VudC1kYXkgZGF0YS4KClVuZGVyIHRoaXMgYXBwcm9hY2gsIHRoZSBiZW5lZml0cyBmcm9tIGRld29ybWluZyBkZXNjcmliZWQgaW4gQXBwcm9hY2hlcyAxIGFuZCAyIGFyZSBzY2FsZWQgdG8gcmVmbGVjdCBkaWZmZXJlbmNlcyBpbiBwcmV2YWxlbmNlIHJhdGVzLCBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudC4gQWRkaXRpb25hbGx5LCB0aGUgcmVsZXZhbnQgY29zdHMgYXJlIGNvbnN0cmFpbmVkIHRvIGRpcmVjdCBjb3N0cyBhbG9uZSAoZXhjbHVkaW5nIGFkZGl0aW9uYWwgY29zdHMgb24gZWR1Y2F0aW9uKS4gRmluYWxseSB0aGlzIGFwcHJvYWNoIHVzZXMgaW5wdXRzIGNvc3RzIGFuZCBwcmV2YWxlbmNlIHRoYXQgcmVmbGVjdCB0aGUgY3VycmVudCBzZXR0aW5ncyB3aGVyZSBFdmlkZW5jZSBBY3Rpb24gaXMgY3VycmVudGx5IHN1cHBvcnRpbmcgZGV3b3JtaW5nIGludGVydmVudGlvbnMuIEFzIG9mIDIwMjAsIEV2aWRlbmNlIEFjdGlvbiBzdXBwb3J0cyBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBpbiBmb3VyIGNvdW50cmllcy4KCiMjIyBCZW5lZml0cyAgIAoKCiMjIyMgQWRqdXN0aW5nIGZvciBkaWZmZXJlbnQgcHJldmFsZW5jZSByYXRlcyAgCgpUbyBhY2NvdW50IGZvciBkaWZmZXJlbnQgcHJldmFsZW5jZSByYXRlcyAoJFxldGEkKSwgdGhlIGVzdGltYXRlZCB0cmVhdG1lbnQgZWZmZWN0IGlzIGRlY29tcG9zZWQgaW4gdGhlIGltcGFjdCBvZiBkZXdvcm1pbmcgb24gY2hpbGRyZW4gd2hvIHdlcmUgdHJlYXRlZCBhbmQgaGFkIGEgd29ybSBpbmZlY3Rpb24sIG9yIHRoZSBlZmZlY3RpdmUgdHJlYXRtZW50IGVmZmVjdCBvZiBkZXdvcm1pbmcgKCRcbGFtYmRhX3sxfV57ZWZmfSQpLCBhbmQgY2hpbGRyZW4gd2hvIHdlcmUgdHJlYXRlZCBhbmQgZGlkIG5vdCBoYXZlIGEgd29ybSBpbmZlY3Rpb24uIEJ5IGNvbnN0cnVjdGlvbiwgdGhlIGVmZmVjdCBvbiB0aGlzIGxhc3QgZ3JvdXAgc2hvdWxkIGJlIHplcm8uIEhlbmNlIHRoZSBlZmZlY3RpdmUgdHJlYXRtZW50IG9mIGRld29ybWluZyBvbiBpbmZlY3RlZCBwb3B1bGF0aW9ucyB3aWxsIGJlIGVxdWFsIHRvIHRoZSBlc3RpbWF0ZWQgdHJlYXRtZW50IChvbiB0aGUgb3ZlYXJsbCBwb3B1bGF0aW9uKSwgZGl2aWRlZCBieSB0aGUgcHJvcG9ydGlvbiBvZiB0aGUgcHJldmFsZW5jZSBvZiBpbmZlY3Rpb25zLgoKSW4gdGhlIG9yaWdpbmFsIGV2YWx1YXRpb24sIHRoZSBwcmV2YWxlbmNlIHJhdGVzIHdlcmUgdmVyeSBoaWdoIChgciBwcmV2YWxlbmNlXzBfc29gKSwgaGVuY2UgdGhlIGVmZmVjdCBvbiB0aGUgaW5mZWN0ZWQgcG9wdWxhdGlvbiB3YXMgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24uIEN1cnJlbnRseSBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBhcmUgb2Z0ZW4gaW1wbGVtZW50ZWQgaW4gZ2VvZ3JhcGhpZXMgd2l0aCBtdWNoIGxvd2VyIHByZXZhbGVuY2UgcmF0ZXMgKHRob3VnaCBpbiBwb3B1bGF0aW9ucyB3aXRoIHN1ZmZpY2llbnQgaW5mZWN0aW9uIHRvIGp1c3RpZnkgdHJlYXRtZW50IGluIGFjY29yZGFuY2Ugd2l0aCBXb3JsZCBIZWFsdGggT3JnYW5pemF0aW9uIGd1aWRlbGluZXMpLCBoZW5jZSB0byBvYnRhaW4gdGhlIGV4cGVjdGVkIGVmZmVjdCBvdmVyIHRoZSBuZXcgcmVnaW9uLCB3ZSBuZWVkIHRvIG11bHRpcGx5IHRoZSBlZmZlY3Qgb24gdGhlIGluZmVjdGVkIHBvcHVsYXRpb24gYnkgdGhlIHByZXZhbGVuY2UgcmF0ZSBpbiB0aGUgbmV3IHJlZ2lvbiAoJFxldGFfe25ld30kKS4KCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KCkZvciBhcHByb2FjaCAzLCB3ZSB3aWxsIG1vZGlmeSB0cmVhdG1lbnQgZWZmZWN0cyBvZiBhcHByb2FjaGVzIDEgYW5kIDIgKGVxdWF0aW9uIDQgYW5kIDEzIHJlc3BlY3RpdmVseSkgYnkgdGhlIGZvbGxvd2luZzogICAKClxiZWdpbntlcXVhdGlvbn0KXGxhbWJkYV97MX0gPSBcZXRhIFxsYW1iZGFee2VmZn1fezF9ICsgKDEgLSAgXGV0YSkgXHRpbWVzIDAgXFwKXGxhbWJkYV57cn1fezF9ID0gXGV0YV97bmV3fVxsYW1iZGFee2VmZn1fezF9CmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KCldoZXJlOgoKLSAkXGxhbWJkYV8xJDogZGlyZWN0IGVmZmVjdHMgb2YgZGV3b3JtaW5nIG9uIGluZGl2aWR1YWxzJyBlYXJuaW5ncy4gSGVyZSB3ZSB1c2UgdGhlIHN5bWJvbCBmb3IgdHJlYXRtZW50IGVmZmVjdCBvZiBhcHByb2FjaCAxLCBidXQgdGhlIHNhbWUgbG9naWMgYXBwbGllcyB0byB0aGUgdHJlYXRtZW50IGVmZmVjdCBvZiBhcHByb2FjaCAyICgkXGFscGhhXntwb29sZWR9JCkKLSAkXGxhbWJkYV57ZWZmfV8xJDogaW1wYWN0IG9mIGRld29ybWluZyBvbiBjaGlsZHJlbiB3aG8gd2VyZSB0cmVhdGVkIGFuZCBoYWQgYSB3b3JtIGluZmVjdGlvbiBpbiB0aGUgb3JpZ2luYWwgZXZhbHVhdGlvbiAgCi0gJFxsYW1iZGFecl8xJDogaW1wYWN0IG9mIGRld29ybWluZyBvbiBjaGlsZHJlbiB3aG8gd2VyZSB0cmVhdGVkIGFuZCBoYWQgYSB3b3JtIGluZmVjdGlvbiBpbiB0aGUgbmV3IHJlZ2lvbiAgCi0gJFxldGEkOiBwcmV2YWxlbmNlIHJhdGVzIGluIHRoZSBvcmlnaW5hbCBldmFsdWF0aW9uICAgCi0gJFxldGFfe25ld30kOiBwcmV2YWxlbmNlIHJhdGVzIGluIHRoZSBuZXcgcmVnaW9uICAgCgpgYGB7ciBsYW1iZGFzX2VmZiwgZWNobyA9IHByaW50X2NvZGV9CiMgLSBpbnB1dHM6IHByZXZpb3VzbHkgZXN0aW1hdGVkIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYTFfaW5fZiksIHByZXZhbGVuY2UKIyByYXRlcyBpbiB0aGUgb3JpZ2luYWwgc2V0dGluZyAocHJldmFsZW5jZV8wX3NvKSwgcHJldmFsZW5jZSBpbiB0aGUgbmV3IHNldHRpbmcKIyAocHJldmFsZW5jZV9yX3NvKSwgY291bnRyaWVzIGluY2x1ZGVkIGluIHRoZSBhbmFseXNpcyAoY291bnRyeV9zZWxfc28pCiMgYW5kIHRoZWlyIHBvcHVsYXRpb24gKGNvdW50cnlfc2VsX3BvcF9zbyksIG9yIHNpbmdsZSBpbnB1dCBvZiBuZXcgcHJldmFsZW5jZQojIChuZXdfcHJldmFsZW5jZV9yX3NvKQojIC0gb3V0cHV0czogZWZmZWN0aXZlIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYV9lZmZfZikKY2h1bmtfbGFtYmRhc19lZmY8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICAgCgogICAgbGFtYmRhX2VmZl9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2VfMF92YXIgPSBwcmV2YWxlbmNlXzBfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2Vfcl92YXIgPSBwcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfc2VsX3ZhciA9IGNvdW50cnlfc2VsX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X3NlbF9wb3BfdmFyID0gY291bnRyeV9zZWxfcG9wX3NvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9wcmV2bF9yX3ZhciA9IG5ld19wcmV2YWxlbmNlX3Jfc28pewogICAgICB0ZW1wX3NlbCA8LSBhcy5jaGFyYWN0ZXIoY291bnRyeV9zZWxfdmFyKSAgCiAgICAgICMgaWYgYSBwb3NpdGl2ZSBudW1iZXIgb2YgY291bnRyaWVzIGlzIHNlbGVjdGVkCiAgICAgIGlmIChpcy5udWxsKG90aGVyX3ByZXZsX3JfdmFyKSkgewogICAgICAgIHRlbXBfd2VpZ2h0cyA8LSBjb3VudHJ5X3NlbF9wb3BfdmFyW3RlbXBfc2VsXSAvCiAgICAgICAgICBzdW0oY291bnRyeV9zZWxfcG9wX3Zhclt0ZW1wX3NlbF0pCiAgICAgICAgcHJldmFsZW5jZV9yX2ZpbmFsIDwtIHN1bSggcHJldmFsZW5jZV9yX3Zhclt0ZW1wX3NlbF0gKiB0ZW1wX3dlaWdodHMgKQogICAgICB9IGVsc2UgewogICAgICAgIHByZXZhbGVuY2Vfcl9maW5hbCA8LSBvdGhlcl9wcmV2bF9yX3ZhciAgCiAgICAgIH0KICAgICAgbGFtYmRhMV9lZmZfdGVtcCA8LSBsYW1iZGExX3ZhciAvIHByZXZhbGVuY2VfMF92YXIKICAgICAgbGFtYmRhMV9lZmZfaW4gPC0gbGFtYmRhMV9lZmZfdGVtcCAqIHByZXZhbGVuY2Vfcl9maW5hbAogICAgICByZXR1cm4oICAKICAgICAgICBsaXN0KCJsYW1iZGExX2VmZl9pbiIgPSBsYW1iZGExX2VmZl9pbiwKICAgICAgICAgICAgICJwcmV2YWxlbmNlX3JfZmluYWxfaW4iID0gcHJldmFsZW5jZV9yX2ZpbmFsKQogICAgICAgICAgICAgICkKICAgIH0gIAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAKICAgIHJldHVybiggbGlzdCgibGFtYmRhX2VmZl9mIiA9IGxhbWJkYV9lZmZfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhc19lZmYoKSwuR2xvYmFsRW52KSApCgojIyMjIyBFeGVjdXRlIHZhbHVlcyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlIHdoZW4gbmVlZGVkIGZvciB0aGUgdGV4dDoKbGFtYmRhMV9yX2luIDwtIGxhbWJkYV9lZmZfZigpJGxhbWJkYTFfZWZmX2luCnByZXZhbGVuY2Vfcl9pbiA8LSBsYW1iZGFfZWZmX2YoKSRwcmV2YWxlbmNlX3JfZmluYWxfaW4KYGBgCgo8L2RldGFpbHM+Cjxicj4KCkV2aWRlbmNlIEFjdGlvbiBwcm92aWRlZCBwcmV2YWxlbmNlIHN1cnZleSBkYXRhIGZvciB0aGUgZ2VvZ3JhcGhpZXMgd2hlcmUgdGhleSBhcmUgaW52b2x2ZWQuIEluIG9yZGVyIHRvIGJlIG1vc3QgYW5hbG9nb3VzIHdpdGggdGhlIGJhc2VsaW5lIHByZXZhbGVuY2UgZXN0aW1hdGUgdXNlZCBpbiB0aGUgb3JpZ2luYWwgc3R1ZHksIHRoZSBwcmV2YWxlbmNlIGVzdGltYXRlcyB1c2VkIGFyZSAxKSB0aGUgZWFybGllc3QgcG9pbnQgZXN0aW1hdGVzIGF2YWlsYWJsZSBmcm9tIGJlZm9yZSwgb3IgY2xvc2UgdG8gdGhlIHRpbWUgb2YsIEV2aWRlbmNlIEFjdGlvbidzIGludm9sdmVtZW50IGluIHRoYXQgZ2VvZ3JhcGh5LCBhbmQgMikgYXJlIHJlcHJlc2VudGF0aXZlIG9mIGFueSBTVEggaW5mZWN0aW9uLiAgICAgIAoKIyMjIyBBZGp1c3RpbmcgZm9yIGRpZmZlcmVudCBsZW5ndGggb2YgdHJlYXRtZW50ICAKClRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgeWVhcnMgb3ZlciB3aGljaCBhIHBvcHVsYXRpb24gaXMgZXhwb3NlZCB0byBkZXdvcm1pbmcgdHJlYXRtZW50IGRldGVybWluZXMgdGhlIGludGVuc2l0eSBvZiB0aGUgZWZmZWN0cyBvdmVyIHRoaXMgcG9wdWxhdGlvbiBvdmVyIHRpbWUuIFRoZSB0d28gYXBwcm9hY2hlcyByZXByb2R1Y2VkIHNvIGZhciBob2xkIHRoZSBsZW5ndGggb2YgdHJlYXRtZW50IGNvbnN0YW50IGF0IHRoZSBsZXZlbHMgZXN0aW1hdGVkIGJ5IHRoZSBvcmlnaW5hbCBzdHVkeSAoYHIgcm91bmQoeWVhcnNfb2ZfdHJlYXRfMF9zbywgMSlgIHllYXJzKS4gSW4gdGhpcyB0aGlyZCBhcHByb2FjaCB3ZSBhbGxvdyBmb3IgdGhlIHllYXJzIG9mIHRyZWF0bWVudCB0byB2YXJ5IGFmZmVjdGluZyBib3RoIGJlbmVmaXRzIGFuZCBjb3N0cy4gV2UgYXNzdW1lIHRoYXQgdGhlIGVmZmVjdHMgYXJlIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHllYXJzIG9mIHRyZWF0bWVudCwgd2l0aCBubyBhZGRpdGlvbmFsIGVmZmVjdHMgYWZ0ZXIgNiB5ZWFycyBvZiB0cmVhdG1lbnQuIFdlIGFzc3VtZWQgYSBtYXhpbXVtIG9mIDYgeWVhcnMgb2YgaW1wYWN0IGluIHRoaXMgY2FzZSBiYXNlZCBvbiB0aGUgMjAgeWVhciBLTFBTIGZvbGxvdy11cCByZXNlYXJjaCwgd2hpY2ggc2hvd3MgYSBsZXZlbGxpbmctb2ZmIG9mIHRyZWF0bWVudCBlZmZlY3QgYWZ0ZXIgYXBwcm94aW1hdGVseSA2IHllYXJzIG9mIGRld29ybWluZyAoQGtscHM0OyBGaWd1cmUgQS41IGluIEFwcGVuZGl4LCBwYWdlIEEtNikuCgpBZGRpbmcgdGhlIGVsZW1lbnQgb2YgdHJlYXRtZW50IGR1cmF0aW9uIGFsbG93cyB1cyB0byB0YWtlIGludG8gYWNjb3VudCBkaWZmZXJlbmNlcyBpbiB0aGUgbnVtYmVyIG9mIHllYXJzIG9mIGRld29ybWluZyB0cmVhdG1lbnQgYWNyb3NzIGRpZmZlcmVudCBjb3VudHJ5IGNvbnRleHRzIGRlcGVuZGluZyBvbiBwcm9ncmFtIGR5bmFtaWNzLiBBbHRob3VnaCB0aGUgY291bnRlcmZhY3R1YWwgb2Ygd29ybSBwcmV2YWxlbmNlIGluIHRoZSBhYnNlbmNlIG9mIHRyZWF0bWVudCBpcyBsYXJnZWx5IHVua25vd24sIHdlIGtub3cgdGhhdCBjb25zaXN0ZW50IGRld29ybWluZyBjb250aW51ZXMgdG8gZGVjcmVhc2Ugd29ybSBwcmV2YWxlbmNlIG92ZXIgdGltZSwgY29udHJpYnV0aW5nIHRvIGNvbnRyb2xsZWQgd29ybSBlbnZpcm9ubWVudHMgYW5kIHN1c3RhaW5lZCBiZW5lZml0cy4gSW4gbWFueSBkZXdvcm1pbmcgcHJvZ3JhbXMgdG9kYXksIGNoaWxkcmVuIHJlY2VpdmUgcmVndWxhciB0cmVhdG1lbnQgdGhyb3VnaG91dCBhIHBvcnRpb24gKGFuZCBpbiBzb21lIGNhc2VzIGZvciB0aGUgZnVsbCB0ZXJtKSBvZiB0aGVpciBwcmltYXJ5IHNjaG9vbGluZy4gSXQgaXMgd29ydGggbm90aW5nIHRoYXQgdGhlIGFzc3VtcHRpb24gb2YgbGluZWFyaXR5IGlzIGFuIGltcGVyZmVjdCBtZWFzdXJlIGZvciB2YXJpb3VzIGVwaWRlbWlvbG9naWNhbCByZWFzb25zLCB0aG91Z2ggd2UgaW5jbHVkZSB0aGlzIHZhcmlhYmxlIG9mIHRpbWUgaW50byB0aGUgZXF1YXRpb24gYXMgYW4gZXN0aW1hdGUgb2YgdGhlIGJlc3QgZ3Vlc3MgYXQgdGhlIGRpZmZlcmVuY2VzIGluIGFjaGlldmVkIGltcGFjdCBvdmVyIHRpbWUsIGFuZCBpbiBwYXJ0IGJlY2F1c2UgaXQgaGVscHMgY2FwdHVyZSB0aGF0IGEgbmV3IGNvaG9ydCBlbnRlcnMgcHJpbWFyeSBzY2hvb2wtLWFuZCBpcyB0aGVyZWZvcmUgZWxpZ2libGUgZm9yIHRyZWF0bWVudC0td2l0aCBlYWNoIHN1Y2Nlc3NpdmUgeWVhciBvZiBhIGRld29ybWluZyBwcm9ncmFtLgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpGb3IgYXBwcm9hY2ggMywgd2Ugd2lsbCBtb2RpZnkgdHJlYXRtZW50IGVmZmVjdHMgb2YgYXBwcm9hY2hlcyAxIGFuZCAyIChlcXVhdGlvbnMgNCBhbmQgMTMgcmVzcGVjdGl2ZWx5KSBieSB0aGUgZm9sbG93aW5nOiAgIAoKXGJlZ2lue2VxdWF0aW9ufQpcbGFtYmRhX3sxLHQgPSAxfSA9IFxmcmFje1xsYW1iZGFfezF9fXtMX3swfX0gXFwKXGxhbWJkYV97MSx0fSA9ClxiZWdpbntjYXNlc30KdCBcbGFtYmRhX3sxLHQgPSAxfSBccXVhZCBcdGV4dHtmb3IgfSB0PTEsIFxkb3RzLCA2XFwKXFwKNiAgXGxhbWJkYV97MSx0ID0gMX0gXHF1YWQgXHRleHR7Zm9yIH0gdCA+IDZcXApcZW5ke2Nhc2VzfQpgciBlcXVhdGlvbkluZGV4IDwtIGVxdWF0aW9uSW5kZXggKyAxYApcbGFiZWx7ZXE6YHIgZXF1YXRpb25JbmRleGB9Clx0YWd7YHIgZXF1YXRpb25JbmRleGB9ClxlbmR7ZXF1YXRpb259CgoKYGBge3IgbGFtYmRhc190LCBlY2hvID0gcHJpbnRfY29kZX0KIyAtIGlucHV0czogdHJlYXRtZW50IGVmZmVjdCAobGFtYmRhMV9pbl9mKSwgbGVuZ3RoIG9mIHRyZWF0bWVudCBpbiBvcmlnaW5hbAojIHN0dWR5ICh5ZWFyc19vZl90cmVhdF8wX3NvKSwgbGVuZ3RoIG9mIHRyZWF0bWVudCBpbiBuZXcgc2V0dGluZyAoeWVhcnNfb2ZfdHJlYXRfdF9zbykKIyAtIG91dHB1dHM6IHBlciB5ZWFyIHRyZWF0bWVudCBlZmZlY3QgKGxhbWJkYTFfdDEpIGFuZCB0b3RhbCB0cmVhdG1lbnQgZWZmZWN0CiMgKGxhbWJkYTFfdCkKCmNodW5rX2xhbWJkYXNfdDwtIGZ1bmN0aW9uKCl7CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgICAKCiAgICBsYW1iZGFfdF9mIDwtIGZ1bmN0aW9uKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyID0geWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3NvKXsKICAgICAgICAgIGxhbWJkYTFfdDEgPC0gbGFtYmRhMV92YXIgLyB5ZWFyc19vZl90cmVhdF8wX3ZhcgogICAgICAgICAgaWYgKHllYXJzX29mX3RyZWF0X3RfdmFyPD02KXsKICAgICAgICAgICAgbGFtYmRhMV90IDwtIHllYXJzX29mX3RyZWF0X3RfdmFyICogbGFtYmRhMV90MQogICAgICAgICAgfSBlbHNlIGlmICAoeWVhcnNfb2ZfdHJlYXRfdF92YXI+NikgewogICAgICAgICAgICBsYW1iZGExX3QgPC0gNiAqIGxhbWJkYTFfdDEKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybigKICAgICAgICAgICAgbGlzdCgKICAgICAgICAgICAgICAibGFtYmRhMV90MSIgPSBsYW1iZGExX3QxLAogICAgICAgICAgICAgICJsYW1iZGExX3QiID0gbGFtYmRhMV90KQogICAgICAgICAgICApCiAgICB9ICAKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4oIGxpc3QoImxhbWJkYV90X2YiID0gbGFtYmRhX3RfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfbGFtYmRhc190KCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CgojICMgZWFybmluZ3NfYXBwMV9mCiMgIOKUnOKUgOKUgOKUgOKUgCBkZWx0YV9lZF9maW5hbF9mCiMgIOKUnOKUgOKUgOKUgOKUgCBpbnRlcmVzdF9mCiMgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGFfZWZmX2YKIyAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBsYW1iZGFfdF9mCiMgIHwgICAgICAgICAgICDilJTilIDilIDilIDilIAgbGFtYmRhX2luX2YKIyAg4pSc4pSA4pSA4pSA4pSAIHNhdHVyYXRpb25fZgojICDilJTilIDilIDilIDilIAgd2FnZV90X2YKIyAgICAgICAgIOKUlOKUgOKUgOKUgOKUgCB3YWdlXzBfZgoKbGFtYmRhMV90X2luIDwtIGxhbWJkYV9lZmZfZigKICBsYW1iZGExX3ZhciA9IGxhbWJkYV90X2YoCiAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfaW5fZigpLAogICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSAgeWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0gIHllYXJzX29mX3RyZWF0X3Rfc28KICApJGxhbWJkYTFfdCwKICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3NvLAogIGNvdW50cnlfc2VsX3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLCAidmlldG5hbSIpLAogIG90aGVyX3ByZXZsX3JfdmFyID0gTlVMTAopJGxhbWJkYTFfZWZmX2luCgoKYXBwM19lYXJuaW5nc19ub19leHRfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogIHdhZ2VfdmFyID0gd2FnZV90X2luLAogIGxhbWJkYTFfdmFyID0gbGFtYmRhMV90X2luWzFdLAogIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICBsYW1iZGEyX3ZhciA9IDAsCiAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2Vfc28KKQoKYXBwM19lYXJuaW5nc195ZXNfZXh0X2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfdF9pblsxXSwKICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgbGFtYmRhMl92YXIgPSBsYW1iZGEyX2luWzFdLAogIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3NvCikKCmFwcDNfcHZfYmVuZWZfbm9fZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gYXBwM19lYXJuaW5nc19ub19leHRfaW4sCiAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfc28KKQoKYXBwM19wdl9iZW5lZl95ZXNfZXh0X2luIDwtIHB2X2JlbmVmX2YoCiAgZWFybmluZ3NfdmFyID0gYXBwM19lYXJuaW5nc195ZXNfZXh0X2luLAogIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3NvCikKCgpsYW1iZGExX3RfbmV3X2luIDwtIGxhbWJkYV9lZmZfZigKICBsYW1iZGExX3ZhciA9IGxhbWJkYV90X2YoCiAgICBsYW1iZGExX3ZhciA9IGxhbWJkYTFfbmV3X3NvWzFdLAogICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSAgeWVhcnNfb2ZfdHJlYXRfMF9zbywKICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0gIHllYXJzX29mX3RyZWF0X3Rfc28KICApJGxhbWJkYTFfdCwKICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3NvLAogIGNvdW50cnlfc2VsX3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLCAidmlldG5hbSIpLAogIG90aGVyX3ByZXZsX3JfdmFyID0gTlVMTAopJGxhbWJkYTFfZWZmX2luCgoKZWFybmluZ3Nfbm9fZXh0X25ld19pbjwtIGVhcm5pbmdzX2FwcDJfZih0X3ZhciA9IDA6NTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMWsxX3ZhciA9IGxhbWJkYTFfdF9uZXdfaW4pCgphcHAzX3B2X2JlbmVmX2FsbF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc19zbykKYGBgCgoKPC9kZXRhaWxzPgoKPCEtLQpOb3cgdGhlIGJlbmVmaXRzIGFyZSBmbGV4aWJsZSB0byB3b3JtIHByZXZhbGVuY2UgYW5kIGxlbmdodCBvZiB0cmVhdG1lbnQuIFRvIGZhY2lsaXRhdGUgY29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciB0d28gYXBwcm9hY2hlcywgd2UgcHJlc2VudCBoZXJlIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBzYW1lIHByZXZhbGVuY2UgYW5kIGxlbmd0aCBvZiB0cmVhdG1lbnQgYXNzdW1wdGlvbnMgcGFyYW1ldGVycyBhcyBpbiBhcHByb2FjaCAxIGFuZCAyLiBCb3RoIGFwcHJvYWNoZXMgaW1wbGljaXRseSBhc3N1bWUgcHJldmFsZW5jZSByYXRlcyBvZiAxMDAlIGFuZCBkbyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBvcmlnaW5hbCBwb3B1bGF0aW9uIGFuZCB0YXJnZXQgcG9wdWx1YXRpb24uIEJvdGggYXBwcm9hY2hlcyBhbHNvIHNldCB0aGUgbGVuZ3RoIG9mIHRyZWF0bWVudCBhdCBgciB5ZWFyc19vZl90cmVhdF8wX3NvYCB5ZWFycy4KLS0+CgpUbyBjb21wdXRlIHRoZSBiZW5lZml0cyBmb3IgdGhpcyBhcHByb2FjaCwgdGhpcyBwYXBlciB1c2VzIGRhdGEgb24gcHJldmFsZW5jZSBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudCBmb3IgdGhlIGZvdXIgY291bnRyaWVzIHRoYXQgRXZpZGVuY2UgQWN0aW9uIGhhcyByZWNvcmRzIGZvci4gUmVhZGVycyBpbnRlcmVzdGVkIGluIGFzc2Vzc2luZyB0aGUgZWZmZWN0cyBvZiBkZXdvcm1pbmcgZm9yIGEgc3BlY2lmaWMgdmFsdWUgb2YgcHJldmFsZW5jZSBhbmQgbGVuZ3RoIG9mIHRyZWF0bWVudCBhcmUgcmVmZXJyZWQgdG8gdGhlIFtpbnRlcmFjdGl2ZSBhcHBdKGh0dHBzOi8vZmhvY2VzLnNoaW55YXBwcy5pby9zaGlueV9hcHBfdGVzdC8pICh0YWIgb24ga2V5IGFzc3VtcHRpb25zKSB3aGVyZSB0aGV5IGNhbiBpbnB1dCB0aGUgdmFsdWVzIHRoYXQgYmVzdCByZWZsZWN0IHRoZWlyIHNldHRpbmcuIFRvIGZhY2lsaXRhdGUgY29tcGFyaXNvbiB3aXRoIHRoZSBvdGhlciB0d28gYXBwcm9hY2hlcywgdGhpcyBwYXBlciBwcmVzZW50cyBoZXJlIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBzYW1lIGxlbmd0aCBvZiB0cmVhdG1lbnQgYXNzdW1wdGlvbnMgcGFyYW1ldGVycyBhcyBpbiBhcHByb2FjaCAxIGFuZCAyLiAgCgpVbmRlciBhcHByb2FjaCAzLCBhbmQgdXNpbmcgdGhlIHNhbWUgYXNzdW1wdGlvbnMgYXMgYWJvdmUsIHRoZSBiZW5lZml0cyB3aWxsIGJlOiBgciByb3VuZChhcHAzX3B2X2JlbmVmX25vX2V4dF9pbiwgMilgIGFuZCBgciByb3VuZChhcHAzX3B2X2JlbmVmX3llc19leHRfaW4sIDIpYCB3aGVuIHVzaW5nIGJlbmVmaXRzIG9mIGFwcHJvYWNoIDEgd2l0aG91dCBhbmQgd2l0aCBleHRlcm5hbGl0aWVzLCBhbmQgYHIgcm91bmQoYXBwM19wdl9iZW5lZl9hbGxfbmV3X2luLCAyKWAgd2hlbiB1c2luZyB0aGUgYmVuZWZpdCBzdHJ1Y3R1cmUgb2YgYXBwcm9hY2ggMi4gIAoKIyMjIENvc3RzCgpFdmlkZW5jZSBBY3Rpb24ncyBEZXdvcm0gdGhlIFdvcmxkIEluaXRpYXRpdmUgcHJvdmlkZXMgdGVjaG5pY2FsIGFzc2lzdGFuY2UgdG8gZ292ZXJubWVudHMgdG8gaW1wbGVtZW50IHNjaG9vbC1iYXNlZCBkZXdvcm1pbmcgcHJvZ3JhbXMuIERld29ybSB0aGUgV29ybGQgd29ya3MgY2xvc2VseSB3aXRoIHBvbGljeW1ha2VycyBhbmQgZ292ZXJubWVudCBzdGFmZiB3aG8gYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZGV3b3JtaW5nIHByb2dyYW1zIHdpdGhpbiB0aGVpciBnZW9ncmFwaGllcyB0byBwbGFuLCBzY2FsZSwgYW5kIHN1c3RhaW4gc2Nob29sLWJhc2VkIGRld29ybWluZyBwcm9ncmFtcyB0YXJnZXRpbmcgYXQtcmlzayBjaGlsZHJlbi4gRGV3b3JtIHRoZSBXb3JsZCB3b3JrcyB0byBnYWluIGFuZCBtYWludGFpbiBjcml0aWNhbCBzdXBwb3J0IGFtb25nc3QgdGhlc2Uga2V5IHN0YWtlaG9sZGVycywgdGh1cyBoYXZpbmcgaW1wb3J0YW50IGluZmx1ZW5jZSBvdmVyIGhvdyBwb2xpY3ltYWtlcnMgdGFrZS1pbiBhbmQgdXNlIGV2aWRlbmNlIGZvciBkZWNpc2lvbiBtYWtpbmcuIFRocm91Z2ggRXZpZGVuY2UgQWN0aW9uJ3MgdGVjaG5pY2FsIGFzc2lzdGFuY2UsIHdoaWNoIHR5cGljYWxseSBpbmNsdWRlcyBmaW5hbmNpYWwgc3VwcG9ydCBmb3IgcHJvZ3JhbSBpbXBsZW1lbnRhdGlvbiwgdGhleSBoYXZlIGFjY2VzcyB0byBjb3VudHJ5LWxldmVsIGdvdmVybm1lbnQgY29zdCBkYXRhIG9uIHdoYXQgaXQgdGFrZXMgdG8gaW1wbGVtZW50IGFuZCBldmFsdWF0ZSBzY2hvb2wtYmFzZWQgZGV3b3JtaW5nIHByb2dyYW1zIGFjcm9zcyBkaWZmZXJlbnQgY29udGV4dHMuIFRvIGVzdGltYXRlIHRoZSBjb3N0cyBpbiB0aGlzIGFuYWx5c2lzLCB3ZSB1c2UgY29zdHMgb2YgZGV3b3JtaW5nIHByb3ZpZGVkIGJ5IEV2aWRlbmNlIEFjdGlvbiAoZGV0YWlsZWQgYmVsb3cpIGFuZCBmb2xsb3cgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIEBnaXZld2VsbCwgd2hpY2ggdGFrZXMgdGhvc2UgY29zdHMgYW5kIGluY2x1ZGVzIGFuIGFkZGl0aW9uYWwgZXN0aW1hdGUgYXJvdW5kIHRoZSBhbW91bnQgb2YgZ292ZXJubWVudCBzdGFmZiB0aW1lIHJlcXVpcmVkIHRvIHJ1biBkZXdvcm1pbmcgcHJvZ3JhbXMuIFRoZSBkZWZhdWx0IGNvc3QgaXMgdGhlIHBlciB1bml0IGNvc3QgcGVyIHRyZWF0bWVudCByb3VuZCBwZXIgY2hpbGQgYWNyb3NzIGFsbCBjb3VudHJpZXMuIFRoaXMgaXMgb2J0YWluZWQgYXMgdGhlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgcGVyIHVuaXQgY29zdHMgKCRjX3tpfSQpIGluIGFsbCBjb3VudHJpZXMgd2hlcmUgRXZpZGVuY2UgQWN0aW9uIGN1cnJlbnRseSBoYXMgZGF0YSBvbiBpbXBsZW1lbnRhdGlvbiBvZiBkZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucyBbXjEwXS4KClteMTBdOiBJbiBzb21lIHNldHRpbmdzIEV2aWRlbmNlIEFjdGlvbiBwcm92aWRlcyB0d28gcm91bmRzIG9mIHRyZWF0bWVudCBwZXIgeWVhci4gSW4gdGhvc2UgY2FzZXMsIHRoZSB1bml0IGNvc3RzIGRpc2N1c3NlZCBoZXJlIHJlcHJlc2VudCB0aGUgc3VtIG9mIGJvdGggcm91bmRzIFtDT05GSVJNIFdJVEggR1JBQ0VdCgpDb3N0cyBwZXIgY291bnRyeSBpbmNsdWRlIEV2aWRlbmNlIEFjdGlvbidzIHRlY2huaWNhbCBhc3Npc3RhbmNlIGNvc3RzLCBnb3Zlcm5tZW50IGV4cGVuZGl0dXJlIChpbmNsdWRpbmcgZXN0aW1hdGVzIG9mIGdvdmVybm1lbnQgc3RhZmYgdGltZSksIGFuZCBhbnkgb3RoZXIgcGFydG5lciBjb3N0cyBzdWNoIGFzIHRoZSBjb3N0IG9mIGRydWdzIGRvbmF0ZWQgYnkgV0hPLiBUaGVzZSBpdGVtcyBpbmNsdWRlOiBkcnVnIHByb2N1cmVtZW50IGFuZCBtYW5hZ2VtZW50LCBtb25pdG9yaW5nIGFuZCBldmFsdWF0aW9uLCBwb2xpY3kgYW5kIGFkdm9jYWN5LCBwcmV2YWxlbmNlIHN1cnZleXMsIHByb2dyYW0gbWFuYWdlbWVudCwgcHVibGljIG1vYmlsaXphdGlvbi9jb21tdW5pdHkgc2Vuc2l0aXphdGlvbiwgYW5kIHRyYWluaW5nIGFuZCBkaXN0cmlidXRpb24uIENvc3RzIGNhbiB2YXJ5IGJ5IGdlb2dyYXBoeSBkdWUgdG8gZmFjdG9ycyBvZiBwb3B1bGF0aW9uIHNpemUsIHRyZWF0bWVudCBzdHJhdGVnaWVzLCBhZ2Ugb2YgdGhlIHByb2dyYW0sIGFuZCBjb3N0cyBvZiAiZG9pbmcgYnVzaW5lc3MuIgoKVGhlIGNvdW50cnkgd2VpZ2h0cyBhcmUgY29tcHV0ZWQgYXMgdGhlIGZyYWN0aW9uIG9mIGFsbCB0cmVhdGVkIGluZGl2aWR1YWxzIHRoYXQgY29ycmVzcG9uZCB0byBhIGdpdmVuIGNvdW50cnkuIFRoZSBwZXIgY2FwaXRhIGNvc3Qgb2YgZWFjaCBjb3VudHJ5IGlzIG9idGFpbmVkIGJ5IGRpdmlkaW5nIHRoZSBjb3VudHJ5J3MgdG90YWwgY29zdHMgYnkgdGhlIHRvdGFsIG51bWJlciBvZiB0cmVhdGVkIGluZGl2aWR1YWxzIGluIGEgZ2l2ZW4gcGVyaW9kLiBUb3RhbCBjb3N0cyBmb3IgYSBjb3VudHJ5IHJlcHJlc2VudCB0aGUgdG90YWwgY29zdCBhY3Jvc3MgY291bnRyeSByZWdpb25zIGZhY2VkIGJ5IHRocmVlIGRpZmZlcmVudCBwYXllcnM6IEV2aWRlbmNlIEFjdGlvbiwgY291bnRyeSBnb3Zlcm5tZW50cywgYW5kIG90aGVyIHBhcnRuZXJzLiAgCgoKPGRldGFpbHM+PHN1bW1hcnk+U2hvdyBhbGwgdGhlIGRldGFpbHM8L3N1bW1hcnk+CgpcYmVnaW57ZXF1YXRpb259CkMgPSBcc3VtX3tpIFxpbiBDb3VudHJpZXMgfSBcb21lZ2Ffe2l9IGNfe2l9CmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXGVuZHtlcXVhdGlvbn0KClxiZWdpbntlcXVhdGlvbn0KXG9tZWdhX3tpfSA9IFxmcmFje05fe2l9fXtcc3VtX3tqfU5fe2p9fSBcXApjX3tpfSA9IFxmcmFje0Nfe2l9fXtOX3tpfX0gXFwKYHIgZXF1YXRpb25JbmRleCA8LSBlcXVhdGlvbkluZGV4ICsgMWAKXGxhYmVse2VxOmByIGVxdWF0aW9uSW5kZXhgfQpcdGFne2ByIGVxdWF0aW9uSW5kZXhgfQpcZW5ke2VxdWF0aW9ufQoKXGJlZ2lue2VxdWF0aW9ufQpDX3tpfSA9ICgxICsgXGRlbHRhX3tnfSlcc3VtX3trIFxpbiBwYXllcnN9Q197aSxrfSBcXApDX3tpLGt9ID0gXHN1bV97bCBcaW4gaXRlbXN9XHN1bV97bSBcaW4gcmVnaW9uc31DX3tpLGssbCxtfQpcZW5ke2VxdWF0aW9ufQoKV2hlcmU6ICAKCi0gJEMkOiB3ZWlnaHRlZCBhdmVyYWdlIG9mIHBlciB1bml0IGNvc3RzIGluIGFsbCBjb3VudHJpZXMgIAotICRjX2kkOiBwZXIgdW5pdCBjb3N0cyBpbiBkaWZmZXJlbnQgY291bnRyaWVzICAKLSAkXG9tZWdhX2kkOiBjb3VudHJ5IHdlaWdodHMgZm9yIGNvbXB1dGluZyB0aGUgY29zdHMgICAKLSAkTiQ6IHRoZSBudW1iZXIgb2YgYWxsIHRyZWF0ZWQgaW5kaXZpZHVhbHMgICAKLSAkQ197aSxrfSQ6IGNvc3RzIG9mIGEgY291bnRyeSBhdCBhIHNwZWNpZmljIHBheWVyIGxldmVsICAKLSAkXGRlbHRhX2ckOiBhZGRpdGlvbmFsIGdvdmVybm1lbnQgc3RhZmYgdGltZSByZXF1aXJlZCB0byBpbXBsZW1lbnQgYSB0eXBpY2FsIGRld29ybWluZyBpbnRlcnZlbnRpb24KCmBgYHtyIGVxXzMsIGVjaG89cHJpbnRfY29kZSwgZXZhbD1UUlVFfSAgCiMgLSBpbnB1dHM6IGNvc3QgZGF0YSBieSBwYXllciB0eXBlIGF0IHRoZSBjb250cnkvcHJvdmluY2UgbGV2ZWwgYnkgeWVhciAoZGZfY29zdHNfc28pCiMgIGNyb3Nzd2FsayBiZXR3ZWVuIGNvdW50cnkvc3RhdGUgYW5kIHJlZ2lvbiAoZGZfY29zdHNfY3dfc28pLCB0cmVhdG1lbnQgY291bnRzCiMgIGJ5IGNvdW50cnkvcHJvdmluY2UgYW5kIHllYXIgKGRmX2NvdW50c19zbyk7IHN0YWZmIHRpbWUgYWRqdXNtZW50IGZhY3RvcgojICAoc3RhZmZfdGltZV9zbyksCiMgLSBvdXRwdXRzOiBjb3VudHJ5IGxldmVsIGNvc3QgYW5kIHBvcHVsYXRpb24gZGF0YSAoY29zdHMxX3AxX2YpIGFuZCBjb3VudHJ5CiMgIHdlaWdodHMgYW5kIHBlciBjYXBpdGEgY29zdHMgKGNvc3RzMV9wMl9mKQojCmNodW5rX2Nvc3QxX2lucCA8LSBmdW5jdGlvbigpewojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgIAogICMgY2xlYW4gYW5kIGFnZ3JlYWdhdGUgZGF0YSBhdCBjb3VudHJ5IGxldmVsCiAgY29zdHMxX3AxX2YgPC0gZnVuY3Rpb24oCiAgICBkZl9jb3N0c192YXIgPSBkZl9jb3N0c19zbywKICAgIGRmX2Nvc3RzX2N3X3ZhciA9IGRmX2Nvc3RzX2N3X3NvLAogICAgZGZfY291bnRzX3ZhciA9IGRmX2NvdW50c19zbykgewogICAgIyMgQ291bnRzCiAgICAjIERhdGEgY2xlYW5uaW5nOgogICAgIyBBZGQgY291bnRyeSB2YXJpYWJsZQogICAgIyBhbm95aW5nIG1lc3NhZ2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzYyMTQwNDgzL2hvdy10by1pbnRlcnByZXQtZHBseXItbWVzc2FnZS1zdW1tYXJpc2UtcmVncm91cGluZy1vdXRwdXQtYnkteC1vdmVycmlkZQoKICAgIGRmX2NvdW50c190ZW1wIDwtIGRmX2Nvc3RzX2N3X3ZhciAlPiUKICAgICAgcmlnaHRfam9pbihkZl9jb3VudHNfdmFyLCBieSA9ICJDb3VudHJ5L1N0YXRlIikgJT4lCiAgICAgIG11dGF0ZShDb3VudHJ5ID0gdG9sb3dlcihDb3VudHJ5KSkKICAgICMga2VlcCBvbmx5IGxhc3QgeWVhciBvbiByZWNvcmQKICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICAgICAgZGZfY291bnRzX2xhc3QgPC0gZGZfY291bnRzX3RlbXAgJT4lCiAgICAgICAgICBncm91cF9ieShDb3VudHJ5KSAlPiUKICAgICAgICAgIHN1bW1hcmlzZSgibGFzdF95ZWFyIiA9IG1heChZZWFyKSkgJT4lCiAgICAgICAgICByaWdodF9qb2luKGRmX2NvdW50c190ZW1wLCBieSA9ICJDb3VudHJ5IikgJT4lCiAgICAgICAgICBmaWx0ZXIoWWVhciA9PSBsYXN0X3llYXIpICAgICAgICAgIAogICAgKQogICAgIyBjb21wdXRlIGNvdW50cyBhcyB0aGUgc3VtIHdpdGgtaW4gY291bnRyeS15ZWFyIG9mIHRyZWF0bWVudHMKICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICAgICAgY19jb3VudHMgPC0gZGZfY291bnRzX2xhc3QgJT4lCiAgICAgICAgICBncm91cF9ieShDb3VudHJ5LCBZZWFyKSAlPiUKICAgICAgICAgIHN1bW1hcmlzZSgidG90YWwiID0gc3VtKGAjIGRld29ybWVkYCkpCiAgICApCgogICAgIyMgQ29zdHMKICAgICMgRGF0YSBjbGVhbmluZzoKICAgICMgQWRkIGNvdW50cnkgdmFyaWFibGUKICAgIGRmX2Nvc3RzX3RlbXAgPC0gZGZfY29zdHNfY3dfdmFyICU+JQogICAgICByaWdodF9qb2luKGRmX2Nvc3RzX3ZhciwgYnkgPSAiQ291bnRyeS9TdGF0ZSIpICU+JQogICAgICBzZWxlY3QoLUNvdW50cnkueSkgJT4lIHJlbmFtZShDb3VudHJ5ID0gQ291bnRyeS54KSAlPiUKICAgICAgbXV0YXRlKENvdW50cnkgPSB0b2xvd2VyKENvdW50cnkpKQogICAgIyB2YWx1ZXMgZm9yIGxhc3QgeWVhciB3aXRoIGNvc3QgaW5mb3JtYXRpb24KICAgIHN1cHByZXNzTWVzc2FnZXMoICAgICAgICAgICAgCiAgICBkZl9jb3N0c19sYXN0IDwtIGRmX2Nvc3RzX3RlbXAgJT4lCiAgICAgIGdyb3VwX2J5KENvdW50cnkpICU+JQogICAgICBzdW1tYXJpc2UoImxhc3RfeWVhciIgPSBtYXgoWWVhcikpICU+JQogICAgICByaWdodF9qb2luKGRmX2Nvc3RzX3RlbXAsIGJ5ID0gIkNvdW50cnkiKSAlPiUKICAgICAgZmlsdGVyKFllYXIgPT0gbGFzdF95ZWFyKSAgICAKICAgICAgKSAgICAgIAogICAgICMgc3VtbWluZyBhY3Jvc3MgcGF5ZXJzIGFuZCByZWdpb25zIChsYXN0IGVxdWF0aW9uKQogICAgc3VwcHJlc3NNZXNzYWdlcyggICAgICAgICAgICAKICAgIGNvc3RzX2J5X3BheWVyIDwtIGRmX2Nvc3RzX2xhc3QgJT4lCiAgICAgIGZpbHRlcihQYXllciAhPSAiVG90YWwiKSAlPiUKICAgICAgZ3JvdXBfYnkoQ291bnRyeSwgUGF5ZXIpICU+JQogICAgICBzdW1tYXJpc2UoImNvc3RzX2J5X3BheWVyIiA9CiAgICAgICAgICAgICAgICAgIHN1bShzdXBwcmVzc1dhcm5pbmdzKCBhcy5udW1lcmljKENvc3QpICksIG5hLnJtID0gVFJVRSkpCiAgICApICAgIAogICAgI3N1bSBhY3Jvc3MgcGF5ZXJzCiAgICBzdXBwcmVzc01lc3NhZ2VzKCAgICAgICAgICAgIAogICAgY291bnRyeV9jb3N0IDwtIGNvc3RzX2J5X3BheWVyICU+JQogICAgICBncm91cF9ieShDb3VudHJ5KSAlPiUKICAgICAgc3VtbWFyaXNlKCJjb3N0c19ieV9jb3VudHJ5IiA9CiAgICAgICAgICAgICAgICAgIHN1bShjb3N0c19ieV9wYXllcikgKSAgCiAgICAjIENvbXB1dGUgdGhlIHBlciBjYXBpdGEgY29zdCBmb3IgZWFjaCBjb3VudHJ5IChjX2kgYW5kIHdfaSkKICAgICkKICAgIGNvc3RzX2RhdGFfaW4gPC0gY291bnRyeV9jb3N0ICU+JQogICAgICAgbGVmdF9qb2luKGNfY291bnRzLCBieSA9ICJDb3VudHJ5IikKCiAgICByZXR1cm4oIGNvc3RzX2RhdGFfaW4gKQogIH0KCiAgIyBDb21wdXRlIHdlaWdodHMgYW5kIHBlciBjYXB0YSBjb3N0cwogIGNvc3RzMV9wMl9mIDwtIGZ1bmN0aW9uKGNvdW50cnlfdG90YWxfdmFyID0gY29zdHNfZGF0YV9pbiR0b3RhbCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfY29zdF92YXIgPSBjb3N0c19kYXRhX2luJGNvc3RzX2J5X2NvdW50cnksCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3ZhciA9IHN0YWZmX3RpbWVfc28sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X25hbWVfdmFyID0gY29zdHNfZGF0YV9pbiRDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXRuYW0iKSwKICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2Nvc3RzX3ZhciA9IE5VTEwpIHsKICAgICAgIyBzZWxlY3QgY291bnRyaWVzCiAgICAgIGNvdW50cnlfdG90YWxfdmFyX3RlbXAgPC0gY291bnRyeV90b3RhbF92YXJbY291bnRyeV9uYW1lX3ZhciAlaW4lIHNlbGVjdF92YXJdCiAgICAgIGNvdW50cnlfY29zdF92YXJfdGVtcCA8LSBjb3VudHJ5X2Nvc3RfdmFyW2NvdW50cnlfbmFtZV92YXIgJWluJSBzZWxlY3RfdmFyXQogICAgICAjIGNyZWF0ZSBjb3VudHJ5IHdlaWdodAogICAgICBjX3dlaWdodHMgPC0gY291bnRyeV90b3RhbF92YXJfdGVtcCAvIHN1bShjb3VudHJ5X3RvdGFsX3Zhcl90ZW1wKQogICAgICAjIGNyZWF0ZSBjb3VudHJ5IHBlciBjYXBpdGEgY29zdHMsIGFkanVzdGVkIGJ5IHN0YWZmIHRpbWUKICAgICAgcGVyX2NhcCA8LSBjb3VudHJ5X2Nvc3RfdmFyX3RlbXAgKiAoMSArIHN0YWZmX3RpbWVfdmFyKSAvCiAgICAgICAgY291bnRyeV90b3RhbF92YXJfdGVtcAogICAgICAjIHJlcGxhY2UgY29udHJ5IGNvc3RzIHdpdGggbmV3IG9uZSBpZiB0aGVyZSBpcyBhIG5ldyBjb3VudHJ5CiAgICAgICMgKG9ubHkgY291bnQgdGhhdCBuZXcgY291bnRyeSkKICAgICAgIyAodGhlIHdlaWdodGhlZCBzdW0gb2YgdGhpcyBzY2FsYXIgd2lsbCBqdXN0IGJlIHRoZSBzYW1lIG51bWJlcikKICAgICAgaWYgKCFpcy5udWxsKG90aGVyX2Nvc3RzX3ZhcikpIHsKICAgICAgIyBpZiAoRkFMU0UpIHsgIAogICAgICAgIHBlcl9jYXAgPC0gb3RoZXJfY29zdHNfdmFyICogKDEgKyBzdGFmZl90aW1lX3ZhcikKICAgICAgfQogICAgICByZXR1cm4oIHN1bShjX3dlaWdodHMgKiBwZXJfY2FwKSApCiAgICB9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgCiAgICByZXR1cm4oIGxpc3QoImNvc3RzMV9wMV9mIiA9IGNvc3RzMV9wMV9mLAogICAgICAgICAgICAgICAgICJjb3N0czFfcDJfZiIgPSBjb3N0czFfcDJfZikgKQp9CmludmlzaWJsZSggbGlzdDJlbnYoY2h1bmtfY29zdDFfaW5wKCksLkdsb2JhbEVudikgKQoKIyMjIyMgRXhlY3V0ZSB2YWx1ZXMgb2YgdGhlIGZ1bmN0aW9ucyBhYm92ZSB3aGVuIG5lZWRlZCBmb3IgdGhlIHRleHQ6CmNvc3RzX2RhdGFfaW4gPC0gY29zdHMxX3AxX2YoKQpjb3N0czFfcDJfaW4gPC0gY29zdHMxX3AyX2Yoc2VsZWN0X3ZhciA9IGxpc3QoImluZGlhIiwgImtlbnlhIiwgIm5pZ2VyaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZXRuYW0iKSkKYGBgCgo8L2RldGFpbHM+CgpUaGUgdW5pdCBjb3N0cyBvZiB0cmVhdG1lbnRzLCBhbHRob3VnaCBzbWFsbCwgdmFyeSBzdWJzdGFudGlhbGx5IGFjcm9zcyByZWdpb25zLiBXaGVuIGluY2x1ZGluZyBjb3N0IGluZm9ybWF0aW9uIGZvciBhbGwgdGhlIGNvdW50cmllcyB3aGVyZSBFdmlkZW5jZSBhY3Rpb24gaGFzIGRhdGEgKEluZGlhLCBLZW55YSwgTmlnZXJpYSwgVmlldG5hbSkgdGhlIHVuaXQgY29zdHMgaXMgYHIgcGFzdGUwKCIkIiwgcm91bmQoY29zdHMxX3AyX2luLCAyKSlgIHBlciByb3VuZCBvZiB0cmVhdG1lbnQgW0NPTkZJUk0gV0lUSCBHUkFDRSwgSEFSTU9OSVpFIFdJVEggRk9PVE5PVEVdLiBUaGlzIGZpbmFsIGNvc3QgaXMgcHJpbWFyaWx5IGRyaXZlbiBieSB0aGUgY29zdCwgYW5kIGxhcmdlIHBvcHVsYXRpb24sIG9mIEluZGlhLCB3aXRoIGEgdW5pdCBjb3N0IG9mIGByIHBhc3RlMCgiJCIsIHJvdW5kKGNvc3RzMV9wMl9mKHNlbGVjdF92YXIgPSBsaXN0KCJpbmRpYSIpKSwgMiApKWAsIHRoZSBvdGhlciAzIHJlbWFpbmluZyBjb3VudHJpZXMgaGF2ZSByZWxhdGl2ZWx5IGxhcmdlciB1bml0IGNvc3RzOiBgciBwYXN0ZTAoIiQiLCByb3VuZChjb3N0czFfcDJfZihzZWxlY3RfdmFyID0gbGlzdCgia2VueWEiKSksIDIgKSlgLCBgciBwYXN0ZTAoIiQiLCByb3VuZChjb3N0czFfcDJfZihzZWxlY3RfdmFyID0gbGlzdCgibmlnZXJpYSIpKSwgMiApKWAsIGByIHBhc3RlMCgiJCIsIHJvdW5kKGNvc3RzMV9wMl9mKHNlbGVjdF92YXIgPSBsaXN0KCJ2aWV0bmFtIikpLCAyICkpYCBmb3IgS2VueWEsIE5pZ2VyaWEgYW5kIFZpZXRuYW0gcmVzcGVjdGl2ZWx5LgoKCmBgYHtyIHN1bS10YWJsZTE4LCBwdXJsPUZBTFNFLCBlY2hvPUZBTFNFLCBldmFsPXNob3dfc3VtbWFyeV90YWJsZXN9CnRhYmxlXzFbMSwzXSA8LSBwYXN0ZTAoIiRcXGRlbHRhX3tnfT0iLCBzdGFmZl90aW1lX3NvLCAiJCIpCnRhYmxlXzFbMTAsMV0gPC0gcGFzdGUwKCIkXFxvdmVybGluZXt7Q31fe2l9fT0iLCByb3VuZChjb3N0czFfcDJfZihjb3VudHJ5X3RvdGFsX3ZhciA9IGNvc3RzX2RhdGFfaW4kdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X2Nvc3RfdmFyID0gY29zdHNfZGF0YV9pbiRjb3N0c19ieV9jb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIgPSBzdGFmZl90aW1lX3NvKSwgMiksICIkIikgI3dlaWdodGVkIGF2ZXJhZ2UKdGFibGVfMVsxMSwxXSA8LSBwYXN0ZTAoIiRcXG92ZXJsaW5le3tOfV97aX19PSIsIHJvdW5kKG1lYW4oY29zdHNfZGF0YV9pbiR0b3RhbCkpLCAiJCIpCgp0YWJsZV8xIDwtIHJiaW5kKHRhYmxlXzEsCiAgICAgICAgICAgICAgICAgYygiIiwgcGFzdGUwKCIkXFxldGE9IiwgcHJldmFsZW5jZV8wX3NvLCAiJCIpLCAiIiksICNjaGFuZ2UgdG8gZXRhCiAgICAgICAgICAgICAgICAgYygiIiwgcGFzdGUwKCIkXFxldGFfe3J9PSIsIHByZXZhbGVuY2Vfcl9zbywgIiQiKSwgIiIpKQoKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkQyA9IFxcc3VtX3tpIFxcaW4gQ291bnRyaWVzIH0gXFxvbWVnYV97aX0gY197aX0kIiwKICAgICAgICAgICAgICAgICAgIHBhc3RlMCgiJCgiLCBzdW1fdGFibGVfaW5kZXgsICIpJCIpICkKICAgICkKc3VtX3RhYmxlX2luZGV4IDwtIHN1bV90YWJsZV9pbmRleCsxCnRhYmxlXzIgPC0gcmJpbmQodGFibGVfMiwKICAgICAgICAgICAgICAgICBjKCIkXFxvbWVnYV97aX0gPSBcXGZyYWN7Tl97aX19e1xcc3VtX3tqfU5fe2p9fSBcXApjX3tpfSA9IFxmcmFje0Nfe2l9fXtOX3tpfX0gXFwKQ197aX0gPSAoMSArIFxcZGVsdGFfe2d9KVxcc3VtX3trIFxcaW4gcGF5ZXJzfUNfe2ksa30gXFwKQ197aSxrfSA9IFxcc3VtX3tsIFxcaW4gaXRlbXN9XFxzdW1fe20gXFxpbiByZWdpb25zfUNfe2ksayxsLG19JCIsCiAgICAgICAgICAgICAgICAgICBwYXN0ZTAoIiQoIiwgc3VtX3RhYmxlX2luZGV4LCAiKSQiKSApCiAgICApCgpzdW1fdGFibGVfaW5kZXggPC0gc3VtX3RhYmxlX2luZGV4KzEKdGFibGVfMiA8LSByYmluZCh0YWJsZV8yLAogICAgICAgICAgICAgICAgIGMoIiRcXGxhbWJkYV97MX0gPSBcXGFscGhhIFxcbGFtYmRhXntlZmZ9X3sxfSArICgxIC0gIFxcYWxwaGEpIFxcdGltZXMgMCQiLAogICAgICAgICAgICAgICAgICAgcGFzdGUwKCIkKCIsIHN1bV90YWJsZV9pbmRleCwgIikkIikgKQogICAgKQoKa25pdHI6OmthYmxlKHRhYmxlXzIsIGNvbC5uYW1lcyA9IGMoIkVxdWF0aW9uIiwgIiMiKSwgY2FwdGlvbiA9ICJTdW1tYXJ5IG9mIGVxdWF0aW9ucyB1c2VkIHVudGlsIHRoaXMgcG9pbnQgaW4gdGhlIGRvY3VtZW50IikgJT4lCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpCgprbml0cjo6a2FibGUodGFibGVfMSwgY29sLm5hbWVzID0gYygiRGF0YSIsICJSZXNlYXJjaCIsICJHdWVzc3dvcmsiKSwgY2FwdGlvbiA9ICJTb3VyY2VzOiBzdW1tYXJ5IG9mIGlucHV0cyBzcGVjaWZpZWQgdW50aWwgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQiKSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkKYGBgCgoKIyMgQWNjb3VudGluZyBmb3IgVW5jZXJ0YWludHkKClRoaXMgb3BlbiBwb2xpY3kgYW5hbHlzaXMgaGFzIGFpbWVkIHRvIG1ha2UgYWxsIHRoZSBhbmFseXNpcyBwcmVzZW50ZWQgc28gZmFyIGhpZ2hseSByZXByb2R1Y2libGUuIE9uZSBkaXJlY3QgcmVzdWx0IG9mIHRoaXMgbm92ZWwgYXBwcm9hY2ggaXMgdGhhdCBub3cgaXQgaXMgcG9zc2libGUgdG8gdGhvcm91Z2hseSBhc3Nlc3MgaG93IHRoZSBmaW5hbCBwb2xpY3kgZXN0aW1hdGVzIGNoYW5nZSB3aGVuIGFueSBvZiB0aGUgdW5kZXJseWluZyBzb3VyY2VzIG9mIHRoZSBhbmFseXNpcyBjaGFuZ2VzLiBJbiB0aGlzIE9QQSB3ZSBoYXZlIGlkZW50aWZpZWQgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGUgYW5hbHlzaXMgYmVoaW5kIGJlbmVmaXRzIGFuZCBjb3N0cyBvZiBEZXdvcm1pbmcgaW50ZXJ2ZW50aW9ucy4gRWFjaCBvZiB0aGVzZSBzb3VyY2VzIGluIHR1cm4gaXMgbWVhc3VyZWQgd2l0aCBzb21lIHVuY2VydGFpbnR5IChlaXRoZXIgaW4gcHJlZGljdGlvbiBvZiBmdXR1cmUgdmFsdWVzIG9yIGVzdGltYXRpb24gb2YgcGFzdCBvbmVzKS4gVHJhZGl0aW9uYWwgcG9saWN5IGFuYWx5c2lzIGFzc3VtZXMgdGhhdCBlYWNoIG9mIHRoZXNlIHNvdXJjZXMgaGFzIG5vIHVuY2VydGFpbnR5LCBhbmQgaW4gc29tZSBjYXNlcyBpbmNvcnBvcmF0ZXMgdW5jZXJ0YWludHkgb3IgcGVyZm9ybWVkIHNlbnNpdGl2aXR5IGFuYWx5c2lzIGZvciBhIGZldyBwYXJhbWV0ZXJzIG9mIGludGVyZXN0LiBCeSBmb2xsb3dpbmcgdGhlIG9wZW4gcG9saWN5IGFuYWx5c2lzIHByaW5jaXBsZXMgd2Ugbm93IGNhbiBhbGxvdyBmb3IgZWFjaCBzb3VyY2UgdG8gdmFyeSBhbmQgZXhwbG9yZSB0aGUgb3ZlcmFsbCB1bmNlcnRhaW50eSBvZiB0aGUgZmluYWwgcG9saWN5IGVzdGltYXRlLgoKT3VyIGFwcHJvYWNoIGNvbnNpc3RzIGluIGFzc3VtaW5nIHRoYXQgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGUgYW5hbHlzaXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgcmFuZG9tIGRyYXcgZnJvbSBhIG5vcm1hbCBkaXN0cmlidXRpb24uIFRoZSBtZWFuIGNvcnJlc3BvbmRzIHRvIHRoZSBtZWFzdXJlZCB2YWx1ZS4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgZXN0aW1hdGVkIHN0YW5kYXJkIGVycm9yIHdoZW4gYXZhaWxhYmxlLCBhbmQgdG8gYSBmcmFjdGlvbiBvZiB0aGUgbWVhbiB3aGVuIG5vdCBhdmFpbGFibGUuIEFzIGEgZGVmYXVsdCBhbmFseXNpcyB3ZSBzdWdnZXN0IHRvIHNldCBpdCB0aGVzZSBzdGFuZGFyZCBkZXZpYXRpb25zIHRvIDEwJSBvZiB0aGUgbWVhbi4gVGhpcyBjaG9pY2UgaXMgYXJiaXRyYXJ5LCBidXQgdW5saWtlIHRoZSBkZWZhdWx0IGFyYml0cmFyeSBjaG9pY2Ugb2Ygc2V0dGluZyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyB0byB6ZXJvLCBpdCBtYWtlcyBleHBsaWNpdCB0aGUgdW5jZXJ0YWludHkgYW5kIGl0IGNhbiBiZSBtb2RpZmllZCBpbiB0aGUgYXBwLgoKCjxkZXRhaWxzPjxzdW1tYXJ5PlNob3cgYWxsIHRoZSBkZXRhaWxzPC9zdW1tYXJ5PgoKTGV0ICR4JCBkZW5vdGUgZWFjaCBzb3VyY2UgdXNlZCBpbiB0aGlzIGFuYWx5c2lzLiAgCgpcYmVnaW57ZXF1YXRpb259CnggXHNpbSBOKFxoYXR7eH0sIFxzaWdtYV97eH0pCmByIGVxdWF0aW9uSW5kZXggPC0gZXF1YXRpb25JbmRleCArIDFgClxsYWJlbHtlcTpgciBlcXVhdGlvbkluZGV4YH0KXHRhZ3tgciBlcXVhdGlvbkluZGV4YH0KXFwKXHNpZ21hX3t4fSA9ClxiZWdpbntjYXNlc30KXGhhdHtcc2lnbWFfe3h9fSBccXVhZCBcdGV4dHtJZiAkXGhhdHtcc2lnbWFfe3h9fSQgaXMgYXZhaWxhYmxlfVxcClxcClxkZWx0YV97dX1caGF0e3h9IFxxdWFkIFx0ZXh0e290aGVyd2lzZX0KXGVuZHtjYXNlc30KXGVuZHtlcXVhdGlvbn0KCkFzIGEgZGVmYXVsdCAkXGRlbHRhX3t1fSA9IDAuMSQKCmBgYHtyIG1jLXNldHVwLCBldmFsPVRSVUUsIGVjaG8gPSBwcmludF9jb2RlfSAgCiMgVGhpcyBmdW5jdGlvbiB0YWtlcyBhcyBpbnB1dHMgbWVhbnMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbnMgb2Ygc291cmNlCiMgcGFyYW1ldGVycyBhbmQgc2ltdWFsdGUgZHJhd3Mgb2YgZWFjaCBzb3VyY2UuIFdoZW4gdGhlIHNvdXJjZSBpcyBhIHNjYWxhciwKIyBpdCBnZW5lcmF0ZXMgYSBkcmF3IGZyb20gYSBub3JvbWFsIGRpc3QgKG1lYW4sIHNkKS4gV2hlbiBpdCBpcyBhICJzbWFsbCIKIyAobGVzcyB0aGFuIDQgZWxlbWVudHMpIHZlY3RvciwgZ2VuZXJhdGVzIGluZGVwZW5kZW50IG11bHRpdmFyaWF0ZSBub3JtYWxzLgoKCiNiZWdpbiBieSBjbGVhbmluZyB1cCB0aGUgY29zdCBkYXRhIG9uY2UKY29zdHNfZGF0YV9pbiA8LSBjb3N0czFfcDFfZihkZl9jb3N0c192YXIgPSBkZl9jb3N0c19zbywKICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jb3N0c19jd192YXIgPSBkZl9jb3N0c19jd19zbywKICAgICAgICAgICAgICAgICAgICAgICAgICBkZl9jb3VudHNfdmFyID0gZGZfY291bnRzX3NvKQoKCiMgRGF0YTogc291cmNlIGNvbWVzIGZyb20gYSBzdGFuZGFyZCBkYXRhIHNvdXJjZS4gR292ZXJubWVudCBzdGF0aXN0aWMgb3Igb3RoZXIKIyBwdWJsaWNseSBhdmFpbGFibGUgc3RhdGlzdGljCiMgUmVzZWFyY2g6IGFueSBzb3VyY2VzIHRoYXQgcmVxdWllcmVzIHNvbWUgdHlwZSBvZiBpbnZlc3RpZ2F0aW9uIHRvIG9idGFpbgojIEd1ZXNzd29yazogbm8gY2xlYXIgc291cmNlIGF2YWlsYWJsZQoKc2ltX2RhdGExX2YgPC0gZnVuY3Rpb24obnNpbXNfdmFyMiA9IDFlMiwgICAgICAgICAgICAgICAgICAgIyAiU2V0dXAiIHZhcnMKICAgICAgICAgICAgICAgICAgICAgIG1haW5fcnVuX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3N0c19kYXRhX3ZhcjIgPSBjb3N0c19kYXRhX2luLAogICAgICAgICAgICAgICAgICAgICAgcnVuX3NpbV92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRyaWVzX3ZhcjIsCgogICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIyLCAgICAgICAgICAgICAgICAgICMgIkRhdGEiIHZhcnMKICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBncm93dGhfcmF0ZV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZ292X2JvbmRzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBnb3ZfYm9uZHNfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGdvdl9ib25kc19uZXdfdmFyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgZ292X2JvbmRzX25ld19zZF92YXIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaW5mbGF0aW9uX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fbmV3X3ZhcjIsICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl9uZXdfc2RfdmFyMiwgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICB0YXhfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRheF9zZF92YXIyLAoKICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFfdmFyMiwgICAgICAgICAgICAgICAgICAjICJSZXNlYXJjaCIgdmFycwogICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgbGFtYmRhMV9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFfbmV3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEyX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB3YWdlX2FnX3ZhcjIsICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIHdhZ2VfYWdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHdhZ2Vfd3dfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByb2ZpdHNfc2Vfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19hZ19zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfd3dfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3d3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBob3Vyc19zZV92YXIyLAogICAgICAgICAgICAgICAgICAgICAgaG91cnNfc2Vfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjIsICAgICAgICAgIyBzZCBmb3IgY29lZl9leHAgaXMgaGFyZCBjb2RlZAogICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlXzBfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHByZXZhbGVuY2Vfcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBuZXdfcHJldmxfcl92YXIyLCAgICAgICAjIHN1YnN0aXR1ZGVzIHRoZSBwcmV2X3IgYWJvdmU/PwogICAgICAgICAgICAgICAgICAgICAgbmV3X3ByZXZsX3Jfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZV9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgcV9mdWxsX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBxX2Z1bGxfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHFfemVyb192YXIyLAogICAgICAgICAgICAgICAgICAgICAgcV96ZXJvX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZGVsdGFfZWRfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgZGVsdGFfZWRfZXh0X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgdGVhY2hfYmVuX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB0ZWFjaF9iZW5fc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5fc3R1ZGVudHNfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3Rfc2RfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgdW5pdF9jb3N0X2xvY2FsX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBjb3N0c19wYXJfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIGNvc3RzX3Bhcl9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRzX3Bhcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgY291bnRzX3Bhcl9zZF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIyLCAgICAgICMgR3Vlc3N3b3JrCiAgICAgICAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3NkX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICBuZXdfY29zdHNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgIG5ld19jb3N0c19zZF92YXIyCiAgICAgICAgICAgICAgICAgICAgICApIHsKICAgIHN0YXJ0X3RpbWUgPC0gU3lzLnRpbWUoKQogICAgIyMjIyMjIyMjIyMjIyMjIwogICAgIyMjIyMjIERyYXdzCiAgICAjIyMjIyMjIyMjIyMjIyMjCiAgICBzZXQuc2VlZCgxNDI4NTcpCiAgICAjRGVmYXVsdCBkaXN0OiBub3JtYWwsIGRlZmF1bHQgc2Q6IDAuMSogbWVhbgogICAgIwogICAgIyBTb3VyY2VzIGFyZSBzZXBhcmF0ZWQgaW50bzogZGF0YSwgcmVzZWFyY2ggYW5kIGd1ZXNzIHdvcmsKICAgICMjIERhdGEKICAgIGdvdl9ib25kc19zaW0gPC0gICAgICAgIHJub3JtKG4gPSBuc2ltc192YXIyLCBtZWFuID0gZ292X2JvbmRzX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGdvdl9ib25kc19zZF92YXIyKQogICAgaW5mbGF0aW9uX3NpbSA8LSAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgaW5mbGF0aW9uX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fc2RfdmFyMikKICAgIGdvdl9ib25kc19uZXdfc2ltIDwtICAgIHJub3JtKG4gPSBuc2ltc192YXIyLCBtZWFuID0gZ292X2JvbmRzX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSBnb3ZfYm9uZHNfbmV3X3NkX3ZhcjIpCiAgICBpbmZsYXRpb25fbmV3X3NpbSA8LSAgICBybm9ybShuc2ltc192YXIyLCBpbmZsYXRpb25fbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRpb25fbmV3X3NkX3ZhcjIpICAgICAgICAgICAgICAgICAgCiAgICBncm93dGhfcmF0ZV9zaW0gPC0gICAgICBybm9ybShuc2ltc192YXIyLCBncm93dGhfcmF0ZV92YXIyLCBncm93dGhfcmF0ZV9zZF92YXIyKQogICAgZXhfcmF0ZV9zaW0gPC0gICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgZXhfcmF0ZV92YXIyLCBleF9yYXRlX3NkX3ZhcjIpCiAgICB0YXhfc2ltIDwtICAgICAgICAgICAgICBybm9ybShuc2ltc192YXIyLCB0YXhfdmFyMiwgdGF4X3NkX3ZhcjIpCgogICAgIyMgUmVzZWFyY2gKICAgIGF1eDEgPC0wLjEgKiBjKGxhbWJkYTFfdmFyMlsxXSwgMC4wMSkKICAgICMgRWFjaCBsaXN0IGlzIGEgcGFpciBtZWFuLCBzZC4KICAgIGF1eDIgPC0gIGxhcHBseSgxOjIsIGZ1bmN0aW9uKHgpIGMobGFtYmRhMV92YXIyW3hdLCBjKDEuNDIsIDEuMzYpW3hdICkgKQogICAgbGFtYmRhMV9zaW0gPC0gc2FwcGx5KGF1eDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsIG1lYW4gPSB4WzFdLCBzZCA9IHhbMl0pICkKICAgIGxhbWJkYTJfc2ltIDwtICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGxhbWJkYTJfdmFyMiwgIGxhbWJkYTJfc2RfdmFyMikKICAgICMgTmV3IGxhbWJkYSBoZXJlCiAgICBsYW1iZGExX25ld19zaW0gPC0gcm5vcm0obnNpbXNfdmFyMiwgbGFtYmRhMV9uZXdfdmFyMiwgIGxhbWJkYTFfbmV3X3NkX3ZhcjIpCgoKICAgIHdhZ2VfYWdfc2ltIDwtICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHdhZ2VfYWdfdmFyMiwgd2FnZV9hZ19zZF92YXIyKQogICAgd2FnZV93d19zaW0gPC0gICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgd2FnZV93d192YXIyLCB3YWdlX3d3X3NkX3ZhcjIpCiAgICBwcm9maXRzX3NlX3NpbSA8LSAgICAgICBybm9ybShuc2ltc192YXIyLCBwcm9maXRzX3NlX3ZhcjIsIHByb2ZpdHNfc2Vfc2RfdmFyMikKICAgIGhvdXJzX3NlX2NvbmRfc2ltIDwtICAgIHJub3JtKG5zaW1zX3ZhcjIsIGhvdXJzX3NlX2NvbmRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMikKICAgIGhvdXJzX2FnX3NpbSA8LSAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGhvdXJzX2FnX3ZhcjIsIGhvdXJzX2FnX3NkX3ZhcjIpCiAgICBob3Vyc193d19zaW0gPC0gICAgICAgICBybm9ybShuc2ltc192YXIyLCBob3Vyc193d192YXIyLCBob3Vyc193d19zZF92YXIyKQogICAgaG91cnNfc2Vfc2ltIDwtICAgICAgICAgcm5vcm0obnNpbXNfdmFyMiwgaG91cnNfc2VfdmFyMiwgaG91cnNfc2Vfc2RfdmFyMikKICAgIGNvdmVyYWdlX3NpbSA8LSAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIGNvdmVyYWdlX3ZhcjIsIGNvdmVyYWdlX3NkX3ZhcjIpCgogICAgdW5pdF9jb3N0X2xvY2FsX3NpbSA8LSAgcm5vcm0obnNpbXNfdmFyMiwgdW5pdF9jb3N0X2xvY2FsX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfc2RfdmFyMikKICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfc2ltIDwtICBybm9ybShuc2ltc192YXIyLCB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfc2RfdmFyMikKCiAgICB5ZWFyc19vZl90cmVhdF8wX3NpbSA8LSAgIHJub3JtKG5zaW1zX3ZhcjIsIHllYXJzX29mX3RyZWF0XzBfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfc2RfdmFyMikKICAgIHllYXJzX29mX3RyZWF0X3Rfc2ltIDwtICAgcm5vcm0obnNpbXNfdmFyMiwgeWVhcnNfb2ZfdHJlYXRfdF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF9zZF92YXIyKQoKICAgIHFfZnVsbF9zaW0gPC0gICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHFfZnVsbF92YXIyLCBxX2Z1bGxfc2RfdmFyMikKICAgIHFfemVyb19zaW0gPC0gICAgICAgICAgIHJub3JtKG5zaW1zX3ZhcjIsIHFfemVyb192YXIyLCBxX3plcm9fc2RfdmFyMikKCiAgICAjIFByZXZhbGVuY2UgaGVyZSBUTyBETzogZHJhdyBmcm9tIGEgYmV0YSBpbnN0ZWFkIG9mICJ0cnVuY2F0ZWQiIG5vcm1hbAogICAgcHJldmFsZW5jZV8wX3NpbSA8LSBybm9ybShuc2ltc192YXIyLCBwcmV2YWxlbmNlXzBfdmFyMiwgcHJldmFsZW5jZV8wX3NkX3ZhcjIpCiAgICBwcmV2YWxlbmNlXzBfc2ltIDwtIGlmZWxzZSgKICAgICAgcHJldmFsZW5jZV8wX3NpbSA+IDEsCiAgICAgIHllcyA9IDEsCiAgICAgIG5vID0gaWZlbHNlKHByZXZhbGVuY2VfMF9zaW0gPCAwLCB5ZXMgPSAwLCBubyA9IHByZXZhbGVuY2VfMF9zaW0pCiAgICApCgogICAgYXV4NCA8LSBsYXBwbHkoY291bnRyaWVzX3ZhcjIsICN3aWxsIGhhdmUgdHJvdWJsZSB3aGVuIHNlbGVjdGluZyBubyBjb3VudHJpZXMKICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHgpIGMocHJldmFsZW5jZV9yX3NvW3hdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlX3Jfc29beF0pICkKCiAgICAjIGZpcnN0IGRyYXcgc2FtcGxlcyBvZiBwcmV2YWxlbmNlIGZvciBlYWNoIGNvdW50cnkKICAgIHByZXZhbGVuY2Vfcl9zaW0gPC0gc2FwcGx5KGF1eDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJub3JtKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2ltc192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0geFsxXSAqIHByZXZhbGVuY2Vfcl92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IHhbMl0gKiBwcmV2YWxlbmNlX3Jfc2RfdmFyMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgIHByZXZhbGVuY2Vfcl9zaW0gPC0gaWZlbHNlKAogICAgICBwcmV2YWxlbmNlX3Jfc2ltID4gMSwKICAgICAgeWVzID0gMSwKICAgICAgbm8gPSBpZmVsc2UocHJldmFsZW5jZV9yX3NpbSA8IDAsIHllcyA9IDAsIG5vID0gcHJldmFsZW5jZV9yX3NpbSkKICAgICkKICAgIGNvbG5hbWVzKHByZXZhbGVuY2Vfcl9zaW0pIDwtIGFzLmNoYXJhY3Rlcihjb3VudHJpZXNfdmFyMikgIAoKICAgICMgaWYgdGhlcmUgaXMgYSBuZXcgZW50cnkgb2YgcHJldmFsZW5jZSwgZHJhdyBmcm9tIGl0LiBJZiB0aGVyZSBpcyBub3QKICAgICMgdGhlbiBsZWF2ZSBhcyBudWxsCiAgICBpZiAoIWlzLm51bGwobmV3X3ByZXZsX3JfdmFyMikpewogICAgICAgICAgbmV3X3ByZXZsX3Jfc2ltIDwtIHJub3JtKG5zaW1zX3ZhcjIsIG5ld19wcmV2bF9yX3ZhcjIsIG5ld19wcmV2bF9yX3NkX3ZhcjIpCiAgICAgICAgICBuZXdfcHJldmxfcl9zaW0gPC0gaWZlbHNlKAogICAgICAgICAgICBuZXdfcHJldmxfcl9zaW0gPiAxLAogICAgICAgICAgICB5ZXMgPSAxLAogICAgICAgICAgICBubyA9IGlmZWxzZShuZXdfcHJldmxfcl9zaW0gPCAwLCAwLCBuZXdfcHJldmxfcl9zaW0pCiAgICAgICAgICApCiAgICB9IGVsc2UgaWYgKGlzLm51bGwobmV3X3ByZXZsX3JfdmFyMikpewogICAgICAgICAgbmV3X3ByZXZsX3Jfc2ltIDwtIE5VTEwKICAgIH0KICAgIGF1eDIgPC0gbGFwcGx5KDE6MiwgZnVuY3Rpb24oeCkgYyhjb2VmX2V4cF92YXIyW3hdLGMoMC4wMDEgLCAwLjAwMSlbeF0pICkKICAgIGNvZWZfZXhwX3NpbSA8LSBzYXBwbHkoYXV4MiwgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsIG1lYW4gPSB4WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSB4WzJdKSApICAgICAKICAgIHRlYWNoX3NhbF9zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfc2FsX3ZhcjIsIHRlYWNoX3NhbF9zZF92YXIyKQogICAgdGVhY2hfYmVuX3NpbSA8LSAgICBybm9ybShuc2ltc192YXIyLCB0ZWFjaF9iZW5fdmFyMiwgdGVhY2hfYmVuX3NkX3ZhcjIpCgogICAgdGVhY2hfc2FsX25ld19zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfc2FsX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhY2hfc2FsX25ld19zZF92YXIyKQogICAgdGVhY2hfYmVuX25ld19zaW0gPC0gICAgcm5vcm0obnNpbXNfdmFyMiwgdGVhY2hfYmVuX25ld192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhY2hfYmVuX25ld19zZF92YXIyKQoKICAgIG5fc3R1ZGVudHNfc2ltIDwtICAgcm5vcm0obnNpbXNfdmFyMiwgbl9zdHVkZW50c192YXIyLCBuX3N0dWRlbnRzX3NkX3ZhcjIpCiAgICAjIFRPIERPOiBtb2RpZnkgdG8gaGF2ZSBhIHNjYWxhciBtdWx0bHlpbmcgdGhlIHNlcmllcywgYW5kIGhhdmUgdGhhdAogICAgIyBzY2FsYXIgYmVpbmcgTigxLDAuMSkKICAgIGRlbHRhX2VkX3NpbSA8LSBzYXBwbHkoZGVsdGFfZWRfc29bLDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbih4KSBybm9ybSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2ltc192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogZGVsdGFfZWRfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IGRlbHRhX2VkX3NkX3ZhcjIgKiBzZChkZWx0YV9lZF9zb1ssIDFdKSkgKQogICAgY29sbmFtZXMoZGVsdGFfZWRfc2ltKSA8LSAxOTk5OjIwMDcKICAgICMgbW9kaWZ5IHRvIGhhdmUgYSBzY2FsYXIgbXVsdGx5aW5nIHRoZSBzZXJpZXMsIGFuZCBoYXZlIHRoYXQgc2NhbGFyCiAgICAjIGJlaW5nIE4oMSwwLjEpCiAgICBkZWx0YV9lZF9leHRfc2ltIDwtIHNhcHBseShkZWx0YV9lZF9leHRfc29bLDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5vcm0oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNpbXNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuID0geCAqIGRlbHRhX2VkX2V4dF92YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gIHNkKGRlbHRhX2VkX2V4dF9zb1ssIDFdKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9lZF9leHRfc2RfdmFyMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgIGNvbG5hbWVzKGRlbHRhX2VkX2V4dF9zaW0pIDwtIDE5OTk6MjAwNwoKICAgIGNvdW50c19pbiA8LSBjb3N0c19kYXRhX3ZhcjIkdG90YWwKICAgIGNvc3RzX25vX3N0YWZmX2luIDwtIGNvc3RzX2RhdGFfdmFyMiRjb3N0c19ieV9jb3VudHJ5CgogICAgIyBkcmF3aW5nIHNhbXBsZXMgZm9ybSBjb3VudHMKICAgIGNvc3RzMV9jb3VudHNfc2ltIDwtIHNhcHBseShjb3VudHNfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogY291bnRzX3Bhcl92YXIyLCAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0geCAqIGNvdW50c19wYXJfc2RfdmFyMikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAjIGRyYXdpbmcgc2FtcGxlcyBmcm9tIGNvc3RzCiAgICBjb3N0czFfYWxsX2Nvc3RzX3NpbSA8LSBzYXBwbHkoY29zdHNfbm9fc3RhZmZfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgIHJub3JtKG5zaW1zX3ZhcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW4gPSB4ICogY29zdHNfcGFyX3ZhcjIsICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2QgPSB4ICogY29zdHNfcGFyX3NkX3ZhcjIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoKICAgICNjb21wdXRpbmcgdW5pdCBjb3N0IGZvciBlYWNoIHNpbXVsYXRpb24gZHJhdwogICAgY29zdHMxX2RmX3NpbSA8LSBOVUxMCgogICAgI2J1aWxkaW5nICJuc2ltc192YXIyIiBzaW11bGF0ZWQgZGF0YSBzZXRzIChjb3JyZXNwb25kaW5nIHRvIGNvc3RzX2RhdGFfaW4pCiAgICBmb3IgKGF1eDFfaSBpbiAxOm5zaW1zX3ZhcjIpewogICAgICBjb3N0czFfZGZfc2ltW1thdXgxX2ldXSA8LSBkYXRhLmZyYW1lKAogICAgICAgICJDb3VudHJ5IiA9IGNvc3RzX2RhdGFfdmFyMiRDb3VudHJ5LAogICAgICAgICJ0b3RhbCIgPSBjb3N0czFfY291bnRzX3NpbVthdXgxX2ksXSwKICAgICAgICAiY29zdHNfYnlfY291bnRyeSIgPSBjb3N0czFfYWxsX2Nvc3RzX3NpbVthdXgxX2ksXQogICAgICAgICkKICAgIH0KICAgIHRlbXBfY29zdF9zaW0gPC0gcm5vcm0obnNpbXNfdmFyMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbiA9IG5ld19jb3N0c192YXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZCA9IG5ld19jb3N0c19zZF92YXIyKQogICAgIyMgR3Vlc3Mgd29yawogICAgIyBkcmF3aW5nIHNhbXBsZXMgZnJvbSBzdGFmZiB0aW1lCiAgICBzdGFmZl90aW1lX3NpbSA8LSBybm9ybShuc2ltc192YXIyLCBzdGFmZl90aW1lX3ZhcjIsIHN0YWZmX3RpbWVfc2RfdmFyMikgICAgICAKICAgIHBlcmlvZHNfdmFsIDwtIDUwICAgICAgICAgICAjVG90YWwgbnVtYmVyIG9mIHBlcmlvZHMgdG8gZm9yZWNhc3Qgd2FnZXMKICAgIHRpbWVfdG9fam1fdmFsIDwtIDEwICAgICAgICAjcGVyaW9kcyB1bnRpbCBpbmRpdmlkdWFsIGpvaW4gdGhlIGxhYm9yIGZvcmNlCgogICAgIyMjIyMjICAgIAogICAgIyMjIyMjICAgIAoKICAgICMjIyMjIyMjIyMjIyMjIyMKICAgICMjIyMjIyBSdW5zICAgIAogICAgIyMjIyMjIyMjIyMjIyMjIwoKICAgICNWZWN0b3JzIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIGVhY2ggc2ltdWxhdGlvbgogICAgYTFfdGF4X3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTFfdGF4X3BlCiAgICBhMV94X3RheF9zaW0gICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMV94X3RheF9wZQogICAgYTFfYWxsX3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTFfYWxsX3BlCiAgICBhMV94X2FsbF9zaW0gICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMV94X2FsbF9wZQogICAgYTJfdGF4X3NpbSAgICAgICAgICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTJfdGF4CiAgICBhMl9hbGxfc2ltICAgICAgICAgICA8LSByZXAoTkEsIG5zaW1zX3ZhcjIpICNhMl9hbGwKICAgIGEzX2luY19hMV9hbGxfc2ltICAgIDwtIHJlcChOQSwgbnNpbXNfdmFyMikgI2EzX2luY19hMV9hbGwKICAgIGEzX2luY19hMV9hbGxfeF9zaW0gIDwtIHJlcChOQSwgbnNpbXNfdmFyMikgI2EzX2luY19hMV9hbGxfeAogICAgYTNfaW5jX2EyX2FsbF9zaW0gICAgPC0gcmVwKE5BLCBuc2ltc192YXIyKSAjYTNfaW5jX2EyX2FsbF9tcGUKCgogICAgZm9yIChpIGluIDE6bnNpbXNfdmFyMikgewogICAgIyBvbmVfcnVuX2YsIGZvciB0aGUgbW9zdCBwYXJ0LCBkb2VzIG5vdCBpbmNsdWRlIHN0YW5kYXJkIGRldmlhdGlvbnMgICAKICAgICAgaW52aXNpYmxlKCBsaXN0MmVudigKICAgICAgICBvbmVfcnVuX2YobWFpbl9ydW5fdmFyMSA9IEZBTFNFLCAgICAgICAgICAgICAgIyBIRVJFIEkgTkVFRCBUTyBQTFVHIGNvc3RzMV9jb3N0c19zaW0KICAgICAgICAgICAgICAgIHJ1bl9zaW1fdmFyMSA9IFRSVUUsCiAgICAgICAgICAgICAgICB3YWdlX2FnX3ZhcjEgPSB3YWdlX2FnX3NpbVtpXSwKICAgICAgICAgICAgICAgIHdhZ2Vfd3dfdmFyMSA9IHdhZ2Vfd3dfc2ltW2ldLAogICAgICAgICAgICAgICAgcHJvZml0c19zZV92YXIxID0gcHJvZml0c19zZV9zaW1baV0sCiAgICAgICAgICAgICAgICBob3Vyc19zZV9jb25kX3ZhcjEgPSBob3Vyc19zZV9jb25kX3NpbVtpXSwKICAgICAgICAgICAgICAgIGhvdXJzX2FnX3ZhcjEgPSBob3Vyc19hZ19zaW1baV0sCiAgICAgICAgICAgICAgICBob3Vyc193d192YXIxID0gaG91cnNfd3dfc2ltW2ldLAogICAgICAgICAgICAgICAgaG91cnNfc2VfdmFyMSA9IGhvdXJzX3NlX3NpbVtpXSwKICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyMSA9IGV4X3JhdGVfc2ltW2ldLAogICAgICAgICAgICAgICAgZ3Jvd3RoX3JhdGVfdmFyMSA9IGdyb3d0aF9yYXRlX3NpbVtpXSwKICAgICAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjEgPSBjb2VmX2V4cF9zaW1baSwgMV0sIGNvZWZfZXhwMl92YXIxID0gY29lZl9leHBfc2ltW2ksMl0sCiAgICAgICAgICAgICAgICBsYW1iZGExX3ZhcjEgPSBsYW1iZGExX2luX2YobGFtYmRhMV92YXIgPSBsYW1iZGExX3NpbVtpLF0pLAogICAgICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjEgPSBwcmV2YWxlbmNlXzBfc2ltW2ldLAogICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjEgPSBwcmV2YWxlbmNlX3Jfc2ltW2ksIF0sCiAgICAgICAgICAgICAgICBuZXdfcHJldmxfcl92YXIxID0gbmV3X3ByZXZsX3Jfc2ltW2ldLAogICAgICAgICAgICAgICAgbGFtYmRhMl92YXIxID0gbGFtYmRhMl9zaW1baV0sCiAgICAgICAgICAgICAgICBjb3ZlcmFnZV92YXIxID0gY292ZXJhZ2Vfc2ltW2ldLAogICAgICAgICAgICAgICAgcV9mdWxsX3ZhcjEgPSBxX2Z1bGxfc2ltW2ldLAogICAgICAgICAgICAgICAgcV96ZXJvX3ZhcjEgPSBxX3plcm9fc2ltW2ldLAogICAgICAgICAgICAgICAgbGFtYmRhMV9uZXdfdmFyMSA9IGxhbWJkYTFfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIGdvdl9ib25kc192YXIxID0gZ292X2JvbmRzX3NpbVtpXSwKICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIxID0gaW5mbGF0aW9uX3NpbVtpXSwKICAgICAgICAgICAgICAgIGdvdl9ib25kc19uZXdfdmFyMSA9IGdvdl9ib25kc19uZXdfc2ltW2ldLAogICAgICAgICAgICAgICAgaW5mbGF0aW9uX25ld192YXIxID0gaW5mbGF0aW9uX25ld19zaW1baV0sCiAgICAgICAgICAgICAgICBkZWx0YV9lZF92YXIxID0gY2JpbmQoZGVsdGFfZWRfc2ltW2ksXSwgMTk5OToyMDA3KSwKICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIxID0gY2JpbmQoZGVsdGFfZWRfZXh0X3NpbVtpLF0sIDE5OTk6MjAwNyksCiAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMSA9IHRlYWNoX3NhbF9zaW1baV0sCiAgICAgICAgICAgICAgICB0ZWFjaF9iZW5fdmFyMSA9IHRlYWNoX2Jlbl9zaW1baV0sCiAgICAgICAgICAgICAgICB0ZWFjaF9zYWxfbmV3X3ZhcjEgPSB0ZWFjaF9zYWxfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl9uZXdfdmFyMSA9IHRlYWNoX2Jlbl9uZXdfc2ltW2ldLAogICAgICAgICAgICAgICAgbl9zdHVkZW50c192YXIxID0gbl9zdHVkZW50c19zaW1baV0sCiAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMSA9IHVuaXRfY29zdF9sb2NhbF9zaW1baV0sCiAgICAgICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjEgPSB1bml0X2Nvc3RfbG9jYWxfbmV3X3NpbVtpXSwKICAgICAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMSA9IHllYXJzX29mX3RyZWF0XzBfc2ltW2ldLAogICAgICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIxID0geWVhcnNfb2ZfdHJlYXRfdF9zaW1baV0sCiAgICAgICAgICAgICAgICB0YXhfdmFyMSA9IHRheF9zaW1baV0sCiAgICAgICAgICAgICAgICBwZXJpb2RzX3ZhcjEgPSBwZXJpb2RzX3NvLAogICAgICAgICAgICAgICAgZGZfY29zdHNfdmFyMSA9IGNvc3RzMV9kZl9zaW1bW2ldXSwKICAgICAgICAgICAgICAgIG5ld19jb3N0c192YXIxID0gdGVtcF9jb3N0X3NpbVtpXSwgICAgCiAgICAgICAgICAgICAgICBzdGFmZl90aW1lX3ZhcjEgPSBzdGFmZl90aW1lX3NpbVtpXSwKICAgICAgICAgICAgICAgIGNvdW50cmllc192YXIxID0gY291bnRyaWVzX3ZhcjIKICAgICAgICAgICAgICAgICksLkdsb2JhbEVudikgKSAjIGFkZCBjb3N0cyBoZXJlCiAgICAgICNCYWlyZCAxOiBDb3N0cyA9IEJhaXJkIHcvdGF4IGFuZCBubyBleHRlcm5hbGl0aWVzIChubyBleHQpOyBCZW5lZiA9IEJhaXJkIG5vIGV4dAogICAgICBhMV90YXhfc2ltW2ldIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF9ueF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2luKQogICAgICAjQmFpcmQgMjogQ29zdHMgPSBCYWlyZCB3L3RheCBhbmQgeWVzIGV4dGVybmFsaXRpZXMgKG5vIGV4dCk7IEJlbmVmID0gQmFpcmQgeWVzIGV4dAogICAgICBhMV94X3RheF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCiAgICAgICMgQmFpcmQgMzogQmVuZWZpdHMgPSBCYWlyZCBhbGwgYW5kIG5vIGV4dDsgQ29zdHMgPSBCYWlyZCBubyBleHQKICAgICAgYTFfYWxsX3NpbVtpXSAgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX254X2luLCBjb3N0c192YXIgPSBjb3N0czJfaW4pCiAgICAgICMgQmFpcmQgNDogQmVuZWZpdHMgPSBCYWlyZCBhbGwgYW5kIHllcyBleHQ7IENvc3RzID0gQmFpcmQgeWVzIGV4dAogICAgICBhMV94X2FsbF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCiAgICAgICNLTFBTNF8xOiBiZW5lZml0cyA9IEtMUFM0IHcvdCBhbmQgbm8gZXh0OyBDb3N0cyA9CUJhaXJkIG5vIGV4dAogICAgICBhMl90YXhfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl90YXhfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0c19hMl9pbikKICAgICAgI0tMUFM0XzI6YmVuZWZpdHMgPSBLTFBTNCBhbGwgYW5kIG5vIGV4dDsgQ29zdHMgPQlCYWlyZCBubyBleHQKICAgICAgYTJfYWxsX3NpbVtpXSAgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX25ld19pbiwgY29zdHNfdmFyID0gY29zdHNfYTJfaW4pCiAgICAgICMgRUExOiBubyBleHRlcm5hbGl0eSBOUFYgdXNpbmcgRUFzIGNvc3RzCiAgICAgIGEzX2luY19hMV9hbGxfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbnhfcHJldmxfaW4sIGNvc3RzX3ZhciA9IGNvc3RzMl9lYV9pbikKICAgICAgIyBFQTI6IHllcyBleHRlcm5hbGl0eSBOUFYgdXNpbmcgRUFzIGNvc3RzCiAgICAgIGEzX2luY19hMV9hbGxfeF9zaW1baV0gIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQogICAgICAjIEVBMzogYmVuZWY9IEtMUFMgYWxsIGFuZCBubyBleHQ7IENvc3RzPUVBCiAgICAgIGEzX2luY19hMl9hbGxfc2ltW2ldICA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfcHJldmxfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0czJfZWFfaW4pCiAgICB9CgogICAgdG90YWxfdGltZV9zaW0gPC0gU3lzLnRpbWUoKSAtIHN0YXJ0X3RpbWUKCiAgICAjIyMjIyMgICAgCiAgICAjIyMjIyMgICAgIAogICAgcmV0dXJuKCBsaXN0KAogICAgICAiYTFfdGF4X3NpbSIgICAgICAgICAgPSBhMV90YXhfc2ltLCAgICAgICAgIAogICAgICAiYTFfeF90YXhfc2ltIiAgICAgICAgPSBhMV94X3RheF9zaW0sICAgICAgICAgCiAgICAgICJhMV9hbGxfc2ltIiAgICAgICAgICA9IGExX2FsbF9zaW0sICAgICAgICAgCiAgICAgICJhMV94X2FsbF9zaW0iICAgICAgICA9IGExX3hfYWxsX3NpbSwgICAgICAgICAKICAgICAgImEyX3RheF9zaW0iICAgICAgICAgID0gYTJfdGF4X3NpbSwgICAgICAgIAogICAgICAiYTJfYWxsX3NpbSIgICAgICAgICAgPSBhMl9hbGxfc2ltLCAgICAgICAgCiAgICAgICJhM19pbmNfYTFfYWxsX3NpbSIgICA9IGEzX2luY19hMV9hbGxfc2ltLCAgICAgICAgICAgIAogICAgICAiYTNfaW5jX2ExX2FsbF94X3NpbSIgPSBhM19pbmNfYTFfYWxsX3hfc2ltLCAgICAgICAgICAgIAogICAgICAiYTNfaW5jX2EyX2FsbF9zaW0iICAgPSBhM19pbmNfYTJfYWxsX3NpbSwgICAgICAgICAgICAKICAgICAgInRvdGFsX3RpbWVfc2ltIiAgICAgID0gdG90YWxfdGltZV9zaW0KICAgICkgKQp9Cgpwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzIDwtIGMoCiAgImExX3RheF9zaW0iLAogICJhMV94X3RheF9zaW0iLAogICJhMV9hbGxfc2ltIiwKICAiYTFfeF9hbGxfc2ltIiwKICAiYTJfdGF4X3NpbSIsCiAgImEyX2FsbF9zaW0iLAogICJhM19pbmNfYTFfYWxsX3NpbSIsCiAgImEzX2luY19hMV9hbGxfeF9zaW0iLAogICJhM19pbmNfYTJfYWxsX3NpbSIgICAgICAgICAgICAKKQoKcG9saWN5X2VzdGltYXRlc190ZXh0IDwtIGMoCiAgIkExLiBUYXggcmV2ZW51ZSIsCiAgIkExLiBXaXRoIGV4dGVybmFsaXRpZXMuIFRheCIsCiAgIkExLiBBbGwgaW5jb21lIiwKICAiQTEuIFdpdGggZXh0LiBBbGwgaW5jb21lIiwKICAiQTIuIFRheCIsCiAgIkEyLiBBbGwgaW5jb21lIiwKICAiQTMuIEFsbCBpbmNvbWUgb2YgQTEiLAogICJBMy4gQWxsIGluY29tZSBvZiBBMSwgd2l0aCBleHQuIiwKICAiQTMuIEFsbCBpbmNvbWUgb2YgQTIuIE1haW4gUG9saWN5IEVzdGltYXRlIgogICkKYGBgCgo8L2RldGFpbHM+CgojIE1haW4gUmVzdWx0cyAgCgpJbiB0aGlzIGRvY3VtZW50IHdlIGhhdmUgcHJlc2VudGVkIHRocmVlIGRpZmZlcmVudCBhcHByb2FjaGVzIHRvIG1lYXN1cmluZyB0aGUgd2VsZmFyZSBlZmZlY3RzIG9mIGRld29ybWluZyAgaW50ZXJ2ZW50aW9ucy4gVGhlIGZpcnN0IGFwcHJvYWNoIHdhcyBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgcGFwZXIgdGhhdCBtZWFzdXJlZCB0aGUgd2VsZmFyZSBlZmZlY3RzIG9mIGRld29ybWluZyAoQGJhaXJkMjAxNndvcm1zKSBhbmQgcHJvcG9zZWQgZm91ciBkaWZmZXJlbnQgd2F5cyB0byBjb21wdXRlIHRoaXMgZWZmZWN0ICh3aXRoIGFuZCB3aXRob3V0IGV4dGVybmFsaXRpZXMsIGFuZCBmcm9tIGEgc29jaWV0YWwgb3IgZmlzY2FsIHBlcnNwZWN0aXZlKS4gVGhlIHNlY29uZCBhcHByb2FjaCwgYmFzZWQgb24gbW9yZSByZWNlbnQgZGF0YSwgZm9jdXNlZCBvbmx5IG9uIGRpcmVjdCBlZmZlY3RzLCBhbmQgcmVsaWVzIGxlc3Mgb24gcHJlZGljdGl2ZSBlZmZlY3RzIG92ZXIgdGhlIGxpZmVjeWNsZS4gUmVzdWx0cyBmb3IgdGhlIHNlY29uZCBhcHByb2FjaCBhcmUgYWxzbyBzZXBhcmF0ZWQgYmV0d2VlbiB0aGUgc29jaWV0YWwgYW5kIGZpc2NhbCBwZXJzcGVjdGl2ZS4gICAKClRoZSB0aGlyZCBhbmQgZmluYWwgYXBwcm9hY2ggdXNlcyBzaW1pbGFyIG1ldGhvZG9sb2dpZXMgd2l0aCB0aHJlZSBtYWluIGRpZmZlcmVuY2VzLiBGaXJzdCwgd2UgYWxsb3cgdGhlIGJlbmVmaXRzIHRvIGJlIHNjYWxlZCB0byBhY2NvdW50IGZvciBkaWZmZXJlbmNlcyBpbiB0aGUgcHJldmFsZW5jZSBvZiB3b3JtIGluZmVjdGlvbnMgaW4gc2V0dGluZ3MgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHN0dWR5LiBTZWNvbmQsIHdlIGFsbG93IHRoZSBiZW5lZml0cyB0byBiZSBzY2FsZWQgYnkgdGhlIGxlbmd0aCBvZiB0cmVhdG1lbnQgcHJvdmlkZWQgdG8gY2hpbGRyZW4gd2l0aGluIGEgcGFydGljdWxhciBzZXR0aW5nLiBGaW5hbGx5LCBiYXNlZCBvbiBmZWVkYmFjayBmcm9tIEV2aWRlbmNlIEFjdGlvbiBvbiB0aGUgcmVsZXZhbnQgY29zdHMgZnJvbSBwcmVzZW50LWRheSBkZXdvcm1pbmcgcHJvZ3JhbXMsIHRoaXMgYXBwcm9hY2ggdXNlcyBtb3JlIHVwIHRvIGRhdGUgaW5mb3JtYXRpb24gb24gdHJlYXRtZW50IGNvc3RzIGFuZCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCB0aGUga25vY2stb24gZWZmZWN0cyBvZiBhZGRpdGlvbmFsIHNjaG9vbGluZyBjb3N0cyBhcyBhIHJlc3VsdCBvZiBpbmNyZWFzZWQgc2Nob29sIGF0dGVuZGFuY2UsIHdoaWNoIGFyZSBhY2NvdW50ZWQgZm9yIGluIGFwcHJvYWNoZXMgIzEgYW5kICMyW14xMV0uCgpbXjExXTogRXZpZGVuY2UgQWN0aW9uIHN1Z2dlc3RzIHRoYXQgdGhlIGFkZGVkIGNvc3RzIG9uIGVkdWNhdGlvbiB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGFzIGNvc3RzIGZyb20gYSBwb2xpY3kgbWFrZXJzIHBlcnNwZWN0aXZlLiBUaG9zZSBjb3N0cyBjb3JyZXNwb25kcyB0byBhbm90aGVyIGludGVydmVudGlvbiBvbiBpdHNlbGYgKGVkdWNhdGlvbikgYW5kIGluY29ycG9yYXRpbmcgaXRzIGNvc3RzIHdvdWxkIGFsc28gcmVxdWlyZSB0byBpbmNvcnBvcmF0ZSBpdHMgYmVuZWZpdHMuIFtDT05GSVJNIFdJVEggR1JBQ0VdCgpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXNlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGFwcHJvYWNoZXMgYW5kIHRoZSBkaWZmZXJlbnQgYWx0ZXJuYXRpdmVzIHdpdGhpbiBlYWNoIGFwcHJvYWNoLiBUaGUgbWFpbiBwb2xpY3kgZXN0aW1hdGUgaXMgZGVmaW5lZCBhcyB0aGF0IG9mIEV2aWRlbmNlIEFjdGlvbiAoYXBwcm9hY2ggMykgdXNpbmcgdGhlIGxhdGVzdCByZXNlYXJjaCAoQGtscHM0KTogYXBwcm9hY2ggMy4zIGluIHRoZSB0YWJsZSAoaW4gYm9sZCkuCgo8ZGV0YWlscz48c3VtbWFyeT5TaG93IGFsbCB0aGUgZGV0YWlsczwvc3VtbWFyeT4KCmBgYHtyIGFsbC1zdGVwcywgZWNobz1wcmludF9jb2RlfQojIFRPRE86IFdyYXAgdGhpcyBjb2RlIGNodW5rIGluIGNodW5rX3h4eGZ1bmN0aW9uCgojY2h1bmtfcnVudmFsdWVzIDwtIGZ1bmN0aW9uKCl7CiMgRnVuY3Rpb24gZGVwZW5kZW5jeSBpcyBkZXBpY3RlZCBhcyBmb2xsb3dzOgojIGYoZygpKSA9CiMgZgojIOKUlOKUgOKUgOKUgOKUgCBnCiMKIyAgICAgICAjIyAgICAgIyMjICAgICMjIyMgICAgIyMjIyMKIyAxICAgICAyICAgICAgIDMgICAgIDQgICAgICAgNQojICAgICAgICMjICAgICAjIyMgICAgIyMjIyAgICAjIyMjIwojIE5QVl9wZV9mCiMg4pSc4pSA4pSA4pSA4pSAIHB2X2JlbmVmX2YKIyDilIIgICAgICDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMV9mCiMg4pSCICAgICAgfCAgICAgIOKUnOKUgOKUgOKUgOKUgCB3YWdlX3RfZgojIOKUgiAgICAgIHwgICAgICB8ICAgICAg4pSU4pSA4pSA4pSA4pSAIHdhZ2VfMF9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhX2VmZl9mCiMg4pSCICAgICAgfCAgICAgIHwgICAgICDilJTilIDilIDilIDilIBsYW1iZGExX3RfZgojIOKUgiAgICAgIHwgICAgICB8ICAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSAbGFtYmRhMV9pbl9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhMV9pbl9mCiMgfCAgICAgIHwgICAgICDilJzilIDilIDilIDilIAgbGFtYmRhMl9pbl9mCiMg4pSCICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgCBzYXR1cmF0aW9uX2luX2YKIyDilIIgICAgICDilJzilIDilIDilIDilIAgZWFybmluZ3NfYXBwMl9mCiMg4pSCICAgICAgfCAgICAgIOKUlOKUgOKUgOKUgOKUgGxhbWJkYV9lZmZfZgojIOKUgiAgICAgIHwgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgGxhbWJkYTFfdF9mCiMg4pSCICAgICAg4pSU4pSA4pSA4pSA4pSAIGludGVyZXN0X2YKIyDilJTilIDilIDilIDilIAgcHZfY29zdHNfZiAocHZfY29zdHNfZikKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIGRlbHRhX2VkX2ZpbmFsX2YKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIGludGVyZXN0X2YKIyAgICAgICAg4pSU4pSA4pSA4pSA4pSAIHMyX25ld19mCiMgICAgICAgIHwgICAgICDilJTilIDilIDilIDilIAgY29zdHMxX3AyX2YKIyAgICAgICAgfCAgICAgICAgICAgICDilJTilIDilIDilIDilIAgY29zdHMxX3AxX2YKIyAgICAgICAg4pSc4pSA4pSA4pSA4pSAIHMyX2YKIyAgICAgICAg4pSU4pSA4pSA4pSA4pSAIGNvc3RfcGVyX3N0dWRlbnRfZgojICAgICAgICMjICAgICAjIyMgICAgIyMjIyAgICAjIyMjIwoKCiMgQXBwcm9hY2ggMQojIE5QVl9wZV9mIC0tPiBhMV90YXhfcGUKIyAgICAg4pSU4pSA4pSA4pSA4pSAcHZfYmVuZWZfZiAtLT4gcHZfYmVuZWZfdGF4X254X2luCiMgICAgIHwgICAgIOKUnOKUgOKUgOKUgOKUgGVhcm5pbmdzX2FwcDFfZiAtLT4gZWFybmluZ3Nfbm9fZXh0X2luICogdGF4X3ZhcjEKIyAgICAgfCAgICAgfCAgICAg4pSc4pSA4pSA4pSA4pSAd2FnZV90X2YgLS0+IHdhZ2VfdF9pbgojICAgICB8ICAgICB8ICAgICB8ICAgICDilJTilIDilIDilIDilIB3YWdlXzBfZiAtLT4gd2FnZV8wX2luCiMgICAgIHwgICAgIHwgICAgIOKUnOKUgOKUgOKUgOKUgGxhbWJkYTFfaW5fZiAtLT4gbGFtYmRhMV9pbgojICAgICB8ICAgICB8ICAgICDilJTilIDilIDilIDilIBzYXR1cmF0aW9uX2luX2YgLS0+IHNhdHVyYXRpb25faW4KIyAgICAgfCAgICAg4pSU4pSA4pSA4pSA4pSAaW50ZXJlc3RfZiAtLT4gaW50ZXJlc3RfaW4KIyAgICAgfAojICAgICB8CiMgICAgIOKUlOKUgOKUgOKUgOKUgHB2X2Nvc3RzX2YgLS0+IGNvc3RzMl9pbgojICAgICAgICAgICDilJzilIDilIDilIDilIBkZWx0YV9lZF9maW5hbF9mIC0tPiBkZWx0YV9lZF9maW5hbF9pbgojICAgICAgICAgICDilJzilIDilIDilIDilIBjb3N0X3Blcl9zdHVkZW50X2YgLS0+IGNvc3RfcGVyX3N0dWRlbnRfaW4KIyAgICAgICAgICAg4pSc4pSA4pSA4pSA4pSAczJfZiAtLT4gczJfaW4KIyAgICAgICAgICAg4pSU4pSA4pSA4pSA4pSAaW50ZXJlc3RfZiAtLT4gaW50ZXJlc3RfaW4KCgojIHVuaXQgdGVzdCBmdW5jdGlvbgp1bml0X3Rlc3RfZiA8LSBmdW5jdGlvbih0b190ZXN0X3Zhciwgb3JpZ2luYWxfdmFyLCBtYWluX3J1bl92YXIgPSBUUlVFKXsKICAgIGlmIChtYWluX3J1bl92YXIgPT0gVFJVRSkgewogICAgICAgIGlmIChsZW5ndGgodG9fdGVzdF92YXIpID4gMSkgewogICAgICAgICAgICBmYWlsc190ZXN0IDwtICggYWJzKHNkKHRvX3Rlc3RfdmFyKSAtIG9yaWdpbmFsX3ZhcikgPiAwLjAwMDEgKQogICAgICAgICAgICB0ZXh0X3ZhbCA8LSBzZCh0b190ZXN0X3ZhcikKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmYWlsc190ZXN0IDwtICggYWJzKHRvX3Rlc3RfdmFyIC0gb3JpZ2luYWxfdmFyKSA+IDAuMDAwMSApCiAgICAgICAgICAgIHRleHRfdmFsIDwtIHRvX3Rlc3RfdmFyCiAgICAgICAgfQogICAgICAgIGlmIChmYWlsc190ZXN0KSB7CiAgICAgICAgICAgIHByaW50KHBhc3RlKCJPdXRwdXQgaGFzIGNoYW5nZWQgYXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkZXBhcnNlKHN1YnN0aXR1dGUodG9fdGVzdF92YXIpICksCiAgICAgICAgICAgICAgICAgICAgICAgICIgdG8gIiwgdGV4dF92YWwpICkKICAgICAgICB9CiAgICAgIH0KfQoKIyBUT0RPOiB1cGRhdGUgdmFsdWVzIG9mIHVuaXQgdGVzdCB3aXRoaW4gb25lX3J1bl9mCiMgb25lIHJ1biBvZiBhbGwgdGhlIHN0ZXBzIHRvIGdldCBvbmUgcG9saWN5IGVzdGltYXRlCm9uZV9ydW5fZiA8LQogIGZ1bmN0aW9uKG1haW5fcnVuX3ZhcjEgPSBtYWluX3J1bl9zbywKICAgICAgICAgICBydW5fc2ltX3ZhcjEgPSBydW5fc2ltX3NvLAogICAgICAgICAgIHdhZ2VfYWdfdmFyMSA9IHdhZ2VfYWdfc28sCiAgICAgICAgICAgd2FnZV93d192YXIxID0gd2FnZV93d19zbywKICAgICAgICAgICBwcm9maXRzX3NlX3ZhcjEgPSBwcm9maXRzX3NlX3NvLAogICAgICAgICAgIGhvdXJzX3NlX2NvbmRfdmFyMSA9IGhvdXJzX3NlX2NvbmRfc28sCiAgICAgICAgICAgaG91cnNfYWdfdmFyMSA9IGhvdXJzX2FnX3NvLAogICAgICAgICAgIGhvdXJzX3d3X3ZhcjEgPSBob3Vyc193d19zbywKICAgICAgICAgICBob3Vyc19zZV92YXIxID0gaG91cnNfc2Vfc28sCiAgICAgICAgICAgZXhfcmF0ZV92YXIxID0gZXhfcmF0ZV9zbywKICAgICAgICAgICBncm93dGhfcmF0ZV92YXIxID0gZ3Jvd3RoX3JhdGVfc28sCiAgICAgICAgICAgY29lZl9leHBfdmFyMSA9IGNvZWZfZXhwX3NvWzFdLAogICAgICAgICAgIGNvZWZfZXhwMl92YXIxID0gY29lZl9leHBfc29bMl0sCiAgICAgICAgICAgbGFtYmRhMV92YXIxID0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV9zbyksCiAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjEgPSBwcmV2YWxlbmNlXzBfc28sCiAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjEgPSBwcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgbmV3X3ByZXZsX3JfdmFyMSA9IG5ld19wcmV2YWxlbmNlX3Jfc28sCiAgICAgICAgICAgbGFtYmRhMl92YXIxID0gbGFtYmRhMl9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgY292ZXJhZ2VfdmFyMSA9IGNvdmVyYWdlX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBxX2Z1bGxfdmFyMSA9IHFfZnVsbF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgcV96ZXJvX3ZhcjEgPSBxX3plcm9fc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIGxhbWJkYTFfbmV3X3ZhcjEgPSBsYW1iZGExX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgZ292X2JvbmRzX3ZhcjEgPSBnb3ZfYm9uZHNfc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIGluZmxhdGlvbl92YXIxID0gaW5mbGF0aW9uX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3ZhcjEgPSBnb3ZfYm9uZHNfbmV3X3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgaW5mbGF0aW9uX25ld192YXIxID0gaW5mbGF0aW9uX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBkZl9jb3N0c192YXIxID0gY29zdHNfZGF0YV9pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgc3RhZmZfdGltZV92YXIxID0gc3RhZmZfdGltZV9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgZGVsdGFfZWRfdmFyMSA9IGRlbHRhX2VkX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyMSA9IGRlbHRhX2VkX2V4dF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgdGVhY2hfc2FsX3ZhcjEgPSB0ZWFjaF9zYWxfc28sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIHRlYWNoX2Jlbl92YXIxID0gdGVhY2hfYmVuX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBuX3N0dWRlbnRzX3ZhcjEgPSBuX3N0dWRlbnRzX3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB0ZWFjaF9zYWxfbmV3X3ZhcjEgPSB0ZWFjaF9zYWxfbmV3X3NvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgdGVhY2hfYmVuX25ld192YXIxID0gdGVhY2hfYmVuX25ld19zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMSA9IHVuaXRfY29zdF9sb2NhbF9zbywgICAgIAogICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfdmFyMSA9IHVuaXRfY29zdF8yMDE3dXNkcHBwX3NvLAogICAgICAgICAgIG5ld19jb3N0c192YXIxID0gbmV3X2Nvc3RzX3NvLCAgICAKICAgICAgICAgICBjb3VudHJpZXNfdmFyMSA9IGNvdW50cnlfc2VsX3NvLAogICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMSA9IHllYXJzX29mX3RyZWF0XzBfc28sCiAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF92YXIxID0geWVhcnNfb2ZfdHJlYXRfdF9zbywKICAgICAgICAgICB0YXhfdmFyMSA9IHRheF9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgcGVyaW9kc192YXIxID0gcGVyaW9kc19zbykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICMjIyMtLS0tLS0tLS0tLS0gSW5wdXRzIGZvciB3YWdlX3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdhZ2VfMF9pbiA8LSB3YWdlXzBfZigKICAgICAgd2FnZV9hZ192YXIgPSB3YWdlX2FnX3ZhcjEsCiAgICAgIHdhZ2Vfd3dfdmFyID0gd2FnZV93d192YXIxLAogICAgICBwcm9maXRzX3NlX3ZhciA9IHByb2ZpdHNfc2VfdmFyMSwKICAgICAgaG91cnNfc2VfY29uZF92YXIgPSBob3Vyc19zZV9jb25kX3ZhcjEsCiAgICAgIGhvdXJzX2FnX3ZhciA9IGhvdXJzX2FnX3ZhcjEsCiAgICAgIGhvdXJzX3d3X3ZhciA9IGhvdXJzX3d3X3ZhcjEsCiAgICAgIGhvdXJzX3NlX3ZhciA9IGhvdXJzX3NlX3ZhcjEsCiAgICAgIGV4X3JhdGVfdmFyID0gZXhfcmF0ZV92YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZih3YWdlXzBfaW4sIDAuMTcwMTI0NDY2NjY0NDM2LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgIyMjLS0tLS0tLS0tLSBJbnB1dHMgZm9yIGVhcm5pbmdzX2FwcDFfZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdhZ2VfdF9pbiA8LSB3YWdlX3RfZigKICAgICAgd2FnZV8wX3ZhciA9IHdhZ2VfMF9pbiwKICAgICAgZ3Jvd3RoX3JhdGVfdmFyID0gZ3Jvd3RoX3JhdGVfdmFyMSwKICAgICAgY29lZl9leHAxX3ZhciA9IGNvZWZfZXhwX3ZhcjEsCiAgICAgIGNvZWZfZXhwMl92YXIgPSBjb2VmX2V4cDJfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2Yod2FnZV90X2luLCAxNy44NDY0OTQ2NzI3OTQ2LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGxhbWJkYTFfaW4gPC0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV92YXIxKQogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9pblsxXSwgMS43NDUsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgbGFtYmRhMV90X3RlbXAgPSBsYW1iZGFfdF9mKAogICAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pbl9mKGxhbWJkYTFfdmFyID0gbGFtYmRhMV92YXIxKSwKICAgICAgICB5ZWFyc19vZl90cmVhdF8wX3ZhciA9IHllYXJzX29mX3RyZWF0XzBfdmFyMSwKICAgICAgICB5ZWFyc19vZl90cmVhdF90X3ZhciA9IHllYXJzX29mX3RyZWF0X3RfdmFyMSAgCiAgICAgICAgKSRsYW1iZGExX3QKCiAgICBsYW1iZGExX3ByZXZsX2luIDwtIGxhbWJkYV9lZmZfZigKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX3RfdGVtcCwKICAgICAgcHJldmFsZW5jZV8wX3ZhciA9IHByZXZhbGVuY2VfMF92YXIxLAogICAgICBwcmV2YWxlbmNlX3JfdmFyID0gcHJldmFsZW5jZV9yX3ZhcjEsCiAgICAgIG90aGVyX3ByZXZsX3JfdmFyID0gbmV3X3ByZXZsX3JfdmFyMSwKICAgICAgY291bnRyeV9zZWxfdmFyID0gY291bnRyaWVzX3ZhcjEKICAgICAgKSRsYW1iZGExX2VmZl9pbgogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9wcmV2bF9pblsxXSwgMC45NTA4NTgzMDYwOTY4LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGxhbWJkYTJfaW4gPC0gbGFtYmRhMl9pbl9mKGxhbWJkYTJfdmFyID0gbGFtYmRhMl92YXIxKQogICAgdW5pdF90ZXN0X2YobGFtYmRhMl9pblsxXSwgMTAuMiAsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgc2F0dXJhdGlvbl9pbiA8LSBzYXR1cmF0aW9uX2luX2YoY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfZnVsbF92YXIgPSBxX2Z1bGxfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfemVyb192YXIgPSBxX3plcm9fdmFyMSkkc2F0dXJhdGlvbl9pbgogICAgdW5pdF90ZXN0X2Yoc2F0dXJhdGlvbl9pbiwgMC41MTEsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgoKCiAgICAjIyMtLS0tLS0tLS0tLS0gSW5wdXRzIGZvciBlYXJuaW5nc19hcHAyX2YtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgbGFtYmRhMV9uZXdfaW4gPC0gbGFtYmRhMV9uZXdfdmFyMQogICAgdW5pdF90ZXN0X2YobGFtYmRhMV9uZXdfaW4sIDc5LjUxNDY1LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICBsYW1iZGExX3RfdGVtcCA9IGxhbWJkYV90X2YoCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9uZXdfdmFyMSwKICAgICAgeWVhcnNfb2ZfdHJlYXRfMF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3ZhcjEsCiAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxICAKICAgICkkbGFtYmRhMV90CiAgICBsYW1iZGExX3ByZXZsX25ld19pbiA8LSBsYW1iZGFfZWZmX2YobGFtYmRhMV92YXIgPSBsYW1iZGExX3RfdGVtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2YWxlbmNlXzBfdmFyID0gcHJldmFsZW5jZV8wX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhciA9IHByZXZhbGVuY2Vfcl92YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3ByZXZsX3JfdmFyID0gbmV3X3ByZXZsX3JfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlfc2VsX3ZhciA9IGNvdW50cmllc192YXIxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApJGxhbWJkYTFfZWZmX2luCiAgICB1bml0X3Rlc3RfZihsYW1iZGExX3ByZXZsX25ld19pblsxXSwgNDMuMzI3ODg4NDg2NDY4MSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICAjIy0tLS0tLS0tLS0tLSBJbnB1dHMgZm9yIHB2X2JlbmVmX2YgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGVhcm5pbmdzMQogICAgZWFybmluZ3Nfbm9fZXh0X2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICAgICAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9pblsxXSwKICAgICAgbGFtYmRhMl92YXIgPSAwLAogICAgICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgICAgIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3ZhcjEKICAgICkKICAgIGVhcm5pbmdzX3llc19leHRfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogICAgICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX2luWzFdLAogICAgICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICAgICAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMQogICAgKQoKICAgICMgZWFybmluZ3MxIHdpdGggcHJldmFsZW5jZQogICAgZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luIDwtIGVhcm5pbmdzX2FwcDFfZigKICAgICAgd2FnZV92YXIgPSB3YWdlX3RfaW4sCiAgICAgIGxhbWJkYTFfdmFyID0gbGFtYmRhMV9wcmV2bF9pblsxXSwKICAgICAgbGFtYmRhMl92YXIgPSAwLAogICAgICBzYXR1cmF0aW9uX3ZhciA9IHNhdHVyYXRpb25faW4sCiAgICAgIGNvdmVyYWdlX3ZhciA9IGNvdmVyYWdlX3ZhcjEKICAgICkKICAgIGVhcm5pbmdzX3llc19leHRfcHJldmxfaW4gPC0gZWFybmluZ3NfYXBwMV9mKAogICAgICB3YWdlX3ZhciA9IHdhZ2VfdF9pbiwKICAgICAgbGFtYmRhMV92YXIgPSBsYW1iZGExX3ByZXZsX2luWzFdLAogICAgICBsYW1iZGEyX3ZhciA9IGxhbWJkYTJfaW5bMV0sCiAgICAgIHNhdHVyYXRpb25fdmFyID0gc2F0dXJhdGlvbl9pbiwKICAgICAgY292ZXJhZ2VfdmFyID0gY292ZXJhZ2VfdmFyMQogICAgKQoKICAgICMgZWFybmluZ3MyCiAgICBlYXJuaW5nc19ub19leHRfbmV3X2luIDwtIGVhcm5pbmdzX2FwcDJfZih0X3ZhciA9IDA6NTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTFrMV92YXIgPSBsYW1iZGExX25ld19pblsxXSkKICAgICMgZWFybmluZ3MyIHdpdGggcHJldmFsZW5jZQogICAgZWFybmluZ3Nfbm9fZXh0X3ByZXZsX25ld19pbiA8LSBlYXJuaW5nc19hcHAyX2YodF92YXIgPSAwOjUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGExazFfdmFyID0gbGFtYmRhMV9wcmV2bF9uZXdfaW5bMV0pCgogICAgIyBpbnRlcmVzdCByYXRlIE5FRUQgVE8gVVBEQVRFIFRPIEVYQUNUIFJFU1VMVAogICAgaW50ZXJlc3RfaW4gPC0gaW50ZXJlc3RfZihnb3ZfYm9uZHNfdmFyID0gZ292X2JvbmRzX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGlvbl92YXIgPSBpbmZsYXRpb25fdmFyMSkkaW50ZXJlc3RfaW4KICAgIHVuaXRfdGVzdF9mKGVhcm5pbmdzX25vX2V4dF9pbiwgMzEuMTQyMTMzMjA0MDI2NiwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgdW5pdF90ZXN0X2YoZWFybmluZ3NfeWVzX2V4dF9pbiwgMTY3LjY2NzgxNzQ1MDkwNSwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgdW5pdF90ZXN0X2YoZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luLCAxNi45Njk0ODc2OTQzNDA2LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luLCAxNTMuNDk1MTcxOTQxMjE5LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpICAgIAogICAgdW5pdF90ZXN0X2YoaW50ZXJlc3RfaW4sIDAuMDk4NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICAjIy0tLS0tLS0tLS0tLS0tIElucHV0cyBmb3IgY29zdHMyX2YtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIE1ha2UgZXhwbGljaXQgbm9uLWZ1bmN0aW9uIGlucHV0czoKICAgIGRlbHRhX2VkX2ZpbmFsX2luIDwtIGRlbHRhX2VkX2ZpbmFsX2YoaW5jbHVkZV9leHRfdmFyID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX2VkX2V4dF92YXIgPSBkZWx0YV9lZF9leHRfdmFyMSkKICAgIHVuaXRfdGVzdF9mKGRlbHRhX2VkX2ZpbmFsX2luLCAwLjAxMTM0ODE5LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQoKICAgIGRlbHRhX2VkX2ZpbmFsX3hfaW4gPC0gZGVsdGFfZWRfZmluYWxfZigKICAgICAgaW5jbHVkZV9leHRfdmFyID0gVFJVRSwKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfdmFyMSwKICAgICAgZGVsdGFfZWRfZXh0X3ZhciA9IGRlbHRhX2VkX2V4dF92YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZihkZWx0YV9lZF9maW5hbF94X2luLCAgMC4wNTkxMTc2NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBpbnRlcmVzdF9pbiA8LSBpbnRlcmVzdF9mKGdvdl9ib25kc192YXIgPSBnb3ZfYm9uZHNfdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl92YXIxKSRpbnRlcmVzdF9pbgogICAgdW5pdF90ZXN0X2YoaW50ZXJlc3RfaW4sIDAuMDk4NSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBpbnRlcmVzdF9uZXdfaW4gPC0gaW50ZXJlc3RfZigKICAgICAgZ292X2JvbmRzX3ZhciA9IGdvdl9ib25kc19uZXdfdmFyMSwKICAgICAgaW5mbGF0aW9uX3ZhciA9IGluZmxhdGlvbl9uZXdfdmFyMSkkaW50ZXJlc3RfaW4KCiAgICBjb3N0X3Blcl9zdHVkZW50X2luIDwtICBjb3N0X3Blcl9zdHVkZW50X2YodGVhY2hfc2FsX3ZhciA9IHRlYWNoX3NhbF92YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIgPSB0ZWFjaF9iZW5fdmFyMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3N0dWRlbnRzX3ZhciA9IG5fc3R1ZGVudHNfdmFyMSkKICAgIHVuaXRfdGVzdF9mKGNvc3RfcGVyX3N0dWRlbnRfaW4sICAxMTYuODU0OSwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCgoKICAgIGNvc3RfcGVyX3N0dWRlbnRfbmV3X2luIDwtIGNvc3RfcGVyX3N0dWRlbnRfZigKICAgICAgdGVhY2hfc2FsX3ZhciA9IHRlYWNoX3NhbF9uZXdfdmFyMSwKICAgICAgdGVhY2hfYmVuX3ZhciA9IHRlYWNoX2Jlbl9uZXdfdmFyMSwKICAgICAgbl9zdHVkZW50c192YXIgPSBuX3N0dWRlbnRzX3ZhcjEKICAgICkKCiAgICBzMl9pbiA8LSBzMl9mKAogICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyID0gdW5pdF9jb3N0X2xvY2FsX3ZhcjEsCiAgICAgIGV4X3JhdGVfdmFyID0gZXhfcmF0ZV92YXIxLAogICAgICB5ZWFyc19vZl90cmVhdF92YXIgPSB5ZWFyc19vZl90cmVhdF8wX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKHMyX2luLCAxLjQyMTksIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjLS0tLS0tLS0tLS0tLS0tIElucHV0cyBmb3IgTlBWX3BlX2YtLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBNYWtlIGV4cGxpY2l0IG5vbi1mdW5jdGlvbiBpbnB1dHM6CiAgICAjQmVuZWZpdHM6CiAgICAjQmFpcmQgdy90YXggYW5kIG5vIGV4dGVybmFsaXRpZXMgKG5vIGV4dCkKICAgIHB2X2JlbmVmX3RheF9ueF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfaW4gKiB0YXhfdmFyMSwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKHB2X2JlbmVmX3RheF9ueF9pbiwgMjMuNjA3MDg5MzM3ODc4NCwKICAgICAgICAgICAgICBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgI0JhaXJkIHcvdCBhbmQgZXh0CiAgICBwdl9iZW5lZl90YXhfeXhfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3NfeWVzX2V4dF9pbiAqIHRheF92YXIxLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfdGF4X3l4X2luLCAxMjcuMDk5NDg2NzIxNywgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICNCYWlyZCBhbGwgYW5kIG5vCiAgICBwdl9iZW5lZl9hbGxfbnhfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX254X2luLCAxNDIuNDI1ODc4MzU4MjQsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBubyBleHQgKyBwcmV2YWxlbmNlCiAgICBwdl9iZW5lZl9hbGxfbnhfcHJldmxfaW4gPC0gcHZfYmVuZWZfZigKICAgICAgZWFybmluZ3NfdmFyID0gZWFybmluZ3Nfbm9fZXh0X3ByZXZsX2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX254X3ByZXZsX2luLCA3Ny42MDg0OTgyNDY0NjMsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBleHQKICAgIHB2X2JlbmVmX2FsbF95eF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3l4X2luLCA3NjYuODE0Mzk5NTI3NjA0LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjQmFpcmQgYWxsIGFuZCBleHQKICAgIHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiA8LSBwdl9iZW5lZl9mKAogICAgICBlYXJuaW5nc192YXIgPSBlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luLAogICAgICBpbnRlcmVzdF9yX3ZhciA9IGludGVyZXN0X2luLAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luLCA3MDEuOTk3MDE5NDE1ODI3LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgI0tMUFM0IHcvdCBhbmQgbm8gZXh0CiAgICBwdl9iZW5lZl90YXhfbmV3X2luIDwtIHB2X2JlbmVmX2YoCiAgICAgIGVhcm5pbmdzX3ZhciA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4gKiB0YXhfdmFyMSwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxCiAgICApCiAgICB1bml0X3Rlc3RfZihwdl9iZW5lZl90YXhfbmV3X2luLCA4OC4xODIwMTk5NTY5ODE0LAogICAgICAgICAgICAgIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCgogICAgIyBLTFBTNCBhbGwgYW5kIG5vIGV4dAogICAgcHZfYmVuZWZfYWxsX25ld19pbiA8LSBwdl9iZW5lZl9mKGVhcm5pbmdzX3ZhciA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihwdl9iZW5lZl9hbGxfbmV3X2luLCA1MzIuMDE4MjE5OTUxNjIyLCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgIyBLTFBTNCBhbGwgYW5kIG5vIGV4dCArIHByZXZhbGVuY2UKICAgIHB2X2JlbmVmX2FsbF9wcmV2bF9uZXdfaW4gPC0gcHZfYmVuZWZfZihlYXJuaW5nc192YXIgPSBlYXJuaW5nc19ub19leHRfcHJldmxfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxKQogICAgdW5pdF90ZXN0X2YocHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwgMjg5Ljg5OTEwNzk4NjE3OCwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICNDb3N0cyBhc2QKICAgICMgY29zdHMxOiBFQSBjb3N0cyBubyBleHRlcm5hbGl0aWVzCiAgICBjb3N0MV9pbiA8LSBjb3N0czFfcDJfZihjb3VudHJ5X3RvdGFsX3ZhciA9IGRmX2Nvc3RzX3ZhcjEkdG90YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X2Nvc3RfdmFyID0gZGZfY29zdHNfdmFyMSRjb3N0c19ieV9jb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZmZfdGltZV92YXIgPSBzdGFmZl90aW1lX3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5X25hbWVfdmFyID0gZGZfY29zdHNfdmFyMSRDb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0X3ZhciA9IGNvdW50cmllc192YXIxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfY29zdHNfdmFyID0gbmV3X2Nvc3RzX3ZhcjEpCiAgICB1bml0X3Rlc3RfZihjb3N0MV9pbiwgIDAuMDg0ODA2ODYsCiAgICAgICAgICAgICAgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKICAgICMgczJfZWFfaW4gPC0tIGNvc3QxX2luIChjb3N0czFfcDJfZikgPC0tIGNvc3RfZGF0YSAoY29zdHMxX3AxX2YoKSkKICAgIHMyX2VhX2luIDwtIHMyX25ld19mKGludGVyZXN0X3ZhciA9IGludGVyZXN0X25ld19pbiwKICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSBjb3N0MV9pbiwKICAgICAgICAgICAgICAgICAgICAgIGV4X3JhdGVfdmFyID0gMSwKICAgICAgICAgICAgICAgICAgICAgIHllYXJfb2ZfdHJlYXRfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxKQogICAgdW5pdF90ZXN0X2YoczJfZWFfaW4sICAwLjE5NjM0NDIyOTY4OTkxLCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgY29zdHMyX2VhX2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxLAogICAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9uZXdfaW4sCiAgICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IDAsCiAgICAgIHMxX3ZhciA9IDAsCiAgICAgIHExX3ZhciA9IDAsCiAgICAgIHMyX3ZhciA9IHMyX2VhX2luLAogICAgICBxMl92YXIgPSBxX2Z1bGxfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YoY29zdHMyX2VhX2luLCAgMC4xNDcyNTgxNzIyNjc0MzMsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCiAgICAjIGNvc3RzMjogQmFpcmQgbm8gZXh0ZXJuYWxpdGllcwogICAgY29zdHMyX2luIDwtIHB2X2Nvc3RzX2YoCiAgICAgIHBlcmlvZHNfdmFyID0gcGVyaW9kc192YXIxLAogICAgICBkZWx0YV9lZF92YXIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgaW50ZXJlc3Rfcl92YXIgPSBpbnRlcmVzdF9pbiwKICAgICAgY29zdF9vZl9zY2hvb2xpbmdfdmFyID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gcV96ZXJvX3ZhcjEsCiAgICAgIHMyX3ZhciA9IHMyX2luLAogICAgICBxMl92YXIgPSBxX2Z1bGxfdmFyMQogICAgKQogICAgdW5pdF90ZXN0X2YoY29zdHMyX2luLCAxMS43NzYxODgxMTg5ODgsIG1haW5fcnVuX3ZhciA9IG1haW5fcnVuX3ZhcjEpCmVhcm5pbmdzX25vX2V4dF9pbgogICAgIyBCYWlyZCB5ZXMgZXh0ZXJuYWxpdGllcwogICAgY29zdHMyX3hfaW4gPC0gcHZfY29zdHNfZigKICAgICAgcGVyaW9kc192YXIgPSBwZXJpb2RzX3ZhcjEsCiAgICAgIGRlbHRhX2VkX3ZhciA9IGRlbHRhX2VkX2ZpbmFsX3hfaW4sCiAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfaW4sCiAgICAgIGNvc3Rfb2Zfc2Nob29saW5nX3ZhciA9IGNvc3RfcGVyX3N0dWRlbnRfaW4sCiAgICAgIHMxX3ZhciA9IDAsCiAgICAgIHExX3ZhciA9IHFfemVyb192YXIxLAogICAgICBzMl92YXIgPSBzMl9pbiwKICAgICAgcTJfdmFyID0gcV9mdWxsX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKGNvc3RzMl94X2luLCAgMjUuMTk2MjEzMDU1OTg5NCwgbWFpbl9ydW5fdmFyID0gbWFpbl9ydW5fdmFyMSkKCiAgICBzMl9uZXdfaW4gPC0gczJfbmV3X2YoaW50ZXJlc3RfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF92YXIgPSB1bml0X2Nvc3RfbG9jYWxfbmV3X3ZhcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZXhfcmF0ZV92YXIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHllYXJfb2ZfdHJlYXRfdmFyID0geWVhcnNfb2ZfdHJlYXRfdF92YXIxKQogICAgIyBjb3N0czI6IEtMUFM0CiAgICBjb3N0c19hMl9pbiA8LSBwdl9jb3N0c19mKAogICAgICBwZXJpb2RzX3ZhciA9IHBlcmlvZHNfdmFyMSwKICAgICAgZGVsdGFfZWRfdmFyID0gZGVsdGFfZWRfZmluYWxfaW4sCiAgICAgIGludGVyZXN0X3JfdmFyID0gaW50ZXJlc3RfbmV3X2luLAogICAgICBjb3N0X29mX3NjaG9vbGluZ192YXIgPSBjb3N0X3Blcl9zdHVkZW50X25ld19pbiwKICAgICAgczFfdmFyID0gMCwKICAgICAgcTFfdmFyID0gcV96ZXJvX3ZhcjEsCiAgICAgIHMyX3ZhciA9IHMyX25ld19pbiwKICAgICAgcTJfdmFyID0gcV9mdWxsX3ZhcjEKICAgICkKICAgIHVuaXRfdGVzdF9mKGNvc3RzX2EyX2luLCAzMi4yOTc3NTQ2MTEwMzQ0LCBtYWluX3J1bl92YXIgPSBtYWluX3J1bl92YXIxKQogICAgcmV0dXJuKCBsaXN0KAogICAgICAid2FnZV8wX2luIiA9IHdhZ2VfMF9pbiwKICAgICAgIndhZ2VfdF9pbiIgPSB3YWdlX3RfaW4sCiAgICAgICJsYW1iZGExX2luIiA9IGxhbWJkYTFfaW4sCiAgICAgICJsYW1iZGExX3ByZXZsX2luIiA9IGxhbWJkYTFfcHJldmxfaW4sCiAgICAgICJsYW1iZGEyX2luIiA9IGxhbWJkYTJfaW4sCiAgICAgICJzYXR1cmF0aW9uX2luIiA9IHNhdHVyYXRpb25faW4sCiAgICAgICJsYW1iZGExX25ld19pbiIgPSBsYW1iZGExX25ld19pbiwKICAgICAgImxhbWJkYTFfcHJldmxfbmV3X2luIiA9IGxhbWJkYTFfcHJldmxfbmV3X2luLAogICAgICAiZWFybmluZ3Nfbm9fZXh0X2luIiA9IGVhcm5pbmdzX25vX2V4dF9pbiwKICAgICAgImVhcm5pbmdzX25vX2V4dF9wcmV2bF9pbiIgPSBlYXJuaW5nc19ub19leHRfcHJldmxfaW4sCiAgICAgICJlYXJuaW5nc195ZXNfZXh0X2luIiA9IGVhcm5pbmdzX3llc19leHRfaW4sCiAgICAgICJlYXJuaW5nc195ZXNfZXh0X3ByZXZsX2luIiA9IGVhcm5pbmdzX3llc19leHRfcHJldmxfaW4sCiAgICAgICJlYXJuaW5nc19ub19leHRfbmV3X2luIiA9IGVhcm5pbmdzX25vX2V4dF9uZXdfaW4sCiAgICAgICJlYXJuaW5nc19ub19leHRfcHJldmxfbmV3X2luIiA9IGVhcm5pbmdzX25vX2V4dF9wcmV2bF9uZXdfaW4sCiAgICAgICJpbnRlcmVzdF9pbiIgPSBpbnRlcmVzdF9pbiwKICAgICAgImNvc3RzMV9jb3VudHJ5X2luIiA9IGNvc3RzX2RhdGFfaW4sCiAgICAgICJkZWx0YV9lZF9maW5hbF9pbiIgPSBkZWx0YV9lZF9maW5hbF9pbiwKICAgICAgImRlbHRhX2VkX2ZpbmFsX3hfaW4iID0gZGVsdGFfZWRfZmluYWxfeF9pbiwKICAgICAgImNvc3RfcGVyX3N0dWRlbnRfaW4iID0gY29zdF9wZXJfc3R1ZGVudF9pbiwKICAgICAgInMyX2luIiA9IHMyX2luLAogICAgICAicHZfYmVuZWZfdGF4X254X2luIiA9IHB2X2JlbmVmX3RheF9ueF9pbiwKICAgICAgInB2X2JlbmVmX3RheF95eF9pbiIgPSBwdl9iZW5lZl90YXhfeXhfaW4sCiAgICAgICJwdl9iZW5lZl9hbGxfbnhfaW4iID0gcHZfYmVuZWZfYWxsX254X2luLAogICAgICAicHZfYmVuZWZfYWxsX254X3ByZXZsX2luIiA9IHB2X2JlbmVmX2FsbF9ueF9wcmV2bF9pbiwKICAgICAgInB2X2JlbmVmX2FsbF95eF9pbiIgPSAgcHZfYmVuZWZfYWxsX3l4X2luLAogICAgICAicHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luIiA9IHB2X2JlbmVmX2FsbF95eF9wcmV2bF9pbiwKICAgICAgInB2X2JlbmVmX3RheF9uZXdfaW4iID0gcHZfYmVuZWZfdGF4X25ld19pbiwKICAgICAgInB2X2JlbmVmX2FsbF9uZXdfaW4iID0gcHZfYmVuZWZfYWxsX25ld19pbiwKICAgICAgInB2X2JlbmVmX2FsbF9wcmV2bF9uZXdfaW4iID0gcHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwKICAgICAgImNvc3RzMl9lYV9pbiIgPSBjb3N0czJfZWFfaW4sCiAgICAgICJjb3N0czJfaW4iID0gY29zdHMyX2luLAogICAgICAiY29zdHMyX3hfaW4iID0gY29zdHMyX3hfaW4sCiAgICAgICJjb3N0c19hMl9pbiIgPSBjb3N0c19hMl9pbiwKICAgICAgImNvc3QxX2luIiA9IGNvc3QxX2luCiAgICApICkKICB9CgppbnZpc2libGUoIGxpc3QyZW52KG9uZV9ydW5fZigpLC5HbG9iYWxFbnYpICkKCiMgIHJldHVybiggc2FwcGx5KCBscyhwYXR0ZXJuPSAiX2luXFxiIiksIGZ1bmN0aW9uKHgpIGdldCh4KSkgKQoKI30KYGBgCgpgYGB7ciBtYWluLXJlc3VsdHMsIHB1cmw9RkFMU0UsIGVjaG89cHJpbnRfY29kZX0KI0JhaXJkIDE6IENvc3RzID0gQmFpcmQgdy90YXggYW5kIG5vIGV4dGVybmFsaXRpZXMgKG5vIGV4dCk7CiNCZW5lZiA9IEJhaXJkIG5vIGV4dAphMV90YXhfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfdGF4X254X2luLCBjb3N0c192YXIgPSBjb3N0czJfaW4pCnVuaXRfdGVzdF9mKGExX3RheF9wZSwgMTEuODMwOTAxMjE4ODkwNCkKI0JhaXJkIDI6IENvc3RzID0gQmFpcmQgdy90YXggYW5kIHllcyBleHRlcm5hbGl0aWVzIChubyBleHQpOwojQmVuZWYgPSBCYWlyZCB5ZXMgZXh0CmExX3hfdGF4X3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX3RheF95eF9pbiwgY29zdHNfdmFyID0gY29zdHMyX3hfaW4pCnVuaXRfdGVzdF9mKGExX3hfdGF4X3BlLCAxMDEuOTAzMjczNjY1NzExKQojIEJhaXJkIDM6IEJlbmVmaXRzID0gQmFpcmQgYWxsIGFuZCBubyBleHQ7IENvc3RzID0gQmFpcmQgbm8gZXh0CmExX2FsbF9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl9hbGxfbnhfaW4sIGNvc3RzX3ZhciA9IGNvc3RzMl9pbikKdW5pdF90ZXN0X2YoYTFfYWxsX3BlLCAxMzAuNjQ5NjkwMjM5MjUyKQojIEJhaXJkIDQ6IEJlbmVmaXRzID0gQmFpcmQgYWxsIGFuZCB5ZXMgZXh0OyBDb3N0cyA9IEJhaXJkIHllcyBleHQKYTFfeF9hbGxfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3l4X2luLCBjb3N0c192YXIgPSBjb3N0czJfeF9pbikKdW5pdF90ZXN0X2YoYTFfeF9hbGxfcGUsIDc0MS42MTgxODY0NzE2MTUpCgojS0xQUzRfMTogYmVuZWZpdHMgPSBLTFBTNCB3L3QgYW5kIG5vIGV4dDsgQ29zdHMgPQlCYWlyZCBubyBleHQKa2xwczRfMV9wZSA8LSBOUFZfcGVfZihiZW5lZml0c192YXIgPSBwdl9iZW5lZl90YXhfbmV3X2luLCBjb3N0c192YXIgPSBjb3N0c19hMl9pbikKdW5pdF90ZXN0X2Yoa2xwczRfMV9wZSwgNTUuODg0MjY1MzQ1OTQ3KQojS0xQUzRfMjpiZW5lZml0cyA9IEtMUFM0IGFsbCBhbmQgbm8gZXh0OyBDb3N0cyA9CUJhaXJkIG5vIGV4dAprbHBzNF8yX3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF9uZXdfaW4sIGNvc3RzX3ZhciA9IGNvc3RzX2EyX2luKQp1bml0X3Rlc3RfZihrbHBzNF8yX3BlLCA0OTkuNzIwNDY1MzQwNTg4KQoKIyBFQTE6IG5vIGV4dGVybmFsaXR5IE5QViB1c2luZyBFQXMgY29zdHMKZWExX3BlIDwtIE5QVl9wZV9mKGJlbmVmaXRzX3ZhciA9IHB2X2JlbmVmX2FsbF9ueF9wcmV2bF9pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQp1bml0X3Rlc3RfZihlYTFfcGUsIDc3LjQ2MTI0MDA3NDE5NTUpCiMgRUEyOiB5ZXMgZXh0ZXJuYWxpdHkgTlBWIHVzaW5nIEVBcyBjb3N0cwplYTJfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3l4X3ByZXZsX2luLCBjb3N0c192YXIgPSBjb3N0czJfZWFfaW4pCnVuaXRfdGVzdF9mKGVhMl9wZSwgNzAxLjg0OTc2MTI0MzU1OSkKIyBFQTM6IGJlbmVmPSBLTFBTIGFsbCBhbmQgbm8gZXh0OyBDb3N0cz1FQQplYTNfcGUgPC0gTlBWX3BlX2YoYmVuZWZpdHNfdmFyID0gcHZfYmVuZWZfYWxsX3ByZXZsX25ld19pbiwgY29zdHNfdmFyID0gY29zdHMyX2VhX2luKQp1bml0X3Rlc3RfZihlYTNfcGUsIDI4OS43NTE4NDk4MTM5MTEpCmBgYAoKPC9kZXRhaWxzPgoKfCBBcHByb2FjaCAgICB8IEJlbmVmaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29zdHMgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBOUFYKfC0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgMS4xIHwgQGJhaXJkMjAxNndvcm1zIHcvdGF4IGFuZCBubyBleHRlcm5hbGl0aWVzIChubyBleHQpIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoYTFfdGF4X3BlLCAxKWAgICB8CnwgMS4yIHwgQGJhaXJkMjAxNndvcm1zIHcvdCBhbmQgZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgVHJlYXRtZW50LCBFZHVjYXRpb24gKHcvZXh0KXwgYHIgcm91bmQoYTFfeF90YXhfcGUsIDEpYCB8CnwgMS4zIHwgQGJhaXJkMjAxNndvcm1zICBhbGwgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoYTFfYWxsX3BlLCAxKWAgICB8CnwgMS40IHwgQGJhaXJkMjAxNndvcm1zIGFsbCBhbmQgZXh0ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICh3L2V4dCkgIHwgYHIgcm91bmQoYTFfeF9hbGxfcGUsIDEpYCB8CnwgMi4xIHwgQGtscHM0ICB3L3QgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoa2xwczRfMV9wZSwgMSlgICB8CnwgMi4yIHwgQGtscHM0ICBhbGwgYW5kIG5vIGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFRyZWF0bWVudCwgRWR1Y2F0aW9uICAgICAgICAgIHwgYHIgcm91bmQoa2xwczRfMl9wZSwgMSlgICB8CnwgMy4xIHwgMS4zICsgcHJldmFsZW5jZSArIGxlbmd0aCBvZiB0cmVhdG1lbnQgICAgICAgICAgICAgIHwgVHJlYXRtZW50IChFQSkgICAgICAgICAgICAgICAgIHwgYHIgcm91bmQoZWExX3BlLCAxKWAgICAgICB8CnwgMy4yIHwgMS40ICsgcHJldmFsZW5jZSArIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHJlYXRtZW50IChFQSkgICAgICAgICAgICAgICAgIHwgYHIgcm91bmQoZWEyX3BlLCAxKWAgICAgICB8CnwgKiozLjMqKiAgICB8ICoqMi4yICsgcHJldmFsZW5jZSArIGxlbmd0aCoqICAgICAgICAgICAgICAgIHwgKipUcmVhdG1lbnQgKEVBKSAgKiogICAgICAgICAgIHwgKipgciByb3VuZChlYTNfcGUsIDEpYCoqICB8ICAKCgoKCgo8YnI+CmBgYHtyIGdlbmVyYXRlLXBsb3QtZnVuY3Rpb24sIHB1cmwgPSBUUlVFLCBlY2hvID0gRkFMU0V9CiMgZ2VuZXJhdGVfcGxvdF9mOiBmdW5jdGlvbiB0byBnZW5lcmF0ZSBwbG90cyBmb3IgYm90aCBEeW5hbWljIERvY3VtZW50IGFuZAojIHNoaW55IGFwcC4gSXQgdGFrZXMgaW4gdGhlIHNpbXVsYXRlZCBkYXRhLCBwb2xpY3kgZXN0aW1hdGUgdGV4dCwgYW5kIHJlc2NhbGUKIyB2YXJpYWJsZS4gVGhlc2UgYXJlIGludGVybWVkaWFyeSB2YXJpYWJsZXMgdG8gZXhjbHVkZSB0aGUgaW50ZXJhY3Rpdml0eSBvZgojIHNoaW55IGFwcCBmcm9tIHRoZSBwbG90IGdlbmVyYXRpb24gcHJvY2Vzcy4gIApjaHVua19nZW5lcmF0ZV9wbG90IDwtIGZ1bmN0aW9uKCkgewogIGdlbmVyYXRlX3Bsb3RfZiA8LSBmdW5jdGlvbihucHZfYWxsX3NpbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5X2VzdGltYXRlc190ZXh0X3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlKXsKICAgIHRvdGFsX3RpbWVfc2ltIDwtIG5wdl9hbGxfc2ltJHRvdGFsX3RpbWVfc2ltCiAgICBwb3NpdGlvbiA8LSB3aGljaCggcG9saWN5X2VzdGltYXRlc190ZXh0ID09IHBvbGljeV9lc3RpbWF0ZXNfdGV4dF9zZWxlY3RlZCkKICAgIG5wdl9zaW0gPC0gbnB2X2FsbF9zaW1bWyBwb2xpY3lfZXN0aW1hdGVzX3Zhcm5hbWVzW3Bvc2l0aW9uXSBdXSAgICAKICAgIG5wdl9mb3JfdGV4dCA8LSBwYXN0ZSgiTWVkaWFuIE5QVjogIiwgcm91bmQobWVkaWFuKG5wdl9zaW0pLCAyKSkKICAgIG5wdl9mb3JfdGV4dDIgPC0gcGFzdGUoIlNEIE5QVjogIiwgcm91bmQoc2QobnB2X3NpbSksIDIpKQogICAgcGxvdDEgPC0gZ2dwbG90KCkgKwogICAgICBnZW9tX2RlbnNpdHkoCiAgICAgICAgYWVzKHggPSBucHZfc2ltLAogICAgICAgICAgICBhbHBoYSA9IDEgLyAyLCAuLnNjYWxlZC4uKSwKICAgICAgICBrZXJuZWwgPSAiZ2F1IiwKICAgICAgICBsd2QgPSAxLAogICAgICAgIGZpbGwgPSAiIzAwN2JhNyIsCiAgICAgICAgY29sb3IgPSAiZGFya2JsdWUiLAogICAgICAgIGFscGhhID0gMC4zCiAgICAgICkgKwogICAgICBnZW9tX3ZsaW5lKAogICAgICAgIHhpbnRlcmNlcHQgPSBjKDAsIG1lZGlhbihucHZfc2ltKSksCiAgICAgICAgY29sID0gYygiYmxhY2siLCAiZGFya2JsdWUiKSwKICAgICAgICBsd2QgPSBjKDEsIDEpLAogICAgICAgIGxpbmV0eXBlID0gYygic29saWQiLCAiZGFzaGVkIikKICAgICAgKSArCiAgICAgIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygtMzAwLDEwMDApLCAgeWxpbSA9ICBjKCAwLCAxLjIgKSkgICsgICMgZml4aW5nIHRoZSB4IGF4aXMgc28gd2UgY2FuIHNlZSBzaGlmdHMgaW4gdGhlIGRlbnNpdHkKICAgICAgI3hsaW0ocmFuZ2UoZGVuc2l0eShucHZfc2ltKSR4KSkgKwogICAgICBndWlkZXMoYWxwaGEgPSAibm9uZSIsIGNvbG91ciA9ICJub25lIikgKwogICAgICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKwogICAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gZXhwYW5zaW9uKG11bHQgPSBjKDAsIDApKSkgKwogICAgICBhbm5vdGF0ZSgKICAgICAgICAidGV4dCIsCiAgICAgICAgeCA9IDEuNzUgKiBtZWRpYW4obnB2X3NpbSksCiAgICAgICAgeSA9IDAuMiwKICAgICAgICBsYWJlbCA9IG5wdl9mb3JfdGV4dCwKICAgICAgICBzaXplID0gNiwKICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSIKICAgICAgKSArCiAgICAgIGFubm90YXRlKAogICAgICAgICJ0ZXh0IiwKICAgICAgICB4ID0gMS43NSAqIG1lZGlhbihucHZfc2ltKSwKICAgICAgICB5ID0gMC4xLAogICAgICAgIGxhYmVsID0gbnB2X2Zvcl90ZXh0MiwKICAgICAgICBzaXplID0gNiwKICAgICAgICBjb2xvciA9ICJkYXJrYmx1ZSIKICAgICAgKSArCiAgICAgIHRoZW1lKAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAyNCksCiAgICAgICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLAogICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy5saW5lLnggPSBlbGVtZW50X2xpbmUoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS41KQogICAgICApCgogICAgaWYgKHJlc2NhbGUgPT0gVFJVRSkgewogICAgICBwbG90MSA8LQogICAgICAgIHN1cHByZXNzTWVzc2FnZXMocGxvdDEgKyBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IDEuMiAqIGMobWluKGMoCiAgICAgICAgICAtMSwgbnB2X3NpbQogICAgICAgICkpLCBtYXgoYygKICAgICAgICAgIDEwMCwgbnB2X3NpbQogICAgICAgICkpKSkpCiAgICB9CiAgICByZXR1cm4gKGxpc3QocGxvdDEscG9zaXRpb24sdG90YWxfdGltZV9zaW0pKQp9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCnJldHVybihsaXN0KCJnZW5lcmF0ZV9wbG90X2YiID0gZ2VuZXJhdGVfcGxvdF9mKSkKfQoKaW52aXNpYmxlKCBsaXN0MmVudihjaHVua19nZW5lcmF0ZV9wbG90KCksLkdsb2JhbEVudikgKQpgYGAKCgpgYGB7ciBydW4tbWMsIGRwaSA9IDQwMCwgcHVybD1GQUxTRSwgZWNobz1GQUxTRX0KCgpucHZfYWxsX3NpbSA8LSAgIHNpbV9kYXRhMV9mKAogICAgICAgICAgICBuc2ltc192YXIyID0gbnNpbXNfc28sICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdvdl9ib25kc192YXIyICAgICAgICAgID0gcm91bmQoZ292X2JvbmRzX3NvLDIpICAgICAgICAgICAgICwgICAgI2FzZCBnb3ZfYm9uZHNfc28sIE5PIENIQU5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfc2RfdmFyMiAgICAgICA9IGdvdl9ib25kc19zbyAqIDAuMSAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGluZmxhdGlvbl92YXIyICAgICAgICAgID0gaW5mbGF0aW9uX3NvICAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaW5mbGF0aW9uX3NkX3ZhcjIgICAgICAgPSBpbmZsYXRpb25fc28gKiAwLjEgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3ZhcjIgICAgICA9IGdvdl9ib25kc19uZXdfc28gICAgICAsICAgICAgICAgIAogICAgICAgICAgICBnb3ZfYm9uZHNfbmV3X3NkX3ZhcjIgICA9IGdvdl9ib25kc19uZXdfc28gKiAwLjEsICAgICAgICAgIAogICAgICAgICAgICBpbmZsYXRpb25fbmV3X3ZhcjIgICAgICA9IGluZmxhdGlvbl9uZXdfc28gICAgICAsICAgICAgICAKICAgICAgICAgICAgaW5mbGF0aW9uX25ld19zZF92YXIyICAgPSBpbmZsYXRpb25fbmV3X3NvICogMC4xLCAgICAgICAgICAKICAgICAgICAgICAgd2FnZV9hZ192YXIyICAgICAgICAgICAgPSB3YWdlX2FnX3NvICAgICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdhZ2VfYWdfc2RfdmFyMiAgICAgICAgID0gd2FnZV9hZ19zbyAqIDAuMSAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB3YWdlX3d3X3ZhcjIgICAgICAgICAgICA9IHdhZ2Vfd3dfc28gICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgd2FnZV93d19zZF92YXIyICAgICAgICAgPSB3YWdlX3d3X3NvICogMC4xICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHByb2ZpdHNfc2VfdmFyMiAgICAgICAgID0gcHJvZml0c19zZV9zbyAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwcm9maXRzX3NlX3NkX3ZhcjIgICAgICA9IHByb2ZpdHNfc2Vfc28gKiAwLjEgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgaG91cnNfc2VfY29uZF92YXIyICAgICAgPSBob3Vyc19zZV9jb25kX3NvICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGhvdXJzX3NlX2NvbmRfc2RfdmFyMiAgID0gaG91cnNfc2VfY29uZF9zbyAqIDAuMSAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19hZ192YXIyICAgICAgICAgICA9IGhvdXJzX2FnX3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19hZ19zZF92YXIyICAgICAgICA9IGhvdXJzX2FnX3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc193d192YXIyICAgICAgICAgICA9IGhvdXJzX3d3X3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc193d19zZF92YXIyICAgICAgICA9IGhvdXJzX3d3X3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19zZV92YXIyICAgICAgICAgICA9IGhvdXJzX3NlX3NvICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBob3Vyc19zZV9zZF92YXIyICAgICAgICA9IGhvdXJzX3NlX3NvICogMC4xICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBleF9yYXRlX3ZhcjIgICAgICAgICAgICA9IGV4X3JhdGVfc28gICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgZXhfcmF0ZV9zZF92YXIyICAgICAgICAgPSBleF9yYXRlX3NvICogMC4xICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdyb3d0aF9yYXRlX3ZhcjIgICAgICAgID0gZ3Jvd3RoX3JhdGVfc28gICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGdyb3d0aF9yYXRlX3NkX3ZhcjIgICAgID0gZ3Jvd3RoX3JhdGVfc28gKiAwLjEgICAgICAgICwKICAgICAgICAgICAgY292ZXJhZ2VfdmFyMiAgICAgICAgICAgPSBjb3ZlcmFnZV9zbyAgICAgICAgICAgICAgLAogICAgICAgICAgICBjb3ZlcmFnZV9zZF92YXIyICAgICAgICA9IGNvdmVyYWdlX3NvICogMC4xICAgICAgICAgICAsICAKICAgICAgICAgICAgdGF4X3ZhcjIgICAgICAgICAgICAgICAgPSB0YXhfc28gICAgICAgICAgICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0YXhfc2RfdmFyMiAgICAgICAgICAgICA9IHRheF9zbyAqIDAuMSAgICAgICAgICAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfdmFyMiAgICA9IHVuaXRfY29zdF9sb2NhbF9zbyAgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfc2RfdmFyMiA9IHVuaXRfY29zdF9sb2NhbF9zbyAqIDAuMSAgICAsCiAgICAgICAgICAgIHVuaXRfY29zdF9sb2NhbF9uZXdfdmFyMiA9IHVuaXRfY29zdF8yMDE3dXNkcHBwX3NvLAogICAgICAgICAgICB1bml0X2Nvc3RfbG9jYWxfbmV3X3NkX3ZhcjIgPSB1bml0X2Nvc3RfMjAxN3VzZHBwcF9zbyAqIDAuMSAgLCAgCiAgICAgICAgICAgIHllYXJzX29mX3RyZWF0XzBfdmFyMiAgID0geWVhcnNfb2ZfdHJlYXRfMF9zbyAgICAgICAgLCAgICAKICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfMF9zZF92YXIyPSB5ZWFyc19vZl90cmVhdF8wX3NvICogMC4xICAgICAsCiAgICAgICAgICAgIHllYXJzX29mX3RyZWF0X3RfdmFyMiAgID0geWVhcnNfb2ZfdHJlYXRfdF9zbyAgICAgICAgLCAgICAKICAgICAgICAgICAgeWVhcnNfb2ZfdHJlYXRfdF9zZF92YXIyPSB5ZWFyc19vZl90cmVhdF90X3NvICogMC4xICAgICAsCiAgICAgICAgICAgIGxhbWJkYTFfdmFyMiAgICAgICAgICAgID0gbGFtYmRhMV9zbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbGFtYmRhMV9zZF92YXIyICAgICAgICAgPSBsYW1iZGExX3NkX3NvICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGEyX3ZhcjIgICAgICAgICAgICA9IGxhbWJkYTJfc28gICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGEyX3NkX3ZhcjIgICAgICAgICA9IGxhbWJkYTJfc2Rfc28gICAsICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX2Z1bGxfdmFyMiAgICAgICAgICAgICA9IHFfZnVsbF9zbyAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX2Z1bGxfc2RfdmFyMiAgICAgICAgICA9IHFfZnVsbF9zbyAqIDAuMSAgICwgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNvZWZfZXhwX3ZhcjIgICAgICAgICAgID0gY29lZl9leHBfc28sICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9zYWxfdmFyMiAgICAgICAgICA9IHRlYWNoX3NhbF9zbyAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGVhY2hfc2FsX3NkX3ZhcjIgICAgICAgPSB0ZWFjaF9zYWxfc28gKiAwLjEgICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHRlYWNoX2Jlbl92YXIyICAgICAgICAgID0gdGVhY2hfYmVuX3NvICAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fc2RfdmFyMiAgICAgICA9IHRlYWNoX2Jlbl9zbyAqIDAuMSAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgdGVhY2hfc2FsX25ld192YXIyICAgICAgPSB0ZWFjaF9zYWxfbmV3X3NvICAgICAgICAgLCAgICAgICAgICAjYWRkIHRvIGFwcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIHRlYWNoX3NhbF9uZXdfc2RfdmFyMiAgID0gdGVhY2hfc2FsX25ld19zbyAqIDAuMSAgICAgICwgICAgICAgI2FkZCB0byBhcHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fbmV3X3ZhcjIgICAgICA9IHRlYWNoX2Jlbl9uZXdfc28gICAgICAgICAsICAgICAgICAgICNhZGQgdG8gYXBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB0ZWFjaF9iZW5fbmV3X3NkX3ZhcjIgICA9IDAuMDAwMDAxICAgICAgLCAgICAgICAgICAgICAgICAgICAgICNhZGQgdG8gYXBwCiAgICAgICAgICAgIG5fc3R1ZGVudHNfdmFyMiAgICAgICAgID0gbl9zdHVkZW50c19zbyAgICAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIG5fc3R1ZGVudHNfc2RfdmFyMiAgICAgID0gbl9zdHVkZW50c19zbyAqIDAuMSAgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRlbHRhX2VkX3ZhcjIgICAgICAgICAgID0gZGVsdGFfZWRfcGFyX3NvICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGRlbHRhX2VkX3NkX3ZhcjIgICAgICAgID0gZGVsdGFfZWRfcGFyX3NvICogMC4xICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWx0YV9lZF9leHRfdmFyMiAgICAgICA9IGRlbHRhX2VkX2V4dF9wYXJfc28gICAgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBkZWx0YV9lZF9leHRfc2RfdmFyMiAgICA9IGRlbHRhX2VkX2V4dF9wYXJfc28gKiAwLjEgICAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBxX3plcm9fdmFyMiAgICAgICAgICAgICA9IHFfemVyb19zbyAgICAgICAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgIHFfemVyb19zZF92YXIyICAgICAgICAgID0gMC4wMDEsICNxX3plcm9fc28gKiAwLjEgICAgIEJJRyBDSEFOR0UgICAgLAogICAgICAgICAgICBsYW1iZGExX25ld192YXIyICAgICAgICA9IHJvdW5kKGxhbWJkYTFfbmV3X3NvLCAyKSwgICAgI3JvdW5kZWQgdG8gbWF0Y2ggc2hpbnkgYXBwICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsYW1iZGExX25ld19zZF92YXIyICAgICA9IGxhbWJkYTFfbmV3X3NkX3NvLCAgICAgICAgICAgICAKICAgICAgICAgICAgcHJldmFsZW5jZV8wX3ZhcjIgICAgICAgPSBwcmV2YWxlbmNlXzBfc28gICAgICAgLCAgCiAgICAgICAgICAgIHByZXZhbGVuY2VfMF9zZF92YXIyICAgID0gMC4xICAgICwKICAgICAgICAgICAgcHJldmFsZW5jZV9yX3ZhcjIgICAgICAgPSAxICAgICAgICwgICAgI1RFTVAKICAgICAgICAgICAgcHJldmFsZW5jZV9yX3NkX3ZhcjIgICAgPSAwLjEgICAgLCAgICAgICAgICAgCiAgICAgICAgICAgIG5ld19wcmV2bF9yX3ZhcjIgICAgICAgICA9IHJvdW5kKHByZXZhbGVuY2Vfcl9pbiwyKSwgI2FzZCAjbmV3X3ByZXZhbGVuY2Vfcl9zbywgIEJJRyBDSEFOR0UKICAgICAgICAgICAgbmV3X3ByZXZsX3Jfc2RfdmFyMiAgICAgID0gMC4xLCAgICAgICAgICAgICAgICAgICAgICAjYXNkICNuZXdfcHJldmFsZW5jZV9yX3NvICogMC4xLAogICAgICAgICAgICBzdGFmZl90aW1lX3ZhcjIgICAgICAgICA9IHN0YWZmX3RpbWVfc28gICAgLAogICAgICAgICAgICBzdGFmZl90aW1lX3NkX3ZhcjIgICAgICA9IHN0YWZmX3RpbWVfc28gKiAwLjEsCiAgICAgICAgICAgIGNvdW50c19wYXJfdmFyMiAgICAgICAgID0gY291bnRzX3Bhcl9zbyAgICAsCiAgICAgICAgICAgIGNvdW50c19wYXJfc2RfdmFyMiAgICAgID0gY291bnRzX3Bhcl9zZF9zbyAsCiAgICAgICAgICAgIGNvc3RzX3Bhcl92YXIyICAgICAgICAgID0gY29zdHNfcGFyX3NvICAgICAsCiAgICAgICAgICAgIGNvc3RzX3Bhcl9zZF92YXIyICAgICAgID0gY29zdHNfcGFyX3NkX3NvLAoKICAgICAgICAgICAgbmV3X2Nvc3RzX3ZhcjIgICAgICAgICAgPSByb3VuZChjb3N0czJfZWFfaW4sMiksICAgICAgICNjb3N0czJfZWFfaW4sIE5PIENIQU5HRQogICAgICAgICAgICBuZXdfY29zdHNfc2RfdmFyMiAgICAgICA9IHJvdW5kKGNvc3RzMl9lYV9pbiwyKSAqIDAuMSwgI2Nvc3RzMl9lYV9pbiAqIDAuMSwKICAgICAgICAgICAgY291bnRyaWVzX3ZhcjIgICAgICAgICAgPSBsaXN0KCJpbmRpYSIsICJrZW55YSIsICJuaWdlcmlhIiwgInZpZXRuYW0iKQogICAgICAgICAgICApCgoKCgojVW5pdCB0ZXN0IHRoZSBzaW11bGF0aW9ucyBmb3IgPC0gPSAxMDAsIDEwMDAsIDEwMDAwIFVQREFURQphbGxfcmVzXzEwMF9zaW1zIDwtIGMoCiAgOC4wMzc1ODU4NzczMzUzNSwKICA0MS4zNDE4MjUzNzQwNzEgLAogIDQ5LjgyOTM3MjI2MTE3NTUsCiAgMjYzLjUwODUxOTY5MjkwOSwKICA4Mi4zOTU2ODYzNTA1NzAxLAogIDUwMi4xMDIyODUzMjAyNzgsCiAgMzMuOTM3MTYxMDY2NjExMiwKICAyNDcuNDM3NDAwMTIyMjggLAogIDI5Ni4yMDI2OTk4MjMzOTcKKQoKYWxsX3Jlc18xMDAwX3NpbXMgPC0gYygKICA4LjU4Mjk5MzkwMjc2NDM0LAogIDQ4LjkwMTk1NjM5MDM3NzcsCiAgNDkuMzg0NzM3OTE1NTI2OSwKICAyODQuMDI5ODUxMTgzNzA3LAogIDg1LjEwMjI4Mzc3NTU5OTQsCiAgNTEwLjMwNTk0NzQ2NTE1MywKICAzMi42NDQ3NjMzNzMzNDkzLAogIDI2Ni4xMTM3OTIyMTE0NzgsCiAgMzAyLjc0NTg3NDU3MjQxNAopCgphbGxfcmVzXzEwMDAwX3NpbXMgPC0gYygKICAxNi4zNDQ4ODQ2MTc2MDQ5LAogIDk4LjQ5OTgxNjM0NzgwODEsCiAgOTcuMzcyMjc5MTUxNzYzNCwKICA1ODkuMTA2MjE3NTg4MDY0LAogIDg4LjQxMTIyNjM0NTgwNzUsCiAgNTI5LjU5MDY5Mzk1MTAzNSwKICA2MS41NjUxNDk0MTA3NjY2LAogIDU3Ni43MTg3MjcyNDgzNyAsCiAgMzE3LjIzNjk2NzI2NjI5MQopCgoKCmlmIChUUlVFKSB7CmsgPC0gMApmb3IgKCBpIGluIHBvbGljeV9lc3RpbWF0ZXNfdmFybmFtZXMgKSB7CiAgICBrIDwtIGsgKyAxCiAgICB0b190ZXN0IDwtIG5wdl9hbGxfc2ltW1tpXV0KICAgIGlmIChuc2ltc19zbyA9PSAxZTQpewogICAgICAgIHVuaXRfdGVzdF9mKHRvX3Rlc3QsIGFsbF9yZXNfMTAwMDBfc2ltc1trXSwgbWFpbl9ydW5fdmFyID0gVFJVRSkKICAgIH0gZWxzZSBpZiAobnNpbXNfc28gPT0gMWUzKXsKICAgICAgICB1bml0X3Rlc3RfZih0b190ZXN0LCBhbGxfcmVzXzEwMDBfc2ltc1trXSwgbWFpbl9ydW5fdmFyID0gVFJVRSkKICAgIH0gZWxzZSBpZiAobnNpbXNfc28gPT0gMWUyKXsKICAgICAgICB1bml0X3Rlc3RfZih0b190ZXN0LCBhbGxfcmVzXzEwMF9zaW1zW2tdLCBtYWluX3J1bl92YXIgPSBUUlVFKQogICAgfQp9Cn0KIyMjIyMjIyMjIyMjIyMjIwojIyMjIyMgUmVzdWx0cy9WaXoKIyMjIyMjIyMjIyMjIyMjIwpsaWJyYXJ5KHBsb3RseSkKCnBsb3QxIDwtIGdlbmVyYXRlX3Bsb3RfZihucHZfYWxsX3NpbSwgIkEzLiBBbGwgaW5jb21lIG9mIEEyLiBNYWluIFBvbGljeSBFc3RpbWF0ZSIsIHJlc2NhbGVfc28pW1sxXV0gKwogICAgICBsYWJzKHkgPSBOVUxMLAogICAgICAgeCA9ICJOZXQgUHJlc2VudCBWYWx1ZSAoQmVuZWZpdHMgLSAgQ29zdHMpIiAsCiAgICAgICB0aXRsZSA9ICJOZXQgTGlmZXRpbWUgSW5jb21lIEVmZmVjdHMgb2YgRGV3b3JtaW5nIGZvciBFYWNoIFRyZWF0ZWQgQ2hpbGRyZW4iLAogICAgICAgc3VidGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIHRoZSBOZXQgUHJlc2VudCBWYWx1ZSBvZiBEZXdvcm1pbmcgSW50ZXJ2ZW50aW9ucyIKICAgICAgICkKcHJpbnQocGxvdDEpCiNnZ3NhdmUoaGVyZSgiY29kZSIsICJtYWluX3BlLnBuZyIpKQoKYGBgCgojIFJlZmVyZW5jZXMKCgpbXjFdOiBFQXMgdmVyc2lvbiBvZiB0aGUgYW5hbHlzaXMgZm9sbG93cyBhIHNpbWlsYXIgc3RydWN0dXJlIHRoYW4gdGhlIGNvc3QgZWZmZWN0aXZlbmVzcyBhbmFseXNpcyBwZXJmb3JtZWQgYnkgdGhlIGNoYXJpdHkgZXZhbHVhdG9yIEdpdmVXZWxsIFtAZ2l2ZXdlbGxdLgoKClteNV06YEYxID0gR2l2ZVdlbGwncyBlc3RpbWF0ZXMgb2YgRGV3b3JtIHRoZSBXb3JsZCdzIGNvc3QgcGVyIGNoaWxkIGRld29ybWVkIHBlciB5ZWFyIFsyMDE4XWAgT3JpZ2luYWwgW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFqelM2OTNZLVpBSWxvUWVqbHpTYzNlM3Q3aVBIeW9yMXF0N0hCalNWWGhRL2VkaXQjZ2lkPTUwOTAzMzg1NyksIGVkaXRhYmxlIHZlcnNpb24gW2hlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFobWlqbUpCZUNKQUtJMWRUOG41aU9MQUF4ZnpXcktZSk1fS2ZvdUZZSTJ3L2VkaXQjZ2lkPTUwOTAzMzg1NykKYEYyID0gMjAxOSBHaXZlV2VsbCBDb3N0LWVmZmVjdGl2ZW5lc3MgQW5hbHlzaXMg4oCUIFZlcnNpb24gM2AgIApgRjMgPSAyMDE4IFdvcm0gSW50ZW5zaXR5IFdvcmtib29rIOKAlCBWZXJzaW9uIDFgIFNoZWV0cyBhcmUgbmFtZWQgdGhlIGZpcnN0IHRpbWUgYW5kIG51bWJlcmVkIHRoZXJlYWZ0ZXIuCgoKW14yXTogdG8gYWNjb3VudCBmb3Igc2V2ZXJhbCBoaWdoLWxldmVsIGFjdGl2aXRpZXMgRGV3b3JtIHRoZSBXb3JsZCBkb2VzIG5vdCBpbmNsdWRlIGluIGl0cyBjb3N0IHBlciB0cmVhdG1lbnQgYW5hbHlzZXMsIGFzIHRoZXkgYXJlIG5vdCBkaXJlY3RseSByZWxhdGVkIHRvIGFueSBwYXJ0aWN1bGFyIHByb2dyYW0KCgpbXjNdOiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFCa1FMeUxZUW15OU83RklTZ2U3OFBuV3k5dXJNbzBrMzFSd0k1dE9oSkU0L2VkaXQKCgpbXjddOiBzZXJpZXMgYXZhbGFibGUgaW4gZmlsZSBgfi9vcGEtZGV3b3JtaW5nL2RvY3MvbWF0ZXJpYWxzL29yaWdpbmFsX21hdGVyaWFscy9CYWlyZC1ldGFsLVFKRS0yMDE2X2Zpc2NhbC1pbXBhY3QtY2FsY3VsYXRpb25zLnhsc3hgIHdvcmtzaGVldGBBc3N1bXBzJlBhbmVsIEEgQ2FsY3MhQTkzYAo=

An Open Policy Analysis by BITSS

opa@berkeley.edu