[Components of Democracy: Does Democracy Cause Growth]

GitHub Repository: [add url here if you have created a data or code repository, if not delete this line]

Study Preregistration form: [https://rpubs.com/SMI200381941/1050769]

Information about this replication project

Workspace setup

YAML settings

output:
  html_document:
   code_download: true
    toc: true
    toc_depth: 2
    toc_float:
     collapsed: false
     smooth_scroll: true

Global settings of R chunks

# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)

Libraries

# All used libraries
library("rmarkdown")
library("knitr")
library("readr")
library("dplyr")
library("ggplot2")
library("summarytools")
library("plm")
library("sjPlot")

Versions of used packages

$rmarkdown
[1] '2.21'

$knitr
[1] '1.42'

My enviroment

[1] "R version 4.3.0 (2023-04-21)"

1. Introduction

The paper (Acemoglu et al., 2014), ‘Does Democracy Cause Growth’, inquires to the global effectiveness and implications of Democracy in causing economic growth, measured through GDP per capita. The paper uses panel data to construct cross-country regression models and graphs which portray the effects of democracy over time, with the overarching finding that countries experience a 20% increase in growth, 25 years after a democratic transition. These findings are significant and follow a long stream of economic literature, such as (Minier, 1998) arguing that increasing level of democracy results in increasing growth rates comparable to decreasing democracy which find relatively lower growth, therefore reinforcing Acemoglu’s claim. Affected in conjunction by income and literacy levels. It differs from our replication paper, which uses simple coding of democratic or non-democratic for each year dependent on the Freedom House democracy indice score. Much of the literature is segmented into categories, analysing democracy as a sole entity, controlling for its economic, demographic, and social and cultural and geographical variables. Or analysing the effect of these channels in relation to democracy, as either how they affect or are affected by democracy and extending this to GDP.

Tavares & Wavziarg argue democracy increases growth by through increasing human capital and decreasing income inequality, whilst it cuts growth by rising government consumption and slowing down physical capital acquirement. (Tavares and Wacziarg, 2001) However like earlier literature, they come to an opposite consensus to our paper, that overall, when controlling these factors, democracy has a negative effect on growth. (Barro, 1996) Our selected paper builds on these past articles, arguing there are biases due to unaccounted for characteristics at the country level, not fixing country effects. (Acemoglu et al., 2014) Conclusively it does a great job at both controlling potential biases, both on the snapshot basic level, but also considering gradual lags and time effects which would have an impact on GDP through anticipation.

A significant gap in the literature is posed by the fact that democracy is simplified, most of the literature uses a dummy democratic variable or a continuous scale variable, the paper tries to resolve the possible measurement error this poses, through combining indices, it only acknowledges the occurrence of democracy once it has reached a significant level, even though democracy is present in a complexity of ways. Allowing prevalent factors or aspects of democracy to be thriving before a major transition has recorded.

Freese and Peterson’s (2017), table of replication, classes this as a repeatability replication, by conducting the same main methods and model, for separate democracy factors with our own additional exploratory analyses, all with a different data set, therefore not only critiquing significance, and magnitude individually over time, but also whether the wider cumulative effect fits with the results of (Acemoglu et al., 2014) Analysing factors of democracy against GDP with the same controls, to further the topic field.

The extension may yield an unbalanced result of significance, with indices being highly significant, whilst others are not. However, this must be tested further, as spoken previously each indice can contribute to a cumulative effect and may have effects on other channels that result in lagged GDP growth, such unobserved significance and effects will require reanalysis and extensive exploratory testing to ensure it is accounted for instead of being simply written off.

2. Data and methods

2.1. Data

The original study used panel data, comprised by combining data from multiple datasets, explored, and justified by referring to earlier studies. The combined datafile, named ‘DDCGdata_final.dta’, is openly available in the supplementary materials of the paper, (Acemoglu et al., 2019) containing 175 countries, spanning from 1960-2010, with an observation for each country in each year totalling 9384, with 1117 variables. The main dummy variable is coded to make a dichotomous scale of either democratic or not, dependent on 3 reliable indexes, (Freedom House, 2020), Polity IV (Center for Systemic Peace, 2022) and secondary indexes of democracy from CGV (Cheibub, Gandhi and Vreeland, 2009) and BMR (Boix, Miller and Rosato, 2012). Figure 1 performs a regression against GDP per capita, controlling for an array of x variables, such as investment, trade, secondary & primary school enrolment, infant mortality, and financial flows.

My data for replication is the large-scale V-DEM’s (V-dem.net, 2023) project data collated from 1960-2020, with select variables relating to the original study’s variables from the World Bank’s development indicators (World Bank, 2023) to merge with the datafile, to conduct the same methods presented in the original.

Loading Datasets:

V_DEM_Full <- readRDS("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/V-Dem-CY-Full+Others-v11.1.rds")

WB_data_variables <- read_csv("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/WB_data_variables.csv")

Recoding variables:

WB_data_variables <- WB_data_variables %>%
  rename('country_name' = `Country Name`)

WB_data_variables <- WB_data_variables %>%
  rename('year' = `Time`)

WB_data_variables <- WB_data_variables %>%
  rename('country_text_id' = `Country Code`)

WB_data_variables <- WB_data_variables %>%
  rename('tax_revenue' = `Tax revenue (% of GDP) [GC.TAX.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename('net_investment' = `Net investment in nonfinancial assets (% of GDP) [GC.NFN.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename('trade' = `Trade (% of GDP) [NE.TRD.GNFS.ZS]`)

Preparing and merging the data:

str(WB_data_variables)

datafile <- WB_data_variables

# Removing NAs
WB_data_variables <- datafile[!is.na(datafile$country_name), ]
WB_data_variables <- datafile[!is.na(datafile$year), ]

# Removing years below 1960
bottomthreshold <- 1960
V_DEM_Full <- V_DEM_Full[V_DEM_Full$year >= bottomthreshold, ]

# Filtering out countries that aren't in both datasets
countryID <- unique(V_DEM_Full$country_text_id)
Filtering <- WB_data_variables[WB_data_variables$country_text_id %in% countryID, ]

# Merging them together
indicator_dataset <- inner_join(V_DEM_Full, Filtering, by = c("year", "country_text_id"))

Subsetting the data:

condensed_data <- subset(indicator_dataset, select = c(country_name.x, country_text_id, country_id,
                                                       year, historical_date, histname,codingstart,
                                                       codingend,v2x_polyarchy, v2x_libdem, v2x_partipdem,
                                                       v2x_delibdem,v2x_egaldem,e_migdppc,tax_revenue,
                                                       net_investment, trade,e_cow_imports,
                                                       e_cow_exports,e_total_fuel_income_pc,e_miinflat,v2peprisch,
                                                       v2pesecsch,e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,
                                                       v2cafres,e_fh_rol,e_civil_war))

Creating a Statistics Summary

Firstly collating averages and standard deviation of main variables

# Creating a dataset of averages and standard deviatioms for our key variables
summarised_stats1 <- condensed_data %>%
  group_by(year) %>%
  summarize(mean_GDP = mean(e_migdppc, na.rm = TRUE),
            sd_GDP = sd(e_migdppc, na.rm = TRUE),
            mean_polyarchy = mean(v2x_polyarchy, na.rm = TRUE),
            sd_polyarchy = sd(v2x_polyarchy, na.rm = TRUE),
            mean_libdem = mean(v2x_libdem, na.rm = TRUE),
            sd_libdem = sd(v2x_libdem, na.rm = TRUE),
            mean_partip = mean(v2x_partipdem, na.rm = TRUE),
            sd_partip = sd(v2x_partipdem, na.rm = TRUE),
            mean_delibdem = mean(v2x_delibdem, na.rm = TRUE),
            sd_delibdem = sd(v2x_delibdem, na.rm = TRUE),
            mean_egaldem = mean(v2x_egaldem, na.rm = TRUE),
            sd_egaldem = sd(v2x_egaldem, na.rm = TRUE))

A visualisation of mean GDP time series, with the average of our key factors of democracy from 1960 to 2020

# A summary plot of average GDP, and average indicators on a time series
ggplot(summarised_stats1, aes(x = year, y = mean_GDP,)) +
  geom_point() +
  geom_smooth(aes(ymin = mean_GDP - sd_GDP, ymax = mean_GDP + sd_GDP), fill = "lightblue", alpha = 0.2) +
  theme_minimal() +
  scale_y_continuous(sec.axis = sec_axis(~ . / 20000, name = "Level of Democracy Indicators")) +
  geom_smooth(data = summarised_stats1, aes(y = mean_polyarchy * 20000), color = "red", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_libdem * 20000), color = "green", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_partip * 20000), color = "yellow", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_delibdem * 20000), color = "purple", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_egaldem * 20000), color = "orange", size = 1) +
  labs(title = "Figure 1. Average trend of GDP and democracy indicators over time " , x = "Years 1960 to 2020", y = "Mean GDP")

Exploring the key variable’s statistics

# Variables for our summary table
tabledata <- subset(condensed_data, select = c(e_migdppc,v2x_polyarchy,v2x_libdem,v2x_partipdem, v2x_delibdem,v2x_egaldem,tax_revenue,net_investment, trade,e_total_fuel_income_pc,e_miinflat,v2peprisch,v2pesecsch, e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,v2cafres))
# Renaming variables in our tabledata, so they can be labelled more clearly and therefore presentable

tabledata <- tabledata %>%
  rename(
    "Secondary school enrollment" = v2pesecsch,
    "Primary school enrollment" = v2peprisch,
    "Freedom of Research/Teach" = v2cafres,
    "Rule of law" = e_wbgi_rle,
    "Political stability" = e_wbgi_pve,
    "Natural resource produc per capita" = e_total_fuel_income_pc,
    "Infanty morality rate" = e_peinfmor,
    "Population" = e_mipopula,
    "Inflation" = e_miinflat,
    "GDP per capita" = e_migdppc,
    "GDP Growth" = e_migdpgrolns)
# Converting to numerical
tabledata$tax_revenue <- as.numeric(tabledata$tax_revenue)
tabledata$net_investment <- as.numeric(tabledata$net_investment)
tabledata$trade <- as.numeric(tabledata$trade)
# Creating and printing the summary table
summary_table <- descr(tabledata, stats = c("mean", "sd", "min", "max", "Q1", "Q3"))
print(summary_table)
Descriptive Statistics  
tabledata  
N: 9941  

                Freedom of Research/Teach   GDP Growth   GDP per capita   Infanty morality rate
------------- --------------------------- ------------ ---------------- -----------------------
         Mean                        0.48         0.02         10676.77                   58.30
      Std.Dev                        1.55         0.06         13250.78                   49.54
          Min                       -3.48        -0.69             0.00                    1.50
          Max                        3.31         0.84        156299.00                  277.00
           Q1                       -0.76         0.00          1972.38                   16.90
           Q3                        1.74         0.05         14060.74                   90.00

Table: Table continues below

 

                Inflation   Natural resource produc per capita   net_investment
------------- ----------- ------------------------------------ ----------------
         Mean       45.05                               772.33             3.11
      Std.Dev      553.92                              3868.63             3.95
          Min      -21.68                                 0.00            -7.98
          Max    24410.98                             81161.85            60.76
           Q1        2.76                                 0.00             1.17
           Q3       12.83                               177.99             3.60

Table: Table continues below

 

                Political stability   Population   Primary school enrollment   Rule of law
------------- --------------------- ------------ --------------------------- -------------
         Mean                 -0.17     27335.58                       80.68         -0.14
      Std.Dev                  0.98    101357.13                       22.03          1.00
          Min                 -3.32        41.66                        4.28         -2.61
          Max                  1.76   1262645.00                      100.00          2.10
           Q1                 -0.79      1963.41                       68.95         -0.87
           Q3                  0.60     16278.40                       97.51          0.52

Table: Table continues below

 

                Secondary school enrollment   tax_revenue    trade   v2x_delibdem   v2x_egaldem
------------- ----------------------------- ------------- -------- -------------- -------------
         Mean                         46.14         16.93    74.73           0.32          0.33
      Std.Dev                         29.89          7.89    51.25           0.27          0.25
          Min                          0.07          0.00     0.02           0.00          0.01
          Max                        100.00        147.66   442.62           0.89          0.88
           Q1                         19.01         11.68    42.11           0.08          0.13
           Q3                         73.12         21.64    93.19           0.56          0.50

Table: Table continues below

 

                v2x_libdem   v2x_partipdem   v2x_polyarchy
------------- ------------ --------------- ---------------
         Mean         0.33            0.26            0.42
      Std.Dev         0.27            0.21            0.29
          Min         0.00            0.01            0.01
          Max         0.89            0.80            0.92
           Q1         0.09            0.08            0.17
           Q3         0.56            0.43            0.69

2.2. Methods

The original paper of ‘Does Democracy cause Growth’, conducted an initial linear panel model, with autoregressive dynamics, therefore the model has been using past values in its variables to predict and in a sense, fill in the blanks of N/As and missing data within observations. Such a model portrayed through Figure 1, page 3 of the paper, maps the relationship between the singular democracy dummy variable, with fixed effects, against GDP per capita, taking into account and controlling for both economic, and country effects.

Allowing to isolate the the significance of democracy, without allowing other factors or channels to contribute to it’s significance. The authors chose to display this information, through visualisation of line plots, and most extensively providing coefficient tables as the main path of conveying their models and interpretations. My replication has followed this same methodology of conveying results, creating the same model with the alternate data sources referenced earlier from the V-DEM datafiles, and World Bank. The paper provides a rough list of the variables controlled for, and we have found similar variables, for following their model specification.

I have decided to include some additional testing such as a correlation matrix, due to the nature of the models, when building upon them, with additional covariates. The original study did not do this, as it did not look to split the key x independent variable into seperate parts to analyse individually and therefore democracy in the original study cannot overlap in affect.

3. Results

# Prepping the panel data
paneldata <- pdata.frame(condensed_data, index = c("country_name.x", "year"))
# Creating our first GDP model
gdpmodel1 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem  + v2x_egaldem, data = paneldata, model = "random")
# Creating our 2nd GDP model
gdpmodel2 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem 
                 + v2x_egaldem + e_mipopula + e_peinfmor + v2pesecsch
                 + v2peprisch + v2cafres + e_wbgi_rle + e_wbgi_pve + e_total_fuel_income_pc
                 + e_miinflat, data = paneldata, model = "random")
# Creating a table to show our summary of both models side by side

tab_model(gdpmodel2,gdpmodel1,pred.labels = c("Intercept", "Polyarchy", "Libdem","Partip","Delibdem","Egaldem","Population",
                                              "Infanty morality rate","Secondary school enrollment", "Primary school enrollment",
                                              "Freedom of Research/Teach","Rule of law","Political Stability",
                                              "Natural resource produc per capita","Inflation"),dv.labels = c("GDP Model 2 with controls","GDP Model 1"),
          string.est = "Coefficient",
          string.ci = "Conf.Int (95%)",
          string.p = "P-Value")
  GDP Model 2 with controls GDP Model 1
Predictors Coefficient Conf.Int (95%) P-Value Coefficient Conf.Int (95%) P-Value
Intercept 5547.40 -641.45 – 11736.25 0.079 3511.37 2191.60 – 4831.13 <0.001
Polyarchy -18507.41 -30798.99 – -6215.83 0.003 -21058.55 -25691.37 – -16425.73 <0.001
Libdem -2336.46 -19309.27 – 14636.36 0.787 -12281.77 -18562.36 – -6001.17 <0.001
Partip 19031.34 3755.72 – 34306.96 0.015 10450.91 4567.26 – 16334.56 0.001
Delibdem 5334.71 -6346.88 – 17016.31 0.369 5623.08 674.51 – 10571.66 0.026
Egaldem 15222.36 49.87 – 30394.85 0.049 46741.77 41373.16 – 52110.38 <0.001
Population -0.00 -0.01 – 0.00 0.555
Infanty morality rate -28.52 -72.73 – 15.68 0.205
Secondary school enrollment 73.43 29.62 – 117.24 0.001
Primary school enrollment -15.71 -64.48 – 33.07 0.527
Freedom of Research/Teach -450.55 -1329.18 – 428.07 0.314
Rule of law 4011.28 2396.35 – 5626.20 <0.001
Political Stability 100.32 -821.27 – 1021.92 0.830
Natural resource produc per capita 1.00 0.60 – 1.39 <0.001
Inflation -1.12 -8.19 – 5.95 0.756
Observations 283 8806
R2 / R2 adjusted 0.620 / 0.600 0.117 / 0.117

The original study (Acemoglu et al., 2014), posits that democracy has a positive impact on GDP per capita, through our replication, where we split up democracy into 5 key factors of democracy, in the initial GDP model 1 without controls, all of our independent x variables of democracy are considered significant each with a p-value less than 0.05. The majority except for polyarchy and libdem, having a major positive impact on GDP per capita, conveyed through their coefficients displayed above. However, this is in in contrast to the ‘GDP Model 2 with controls’, where with the introduction of the similar control variables used in the original study, a much wider fit of the model has been explained through the 0.620 adjusted R-squared compared to the 0.117 of GDP Model 1. However, we also find that many of the initial democracy indicators aren’t significant at all. Our controls detract from their explanatory power, as more of the noise in the model that would have simply been contributed to the indicators, are explained by the control variables, such as Natural resources, rate of secondary school enrolment and the degree of rule of law in a country are significant covariate controls with a p-value below 0.05. This is also conveyed by their coefficient which portrays the magnitude of the variables, as we can see Partip and Egaldem have a large positive effect on GDP per capita, whilst the rest do not, and Polyarchy which is significant in a negative effect on growth. This divide of negative and positive may support (Acemoglu et al., 2014)’s theory on the overall perceived negative effect argued in (Barro, 1996) may be due to the measurement error, of democracy introducing bias.

cor_matrix <- cor(summarised_stats1)
print(cor_matrix)
                     year mean_GDP sd_GDP mean_polyarchy sd_polyarchy
year            1.0000000       NA     NA      0.9465476   -0.1590039
mean_GDP               NA        1     NA             NA           NA
sd_GDP                 NA       NA      1             NA           NA
mean_polyarchy  0.9465476       NA     NA      1.0000000   -0.2645956
sd_polyarchy   -0.1590039       NA     NA     -0.2645956    1.0000000
mean_libdem     0.9456670       NA     NA      0.9997558   -0.2496638
sd_libdem       0.5890581       NA     NA      0.4835250    0.6866777
mean_partip     0.9568560       NA     NA      0.9988278   -0.2365987
sd_partip       0.5636391       NA     NA      0.5082732    0.6856397
mean_delibdem   0.9441315       NA     NA      0.9983368   -0.2238458
sd_delibdem     0.4358199       NA     NA      0.3196771    0.8101748
mean_egaldem    0.9605432       NA     NA      0.9915081   -0.1488847
sd_egaldem      0.6540827       NA     NA      0.5656349    0.6236122
               mean_libdem sd_libdem mean_partip sd_partip mean_delibdem
year             0.9456670 0.5890581   0.9568560 0.5636391     0.9441315
mean_GDP                NA        NA          NA        NA            NA
sd_GDP                  NA        NA          NA        NA            NA
mean_polyarchy   0.9997558 0.4835250   0.9988278 0.5082732     0.9983368
sd_polyarchy    -0.2496638 0.6866777  -0.2365987 0.6856397    -0.2238458
mean_libdem      1.0000000 0.4953030   0.9988519 0.5214927     0.9989628
sd_libdem        0.4953030 1.0000000   0.5146005 0.9776622     0.5183852
mean_partip      0.9988519 0.5146005   1.0000000 0.5337261     0.9986340
sd_partip        0.5214927 0.9776622   0.5337261 1.0000000     0.5452453
mean_delibdem    0.9989628 0.5183852   0.9986340 0.5452453     1.0000000
sd_delibdem      0.3330110 0.9768306   0.3510800 0.9644126     0.3571519
mean_egaldem     0.9928429 0.5902876   0.9955469 0.6059740     0.9952056
sd_egaldem       0.5770666 0.9902062   0.5934413 0.9785067     0.5986428
               sd_delibdem mean_egaldem sd_egaldem
year             0.4358199    0.9605432  0.6540827
mean_GDP                NA           NA         NA
sd_GDP                  NA           NA         NA
mean_polyarchy   0.3196771    0.9915081  0.5656349
sd_polyarchy     0.8101748   -0.1488847  0.6236122
mean_libdem      0.3330110    0.9928429  0.5770666
sd_libdem        0.9768306    0.5902876  0.9902062
mean_partip      0.3510800    0.9955469  0.5934413
sd_partip        0.9644126    0.6059740  0.9785067
mean_delibdem    0.3571519    0.9952056  0.5986428
sd_delibdem      1.0000000    0.4338498  0.9554695
mean_egaldem     0.4338498    1.0000000  0.6639576
sd_egaldem       0.9554695    0.6639576  1.0000000

We explore this, further by conducting a correlation matrix, whereby viewing the results, a large majority of the democracy indicators have unsurprisingly 1 or near correlation coefficients, which indicate extremely high multicollinearity between the factors of democracy.

4. Conclusions

In conclusion, it can be significantly argued that no one factor of democracy is outstandingly significant in increasing growth, through GDP per capita. As their significance seems to be highly intertwined which would confirm the possible outcome of my hypothesis that, the effects of these indices are cumulative and work as one to create a conclusive effect on growth. Therefore, the paper is in its right to use a simple code of democratic or not, as the larger effects on growth only occur when most of the factors of democracy are present to a certain degree. We can also argue that, as shown by the significance of our key indicators being reduced when the covariate channels which democracy tends to increase GDP through were added, we can convey how most of our factor’s influence on growth, stems through and requires these channels, therefore not democracy alone. Rather requiring additional channels to be highly significant for the full influence of democracy to be felt. As argued by (Tavares and Wacziarg, 2001).

Our results are similar to that of the original paper, as our model follows the similar timeframe, and relatively similar variables, with a good few crossing over from the original. With roughly the same sample size of countries in the study, it helps reduce measurement error on that front. Conclusively this replication seems to back up with further evidence the claims made in the original study ‘Does Democracy cause Growth’ (Acemoglu et al., 2014)

References

Reference list

Acemoglu, D., Naidu, S., Restrepo, P. and Robinson, J.A. (2014). Democracy Does Cause Growth. SSRN Electronic Journal, 127(1). doi:https://doi.org/10.2139/ssrn.2411791.

Acemoglu, D., Naidu, S., Restrepo, P. and Robinson, J.A. (2019). Democracy Does Cause Growth. Journal of Political Economy, [online] 127(1). doi:https://doi.org/10.1086/700936.

Barro, R.J. (1996). Democracy and growth. Journal of Economic Growth, 1(1), pp.1–27. doi:https://doi.org/10.1007/bf00163340.

Boix, C., Miller, M. and Rosato, S. (2012). A Complete Data Set of Political Regimes, 1800–2007. Comparative Political Studies, 46(12), pp.1523–1554. doi:https://doi.org/10.1177/0010414012463905.

Center for Systemic Peace (2022). INSCR Data Page. [online] www.systemicpeace.org. Available at: https://www.systemicpeace.org/inscrdata.html.

Cheibub, J.A., Gandhi, J. and Vreeland, J.R. (2009). Democracy and dictatorship revisited. Public Choice, 143(1-2), pp.67–101. doi:https://doi.org/10.1007/s11127-009-9491-2.

Freedom House (2020). Freedom in the World. [online] freedomhouse.org. Available at: https://freedomhouse.org/report/freedom-world.

GovData360. (n.d.). GovData360: Revised Combined Polity Score. [online] Available at: https://govdata360.worldbank.org/indicators/h6906d31b?country=BRA&indicator=27470&viz=line_chart&years=1800 [Accessed 5 Apr. 2023].

Minier, J.A. (1998). Democracy and Growth: Alternative Approaches. Journal of Economic Growth, 3(3), pp.241–266. doi:https://doi.org/10.1023/a:1009714821770.

Tavares, J. and Wacziarg, R. (2001). How democracy affects growth. European Economic Review, 45(8), pp.1341–1378. doi:https://doi.org/10.1016/s0014-2921(00)00093-3.

V-dem.net. (2023). Home | V-Dem. [online] Available at: (https://doi.org/10.23696/vdemds23, 2023).

World Bank (2023). World Bank Open Data | Data. [online] Worldbank.org. Available at: https://databank.worldbank.org/source/world-development-indicators.

Freese, J., & Peterson, D. (2017). Replication in social science. Annual Review of Sociology, 43, 147-165, doi: 10.1146.

Appendix

Appendix 1. My environment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: aarch64-apple-darwin20 (64-bit)
Running under: macOS Monterey 12.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/London
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] knitr_1.42     rmarkdown_2.21

loaded via a namespace (and not attached):
 [1] digest_0.6.31    R6_2.5.1         codetools_0.2-19 fastmap_1.1.1   
 [5] xfun_0.39        cachem_1.0.8     htmltools_0.5.5  cli_3.6.1       
 [9] sass_0.4.6       jquerylib_0.1.4  compiler_4.3.0   rstudioapi_0.14 
[13] tools_4.3.0      evaluate_0.21    bslib_0.4.2      yaml_2.3.7      
[17] rlang_1.1.1      jsonlite_1.8.4  

Appendix 2. Entire R code used in the project

# Opening key libraries first
library(rmarkdown)
library(knitr)
library(readr)
library(dplyr)
library(ggplot2)
library(summarytools)
library(plm)
library(sjPlot)

### NEED TO INSTALL xQuartz from their website... https://www.xquartz.org
# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
# All used libraries
library("rmarkdown")
library("knitr")
library("readr")
library("dplyr")
library("ggplot2")
library("summarytools")
library("plm")
library("sjPlot")
# Versions of used packages
packages <- c("rmarkdown", "knitr")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]

V_DEM_Full <- readRDS("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/V-Dem-CY-Full+Others-v11.1.rds")

WB_data_variables <- read_csv("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/WB_data_variables.csv")


WB_data_variables <- WB_data_variables %>%
  rename('country_name' = `Country Name`)

WB_data_variables <- WB_data_variables %>%
  rename('year' = `Time`)

WB_data_variables <- WB_data_variables %>%
  rename('country_text_id' = `Country Code`)

WB_data_variables <- WB_data_variables %>%
  rename('tax_revenue' = `Tax revenue (% of GDP) [GC.TAX.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename('net_investment' = `Net investment in nonfinancial assets (% of GDP) [GC.NFN.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename('trade' = `Trade (% of GDP) [NE.TRD.GNFS.ZS]`)

str(WB_data_variables)

datafile <- WB_data_variables

# Removing NAs
WB_data_variables <- datafile[!is.na(datafile$country_name), ]
WB_data_variables <- datafile[!is.na(datafile$year), ]

# Removing years below 1960
bottomthreshold <- 1960
V_DEM_Full <- V_DEM_Full[V_DEM_Full$year >= bottomthreshold, ]

# Filtering out countries that aren't in both datasets
countryID <- unique(V_DEM_Full$country_text_id)
Filtering <- WB_data_variables[WB_data_variables$country_text_id %in% countryID, ]

# Merging them together
indicator_dataset <- inner_join(V_DEM_Full, Filtering, by = c("year", "country_text_id"))


condensed_data <- subset(indicator_dataset, select = c(country_name.x, country_text_id, country_id,
                                                       year, historical_date, histname,codingstart,
                                                       codingend,v2x_polyarchy, v2x_libdem, v2x_partipdem,
                                                       v2x_delibdem,v2x_egaldem,e_migdppc,tax_revenue,
                                                       net_investment, trade,e_cow_imports,
                                                       e_cow_exports,e_total_fuel_income_pc,e_miinflat,v2peprisch,
                                                       v2pesecsch,e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,
                                                       v2cafres,e_fh_rol,e_civil_war))



# Creating a dataset of averages and standard deviatioms for our key variables
summarised_stats1 <- condensed_data %>%
  group_by(year) %>%
  summarize(mean_GDP = mean(e_migdppc, na.rm = TRUE),
            sd_GDP = sd(e_migdppc, na.rm = TRUE),
            mean_polyarchy = mean(v2x_polyarchy, na.rm = TRUE),
            sd_polyarchy = sd(v2x_polyarchy, na.rm = TRUE),
            mean_libdem = mean(v2x_libdem, na.rm = TRUE),
            sd_libdem = sd(v2x_libdem, na.rm = TRUE),
            mean_partip = mean(v2x_partipdem, na.rm = TRUE),
            sd_partip = sd(v2x_partipdem, na.rm = TRUE),
            mean_delibdem = mean(v2x_delibdem, na.rm = TRUE),
            sd_delibdem = sd(v2x_delibdem, na.rm = TRUE),
            mean_egaldem = mean(v2x_egaldem, na.rm = TRUE),
            sd_egaldem = sd(v2x_egaldem, na.rm = TRUE))


# A summary plot of average GDP, and average indicators on a time series
ggplot(summarised_stats1, aes(x = year, y = mean_GDP,)) +
  geom_point() +
  geom_smooth(aes(ymin = mean_GDP - sd_GDP, ymax = mean_GDP + sd_GDP), fill = "lightblue", alpha = 0.2) +
  theme_minimal() +
  scale_y_continuous(sec.axis = sec_axis(~ . / 20000, name = "Level of Democracy Indicators")) +
  geom_smooth(data = summarised_stats1, aes(y = mean_polyarchy * 20000), color = "red", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_libdem * 20000), color = "green", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_partip * 20000), color = "yellow", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_delibdem * 20000), color = "purple", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_egaldem * 20000), color = "orange", size = 1) +
  labs(title = "Figure 1. Average trend of GDP and democracy indicators over time " , x = "Years 1960 to 2020", y = "Mean GDP")



# Variables for our summary table
tabledata <- subset(condensed_data, select = c(e_migdppc,v2x_polyarchy,v2x_libdem,v2x_partipdem, v2x_delibdem,v2x_egaldem,tax_revenue,net_investment, trade,e_total_fuel_income_pc,e_miinflat,v2peprisch,v2pesecsch, e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,v2cafres))


# Renaming variables in our tabledata, so they can be labelled more clearly and therefore presentable

tabledata <- tabledata %>%
  rename(
    "Secondary school enrollment" = v2pesecsch,
    "Primary school enrollment" = v2peprisch,
    "Freedom of Research/Teach" = v2cafres,
    "Rule of law" = e_wbgi_rle,
    "Political stability" = e_wbgi_pve,
    "Natural resource produc per capita" = e_total_fuel_income_pc,
    "Infanty morality rate" = e_peinfmor,
    "Population" = e_mipopula,
    "Inflation" = e_miinflat,
    "GDP per capita" = e_migdppc,
    "GDP Growth" = e_migdpgrolns)

# Converting to numerical
tabledata$tax_revenue <- as.numeric(tabledata$tax_revenue)
tabledata$net_investment <- as.numeric(tabledata$net_investment)
tabledata$trade <- as.numeric(tabledata$trade)

# Creating and printing the summary table
summary_table <- descr(tabledata, stats = c("mean", "sd", "min", "max", "Q1", "Q3"))
print(summary_table)

# Prepping the panel data
paneldata <- pdata.frame(condensed_data, index = c("country_name.x", "year"))
# Creating our first GDP model
gdpmodel1 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem  + v2x_egaldem, data = paneldata, model = "random")

# Creating our 2nd GDP model
gdpmodel2 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem 
                 + v2x_egaldem + e_mipopula + e_peinfmor + v2pesecsch
                 + v2peprisch + v2cafres + e_wbgi_rle + e_wbgi_pve + e_total_fuel_income_pc
                 + e_miinflat, data = paneldata, model = "random")

# Creating a table to show our summary of both models side by side

tab_model(gdpmodel2,gdpmodel1,pred.labels = c("Intercept", "Polyarchy", "Libdem","Partip","Delibdem","Egaldem","Population",
                                              "Infanty morality rate","Secondary school enrollment", "Primary school enrollment",
                                              "Freedom of Research/Teach","Rule of law","Political Stability",
                                              "Natural resource produc per capita","Inflation"),dv.labels = c("GDP Model 2 with controls","GDP Model 1"),
          string.est = "Coefficient",
          string.ci = "Conf.Int (95%)",
          string.p = "P-Value")
cor_matrix <- cor(summarised_stats1)
print(cor_matrix)
# Detailed information about my environment
sessionInfo()
V_DEM_Full <- readRDS("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/V-Dem-CY-Full+Others-v11.1.rds")

WB_data_variables <- read_csv("/Users/nestor/REPLICATION2PROJ/SMI205_Preregistration_form-main/WB_data_variables.csv")

WB_data_variables <- WB_data_variables %>%
  rename(country_name = `Country Name`)

WB_data_variables <- WB_data_variables %>%
  rename(year = `Time`)

WB_data_variables <- WB_data_variables %>%
  rename(country_text_id = `Country Code`)

WB_data_variables <- WB_data_variables %>%
  rename(tax_revenue = `Tax revenue (% of GDP) [GC.TAX.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename(net_investment = `Net investment in nonfinancial assets (% of GDP) [GC.NFN.TOTL.GD.ZS]`)

WB_data_variables <- WB_data_variables %>%
  rename(trade = `Trade (% of GDP) [NE.TRD.GNFS.ZS]`)



str(WB_data_variables)

datafile <- WB_data_variables

WB_data_variables <- datafile[!is.na(datafile$country_name), ]
WB_data_variables <- datafile[!is.na(datafile$year), ]

bottomthreshold <- 1960
V_DEM_Full <- V_DEM_Full[V_DEM_Full$year >= bottomthreshold, ]

countryID <- unique(V_DEM_Full$country_text_id)
Filtering <- WB_data_variables[WB_data_variables$country_text_id %in% countryID, ]

indicator_dataset <- inner_join(V_DEM_Full, Filtering, by = c("year", "country_text_id"))

condensed_data <- subset(indicator_dataset, select = c(country_name.x, country_text_id, country_id,
                                                       year, historical_date, histname,codingstart,
                                                       codingend,v2x_polyarchy, v2x_libdem, v2x_partipdem,
                                                       v2x_delibdem,v2x_egaldem,e_migdppc,tax_revenue,
                                                       net_investment, trade,e_cow_imports,
                                                       e_cow_exports,e_total_fuel_income_pc,e_miinflat,v2peprisch,
                                                       v2pesecsch,e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,
                                                       v2cafres,e_fh_rol,e_civil_war))


summarised_stats1 <- condensed_data %>%
  group_by(year) %>%
  summarize(mean_GDP = mean(e_migdppc, na.rm = TRUE),
            sd_GDP = sd(e_migdppc, na.rm = TRUE),
            mean_polyarchy = mean(v2x_polyarchy, na.rm = TRUE),
            sd_polyarchy = sd(v2x_polyarchy, na.rm = TRUE),
            mean_libdem = mean(v2x_libdem, na.rm = TRUE),
            sd_libdem = sd(v2x_libdem, na.rm = TRUE),
            mean_partip = mean(v2x_partipdem, na.rm = TRUE),
            sd_partip = sd(v2x_partipdem, na.rm = TRUE),
            mean_delibdem = mean(v2x_delibdem, na.rm = TRUE),
            sd_delibdem = sd(v2x_delibdem, na.rm = TRUE),
            mean_egaldem = mean(v2x_egaldem, na.rm = TRUE),
            sd_egaldem = sd(v2x_egaldem, na.rm = TRUE))

ggplot(summarised_stats1, aes(x = year, y = mean_GDP,)) +
  geom_point() +
  geom_smooth(aes(ymin = mean_GDP - sd_GDP, ymax = mean_GDP + sd_GDP), fill = "lightblue", alpha = 0.2) +
  theme_minimal() +
  scale_y_continuous(sec.axis = sec_axis(~ . / 20000, name = "Level of Democracy Indicators")) +
  geom_smooth(data = summarised_stats1, aes(y = mean_polyarchy * 20000), color = "red", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_libdem * 20000), color = "green", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_partip * 20000), color = "yellow", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_delibdem * 20000), color = "purple", size = 1) +
  geom_smooth(data = summarised_stats1, aes(y = mean_egaldem * 20000), color = "orange", size = 1) +
  labs(title = "Average trend of GDP and democracy indicators over time " , x = "Years 1960 to 2020", y = "Mean GDP")



### NEED TO INSTALL xQuartz from their website... https://www.xquartz.org
# Otherwise the package below wont work

install.packages("summarytools")
library(summarytools)

tabledata <- subset(condensed_data, select = c(e_migdppc,v2x_polyarchy,v2x_libdem,v2x_partipdem,
                                               v2x_delibdem,v2x_egaldem,tax_revenue,net_investment,
                                               trade,e_total_fuel_income_pc,e_miinflat,v2peprisch,v2pesecsch,
                                               e_peinfmor,e_mipopula,e_wbgi_rle,e_wbgi_pve,e_migdpgrolns,
                                               v2cafres))

tabledata <- tabledata %>%
  rename(
    "Secondary school enrollment" = v2pesecsch,
    "Primary school enrollment" = v2peprisch,
    "Freedom of Research/Teach" = v2cafres,
    "Rule of law" = e_wbgi_rle,
    "Political stability" = e_wbgi_pve,
    "Natural resource produc per capita" = e_total_fuel_income_pc,
    "Infanty morality rate" = e_peinfmor,
    "Population" = e_mipopula,
    "Inflation" = e_miinflat,
    "GDP per capita" = e_migdppc,
    "GDP Growth" = e_migdpgrolns)


tabledata$tax_revenue <- as.numeric(tabledata$tax_revenue)
tabledata$net_investment <- as.numeric(tabledata$net_investment)
tabledata$trade <- as.numeric(tabledata$trade)


# Generate summary statistics table
summary_table <- descr(tabledata, stats = c("mean", "sd", "min", "max", "Q1", "Q3"))

# Print the summary statistics table
print(summary_table)

# Prepping the panel data
paneldata <- pdata.frame(condensed_data, index = c("country_name.x", "year"))



# Creating our first GDP model
gdpmodel1 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem  + v2x_egaldem, data = paneldata, model = "random")




# Creating our 2nd GDP model
gdpmodel2 <- plm(e_migdppc ~ v2x_polyarchy + v2x_libdem + v2x_partipdem + v2x_delibdem 
                 + v2x_egaldem + e_mipopula + e_peinfmor + v2pesecsch
                 + v2peprisch + v2cafres + e_wbgi_rle + e_wbgi_pve + e_total_fuel_income_pc
                 + e_miinflat, data = paneldata, model = "random")




# Creating a table to show our summary of both models side by side

tab_model(gdpmodel2,gdpmodel1,pred.labels = c("Intercept", "Polyarchy", "Libdem","Partip","Delibdem","Egaldem","Population",
                                              "Infanty morality rate","Secondary school enrollment", "Primary school enrollment",
                                              "Freedom of Research/Teach","Rule of law","Political Stability",
                                              "Natural resource produc per capita","Inflation"),dv.labels = c("GDP Model 2 with controls","GDP Model 1"),
          string.est = "Coefficient",
          string.ci = "Conf.Int (95%)",
          string.p = "P-Value")

cor_matrix <- cor(summarised_stats1)
print(cor_matrix)
LS0tCnRpdGxlOiAiU01JMjA1IFJlcGxpY2F0aW9uIFByb2plY3QgKDIwMjMpIgphdXRob3I6ICcyMDAzODE5NDEnCmRhdGU6ICIyMi8wNS8yMDIzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IG5vCiAgICAgIHNtb290aF9zY3JvbGw6IHllcwogIHdvcmRfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKLS0tCgpgYGB7ciBzdGFydCwgaW5jbHVkZT1GQUxTRX0KIyBPcGVuaW5nIGtleSBsaWJyYXJpZXMgZmlyc3QKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzdW1tYXJ5dG9vbHMpCmxpYnJhcnkocGxtKQpsaWJyYXJ5KHNqUGxvdCkKCiMjIyBORUVEIFRPIElOU1RBTEwgeFF1YXJ0eiBmcm9tIHRoZWlyIHdlYnNpdGUuLi4gaHR0cHM6Ly93d3cueHF1YXJ0ei5vcmcKYGBgCgojIFtDb21wb25lbnRzIG9mIERlbW9jcmFjeTogRG9lcyBEZW1vY3JhY3kgQ2F1c2UgR3Jvd3RoXQoKIyMjIFJwdWJzIGxpbms6IFtodHRwczovL3JwdWJzLmNvbS9TTUkyMDAzODE5NDEvMTA1MDc3MV0KCiMjIyBHaXRIdWIgUmVwb3NpdG9yeTogW2FkZCB1cmwgaGVyZSBpZiB5b3UgaGF2ZSBjcmVhdGVkIGEgZGF0YSBvciBjb2RlIHJlcG9zaXRvcnksIGlmIG5vdCBkZWxldGUgdGhpcyBsaW5lXQoKIyMjIFN0dWR5IFByZXJlZ2lzdHJhdGlvbiBmb3JtOiBbaHR0cHM6Ly9ycHVicy5jb20vU01JMjAwMzgxOTQxLzEwNTA3NjldCgojIyBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlcGxpY2F0aW9uIHByb2plY3QKCi0gICBSZXBsaWNhdGlvbiBwcm9qZWN0IGJhc2VkIG9uIHBhcGVyIFtBY2Vtb2dsdSwgRC4sIE5haWR1LCBTLiwgUmVzdHJlcG8sIFAuIGFuZCBSb2JpbnNvbiwgSi5BLiAoMjAxNCkuIERlbW9jcmFjeSBEb2VzIENhdXNlIEdyb3d0aC4gU1NSTiBFbGVjdHJvbmljIEpvdXJuYWwsIDEyNygxKS4gPGRvaTpodHRwczovL2RvaS5vcmcvMTAuMjEzOS9zc3JuLjI0MTE3OTE+LiA8aHR0cHM6Ly93d3cuam91cm5hbHMudWNoaWNhZ28uZWR1L2RvaS8xMC4xMDg2LzcwMDkzNiN0YjQ+XQotICAgUmVwbGljYXRpb24gbWV0aG9kIChzZWxlY3Qgb25lIGZyb20gYmVsb3cpOgogICAgLSAgIE93biByZXBsaWNhdGlvbiBmb2xsb3dpbmcgbWV0aG9kcyBzZWN0aW9uIG9mIHRoZSBwYXBlcgoKIyMgV29ya3NwYWNlIHNldHVwIHsudGFic2V0IC50YWJzZXQtcGlsbHN9CgojIyMgWUFNTCBzZXR0aW5ncwoKb3V0cHV0OiA8L2JyPiDCoCBodG1sX2RvY3VtZW50OiA8L2JyPiDCoMKgIGNvZGVfZG93bmxvYWQ6IHRydWUgPC9icj4gwqDCoMKgIHRvYzogdHJ1ZSA8L2JyPiDCoMKgwqAgdG9jX2RlcHRoOiAyIDwvYnI+IMKgwqDCoCB0b2NfZmxvYXQ6IDwvYnI+IMKgwqDCoMKgIGNvbGxhcHNlZDogZmFsc2UgPC9icj4gwqDCoMKgwqAgc21vb3RoX3Njcm9sbDogdHJ1ZSA8L2JyPgoKIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcwoKYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0KIyBHbG9iYWwgb3B0aW9ucwpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwKICAgICAgICAgICAgICAgY29tbWVudD1OQSwKICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwKICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkKYGBgCgojIyMgTGlicmFyaWVzCgpgYGB7ciBsaWJyYXJpZXMsIGluY2x1ZGU9VFJVRX0KIyBBbGwgdXNlZCBsaWJyYXJpZXMKbGlicmFyeSgicm1hcmtkb3duIikKbGlicmFyeSgia25pdHIiKQpsaWJyYXJ5KCJyZWFkciIpCmxpYnJhcnkoImRwbHlyIikKbGlicmFyeSgiZ2dwbG90MiIpCmxpYnJhcnkoInN1bW1hcnl0b29scyIpCmxpYnJhcnkoInBsbSIpCmxpYnJhcnkoInNqUGxvdCIpCmBgYAoKIyMjIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMKCmBgYHtyIHZlcnNpb25zLCBlY2hvPUZBTFNFfQojIFZlcnNpb25zIG9mIHVzZWQgcGFja2FnZXMKcGFja2FnZXMgPC0gYygicm1hcmtkb3duIiwgImtuaXRyIikKbmFtZXMocGFja2FnZXMpIDwtIHBhY2thZ2VzCmxhcHBseShwYWNrYWdlcywgcGFja2FnZVZlcnNpb24pCmBgYAoKIyMjIE15IGVudmlyb21lbnQKCmBgYHtyIG15UiwgZWNobz1GQUxTRX0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8KdmVyc2lvbltbJ3ZlcnNpb24uc3RyaW5nJ11dCmBgYAoKIyMgMS4gSW50cm9kdWN0aW9uCgoKVGhlIHBhcGVyIChBY2Vtb2dsdSBldCBhbC4sIDIwMTQpLCAnRG9lcyBEZW1vY3JhY3kgQ2F1c2UgR3Jvd3RoJywgaW5xdWlyZXMgdG8gdGhlIGdsb2JhbCBlZmZlY3RpdmVuZXNzIGFuZCBpbXBsaWNhdGlvbnMgb2YgRGVtb2NyYWN5IGluIGNhdXNpbmcgZWNvbm9taWMgZ3Jvd3RoLCBtZWFzdXJlZCB0aHJvdWdoIEdEUCBwZXIgY2FwaXRhLiBUaGUgcGFwZXIgdXNlcyBwYW5lbCBkYXRhIHRvIGNvbnN0cnVjdCBjcm9zcy1jb3VudHJ5IHJlZ3Jlc3Npb24gbW9kZWxzIGFuZCBncmFwaHMgd2hpY2ggcG9ydHJheSB0aGUgZWZmZWN0cyBvZiBkZW1vY3JhY3kgb3ZlciB0aW1lLCB3aXRoIHRoZSBvdmVyYXJjaGluZyBmaW5kaW5nIHRoYXQgY291bnRyaWVzIGV4cGVyaWVuY2UgYSAyMCUgaW5jcmVhc2UgaW4gZ3Jvd3RoLCAyNSB5ZWFycyBhZnRlciBhIGRlbW9jcmF0aWMgdHJhbnNpdGlvbi4gVGhlc2UgZmluZGluZ3MgYXJlIHNpZ25pZmljYW50IGFuZCBmb2xsb3cgYSBsb25nIHN0cmVhbSBvZiBlY29ub21pYyBsaXRlcmF0dXJlLCBzdWNoIGFzIChNaW5pZXIsIDE5OTgpIGFyZ3VpbmcgdGhhdCBpbmNyZWFzaW5nIGxldmVsIG9mIGRlbW9jcmFjeSByZXN1bHRzIGluIGluY3JlYXNpbmcgZ3Jvd3RoIHJhdGVzIGNvbXBhcmFibGUgdG8gZGVjcmVhc2luZyBkZW1vY3JhY3kgd2hpY2ggZmluZCByZWxhdGl2ZWx5IGxvd2VyIGdyb3d0aCwgdGhlcmVmb3JlIHJlaW5mb3JjaW5nIEFjZW1vZ2x1J3MgY2xhaW0uIEFmZmVjdGVkIGluIGNvbmp1bmN0aW9uIGJ5IGluY29tZSBhbmQgbGl0ZXJhY3kgbGV2ZWxzLiBJdCBkaWZmZXJzIGZyb20gb3VyIHJlcGxpY2F0aW9uIHBhcGVyLCB3aGljaCB1c2VzIHNpbXBsZSBjb2Rpbmcgb2YgZGVtb2NyYXRpYyBvciBub24tZGVtb2NyYXRpYyBmb3IgZWFjaCB5ZWFyIGRlcGVuZGVudCBvbiB0aGUgRnJlZWRvbSBIb3VzZSBkZW1vY3JhY3kgaW5kaWNlIHNjb3JlLiBNdWNoIG9mIHRoZSBsaXRlcmF0dXJlIGlzIHNlZ21lbnRlZCBpbnRvIGNhdGVnb3JpZXMsIGFuYWx5c2luZyBkZW1vY3JhY3kgYXMgYSBzb2xlIGVudGl0eSwgY29udHJvbGxpbmcgZm9yIGl0cyBlY29ub21pYywgZGVtb2dyYXBoaWMsIGFuZCBzb2NpYWwgYW5kIGN1bHR1cmFsIGFuZCBnZW9ncmFwaGljYWwgdmFyaWFibGVzLiBPciBhbmFseXNpbmcgdGhlIGVmZmVjdCBvZiB0aGVzZSBjaGFubmVscyBpbiByZWxhdGlvbiB0byBkZW1vY3JhY3ksIGFzIGVpdGhlciBob3cgdGhleSBhZmZlY3Qgb3IgYXJlIGFmZmVjdGVkIGJ5IGRlbW9jcmFjeSBhbmQgZXh0ZW5kaW5nIHRoaXMgdG8gR0RQLgoKVGF2YXJlcyAmIFdhdnppYXJnIGFyZ3VlIGRlbW9jcmFjeSBpbmNyZWFzZXMgZ3Jvd3RoIGJ5IHRocm91Z2ggaW5jcmVhc2luZyBodW1hbiBjYXBpdGFsIGFuZCBkZWNyZWFzaW5nIGluY29tZSBpbmVxdWFsaXR5LCB3aGlsc3QgaXQgY3V0cyBncm93dGggYnkgcmlzaW5nIGdvdmVybm1lbnQgY29uc3VtcHRpb24gYW5kIHNsb3dpbmcgZG93biBwaHlzaWNhbCBjYXBpdGFsIGFjcXVpcmVtZW50LiAoVGF2YXJlcyBhbmQgV2FjemlhcmcsIDIwMDEpIEhvd2V2ZXIgbGlrZSBlYXJsaWVyIGxpdGVyYXR1cmUsIHRoZXkgY29tZSB0byBhbiBvcHBvc2l0ZSBjb25zZW5zdXMgdG8gb3VyIHBhcGVyLCB0aGF0IG92ZXJhbGwsIHdoZW4gY29udHJvbGxpbmcgdGhlc2UgZmFjdG9ycywgZGVtb2NyYWN5IGhhcyBhIG5lZ2F0aXZlIGVmZmVjdCBvbiBncm93dGguIChCYXJybywgMTk5NikgT3VyIHNlbGVjdGVkIHBhcGVyIGJ1aWxkcyBvbiB0aGVzZSBwYXN0IGFydGljbGVzLCBhcmd1aW5nIHRoZXJlIGFyZSBiaWFzZXMgZHVlIHRvIHVuYWNjb3VudGVkIGZvciBjaGFyYWN0ZXJpc3RpY3MgYXQgdGhlIGNvdW50cnkgbGV2ZWwsIG5vdCBmaXhpbmcgY291bnRyeSBlZmZlY3RzLiAoQWNlbW9nbHUgZXQgYWwuLCAyMDE0KSBDb25jbHVzaXZlbHkgaXQgZG9lcyBhIGdyZWF0IGpvYiBhdCBib3RoIGNvbnRyb2xsaW5nIHBvdGVudGlhbCBiaWFzZXMsIGJvdGggb24gdGhlIHNuYXBzaG90IGJhc2ljIGxldmVsLCBidXQgYWxzbyBjb25zaWRlcmluZyBncmFkdWFsIGxhZ3MgYW5kIHRpbWUgZWZmZWN0cyB3aGljaCB3b3VsZCBoYXZlIGFuIGltcGFjdCBvbiBHRFAgdGhyb3VnaCBhbnRpY2lwYXRpb24uCgpBIHNpZ25pZmljYW50IGdhcCBpbiB0aGUgbGl0ZXJhdHVyZSBpcyBwb3NlZCBieSB0aGUgZmFjdCB0aGF0IGRlbW9jcmFjeSBpcyBzaW1wbGlmaWVkLCBtb3N0IG9mIHRoZSBsaXRlcmF0dXJlIHVzZXMgYSBkdW1teSBkZW1vY3JhdGljIHZhcmlhYmxlIG9yIGEgY29udGludW91cyBzY2FsZSB2YXJpYWJsZSwgdGhlIHBhcGVyIHRyaWVzIHRvIHJlc29sdmUgdGhlIHBvc3NpYmxlIG1lYXN1cmVtZW50IGVycm9yIHRoaXMgcG9zZXMsIHRocm91Z2ggY29tYmluaW5nIGluZGljZXMsIGl0IG9ubHkgYWNrbm93bGVkZ2VzIHRoZSBvY2N1cnJlbmNlIG9mIGRlbW9jcmFjeSBvbmNlIGl0IGhhcyByZWFjaGVkIGEgc2lnbmlmaWNhbnQgbGV2ZWwsIGV2ZW4gdGhvdWdoIGRlbW9jcmFjeSBpcyBwcmVzZW50IGluIGEgY29tcGxleGl0eSBvZiB3YXlzLiBBbGxvd2luZyBwcmV2YWxlbnQgZmFjdG9ycyBvciBhc3BlY3RzIG9mIGRlbW9jcmFjeSB0byBiZSB0aHJpdmluZyBiZWZvcmUgYSBtYWpvciB0cmFuc2l0aW9uIGhhcyByZWNvcmRlZC4KCkZyZWVzZSBhbmQgUGV0ZXJzb24ncyAoMjAxNyksIHRhYmxlIG9mIHJlcGxpY2F0aW9uLCBjbGFzc2VzIHRoaXMgYXMgYSByZXBlYXRhYmlsaXR5IHJlcGxpY2F0aW9uLCBieSBjb25kdWN0aW5nIHRoZSBzYW1lIG1haW4gbWV0aG9kcyBhbmQgbW9kZWwsIGZvciBzZXBhcmF0ZSBkZW1vY3JhY3kgZmFjdG9ycyB3aXRoIG91ciBvd24gYWRkaXRpb25hbCBleHBsb3JhdG9yeSBhbmFseXNlcywgYWxsIHdpdGggYSBkaWZmZXJlbnQgZGF0YSBzZXQsIHRoZXJlZm9yZSBub3Qgb25seSBjcml0aXF1aW5nIHNpZ25pZmljYW5jZSwgYW5kIG1hZ25pdHVkZSBpbmRpdmlkdWFsbHkgb3ZlciB0aW1lLCBidXQgYWxzbyB3aGV0aGVyIHRoZSB3aWRlciBjdW11bGF0aXZlIGVmZmVjdCBmaXRzIHdpdGggdGhlIHJlc3VsdHMgb2YgKEFjZW1vZ2x1IGV0IGFsLiwgMjAxNCkgQW5hbHlzaW5nIGZhY3RvcnMgb2YgZGVtb2NyYWN5IGFnYWluc3QgR0RQIHdpdGggdGhlIHNhbWUgY29udHJvbHMsIHRvIGZ1cnRoZXIgdGhlIHRvcGljIGZpZWxkLgoKVGhlIGV4dGVuc2lvbiBtYXkgeWllbGQgYW4gdW5iYWxhbmNlZCByZXN1bHQgb2Ygc2lnbmlmaWNhbmNlLCB3aXRoIGluZGljZXMgYmVpbmcgaGlnaGx5IHNpZ25pZmljYW50LCB3aGlsc3Qgb3RoZXJzIGFyZSBub3QuIEhvd2V2ZXIsIHRoaXMgbXVzdCBiZSB0ZXN0ZWQgZnVydGhlciwgYXMgc3Bva2VuIHByZXZpb3VzbHkgZWFjaCBpbmRpY2UgY2FuIGNvbnRyaWJ1dGUgdG8gYSBjdW11bGF0aXZlIGVmZmVjdCBhbmQgbWF5IGhhdmUgZWZmZWN0cyBvbiBvdGhlciBjaGFubmVscyB0aGF0IHJlc3VsdCBpbiBsYWdnZWQgR0RQIGdyb3d0aCwgc3VjaCB1bm9ic2VydmVkIHNpZ25pZmljYW5jZSBhbmQgZWZmZWN0cyB3aWxsIHJlcXVpcmUgcmVhbmFseXNpcyBhbmQgZXh0ZW5zaXZlIGV4cGxvcmF0b3J5IHRlc3RpbmcgdG8gZW5zdXJlIGl0IGlzIGFjY291bnRlZCBmb3IgaW5zdGVhZCBvZiBiZWluZyBzaW1wbHkgd3JpdHRlbiBvZmYuCgojIyAyLiBEYXRhIGFuZCBtZXRob2RzCgojIyMgMi4xLiBEYXRhCgpUaGUgb3JpZ2luYWwgc3R1ZHkgdXNlZCBwYW5lbCBkYXRhLCBjb21wcmlzZWQgYnkgY29tYmluaW5nIGRhdGEgZnJvbSBtdWx0aXBsZSBkYXRhc2V0cywgZXhwbG9yZWQsIGFuZCBqdXN0aWZpZWQgYnkgcmVmZXJyaW5nIHRvIGVhcmxpZXIgc3R1ZGllcy4gVGhlIGNvbWJpbmVkIGRhdGFmaWxlLCBuYW1lZCAnRERDR2RhdGFfZmluYWwuZHRhJywgaXMgb3Blbmx5IGF2YWlsYWJsZSBpbiB0aGUgc3VwcGxlbWVudGFyeSBtYXRlcmlhbHMgb2YgdGhlIHBhcGVyLCAoQWNlbW9nbHUgZXQgYWwuLCAyMDE5KSBjb250YWluaW5nIDE3NSBjb3VudHJpZXMsIHNwYW5uaW5nIGZyb20gMTk2MC0yMDEwLCB3aXRoIGFuIG9ic2VydmF0aW9uIGZvciBlYWNoIGNvdW50cnkgaW4gZWFjaCB5ZWFyIHRvdGFsbGluZyA5Mzg0LCB3aXRoIDExMTcgdmFyaWFibGVzLiBUaGUgbWFpbiBkdW1teSB2YXJpYWJsZSBpcyBjb2RlZCB0byBtYWtlIGEgZGljaG90b21vdXMgc2NhbGUgb2YgZWl0aGVyIGRlbW9jcmF0aWMgb3Igbm90LCBkZXBlbmRlbnQgb24gMyByZWxpYWJsZSBpbmRleGVzLCAoRnJlZWRvbSBIb3VzZSwgMjAyMCksIFBvbGl0eSBJViAoQ2VudGVyIGZvciBTeXN0ZW1pYyBQZWFjZSwgMjAyMikgYW5kIHNlY29uZGFyeSBpbmRleGVzIG9mIGRlbW9jcmFjeSBmcm9tIENHViAoQ2hlaWJ1YiwgR2FuZGhpIGFuZCBWcmVlbGFuZCwgMjAwOSkgYW5kIEJNUiAoQm9peCwgTWlsbGVyIGFuZCBSb3NhdG8sIDIwMTIpLiBGaWd1cmUgMSBwZXJmb3JtcyBhIHJlZ3Jlc3Npb24gYWdhaW5zdCBHRFAgcGVyIGNhcGl0YSwgY29udHJvbGxpbmcgZm9yIGFuIGFycmF5IG9mIHggdmFyaWFibGVzLCBzdWNoIGFzIGludmVzdG1lbnQsIHRyYWRlLCBzZWNvbmRhcnkgJiBwcmltYXJ5IHNjaG9vbCBlbnJvbG1lbnQsIGluZmFudCBtb3J0YWxpdHksIGFuZCBmaW5hbmNpYWwgZmxvd3MuCgpNeSBkYXRhIGZvciByZXBsaWNhdGlvbiBpcyB0aGUgbGFyZ2Utc2NhbGUgVi1ERU0ncyAoVi1kZW0ubmV0LCAyMDIzKSBwcm9qZWN0IGRhdGEgY29sbGF0ZWQgZnJvbSAxOTYwLTIwMjAsIHdpdGggc2VsZWN0IHZhcmlhYmxlcyByZWxhdGluZyB0byB0aGUgb3JpZ2luYWwgc3R1ZHkncyB2YXJpYWJsZXMgZnJvbSB0aGUgV29ybGQgQmFuaydzIGRldmVsb3BtZW50IGluZGljYXRvcnMgKFdvcmxkIEJhbmssIDIwMjMpIHRvIG1lcmdlIHdpdGggdGhlIGRhdGFmaWxlLCB0byBjb25kdWN0IHRoZSBzYW1lIG1ldGhvZHMgcHJlc2VudGVkIGluIHRoZSBvcmlnaW5hbC4KCgoKKipMb2FkaW5nIERhdGFzZXRzOioqCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30KClZfREVNX0Z1bGwgPC0gcmVhZFJEUygiL1VzZXJzL25lc3Rvci9SRVBMSUNBVElPTjJQUk9KL1NNSTIwNV9QcmVyZWdpc3RyYXRpb25fZm9ybS1tYWluL1YtRGVtLUNZLUZ1bGwrT3RoZXJzLXYxMS4xLnJkcyIpCgpXQl9kYXRhX3ZhcmlhYmxlcyA8LSByZWFkX2NzdigiL1VzZXJzL25lc3Rvci9SRVBMSUNBVElPTjJQUk9KL1NNSTIwNV9QcmVyZWdpc3RyYXRpb25fZm9ybS1tYWluL1dCX2RhdGFfdmFyaWFibGVzLmNzdiIpCgpgYGAKCioqUmVjb2RpbmcgdmFyaWFibGVzOioqCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30KCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZSgnY291bnRyeV9uYW1lJyA9IGBDb3VudHJ5IE5hbWVgKQoKV0JfZGF0YV92YXJpYWJsZXMgPC0gV0JfZGF0YV92YXJpYWJsZXMgJT4lCiAgcmVuYW1lKCd5ZWFyJyA9IGBUaW1lYCkKCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZSgnY291bnRyeV90ZXh0X2lkJyA9IGBDb3VudHJ5IENvZGVgKQoKV0JfZGF0YV92YXJpYWJsZXMgPC0gV0JfZGF0YV92YXJpYWJsZXMgJT4lCiAgcmVuYW1lKCd0YXhfcmV2ZW51ZScgPSBgVGF4IHJldmVudWUgKCUgb2YgR0RQKSBbR0MuVEFYLlRPVEwuR0QuWlNdYCkKCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZSgnbmV0X2ludmVzdG1lbnQnID0gYE5ldCBpbnZlc3RtZW50IGluIG5vbmZpbmFuY2lhbCBhc3NldHMgKCUgb2YgR0RQKSBbR0MuTkZOLlRPVEwuR0QuWlNdYCkKCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZSgndHJhZGUnID0gYFRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXWApCmBgYAoKKipQcmVwYXJpbmcgYW5kIG1lcmdpbmcgdGhlIGRhdGE6KioKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQoKc3RyKFdCX2RhdGFfdmFyaWFibGVzKQoKZGF0YWZpbGUgPC0gV0JfZGF0YV92YXJpYWJsZXMKCiMgUmVtb3ZpbmcgTkFzCldCX2RhdGFfdmFyaWFibGVzIDwtIGRhdGFmaWxlWyFpcy5uYShkYXRhZmlsZSRjb3VudHJ5X25hbWUpLCBdCldCX2RhdGFfdmFyaWFibGVzIDwtIGRhdGFmaWxlWyFpcy5uYShkYXRhZmlsZSR5ZWFyKSwgXQoKIyBSZW1vdmluZyB5ZWFycyBiZWxvdyAxOTYwCmJvdHRvbXRocmVzaG9sZCA8LSAxOTYwClZfREVNX0Z1bGwgPC0gVl9ERU1fRnVsbFtWX0RFTV9GdWxsJHllYXIgPj0gYm90dG9tdGhyZXNob2xkLCBdCgojIEZpbHRlcmluZyBvdXQgY291bnRyaWVzIHRoYXQgYXJlbid0IGluIGJvdGggZGF0YXNldHMKY291bnRyeUlEIDwtIHVuaXF1ZShWX0RFTV9GdWxsJGNvdW50cnlfdGV4dF9pZCkKRmlsdGVyaW5nIDwtIFdCX2RhdGFfdmFyaWFibGVzW1dCX2RhdGFfdmFyaWFibGVzJGNvdW50cnlfdGV4dF9pZCAlaW4lIGNvdW50cnlJRCwgXQoKIyBNZXJnaW5nIHRoZW0gdG9nZXRoZXIKaW5kaWNhdG9yX2RhdGFzZXQgPC0gaW5uZXJfam9pbihWX0RFTV9GdWxsLCBGaWx0ZXJpbmcsIGJ5ID0gYygieWVhciIsICJjb3VudHJ5X3RleHRfaWQiKSkKCmBgYAoKKipTdWJzZXR0aW5nIHRoZSBkYXRhOioqCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30KCmNvbmRlbnNlZF9kYXRhIDwtIHN1YnNldChpbmRpY2F0b3JfZGF0YXNldCwgc2VsZWN0ID0gYyhjb3VudHJ5X25hbWUueCwgY291bnRyeV90ZXh0X2lkLCBjb3VudHJ5X2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVhciwgaGlzdG9yaWNhbF9kYXRlLCBoaXN0bmFtZSxjb2RpbmdzdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZ2VuZCx2MnhfcG9seWFyY2h5LCB2MnhfbGliZGVtLCB2MnhfcGFydGlwZGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJ4X2RlbGliZGVtLHYyeF9lZ2FsZGVtLGVfbWlnZHBwYyx0YXhfcmV2ZW51ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldF9pbnZlc3RtZW50LCB0cmFkZSxlX2Nvd19pbXBvcnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV9jb3dfZXhwb3J0cyxlX3RvdGFsX2Z1ZWxfaW5jb21lX3BjLGVfbWlpbmZsYXQsdjJwZXByaXNjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYycGVzZWNzY2gsZV9wZWluZm1vcixlX21pcG9wdWxhLGVfd2JnaV9ybGUsZV93YmdpX3B2ZSxlX21pZ2RwZ3JvbG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJjYWZyZXMsZV9maF9yb2wsZV9jaXZpbF93YXIpKQoKCmBgYAoKKioqQ3JlYXRpbmcgYSBTdGF0aXN0aWNzIFN1bW1hcnkqKioKCkZpcnN0bHkgY29sbGF0aW5nIGF2ZXJhZ2VzIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgbWFpbiB2YXJpYWJsZXMKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQoKIyBDcmVhdGluZyBhIGRhdGFzZXQgb2YgYXZlcmFnZXMgYW5kIHN0YW5kYXJkIGRldmlhdGlvbXMgZm9yIG91ciBrZXkgdmFyaWFibGVzCnN1bW1hcmlzZWRfc3RhdHMxIDwtIGNvbmRlbnNlZF9kYXRhICU+JQogIGdyb3VwX2J5KHllYXIpICU+JQogIHN1bW1hcml6ZShtZWFuX0dEUCA9IG1lYW4oZV9taWdkcHBjLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZF9HRFAgPSBzZChlX21pZ2RwcGMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fcG9seWFyY2h5ID0gbWVhbih2MnhfcG9seWFyY2h5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZF9wb2x5YXJjaHkgPSBzZCh2MnhfcG9seWFyY2h5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX2xpYmRlbSA9IG1lYW4odjJ4X2xpYmRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2RfbGliZGVtID0gc2QodjJ4X2xpYmRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9wYXJ0aXAgPSBtZWFuKHYyeF9wYXJ0aXBkZW0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX3BhcnRpcCA9IHNkKHYyeF9wYXJ0aXBkZW0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZGVsaWJkZW0gPSBtZWFuKHYyeF9kZWxpYmRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2RfZGVsaWJkZW0gPSBzZCh2MnhfZGVsaWJkZW0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fZWdhbGRlbSA9IG1lYW4odjJ4X2VnYWxkZW0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX2VnYWxkZW0gPSBzZCh2MnhfZWdhbGRlbSwgbmEucm0gPSBUUlVFKSkKCmBgYAoKKipBIHZpc3VhbGlzYXRpb24gb2YgbWVhbiBHRFAgdGltZSBzZXJpZXMsIHdpdGggdGhlIGF2ZXJhZ2Ugb2Ygb3VyIGtleSBmYWN0b3JzIG9mIGRlbW9jcmFjeSBmcm9tIDE5NjAgdG8gMjAyMCoqCgpgYGB7cn0KCiMgQSBzdW1tYXJ5IHBsb3Qgb2YgYXZlcmFnZSBHRFAsIGFuZCBhdmVyYWdlIGluZGljYXRvcnMgb24gYSB0aW1lIHNlcmllcwpnZ3Bsb3Qoc3VtbWFyaXNlZF9zdGF0czEsIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fR0RQLCkpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKGFlcyh5bWluID0gbWVhbl9HRFAgLSBzZF9HRFAsIHltYXggPSBtZWFuX0dEUCArIHNkX0dEUCksIGZpbGwgPSAibGlnaHRibHVlIiwgYWxwaGEgPSAwLjIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAvIDIwMDAwLCBuYW1lID0gIkxldmVsIG9mIERlbW9jcmFjeSBJbmRpY2F0b3JzIikpICsKICBnZW9tX3Ntb290aChkYXRhID0gc3VtbWFyaXNlZF9zdGF0czEsIGFlcyh5ID0gbWVhbl9wb2x5YXJjaHkgKiAyMDAwMCksIGNvbG9yID0gInJlZCIsIHNpemUgPSAxKSArCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IHN1bW1hcmlzZWRfc3RhdHMxLCBhZXMoeSA9IG1lYW5fbGliZGVtICogMjAwMDApLCBjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IHN1bW1hcmlzZWRfc3RhdHMxLCBhZXMoeSA9IG1lYW5fcGFydGlwICogMjAwMDApLCBjb2xvciA9ICJ5ZWxsb3ciLCBzaXplID0gMSkgKwogIGdlb21fc21vb3RoKGRhdGEgPSBzdW1tYXJpc2VkX3N0YXRzMSwgYWVzKHkgPSBtZWFuX2RlbGliZGVtICogMjAwMDApLCBjb2xvciA9ICJwdXJwbGUiLCBzaXplID0gMSkgKwogIGdlb21fc21vb3RoKGRhdGEgPSBzdW1tYXJpc2VkX3N0YXRzMSwgYWVzKHkgPSBtZWFuX2VnYWxkZW0gKiAyMDAwMCksIGNvbG9yID0gIm9yYW5nZSIsIHNpemUgPSAxKSArCiAgbGFicyh0aXRsZSA9ICJGaWd1cmUgMS4gQXZlcmFnZSB0cmVuZCBvZiBHRFAgYW5kIGRlbW9jcmFjeSBpbmRpY2F0b3JzIG92ZXIgdGltZSAiICwgeCA9ICJZZWFycyAxOTYwIHRvIDIwMjAiLCB5ID0gIk1lYW4gR0RQIikKCgpgYGAKCioqRXhwbG9yaW5nIHRoZSBrZXkgdmFyaWFibGUncyBzdGF0aXN0aWNzKioKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQoKIyBWYXJpYWJsZXMgZm9yIG91ciBzdW1tYXJ5IHRhYmxlCnRhYmxlZGF0YSA8LSBzdWJzZXQoY29uZGVuc2VkX2RhdGEsIHNlbGVjdCA9IGMoZV9taWdkcHBjLHYyeF9wb2x5YXJjaHksdjJ4X2xpYmRlbSx2MnhfcGFydGlwZGVtLCB2MnhfZGVsaWJkZW0sdjJ4X2VnYWxkZW0sdGF4X3JldmVudWUsbmV0X2ludmVzdG1lbnQsIHRyYWRlLGVfdG90YWxfZnVlbF9pbmNvbWVfcGMsZV9taWluZmxhdCx2MnBlcHJpc2NoLHYycGVzZWNzY2gsIGVfcGVpbmZtb3IsZV9taXBvcHVsYSxlX3diZ2lfcmxlLGVfd2JnaV9wdmUsZV9taWdkcGdyb2xucyx2MmNhZnJlcykpCgpgYGAKCmBgYHtyIHJlc3VsdHM9J2hpZGUnfQoKIyBSZW5hbWluZyB2YXJpYWJsZXMgaW4gb3VyIHRhYmxlZGF0YSwgc28gdGhleSBjYW4gYmUgbGFiZWxsZWQgbW9yZSBjbGVhcmx5IGFuZCB0aGVyZWZvcmUgcHJlc2VudGFibGUKCnRhYmxlZGF0YSA8LSB0YWJsZWRhdGEgJT4lCiAgcmVuYW1lKAogICAgIlNlY29uZGFyeSBzY2hvb2wgZW5yb2xsbWVudCIgPSB2MnBlc2Vjc2NoLAogICAgIlByaW1hcnkgc2Nob29sIGVucm9sbG1lbnQiID0gdjJwZXByaXNjaCwKICAgICJGcmVlZG9tIG9mIFJlc2VhcmNoL1RlYWNoIiA9IHYyY2FmcmVzLAogICAgIlJ1bGUgb2YgbGF3IiA9IGVfd2JnaV9ybGUsCiAgICAiUG9saXRpY2FsIHN0YWJpbGl0eSIgPSBlX3diZ2lfcHZlLAogICAgIk5hdHVyYWwgcmVzb3VyY2UgcHJvZHVjIHBlciBjYXBpdGEiID0gZV90b3RhbF9mdWVsX2luY29tZV9wYywKICAgICJJbmZhbnR5IG1vcmFsaXR5IHJhdGUiID0gZV9wZWluZm1vciwKICAgICJQb3B1bGF0aW9uIiA9IGVfbWlwb3B1bGEsCiAgICAiSW5mbGF0aW9uIiA9IGVfbWlpbmZsYXQsCiAgICAiR0RQIHBlciBjYXBpdGEiID0gZV9taWdkcHBjLAogICAgIkdEUCBHcm93dGgiID0gZV9taWdkcGdyb2xucykKYGBgCgpgYGB7ciByZXN1bHRzPSdoaWRlJ30KCiMgQ29udmVydGluZyB0byBudW1lcmljYWwKdGFibGVkYXRhJHRheF9yZXZlbnVlIDwtIGFzLm51bWVyaWModGFibGVkYXRhJHRheF9yZXZlbnVlKQp0YWJsZWRhdGEkbmV0X2ludmVzdG1lbnQgPC0gYXMubnVtZXJpYyh0YWJsZWRhdGEkbmV0X2ludmVzdG1lbnQpCnRhYmxlZGF0YSR0cmFkZSA8LSBhcy5udW1lcmljKHRhYmxlZGF0YSR0cmFkZSkKYGBgCgpgYGB7cn0KCiMgQ3JlYXRpbmcgYW5kIHByaW50aW5nIHRoZSBzdW1tYXJ5IHRhYmxlCnN1bW1hcnlfdGFibGUgPC0gZGVzY3IodGFibGVkYXRhLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1heCIsICJRMSIsICJRMyIpKQpwcmludChzdW1tYXJ5X3RhYmxlKQpgYGAKCiMjIyAyLjIuIE1ldGhvZHMKClRoZSBvcmlnaW5hbCBwYXBlciBvZiAnRG9lcyBEZW1vY3JhY3kgY2F1c2UgR3Jvd3RoJywgY29uZHVjdGVkIGFuIGluaXRpYWwgbGluZWFyIHBhbmVsIG1vZGVsLCB3aXRoIGF1dG9yZWdyZXNzaXZlIGR5bmFtaWNzLCB0aGVyZWZvcmUgdGhlIG1vZGVsIGhhcyBiZWVuIHVzaW5nIHBhc3QgdmFsdWVzIGluIGl0cyB2YXJpYWJsZXMgdG8gcHJlZGljdCBhbmQgaW4gYSBzZW5zZSwgZmlsbCBpbiB0aGUgYmxhbmtzIG9mIE4vQXMgYW5kIG1pc3NpbmcgZGF0YSB3aXRoaW4gb2JzZXJ2YXRpb25zLiBTdWNoIGEgbW9kZWwgcG9ydHJheWVkIHRocm91Z2ggRmlndXJlIDEsIHBhZ2UgMyBvZiB0aGUgcGFwZXIsIG1hcHMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSBzaW5ndWxhciBkZW1vY3JhY3kgZHVtbXkgdmFyaWFibGUsIHdpdGggZml4ZWQgZWZmZWN0cywgYWdhaW5zdCBHRFAgcGVyIGNhcGl0YSwgdGFraW5nIGludG8gYWNjb3VudCBhbmQgY29udHJvbGxpbmcgZm9yIGJvdGggZWNvbm9taWMsIGFuZCBjb3VudHJ5IGVmZmVjdHMuCgpBbGxvd2luZyB0byBpc29sYXRlIHRoZSB0aGUgc2lnbmlmaWNhbmNlIG9mIGRlbW9jcmFjeSwgd2l0aG91dCBhbGxvd2luZyBvdGhlciBmYWN0b3JzIG9yIGNoYW5uZWxzIHRvIGNvbnRyaWJ1dGUgdG8gaXQncyBzaWduaWZpY2FuY2UuIFRoZSBhdXRob3JzIGNob3NlIHRvIGRpc3BsYXkgdGhpcyBpbmZvcm1hdGlvbiwgdGhyb3VnaCB2aXN1YWxpc2F0aW9uIG9mIGxpbmUgcGxvdHMsIGFuZCBtb3N0IGV4dGVuc2l2ZWx5IHByb3ZpZGluZyBjb2VmZmljaWVudCB0YWJsZXMgYXMgdGhlIG1haW4gcGF0aCBvZiBjb252ZXlpbmcgdGhlaXIgbW9kZWxzIGFuZCBpbnRlcnByZXRhdGlvbnMuIE15IHJlcGxpY2F0aW9uIGhhcyBmb2xsb3dlZCB0aGlzIHNhbWUgbWV0aG9kb2xvZ3kgb2YgY29udmV5aW5nIHJlc3VsdHMsIGNyZWF0aW5nIHRoZSBzYW1lIG1vZGVsIHdpdGggdGhlIGFsdGVybmF0ZSBkYXRhIHNvdXJjZXMgcmVmZXJlbmNlZCBlYXJsaWVyIGZyb20gdGhlIFYtREVNIGRhdGFmaWxlcywgYW5kIFdvcmxkIEJhbmsuIFRoZSBwYXBlciBwcm92aWRlcyBhIHJvdWdoIGxpc3Qgb2YgdGhlIHZhcmlhYmxlcyBjb250cm9sbGVkIGZvciwgYW5kIHdlIGhhdmUgZm91bmQgc2ltaWxhciB2YXJpYWJsZXMsIGZvciBmb2xsb3dpbmcgdGhlaXIgbW9kZWwgc3BlY2lmaWNhdGlvbi4gCgpJIGhhdmUgZGVjaWRlZCB0byBpbmNsdWRlIHNvbWUgYWRkaXRpb25hbCB0ZXN0aW5nIHN1Y2ggYXMgYSBjb3JyZWxhdGlvbiBtYXRyaXgsIGR1ZSB0byB0aGUgbmF0dXJlIG9mIHRoZSBtb2RlbHMsIHdoZW4gYnVpbGRpbmcgdXBvbiB0aGVtLCB3aXRoIGFkZGl0aW9uYWwgY292YXJpYXRlcy4gVGhlIG9yaWdpbmFsIHN0dWR5IGRpZCBub3QgZG8gdGhpcywgYXMgaXQgZGlkIG5vdCBsb29rIHRvIHNwbGl0IHRoZSBrZXkgeCBpbmRlcGVuZGVudCB2YXJpYWJsZSBpbnRvIHNlcGVyYXRlIHBhcnRzIHRvIGFuYWx5c2UgaW5kaXZpZHVhbGx5IGFuZCB0aGVyZWZvcmUgZGVtb2NyYWN5IGluIHRoZSBvcmlnaW5hbCBzdHVkeSBjYW5ub3Qgb3ZlcmxhcCBpbiBhZmZlY3QuCgojIyAzLiBSZXN1bHRzCgpgYGB7cn0KCiMgUHJlcHBpbmcgdGhlIHBhbmVsIGRhdGEKcGFuZWxkYXRhIDwtIHBkYXRhLmZyYW1lKGNvbmRlbnNlZF9kYXRhLCBpbmRleCA9IGMoImNvdW50cnlfbmFtZS54IiwgInllYXIiKSkKYGBgCgpgYGB7cn0KIyBDcmVhdGluZyBvdXIgZmlyc3QgR0RQIG1vZGVsCmdkcG1vZGVsMSA8LSBwbG0oZV9taWdkcHBjIH4gdjJ4X3BvbHlhcmNoeSArIHYyeF9saWJkZW0gKyB2MnhfcGFydGlwZGVtICsgdjJ4X2RlbGliZGVtICArIHYyeF9lZ2FsZGVtLCBkYXRhID0gcGFuZWxkYXRhLCBtb2RlbCA9ICJyYW5kb20iKQoKYGBgCgpgYGB7cn0KIyBDcmVhdGluZyBvdXIgMm5kIEdEUCBtb2RlbApnZHBtb2RlbDIgPC0gcGxtKGVfbWlnZHBwYyB+IHYyeF9wb2x5YXJjaHkgKyB2MnhfbGliZGVtICsgdjJ4X3BhcnRpcGRlbSArIHYyeF9kZWxpYmRlbSAKICAgICAgICAgICAgICAgICArIHYyeF9lZ2FsZGVtICsgZV9taXBvcHVsYSArIGVfcGVpbmZtb3IgKyB2MnBlc2Vjc2NoCiAgICAgICAgICAgICAgICAgKyB2MnBlcHJpc2NoICsgdjJjYWZyZXMgKyBlX3diZ2lfcmxlICsgZV93YmdpX3B2ZSArIGVfdG90YWxfZnVlbF9pbmNvbWVfcGMKICAgICAgICAgICAgICAgICArIGVfbWlpbmZsYXQsIGRhdGEgPSBwYW5lbGRhdGEsIG1vZGVsID0gInJhbmRvbSIpCmBgYAoKYGBge3J9CgojIENyZWF0aW5nIGEgdGFibGUgdG8gc2hvdyBvdXIgc3VtbWFyeSBvZiBib3RoIG1vZGVscyBzaWRlIGJ5IHNpZGUKCnRhYl9tb2RlbChnZHBtb2RlbDIsZ2RwbW9kZWwxLHByZWQubGFiZWxzID0gYygiSW50ZXJjZXB0IiwgIlBvbHlhcmNoeSIsICJMaWJkZW0iLCJQYXJ0aXAiLCJEZWxpYmRlbSIsIkVnYWxkZW0iLCJQb3B1bGF0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmZhbnR5IG1vcmFsaXR5IHJhdGUiLCJTZWNvbmRhcnkgc2Nob29sIGVucm9sbG1lbnQiLCAiUHJpbWFyeSBzY2hvb2wgZW5yb2xsbWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJlZWRvbSBvZiBSZXNlYXJjaC9UZWFjaCIsIlJ1bGUgb2YgbGF3IiwiUG9saXRpY2FsIFN0YWJpbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTmF0dXJhbCByZXNvdXJjZSBwcm9kdWMgcGVyIGNhcGl0YSIsIkluZmxhdGlvbiIpLGR2LmxhYmVscyA9IGMoIkdEUCBNb2RlbCAyIHdpdGggY29udHJvbHMiLCJHRFAgTW9kZWwgMSIpLAogICAgICAgICAgc3RyaW5nLmVzdCA9ICJDb2VmZmljaWVudCIsCiAgICAgICAgICBzdHJpbmcuY2kgPSAiQ29uZi5JbnQgKDk1JSkiLAogICAgICAgICAgc3RyaW5nLnAgPSAiUC1WYWx1ZSIpCmBgYAoKClRoZSBvcmlnaW5hbCBzdHVkeSAoQWNlbW9nbHUgZXQgYWwuLCAyMDE0KSwgcG9zaXRzIHRoYXQgZGVtb2NyYWN5IGhhcyBhIHBvc2l0aXZlIGltcGFjdCBvbiBHRFAgcGVyIGNhcGl0YSwgdGhyb3VnaCBvdXIgcmVwbGljYXRpb24sIHdoZXJlIHdlIHNwbGl0IHVwIGRlbW9jcmFjeSBpbnRvIDUga2V5IGZhY3RvcnMgb2YgZGVtb2NyYWN5LCBpbiB0aGUgaW5pdGlhbCBHRFAgbW9kZWwgMSB3aXRob3V0IGNvbnRyb2xzLCBhbGwgb2Ygb3VyIGluZGVwZW5kZW50IHggdmFyaWFibGVzIG9mIGRlbW9jcmFjeSBhcmUgY29uc2lkZXJlZCBzaWduaWZpY2FudCBlYWNoIHdpdGggYSBwLXZhbHVlIGxlc3MgdGhhbiAwLjA1LiAgVGhlIG1ham9yaXR5IGV4Y2VwdCBmb3IgcG9seWFyY2h5IGFuZCBsaWJkZW0sIGhhdmluZyBhIG1ham9yIHBvc2l0aXZlIGltcGFjdCBvbiBHRFAgcGVyIGNhcGl0YSwgY29udmV5ZWQgdGhyb3VnaCB0aGVpciBjb2VmZmljaWVudHMgZGlzcGxheWVkIGFib3ZlLiBIb3dldmVyLCB0aGlzIGlzIGluIGluIGNvbnRyYXN0IHRvIHRoZSDigJhHRFAgTW9kZWwgMiB3aXRoIGNvbnRyb2xz4oCZLCB3aGVyZSB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIHNpbWlsYXIgY29udHJvbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgb3JpZ2luYWwgc3R1ZHksIGEgbXVjaCB3aWRlciBmaXQgb2YgdGhlIG1vZGVsIGhhcyBiZWVuIGV4cGxhaW5lZCB0aHJvdWdoIHRoZSAwLjYyMCBhZGp1c3RlZCBSLXNxdWFyZWQgY29tcGFyZWQgdG8gdGhlIDAuMTE3IG9mIEdEUCBNb2RlbCAxLiBIb3dldmVyLCB3ZSBhbHNvIGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbml0aWFsIGRlbW9jcmFjeSBpbmRpY2F0b3JzIGFyZW7igJl0IHNpZ25pZmljYW50IGF0IGFsbC4gT3VyIGNvbnRyb2xzIGRldHJhY3QgZnJvbSB0aGVpciBleHBsYW5hdG9yeSBwb3dlciwgYXMgbW9yZSBvZiB0aGUgbm9pc2UgaW4gdGhlIG1vZGVsIHRoYXQgd291bGQgaGF2ZSBzaW1wbHkgYmVlbiBjb250cmlidXRlZCB0byB0aGUgaW5kaWNhdG9ycywgYXJlIGV4cGxhaW5lZCBieSB0aGUgY29udHJvbCB2YXJpYWJsZXMsIHN1Y2ggYXMgTmF0dXJhbCByZXNvdXJjZXMsIHJhdGUgb2Ygc2Vjb25kYXJ5IHNjaG9vbCBlbnJvbG1lbnQgYW5kIHRoZSBkZWdyZWUgb2YgcnVsZSBvZiBsYXcgaW4gYSBjb3VudHJ5IGFyZSBzaWduaWZpY2FudCBjb3ZhcmlhdGUgY29udHJvbHMgd2l0aCBhIHAtdmFsdWUgYmVsb3cgMC4wNS4gVGhpcyBpcyBhbHNvIGNvbnZleWVkIGJ5IHRoZWlyIGNvZWZmaWNpZW50IHdoaWNoIHBvcnRyYXlzIHRoZSBtYWduaXR1ZGUgb2YgdGhlIHZhcmlhYmxlcywgYXMgd2UgY2FuIHNlZSBQYXJ0aXAgYW5kIEVnYWxkZW0gaGF2ZSBhIGxhcmdlIHBvc2l0aXZlIGVmZmVjdCBvbiBHRFAgcGVyIGNhcGl0YSwgd2hpbHN0IHRoZSByZXN0IGRvIG5vdCwgYW5kIFBvbHlhcmNoeSB3aGljaCBpcyBzaWduaWZpY2FudCBpbiBhIG5lZ2F0aXZlIGVmZmVjdCBvbiBncm93dGguIFRoaXMgZGl2aWRlIG9mIG5lZ2F0aXZlIGFuZCBwb3NpdGl2ZSBtYXkgc3VwcG9ydCAoQWNlbW9nbHUgZXQgYWwuLCAyMDE0KeKAmXMgdGhlb3J5IG9uIHRoZSBvdmVyYWxsIHBlcmNlaXZlZCBuZWdhdGl2ZSBlZmZlY3QgYXJndWVkIGluIChCYXJybywgMTk5NikgbWF5IGJlIGR1ZSB0byB0aGUgbWVhc3VyZW1lbnQgZXJyb3IsIG9mIGRlbW9jcmFjeSBpbnRyb2R1Y2luZyBiaWFzLiAKCmBgYHtyfQpjb3JfbWF0cml4IDwtIGNvcihzdW1tYXJpc2VkX3N0YXRzMSkKcHJpbnQoY29yX21hdHJpeCkKYGBgCgpXZSBleHBsb3JlIHRoaXMsIGZ1cnRoZXIgYnkgY29uZHVjdGluZyBhIGNvcnJlbGF0aW9uIG1hdHJpeCwgd2hlcmVieSB2aWV3aW5nIHRoZSByZXN1bHRzLCBhIGxhcmdlIG1ham9yaXR5IG9mIHRoZSBkZW1vY3JhY3kgaW5kaWNhdG9ycyBoYXZlIHVuc3VycHJpc2luZ2x5IDEgb3IgbmVhciBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMsIHdoaWNoIGluZGljYXRlIGV4dHJlbWVseSBoaWdoIG11bHRpY29sbGluZWFyaXR5IGJldHdlZW4gdGhlIGZhY3RvcnMgb2YgZGVtb2NyYWN5LgoKIyMgNC4gQ29uY2x1c2lvbnMKCkluIGNvbmNsdXNpb24sIGl0IGNhbiBiZSBzaWduaWZpY2FudGx5IGFyZ3VlZCB0aGF0IG5vIG9uZSBmYWN0b3Igb2YgZGVtb2NyYWN5IGlzIG91dHN0YW5kaW5nbHkgc2lnbmlmaWNhbnQgaW4gaW5jcmVhc2luZyBncm93dGgsIHRocm91Z2ggR0RQIHBlciBjYXBpdGEuIEFzIHRoZWlyIHNpZ25pZmljYW5jZSBzZWVtcyB0byBiZSBoaWdobHkgaW50ZXJ0d2luZWQgd2hpY2ggd291bGQgY29uZmlybSB0aGUgcG9zc2libGUgb3V0Y29tZSBvZiBteSBoeXBvdGhlc2lzIHRoYXQsIHRoZSBlZmZlY3RzIG9mIHRoZXNlIGluZGljZXMgYXJlIGN1bXVsYXRpdmUgYW5kIHdvcmsgYXMgb25lIHRvIGNyZWF0ZSBhIGNvbmNsdXNpdmUgZWZmZWN0IG9uIGdyb3d0aC4gVGhlcmVmb3JlLCB0aGUgcGFwZXIgaXMgaW4gaXRzIHJpZ2h0IHRvIHVzZSBhIHNpbXBsZSBjb2RlIG9mIGRlbW9jcmF0aWMgb3Igbm90LCBhcyB0aGUgbGFyZ2VyIGVmZmVjdHMgb24gZ3Jvd3RoIG9ubHkgb2NjdXIgd2hlbiBtb3N0IG9mIHRoZSBmYWN0b3JzIG9mIGRlbW9jcmFjeSBhcmUgcHJlc2VudCB0byBhIGNlcnRhaW4gZGVncmVlLiBXZSBjYW4gYWxzbyBhcmd1ZSB0aGF0LCBhcyBzaG93biBieSB0aGUgc2lnbmlmaWNhbmNlIG9mIG91ciBrZXkgaW5kaWNhdG9ycyBiZWluZyByZWR1Y2VkIHdoZW4gdGhlIGNvdmFyaWF0ZSBjaGFubmVscyB3aGljaCBkZW1vY3JhY3kgdGVuZHMgdG8gaW5jcmVhc2UgR0RQIHRocm91Z2ggd2VyZSBhZGRlZCwgd2UgY2FuIGNvbnZleSBob3cgbW9zdCBvZiBvdXIgZmFjdG9yJ3MgaW5mbHVlbmNlIG9uIGdyb3d0aCwgc3RlbXMgdGhyb3VnaCBhbmQgcmVxdWlyZXMgdGhlc2UgY2hhbm5lbHMsIHRoZXJlZm9yZSBub3QgZGVtb2NyYWN5IGFsb25lLiBSYXRoZXIgcmVxdWlyaW5nIGFkZGl0aW9uYWwgY2hhbm5lbHMgdG8gYmUgaGlnaGx5IHNpZ25pZmljYW50IGZvciB0aGUgZnVsbCBpbmZsdWVuY2Ugb2YgZGVtb2NyYWN5IHRvIGJlIGZlbHQuIEFzIGFyZ3VlZCBieSAoVGF2YXJlcyBhbmQgV2FjemlhcmcsIDIwMDEpLgoKT3VyIHJlc3VsdHMgYXJlIHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgb3JpZ2luYWwgcGFwZXIsIGFzIG91ciBtb2RlbCBmb2xsb3dzIHRoZSBzaW1pbGFyIHRpbWVmcmFtZSwgYW5kIHJlbGF0aXZlbHkgc2ltaWxhciB2YXJpYWJsZXMsIHdpdGggYSBnb29kIGZldyBjcm9zc2luZyBvdmVyIGZyb20gdGhlIG9yaWdpbmFsLiBXaXRoIHJvdWdobHkgdGhlIHNhbWUgc2FtcGxlIHNpemUgb2YgY291bnRyaWVzIGluIHRoZSBzdHVkeSwgaXQgaGVscHMgcmVkdWNlIG1lYXN1cmVtZW50IGVycm9yIG9uIHRoYXQgZnJvbnQuIENvbmNsdXNpdmVseSB0aGlzIHJlcGxpY2F0aW9uIHNlZW1zIHRvIGJhY2sgdXAgd2l0aCBmdXJ0aGVyIGV2aWRlbmNlIHRoZSBjbGFpbXMgbWFkZSBpbiB0aGUgb3JpZ2luYWwgc3R1ZHkgJ0RvZXMgRGVtb2NyYWN5IGNhdXNlIEdyb3d0aCcgKEFjZW1vZ2x1IGV0IGFsLiwgMjAxNCkKCiMjIFJlZmVyZW5jZXMKClJlZmVyZW5jZSBsaXN0CgpBY2Vtb2dsdSwgRC4sIE5haWR1LCBTLiwgUmVzdHJlcG8sIFAuIGFuZCBSb2JpbnNvbiwgSi5BLiAoMjAxNCkuIERlbW9jcmFjeSBEb2VzIENhdXNlIEdyb3d0aC4gU1NSTiBFbGVjdHJvbmljIEpvdXJuYWwsIDEyNygxKS4gZG9pOmh0dHBzOi8vZG9pLm9yZy8xMC4yMTM5L3Nzcm4uMjQxMTc5MS4KCkFjZW1vZ2x1LCBELiwgTmFpZHUsIFMuLCBSZXN0cmVwbywgUC4gYW5kIFJvYmluc29uLCBKLkEuICgyMDE5KS4gRGVtb2NyYWN5IERvZXMgQ2F1c2UgR3Jvd3RoLiBKb3VybmFsIG9mIFBvbGl0aWNhbCBFY29ub215LCBbb25saW5lXSAxMjcoMSkuIGRvaTpodHRwczovL2RvaS5vcmcvMTAuMTA4Ni83MDA5MzYuCgpCYXJybywgUi5KLiAoMTk5NikuIERlbW9jcmFjeSBhbmQgZ3Jvd3RoLiBKb3VybmFsIG9mIEVjb25vbWljIEdyb3d0aCwgMSgxKSwgcHAuMeKAkzI3LiBkb2k6aHR0cHM6Ly9kb2kub3JnLzEwLjEwMDcvYmYwMDE2MzM0MC4KCkJvaXgsIEMuLCBNaWxsZXIsIE0uIGFuZCBSb3NhdG8sIFMuICgyMDEyKS4gQSBDb21wbGV0ZSBEYXRhIFNldCBvZiBQb2xpdGljYWwgUmVnaW1lcywgMTgwMOKAkzIwMDcuIENvbXBhcmF0aXZlIFBvbGl0aWNhbCBTdHVkaWVzLCA0NigxMiksIHBwLjE1MjPigJMxNTU0LiBkb2k6aHR0cHM6Ly9kb2kub3JnLzEwLjExNzcvMDAxMDQxNDAxMjQ2MzkwNS4KCkNlbnRlciBmb3IgU3lzdGVtaWMgUGVhY2UgKDIwMjIpLiBJTlNDUiBEYXRhIFBhZ2UuIFtvbmxpbmVdIHd3dy5zeXN0ZW1pY3BlYWNlLm9yZy4gQXZhaWxhYmxlIGF0OiBodHRwczovL3d3dy5zeXN0ZW1pY3BlYWNlLm9yZy9pbnNjcmRhdGEuaHRtbC4KCkNoZWlidWIsIEouQS4sIEdhbmRoaSwgSi4gYW5kIFZyZWVsYW5kLCBKLlIuICgyMDA5KS4gRGVtb2NyYWN5IGFuZCBkaWN0YXRvcnNoaXAgcmV2aXNpdGVkLiBQdWJsaWMgQ2hvaWNlLCAxNDMoMS0yKSwgcHAuNjfigJMxMDEuIGRvaTpodHRwczovL2RvaS5vcmcvMTAuMTAwNy9zMTExMjctMDA5LTk0OTEtMi4KCkZyZWVkb20gSG91c2UgKDIwMjApLiBGcmVlZG9tIGluIHRoZSBXb3JsZC4gW29ubGluZV0gZnJlZWRvbWhvdXNlLm9yZy4gQXZhaWxhYmxlIGF0OiBodHRwczovL2ZyZWVkb21ob3VzZS5vcmcvcmVwb3J0L2ZyZWVkb20td29ybGQuCgpHb3ZEYXRhMzYwLiAobi5kLikuIEdvdkRhdGEzNjA6IFJldmlzZWQgQ29tYmluZWQgUG9saXR5IFNjb3JlLiBbb25saW5lXSBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vZ292ZGF0YTM2MC53b3JsZGJhbmsub3JnL2luZGljYXRvcnMvaDY5MDZkMzFiP2NvdW50cnk9QlJBJmluZGljYXRvcj0yNzQ3MCZ2aXo9bGluZV9jaGFydCZ5ZWFycz0xODAwIFtBY2Nlc3NlZCA1IEFwci4gMjAyM10uCgpNaW5pZXIsIEouQS4gKDE5OTgpLiBEZW1vY3JhY3kgYW5kIEdyb3d0aDogQWx0ZXJuYXRpdmUgQXBwcm9hY2hlcy4gSm91cm5hbCBvZiBFY29ub21pYyBHcm93dGgsIDMoMyksIHBwLjI0MeKAkzI2Ni4gZG9pOmh0dHBzOi8vZG9pLm9yZy8xMC4xMDIzL2E6MTAwOTcxNDgyMTc3MC4KClRhdmFyZXMsIEouIGFuZCBXYWN6aWFyZywgUi4gKDIwMDEpLiBIb3cgZGVtb2NyYWN5IGFmZmVjdHMgZ3Jvd3RoLiBFdXJvcGVhbiBFY29ub21pYyBSZXZpZXcsIDQ1KDgpLCBwcC4xMzQx4oCTMTM3OC4gZG9pOmh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L3MwMDE0LTI5MjEoMDApMDAwOTMtMy4KClYtZGVtLm5ldC4gKDIwMjMpLiBIb21lIHwgVi1EZW0uIFtvbmxpbmVdIEF2YWlsYWJsZSBhdDogKGh0dHBzOi8vZG9pLm9yZy8xMC4yMzY5Ni92ZGVtZHMyMywgMjAyMykuCgpXb3JsZCBCYW5rICgyMDIzKS4gV29ybGQgQmFuayBPcGVuIERhdGEgfCBEYXRhLiBbb25saW5lXSBXb3JsZGJhbmsub3JnLiBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vZGF0YWJhbmsud29ybGRiYW5rLm9yZy9zb3VyY2Uvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy4KCkZyZWVzZSwgSi4sICYgUGV0ZXJzb24sIEQuICgyMDE3KS4gUmVwbGljYXRpb24gaW4gc29jaWFsIHNjaWVuY2UuICpBbm51YWwgUmV2aWV3IG9mIFNvY2lvbG9neSosIDQzLCAxNDctMTY1LCBbZG9pOiAxMC4xMTQ2XShodHRwczovL3d3dy5hbm51YWxyZXZpZXdzLm9yZy9kb2kvYWJzLzEwLjExNDYvYW5udXJldi1zb2MtMDYwMTE2LTA1MzQ1MCkuCgojIyBBcHBlbmRpeAoKIyMjIEFwcGVuZGl4IDEuIE15IGVudmlyb25tZW50IChmdWxsIGluZm9ybWF0aW9uKQoKYGBge3Igc2Vzc2lvbn0KIyBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBteSBlbnZpcm9ubWVudApzZXNzaW9uSW5mbygpCmBgYAoKIyMjIEFwcGVuZGl4IDIuIEVudGlyZSBSIGNvZGUgdXNlZCBpbiB0aGUgcHJvamVjdAoKYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0KVl9ERU1fRnVsbCA8LSByZWFkUkRTKCIvVXNlcnMvbmVzdG9yL1JFUExJQ0FUSU9OMlBST0ovU01JMjA1X1ByZXJlZ2lzdHJhdGlvbl9mb3JtLW1haW4vVi1EZW0tQ1ktRnVsbCtPdGhlcnMtdjExLjEucmRzIikKCldCX2RhdGFfdmFyaWFibGVzIDwtIHJlYWRfY3N2KCIvVXNlcnMvbmVzdG9yL1JFUExJQ0FUSU9OMlBST0ovU01JMjA1X1ByZXJlZ2lzdHJhdGlvbl9mb3JtLW1haW4vV0JfZGF0YV92YXJpYWJsZXMuY3N2IikKCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZShjb3VudHJ5X25hbWUgPSBgQ291bnRyeSBOYW1lYCkKCldCX2RhdGFfdmFyaWFibGVzIDwtIFdCX2RhdGFfdmFyaWFibGVzICU+JQogIHJlbmFtZSh5ZWFyID0gYFRpbWVgKQoKV0JfZGF0YV92YXJpYWJsZXMgPC0gV0JfZGF0YV92YXJpYWJsZXMgJT4lCiAgcmVuYW1lKGNvdW50cnlfdGV4dF9pZCA9IGBDb3VudHJ5IENvZGVgKQoKV0JfZGF0YV92YXJpYWJsZXMgPC0gV0JfZGF0YV92YXJpYWJsZXMgJT4lCiAgcmVuYW1lKHRheF9yZXZlbnVlID0gYFRheCByZXZlbnVlICglIG9mIEdEUCkgW0dDLlRBWC5UT1RMLkdELlpTXWApCgpXQl9kYXRhX3ZhcmlhYmxlcyA8LSBXQl9kYXRhX3ZhcmlhYmxlcyAlPiUKICByZW5hbWUobmV0X2ludmVzdG1lbnQgPSBgTmV0IGludmVzdG1lbnQgaW4gbm9uZmluYW5jaWFsIGFzc2V0cyAoJSBvZiBHRFApIFtHQy5ORk4uVE9UTC5HRC5aU11gKQoKV0JfZGF0YV92YXJpYWJsZXMgPC0gV0JfZGF0YV92YXJpYWJsZXMgJT4lCiAgcmVuYW1lKHRyYWRlID0gYFRyYWRlICglIG9mIEdEUCkgW05FLlRSRC5HTkZTLlpTXWApCgoKCnN0cihXQl9kYXRhX3ZhcmlhYmxlcykKCmRhdGFmaWxlIDwtIFdCX2RhdGFfdmFyaWFibGVzCgpXQl9kYXRhX3ZhcmlhYmxlcyA8LSBkYXRhZmlsZVshaXMubmEoZGF0YWZpbGUkY291bnRyeV9uYW1lKSwgXQpXQl9kYXRhX3ZhcmlhYmxlcyA8LSBkYXRhZmlsZVshaXMubmEoZGF0YWZpbGUkeWVhciksIF0KCmJvdHRvbXRocmVzaG9sZCA8LSAxOTYwClZfREVNX0Z1bGwgPC0gVl9ERU1fRnVsbFtWX0RFTV9GdWxsJHllYXIgPj0gYm90dG9tdGhyZXNob2xkLCBdCgpjb3VudHJ5SUQgPC0gdW5pcXVlKFZfREVNX0Z1bGwkY291bnRyeV90ZXh0X2lkKQpGaWx0ZXJpbmcgPC0gV0JfZGF0YV92YXJpYWJsZXNbV0JfZGF0YV92YXJpYWJsZXMkY291bnRyeV90ZXh0X2lkICVpbiUgY291bnRyeUlELCBdCgppbmRpY2F0b3JfZGF0YXNldCA8LSBpbm5lcl9qb2luKFZfREVNX0Z1bGwsIEZpbHRlcmluZywgYnkgPSBjKCJ5ZWFyIiwgImNvdW50cnlfdGV4dF9pZCIpKQoKY29uZGVuc2VkX2RhdGEgPC0gc3Vic2V0KGluZGljYXRvcl9kYXRhc2V0LCBzZWxlY3QgPSBjKGNvdW50cnlfbmFtZS54LCBjb3VudHJ5X3RleHRfaWQsIGNvdW50cnlfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZWFyLCBoaXN0b3JpY2FsX2RhdGUsIGhpc3RuYW1lLGNvZGluZ3N0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nZW5kLHYyeF9wb2x5YXJjaHksIHYyeF9saWJkZW0sIHYyeF9wYXJ0aXBkZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MnhfZGVsaWJkZW0sdjJ4X2VnYWxkZW0sZV9taWdkcHBjLHRheF9yZXZlbnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0X2ludmVzdG1lbnQsIHRyYWRlLGVfY293X2ltcG9ydHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlX2Nvd19leHBvcnRzLGVfdG90YWxfZnVlbF9pbmNvbWVfcGMsZV9taWluZmxhdCx2MnBlcHJpc2NoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJwZXNlY3NjaCxlX3BlaW5mbW9yLGVfbWlwb3B1bGEsZV93YmdpX3JsZSxlX3diZ2lfcHZlLGVfbWlnZHBncm9sbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MmNhZnJlcyxlX2ZoX3JvbCxlX2NpdmlsX3dhcikpCgoKc3VtbWFyaXNlZF9zdGF0czEgPC0gY29uZGVuc2VkX2RhdGEgJT4lCiAgZ3JvdXBfYnkoeWVhcikgJT4lCiAgc3VtbWFyaXplKG1lYW5fR0RQID0gbWVhbihlX21pZ2RwcGMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX0dEUCA9IHNkKGVfbWlnZHBwYywgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9wb2x5YXJjaHkgPSBtZWFuKHYyeF9wb2x5YXJjaHksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIHNkX3BvbHlhcmNoeSA9IHNkKHYyeF9wb2x5YXJjaHksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIG1lYW5fbGliZGVtID0gbWVhbih2MnhfbGliZGVtLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZF9saWJkZW0gPSBzZCh2MnhfbGliZGVtLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBtZWFuX3BhcnRpcCA9IG1lYW4odjJ4X3BhcnRpcGRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2RfcGFydGlwID0gc2QodjJ4X3BhcnRpcGRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9kZWxpYmRlbSA9IG1lYW4odjJ4X2RlbGliZGVtLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICBzZF9kZWxpYmRlbSA9IHNkKHYyeF9kZWxpYmRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgbWVhbl9lZ2FsZGVtID0gbWVhbih2MnhfZWdhbGRlbSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgc2RfZWdhbGRlbSA9IHNkKHYyeF9lZ2FsZGVtLCBuYS5ybSA9IFRSVUUpKQoKZ2dwbG90KHN1bW1hcmlzZWRfc3RhdHMxLCBhZXMoeCA9IHllYXIsIHkgPSBtZWFuX0dEUCwpKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChhZXMoeW1pbiA9IG1lYW5fR0RQIC0gc2RfR0RQLCB5bWF4ID0gbWVhbl9HRFAgKyBzZF9HRFApLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGFscGhhID0gMC4yKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gLyAyMDAwMCwgbmFtZSA9ICJMZXZlbCBvZiBEZW1vY3JhY3kgSW5kaWNhdG9ycyIpKSArCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IHN1bW1hcmlzZWRfc3RhdHMxLCBhZXMoeSA9IG1lYW5fcG9seWFyY2h5ICogMjAwMDApLCBjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKwogIGdlb21fc21vb3RoKGRhdGEgPSBzdW1tYXJpc2VkX3N0YXRzMSwgYWVzKHkgPSBtZWFuX2xpYmRlbSAqIDIwMDAwKSwgY29sb3IgPSAiZ3JlZW4iLCBzaXplID0gMSkgKwogIGdlb21fc21vb3RoKGRhdGEgPSBzdW1tYXJpc2VkX3N0YXRzMSwgYWVzKHkgPSBtZWFuX3BhcnRpcCAqIDIwMDAwKSwgY29sb3IgPSAieWVsbG93Iiwgc2l6ZSA9IDEpICsKICBnZW9tX3Ntb290aChkYXRhID0gc3VtbWFyaXNlZF9zdGF0czEsIGFlcyh5ID0gbWVhbl9kZWxpYmRlbSAqIDIwMDAwKSwgY29sb3IgPSAicHVycGxlIiwgc2l6ZSA9IDEpICsKICBnZW9tX3Ntb290aChkYXRhID0gc3VtbWFyaXNlZF9zdGF0czEsIGFlcyh5ID0gbWVhbl9lZ2FsZGVtICogMjAwMDApLCBjb2xvciA9ICJvcmFuZ2UiLCBzaXplID0gMSkgKwogIGxhYnModGl0bGUgPSAiQXZlcmFnZSB0cmVuZCBvZiBHRFAgYW5kIGRlbW9jcmFjeSBpbmRpY2F0b3JzIG92ZXIgdGltZSAiICwgeCA9ICJZZWFycyAxOTYwIHRvIDIwMjAiLCB5ID0gIk1lYW4gR0RQIikKCgoKIyMjIE5FRUQgVE8gSU5TVEFMTCB4UXVhcnR6IGZyb20gdGhlaXIgd2Vic2l0ZS4uLiBodHRwczovL3d3dy54cXVhcnR6Lm9yZwojIE90aGVyd2lzZSB0aGUgcGFja2FnZSBiZWxvdyB3b250IHdvcmsKCmluc3RhbGwucGFja2FnZXMoInN1bW1hcnl0b29scyIpCmxpYnJhcnkoc3VtbWFyeXRvb2xzKQoKdGFibGVkYXRhIDwtIHN1YnNldChjb25kZW5zZWRfZGF0YSwgc2VsZWN0ID0gYyhlX21pZ2RwcGMsdjJ4X3BvbHlhcmNoeSx2MnhfbGliZGVtLHYyeF9wYXJ0aXBkZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjJ4X2RlbGliZGVtLHYyeF9lZ2FsZGVtLHRheF9yZXZlbnVlLG5ldF9pbnZlc3RtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWRlLGVfdG90YWxfZnVlbF9pbmNvbWVfcGMsZV9taWluZmxhdCx2MnBlcHJpc2NoLHYycGVzZWNzY2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZV9wZWluZm1vcixlX21pcG9wdWxhLGVfd2JnaV9ybGUsZV93YmdpX3B2ZSxlX21pZ2RwZ3JvbG5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYyY2FmcmVzKSkKCnRhYmxlZGF0YSA8LSB0YWJsZWRhdGEgJT4lCiAgcmVuYW1lKAogICAgIlNlY29uZGFyeSBzY2hvb2wgZW5yb2xsbWVudCIgPSB2MnBlc2Vjc2NoLAogICAgIlByaW1hcnkgc2Nob29sIGVucm9sbG1lbnQiID0gdjJwZXByaXNjaCwKICAgICJGcmVlZG9tIG9mIFJlc2VhcmNoL1RlYWNoIiA9IHYyY2FmcmVzLAogICAgIlJ1bGUgb2YgbGF3IiA9IGVfd2JnaV9ybGUsCiAgICAiUG9saXRpY2FsIHN0YWJpbGl0eSIgPSBlX3diZ2lfcHZlLAogICAgIk5hdHVyYWwgcmVzb3VyY2UgcHJvZHVjIHBlciBjYXBpdGEiID0gZV90b3RhbF9mdWVsX2luY29tZV9wYywKICAgICJJbmZhbnR5IG1vcmFsaXR5IHJhdGUiID0gZV9wZWluZm1vciwKICAgICJQb3B1bGF0aW9uIiA9IGVfbWlwb3B1bGEsCiAgICAiSW5mbGF0aW9uIiA9IGVfbWlpbmZsYXQsCiAgICAiR0RQIHBlciBjYXBpdGEiID0gZV9taWdkcHBjLAogICAgIkdEUCBHcm93dGgiID0gZV9taWdkcGdyb2xucykKCgp0YWJsZWRhdGEkdGF4X3JldmVudWUgPC0gYXMubnVtZXJpYyh0YWJsZWRhdGEkdGF4X3JldmVudWUpCnRhYmxlZGF0YSRuZXRfaW52ZXN0bWVudCA8LSBhcy5udW1lcmljKHRhYmxlZGF0YSRuZXRfaW52ZXN0bWVudCkKdGFibGVkYXRhJHRyYWRlIDwtIGFzLm51bWVyaWModGFibGVkYXRhJHRyYWRlKQoKCiMgR2VuZXJhdGUgc3VtbWFyeSBzdGF0aXN0aWNzIHRhYmxlCnN1bW1hcnlfdGFibGUgPC0gZGVzY3IodGFibGVkYXRhLCBzdGF0cyA9IGMoIm1lYW4iLCAic2QiLCAibWluIiwgIm1heCIsICJRMSIsICJRMyIpKQoKIyBQcmludCB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzIHRhYmxlCnByaW50KHN1bW1hcnlfdGFibGUpCgojIFByZXBwaW5nIHRoZSBwYW5lbCBkYXRhCnBhbmVsZGF0YSA8LSBwZGF0YS5mcmFtZShjb25kZW5zZWRfZGF0YSwgaW5kZXggPSBjKCJjb3VudHJ5X25hbWUueCIsICJ5ZWFyIikpCgoKCiMgQ3JlYXRpbmcgb3VyIGZpcnN0IEdEUCBtb2RlbApnZHBtb2RlbDEgPC0gcGxtKGVfbWlnZHBwYyB+IHYyeF9wb2x5YXJjaHkgKyB2MnhfbGliZGVtICsgdjJ4X3BhcnRpcGRlbSArIHYyeF9kZWxpYmRlbSAgKyB2MnhfZWdhbGRlbSwgZGF0YSA9IHBhbmVsZGF0YSwgbW9kZWwgPSAicmFuZG9tIikKCgoKCiMgQ3JlYXRpbmcgb3VyIDJuZCBHRFAgbW9kZWwKZ2RwbW9kZWwyIDwtIHBsbShlX21pZ2RwcGMgfiB2MnhfcG9seWFyY2h5ICsgdjJ4X2xpYmRlbSArIHYyeF9wYXJ0aXBkZW0gKyB2MnhfZGVsaWJkZW0gCiAgICAgICAgICAgICAgICAgKyB2MnhfZWdhbGRlbSArIGVfbWlwb3B1bGEgKyBlX3BlaW5mbW9yICsgdjJwZXNlY3NjaAogICAgICAgICAgICAgICAgICsgdjJwZXByaXNjaCArIHYyY2FmcmVzICsgZV93YmdpX3JsZSArIGVfd2JnaV9wdmUgKyBlX3RvdGFsX2Z1ZWxfaW5jb21lX3BjCiAgICAgICAgICAgICAgICAgKyBlX21paW5mbGF0LCBkYXRhID0gcGFuZWxkYXRhLCBtb2RlbCA9ICJyYW5kb20iKQoKCgoKIyBDcmVhdGluZyBhIHRhYmxlIHRvIHNob3cgb3VyIHN1bW1hcnkgb2YgYm90aCBtb2RlbHMgc2lkZSBieSBzaWRlCgp0YWJfbW9kZWwoZ2RwbW9kZWwyLGdkcG1vZGVsMSxwcmVkLmxhYmVscyA9IGMoIkludGVyY2VwdCIsICJQb2x5YXJjaHkiLCAiTGliZGVtIiwiUGFydGlwIiwiRGVsaWJkZW0iLCJFZ2FsZGVtIiwiUG9wdWxhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5mYW50eSBtb3JhbGl0eSByYXRlIiwiU2Vjb25kYXJ5IHNjaG9vbCBlbnJvbGxtZW50IiwgIlByaW1hcnkgc2Nob29sIGVucm9sbG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZyZWVkb20gb2YgUmVzZWFyY2gvVGVhY2giLCJSdWxlIG9mIGxhdyIsIlBvbGl0aWNhbCBTdGFiaWxpdHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5hdHVyYWwgcmVzb3VyY2UgcHJvZHVjIHBlciBjYXBpdGEiLCJJbmZsYXRpb24iKSxkdi5sYWJlbHMgPSBjKCJHRFAgTW9kZWwgMiB3aXRoIGNvbnRyb2xzIiwiR0RQIE1vZGVsIDEiKSwKICAgICAgICAgIHN0cmluZy5lc3QgPSAiQ29lZmZpY2llbnQiLAogICAgICAgICAgc3RyaW5nLmNpID0gIkNvbmYuSW50ICg5NSUpIiwKICAgICAgICAgIHN0cmluZy5wID0gIlAtVmFsdWUiKQoKY29yX21hdHJpeCA8LSBjb3Ioc3VtbWFyaXNlZF9zdGF0czEpCnByaW50KGNvcl9tYXRyaXgpCmBgYAo=