Project proposal
The purpose of this project is to demonstrate my R skills in data
manipulation and structuring, as well as an analysis of the presented
data. With that in mind, I’ll leave most of the code exposed, but not
all so it doesn’t get too repetitive. I must point out that although
present in some tables, the “yellow or indigenous” ethnicity will not be
presented in the final report, since there are a large number of
outliers and that end up biasing the analysis.
During the analysis, I will make several population predictions, as
not all tables present data from 2019. For population prediction, I will
base myself on the arithmetic method present in the book by
Marcos Von Sperling (Von Sperling
2014).
Arithmetic Method
This method assumes a constant growth rate for the following years,
based on known data, for example, the population of the last census.
Mathematically, it can be represented as follows:
\[\frac{dP}{dt} = k_a\]
where dP/dt represents the population change (P) per unit time (t),
and ka is a constant. Considering that P1 is the population of the
penultimate census (year t1) and P2, the population of the last census
(year t2), we have:
\[\int_{P_2}^{P_1} =
k_a\int_{t_1}^{t_2}dt\]
Integrating between the defined limits, we have:
\[P_2-P_1 = k_a(t_2-t_1)\] \[k_a = \frac{P_2-P_1}{t_2-t_1}\]
Using the equation, we arrive at the general expression of the
arithmetic method:
\[P=P_2 + k_n(t-t_2)\]
where t represents the year of the projection.
This method admits that the population varies linearly with time and
can be used for population forecasting for a short period, from 1 to 5
years. For a forecast for a very long period, the discrepancy with
historical reality becomes accentuated, since growth is an unlimited
assumption.
To apply this arithmetic method formula, I will use this function
below.
formula <- function(P2, t2, P0, t0, t) {
Ka <- (P2 - P0) / (t2 - t0)
Pt <- P2 + Ka * (t - t2)
return(Pt)
}
Preparing the R
Environment
First of all, I’m going to load the packages that I’m going to use to
manipulate the data, do the analysis and generate this report.
knitr::opts_chunk$set(cache=TRUE, warning=FALSE, message=FALSE)
library(foreign)
library(lmtest)
library(readxl)
library(writexl)
library(stringi)
library(purrr)
library(tidyverse)
library(knitr)
library(markdown)
library(kableExtra)
library(htmltools)
library(rstatix)
library(emmeans)
The INFOPEN
“Infopen is a statistical information system of the Brazilian
penitentiary system. The system, updated by the managers of the
establishments since 2004, summarizes information about penal
establishments and the prison population. In 2014, DEPEN reformulated
the methodology used, with a view to modernizing the collection
instrument and expand the range of information collected. The treatment
of the data allowed a broad diagnosis of the studied reality, but which
did not exhaust, in any way, all the possibilities of analysis.”
Loading Initial Data
Step by Step
First I’m going to create a dictionary of states that I’m going to
use. I did this in order to standardize the names of the states, as some
tables show the full names, others show only the abbreviations of the
states.
head(state_dict, 20)
## Acre Alagoas Amapá Amazonas
## "AC" "AL" "AP" "AM"
## Bahia Ceará Distrito Federal Espírito Santo
## "BA" "CE" "DF" "ES"
## Goiás Maranhão Mato Grosso Mato Grosso do Sul
## "GO" "MA" "MT" "MS"
## Minas Gerais Pará Paraíba Paraná
## "MG" "PA" "PB" "PR"
## Pernambuco Piauí Rio de Janeiro Rio Grande do Norte
## "PE" "PI" "RJ" "RN"
Here is the list of columns that I will extract from the INFOPEN
tables. I created this list using manipulation with Excel.
Loop through INFOPEN table files and list their names
Match directory to file name
infopen_files <- str_c("INFOPEN/tabelas excel/",infopen_file_name)
Name each vector element
names(infopen_files) <- gsub("\\.xlsx$", "", infopen_file_name)
Apply the read_excel function to each vector element, thus importing
all files at once
infopen<- map_df(.x = infopen_files, .f = read_excel, .id = "data") %>%
select("state" = "UF", date = data, all_of(columns))
Recognizing the
Table
INFOPEN tables present panel data, where each individual is
represented more than once.
Each INFOPEN table contains more than 1300 columns and approximately
1500 rows.
jun_2017 <- read_excel("INFOPEN/tabelas excel/jun 2017.xlsx")
Number of columns: 1332 Number of rows: 1514
After analyzing each table, I decided to filter only the most
interesting columns for my analysis and the result was a table with 8932
rows and 328 columns.
Starting to
manipulate the dataframe
After grouping all the tables and choosing only the columns that I’m
going to use, the next step will be to transform the format from wide to
long. Long format facilitates some manipulations, and wide format
others. In the course of this analysis I will use both formats.
infopen_2_long_format <-infopen%>%
gather(variable , quantity, - c(state,date)) %>%
drop_na()
I will summarize the values so that the repeated lines are removed
and the total of each variable is obtained
infopen_3_summary <- infopen_2_long_format %>%
group_by(state, date, variable) %>%
mutate(date = gsub("dez", "dec", date))%>% ## I needed to use "dec" so that the program understood that it referred to the month of December
summarise(prisoners = sum(quantity, na.rm = TRUE)) %>%
merge(state_region, by = 'state', all.x = TRUE)
Create the Variables
I’m Going to Work With
After summarizing the data and removing the ‘NAs’, it’s time to
separate the data into columns that I will use.
infopen_4 <- infopen_3_summary %>%
rowwise() %>% ## defines the scope of the following operations, to be worked by row and not columns
filter(!str_detect(variable, "not_informed|not_informed|no information"))%>% ## remove variables that will not be needed
mutate( ## here I start to define the columns that I will use. I will extract the new columns from the variable column
gender = case_when(
str_detect(variable, "(female)") ~ "female",
str_detect(variable, "(male)") ~ "male",
TRUE ~ NA_character_),
variable = gsub("_male|_female|", "", variable), ## at this point I need to remove the gender string to avoid conflicts later in the code
ethnicity = ifelse(grepl("ethnicity_", variable),
sub("ethnicity_", "", variable), NA),
ethnicity = if_else(ethnicity == "white", "white",
if_else(ethnicity %in% c("black", "brown"), "black or brown",
ifelse(ethnicity %in% c('yellow','indigenous'), 'yellow or indigenous',NA))),
level_of_education = ifelse(grepl("level_of_education_", variable),
sub("level_of_education_","", variable), NA),
wage = ifelse(grepl("wage_", variable),
sub("wage_","",variable),NA),
age_range = ifelse(grepl("age_range_", variable),
sub("age_range_","",variable),NA))%>%
mutate_at(vars(-prisoners), as.factor) %>%
ungroup() %>%
select("date","region","state", "gender","ethnicity",
"level_of_education", "age_range", "wage","prisoners") %>% ## I used select() only because I would like to view the columns in that order
filter(!is.na(gender))
Generation of the
Tables
Regarding the quantity of prisoners, this is the most reliable table
because not all detention centers are able to collect all data. So, with
the other tables I will work only with the percentage of prisoners in
relation to the total and extract the corresponding value from here.
Table with the
total prison population
prison_population <-infopen_3_summary %>%
filter(str_detect(variable, "prison_population"))%>%
rowwise() %>%
mutate(
gender = case_when(
str_detect(variable, "female") ~ "female",
str_detect(variable, "male") ~ "male",
TRUE ~ NA_character_)) %>%
select(region, state, date, gender, prisoners) %>%
drop_na() %>%
ungroup()
prison_population_2_summary <- prison_population %>%
filter(grepl("^dec", date) | date == "jun 2019") %>% ## after some analysis I decided to use only 1 reference per year, instead of an average of the values.
group_by(region, state, date) %>%
mutate(year = str_replace(date, "\\D*(\\d{4}).*", "\\1")) %>% ## removing the first 4 characters from the values in column 'year'
ungroup() %>%
group_by(year, region, state) %>%
summarise(total_prisoners = sum(prisoners)) %>%
ungroup() %>%
select(year, region, state, total_prisoners)
I’ll just leave this example of code, because for the creation of the
other tables, there is not much difference in relation to the process of
this one. What can change are some punctual adjustments, but nothing
that deserves mention.
infopen_age_range <-infopen_4 %>%
select(region,state,date,gender, age_range, prisoners) %>% ## select columns
mutate(age_range = gsub("_", " ", age_range)) %>% ## remove the "_" to make it easier to read and export to csv
mutate_at(vars(-prisoners), as.factor) %>% ## convert all columns to factor -prisoners
drop_na() ## remove NA
infopen_age_range_2_percentage <- infopen_age_range %>%
filter(grepl("^dec", date) | date == "jun 2019") %>%
group_by(region, state, date) %>%
mutate(year = str_replace(date, "\\D*(\\d{4}).*", "\\1"),
total_prisoners = sum(prisoners, na.rm = TRUE), # total sum of prisoners by region, state, gender and year
percentage_prisoners = round(((prisoners / total_prisoners) * 100),2),
state = as.factor(state),
year = as.character(year)) %>%
ungroup() %>%
select(year, region, state, gender, age_range, percentage_prisoners)
infopen_age_range_3_final <- infopen_age_range_2_percentage %>%
left_join(prison_population_2_summary, by = c("year", "region", "state")) %>%
mutate(prisoners = round(((percentage_prisoners / 100) * total_prisoners), 0)) %>%
select(year, region, state, gender, age_range, prisoners)
infopen_age_range_4 <- infopen_age_range_3_final %>%
group_by(year, age_range) %>%
summarise(prisoners = sum(prisoners)) %>%
mutate(year = as.numeric(year))
INFOPEN Data Visualization
Here are the INFOPEN tables that I will be using. Note that I
combined several tables, rearranged the columns and extracted 5
different tables, with panel data.
Prison
population
|
region
|
state
|
date
|
gender
|
prisoners
|
|
Southeast
|
SP
|
jun 2019
|
male
|
134002
|
|
Southeast
|
SP
|
dec 2018
|
male
|
129255
|
|
Southeast
|
SP
|
jun 2018
|
male
|
124912
|
|
Southeast
|
SP
|
dec 2017
|
male
|
121808
|
|
Southeast
|
SP
|
jun 2017
|
male
|
120332
|
|
Southeast
|
SP
|
dec 2016
|
male
|
119372
|
|
Southeast
|
SP
|
dec 2016
|
male
|
56185
|
|
Southeast
|
SP
|
jun 2017
|
male
|
54000
|
|
Southeast
|
SP
|
dec 2017
|
male
|
51915
|
|
Southeast
|
SP
|
jun 2018
|
male
|
51270
|
Ethnicity
|
year
|
region
|
state
|
ethnicity
|
prisoners
|
|
2019
|
Southeast
|
SP
|
black or brown
|
136560
|
|
2018
|
Southeast
|
SP
|
black or brown
|
132756
|
|
2016
|
Southeast
|
SP
|
black or brown
|
129392
|
|
2017
|
Southeast
|
SP
|
black or brown
|
128026
|
|
2016
|
Southeast
|
SP
|
white
|
100415
|
|
2019
|
Southeast
|
SP
|
white
|
96821
|
|
2017
|
Southeast
|
SP
|
white
|
95929
|
|
2018
|
Southeast
|
SP
|
white
|
94901
|
|
2018
|
Southeast
|
MG
|
black or brown
|
57401
|
|
2019
|
Southeast
|
MG
|
black or brown
|
56458
|
Education
Level
|
year
|
region
|
state
|
gender
|
level_of_education
|
prisoners
|
|
2019
|
Southeast
|
SP
|
male
|
elementary school incomplete
|
99346
|
|
2017
|
Southeast
|
SP
|
male
|
elementary school incomplete
|
98797
|
|
2018
|
Southeast
|
SP
|
male
|
elementary school incomplete
|
97082
|
|
2016
|
Southeast
|
SP
|
male
|
elementary school incomplete
|
96434
|
|
2019
|
Southeast
|
SP
|
male
|
high school incomplete
|
47265
|
|
2018
|
Southeast
|
SP
|
male
|
high school incomplete
|
46693
|
|
2017
|
Southeast
|
SP
|
male
|
high school incomplete
|
43707
|
|
2016
|
Southeast
|
SP
|
male
|
high school incomplete
|
42049
|
|
2018
|
Southeast
|
MG
|
male
|
elementary school incomplete
|
41789
|
|
2019
|
Southeast
|
MG
|
male
|
elementary school incomplete
|
40967
|
Age range
|
year
|
age_range
|
prisoners
|
|
2016
|
18 to 24 years old
|
214624
|
|
2018
|
18 to 24 years old
|
206467
|
|
2019
|
18 to 24 years old
|
204917
|
|
2017
|
18 to 24 years old
|
202629
|
|
2019
|
25 to 29 years old
|
178737
|
|
2018
|
25 to 29 years old
|
173891
|
|
2016
|
25 to 29 years old
|
169540
|
|
2017
|
25 to 29 years old
|
168851
|
|
2019
|
35 to 45 years old
|
157032
|
|
2018
|
35 to 45 years old
|
145968
|
Pay range
|
year
|
region
|
state
|
wage
|
prisoners
|
|
2016
|
Southeast
|
SP
|
between 3/4 and 1 monthly minimum wage
|
230152
|
|
2019
|
Southeast
|
SP
|
less than 3/4 of the monthly minimum wage
|
155026
|
|
2018
|
Southeast
|
SP
|
less than 3/4 of the monthly minimum wage
|
106953
|
|
2018
|
Southeast
|
SP
|
does not receive
|
94809
|
|
2017
|
Southeast
|
RJ
|
between 3/4 and 1 monthly minimum wage
|
51132
|
|
2019
|
Southeast
|
RJ
|
does not receive
|
49260
|
|
2019
|
Southeast
|
SP
|
between 3/4 and 1 monthly minimum wage
|
47639
|
|
2019
|
Southeast
|
MG
|
does not receive
|
46006
|
|
2016
|
Southeast
|
RJ
|
between 3/4 and 1 monthly minimum wage
|
38273
|
|
2016
|
Southeast
|
MG
|
does not receive
|
37727
|
Table IBGE Level of
Education
The purpose of this analysis is to compare data from the prison
population with data from the IBGE, and make a correlation between them.
The data I will use here are part of the National Household Sample
Survey Continues (PNADC) and can be found on the IBGE.
Here I start working on the second table that will be used. This
single table has several sheets that I will extract and manipulate the
data. The table “PNAD_Continua_2018_Educacao.xls” has data regarding the
education of the population. There are several pieces of information,
including: educational level by region, gender and ethnicity. This table
also presents panel data. Yellow and Indigenous are included in the
Total
I’m going to skip the table import part and go directly to the
dataframe.
Visualization of the PNAD Table
|
indicator
|
territorial_level
|
territorial_opening
|
variable_1
|
category_1
|
variable_2
|
category_2
|
2016
|
2017
|
2018
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
Total
|
204325.470
|
205999.691
|
207651.621
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
0 a 3 anos
|
10223.229
|
10141.908
|
10171.730
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
4 e 5 anos
|
5262.563
|
5268.945
|
5350.024
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
6 a 9 anos
|
11100.370
|
10962.806
|
10947.352
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
10 a 14 anos
|
15445.672
|
15363.810
|
15023.146
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
15 a 17 anos
|
10617.588
|
10426.076
|
9752.471
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
18 a 24 anos
|
22234.284
|
22727.774
|
22703.814
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
25 a 29 anos
|
15306.030
|
15138.452
|
14890.647
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
30 a 39 anos
|
32134.993
|
32462.937
|
32597.356
|
|
População (mil pessoas)
|
País
|
Brasil
|
Sexo
|
Total
|
Grupos de idade
|
40 a 59 anos
|
52417.780
|
53172.422
|
54100.608
|
This dataframe gathers data from all tabs of the
“PNAD_Continua_2018_Educacao.xls” file, there is still a lot of
manipulation to be done.
Data
Manipulation
First, I’m going to transpose the data so that I can transform it
into long format, just like in the previous model, with the INFOPEN
table.
pnad_2_long_format <- pivot_longer(pnad, 8:10,
names_to="year",
values_to = "value",
values_drop_na = TRUE)
I’ll multiply the value in the ‘value’ column by 1000 if the
‘indicator’ column contains the string ‘(mil pessoas)’‘(thousand
people)’ and then remove it. Then I’ll create a ‘region’ variable to
store the region of each state.
pnad_3_with_regions <- pnad_2_long_format %>%
mutate(value = ifelse(grepl("(mil pessoas)", indicator), value * 1000, value),
indicator = gsub("\\s*\\(mil pessoas\\)", "", indicator),
region = case_when(territorial_opening %in% c("Acre", "Amazonas", "Amapá", "Pará", "Rondônia", "Roraima", "Tocantins") ~ "North",
territorial_opening %in% c("Maranhão", "Piauí", "Ceará", "Rio Grande do Norte", "Paraíba", "Pernambuco", "Alagoas", "Sergipe", "Bahia") ~ "Northeast",
territorial_opening %in% c("Minas Gerais", "Espírito Santo", "Rio de Janeiro", "São Paulo") ~ "Southeast",
territorial_opening %in% c("Paraná", "Santa Catarina", "Rio Grande do Sul") ~ "South",
territorial_opening %in% c("Mato Grosso", "Mato Grosso do Sul", "Goiás", "Distrito Federal") ~ "Midwest",
TRUE ~ NA_character_))
PNAD table
Population aged 18 or over
I’m going to combine this IBGE table with the first INFOPEN table
that concerns the prison population, thus also being able to correlate
the total number of prisoners with people aged 18 or over, but in a
summarized way.
Here we can have an idea of the data present in this table.
## # A tibble: 6 × 4
## # Groups: year, region [2]
## year region state total
## <chr> <chr> <chr> <dbl>
## 1 2016 Midwest DF 2884713
## 2 2016 Midwest GO 6712470
## 3 2016 Midwest MS 2614076
## 4 2016 Midwest MT 3299360
## 5 2016 North AC 826731
## 6 2016 North AM 3789354
This table has data from 2016 to 2018. The first step will be to
calculate the total number of people for each variable in the year 2019,
using the arithmetic method described at the beginning of this
analysis.
Using Arithmetic
Method to Estimate a Population
I’ll start by transforming this data into a wide format, then I’ll
apply the function with the formula and finally return the table to a
long format.
population_18_years_or_over_3 <- pivot_wider(population_18_years_and_over_2,
names_from = year,
values_from = total)
population_18_years_or_over_4 <- population_18_years_or_over_3 %>%
mutate(
`2019` = round(formula(`2018`,2018,`2016`,2016,2019))
)
population_18_years_or_over_5 <- pivot_longer(population_18_years_or_over_4, cols = -c(state,region),names_to = "year",values_to = "population") %>%
mutate(across(-population, as.factor))
I will now combine this table with the INFOPEN prison population.
|
year
|
region
|
state
|
prisoners
|
population
|
|
2016
|
Midwest
|
DF
|
14958
|
2884713
|
|
2016
|
Midwest
|
GO
|
18626
|
6712470
|
|
2016
|
Midwest
|
MS
|
18320
|
2614076
|
|
2016
|
Midwest
|
MT
|
11642
|
3299360
|
|
2016
|
North
|
AC
|
6100
|
826731
|
|
2016
|
North
|
AM
|
10241
|
3789354
|
|
2016
|
North
|
AP
|
2937
|
786591
|
|
2016
|
North
|
PA
|
14886
|
8281744
|
|
2016
|
North
|
RO
|
12018
|
1705323
|
|
2016
|
North
|
RR
|
2503
|
476787
|
Table PNAD Education
Data
I’m going to repeat basically the same process in the table with data
on the population. This table, however, considers people aged 14 or
over, as can be seen from the indicator.
alphabetization_population <- pnad_3_with_regions %>%
filter(indicator =="Pessoas de 14 anos ou mais de idade",
territorial_level == "Unidade da Federação",
category_1 %in% c("Homem", "Mulher", "Branca", "Preta ou Parda", "Total¹"),
variable_2 == "Nível de instrução",
!(category_2 %in% c("Total"))) %>%
filter(!str_detect(category_1,"Branca|Preta ou Parda|Total¹")) %>%
mutate(year = as.numeric(year),
gender = recode(category_1,
"Homem" = "male",
"Mulher" = "female"),
state = state_dict[as.character(territorial_opening)]) %>%
select(region, state, gender, level_of_education = category_2, year, total = value) %>%
drop_na()
Same process to calculate the population in the year 2019.
alphabetization_population_2 <- pivot_wider(alphabetization_population,
names_from = year,
values_from = total)
alphabetization_population_3 <- alphabetization_population_2 %>%
mutate(
`2019` = round(formula(`2018`,2018,`2016`,2016,2019))
)
alphabetization_population_4 <- pivot_longer(alphabetization_population_3, cols = -c(region:level_of_education),names_to = "year",values_to = "population") %>%
mutate(across(-population, as.factor))
## # A tibble: 6 × 6
## region state gender level_of_education year population
## <fct> <fct> <fct> <fct> <fct> <dbl>
## 1 North RO male No education 2016 51545
## 2 North RO male No education 2017 45943
## 3 North RO male No education 2018 44963
## 4 North RO male No education 2019 41672
## 5 North RO male Incomplete Elementary School (or equival… 2016 265952
## 6 North RO male Incomplete Elementary School (or equival… 2017 277958
As you can imagine, the education level distributions are not
standardized. I’m going to use a function to create this pattern between
the PNAD table and the INFOPEN table.
standardize_level_of_education <- function(grade) {
simplified_grade <- gsub(" \\(or equivalent\\)", "", grade)
recode(simplified_grade,
"No education" = "illiterate",
"Incomplete Elementary School" = "elementary school incomplete",
"Complete Elementary School" = "elementary school complete",
"Incomplete High School" = "high school incomplete",
"Complete High School" = "high school complete",
"Incomplete College/University" = "college or university incomplete",
"Complete College/University" = "college or university complete",
"Literacy without regular courses" = "elementary school incomplete
")
}
after running the function on both tables, here is the result:
PNADC and INFOPEN Standardized
Tables
Literacy of the
population
|
year
|
region
|
state
|
gender
|
level_of_education
|
population
|
|
2016
|
Midwest
|
DF
|
female
|
college or university complete
|
326836
|
|
2016
|
Midwest
|
DF
|
female
|
college or university incomplete
|
81125
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school complete
|
115600
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school incomplete
|
243841
|
|
2016
|
Midwest
|
DF
|
female
|
high school complete
|
361021
|
|
2016
|
Midwest
|
DF
|
female
|
high school incomplete
|
79367
|
|
2016
|
Midwest
|
DF
|
female
|
illiterate
|
36913
|
|
2016
|
Midwest
|
DF
|
male
|
college or university complete
|
269837
|
|
2016
|
Midwest
|
DF
|
male
|
college or university incomplete
|
80959
|
|
2016
|
Midwest
|
DF
|
male
|
elementary school complete
|
112742
|
Literacy of
prisoners
|
year
|
region
|
state
|
gender
|
level_of_education
|
prisoners
|
|
2016
|
Midwest
|
DF
|
female
|
college or university complete
|
10
|
|
2016
|
Midwest
|
DF
|
female
|
college or university incomplete
|
39
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school complete
|
34
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school incomplete
|
317
|
|
2016
|
Midwest
|
DF
|
female
|
high school complete
|
127
|
|
2016
|
Midwest
|
DF
|
female
|
high school incomplete
|
118
|
|
2016
|
Midwest
|
DF
|
female
|
illiterate
|
12
|
|
2016
|
Midwest
|
DF
|
male
|
college or university complete
|
78
|
|
2016
|
Midwest
|
DF
|
male
|
college or university incomplete
|
238
|
|
2016
|
Midwest
|
DF
|
male
|
elementary school complete
|
1496
|
Missing data in
INFOPEN table
I noticed that after all the standardizations, the tables came back
with different number of observations. The
infopen_level_of_education_31_standard table has 1509 observations,
while alphabetization_population_5 has 1512 observations. I decided to
investigate using anti_join and found that the infopen table does not
have the observations of the table created below.
## # A tibble: 3 × 6
## year region state gender level_of_education population
## <fct> <fct> <fct> <fct> <chr> <dbl>
## 1 2016 North RR female college or university complete 30467
## 2 2017 Northeast MA female college or university complete 199776
## 3 2016 Northeast SE female college or university complete 101357
In order not to leave these values blank, I decided to use a simple
average of the number of prisoners in other years for each missing
observation, use this average as the value and only then combine the
PNADC tables with INFOPEN.
Now the INFOPEN table contains 1512 columns, just like the PNAD
table, so I can combine them.
PNADC Table - INFOPEN
Level of Education
|
year
|
region
|
state
|
gender
|
level_of_education
|
prisoners
|
population
|
|
2016
|
Midwest
|
DF
|
female
|
college or university complete
|
10
|
326836
|
|
2016
|
Midwest
|
DF
|
female
|
college or university incomplete
|
39
|
81125
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school complete
|
34
|
115600
|
|
2016
|
Midwest
|
DF
|
female
|
elementary school incomplete
|
317
|
243841
|
|
2016
|
Midwest
|
DF
|
female
|
high school complete
|
127
|
361021
|
|
2016
|
Midwest
|
DF
|
female
|
high school incomplete
|
118
|
79367
|
|
2016
|
Midwest
|
DF
|
female
|
illiterate
|
12
|
36913
|
|
2016
|
Midwest
|
DF
|
male
|
college or university complete
|
78
|
269837
|
|
2016
|
Midwest
|
DF
|
male
|
college or university incomplete
|
238
|
80959
|
|
2016
|
Midwest
|
DF
|
male
|
elementary school complete
|
1496
|
112742
|
IBGE Ethnicity
Table
This Table has the ethnic percentage distribution of the Brazilian
population by state. The file to be worked on here is called
“PNADc/Tabela 1.1 DIST PERCET RACA.xls”, and can be found on the IBGE
website.
I’ll skip the data reading part as it doesn’t differ at all from the
previous tables.
|
year
|
state
|
Total
|
White
|
Black
|
Brown
|
|
2018
|
RO
|
1747.154
|
29.47056
|
6.710325
|
62.40118
|
|
2018
|
AC
|
853.023
|
21.02601
|
5.346175
|
72.31678
|
|
2018
|
AM
|
3921.508
|
16.80872
|
2.989718
|
77.40833
|
|
2018
|
RR
|
513.466
|
23.69004
|
7.674129
|
60.86162
|
|
2018
|
PA
|
8472.029
|
17.83819
|
8.171171
|
72.69580
|
|
2018
|
AP
|
821.545
|
17.42855
|
6.996881
|
74.26081
|
This table has data from 2012 to 2018. I’m going to use the formula
we discussed at the beginning to estimate the population in 2019. I’ll
start by transforming the data in the table, as the number present in
the total column must still be multiplied by 1000, and the ethnicity
values are in percentage in relation to the total.
population_distribution_by_ethnicity_and_region_3 <- population_distribution_by_ethnicity_and_region_2 %>%
mutate(
Total = round(Total*1000),
White = round(White*Total/100),
Black = round(Black*Total/100),
Brown = round(Brown*Total/100))
Finally, the table that we will use to match that of INFOPEN
Ethnic Distribution
of the Brazilian Population
|
year
|
region
|
state
|
ethnicity
|
population
|
|
2016
|
North
|
AC
|
black or brown
|
674372
|
|
2016
|
North
|
AC
|
white
|
149493
|
|
2016
|
Northeast
|
AL
|
black or brown
|
2470246
|
|
2016
|
Northeast
|
AL
|
white
|
788828
|
|
2016
|
North
|
AM
|
black or brown
|
3034052
|
|
2016
|
North
|
AM
|
white
|
679764
|
|
2016
|
North
|
AP
|
black or brown
|
619211
|
|
2016
|
North
|
AP
|
white
|
162565
|
|
2016
|
Northeast
|
BA
|
black or brown
|
11944048
|
|
2016
|
Northeast
|
BA
|
white
|
2608310
|
Missing Observations
in the INFOPEN Table
After manipulating the data from this IBGE table, I will combine it
with the INFOPEN table, in order to correlate the total number of
prisoners and the population for each variable. However, when combining
the dataframes, I discovered that there are missing observations in the
infopen_etnia_3_final table because it has fewer rows than the PNAD
table. I will use anti-join to find them and linear regression to
calculate them
These are the missing observations in the INFOPEN table
head(difference_infopen_population_ethnicity)
## # A tibble: 2 × 4
## # Groups: year, state, region [1]
## year region state ethnicity
## <dbl> <chr> <chr> <chr>
## 1 2019 Northeast SE black or brown
## 2 2019 Northeast SE white
After some calculations, I arrived at this result of predicting
prisoners and each observation:
head(predictions_2019_infopen_ethnicity)
## # A tibble: 2 × 5
## # Groups: region, state, ethnicity [2]
## region state ethnicity prisoners year
## <chr> <chr> <chr> <dbl> <dbl>
## 1 Northeast SE black or brown 5124 2019
## 2 Northeast SE white 457 2019
Now it is enough to combine the tables with data on the ethnicity of
the total Brazilian population with the prison population and then we
will arrive at this table:
PNADC Table - INFOPEN
Ethnicity
|
year
|
region
|
state
|
ethnicity
|
prisoners
|
population
|
|
2016
|
Midwest
|
DF
|
black or brown
|
12357
|
1753738
|
|
2016
|
Midwest
|
DF
|
white
|
2513
|
1113132
|
|
2016
|
Midwest
|
GO
|
black or brown
|
14286
|
4253442
|
|
2016
|
Midwest
|
GO
|
white
|
4266
|
2426334
|
|
2016
|
Midwest
|
MS
|
black or brown
|
12555
|
1452699
|
|
2016
|
Midwest
|
MS
|
white
|
5481
|
1130769
|
|
2016
|
Midwest
|
MT
|
black or brown
|
8900
|
2211143
|
|
2016
|
Midwest
|
MT
|
white
|
2655
|
1076121
|
|
2016
|
North
|
AC
|
black or brown
|
5306
|
674372
|
|
2016
|
North
|
AC
|
white
|
506
|
149493
|
IBGE Age Range
Table
The file to be worked on here is called “Tabela 1.2 DIST POP
ETARIA.xls”, and can be found on the IBGE
website.
This table has data on the age group distribution of the population
by ethnicity. Indigenous people, Asians and people with no
declaration of color or race are included in the total.
|
age_range
|
total
|
cv_total
|
white
|
cv_white
|
black_brown
|
cv_black_brown
|
proportion_white
|
cv_proportion_white
|
proportion_black_brown
|
cv_proportion_black_brown
|
year
|
|
0 to 4 years old
|
13124.30
|
0.88427169197711608
|
6076.469
|
1.451866
|
6939.813
|
1.155815
|
46.29937
|
1.021138
|
52.87758
|
0.8912887
|
2018
|
|
5 to 9 years old
|
13645.48
|
0.85759498658148692
|
5629.184
|
1.409402
|
7899.687
|
1.121951
|
41.25310
|
1.074214
|
57.89233
|
0.7720677
|
2018
|
|
10 to 14 years old
|
14923.04
|
0.77302798278891072
|
5756.714
|
1.359373
|
9039.822
|
1.043748
|
38.57603
|
1.111292
|
60.57629
|
0.7071651
|
2018
|
|
15 to 19 years old
|
16442.07
|
0.75758111621423652
|
6010.282
|
1.296194
|
10293.966
|
1.031182
|
36.55429
|
1.105113
|
62.60748
|
0.6485969
|
2018
|
|
20 to 24 years old
|
16048.18
|
0.75135656586436339
|
6348.342
|
1.308184
|
9541.958
|
1.019381
|
39.55802
|
1.057401
|
59.45820
|
0.7094211
|
2018
|
|
25 to 29 years old
|
15006.06
|
0.83216738688741987
|
6160.098
|
1.441365
|
8686.275
|
1.068971
|
41.05073
|
1.082387
|
57.88510
|
0.7691143
|
2018
|
|
30 to 34 years old
|
16071.92
|
0.84090771846315848
|
6600.026
|
1.448793
|
9274.408
|
1.043940
|
41.06559
|
1.057334
|
57.70568
|
0.7619637
|
2018
|
|
35 to 39 years old
|
16905.90
|
0.82142719564900768
|
7026.611
|
1.517426
|
9688.656
|
1.026723
|
41.56308
|
1.113020
|
57.30932
|
0.8102016
|
2018
|
|
40 to 44 years old
|
15186.72
|
0.78765297599262696
|
6390.305
|
1.356850
|
8621.957
|
1.049632
|
42.07823
|
1.035301
|
56.77299
|
0.7678529
|
2018
|
|
45 to 49 years old
|
13519.07
|
0.83775955165508598
|
5857.937
|
1.412991
|
7506.854
|
1.127709
|
43.33091
|
1.061985
|
55.52788
|
0.8343097
|
2018
|
Like the previous table, this one only has data from 2012 to 2018, so
I will use the same formula to predict the population in 2019.
Standardization of
Age Ranges
As you can see below, although we now have data from 2016 to 2019, the
age groups are not exactly the same as those from INFOPEN, but they are
very close.
|
age_range
|
year
|
population
|
|
25 to 29 years old
|
2018
|
15006064
|
|
25 to 29 years old
|
2017
|
15361348
|
|
25 to 29 years old
|
2016
|
15417271
|
|
25 to 29 years old
|
2019
|
14834679
|
|
30 to 34 years old
|
2018
|
16071915
|
|
30 to 34 years old
|
2017
|
16187827
|
|
30 to 34 years old
|
2016
|
16565123
|
|
30 to 34 years old
|
2019
|
16054589
|
|
35 to 39 years old
|
2018
|
16905898
|
|
35 to 39 years old
|
2017
|
16504662
|
What I’m going to do is create a function that adjusts the age groups
to be in accordance with those of INFOPEN
adjust_age_range <- function(range) {
if (range %in% c("25 to 29 years old")) {
return("25 to 29 years old")
} else if (range %in% c("30 to 34 years old")) {
return("30 to 34 years old")
} else if (range %in% c("35 to 39 years old", "40 to 44 years old")) {
return("35 to 45 years old")
} else if (range %in% c("45 to 49 years old", "50 to 54 years old", "55 to 59 years old")) {
return("46 to 60 years old")
} else if (range %in% c("60 to 64 years old", "65 to 69 years old")) {
return("61 to 70 years old")
} else if (range %in% c("70 to 74 years old", "75 to 79 years old", "80 years old and over")) {
return("over 70 years old")
} else {
return(NA)
}
}
Here you can have a visualization of the table that I have until then.
|
year
|
age_range
|
population
|
|
2016
|
25 to 29 years old
|
15417271
|
|
2016
|
30 to 34 years old
|
16565123
|
|
2016
|
35 to 45 years old
|
30697363
|
|
2016
|
46 to 60 years old
|
37633650
|
|
2016
|
61 to 70 years old
|
16444403
|
|
2016
|
over 70 years old
|
12997738
|
|
2017
|
25 to 29 years old
|
15361348
|
|
2017
|
30 to 34 years old
|
16187827
|
|
2017
|
35 to 45 years old
|
31462107
|
|
2017
|
46 to 60 years old
|
37959837
|
It may be noted that I do not have the 18 to 24 year old population.
I’m going to extract this age range from another PNAD table, which we’ve
worked on before.
population_18_to_24_years <- pnad_4_population_age %>%
filter(grepl("18 a 24 anos", age_group),
grepl("Total¹", ethnicity)) %>%
select(-gender) %>% # I will remove gender to remove duplicates (because I have gender and ethnicity)
rename(age_range = age_group,
population = value)%>%
group_by(year, age_range, ethnicity) %>%
summarise(population = sum(population)) %>%
select(-ethnicity) %>% # finally I remove the ethnicity column that only contains 'Total'
drop_na()
As previously demonstrated, I will use arithmetic to predict the
population in 2019.
Distribution of the
Age Range of the Brazilian Population
Finally, the table with all age groups equal to INFOPEN
|
age_range
|
year
|
population
|
|
18 to 24 years old
|
2016
|
22234284
|
|
25 to 29 years old
|
2016
|
15417271
|
|
30 to 34 years old
|
2016
|
16565123
|
|
35 to 45 years old
|
2016
|
30697363
|
|
46 to 60 years old
|
2016
|
37633650
|
|
61 to 70 years old
|
2016
|
16444403
|
|
over 70 years old
|
2016
|
12997738
|
|
18 to 24 years old
|
2017
|
22727774
|
|
25 to 29 years old
|
2017
|
15361348
|
|
30 to 34 years old
|
2017
|
16187827
|
Now it remains only to combine the age range tables.
population_infopen_age_range <- as.data.frame(left_join(infopen_age_range_4,
population_age_range,
by = join_by(year, age_range))) %>%
mutate(age_range = as.factor(age_range))
PNADC Table - INFOPEN
by Age Group
|
year
|
age_range
|
prisoners
|
population
|
|
2016
|
18 to 24 years old
|
214624
|
22234284
|
|
2016
|
25 to 29 years old
|
169540
|
15417271
|
|
2016
|
30 to 34 years old
|
127187
|
16565123
|
|
2016
|
35 to 45 years old
|
133083
|
30697363
|
|
2016
|
46 to 60 years old
|
49033
|
37633650
|
|
2016
|
61 to 70 years old
|
7527
|
16444403
|
|
2016
|
over 70 years old
|
1376
|
12997738
|
|
2017
|
18 to 24 years old
|
202629
|
22727774
|
|
2017
|
25 to 29 years old
|
168851
|
15361348
|
|
2017
|
30 to 34 years old
|
130889
|
16187827
|
IBGE Income Table
Total population aged
14 and over.
I need this table with the general population over 14 years old, as
the IBGE income table only considers this age group. The table on
education, which we have already used, considers this range of the
population.
Table of Total
Population aged 14 or Over.
|
region
|
state
|
year
|
population
|
|
Midwest
|
DF
|
2016
|
2335338
|
|
Midwest
|
DF
|
2017
|
2391985
|
|
Midwest
|
DF
|
2018
|
2452741
|
|
Midwest
|
DF
|
2019
|
2511443
|
|
Midwest
|
GO
|
2016
|
5384235
|
|
Midwest
|
GO
|
2017
|
5505555
|
|
Midwest
|
GO
|
2018
|
5599123
|
|
Midwest
|
GO
|
2019
|
5706569
|
|
Midwest
|
MS
|
2016
|
2073359
|
|
Midwest
|
MS
|
2017
|
2109297
|
Data Explanation
This table has the income distribution of the Brazilian population.
The IBGE itself released an informative
on the income distribution of the Brazilian population between 2012 and
2019.
I will only work with a fraction of the data available in this table:
income usually received, at average prices and only for people aged 14
and over. According to the IBGE, usual income is defined as follows:
” The usual income consists of the monthly income received by
employees, employers and self-employed workers, without extraordinary
increases or sporadic discounts. For the employee, the monthly income
usually received excludes all installments that are not continuous
(annual bonus, salary late, overtime, annual profit sharing, 13th
salary, 14th salary, salary advance, etc.) and does not consider
occasional discounts (absences, part of the 13th salary anticipated,
possible damage caused to the enterprise, etc.).
If the income received from an employee, self-employed worker and
employer is variable, the usual income is considered to be the average
income received by the person in the period in which he/she carried out
the declared work in the reference week. When remuneration varies
depending on the period or season of the year, the monthly income that
the person usually earns in that seasonal period is considered.” see
it
Data Exploration
This table is very simple. In the ‘class’ column, we have the
percentage class of people by income, and in the other columns, the
usual income of this class of people.
I will use a table already present in the IBGE report to better
exemplify the use of the table
In the first line ‘2012’, in the column ‘More than 80% up to 90%’, we
have the value 3 351, which represents a monthly income of R$ 3,351.00.
That is, 90% of Brazilians receive up to this amount, only 10% receive
more than that.
Data
Manipulating
So that I can standardize the PNAD and INFOPEN income tables, I will
need an adjustment according to the minimum wage. For this I will create
a table with the values of the years 2016 to 2019.
year <- c(2019, 2018, 2017, 2016)
minimum_salary <- c(998.00, 954.00, 937.00, 880.00)
minimum_salary_2016_to_2019 <- data.frame(year, minimum_salary)
This table considers only the percentage of people with some income.
The IBGE considers unemployed people who are looking for work during the
sample period. However, it does not consider people without income who
were not looking for a job as unemployed. This portion of people without
income is the one we are going to deal with here.
To extract this data, I will use the same table already used, which
also has this information. The
‘PNAD_Continua_2019_Rendimento_de_Todas_as_Fontes’ table has the
“Percentage of people with income” as an indicator, so I will extract
‘100%’ from this value and obtain the percentage of people without
income.
percentage_employed <-population_income %>%
filter(`Abertura geográfica` == "Brasil",
Tipo == "Valor",
sub.classe %in% c("Todas as fontes¹" ),
ind == "Percentual de pessoas com rendimento, na população residente") %>%
select(sub.classe, '2016','2017','2018','2019') %>%
unique()
percentage_employed_2_long_format <- pivot_longer(percentage_employed,
cols = c("2016", "2017","2018", "2019"),
names_to="year",
values_to="population_percentage_with_income")
percentage_pp_without_income <- percentage_employed_2_long_format %>%
mutate(population_without_income = (100 - population_percentage_with_income),
income = 0,
wage_range = "does not receive",
year = as.factor(year))
no_income <- left_join(percentage_pp_without_income, population_total_14_years_old_or_over, by = join_by(year)) %>%
mutate(population = (population_without_income*population)/100,) %>%
group_by(year, wage_range) %>%
summarise(population = sum(population)) %>%
select(year, wage_range, population)
Before merging the tables, I still need to standardize the
variables.
# Creating the new column with the categories
population_wage_range_3 <- population_wage_range_2 %>%
mutate(wage_range = case_when(
income >= minimum_salary & income < 2 * minimum_salary ~ "between 1 and 2 monthly minimum wages",
income >= 3/4 * minimum_salary & income < minimum_salary ~ "between 3/4 and 1 monthly minimum wage",
income >= 2 * minimum_salary ~ "over 2 monthly minimum wages",
income > 0 & income< 3/4 * minimum_salary ~ "less than 3/4 of the monthly minimum wage"
)) %>%
select(sub.class, year, population_percentage, income,wage_range)
population_wage_range_4 <-merge(population_wage_range_3,
population_total_14_years_old_or_over, by = "year") %>%
mutate(paid_population = round((population * population_percentage)/100)) %>%
select(year, wage_range, paid_population) %>%
rename(population = paid_population)
population_wage_range_5 <- population_wage_range_4 %>%
group_by(year, wage_range) %>%
summarise(population = sum(population)) %>%
mutate(year = as.factor(year))
# Set the correct order of yields
income_range_order <- c("does not receive",
"less than 3/4 of the monthly minimum wage",
"between 3/4 and 1 monthly minimum wage",
"between 1 and 2 monthly minimum wages",
"over 2 monthly minimum wages")
population_remuneration_6 <- rbind(population_wage_range_5, no_income)%>%
mutate(wage_range = as.factor(wage_range),
wage_range = factor(wage_range, levels = income_range_order))
Finally, an overview of the distribution of income in the
country:
Population
distribution with and without income
|
year
|
wage_range
|
population
|
|
2016
|
does not receive
|
64375850
|
|
2017
|
does not receive
|
65298473
|
|
2018
|
does not receive
|
64819488
|
|
2019
|
does not receive
|
63997726
|
|
2016
|
less than 3/4 of the monthly minimum wage
|
16549064
|
|
2017
|
less than 3/4 of the monthly minimum wage
|
33486396
|
|
2018
|
less than 3/4 of the monthly minimum wage
|
33848303
|
|
2019
|
less than 3/4 of the monthly minimum wage
|
34223380
|
|
2016
|
between 3/4 and 1 monthly minimum wage
|
33098128
|
|
2017
|
between 3/4 and 1 monthly minimum wage
|
16743198
|
Before merging the dataframes, I noticed that the Infopen table does
not have data on prisoner pay in 2017 for the state of Sao Paulo. I will
use linear interpolation (Larson 1988)to
predict this data.
# Subset of data for the state of São Paulo
infopen_sp <- infopen_wage_3_final[infopen_wage_3_final$state == 'SP', ]
Function to predict the missing data on the remuneration of prisoners
in Sao Paulo in 2017
predict_mv <- function(year, prisoners) {
complete_cases <- !is.na(prisoners)
approx(x = as.numeric(year[complete_cases]),
y = prisoners[complete_cases],
xout = as.numeric(year))$y
}
Apply the function for each gender and compensation combination
infopen_sp <- infopen_sp %>%
group_by(wage) %>%
mutate(prisoners = round(predict_mv(year, prisoners))) %>%
ungroup()
Replace the original data for Sao Paulo with the new populated
data
infopen_wage_3_final[infopen_wage_3_final$state == 'SP', ] <- infopen_sp
Finally the final table the estimated amount of prisoners by
remuneration
infopen_wage_4 <- infopen_wage_3_final %>%
group_by(year, wage) %>%
mutate(year = as.factor(year)) %>%
summarise(prisoners = sum(prisoners)) %>%
rename(wage_range = wage)
After all the manipulations, I can finally combine the tables.
PNADC Table - INFOPEN
wage range
|
year
|
wage_range
|
prisoners
|
population
|
|
2016
|
between 1 and 2 monthly minimum wages
|
45996
|
66196256
|
|
2016
|
between 3/4 and 1 monthly minimum wage
|
383948
|
33098128
|
|
2016
|
does not receive
|
174533
|
64375850
|
|
2016
|
less than 3/4 of the monthly minimum wage
|
81645
|
16549064
|
|
2016
|
over 2 monthly minimum wages
|
16286
|
49647190
|
|
2017
|
between 1 and 2 monthly minimum wages
|
40861
|
66972792
|
|
2017
|
between 3/4 and 1 monthly minimum wage
|
289068
|
16743198
|
|
2017
|
does not receive
|
251953
|
65298473
|
|
2017
|
less than 3/4 of the monthly minimum wage
|
120993
|
33486396
|
|
2017
|
over 2 monthly minimum wages
|
2858
|
50229594
|
Analyzes and
Correlations.
Most of the project proposal has already been passed. From this point
on, I focus more on presenting some correlations found in the tables we
set up and present a little above.
I’ll start by creating a column that relates the number of prisoners
to the total population, and then I’ll plot some graphs that illustrate
the correlation between each variable
Ethnicity
Dataframe
The variation in the percentage of prisoners in relation to
population by ethnicity shows that in practically all states, there is a
higher incidence of brown and black prisoners compared to the
population. This does not indicate causality, as there are other factors
that could influence individuals to commit crimes and end up in jail.
However, it is a fact that requires further investigation. It would be
ideal to assess additional variables, such as potential racism within
the judiciary, as well as education and income, as we are doing here. In
the following graphs, I present some correlations between these
variables.

Age Range
Dataframe
Here we can observe a decrease in the rate of prisoners in the age
group of 18 to 24 years over time. This can happen for several reasons,
among them the aging of the prison population. However, if we take all
other age groups, we have a considerable increase in the number of
prisoners in what we call “working age”, which comprises the population
up to 61 years of age. It’s really frustrating to realize that our “Bill
Gates”, “Zuckerbergs”, and “Elon Musks” are behind bars. The population
that should be in college is trapped, by numerous factors, among which
the young age, along with low education and lack of money. It would
really be a dream not to have so many young people arrested.

Education Level
Dataframe
This table shows the distribution of prisoners by level of education.
Clearly, the key turns in incomplete secondary education, since from
then on, the percentage of prisoners over the population drops
drastically. It is no longer a mystery that a population with low
education usually has a high degree of violence as a response, take
countries like norway, netherlands and japan for example where there are
very few prisoners, and compare the level of access to higher education
with that of Brazil.

Incomes
Dataframe
Here we can observe that most of the prison population are people who
receive up to 1 monthly minimum wage. This amount between 3/4 and 1
monthly minimum wage includes several people who receive government aid
such as “Bolsa Família” or others. They cannot be, according to the
IBGE, classified as without income or unemployed.
The Inter-Union Department of Statistics and Socioeconomic Studies
(Dieese), monthly publishes the value of the cost of the Basic Food
Basket which, according to the body, would be “sufficient for the
sustenance and well-being of an adult worker, containing balanced
amounts of protein, calories, iron calcium and phosphorus.(DIEESE 2019a)”. In 2019, the average value of
the national Food Parcel was BRL 422.19, which represents almost half
the minimum wage at the time (BRL 998.00).
### Minimum Wage Required
The Constitution of Brazil, enacted in October 1988, mandates that
the minimum wage should be a legally defined and uniform amount
nationwide. It should be sufficient to meet the basic needs of a worker
and their family, including housing, food, education, health, leisure,
clothing, hygiene, transportation, and social security. The Constitution
also requires periodic adjustments to maintain the purchasing power of
the minimum wage (Article 7, IV of the Federal Constitution of
Brazil).
DIEESE, when calculating the Minimum Necessary Wage, adheres to these
constitutional provisions. They base their calculations on Decree Law
No. 399, which stipulates that the cost of food for an adult worker
should not be lower than the expense of the Basic Food Basket.
In these calculations, DIEESE considers a family model consisting of
two adults and two children, assuming that the children’s consumption is
equivalent to that of an adult.
The method for calculating a family’s food expenses begins with the
cost of the most expensive Basic Food Basket among the 27 Brazilian
capitals, which is then multiplied by three.
(DIEESE 2019b) conducted the Family
Budget Survey (POF) in São Paulo during the period of 94/95. The results
revealed that food accounted for 35.71% of the expenses of families in
the lowest income bracket. By comparing the cost of food for a family
(the most expensive basket multiplied by three) with the proportion of
these families’ budget allocated to food (35.71%), it is possible to
calculate the total budget required to cover other expenses such as
housing, clothing, transportation, and more.
Therefore, the formula for calculating the Minimum Required Wage can
be summarized as follows: \[F.F.C. =
3(CC)\]
\[\frac{F.F.C.}{X} =
\frac{0.3571}{1.00}\] Using rule of 3, we have: \[F.F.C. = X(0.3571)\] so: \[ X = \frac{F.F.C.}{0.3571} \] Where:
F.F.C. = Family Food Cost and C.C. = Cost of the highest value Food
Parcel
The Necessary Minimum Wage, which is calculated monthly as an
assessment of what the current minimum wage should be, also serves as a
tool that workers’ unions use to expose the violation of the
constitutional principle that defines the parameters for determining the
lowest allowable wage. in the country.
We have below the value of what would be the ideal salary of the
worker, provided for by law, to cover all monthly costs of his
residence.
|
Month
|
Minimum Wage
|
Necessary Wage
|
|
December
|
998
|
4342.57
|
|
November
|
998
|
4021.39
|
|
October
|
998
|
3978.63
|
|
September
|
998
|
3980.82
|
|
August
|
998
|
4044.58
|
|
July
|
998
|
4143.55
|
|
June
|
998
|
4214.62
|
|
May
|
998
|
4259.90
|
|
April
|
998
|
4385.75
|
|
March
|
998
|
4277.04
|
Through these data, we can see the discrepancy between the minimum
values and those necessary for the maintenance of the home in Brazil.
The demand for political and economic reforms in Brazil is not recent.
Still in the 1970s, the group “Legião Urbana” already raised protest
with the song “What country is this?”. In the following decade, we can
see the singer Cazuza protesting the song “Brasil”, which clearly would
denounce the nation’s poverty.
The prison population says a lot about the country. Young, poor,
low-educated and dark-skinned people are at the top of the statistics,
which signals an omission on the part of the government. The Penal Code,
in its article 135, describes the crime of omission of help, which
consists of the attitude of failing to help people in a vulnerable
situation, such as abandoned or lost children, disabled people, with
injuries, or in a situation of risk or danger. For that reason, the
government should also be behind bars.
LS0tCnRpdGxlOiAiRGF0YSBNYW5pcHVsYXRpb24gVXNpbmcgUiIKYXV0aG9yOiAiV2V2ZXJzb24gTm9zc2VpcyIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBoaWdobGlnaHQ6IHRleHRtYXRlCiAgICBpbmNsdWRlczoKICAgICAgaW5faGVhZGVyOiAiaGVhZGVyLmh0bWwiCiAgICB0aGVtZTogZmxhdGx5CiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiB5ZXMKICAgICAgc21vb3RoX3Njcm9sbDogbm8KYmlibGlvZ3JhcGh5OiByZWZlcmVuY2lhcy5iaWIKLS0tCgojIFByb2plY3QgcHJvcG9zYWwKICAKVGhlIHB1cnBvc2Ugb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGRlbW9uc3RyYXRlIG15IFIgc2tpbGxzIGluIGRhdGEgbWFuaXB1bGF0aW9uIGFuZCBzdHJ1Y3R1cmluZywgYXMgd2VsbCBhcyBhbiBhbmFseXNpcyBvZiB0aGUgcHJlc2VudGVkIGRhdGEuIFdpdGggdGhhdCBpbiBtaW5kLCBJJ2xsIGxlYXZlIG1vc3Qgb2YgdGhlIGNvZGUgZXhwb3NlZCwgYnV0IG5vdCBhbGwgc28gaXQgZG9lc24ndCBnZXQgdG9vIHJlcGV0aXRpdmUuIEkgbXVzdCBwb2ludCBvdXQgdGhhdCBhbHRob3VnaCBwcmVzZW50IGluIHNvbWUgdGFibGVzLCB0aGUgInllbGxvdyBvciBpbmRpZ2Vub3VzIiBldGhuaWNpdHkgd2lsbCBub3QgYmUgcHJlc2VudGVkIGluIHRoZSBmaW5hbCByZXBvcnQsIHNpbmNlIHRoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiBvdXRsaWVycyBhbmQgdGhhdCBlbmQgdXAgYmlhc2luZyB0aGUgYW5hbHlzaXMuCiAgCkR1cmluZyB0aGUgYW5hbHlzaXMsIEkgd2lsbCBtYWtlIHNldmVyYWwgcG9wdWxhdGlvbiBwcmVkaWN0aW9ucywgYXMgbm90IGFsbCB0YWJsZXMgcHJlc2VudCBkYXRhIGZyb20gMjAxOS4gRm9yIHBvcHVsYXRpb24gcHJlZGljdGlvbiwgSSB3aWxsIGJhc2UgbXlzZWxmIG9uIHRoZSAqYXJpdGhtZXRpYyBtZXRob2QqIHByZXNlbnQgaW4gdGhlIGJvb2sgYnkgTWFyY29zIFZvbiBTcGVybGluZyBbQFZvblNwZXJsaW5nMjAxNF0uCgoqKkFyaXRobWV0aWMgTWV0aG9kKioKICAKVGhpcyBtZXRob2QgYXNzdW1lcyBhIGNvbnN0YW50IGdyb3d0aCByYXRlIGZvciB0aGUgZm9sbG93aW5nIHllYXJzLCBiYXNlZCBvbiBrbm93biBkYXRhLCBmb3IgZXhhbXBsZSwgdGhlIHBvcHVsYXRpb24gb2YgdGhlIGxhc3QgY2Vuc3VzLiBNYXRoZW1hdGljYWxseSwgaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CgokJFxmcmFje2RQfXtkdH0gPSBrX2EkJCAKCndoZXJlIGRQL2R0IHJlcHJlc2VudHMgdGhlIHBvcHVsYXRpb24gY2hhbmdlIChQKSBwZXIgdW5pdCB0aW1lICh0KSwgYW5kIGthIGlzIGEgY29uc3RhbnQuIENvbnNpZGVyaW5nIHRoYXQgUDEgaXMgdGhlIHBvcHVsYXRpb24gb2YgdGhlIHBlbnVsdGltYXRlIGNlbnN1cyAoeWVhciB0MSkgYW5kIFAyLCB0aGUgcG9wdWxhdGlvbiBvZiB0aGUgbGFzdCBjZW5zdXMgKHllYXIgdDIpLCB3ZSBoYXZlOgogIAokJFxpbnRfe1BfMn1ee1BfMX0gPSBrX2FcaW50X3t0XzF9Xnt0XzJ9ZHQkJAoKSW50ZWdyYXRpbmcgYmV0d2VlbiB0aGUgZGVmaW5lZCBsaW1pdHMsIHdlIGhhdmU6CiAgCiQkUF8yLVBfMSA9IGtfYSh0XzItdF8xKSQkCiQka19hID0gXGZyYWN7UF8yLVBfMX17dF8yLXRfMX0kJAoKVXNpbmcgdGhlIGVxdWF0aW9uLCB3ZSBhcnJpdmUgYXQgdGhlIGdlbmVyYWwgZXhwcmVzc2lvbiBvZiB0aGUgYXJpdGhtZXRpYyBtZXRob2Q6CgokJFA9UF8yICsga19uKHQtdF8yKSQkCgp3aGVyZSB0IHJlcHJlc2VudHMgdGhlIHllYXIgb2YgdGhlIHByb2plY3Rpb24uCiAgClRoaXMgbWV0aG9kIGFkbWl0cyB0aGF0IHRoZSBwb3B1bGF0aW9uIHZhcmllcyBsaW5lYXJseSB3aXRoIHRpbWUgYW5kIGNhbiBiZSB1c2VkIGZvciBwb3B1bGF0aW9uIGZvcmVjYXN0aW5nIGZvciBhIHNob3J0IHBlcmlvZCwgZnJvbSAxIHRvIDUgeWVhcnMuIEZvciBhIGZvcmVjYXN0IGZvciBhIHZlcnkgbG9uZyBwZXJpb2QsIHRoZSBkaXNjcmVwYW5jeSB3aXRoIGhpc3RvcmljYWwgcmVhbGl0eSBiZWNvbWVzIGFjY2VudHVhdGVkLCBzaW5jZSBncm93dGggaXMgYW4gdW5saW1pdGVkIGFzc3VtcHRpb24uCiAgClRvIGFwcGx5IHRoaXMgYXJpdGhtZXRpYyBtZXRob2QgZm9ybXVsYSwgSSB3aWxsIHVzZSB0aGlzIGZ1bmN0aW9uIGJlbG93LgoKYGBge3IgZm9ybXVsYSBhcml0aG1ldGljIG1ldGhvZH0KZm9ybXVsYSA8LSBmdW5jdGlvbihQMiwgdDIsIFAwLCB0MCwgdCkgewogIEthIDwtIChQMiAtIFAwKSAvICh0MiAtIHQwKQogIFB0IDwtIFAyICsgS2EgKiAodCAtIHQyKQogIHJldHVybihQdCkKfQpgYGAKCgojIyBQcmVwYXJpbmcgdGhlIFIgRW52aXJvbm1lbnQKCkZpcnN0IG9mIGFsbCwgSSdtIGdvaW5nIHRvIGxvYWQgdGhlIHBhY2thZ2VzIHRoYXQgSSdtIGdvaW5nIHRvIHVzZSB0byBtYW5pcHVsYXRlIHRoZSBkYXRhLCBkbyB0aGUgYW5hbHlzaXMgYW5kIGdlbmVyYXRlIHRoaXMgcmVwb3J0LgpgYGB7ciBQYWNrZXQgTG9hZGluZywgbWVzc2FnZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoY2FjaGU9VFJVRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSkKbGlicmFyeShmb3JlaWduKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkod3JpdGV4bCkKbGlicmFyeShzdHJpbmdpKQpsaWJyYXJ5KHB1cnJyKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShrbml0cikKbGlicmFyeShtYXJrZG93bikKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGh0bWx0b29scykKbGlicmFyeShyc3RhdGl4KQpsaWJyYXJ5KGVtbWVhbnMpCgpgYGAKCiMgVGhlIElORk9QRU4KICAKIkluZm9wZW4gaXMgYSBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbiBzeXN0ZW0gb2YgdGhlIEJyYXppbGlhbiBwZW5pdGVudGlhcnkgc3lzdGVtLiBUaGUgc3lzdGVtLCB1cGRhdGVkIGJ5IHRoZSBtYW5hZ2VycyBvZiB0aGUgZXN0YWJsaXNobWVudHMgc2luY2UgMjAwNCwgc3VtbWFyaXplcyBpbmZvcm1hdGlvbiBhYm91dCBwZW5hbCBlc3RhYmxpc2htZW50cyBhbmQgdGhlIHByaXNvbiBwb3B1bGF0aW9uLiBJbiAyMDE0LCBERVBFTiByZWZvcm11bGF0ZWQgdGhlIG1ldGhvZG9sb2d5IHVzZWQsIHdpdGggYSB2aWV3IHRvIG1vZGVybml6aW5nIHRoZSBjb2xsZWN0aW9uIGluc3RydW1lbnQgYW5kIGV4cGFuZCB0aGUgcmFuZ2Ugb2YgaW5mb3JtYXRpb24gY29sbGVjdGVkLiBUaGUgdHJlYXRtZW50IG9mIHRoZSBkYXRhIGFsbG93ZWQgYSBicm9hZCBkaWFnbm9zaXMgb2YgdGhlIHN0dWRpZWQgcmVhbGl0eSwgYnV0IHdoaWNoIGRpZCBub3QgZXhoYXVzdCwgaW4gYW55IHdheSwgYWxsIHRoZSBwb3NzaWJpbGl0aWVzIG9mIGFuYWx5c2lzLiIKCiMjIExvYWRpbmcgSW5pdGlhbCBEYXRhIFN0ZXAgYnkgU3RlcAoKRmlyc3QgSSdtIGdvaW5nIHRvIGNyZWF0ZSBhIGRpY3Rpb25hcnkgb2Ygc3RhdGVzIHRoYXQgSSdtIGdvaW5nIHRvIHVzZS4gSSBkaWQgdGhpcyBpbiBvcmRlciB0byBzdGFuZGFyZGl6ZSB0aGUgbmFtZXMgb2YgdGhlIHN0YXRlcywgYXMgc29tZSB0YWJsZXMgc2hvdyB0aGUgZnVsbCBuYW1lcywgb3RoZXJzIHNob3cgb25seSB0aGUgYWJicmV2aWF0aW9ucyBvZiB0aGUgc3RhdGVzLgoKYGBgIHtyIHN0YXRlcyBkaWN0aW9uYXJpZXMsIGluY2x1ZGUgPSBGQUxTRX0Kc3RhdGVfZGljdCA8LSBjKCJBY3JlIiA9ICJBQyIsCiAgICAgICAgICAgICAiQWxhZ29hcyIgPSAiQUwiLAogICAgICAgICAgICAgIkFtYXDDoSIgPSAiQVAiLAogICAgICAgICAgICAgIkFtYXpvbmFzIiA9ICJBTSIsCiAgICAgICAgICAgICAiQmFoaWEiID0gIkJBIiwKICAgICAgICAgICAgICJDZWFyw6EiID0gIkNFIiwKICAgICAgICAgICAgICJEaXN0cml0byBGZWRlcmFsIiA9ICJERiIsCiAgICAgICAgICAgICAiRXNww61yaXRvIFNhbnRvIiA9ICJFUyIsCiAgICAgICAgICAgICAiR29pw6FzIiA9ICJHTyIsCiAgICAgICAgICAgICAiTWFyYW5ow6NvIiA9ICJNQSIsCiAgICAgICAgICAgICAiTWF0byBHcm9zc28iID0gIk1UIiwKICAgICAgICAgICAgICJNYXRvIEdyb3NzbyBkbyBTdWwiID0gIk1TIiwKICAgICAgICAgICAgICJNaW5hcyBHZXJhaXMiID0gIk1HIiwKICAgICAgICAgICAgICJQYXLDoSIgPSAiUEEiLAogICAgICAgICAgICAgIlBhcmHDrWJhIiA9ICJQQiIsCiAgICAgICAgICAgICAiUGFyYW7DoSIgPSAiUFIiLAogICAgICAgICAgICAgIlBlcm5hbWJ1Y28iID0gIlBFIiwKICAgICAgICAgICAgICJQaWF1w60iID0gIlBJIiwKICAgICAgICAgICAgICJSaW8gZGUgSmFuZWlybyIgPSAiUkoiLAogICAgICAgICAgICAgIlJpbyBHcmFuZGUgZG8gTm9ydGUiID0gIlJOIiwKICAgICAgICAgICAgICJSaW8gR3JhbmRlIGRvIFN1bCIgPSAiUlMiLAogICAgICAgICAgICAgIlJvbmTDtG5pYSIgPSAiUk8iLAogICAgICAgICAgICAgIlJvcmFpbWEiID0gIlJSIiwKICAgICAgICAgICAgICJTYW50YSBDYXRhcmluYSIgPSAiU0MiLAogICAgICAgICAgICAgIlPDo28gUGF1bG8iID0gIlNQIiwKICAgICAgICAgICAgICJTZXJnaXBlIiA9ICJTRSIsCiAgICAgICAgICAgICAiVG9jYW50aW5zIiA9ICJUTyIpCgpzdGF0ZV9yZWdpb24gPC0gZGF0YS5mcmFtZSgKICBzdGF0ZSA9IGMoIlJPIiwgIkFDIiwgIkFNIiwgIlJSIiwgIlBBIiwgIkFQIiwgIlRPIiwgIk1BIiwgIlBJIiwgIkNFIiwgIlJOIiwgIlBCIiwgIlBFIiwgIkFMIiwgIlNFIiwgIkJBIiwgIk1HIiwgIkVTIiwgIlJKIiwgIlNQIiwgIlBSIiwgIlNDIiwgIlJTIiwgIk1TIiwgIk1UIiwgIkdPIiwgIkRGIiksCiAgcmVnaW9uID0gYyhyZXAoIk5vcnRoIiwgNyksIHJlcCgiTm9ydGhlYXN0IiwgOSksIHJlcCgiU291dGhlYXN0IiwgNCksIHJlcCgiU291dGgiLCAzKSwgcmVwKCJNaWR3ZXN0IiwgNCkpCikKYGBgCgpgYGB7ciBoZWFkIHN0YXRlX2RpY3R9CmhlYWQoc3RhdGVfZGljdCwgMjApCmBgYAoKSGVyZSBpcyB0aGUgbGlzdCBvZiBjb2x1bW5zIHRoYXQgSSB3aWxsIGV4dHJhY3QgZnJvbSB0aGUgSU5GT1BFTiB0YWJsZXMuIEkgY3JlYXRlZCB0aGlzIGxpc3QgdXNpbmcgbWFuaXB1bGF0aW9uIHdpdGggRXhjZWwuCgpgYGB7ciBjb2x1bW5zIGZvciBJTkZPUEVOLCBpbmNsdWRlID0gRkFMU0V9CmNvbHVtbnMgPC0gYyhwcmlzb25fcG9wdWxhdGlvbl9wcm92aXNpb25hbF9wcmlzb25lcnNfd2l0aG91dF9zZW50ZW5jZV9zdGF0ZV9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX2ZlZGVyYWxfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX2ZlZGVyYWxfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9wcm92aXNpb25hbF9wcmlzb25lcnNfd2l0aG91dF9zZW50ZW5jZV9vdGhlcl9qdXN0X2NpdmlsX3dvcmtfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHByb3Zpc8OzcmlvcyAoc2VtIGNvbmRlbmHDp8OjbykgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX290aGVyX2p1c3RfY2l2aWxfd29ya19mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBwcm92aXPDs3Jpb3MgKHNlbSBjb25kZW5hw6fDo28pIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3Byb3Zpc2lvbmFsX3ByaXNvbmVyc193aXRob3V0X3NlbnRlbmNlX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3MgcHJvdmlzw7NyaW9zIChzZW0gY29uZGVuYcOnw6NvKSB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRXN0YWR1YWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBKdXN0acOnYSBFc3RhZHVhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJfY2xvc2VkX3JlZ2ltZV9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyX2Nsb3NlZF9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgSnVzdGnDp2EgRmVkZXJhbCBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJfY2xvc2VkX3JlZ2ltZV9vdGhlcmp1c3RfY2l2aWxfd29ya19tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX290aGVyanVzdF9jaXZpbF93b3JrX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBmZWNoYWRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcl9jbG9zZWRfcmVnaW1lX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGZlY2hhZG8gfCBUb3RhbCIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfc2VtaV9vcGVuX3JlZ2ltZV9zdGF0ZV9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfc2VtaV9vcGVuX3JlZ2ltZV9zdGF0ZV9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgUHJlc29zIHNlbnRlbmNpYWRvcyAtIHJlZ2ltZSBzZW1pYWJlcnRvIHwgSnVzdGnDp2EgRXN0YWR1YWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9zZW1pX29wZW5fcmVnaW1lX2ZlZGVyYWxfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfb3RoZXJfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9zZW1pX29wZW5fcmVnaW1lX290aGVyX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIHNlbWlhYmVydG8gfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3NlbWlfb3Blbl9yZWdpbWVfdG90YWwJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgc2VtaWFiZXJ0byB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcnNfb3Blbl9yZWdpbWVfc3RhdGVfanVzdGljZV9tYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJzX29wZW5fcmVnaW1lX3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlbnRlbmNlZF9wcmlzb25lcnNfb3Blbl9yZWdpbWVfZmVkZXJhbF9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgSnVzdGnDp2EgRmVkZXJhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyc19vcGVuX3JlZ2ltZV9mZWRlcmFsX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VudGVuY2VkX3ByaXNvbmVyc19vcGVuX3JlZ2ltZV9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfcHJpc29uZXJzX29wZW5fcmVnaW1lX290aGVyX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBQcmVzb3Mgc2VudGVuY2lhZG9zIC0gcmVnaW1lIGFiZXJ0byB8IE91dHJvcyhKdXN0LiBUcmFiLiwgY8OtdmVsKSBGZW1pbmlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZW50ZW5jZWRfb3Blbl9yZWdpbWVfdG90YWwJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IFByZXNvcyBzZW50ZW5jaWFkb3MgLSByZWdpbWUgYWJlcnRvIHwgVG90YWwiCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9pbnRlcm5tZW50X3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBFc3RhZHVhbCBNYXNjdWxpbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9pbnRlcm5tZW50X3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIGludGVybmHDp8OjbyB8IEp1c3Rpw6dhIEVzdGFkdWFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF9zdGF0ZV9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBGZWRlcmFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2ludGVybm1lbnRfc3RhdGVfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBKdXN0acOnYSBGZWRlcmFsIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2ludGVybm1lbnRfb3RoZXJfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gaW50ZXJuYcOnw6NvIHwgT3V0cm9zKEp1c3QuIFRyYWIuLCBjw612ZWwpIEZlbWluaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfaW50ZXJubWVudF90b3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSBpbnRlcm5hw6fDo28gfCBUb3RhbCIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2FtYnVsYXRvcnlfdHJlYXRtZW50X3N0YXRlX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEVzdGFkdWFsIE1hc2N1bGlubyIJLApwcmlzb25fcG9wdWxhdGlvbl9zZWN1cml0eV9tZWFzdXJlX2FtYnVsYXRvcnlfdHJlYXRtZW50X3N0YXRlX2p1c3RpY2VfZmVtYWxlCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBNZWRpZGEgZGUgc2VndXJhbsOnYSAtIHRyYXRhbWVudG8gYW1idWxhdG9yaWFsIHwgSnVzdGnDp2EgRXN0YWR1YWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF9mZWRlcmFsX2p1c3RpY2VfbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEZlZGVyYWwgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfYW1idWxhdG9yeV90cmVhdG1lbnRfZmVkZXJhbF9qdXN0aWNlX2ZlbWFsZQk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IEp1c3Rpw6dhIEZlZGVyYWwgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF9vdGhlcl9qdXN0aWNlX21hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgTWFzY3VsaW5vIgksCnByaXNvbl9wb3B1bGF0aW9uX3NlY3VyaXR5X21lYXN1cmVfYW1idWxhdG9yeV90cmVhdG1lbnRfb3RoZXJfanVzdGljZV9mZW1hbGUJPQkiNC4xIFBvcHVsYcOnw6NvIHByaXNpb25hbCB8IE1lZGlkYSBkZSBzZWd1cmFuw6dhIC0gdHJhdGFtZW50byBhbWJ1bGF0b3JpYWwgfCBPdXRyb3MoSnVzdC4gVHJhYi4sIGPDrXZlbCkgRmVtaW5pbm8iCSwKcHJpc29uX3BvcHVsYXRpb25fc2VjdXJpdHlfbWVhc3VyZV9hbWJ1bGF0b3J5X3RyZWF0bWVudF90b3RhbAk9CSI0LjEgUG9wdWxhw6fDo28gcHJpc2lvbmFsIHwgTWVkaWRhIGRlIHNlZ3VyYW7Dp2EgLSB0cmF0YW1lbnRvIGFtYnVsYXRvcmlhbCB8IFRvdGFsIgksCnByaXNvbl9wb3B1bGF0aW9uX3RvdGFsCT0JIjQuMSBQb3B1bGHDp8OjbyBwcmlzaW9uYWwgfCBUb3RhbCIJLAphZ2VfcmFuZ2VfMThfdG9fMjRfeWVhcnNfb2xkX21hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAxOCBhIDI0IGFub3MgfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlXzE4X3RvXzI0X3llYXJzX29sZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAxOCBhIDI0IGFub3MgfCBGZW1pbmlubyIJLAphZ2VfcmFuZ2VfMThfdG9fMjRfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMTggYSAyNCBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlXzI1X3RvXzI5X3llYXJzX29sZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgTWFzY3VsaW5vIgksCmFnZV9yYW5nZV8yNV90b18yOV95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMjUgYSAyOSBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlXzI1X3RvXzI5X3llYXJzX29sZF90b3RhbAk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDI1IGEgMjkgYW5vcyB8IFRvdGFsIgksCmFnZV9yYW5nZV8zMF90b18zNF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDMwIGEgMzQgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2VfMzBfdG9fMzRfeWVhcnNfb2xkX2ZlbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDMwIGEgMzQgYW5vcyB8IEZlbWluaW5vIgksCmFnZV9yYW5nZV8zMF90b18zNF95ZWFyc19vbGRfdG90YWwJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzMCBhIDM0IGFub3MgfCBUb3RhbCIJLAphZ2VfcmFuZ2VfMzVfdG9fNDVfeWVhcnNfb2xkX21hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzNSBhIDQ1IGFub3MgfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlXzM1X3RvXzQ1X3llYXJzX29sZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCAzNSBhIDQ1IGFub3MgfCBGZW1pbmlubyIJLAphZ2VfcmFuZ2VfMzVfdG9fNDVfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgMzUgYSA0NSBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlXzQ2X3RvXzYwX3llYXJzX29sZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgTWFzY3VsaW5vIgksCmFnZV9yYW5nZV80Nl90b182MF95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgNDYgYSA2MCBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlXzQ2X3RvXzYwX3llYXJzX29sZF90b3RhbAk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDQ2IGEgNjAgYW5vcyB8IFRvdGFsIgksCmFnZV9yYW5nZV82MV90b183MF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDYxIGEgNzAgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2VfNjFfdG9fNzBfeWVhcnNfb2xkX2ZlbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IDYxIGEgNzAgYW5vcyB8IEZlbWluaW5vIgksCmFnZV9yYW5nZV82MV90b183MF95ZWFyc19vbGRfdG90YWwJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCA2MSBhIDcwIGFub3MgfCBUb3RhbCIJLAphZ2VfcmFuZ2Vfb3Zlcl83MF95ZWFyc19vbGRfbWFsZQk9CSI1LjEgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZmFpeGEgZXTDoXJpYSB8IE1haXMgZGUgNzAgYW5vcyB8IE1hc2N1bGlubyIJLAphZ2VfcmFuZ2Vfb3Zlcl83MF95ZWFyc19vbGRfZmVtYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTWFpcyBkZSA3MCBhbm9zIHwgRmVtaW5pbm8iCSwKYWdlX3JhbmdlX21vcmVfb2ZfNzBfeWVhcnNfb2xkX3RvdGFsCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTWFpcyBkZSA3MCBhbm9zIHwgVG90YWwiCSwKYWdlX3JhbmdlX25vdF9pbmZvcm1lZF9tYWxlCT0JIjUuMSBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBmYWl4YSBldMOhcmlhIHwgTsOjbyBpbmZvcm1hZG8gfCBNYXNjdWxpbm8iCSwKYWdlX3JhbmdlX25vdF9pbmZvcm1lZF9mZW1hbGUJPQkiNS4xIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGZhaXhhIGV0w6FyaWEgfCBOw6NvIGluZm9ybWFkbyB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV93aGl0ZV9tYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEJyYW5jYSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfd2hpdGVfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEJyYW5jYSB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV93aGl0ZV90b3RhbAk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBCcmFuY2EgfCBUb3RhbCIJLApldGhuaWNpdHlfYmxhY2tfbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQcmV0YSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfYmxhY2tfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgRmVtaW5pbm8iCSwKZXRobmljaXR5X2JsYWNrX3RvdGFsCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IFByZXRhIHwgVG90YWwiCSwKZXRobmljaXR5X2Jyb3duX21hbGUJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgUGFyZGEgfCBNYXNjdWxpbm8iCSwKZXRobmljaXR5X2Jyb3duX2ZlbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQYXJkYSB8IEZlbWluaW5vIgksCmV0aG5pY2l0eV9icm93bl90b3RhbAk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBQYXJkYSB8IFRvdGFsIgksCmV0aG5pY2l0eV95ZWxsb3dfbWFsZQk9CSI1LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgY29yIGRlIHBlbGUvcmHDp2EvZXRuaWEgfCBBbWFyZWxhIHwgTWFzY3VsaW5vIgksCmV0aG5pY2l0eV95ZWxsb3dfZmVtYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEFtYXJlbGEgfCBGZW1pbmlubyIJLApldGhuaWNpdHlfeWVsbG93X3RvdGFsCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEFtYXJlbGEgfCBUb3RhbCIJLApldGhuaWNpdHlfaW5kaWdlbm91c19tYWxlCT0JIjUuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBjb3IgZGUgcGVsZS9yYcOnYS9ldG5pYSB8IEluZMOtZ2VuYSB8IE1hc2N1bGlubyIJLApldGhuaWNpdHlfaW5kaWdlbm91c19mZW1hbGUJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgSW5kw61nZW5hIHwgRmVtaW5pbm8iCSwKZXRobmljaXR5X2luZGlnZW5vdXNfdG90YWwJPQkiNS4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGNvciBkZSBwZWxlL3Jhw6dhL2V0bmlhIHwgSW5kw61nZW5hIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2lsbGl0ZXJhdGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFuYWxmYWJldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2lsbGl0ZXJhdGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQW5hbGZhYmV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9pbGxpdGVyYXRlX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQW5hbGZhYmV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9saXRlcmF0ZV93aXRob3V0X3JlZ3VsYXJfY291cnNlc19tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQWxmYWJldGl6YWRvIChzZW0gY3Vyc29zIHJlZ3VsYXJlcykgfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2xpdGVyYXRlX3dpdGhvdXRfcmVndWxhcl9jb3Vyc2VzX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEFsZmFiZXRpemFkbyAoc2VtIGN1cnNvcyByZWd1bGFyZXMpIHwgRmVtaW5pbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2xpdGVyYXRlX3dpdGhvdXRfcmVndWxhcl9jb3Vyc2VzX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgQWxmYWJldGl6YWRvIChzZW0gY3Vyc29zIHJlZ3VsYXJlcykgfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWxlbWVudGFyeV9zY2hvb2xfaW5jb21wbGV0ZV9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIEZ1bmRhbWVudGFsIEluY29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIEZ1bmRhbWVudGFsIEluY29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWxlbWVudGFyeV9zY2hvb2xfaW5jb21wbGV0ZV90b3RhbAk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBJbmNvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2NvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gRnVuZGFtZW50YWwgQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2VsZW1lbnRhcnlfc2Nob29sX2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lbGVtZW50YXJ5X3NjaG9vbF9jb21wbGV0ZV90b3RhbAk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBGdW5kYW1lbnRhbCBDb21wbGV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9oaWdoX3NjaG9vbF9pbmNvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIEluY29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIE3DqWRpbyBJbmNvbXBsZXRvIHwgRmVtaW5pbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2luY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIEluY29tcGxldG8gfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25faGlnaF9zY2hvb2xfY29tcGxldGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gQ29tcGxldG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2hpZ2hfc2Nob29sX2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBNw6lkaW8gQ29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25faGlnaF9zY2hvb2xfY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gTcOpZGlvIENvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX2NvbGxlZ2Vfb3JfdW5pdmVyc2l0eV9pbmNvbXBsZXRlX21hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgSW5jb21wbGV0byB8IE1hc2N1bGlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2luY29tcGxldGVfZmVtYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIFN1cGVyaW9yIEluY29tcGxldG8gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2luY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgSW5jb21wbGV0byB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9jb2xsZWdlX29yX3VuaXZlcnNpdHlfY29tcGxldGVfbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IE1hc2N1bGlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBTdXBlcmlvciBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9jb2xsZWdlX29yX3VuaXZlcnNpdHlfY29tcGxldGVfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBFbnNpbm8gU3VwZXJpb3IgQ29tcGxldG8gfCBUb3RhbCIJLApsZXZlbF9vZl9lZHVjYXRpb25fZWR1Y2F0aW9uX2Fib3ZlX2NvbGxlZ2Vfb3JfdW5pdmVyc2l0eV9jb21wbGV0ZV9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgTWFzY3VsaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lZHVjYXRpb25fYWJvdmVfY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX2ZlbWFsZQk9CSI1LjYgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgZ3JhdSBkZSBpbnN0cnXDp8OjbyB8IEVuc2lubyBhY2ltYSBkZSBTdXBlcmlvciBDb21wbGV0byB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9lZHVjYXRpb25fYWJvdmVfY29sbGVnZV9vcl91bml2ZXJzaXR5X2NvbXBsZXRlX3RvdGFsCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgRW5zaW5vIGFjaW1hIGRlIFN1cGVyaW9yIENvbXBsZXRvIHwgVG90YWwiCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX25vdF9pbmZvcm1lZF9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTsOjbyBJbmZvcm1hZG8gfCBNYXNjdWxpbm8iCSwKbGV2ZWxfb2ZfZWR1Y2F0aW9uX25vdF9pbmZvcm1lZF9mZW1hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBOw6NvIEluZm9ybWFkbyB8IEZlbWluaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9ub3RfaW5mb3JtZWRfdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBOw6NvIEluZm9ybWFkbyB8IFRvdGFsIgksCmxldmVsX29mX2VkdWNhdGlvbl9tYWxlCT0JIjUuNiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciBncmF1IGRlIGluc3RydcOnw6NvIHwgTWFzY3VsaW5vIgksCmxldmVsX29mX2VkdWNhdGlvbl9mZW1hbGUJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBGZW1pbmlubyIJLApsZXZlbF9vZl9lZHVjYXRpb25fdG90YWwJPQkiNS42IFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIGdyYXUgZGUgaW5zdHJ1w6fDo28gfCBUb3RhbCIJLAp0aW1lX29mX3NlbnRlbmNlX3VwX3RvXzZfbW9udGhzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2VfdXBfdG9fNl9tb250aHNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IEF0w6kgNiBtZXNlcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl82X21vbnRoc191cF90b18xX3llYXJfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDYgbWVzZXMgYXTDqSAxIGFubyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfNl9tb250aHNfdXBfdG9fMV95ZWFyX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDYgbWVzZXMgYXTDqSAxIGFubyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xX3llYXJfdXBfdG9fMl95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMSBhbm8gYXTDqSAyIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzFfeWVhcl91cF90b18yX3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDEgYW5vIGF0w6kgMiBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzJfdXBfdG9fNF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMiBhdMOpIDQgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMl91cF90b180X3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDIgYXTDqSA0IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfNF91cF90b184X3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA0IGF0w6kgOCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl80X3VwX3RvXzhfeWVhcnNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl84X3VwX3RvXzE1X3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA4IGF0w6kgMTUgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfOF91cF90b18xNV95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA4IGF0w6kgMTUgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xNV91cF90b18yMF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl8xNV91cF90b18yMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxNSBhdMOpIDIwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMjBfdXBfdG9fMzBfeWVhcnNfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDIwIGF0w6kgMzAgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX29mX3NlbnRlbmNlX292ZXJfMjBfdXBfdG9fMzBfeWVhcnNfZmVtYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMjAgYXTDqSAzMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzMwX3VwX3RvXzUwX3llYXJzX21hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzMwX3VwX3RvXzUwX3llYXJzX2ZlbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDMwIGF0w6kgNTAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfb2Zfc2VudGVuY2Vfb3Zlcl81MF91cF90b18xMDBfeWVhcnNfbWFsZQk9CSI1LjEyIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIHRvdGFsIGRlIHBlbmFzIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlICkgfCBNYWlzIGRlIDUwIGF0w6kgMTAwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzUwX3VwX3RvXzEwMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSA1MCBhdMOpIDEwMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzEwMF95ZWFyc19tYWxlCT0JIjUuMTIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gdG90YWwgZGUgcGVuYXMgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUgKSB8IE1haXMgZGUgMTAwIGFub3MgfCBNYXNjdWxpbm8iCSwKdGltZV9vZl9zZW50ZW5jZV9vdmVyXzEwMF95ZWFyc19mZW1hbGUJPQkiNS4xMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyB0b3RhbCBkZSBwZW5hcyAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSApIHwgTWFpcyBkZSAxMDAgYW5vcyB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX3VwX3RvXzZfbW9udGhzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBBdMOpIDYgbWVzZXMgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2VfdXBfdG9fNl9tb250aHNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgQXTDqSA2IG1lc2VzIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl82X21vbnRoc191cF90b18xX3llYXJfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfNl9tb250aHNfdXBfdG9fMV95ZWFyX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNiBtZXNlcyBhdMOpIDEgYW5vIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8xX3VwX3RvXzJfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMSBhbm8gYXTDqSAyIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8xX3VwX3RvXzJfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAxIGFubyBhdMOpIDIgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMl91cF90b180X3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDIgYXTDqSA0IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yX3VwX3RvXzRfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAyIGF0w6kgNCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl80X3VwX3RvXzhfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNCBhdMOpIDggYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzRfdXBfdG9fOF95ZWFyc19mZW1hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDQgYXTDqSA4IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzhfdXBfdG9fMTVfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl84X3VwX3RvXzE1X3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgOCBhdMOpIDE1IGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzE1X3VwX3RvXzIwX3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDE1IGF0w6kgMjAgYW5vcyAoaW5jbHVzaXZlKSB8IE1hc2N1bGlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzE1X3VwX3RvXzIwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTUgYXTDqSAyMCBhbm9zIChpbmNsdXNpdmUpIHwgRmVtaW5pbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yMF91cF90b18zMF95ZWFyc19tYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAyMCBhdMOpIDMwIGFub3MgKGluY2x1c2l2ZSkgfCBNYXNjdWxpbm8iCSwKdGltZV9yZW1haW5pbmdfb2Zfc2VudGVuY2Vfb3Zlcl8yMF91cF90b18zMF95ZWFyc19mZW1hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDIwIGF0w6kgMzAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMzBfdXBfdG9fNTBfeWVhcnNfbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMzAgYXTDqSA1MCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMzBfdXBfdG9fNTBfeWVhcnNfZmVtYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSAzMCBhdMOpIDUwIGFub3MgKGluY2x1c2l2ZSkgfCBGZW1pbmlubyIJLAp0aW1lX3JlbWFpbmluZ19vZl9zZW50ZW5jZV9vdmVyXzUwX3VwX3RvXzEwMF95ZWFyc19tYWxlCT0JIjUuMTMgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgdGVtcG8gZGUgcGVuYSByZW1hbmVzY2VudGUgKHByZXNvcy9hcyBjb25kZW5hZG9zL2FzIGUpIHwgTWFpcyBkZSA1MCBhdMOpIDEwMCBhbm9zIChpbmNsdXNpdmUpIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfNTBfdXBfdG9fMTAwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgNTAgYXTDqSAxMDAgYW5vcyAoaW5jbHVzaXZlKSB8IEZlbWluaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMTAwX3llYXJzX21hbGUJPQkiNS4xMyBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciB0ZW1wbyBkZSBwZW5hIHJlbWFuZXNjZW50ZSAocHJlc29zL2FzIGNvbmRlbmFkb3MvYXMgZSkgfCBNYWlzIGRlIDEwMCBhbm9zIHwgTWFzY3VsaW5vIgksCnRpbWVfcmVtYWluaW5nX29mX3NlbnRlbmNlX292ZXJfMTAwX3llYXJzX2ZlbWFsZQk9CSI1LjEzIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHRlbXBvIGRlIHBlbmEgcmVtYW5lc2NlbnRlIChwcmVzb3MvYXMgY29uZGVuYWRvcy9hcyBlKSB8IE1haXMgZGUgMTAwIGFub3MgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9zaW1wbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHNpbXBsZXMgKEFydC4gMTIxLCBjYXB1dCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfaG9taWNpZGVfc2ltcGxlX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBIb21pY8OtZGlvIHNpbXBsZXMgKEFydC4gMTIxLCBjYXB1dCkgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9zaW1wbGVfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBzaW1wbGVzIChBcnQuIDEyMSwgY2FwdXQpIHwgVG90YWwiCSwKY3JpbWVfbWFuc2xhdWdodGVyX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IE1hc2N1bGlubyIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEhvbWljw61saW8gY3VscG9zbyAoQXJ0LiAxMjEsIMKnIDPCsCkgfCBGZW1pbmlubyIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWxpbyBjdWxwb3NvIChBcnQuIDEyMSwgwqcgM8KwKSB8IFRvdGFsIgksCmNyaW1lX2hvbWljaWRlX3F1YWxpZmllZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEhvbWljw61kaW8gcXVhbGlmaWNhZG8gKEFydC4gMTIxLCDCpyAywrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2hvbWljaWRlX3F1YWxpZmllZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBxdWFsaWZpY2FkbyAoQXJ0LiAxMjEsIMKnIDLCsCkgfCBGZW1pbmlubyIJLApjcmltZV9ob21pY2lkZV9xdWFsaWZpZWRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgSG9taWPDrWRpbyBxdWFsaWZpY2FkbyAoQXJ0LiAxMjEsIMKnIDLCsCkgfCBUb3RhbCIJLApjcmltZV9hYm9ydGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IEFib3J0byAoQXJ0LiAxMjQsIDEyNSwgMTI2IGUgMTI3KSB8IE1hc2N1bGlubyIJLApjcmltZV9hYm9ydGlvbl9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfYWJvcnRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgQWJvcnRvIChBcnQuIDEyNCwgMTI1LCAxMjYgZSAxMjcpIHwgVG90YWwiCSwKY3JpbWVfYm9keV9pbmp1cnlfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBMZXPDo28gY29ycG9yYWwgKEFydC4gMTI5LCBjYXB1dCBlIMKnIDHCsCwgMsKwLCAzwrAgZSA2wrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2JvZHlfaW5qdXJ5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBMZXPDo28gY29ycG9yYWwgKEFydC4gMTI5LCBjYXB1dCBlIMKnIDHCsCwgMsKwLCAzwrAgZSA2wrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfYm9keV9pbmp1cnlfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgTGVzw6NvIGNvcnBvcmFsIChBcnQuIDEyOSwgY2FwdXQgZSDCpyAxwrAsIDLCsCwgM8KwIGUgNsKwKSB8IFRvdGFsIgksCmNyaW1lX2RvbWVzdGljX3Zpb2xlbmNlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgVmlvbMOqbmNpYSBkb23DqXN0aWNhIChBcnQuIDEyOSwgIMKnIDnCsCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZG9tZXN0aWNfdmlvbGVuY2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFZpb2zDqm5jaWEgZG9tw6lzdGljYSAoQXJ0LiAxMjksICDCpyA5wrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfZG9tZXN0aWNfdmlvbGVuY2VfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgVmlvbMOqbmNpYSBkb23DqXN0aWNhIChBcnQuIDEyOSwgIMKnIDnCsCkgfCBUb3RhbCIJLApjcmltZV9raWRuYXBwaW5nX2FuZF9wcml2YXRlX2ltcHJpc29ubWVudF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIHBlc3NvYSB8IFNlcXVlc3RybyBlIGPDoXJjZXJlIHByaXZhZG8gKEFydC4gMTQ4KSB8IE1hc2N1bGlubyIJLApjcmltZV9raWRuYXBwaW5nX2FuZF9wcml2YXRlX2ltcHJpc29ubWVudF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgU2VxdWVzdHJvIGUgY8OhcmNlcmUgcHJpdmFkbyAoQXJ0LiAxNDgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfa2lkbmFwcGluZ19hbmRfcHJpdmF0ZV9pbXByaXNvbm1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgU2VxdWVzdHJvIGUgY8OhcmNlcmUgcHJpdmFkbyAoQXJ0LiAxNDgpIHwgVG90YWwiCSwKY3JpbWVfb3RoZXJfbm90X2xpc3RlZF9hYm92ZV9hbW9uZ19hcnRpY2xlc18xMjJfYW5kXzE1NF9hX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDEyMiBlIDE1NC1BIHwgTWFzY3VsaW5vIgksCmNyaW1lX290aGVyX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTIyX2FuZF8xNTRfYV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGVzc29hIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDEyMiBlIDE1NC1BIHwgRmVtaW5pbm8iCSwKY3JpbWVfb3RoZXJzX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTIyX2FuZF8xNTRfYV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwZXNzb2EgfCBPdXRyb3MgLSBuw6NvIGxpc3RhZG9zIGFjaW1hIGVudHJlIG9zIGFydGlnb3MgMTIyIGUgMTU0LUEgfCBUb3RhbCIJLApjcmltZV90aGVmdF9zaW1wbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHNpbXBsZXMgKEFydC4gMTU1KSB8IE1hc2N1bGlubyIJLApjcmltZV90aGVmdF9zaW1wbGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRnVydG8gc2ltcGxlcyAoQXJ0LiAxNTUpIHwgRmVtaW5pbm8iCSwKY3JpbWVfdGhlZnRfc2ltcGxlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRnVydG8gc2ltcGxlcyAoQXJ0LiAxNTUpIHwgVG90YWwiCSwKY3JpbWVfdGhlZnRfcXVhbGlmaWVkX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBGdXJ0byBxdWFsaWZpY2FkbyAoQXJ0LiAxNTUsIMKnIDTCsCBlIDXCsCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfdGhlZnRfcXVhbGlmaWVkX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHF1YWxpZmljYWRvIChBcnQuIDE1NSwgwqcgNMKwIGUgNcKwKSB8IEZlbWluaW5vIgksCmNyaW1lX3RoZWZ0X3F1YWxpZmllZF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEZ1cnRvIHF1YWxpZmljYWRvIChBcnQuIDE1NSwgwqcgNMKwIGUgNcKwKSB8IFRvdGFsIgksCmNyaW1lX3JvYmJlcnlfc2ltcGxlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcm9iYmVyeV9zaW1wbGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gc2ltcGxlcyAoQXJ0LiAxNTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcm9iYmVyeV9zaW1wbGVfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSb3VibyBzaW1wbGVzIChBcnQuIDE1NykgfCBUb3RhbCIJLApjcmltZV9yb2JiZXJ5X3F1YWxpZmllZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gcXVhbGlmaWNhZG8gKEFydC4gMTU3LCDCpyAywrAgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcm9iYmVyeV9xdWFsaWZpZWRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUm91Ym8gcXVhbGlmaWNhZG8gKEFydC4gMTU3LCDCpyAywrAgfCBGZW1pbmlubyIJLApjcmltZV9yb2JiZXJ5X3F1YWxpZmllZF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJvdWJvIHF1YWxpZmljYWRvIChBcnQuIDE1NywgwqcgMsKwIHwgVG90YWwiCSwKY3JpbWVfZmVsb255X211cmRlcl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgTGF0cm9jw61uaW8gKEFydC4gMTU3LCDCpyAzwrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ZlbG9ueV9tdXJkZXJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgTGF0cm9jw61uaW8gKEFydC4gMTU3LCDCpyAzwrApIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmVsb255X211cmRlcl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IExhdHJvY8OtbmlvIChBcnQuIDE1NywgwqcgM8KwKSB8IFRvdGFsIgksCmNyaW1lX2V4dG9ydGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIChBcnQuIDE1OCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZXh0b3J0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEV4dG9yc8OjbyAoQXJ0LiAxNTgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZXh0b3J0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIChBcnQuIDE1OCkgfCBUb3RhbCIJLApjcmltZV9leHRvcnRpb25fdGhyb3VnaF9raWRuYXBwaW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gbWVkaWFudGUgc2VxdWVzdHJvIChBcnQuIDE1OSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZXh0b3J0aW9uX3Rocm91Z2hfa2lkbmFwcGluZ19mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFeHRvcnPDo28gbWVkaWFudGUgc2VxdWVzdHJvIChBcnQuIDE1OSkgfCBGZW1pbmlubyIJLApjcmltZV9leHRvcnRpb25fdGhyb3VnaF9raWRuYXBwaW5nX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXh0b3Jzw6NvIG1lZGlhbnRlIHNlcXVlc3RybyAoQXJ0LiAxNTkpIHwgVG90YWwiCSwKY3JpbWVfbWlzYXBwcm9wcmlhdGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgKEFydC4gMTY4KSB8IE1hc2N1bGlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIChBcnQuIDE2OCkgfCBGZW1pbmlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgQXByb3ByaWHDp8OjbyBpbmTDqWJpdGEgKEFydC4gMTY4KSB8IFRvdGFsIgksCmNyaW1lX21pc2FwcHJvcHJpYXRpb25fc29jaWFsX3NlY3VyaXR5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBBcHJvcHJpYcOnw6NvIGluZMOpYml0YSBwcmV2aWRlbmNpw6FyaWEgKEFydC4gMTY4LUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX21pc2FwcHJvcHJpYXRpb25fc29jaWFsX3NlY3VyaXR5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBGZW1pbmlubyIJLApjcmltZV9taXNhcHByb3ByaWF0aW9uX3NvY2lhbF9zZWN1cml0eV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IEFwcm9wcmlhw6fDo28gaW5kw6liaXRhIHByZXZpZGVuY2nDoXJpYSAoQXJ0LiAxNjgtQSkgfCBUb3RhbCIJLApjcmltZV9mcmF1ZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgRXN0ZWxpb25hdG8gKEFydC4gMTcxKSB8IE1hc2N1bGlubyIJLApjcmltZV9mcmF1ZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZnJhdWRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBFc3RlbGlvbmF0byAoQXJ0LiAxNzEpIHwgVG90YWwiCSwKY3JpbWVfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgUmVjZXB0YcOnw6NvIChBcnQuIDE4MCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gKEFydC4gMTgwKSB8IEZlbWluaW5vIgksCmNyaW1lX3JlY2VpdmluZ19zdG9sZW5fcHJvcGVydHlfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gKEFydC4gMTgwKSB8IFRvdGFsIgksCmNyaW1lX3F1YWxpZmllZF9yZWNlaXZpbmdfc3RvbGVuX3Byb3BlcnR5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBSZWNlcHRhw6fDo28gcXVhbGlmaWNhZGEgKEFydC4gMTgwLCDCpyAxwrApIHwgTWFzY3VsaW5vIgksCmNyaW1lX3F1YWxpZmllZF9yZWNlaXZpbmdfc3RvbGVuX3Byb3BlcnR5X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBGZW1pbmlubyIJLApjcmltZV9xdWFsaWZpZWRfcmVjZWl2aW5nX3N0b2xlbl9wcm9wZXJ0eV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgbyBwYXRyaW3DtG5pbyB8IFJlY2VwdGHDp8OjbyBxdWFsaWZpY2FkYSAoQXJ0LiAxODAsIMKnIDHCsCkgfCBUb3RhbCIJLApjcmltZV9vdGhlcl9ub3RfbGlzdGVkX2Fib3ZlX2Ftb25nX2FydGljbGVzXzE1Nl9hbmRfMTc5X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIG8gcGF0cmltw7RuaW8gfCBPdXRyb3MgLSBuw6NvIGxpc3RhZG9zIGFjaW1hIGVudHJlIG9zIGFydGlnb3MgMTU2IGUgMTc5IHwgTWFzY3VsaW5vIgksCmNyaW1lX290aGVyX25vdF9saXN0ZWRfYWJvdmVfYW1vbmdfYXJ0aWNsZXNfMTU2X2FuZF8xNzlfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IEZlbWluaW5vIgksCmNyaW1lX290aGVyc19ub3RfbGlzdGVkX2Fib3ZlX2Ftb25nX2FydGljbGVzXzE1Nl9hbmRfMTc5X3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBvIHBhdHJpbcO0bmlvIHwgT3V0cm9zIC0gbsOjbyBsaXN0YWRvcyBhY2ltYSBlbnRyZSBvcyBhcnRpZ29zIDE1NiBlIDE3OSB8IFRvdGFsIgksCmNyaW1lX3JhcGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgRXN0dXBybyAoQXJ0LiAyMTMpIHwgTWFzY3VsaW5vIgksCmNyaW1lX3JhcGVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIChBcnQuIDIxMykgfCBGZW1pbmlubyIJLApjcmltZV9yYXBlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIChBcnQuIDIxMykgfCBUb3RhbCIJLApjcmltZV9pbmRlY2VudF9hc3NhdWx0X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfaW5kZWNlbnRfYXNzYXVsdF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEF0ZW50YWRvIHZpb2xlbnRvIGFvIHB1ZG9yIChBcnQuIDIxNCkgfCBGZW1pbmlubyIJLApjcmltZV9pbmRlY2VudF9hc3NhdWx0X3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBBdGVudGFkbyB2aW9sZW50byBhbyBwdWRvciAoQXJ0LiAyMTQpIHwgVG90YWwiCSwKY3JpbWVfcmFwZV9vZl92dWxuZXJhYmxlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEVzdHVwcm8gZGUgdnVsbmVyw6F2ZWwgKEFydC4gMjE3LUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX3JhcGVfb2ZfdnVsbmVyYWJsZV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IEVzdHVwcm8gZGUgdnVsbmVyw6F2ZWwgKEFydC4gMjE3LUEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcmFwZV9vZl92dWxuZXJhYmxlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBFc3R1cHJvIGRlIHZ1bG5lcsOhdmVsIChBcnQuIDIxNy1BKSB8IFRvdGFsIgksCmNyaW1lX2NvcnJ1cHRpb25fb2ZfYV9taW5vcl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBDb3JydXDDp8OjbyBkZSBtZW5vcmVzIChBcnQuIDIxOCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY29ycnVwdGlvbl9vZl9hX21pbm9yX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgQ29ycnVww6fDo28gZGUgbWVub3JlcyAoQXJ0LiAyMTgpIHwgRmVtaW5pbm8iCSwKY3JpbWVfY29ycnVwdGlvbl9vZl9hX21pbm9yX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGRpZ25pZGFkZSBzZXh1YWwgfCBDb3JydXDDp8OjbyBkZSBtZW5vcmVzIChBcnQuIDIxOCkgfCBUb3RhbCIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxKSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEpIHwgRmVtaW5pbm8iCSwKY3JpbWVfaW50ZXJuYXRpb25hbF90cmFmZmlja2luZ19vZl9wZXJzb25fZm9yX3B1cnBvc2Vfb2Zfc2V4dWFsX2V4cGxvaXRhdGlvbl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEpIHwgVG90YWwiCSwKbWFsZWNyaW1lX2ludGVybmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IFRyw6FmaWNvIGludGVybm8gZGUgcGVzc29hIHBhcmEgZmltIGRlIGV4cGxvcmHDp8OjbyBzZXh1YWwgKEFydC4gMjMxLUEpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ludGVybmFsX3RyYWZmaWNraW5nX29mX3BlcnNvbl9mb3JfcHVycG9zZV9vZl9zZXh1YWxfZXhwbG9pdGF0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJubyBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEtQSkgfCBGZW1pbmlubyIJLApjcmltZV9pbnRlcm5hbF90cmFmZmlja2luZ19vZl9wZXJzb25fZm9yX3B1cnBvc2Vfb2Zfc2V4dWFsX2V4cGxvaXRhdGlvbl90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgVHLDoWZpY28gaW50ZXJubyBkZSBwZXNzb2EgcGFyYSBmaW0gZGUgZXhwbG9yYcOnw6NvIHNleHVhbCAoQXJ0LiAyMzEtQSkgfCBUb3RhbCIJLApjcmltZV9vdGhlcl9hcnRpY2xlc18yMTVfMjE2X2FfMjE4X2FfMjE4X2JfMjI3XzIyOF8yMjlfMjMwX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IE91dHJvcyAoQXJ0aWdvcyAyMTUsIDIxNi1BLCAyMTgtQSwgMjE4LUIsIDIyNywgMjI4LCAyMjksIDIzMCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZXNfMjE1XzIxNl9hXzIxOF9hXzIxOF9iXzIyN18yMjhfMjI5XzIzMF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZGlnbmlkYWRlIHNleHVhbCB8IE91dHJvcyAoQXJ0aWdvcyAyMTUsIDIxNi1BLCAyMTgtQSwgMjE4LUIsIDIyNywgMjI4LCAyMjksIDIzMCkgfCBGZW1pbmlubyIJLApjcmltZV9vdGhlcnNfYXJ0aWNsZXNfMjE1XzIxNl9hXzIxOF9hXzIxOF9iXzIyN18yMjhfMjI5XzIzMF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBkaWduaWRhZGUgc2V4dWFsIHwgT3V0cm9zIChBcnRpZ29zIDIxNSwgMjE2LUEsIDIxOC1BLCAyMTgtQiwgMjI3LCAyMjgsIDIyOSwgMjMwKSB8IFRvdGFsIgksCmNyaW1lX2dhbmdfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwYXogcMO6YmxpY2EgfCBRdWFkcmlsaGEgb3UgYmFuZG8gKEFydC4gMjg4KSB8IE1hc2N1bGlubyIJLApjcmltZV9nYW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBwYXogcMO6YmxpY2EgfCBRdWFkcmlsaGEgb3UgYmFuZG8gKEFydC4gMjg4KSB8IEZlbWluaW5vIgksCmNyaW1lX2dhbmdfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgcGF6IHDDumJsaWNhIHwgUXVhZHJpbGhhIG91IGJhbmRvIChBcnQuIDI4OCkgfCBUb3RhbCIJLApjcmltZV9jb3VudGVyZmVpdF9jdXJyZW5jeV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY291bnRlcmZlaXRfY3VycmVuY3lfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IE1vZWRhIGZhbHNhIChBcnQuIDI4OSkgfCBGZW1pbmlubyIJLApjcmltZV9jb3VudGVyZmVpdF9jdXJyZW5jeV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBNb2VkYSBmYWxzYSAoQXJ0LiAyODkpIHwgVG90YWwiCSwKY3JpbWVfZmFsc2lmaWNhdGlvbl9vZl9wYXBlcnNfc2VhbHNfc2lnbl9hbmRfcHVibGljX2RvY3VtZW50c19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2ZhbHNpZmljYXRpb25fb2ZfcGFwZXJzX3NlYWxzX3NpZ25fYW5kX3B1YmxpY19kb2N1bWVudHNfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZmljYcOnw6NvIGRlIHBhcMOpaXMsIHNlbG9zLCBzaW5hbCBlIGRvY3VtZW50b3MgcMO6YmxpY29zICggQXJ0LiAyOTMgYSAyOTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmFsc2lmaWNhdGlvbl9vZl9wYXBlcnNfc2VhbHNfc2lnbl9hbmRfcHVibGljX2RvY3VtZW50c190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBGYWxzaWZpY2HDp8OjbyBkZSBwYXDDqWlzLCBzZWxvcywgc2luYWwgZSBkb2N1bWVudG9zIHDDumJsaWNvcyAoIEFydC4gMjkzIGEgMjk3KSB8IFRvdGFsIgksCmNyaW1lX2lkZW9sb2dpY2FsX2ZhbHNlaG9vZF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIGbDqSBww7pibGljYSB8IEZhbHNpZGFkZSBpZGVvbMOzZ2ljYSAoQXJ0LiAyOTkpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lkZW9sb2dpY2FsX2ZhbHNlaG9vZF9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBGZW1pbmlubyIJLApjcmltZV9pZGVvbG9naWNhbF9mYWxzZWhvb2RfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgRmFsc2lkYWRlIGlkZW9sw7NnaWNhIChBcnQuIDI5OSkgfCBUb3RhbCIJLApjcmltZV91c2Vfb2ZfZmFsc2VfZG9jdW1lbnRfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBVc28gZGUgZG9jdW1lbnRvIGZhbHNvIChBcnQuIDMwNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfdXNlX29mX2ZhbHNlX2RvY3VtZW50X2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBmw6kgcMO6YmxpY2EgfCBVc28gZGUgZG9jdW1lbnRvIGZhbHNvIChBcnQuIDMwNCkgfCBGZW1pbmlubyIJLApjcmltZV91c2Vfb2ZfZmFsc2VfZG9jdW1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgZsOpIHDDumJsaWNhIHwgVXNvIGRlIGRvY3VtZW50byBmYWxzbyAoQXJ0LiAzMDQpIHwgVG90YWwiCSwKY3JpbWVfZW1iZXp6bGVtZW50X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IE1hc2N1bGlubyIJLApjcmltZV9lbWJlenpsZW1lbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IFBlY3VsYXRvIChBcnQuIDMxMiBlIDMxMykgfCBGZW1pbmlubyIJLApjcmltZV9lbWJlenpsZW1lbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgUGVjdWxhdG8gKEFydC4gMzEyIGUgMzEzKSB8IFRvdGFsIgksCmNyaW1lX2NvbmN1c3Npb25fYW5kX2V4Y2Vzc19leGFjdGlvbl9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvbmN1c3PDo28gZSBleGNlc3NvIGRlIGV4YcOnw6NvIChBcnQuIDMxNikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY29uY3Vzc2lvbl9hbmRfZXhjZXNzX2V4YWN0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb25jdXNzw6NvIGUgZXhjZXNzbyBkZSBleGHDp8OjbyAoQXJ0LiAzMTYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfY29uY3Vzc2lvbl9hbmRfZXhjZXNzX2V4YWN0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvbmN1c3PDo28gZSBleGNlc3NvIGRlIGV4YcOnw6NvIChBcnQuIDMxNikgfCBUb3RhbCIJLApjcmltZV9wYXNzaXZlX2NvcnJ1cHRpb25fbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBwYXNzaXZhIChBcnQuIDMxNykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfcGFzc2l2ZV9jb3JydXB0aW9uX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb3JydXDDp8OjbyBwYXNzaXZhIChBcnQuIDMxNykgfCBGZW1pbmlubyIJLApjcmltZV9wYXNzaXZlX2NvcnJ1cHRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gcGFzc2l2YSAoQXJ0LiAzMTcpIHwgVG90YWwiCSwKY3JpbWVfYWN0aXZlX2NvcnJ1cHRpb25fbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBDw5NESUdPIFBFTkFMIHwgR3J1cG86IENyaW1lcyBwcmF0aWNhZG9zIHBvciBwYXJ0aWN1bGFyIGNvbnRyYSBhIEFkbWluaXN0cmHDp8OjbyBQw7pibGljYSB8IENvcnJ1cMOnw6NvIGF0aXZhIChBcnQuIDMzMykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfYWN0aXZlX2NvcnJ1cHRpb25fZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gYXRpdmEgKEFydC4gMzMzKSB8IEZlbWluaW5vIgksCmNyaW1lX2FjdGl2ZV9jb3JydXB0aW9uX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29ycnVww6fDo28gYXRpdmEgKEFydC4gMzMzKSB8IFRvdGFsIgksCmNyaW1lX3NtdWdnbGluZ19vcl9taXNhcHByb3ByaWF0aW9uX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb250cmFiYW5kbyBvdSBkZXNjYW1pbmhvIChBcnQuIDMzNCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfc211Z2dsaW5nX29yX21pc2FwcHJvcHJpYXRpb25fZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IEPDk0RJR08gUEVOQUwgfCBHcnVwbzogQ3JpbWVzIHByYXRpY2Fkb3MgcG9yIHBhcnRpY3VsYXIgY29udHJhIGEgQWRtaW5pc3RyYcOnw6NvIFDDumJsaWNhIHwgQ29udHJhYmFuZG8gb3UgZGVzY2FtaW5obyAoQXJ0LiAzMzQpIHwgRmVtaW5pbm8iCSwKY3JpbWVfc211Z2dsaW5nX29yX21pc2FwcHJvcHJpYXRpb25fdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogQ8OTRElHTyBQRU5BTCB8IEdydXBvOiBDcmltZXMgcHJhdGljYWRvcyBwb3IgcGFydGljdWxhciBjb250cmEgYSBBZG1pbmlzdHJhw6fDo28gUMO6YmxpY2EgfCBDb250cmFiYW5kbyBvdSBkZXNjYW1pbmhvIChBcnQuIDMzNCkgfCBUb3RhbCIJLApjcmltZV9kcnVnX3RyYWZmaWNraW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBUcsOhZmljbyBkZSBkcm9nYXMgKEFydC4gMTIgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBkYSBMZWkgMTEuMzQzLzA2KSB8IE1hc2N1bGlubyIJLApjcmltZV9kcnVnX3RyYWZmaWNraW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGRlIGRyb2dhcyAoQXJ0LiAxMiBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDMzIGRhIExlaSAxMS4zNDMvMDYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZHJ1Z190cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGRlIGRyb2dhcyAoQXJ0LiAxMiBkYSBMZWkgNi4zNjgvNzYgZSBBcnQuIDMzIGRhIExlaSAxMS4zNDMvMDYpIHwgVG90YWwiCSwKY3JpbWVfYXNzb2NpYXRpb25fZm9yX3RyYWZmaWNraW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IERyb2dhcyAoTGVpIDYuMzY4Lzc2IGUgTGVpIDExLjM0My8wNikgfCBBc3NvY2lhw6fDo28gcGFyYSBvIHRyw6FmaWNvIChBcnQuIDE0IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzUgZGEgTGVpIDExLjM0My8wNikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfYXNzb2NpYXRpb25fZm9yX3RyYWZmaWNraW5nX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCmNyaW1lX2Fzc29jaWF0aW9uX2Zvcl90cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IEFzc29jaWHDp8OjbyBwYXJhIG8gdHLDoWZpY28gKEFydC4gMTQgZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzNSBkYSBMZWkgMTEuMzQzLzA2KSB8IFRvdGFsIgksCmNyaW1lX2ludGVybmF0aW9uYWxfZHJ1Z190cmFmZmlja2luZ19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBkcm9nYXMgKEFydC4gMTggZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBlIDQwLCBpbmNpc28gSSBkYSBMZWkgMTEuMzQzLzA2KSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX2RydWdfdHJhZmZpY2tpbmdfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBEcm9nYXMgKExlaSA2LjM2OC83NiBlIExlaSAxMS4zNDMvMDYpIHwgVHLDoWZpY28gaW50ZXJuYWNpb25hbCBkZSBkcm9nYXMgKEFydC4gMTggZGEgTGVpIDYuMzY4Lzc2IGUgQXJ0LiAzMyBlIDQwLCBpbmNpc28gSSBkYSBMZWkgMTEuMzQzLzA2KSB8IEZlbWluaW5vIgksCmNyaW1lX2ludGVybmF0aW9uYWxfZHJ1Z190cmFmZmlja2luZ190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRHJvZ2FzIChMZWkgNi4zNjgvNzYgZSBMZWkgMTEuMzQzLzA2KSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgZHJvZ2FzIChBcnQuIDE4IGRhIExlaSA2LjM2OC83NiBlIEFydC4gMzMgZSA0MCwgaW5jaXNvIEkgZGEgTGVpIDExLjM0My8wNikgfCBUb3RhbCIJLApjcmltZV9pbGxlZ2FsX2NhcnJ5aW5nX2FfZmlyZWFybV9wZXJtaXR0ZWRfdG9fdXNlX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBQb3J0ZSBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIGRlIHVzbyBwZXJtaXRpZG8gKEFydC4gMTQpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lsbGVnYWxfY2FycnlpbmdfYV9maXJlYXJtX3Blcm1pdHRlZF90b191c2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcGVybWl0aWRvIChBcnQuIDE0KSB8IEZlbWluaW5vIgksCmNyaW1lX2lsbGVnYWxfY2Fycnlpbmdfb2ZfZmlyZWFybV9wZXJtaXR0ZWRfdG9fdXNlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcGVybWl0aWRvIChBcnQuIDE0KSB8IFRvdGFsIgksCmNyaW1lX2ZpcmVfZ3VuX3Nob290aW5nX21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBEaXNwYXJvIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxNSkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfZmlyZV9ndW5fc2hvb3RpbmdfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgRGlzcGFybyBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTUpIHwgRmVtaW5pbm8iCSwKY3JpbWVfZmlyZV9ndW5fc2hvb3RpbmdfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBEaXNwYXJvIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxNSkgfCBUb3RhbCIJLApjcmltZV9wb3NzZXNzaW9uX29yX2lsbGVnYWxfcG9ydF9vZl9maXJlYXJtX3dpdGhfcmVzdHJpY3RlZF91c2VfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFBvc3NlIG91IHBvcnRlIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gZGUgdXNvIHJlc3RyaXRvIChBcnQuIDE2KSB8IE1hc2N1bGlubyIJLApjcmltZV9wb3NzZXNzaW9uX29yX2lsbGVnYWxfcG9ydF9vZl9maXJlYXJtX3dpdGhfcmVzdHJpY3RlZF91c2VfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9zc2Ugb3UgcG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcmVzdHJpdG8gKEFydC4gMTYpIHwgRmVtaW5pbm8iCSwKY3JpbWVfcG9zc2Vzc2lvbl9vcl9pbGxlZ2FsX3BvcnRfb2ZfZmlyZWFybV93aXRoX3Jlc3RyaWN0ZWRfdXNlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgUG9zc2Ugb3UgcG9ydGUgaWxlZ2FsIGRlIGFybWEgZGUgZm9nbyBkZSB1c28gcmVzdHJpdG8gKEFydC4gMTYpIHwgVG90YWwiCSwKY3JpbWVfaWxsZWdhbF90cmFkZV9vZl9maXJlYXJtc19tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgQ29tw6lyY2lvIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTcpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2lsbGVnYWxfdHJhZGVfb2ZfZmlyZWFybXNfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBFc3RhdHV0byBkbyBEZXNhcm1hbWVudG8gKExlaSAxMC44MjYsIGRlIDIyLzEyLzIwMDMpIHwgQ29tw6lyY2lvIGlsZWdhbCBkZSBhcm1hIGRlIGZvZ28gKEFydC4gMTcpIHwgRmVtaW5pbm8iCSwKY3JpbWVfaWxsZWdhbF90cmFkZV9vZl9maXJlYXJtc190b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IENvbcOpcmNpbyBpbGVnYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE3KSB8IFRvdGFsIgksCmNyaW1lX2ludGVybmF0aW9uYWxfdHJhZmZpY2tpbmdfb2ZfZmlyZWFybXNfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE4KSB8IE1hc2N1bGlubyIJLApjcmltZV9pbnRlcm5hdGlvbmFsX3RyYWZmaWNraW5nX29mX2ZpcmVhcm1zX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogRXN0YXR1dG8gZG8gRGVzYXJtYW1lbnRvIChMZWkgMTAuODI2LCBkZSAyMi8xMi8yMDAzKSB8IFRyw6FmaWNvIGludGVybmFjaW9uYWwgZGUgYXJtYSBkZSBmb2dvIChBcnQuIDE4KSB8IEZlbWluaW5vIgksCmNyaW1lX2ludGVybmF0aW9uYWxfdHJhZmZpY2tpbmdfb2ZfZmlyZWFybXNfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IEVzdGF0dXRvIGRvIERlc2FybWFtZW50byAoTGVpIDEwLjgyNiwgZGUgMjIvMTIvMjAwMykgfCBUcsOhZmljbyBpbnRlcm5hY2lvbmFsIGRlIGFybWEgZGUgZm9nbyAoQXJ0LiAxOCkgfCBUb3RhbCIJLApjcmltZV9tYW5zbGF1Z2h0ZXJfYnlfZHJpdmluZ19hX21vdG9yX3ZlaGljbGVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogQ3JpbWVzIGRlIFRyw6Juc2l0byAoTGVpIDkuNTAzLCBkZSAyMy8wOS8xOTk3KSB8IEhvbWljw61kaW8gY3VscG9zbyBuYSBjb25kdcOnw6NvIGRlIHZlw61jdWxvIGF1dG9tb3RvciAoQXJ0LiAzMDIpIHwgTWFzY3VsaW5vIgksCmNyaW1lX21hbnNsYXVnaHRlcl9ieV9kcml2aW5nX2FfbW90b3JfdmVoaWNsZV9mZW1hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IENyaW1lcyBkZSBUcsOibnNpdG8gKExlaSA5LjUwMywgZGUgMjMvMDkvMTk5NykgfCBIb21pY8OtZGlvIGN1bHBvc28gbmEgY29uZHXDp8OjbyBkZSB2ZcOtY3VsbyBhdXRvbW90b3IgKEFydC4gMzAyKSB8IEZlbWluaW5vIgksCmNyaW1lX21hbnNsYXVnaHRlcl9ieV9kcml2aW5nX2FfbW90b3JfdmVoaWNsZV90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogQ3JpbWVzIGRlIFRyw6Juc2l0byAoTGVpIDkuNTAzLCBkZSAyMy8wOS8xOTk3KSB8IEhvbWljw61kaW8gY3VscG9zbyBuYSBjb25kdcOnw6NvIGRlIHZlw61jdWxvIGF1dG9tb3RvciAoQXJ0LiAzMDIpIHwgVG90YWwiCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZV8zMDNfYV8zMTJfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgT3V0cm9zIChBcnQuIDMwMyBhIDMxMikgfCBNYXNjdWxpbm8iCSwKY3JpbWVfb3RoZXJfYXJ0aWNsZV8zMDNfYV8zMTJfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IEZlbWluaW5vIgksCmNyaW1lX290aGVyX2FydGljbGVfMzAzX2FfMzEyX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBPdXRyb3MgKEFydC4gMzAzIGEgMzEyKSB8IFRvdGFsIgksCmNyaW1lX3N0YXR1dGVfb2ZfdGhlX2NoaWxkX2FuZF9hZG9sZXNjZW50X21hbGUJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IEVzdGF0dXRvIGRhIENyaWFuw6dhIGUgZG8gQWRvbGVzY2VudGUgKExlaSA4LjA2OSwgZGUgMTMvMDEvMTk5MCkgfCBNYXNjdWxpbm8iCSwKY3JpbWVfc3RhdHV0ZV9vZl90aGVfY2hpbGRfYW5kX2Fkb2xlc2NlbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBFc3RhdHV0byBkYSBDcmlhbsOnYSBlIGRvIEFkb2xlc2NlbnRlIChMZWkgOC4wNjksIGRlIDEzLzAxLzE5OTApIHwgRmVtaW5pbm8iCSwKY3JpbWVfc3RhdHV0ZV9vZl90aGVfY2hpbGRfYW5kX2Fkb2xlc2NlbnRfdG90YWwJPQkiNS4xNCBRdWFudGlkYWRlIGRlIGluY2lkw6puY2lhcyBwb3IgdGlwbyBwZW5hbCB8ICBHUlVQTzogTEVHSVNMQcOHw4NPIEVTUEVDw41GSUNBIHwgR3J1cG86IExlZ2lzbGHDp8OjbyBlc3BlY8OtZmljYSAtIG91dHJvcyB8IEVzdGF0dXRvIGRhIENyaWFuw6dhIGUgZG8gQWRvbGVzY2VudGUgKExlaSA4LjA2OSwgZGUgMTMvMDEvMTk5MCkgfCBUb3RhbCIJLApjcmltZV9nZW5vY2lkZV9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgTWFzY3VsaW5vIgksCmNyaW1lX2dlbm9jaWRlX2ZlbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgR2Vub2PDrWRpbyAoTGVpIDIuODg5LCBkZSAwMS8xMC8xOTU2KSB8IEZlbWluaW5vIgksCmNyaW1lX2dlbm9jaWRlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBHZW5vY8OtZGlvIChMZWkgMi44ODksIGRlIDAxLzEwLzE5NTYpIHwgVG90YWwiCSwKY3JpbWVfY3JpbWVzX29mX3RvcnR1cmVfbWFsZQk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgQ3JpbWVzIGRlIHRvcnR1cmEgKExlaSA5LjQ1NSwgZGUgMDcvMDQvMTk5NykgfCBNYXNjdWxpbm8iCSwKY3JpbWVfY3JpbWVzX29mX3RvcnR1cmVfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IEZlbWluaW5vIgksCmNyaW1lX2NyaW1lc19vZl90b3J0dXJlX3RvdGFsCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgZGUgdG9ydHVyYSAoTGVpIDkuNDU1LCBkZSAwNy8wNC8xOTk3KSB8IFRvdGFsIgksCmNyaW1lX2NyaW1lc19hZ2FpbnN0X3RoZV9lbnZpcm9ubWVudF9tYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgY29udHJhIG8gTWVpbyBBbWJpZW50ZSAoTGVpIDkuNjA1LCBkZSAxMi8wMi8xOTk4KSB8IE1hc2N1bGlubyIJLApjcmltZV9jcmltZXNfYWdhaW5zdF90aGVfZW52aXJvbm1lbnRfZmVtYWxlCT0JIjUuMTQgUXVhbnRpZGFkZSBkZSBpbmNpZMOqbmNpYXMgcG9yIHRpcG8gcGVuYWwgfCAgR1JVUE86IExFR0lTTEHDh8ODTyBFU1BFQ8ONRklDQSB8IEdydXBvOiBMZWdpc2xhw6fDo28gZXNwZWPDrWZpY2EgLSBvdXRyb3MgfCBDcmltZXMgY29udHJhIG8gTWVpbyBBbWJpZW50ZSAoTGVpIDkuNjA1LCBkZSAxMi8wMi8xOTk4KSB8IEZlbWluaW5vIgksCmNyaW1lX2NyaW1lc19hZ2FpbnN0X3RoZV9lbnZpcm9ubWVudF90b3RhbAk9CSI1LjE0IFF1YW50aWRhZGUgZGUgaW5jaWTDqm5jaWFzIHBvciB0aXBvIHBlbmFsIHwgIEdSVVBPOiBMRUdJU0xBw4fDg08gRVNQRUPDjUZJQ0EgfCBHcnVwbzogTGVnaXNsYcOnw6NvIGVzcGVjw61maWNhIC0gb3V0cm9zIHwgQ3JpbWVzIGNvbnRyYSBvIE1laW8gQW1iaWVudGUgKExlaSA5LjYwNSwgZGUgMTIvMDIvMTk5OCkgfCBUb3RhbCIJLAp3YWdlX2RvZXNfbm90X3JlY2VpdmVkX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBOw6NvIHJlY2ViZSB8IE1hc2N1bGlubyIJLAp3YWdlX2RvZXNfbm90X3JlY2VpdmVfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgTsOjbyByZWNlYmUgfCBGZW1pbmlubyIJLAp3YWdlX2xlc3NfdGhhbl8zXzRfb2ZfdGhlX21vbnRobHlfbWluaW11bV93YWdlX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBNZW5vcyBkbyBxdWUgMy80IGRvIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIHwgTWFzY3VsaW5vIgksCndhZ2VfbGVzc190aGFuXzNfNF9vZl90aGVfbW9udGhseV9taW5pbXVtX3dhZ2VfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgTWVub3MgZG8gcXVlIDMvNCBkbyBzYWzDoXJpbyBtw61uaW1vIG1lbnNhbCB8IEZlbWluaW5vIgksCndhZ2VfYmV0d2Vlbl8zXzRfYW5kXzFfbW9udGhseV9taW5pbXVtX3dhZ2VfbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IEVudHJlIDMvNCBlIDEgc2Fsw6FyaW8gbcOtbmltbyBtZW5zYWwgfCBNYXNjdWxpbm8iCSwKd2FnZV9iZXR3ZWVuXzNfNF9hbmRfMV9tb250aGx5X21pbmltdW1fd2FnZV9mZW1hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBFbnRyZSAzLzQgZSAxIHNhbMOhcmlvIG3DrW5pbW8gbWVuc2FsIHwgRmVtaW5pbm8iCSwKd2FnZV9iZXR3ZWVuXzFfYW5kXzJfbW9udGhseV9taW5pbXVtX3dhZ2VzX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBFbnRyZSAxIGUgMiBzYWzDoXJpb3MgbcOtbmltb3MgbWVuc2FpcyB8IE1hc2N1bGlubyIJLAp3YWdlX2JldHdlZW5fMV9hbmRfMl9tb250aGx5X21pbmltdW1fd2FnZXNfZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgRW50cmUgMSBlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBGZW1pbmlubyIJLAp3YWdlX292ZXJfMl9tb250aGx5X21pbmltdW1fd2FnZXNfbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IE1haXMgcXVlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBNYXNjdWxpbm8iCSwKd2FnZV9vdmVyXzJfbW9udGhseV9taW5pbXVtX3dhZ2VzX2ZlbWFsZQk9CSI2LjIgUXVhbnRpZGFkZSBkZSBwZXNzb2FzIHByaXZhZGFzIGRlIGxpYmVyZGFkZSBwb3IgcmVtdW5lcmHDp8OjbyB8IE1haXMgcXVlIDIgc2Fsw6FyaW9zIG3DrW5pbW9zIG1lbnNhaXMgfCBGZW1pbmlubyIJLAp3YWdlX25vX2luZm9ybWF0aW9uX21hbGUJPQkiNi4yIFF1YW50aWRhZGUgZGUgcGVzc29hcyBwcml2YWRhcyBkZSBsaWJlcmRhZGUgcG9yIHJlbXVuZXJhw6fDo28gfCBTZW0gaW5mb3JtYcOnw6NvIHwgTWFzY3VsaW5vIgksCndhZ2Vfbm9faW5mb3JtYXRpb25fZmVtYWxlCT0JIjYuMiBRdWFudGlkYWRlIGRlIHBlc3NvYXMgcHJpdmFkYXMgZGUgbGliZXJkYWRlIHBvciByZW11bmVyYcOnw6NvIHwgU2VtIGluZm9ybWHDp8OjbyB8IEZlbWluaW5vIgkpCgpgYGAKCgpMb29wIHRocm91Z2ggSU5GT1BFTiB0YWJsZSBmaWxlcyBhbmQgbGlzdCB0aGVpciBuYW1lcwpgYGB7ciBpbmZvcGVuX2ZpbGVfbmFtZSwgaW5jbHVkZT1GQUxTRX0KaW5mb3Blbl9maWxlX25hbWUgPC0gbGlzdC5maWxlcyhwYXRoID0gIklORk9QRU4vdGFiZWxhcyBleGNlbC8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIioueGxzeCoiKQpgYGAKCk1hdGNoIGRpcmVjdG9yeSB0byBmaWxlIG5hbWUKYGBge3IgZmlsZXNfaW5mb3BlbiB9CmluZm9wZW5fZmlsZXMgPC0gc3RyX2MoIklORk9QRU4vdGFiZWxhcyBleGNlbC8iLGluZm9wZW5fZmlsZV9uYW1lKQpgYGAKCk5hbWUgZWFjaCB2ZWN0b3IgZWxlbWVudApgYGB7ciBuYW1lc30KbmFtZXMoaW5mb3Blbl9maWxlcykgPC0gZ3N1YigiXFwueGxzeCQiLCAiIiwgaW5mb3Blbl9maWxlX25hbWUpCmBgYAoKQXBwbHkgdGhlIHJlYWRfZXhjZWwgZnVuY3Rpb24gdG8gZWFjaCB2ZWN0b3IgZWxlbWVudCwgdGh1cyBpbXBvcnRpbmcgYWxsIGZpbGVzIGF0IG9uY2UKYGBge3IgY3JlYXRlIGluZm9wZW4gdGFibGV9CmluZm9wZW48LSBtYXBfZGYoLnggPSBpbmZvcGVuX2ZpbGVzLCAuZiA9IHJlYWRfZXhjZWwsIC5pZCA9ICJkYXRhIikgJT4lCiAgIHNlbGVjdCgic3RhdGUiID0gIlVGIiwgZGF0ZSA9IGRhdGEsIGFsbF9vZihjb2x1bW5zKSkKYGBgCgojIyBSZWNvZ25pemluZyB0aGUgVGFibGUKCklORk9QRU4gdGFibGVzIHByZXNlbnQgcGFuZWwgZGF0YSwgd2hlcmUgZWFjaCBpbmRpdmlkdWFsIGlzIHJlcHJlc2VudGVkIG1vcmUgdGhhbiBvbmNlLgogIApFYWNoIElORk9QRU4gdGFibGUgY29udGFpbnMgbW9yZSB0aGFuIDEzMDAgY29sdW1ucyBhbmQgYXBwcm94aW1hdGVseSAxNTAwIHJvd3MuCmBgYHtyIGV4YW1wbGUgb2YgYW4gSU5GT1BFTiB0YWJsZSB9Cmp1bl8yMDE3IDwtIHJlYWRfZXhjZWwoIklORk9QRU4vdGFiZWxhcyBleGNlbC9qdW4gMjAxNy54bHN4IikKYGBgCk51bWJlciBvZiBjb2x1bW5zOiBgciBuY29sKGp1bl8yMDE3KWAKTnVtYmVyIG9mIHJvd3M6IGByIG5yb3coanVuXzIwMTcpYAogIApBZnRlciBhbmFseXppbmcgZWFjaCB0YWJsZSwgSSBkZWNpZGVkIHRvIGZpbHRlciBvbmx5IHRoZSBtb3N0IGludGVyZXN0aW5nIGNvbHVtbnMgZm9yIG15IGFuYWx5c2lzIGFuZCB0aGUgcmVzdWx0IHdhcyBhIHRhYmxlIHdpdGggYHIgbnJvdyhpbmZvcGVuKWAgcm93cyBhbmQgYHIgbmNvbChpbmZvcGVuKWAgY29sdW1ucy4KCiMjIFN0YXJ0aW5nIHRvIG1hbmlwdWxhdGUgdGhlIGRhdGFmcmFtZQoKQWZ0ZXIgZ3JvdXBpbmcgYWxsIHRoZSB0YWJsZXMgYW5kIGNob29zaW5nIG9ubHkgdGhlIGNvbHVtbnMgdGhhdCBJJ20gZ29pbmcgdG8gdXNlLCB0aGUgbmV4dCBzdGVwIHdpbGwgYmUgdG8gdHJhbnNmb3JtIHRoZSBmb3JtYXQgZnJvbSB3aWRlIHRvIGxvbmcuIExvbmcgZm9ybWF0IGZhY2lsaXRhdGVzIHNvbWUgbWFuaXB1bGF0aW9ucywgYW5kIHdpZGUgZm9ybWF0IG90aGVycy4gSW4gdGhlIGNvdXJzZSBvZiB0aGlzIGFuYWx5c2lzIEkgd2lsbCB1c2UgYm90aCBmb3JtYXRzLgpgYGB7ciBpbmZvcGVuIGxvbmcgZm9ybWF0fQppbmZvcGVuXzJfbG9uZ19mb3JtYXQgPC1pbmZvcGVuJT4lCiAgIGdhdGhlcih2YXJpYWJsZSAsIHF1YW50aXR5LCAtIGMoc3RhdGUsZGF0ZSkpICU+JQogICBkcm9wX25hKCkKYGBgCgpJIHdpbGwgc3VtbWFyaXplIHRoZSB2YWx1ZXMgc28gdGhhdCB0aGUgcmVwZWF0ZWQgbGluZXMgYXJlIHJlbW92ZWQgYW5kIHRoZSB0b3RhbCBvZiBlYWNoIHZhcmlhYmxlIGlzIG9idGFpbmVkCmBgYHtyIHN1bW1hcml6ZWQgaW5mb3BlbiB0YWJsZX0KaW5mb3Blbl8zX3N1bW1hcnkgPC0gaW5mb3Blbl8yX2xvbmdfZm9ybWF0ICU+JQogICBncm91cF9ieShzdGF0ZSwgZGF0ZSwgdmFyaWFibGUpICU+JQogICBtdXRhdGUoZGF0ZSA9IGdzdWIoImRleiIsICJkZWMiLCBkYXRlKSklPiUgIyMgSSBuZWVkZWQgdG8gdXNlICJkZWMiIHNvIHRoYXQgdGhlIHByb2dyYW0gdW5kZXJzdG9vZCB0aGF0IGl0IHJlZmVycmVkIHRvIHRoZSBtb250aCBvZiBEZWNlbWJlcgogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHF1YW50aXR5LCBuYS5ybSA9IFRSVUUpKSAlPiUKICAgbWVyZ2Uoc3RhdGVfcmVnaW9uLCBieSA9ICdzdGF0ZScsIGFsbC54ID0gVFJVRSkKYGBgCgojIyBDcmVhdGUgdGhlIFZhcmlhYmxlcyBJJ20gR29pbmcgdG8gV29yayBXaXRoCgpBZnRlciBzdW1tYXJpemluZyB0aGUgZGF0YSBhbmQgcmVtb3ZpbmcgdGhlICdOQXMnLCBpdCdzIHRpbWUgdG8gc2VwYXJhdGUgdGhlIGRhdGEgaW50byBjb2x1bW5zIHRoYXQgSSB3aWxsIHVzZS4KYGBge3IgaW5mb3BlbiBmaW5hbCB0YWJsZX0KaW5mb3Blbl80IDwtIGluZm9wZW5fM19zdW1tYXJ5ICU+JQogICByb3d3aXNlKCkgJT4lICMjIGRlZmluZXMgdGhlIHNjb3BlIG9mIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucywgdG8gYmUgd29ya2VkIGJ5IHJvdyBhbmQgbm90IGNvbHVtbnMKICAgZmlsdGVyKCFzdHJfZGV0ZWN0KHZhcmlhYmxlLCAibm90X2luZm9ybWVkfG5vdF9pbmZvcm1lZHxubyBpbmZvcm1hdGlvbiIpKSU+JSAjIyByZW1vdmUgdmFyaWFibGVzIHRoYXQgd2lsbCBub3QgYmUgbmVlZGVkCiAgIG11dGF0ZSggIyMgaGVyZSBJIHN0YXJ0IHRvIGRlZmluZSB0aGUgY29sdW1ucyB0aGF0IEkgd2lsbCB1c2UuIEkgd2lsbCBleHRyYWN0IHRoZSBuZXcgY29sdW1ucyBmcm9tIHRoZSB2YXJpYWJsZSBjb2x1bW4KICAgICBnZW5kZXIgPSBjYXNlX3doZW4oCiAgICAgICBzdHJfZGV0ZWN0KHZhcmlhYmxlLCAiKGZlbWFsZSkiKSB+ICJmZW1hbGUiLAogICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgIihtYWxlKSIpIH4gIm1hbGUiLAogICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pLAogICAgIHZhcmlhYmxlID0gZ3N1YigiX21hbGV8X2ZlbWFsZXwiLCAiIiwgdmFyaWFibGUpLCAjIyBhdCB0aGlzIHBvaW50IEkgbmVlZCB0byByZW1vdmUgdGhlIGdlbmRlciBzdHJpbmcgdG8gYXZvaWQgY29uZmxpY3RzIGxhdGVyIGluIHRoZSBjb2RlCiAgICAgZXRobmljaXR5ID0gaWZlbHNlKGdyZXBsKCJldGhuaWNpdHlfIiwgdmFyaWFibGUpLAogICAgICAgICAgICAgICAgICAgIHN1YigiZXRobmljaXR5XyIsICIiLCB2YXJpYWJsZSksIE5BKSwKICAgICBldGhuaWNpdHkgPSBpZl9lbHNlKGV0aG5pY2l0eSA9PSAid2hpdGUiLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZl9lbHNlKGV0aG5pY2l0eSAlaW4lIGMoImJsYWNrIiwgImJyb3duIiksICJibGFjayBvciBicm93biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSAlaW4lIGMoJ3llbGxvdycsJ2luZGlnZW5vdXMnKSwgJ3llbGxvdyBvciBpbmRpZ2Vub3VzJyxOQSkpKSwKICAgICBsZXZlbF9vZl9lZHVjYXRpb24gPSBpZmVsc2UoZ3JlcGwoImxldmVsX29mX2VkdWNhdGlvbl8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJsZXZlbF9vZl9lZHVjYXRpb25fIiwiIiwgdmFyaWFibGUpLCBOQSksCiAgICAgd2FnZSA9IGlmZWxzZShncmVwbCgid2FnZV8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViKCJ3YWdlXyIsIiIsdmFyaWFibGUpLE5BKSwKICAgICBhZ2VfcmFuZ2UgPSBpZmVsc2UoZ3JlcGwoImFnZV9yYW5nZV8iLCB2YXJpYWJsZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YigiYWdlX3JhbmdlXyIsIiIsdmFyaWFibGUpLE5BKSklPiUKICAgbXV0YXRlX2F0KHZhcnMoLXByaXNvbmVycyksIGFzLmZhY3RvcikgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KCJkYXRlIiwicmVnaW9uIiwic3RhdGUiLCAiZ2VuZGVyIiwiZXRobmljaXR5IiwKICAgICAgICAgICJsZXZlbF9vZl9lZHVjYXRpb24iLCAiYWdlX3JhbmdlIiwgIndhZ2UiLCJwcmlzb25lcnMiKSAlPiUgIyMgSSB1c2VkIHNlbGVjdCgpIG9ubHkgYmVjYXVzZSBJIHdvdWxkIGxpa2UgdG8gdmlldyB0aGUgY29sdW1ucyBpbiB0aGF0IG9yZGVyCiAgIGZpbHRlcighaXMubmEoZ2VuZGVyKSkKYGBgCgoKIyMgR2VuZXJhdGlvbiBvZiB0aGUgVGFibGVzCgpSZWdhcmRpbmcgdGhlIHF1YW50aXR5IG9mIHByaXNvbmVycywgdGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB0YWJsZSBiZWNhdXNlIG5vdCBhbGwgZGV0ZW50aW9uIGNlbnRlcnMgYXJlIGFibGUgdG8gY29sbGVjdCBhbGwgZGF0YS4gU28sIHdpdGggdGhlIG90aGVyIHRhYmxlcyBJIHdpbGwgd29yayBvbmx5IHdpdGggdGhlIHBlcmNlbnRhZ2Ugb2YgcHJpc29uZXJzIGluIHJlbGF0aW9uIHRvIHRoZSB0b3RhbCBhbmQgZXh0cmFjdCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBmcm9tIGhlcmUuCgoKIyMjIFRhYmxlIHdpdGggdGhlIHRvdGFsIHByaXNvbiBwb3B1bGF0aW9uCmBgYHtyIHByaXNvbl9wb3B1bGF0aW9uLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwcmlzb25fcG9wdWxhdGlvbiA8LWluZm9wZW5fM19zdW1tYXJ5ICU+JQogICBmaWx0ZXIoc3RyX2RldGVjdCh2YXJpYWJsZSwgInByaXNvbl9wb3B1bGF0aW9uIikpJT4lCiAgIHJvd3dpc2UoKSAlPiUKICAgbXV0YXRlKAogICAgIGdlbmRlciA9IGNhc2Vfd2hlbigKICAgICAgIHN0cl9kZXRlY3QodmFyaWFibGUsICJmZW1hbGUiKSB+ICJmZW1hbGUiLAogICAgICAgc3RyX2RldGVjdCh2YXJpYWJsZSwgIm1hbGUiKSB+ICJtYWxlIiwKICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBkYXRlLCBnZW5kZXIsIHByaXNvbmVycykgJT4lCiAgIGRyb3BfbmEoKSAlPiUKICAgdW5ncm91cCgpCgpwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnkgPC0gcHJpc29uX3BvcHVsYXRpb24gJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUgIyMgYWZ0ZXIgc29tZSBhbmFseXNpcyBJIGRlY2lkZWQgdG8gdXNlIG9ubHkgMSByZWZlcmVuY2UgcGVyIHllYXIsIGluc3RlYWQgb2YgYW4gYXZlcmFnZSBvZiB0aGUgdmFsdWVzLgogICBncm91cF9ieShyZWdpb24sIHN0YXRlLCBkYXRlKSAlPiUKICAgbXV0YXRlKHllYXIgPSBzdHJfcmVwbGFjZShkYXRlLCAiXFxEKihcXGR7NH0pLioiLCAiXFwxIikpICU+JSAjIyByZW1vdmluZyB0aGUgZmlyc3QgNCBjaGFyYWN0ZXJzIGZyb20gdGhlIHZhbHVlcyBpbiBjb2x1bW4gJ3llYXInCiAgIHVuZ3JvdXAoKSAlPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSkgJT4lCiAgIHN1bW1hcmlzZSh0b3RhbF9wcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIHRvdGFsX3ByaXNvbmVycykKYGBgCgpJJ2xsIGp1c3QgbGVhdmUgdGhpcyBleGFtcGxlIG9mIGNvZGUsIGJlY2F1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3RoZXIgdGFibGVzLCB0aGVyZSBpcyBub3QgbXVjaCBkaWZmZXJlbmNlIGluIHJlbGF0aW9uIHRvIHRoZSBwcm9jZXNzIG9mIHRoaXMgb25lLiBXaGF0IGNhbiBjaGFuZ2UgYXJlIHNvbWUgcHVuY3R1YWwgYWRqdXN0bWVudHMsIGJ1dCBub3RoaW5nIHRoYXQgZGVzZXJ2ZXMgbWVudGlvbi4KYGBgIHtyIENyZWF0aW5nIGFnZSByYW5nZSB0YWJsZX0KaW5mb3Blbl9hZ2VfcmFuZ2UgPC1pbmZvcGVuXzQgJT4lCiAgc2VsZWN0KHJlZ2lvbixzdGF0ZSxkYXRlLGdlbmRlciwgYWdlX3JhbmdlLCBwcmlzb25lcnMpICU+JSAjIyBzZWxlY3QgY29sdW1ucwogIG11dGF0ZShhZ2VfcmFuZ2UgPSBnc3ViKCJfIiwgIiAiLCBhZ2VfcmFuZ2UpKSAlPiUgIyMgcmVtb3ZlIHRoZSAiXyIgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCBhbmQgZXhwb3J0IHRvIGNzdgogIG11dGF0ZV9hdCh2YXJzKC1wcmlzb25lcnMpLCBhcy5mYWN0b3IpICU+JSAjIyBjb252ZXJ0IGFsbCBjb2x1bW5zIHRvIGZhY3RvciAtcHJpc29uZXJzCiAgZHJvcF9uYSgpICMjIHJlbW92ZSBOQQoKaW5mb3Blbl9hZ2VfcmFuZ2VfMl9wZXJjZW50YWdlIDwtIGluZm9wZW5fYWdlX3JhbmdlICU+JQogIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICBncm91cF9ieShyZWdpb24sIHN0YXRlLCBkYXRlKSAlPiUKICBtdXRhdGUoeWVhciA9IHN0cl9yZXBsYWNlKGRhdGUsICJcXEQqKFxcZHs0fSkuKiIsICJcXDEiKSwKICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICBwZXJjZW50YWdlX3ByaXNvbmVycyA9IHJvdW5kKCgocHJpc29uZXJzIC8gdG90YWxfcHJpc29uZXJzKSAqIDEwMCksMiksCiAgICAgICAgIHN0YXRlID0gYXMuZmFjdG9yKHN0YXRlKSwKICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBnZW5kZXIsIGFnZV9yYW5nZSwgcGVyY2VudGFnZV9wcmlzb25lcnMpCgppbmZvcGVuX2FnZV9yYW5nZV8zX2ZpbmFsIDwtIGluZm9wZW5fYWdlX3JhbmdlXzJfcGVyY2VudGFnZSAlPiUKICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogIG11dGF0ZShwcmlzb25lcnMgPSByb3VuZCgoKHBlcmNlbnRhZ2VfcHJpc29uZXJzIC8gMTAwKSAqIHRvdGFsX3ByaXNvbmVycyksIDApKSAlPiUKICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCBhZ2VfcmFuZ2UsIHByaXNvbmVycykKCmluZm9wZW5fYWdlX3JhbmdlXzQgPC0gaW5mb3Blbl9hZ2VfcmFuZ2VfM19maW5hbCAlPiUKICBncm91cF9ieSh5ZWFyLCBhZ2VfcmFuZ2UpICU+JQogIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpKQpgYGAKCmBgYCB7ciBDcmVhdGluZyB0aGUgb3RoZXIgSU5GT1BFTiB0YWJsZXMsIGluY2x1ZGUgPSBGQUxTRX0KaW5mb3Blbl9ldGhuaWNpdHkgPC0gaW5mb3Blbl80ICU+JQogICBzZWxlY3QocmVnaW9uLHN0YXRlLGRhdGUsZ2VuZGVyLCBldGhuaWNpdHksIHByaXNvbmVycykgJT4lCiAgIG11dGF0ZShldGhuaWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBldGhuaWNpdHkpKSAlPiUKICAgbXV0YXRlX2F0KHZhcnMoLXByaXNvbmVycyksIGFzLmZhY3RvcikgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbixzdGF0ZSxkYXRlLGdlbmRlciwgZXRobmljaXR5KSAlPiUKICAgc3VtbWFyaXNlKHByaXNvbmVycyA9IHN1bShwcmlzb25lcnMpKSAlPiUKICAgZHJvcF9uYSgpCgppbmZvcGVuX2V0aG5pY2l0eV8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl9ldGhuaWNpdHkgJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0ZSwgZGF0ZSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gc3RyX3JlcGxhY2UoZGF0ZSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpLAogICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICAgcGVyY2VudGFnZV9wcmlzb25lcnMgPSByb3VuZCgoKHByaXNvbmVycyAvIHRvdGFsX3ByaXNvbmVycykgKiAxMDApLDIpLAogICAgICAgICAgc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpLAogICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgZXRobmljaXR5LCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fZXRobmljaXR5XzNfZmluYWwgPC0gaW5mb3Blbl9ldGhuaWNpdHlfMl9wZXJjZW50YWdlICU+JQogICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogIGZpbHRlcighc3RyX2RldGVjdChldGhuaWNpdHksInllbGxvdyBvciBpbmRpZ2Vub3VzIikpICU+JSAKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKCgocGVyY2VudGFnZV9wcmlzb25lcnMgLyAxMDApICogdG90YWxfcHJpc29uZXJzKSwgMCksCiAgICAgICAgICBldGhuaWNpdHkgPSB0b2xvd2VyKGV0aG5pY2l0eSksCiAgICAgICAgICB5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSkgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSwpICU+JQogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHByaXNvbmVycykpICU+JQogICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZXRobmljaXR5LCBwcmlzb25lcnMpCgojIGFycmVzdGVkIGFjY29yZGluZyB0byByZW11bmVyYXRpb24uIE9mIGFsbCB0aGUgdGFibGVzLCB0aGlzIGlzIHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBkYXRhLgoKaW5mb3Blbl93YWdlIDwtaW5mb3Blbl80ICU+JQogICBzZWxlY3QocmVnaW9uLCBzdGF0ZSwgZGF0ZSwgZ2VuZGVyLCB3YWdlLCBwcmlzb25lcnMpICU+JQogICBtdXRhdGUod2FnZSA9IGdzdWIoIl8iLCAiICIsIHdhZ2UpLAogICAgICAgICAgd2FnZSA9IGdzdWIoIjMuNCIsICIzLzQiLCB3YWdlKSwKICAgICAgICAgIHdhZ2UgPSBnc3ViKCJkb2VzIG5vdCByZWNlaXZlZCIsImRvZXMgbm90IHJlY2VpdmUiLCB3YWdlKSkgJT4lCiAgIG11dGF0ZV9hdCh2YXJzKC1wcmlzb25lcnMpLCBhcy5mYWN0b3IpICU+JQogICBkcm9wX25hKCkKCmluZm9wZW5fd2FnZV8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl93YWdlICU+JQogICBmaWx0ZXIoZ3JlcGwoIl5kZWMiLCBkYXRlKSB8IGRhdGUgPT0gImp1biAyMDE5IiwKICAgICAgICAgICFncmVwbCgibm8gaW5mb3JtYXRpb24iLCB3YWdlKSkgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdGUsIGRhdGUpICU+JQogICBtdXRhdGUoeWVhciA9IHN0cl9yZXBsYWNlKGRhdGUsICJcXEQqKFxcZHs0fSkuKiIsICJcXDEiKSwKICAgICAgICAgIHRvdGFsX3ByaXNvbmVycyA9IHN1bShwcmlzb25lcnMsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICBwZXJjZW50YWdlX3ByaXNvbmVycyA9IHJvdW5kKCgocHJpc29uZXJzIC8gdG90YWxfcHJpc29uZXJzKSAqIDEwMCksMiksCiAgICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSksCiAgICAgICAgICB5ZWFyID0gYXMuY2hhcmFjdGVyKHllYXIpKSAlPiUKICAgdW5ncm91cCgpICU+JQogICBzZWxlY3QoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCB3YWdlLCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fd2FnZV8zX2ZpbmFsIDwtIGluZm9wZW5fd2FnZV8yX3BlcmNlbnRhZ2UgJT4lCiAgIGxlZnRfam9pbihwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnksIGJ5ID0gYygieWVhciIsICJyZWdpb24iLCAic3RhdGUiKSkgJT4lCiAgIG11dGF0ZShwcmlzb25lcnMgPSByb3VuZCgoKHBlcmNlbnRhZ2VfcHJpc29uZXJzIC8gMTAwKSAqIHRvdGFsX3ByaXNvbmVycyksIDApKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgd2FnZSwgcHJpc29uZXJzKSAlPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSwgd2FnZSwpICU+JQogICBzdW1tYXJpc2UocHJpc29uZXJzID0gc3VtKHByaXNvbmVycykpCgojIEZpbmFsbHksIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24gdGFibGUsIHdoaWNoIHdpbGwgc3RpbGwgcmVjZWl2ZSBhbm90aGVyIHRyZWF0bWVudCBsYXRlciBvbgoKaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gPC1pbmZvcGVuXzQgJT4lCiAgIHNlbGVjdChyZWdpb24sc3RhdGUsZGF0ZSxnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiwgcHJpc29uZXJzKSAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IGdzdWIoIl8iLCAiICIsIGxldmVsX29mX2VkdWNhdGlvbikpICU+JQogICBtdXRhdGVfYXQodmFycygtcHJpc29uZXJzKSwgYXMuZmFjdG9yKSAlPiUKICAgZHJvcF9uYSgpCgppbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8yX3BlcmNlbnRhZ2UgPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gJT4lCiAgIGZpbHRlcihncmVwbCgiXmRlYyIsIGRhdGUpIHwgZGF0ZSA9PSAianVuIDIwMTkiKSAlPiUKICAgZ3JvdXBfYnkocmVnaW9uLCBzdGF0ZSwgZGF0ZSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gc3RyX3JlcGxhY2UoZGF0ZSwgIlxcRCooXFxkezR9KS4qIiwgIlxcMSIpLAogICAgICAgICAgdG90YWxfcHJpc29uZXJzID0gc3VtKHByaXNvbmVycywgbmEucm0gPSBUUlVFKSwgIyB0b3RhbCBzdW0gb2YgcHJpc29uZXJzIGJ5IHJlZ2lvbiwgc3RhdGUsIGdlbmRlciBhbmQgeWVhcgogICAgICAgICAgcGVyY2VudGFnZV9wcmlzb25lcnMgPSByb3VuZCgoKHByaXNvbmVycyAvIHRvdGFsX3ByaXNvbmVycykgKiAxMDApLDIpLAogICAgICAgICAgc3RhdGUgPSBhcy5mYWN0b3Ioc3RhdGUpLAogICAgICAgICAgeWVhciA9IGFzLmNoYXJhY3Rlcih5ZWFyKSkgJT4lCiAgIHVuZ3JvdXAoKSAlPiUKICAgc2VsZWN0KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgbGV2ZWxfb2ZfZWR1Y2F0aW9uLCBwZXJjZW50YWdlX3ByaXNvbmVycykKCmluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzNfZmluYWwgPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fMl9wZXJjZW50YWdlICU+JQogICBsZWZ0X2pvaW4ocHJpc29uX3BvcHVsYXRpb25fMl9zdW1tYXJ5LCBieSA9IGMoInllYXIiLCAicmVnaW9uIiwgInN0YXRlIikpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gcm91bmQoKChwZXJjZW50YWdlX3ByaXNvbmVycyAvIDEwMCkgKiB0b3RhbF9wcmlzb25lcnMpLCAwKSkgJT4lCiAgIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiwgcHJpc29uZXJzKQpgYGAKCgojIyBJTkZPUEVOIERhdGEgVmlzdWFsaXphdGlvbiB7LnRhYnNldCAudGFic2V0LWZhZGV9CgpIZXJlIGFyZSB0aGUgSU5GT1BFTiB0YWJsZXMgdGhhdCBJIHdpbGwgYmUgdXNpbmcuIE5vdGUgdGhhdCBJIGNvbWJpbmVkIHNldmVyYWwgdGFibGVzLCByZWFycmFuZ2VkIHRoZSBjb2x1bW5zIGFuZCBleHRyYWN0ZWQgNSBkaWZmZXJlbnQgdGFibGVzLCB3aXRoIHBhbmVsIGRhdGEuCgojIyMgUHJpc29uIHBvcHVsYXRpb24KYGBgIHtyIFByaXNvbiBwb3B1bGF0aW9uLCBlY2hvID0gRkFMU0UgfQpzdW1tYXJ5X3ByaXNvbl9wb3B1bGF0aW9uIDwtIHByaXNvbl9wb3B1bGF0aW9uICU+JQogICAgIGFycmFuZ2UoZGVzYyhwcmlzb25lcnMpKQoKa2FibGUoaGVhZChzdW1tYXJ5X3ByaXNvbl9wb3B1bGF0aW9uLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCgpgYGAKICAKIyMjIEV0aG5pY2l0eQpgYGAge3IgRXRobmljaXR5LCBlY2hvID0gRkFMU0UgfQpzdW1tYXJ5X2V0aG5pY2l0eSA8LSBpbmZvcGVuX2V0aG5pY2l0eV8zX2ZpbmFsICU+JQogICAgIGFycmFuZ2UoZGVzYyhwcmlzb25lcnMpKQoKa2FibGUoaGVhZChzdW1tYXJ5X2V0aG5pY2l0eSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQpgYGAKCiMjIyBFZHVjYXRpb24gTGV2ZWwKYGBgIHtyIEVkdWNhdGlvbiBsZXZlbCAsIGVjaG8gPSBGQUxTRSB9CnN1bW1hcnlfaW5zdHJ1Y3Rpb24gPC0gaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fM19maW5hbCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfaW5zdHJ1Y3Rpb24sMTApKSAlPiUKICAga2FibGVfc3R5bGluZyhmdWxsX3dpZHRoID0gRiwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIikpCmBgYAoKIyMjIEFnZSByYW5nZQpgYGAge3IgQWdlIFJhbmdlICwgZWNobyA9IEZBTFNFIH0Kc3VtbWFyeV9hZ2UgPC0gaW5mb3Blbl9hZ2VfcmFuZ2VfNCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfYWdlLDEwKSkgJT4lCiAgIGthYmxlX3N0eWxpbmcoZnVsbF93aWR0aCA9IEYsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpKQpgYGAKCiMjIyBQYXkgcmFuZ2UKYGBgIHtyIFBheSBSYW5nZSAsIGVjaG8gPSBGQUxTRSB9CnN1bW1hcnlfd2FnZSA8LSBpbmZvcGVuX3dhZ2VfM19maW5hbCAlPiUKICAgYXJyYW5nZShkZXNjKHByaXNvbmVycykpCgprYWJsZShoZWFkKHN1bW1hcnlfd2FnZSwxMCkpICU+JQogICBrYWJsZV9zdHlsaW5nKGZ1bGxfd2lkdGggPSBGLCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSkKYGBgCgojIFRhYmxlIElCR0UgTGV2ZWwgb2YgRWR1Y2F0aW9uClRoZSBwdXJwb3NlIG9mIHRoaXMgYW5hbHlzaXMgaXMgdG8gY29tcGFyZSBkYXRhIGZyb20gdGhlIHByaXNvbiBwb3B1bGF0aW9uIHdpdGggZGF0YSBmcm9tIHRoZSBJQkdFLCBhbmQgbWFrZSBhIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlbS4gVGhlIGRhdGEgSSB3aWxsIHVzZSBoZXJlIGFyZSBwYXJ0IG9mIHRoZSBOYXRpb25hbCBIb3VzZWhvbGQgU2FtcGxlIFN1cnZleSBDb250aW51ZXMgKFBOQURDKSBhbmQgY2FuIGJlIGZvdW5kIG9uIHRoZSBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuIGh0bWwpLgogIApIZXJlIEkgc3RhcnQgd29ya2luZyBvbiB0aGUgc2Vjb25kIHRhYmxlIHRoYXQgd2lsbCBiZSB1c2VkLiBUaGlzIHNpbmdsZSB0YWJsZSBoYXMgc2V2ZXJhbCBzaGVldHMgdGhhdCBJIHdpbGwgZXh0cmFjdCBhbmQgbWFuaXB1bGF0ZSB0aGUgZGF0YS4gVGhlIHRhYmxlICJQTkFEX0NvbnRpbnVhXzIwMThfRWR1Y2FjYW8ueGxzIiBoYXMgZGF0YSByZWdhcmRpbmcgdGhlIGVkdWNhdGlvbiBvZiB0aGUgcG9wdWxhdGlvbi4gVGhlcmUgYXJlIHNldmVyYWwgcGllY2VzIG9mIGluZm9ybWF0aW9uLCBpbmNsdWRpbmc6IGVkdWNhdGlvbmFsIGxldmVsIGJ5IHJlZ2lvbiwgZ2VuZGVyIGFuZCBldGhuaWNpdHkuIFRoaXMgdGFibGUgYWxzbyBwcmVzZW50cyBwYW5lbCBkYXRhLgoqWWVsbG93IGFuZCBJbmRpZ2Vub3VzIGFyZSBpbmNsdWRlZCBpbiB0aGUgVG90YWwqCgoKSSdtIGdvaW5nIHRvIHNraXAgdGhlIHRhYmxlIGltcG9ydCBwYXJ0IGFuZCBnbyBkaXJlY3RseSB0byB0aGUgZGF0YWZyYW1lLgpgYGB7ciBQTkFEX0NvbnRpbnVhXzIwMThfRWR1Y2F0aW9uLCBpbmNsdWRlPUZBTFNFfQojIHNldCBwYXRoIHRvIGV4Y2VsIGZpbGUKcG5hZF9maWxlX3BhdGggPC0gIlBOQURjL1BOQURfQ29udGludWFfMjAxOF9FZHVjYWNhby54bHMiCgojIGdldCB0aGUgbmFtZXMgb2YgdGhlIHNoZWV0cyB0aGF0IHdpbGwgYmUgdXNlZApwbmFkX3NoZWV0X25hbWVzIDwtIGV4Y2VsX3NoZWV0cyhwbmFkX2ZpbGVfcGF0aCkKCiMgcmVtb3ZlIHRoZSBmaXJzdCB0d28gc2hlZXRzCnBuYWRfc2hlZXRfbmFtZXMgPC0gcG5hZF9zaGVldF9uYW1lc1stYygxLCAyKV0KCiMgY3JlYXRlIGFuIGVtcHR5IGRhdGEgZnJhbWUKcG5hZCA8LSBkYXRhLmZyYW1lKCkKCiMgbG9vcCB0aHJvdWdoIGFsbCB0aGUgc2hlZXRzIGFuZCBhZGQgdGhlbSB0byB0aGUgZW1wdHkgZGF0YWZyYW1lCmZvciAoaSBpbiBzZXFfYWxvbmcocG5hZF9zaGVldF9uYW1lcykpIHsKICAgcG5hZF9zaGVldCA8LSByZWFkX2V4Y2VsKHBuYWRfZmlsZV9wYXRoLCBzaGVldCA9IHBuYWRfc2hlZXRfbmFtZXNbaV0sIHNraXAgPSA3KQogICBwbmFkIDwtIGJpbmRfcm93cyhwbmFkLCBwbmFkX3NoZWV0KQp9CgojIHRvIGF2b2lkIGRpc3RyYWN0aW9ucywgSSdtIGdvaW5nIHRvIHJlbW92ZSB0aGUgcG5hZF9sZWFmIHZhcmlhYmxlIHRoYXQgd2FzIGNyZWF0ZWQgdG8gbG9vcCBpbiB0aGUgcG5hZCBkYXRhZnJhbWUKcm0oc2hlZXRfcG5hZCkKCiMgcmVuYW1lIHRoZSBjb2x1bW5zIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdvcmsgd2l0aCB0aGVtCmNvbG5hbWVzKHBuYWQpPC0gYygiaW5kaWNhdG9yIiwgInRlcnJpdG9yaWFsX2xldmVsIiwKICAgICAgICAgICAgICAgICAgICAidGVycml0b3JpYWxfb3BlbmluZyIsInZhcmlhYmxlXzEiLAogICAgICAgICAgICAgICAgICAgICJjYXRlZ29yeV8xIiwgInZhcmlhYmxlXzIiLAogICAgICAgICAgICAgICAgICAgICJjYXRlZ29yeV8yIiwiMjAxNiIsIjIwMTciLCIyMDE4IikKCiNyZW1vdmUgZHVwbGljYXRlIGxpbmVzIGJlY2F1c2UgbGV2ZWwgYnJhc2lsIGlzIHByZXNlbnQgaW4gYWxsIHNoZWV0cwpwbmFkIDwtIHBuYWRbIWR1cGxpY2F0ZWQocG5hZCksIF0KYGBgCiAgClZpc3VhbGl6YXRpb24gb2YgdGhlIFBOQUQgVGFibGUKYGBge3IgdmlzdWFsaXphdGlvbiBvZiB0aGUgUE5BRCB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwbmFkLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKClRoaXMgZGF0YWZyYW1lIGdhdGhlcnMgZGF0YSBmcm9tIGFsbCB0YWJzIG9mIHRoZSAiUE5BRF9Db250aW51YV8yMDE4X0VkdWNhY2FvLnhscyIgZmlsZSwgdGhlcmUgaXMgc3RpbGwgYSBsb3Qgb2YgbWFuaXB1bGF0aW9uIHRvIGJlIGRvbmUuCgojIyBEYXRhIE1hbmlwdWxhdGlvbgoKRmlyc3QsIEknbSBnb2luZyB0byB0cmFuc3Bvc2UgdGhlIGRhdGEgc28gdGhhdCBJIGNhbiB0cmFuc2Zvcm0gaXQgaW50byBsb25nIGZvcm1hdCwganVzdCBsaWtlIGluIHRoZSBwcmV2aW91cyBtb2RlbCwgd2l0aCB0aGUgSU5GT1BFTiB0YWJsZS4KYGBge3IgdHJhbnNmb3JtIHBuYWQgdGFibGUsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBuYWRfMl9sb25nX2Zvcm1hdCA8LSBwaXZvdF9sb25nZXIocG5hZCwgODoxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190bz0ieWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZHJvcF9uYSA9IFRSVUUpCmBgYAoKSSdsbCBtdWx0aXBseSB0aGUgdmFsdWUgaW4gdGhlICd2YWx1ZScgY29sdW1uIGJ5IDEwMDAgaWYgdGhlICdpbmRpY2F0b3InIGNvbHVtbiBjb250YWlucyB0aGUgc3RyaW5nICcobWlsIHBlc3NvYXMpJycodGhvdXNhbmQgcGVvcGxlKScgYW5kIHRoZW4gcmVtb3ZlIGl0LiBUaGVuIEknbGwgY3JlYXRlIGEgJ3JlZ2lvbicgdmFyaWFibGUgdG8gc3RvcmUgdGhlIHJlZ2lvbiBvZiBlYWNoIHN0YXRlLgpgYGB7ciBwbmFkXzNfd2l0aF9yZWdpb25zfQpwbmFkXzNfd2l0aF9yZWdpb25zIDwtIHBuYWRfMl9sb25nX2Zvcm1hdCAlPiUKICAgbXV0YXRlKHZhbHVlID0gaWZlbHNlKGdyZXBsKCIobWlsIHBlc3NvYXMpIiwgaW5kaWNhdG9yKSwgdmFsdWUgKiAxMDAwLCB2YWx1ZSksCiAgICAgICAgICBpbmRpY2F0b3IgPSBnc3ViKCJcXHMqXFwobWlsIHBlc3NvYXNcXCkiLCAiIiwgaW5kaWNhdG9yKSwKICAgICAgICAgIHJlZ2lvbiA9IGNhc2Vfd2hlbih0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiQWNyZSIsICJBbWF6b25hcyIsICJBbWFww6EiLCAiUGFyw6EiLCAiUm9uZMO0bmlhIiwgIlJvcmFpbWEiLCAiVG9jYW50aW5zIikgfiAiTm9ydGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcnJpdG9yaWFsX29wZW5pbmcgJWluJSBjKCJNYXJhbmjDo28iLCAiUGlhdcOtIiwgIkNlYXLDoSIsICJSaW8gR3JhbmRlIGRvIE5vcnRlIiwgIlBhcmHDrWJhIiwgIlBlcm5hbWJ1Y28iLCAiQWxhZ29hcyIsICJTZXJnaXBlIiwgIkJhaGlhIikgfiAiTm9ydGhlYXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiTWluYXMgR2VyYWlzIiwgIkVzcMOtcml0byBTYW50byIsICJSaW8gZGUgSmFuZWlybyIsICJTw6NvIFBhdWxvIikgfiAiU291dGhlYXN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiUGFyYW7DoSIsICJTYW50YSBDYXRhcmluYSIsICJSaW8gR3JhbmRlIGRvIFN1bCIpIH4gIlNvdXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJyaXRvcmlhbF9vcGVuaW5nICVpbiUgYygiTWF0byBHcm9zc28iLCAiTWF0byBHcm9zc28gZG8gU3VsIiwgIkdvacOhcyIsICJEaXN0cml0byBGZWRlcmFsIikgfiAiTWlkd2VzdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKQpgYGAKCmBgYHtyIFBvcHVsYXRpb24gZmluYWwgdGFibGVzIGJ5IHJlZ2lvbiBhbmQgYWdlIDE0IGFuZCBvdmVyLCBpbmNsdWRlPUZBTFNFfQpwbmFkXzRfcG9wdWxhdGlvbl9hZ2UgPC0gcG5hZF8zX3dpdGhfcmVnaW9ucyAlPiUKICAgZmlsdGVyKGluZGljYXRvciA9PSJQb3B1bGHDp8OjbyIsCiAgICAgICAgICB0ZXJyaXRvcmlhbF9sZXZlbCA9PSAiVW5pZGFkZSBkYSBGZWRlcmHDp8OjbyIsCiAgICAgICAgICBjYXRlZ29yeV8xICVpbiUgYygiSG9tZW0iLCAiTXVsaGVyIiwiQnJhbmNhIiwiUHJldGEgb3UgcGFyZGEiLCJUb3RhbMK5IiksCiAgICAgICAgICBjYXRlZ29yeV8yICE9IlRvdGFsIikgJT4lCiAgIG11dGF0ZShnZW5kZXIgPSBpZmVsc2UoY2F0ZWdvcnlfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIpLCBjYXRlZ29yeV8xLCBOQSksCiAgICAgICAgICBldGhuaWNpdHkgPSBpZmVsc2UoY2F0ZWdvcnlfMSAlaW4lIGMoIkJyYW5jYSIsIlByZXRhIG91IHBhcmRhIiwiVG90YWzCuSIpLCBjYXRlZ29yeV8xLCBOQSksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHRlcnJpdG9yaWFsX29wZW5pbmcpXSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBnZW5kZXIsIGV0aG5pY2l0eSwgImFnZV9ncm91cCIgPSBjYXRlZ29yeV8yLCB5ZWFyLCB2YWx1ZSkKYGBgCgoKYGBge3IgcG5hZF80X3BvcHVsYXRpb25fYWdlIHRyYXNsYXRlLCBpbmNsdWRlPUZBTFNFfQoKcG5hZF80X3BvcHVsYXRpb25fYWdlIDwtIHBuYWRfNF9wb3B1bGF0aW9uX2FnZSAlPiUgCiAgbXV0YXRlKCBnZW5kZXIgPSByZWNvZGUoZ2VuZGVyLCAgCiAgICAiSG9tZW0iID0gICJtYWxlIiwKICAgICJNdWxoZXIiID0gImZlbWFsZSIpLAogICAgICAgICAgZXRobmljaXR5ID0gcmVjb2RlKGV0aG5pY2l0eSwKICAgICJCcmFuY2EiPSJ3aGl0ZSIsCiAgICAiUHJldGEgb3UgcGFyZGEiID0gImJsYWNrIG9yIGJyb3duIiksCiAgICAgICAgICBhZ2VfZ3JvdXAgPSByZWNvZGUoYWdlX2dyb3VwLAogICAgIihbMC05XSspIGEgKFswLTldKykgYW5vcyIgPSAiXFwxIHRvIFxcMiB5ZWFycyBvbGQiLAogICAgIihbMC05XSspIGUgKFswLTldKykgYW5vcyIgPSAiXFwxIGFuZCBcXDIgeWVhcnMgb2xkIiwKICAgICIoWzAtOV0rKSBhbm9zIG91IG1haXMiID0gIlxcMSB5ZWFycyBvbGQgYW5kIG92ZXIiKQogICAgKQoKCmBgYAoKCiMjIyBQTkFEIHRhYmxlIFBvcHVsYXRpb24gYWdlZCAxOCBvciBvdmVyCgpJJ20gZ29pbmcgdG8gY29tYmluZSB0aGlzIElCR0UgdGFibGUgd2l0aCB0aGUgZmlyc3QgSU5GT1BFTiB0YWJsZSB0aGF0IGNvbmNlcm5zIHRoZSBwcmlzb24gcG9wdWxhdGlvbiwgdGh1cyBhbHNvIGJlaW5nIGFibGUgdG8gY29ycmVsYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcHJpc29uZXJzIHdpdGggcGVvcGxlIGFnZWQgMTggb3Igb3ZlciwgYnV0IGluIGEgc3VtbWFyaXplZCB3YXkuCgpgYGB7ciBwcmlzb24gcG9wdWxhdGlvbiB2cyBCcmF6aWxpYW4gcG9wdWxhdGlvbiBhZ2VkIDE4IGFuZCBvdmVyLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uXzE4X3llYXJzX2FuZF9vdmVyIDwtIHBuYWRfNF9wb3B1bGF0aW9uX2FnZSAlPiUKICAgc2VsZWN0KC1ldGhuaWNpdHkpICU+JQogICBmaWx0ZXIoIXN0cl9kZXRlY3QoYWdlX2dyb3VwLCAiMCB0byAzIHllYXJzIG9sZHw0IGFuZCA1IHllYXJzIG9sZHw2IHRvIDkgeWVhcnMgb2xkfDEwIHRvIDE0IHllYXJzIG9sZHwxNSB0byAxNyB5ZWFycyBvbGQiKSkgJT4lCiAgIG5hLm9taXQoKQoKcG9wdWxhdGlvbl8xOF95ZWFyc19hbmRfb3Zlcl8yIDwtIHBvcHVsYXRpb25fMThfeWVhcnNfYW5kX292ZXIgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUpICU+JQogICBzdW1tYXJpc2UodmFsdWUgPSBzdW0odmFsdWUpKSAlPiUKICAgcmVuYW1lKHRvdGFsID0gdmFsdWUpCmBgYAoKSGVyZSB3ZSBjYW4gaGF2ZSBhbiBpZGVhIG9mIHRoZSBkYXRhIHByZXNlbnQgaW4gdGhpcyB0YWJsZS4KYGBge3IgaGVhZChwb3B1bGF0aW9uXzE4X3llYXJzX2FuZF9vdmVyXzIpLCBlY2hvPUZBTFNFfQpoZWFkKHBvcHVsYXRpb25fMThfeWVhcnNfYW5kX292ZXJfMikKYGBgCgpUaGlzIHRhYmxlIGhhcyBkYXRhIGZyb20gMjAxNiB0byAyMDE4LiBUaGUgZmlyc3Qgc3RlcCB3aWxsIGJlIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBlb3BsZSBmb3IgZWFjaCB2YXJpYWJsZSBpbiB0aGUgeWVhciAyMDE5LCB1c2luZyB0aGUgYXJpdGhtZXRpYyBtZXRob2QgZGVzY3JpYmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBhbmFseXNpcy4KCiMjIFVzaW5nIEFyaXRobWV0aWMgTWV0aG9kIHRvIEVzdGltYXRlIGEgUG9wdWxhdGlvbgoKSSdsbCBzdGFydCBieSB0cmFuc2Zvcm1pbmcgdGhpcyBkYXRhIGludG8gYSB3aWRlIGZvcm1hdCwgdGhlbiBJJ2xsIGFwcGx5IHRoZSBmdW5jdGlvbiB3aXRoIHRoZSBmb3JtdWxhIGFuZCBmaW5hbGx5IHJldHVybiB0aGUgdGFibGUgdG8gYSBsb25nIGZvcm1hdC4KCmBgYHtyIHBvcHVsYXRpb24gb3ZlciAxOCB5ZWFycyBvbGQgcG9wdWxhdGlvbiBzdGF0aXN0aWNzfQoKcG9wdWxhdGlvbl8xOF95ZWFyc19vcl9vdmVyXzMgPC0gcGl2b3Rfd2lkZXIocG9wdWxhdGlvbl8xOF95ZWFyc19hbmRfb3Zlcl8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc19mcm9tID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSB0b3RhbCkKCnBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl80IDwtIHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl8zICU+JQogIG11dGF0ZSgKICAgIGAyMDE5YCA9IHJvdW5kKGZvcm11bGEoYDIwMThgLDIwMTgsYDIwMTZgLDIwMTYsMjAxOSkpCiAgKQoKcG9wdWxhdGlvbl8xOF95ZWFyc19vcl9vdmVyXzUgPC0gcGl2b3RfbG9uZ2VyKHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl80LCBjb2xzID0gLWMoc3RhdGUscmVnaW9uKSxuYW1lc190byA9ICJ5ZWFyIix2YWx1ZXNfdG8gPSAicG9wdWxhdGlvbiIpICU+JQogICBtdXRhdGUoYWNyb3NzKC1wb3B1bGF0aW9uLCBhcy5mYWN0b3IpKQpgYGAKCkkgd2lsbCBub3cgY29tYmluZSB0aGlzIHRhYmxlIHdpdGggdGhlIElORk9QRU4gcHJpc29uIHBvcHVsYXRpb24uCmBgYHtyIHBvcHVsYXRpb25faW5mb3Blbl90b3RhbCwgaW5jbHVkZT1GQUxTRX0KcG9wdWxhdGlvbl9pbmZvcGVuX3RvdGFsIDwtIGxlZnRfam9pbihwcmlzb25fcG9wdWxhdGlvbl8yX3N1bW1hcnksIHBvcHVsYXRpb25fMThfeWVhcnNfb3Jfb3Zlcl81LCBieSA9IGpvaW5fYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSkgKSAlPiUKICAgcmVuYW1lKHByaXNvbmVycyA9IHRvdGFsX3ByaXNvbmVycykKCmBgYAoKCmBgYHtyIHBvcHVsYXRpb24gdmlld19pbmZvcGVuX3RvdGFsICwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5fdG90YWwsMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKCiMjIFRhYmxlIFBOQUQgRWR1Y2F0aW9uIERhdGEKICAKSSdtIGdvaW5nIHRvIHJlcGVhdCBiYXNpY2FsbHkgdGhlIHNhbWUgcHJvY2VzcyBpbiB0aGUgdGFibGUgd2l0aCBkYXRhIG9uIHRoZSBwb3B1bGF0aW9uLiBUaGlzIHRhYmxlLCBob3dldmVyLCBjb25zaWRlcnMgcGVvcGxlIGFnZWQgMTQgb3Igb3ZlciwgYXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgaW5kaWNhdG9yLgpgYGB7ciBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbiB9CmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIDwtIHBuYWRfM193aXRoX3JlZ2lvbnMgJT4lCiAgIGZpbHRlcihpbmRpY2F0b3IgPT0iUGVzc29hcyBkZSAxNCBhbm9zIG91IG1haXMgZGUgaWRhZGUiLAogICAgICAgICAgdGVycml0b3JpYWxfbGV2ZWwgPT0gIlVuaWRhZGUgZGEgRmVkZXJhw6fDo28iLAogICAgICAgICAgY2F0ZWdvcnlfMSAlaW4lIGMoIkhvbWVtIiwgIk11bGhlciIsICJCcmFuY2EiLCAiUHJldGEgb3UgUGFyZGEiLCAiVG90YWzCuSIpLAogICAgICAgICAgdmFyaWFibGVfMiA9PSAiTsOtdmVsIGRlIGluc3RydcOnw6NvIiwKICAgICAgICAgICEoY2F0ZWdvcnlfMiAlaW4lIGMoIlRvdGFsIikpKSAlPiUKICBmaWx0ZXIoIXN0cl9kZXRlY3QoY2F0ZWdvcnlfMSwiQnJhbmNhfFByZXRhIG91IFBhcmRhfFRvdGFswrkiKSkgJT4lIAogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgZ2VuZGVyID0gcmVjb2RlKGNhdGVnb3J5XzEsCiAgICAgICAiSG9tZW0iID0gIm1hbGUiLAogICAgICAgIk11bGhlciIgPSAiZmVtYWxlIiksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHRlcnJpdG9yaWFsX29wZW5pbmcpXSkgJT4lCiAgIHNlbGVjdChyZWdpb24sIHN0YXRlLCBnZW5kZXIsIGxldmVsX29mX2VkdWNhdGlvbiA9IGNhdGVnb3J5XzIsIHllYXIsIHRvdGFsID0gdmFsdWUpICU+JQogICBkcm9wX25hKCkKYGBgCiAgCiAgCmBgYHtyIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIHRyYW5zbGF0aW9uLCBpbmNsdWRlPUZBTFNFfQoKCmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uIDwtIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uICU+JQogIG11dGF0ZShsZXZlbF9vZl9lZHVjYXRpb24gPSByZWNvZGUobGV2ZWxfb2ZfZWR1Y2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbSBpbnN0cnXDp8OjbyIgPSAiTm8gZWR1Y2F0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5kYW1lbnRhbCBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgRWxlbWVudGFyeSBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdW5kYW1lbnRhbCBjb21wbGV0byAob3UgY3Vyc28gZXF1aXZhbGVudGUpIiA9ICJDb21wbGV0ZSBFbGVtZW50YXJ5IFNjaG9vbCAob3IgZXF1aXZhbGVudCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk3DqWRpbyBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgSGlnaCBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNw6lkaW8gY29tcGxldG8gKG91IGN1cnNvIGVxdWl2YWxlbnRlKSIgPSAiQ29tcGxldGUgSGlnaCBTY2hvb2wgKG9yIGVxdWl2YWxlbnQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdXBlcmlvciBpbmNvbXBsZXRvIChvdSBjdXJzbyBlcXVpdmFsZW50ZSkiID0gIkluY29tcGxldGUgQ29sbGVnZS9Vbml2ZXJzaXR5IChvciBlcXVpdmFsZW50KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3VwZXJpb3IgY29tcGxldG8iID0gIkNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIpKQoKCgoKYGBgCiAgCiAgClNhbWUgcHJvY2VzcyB0byBjYWxjdWxhdGUgdGhlIHBvcHVsYXRpb24gaW4gdGhlIHllYXIgMjAxOS4KYGBge3IgbGl0ZXJhY3lfcG9wdWxhdGlvbiBzdGF0aXN0aWNzIHBvcHVsYXRpb259CmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzIgPC0gcGl2b3Rfd2lkZXIoYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHRvdGFsKQoKYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fMyA8LSBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl8yICU+JQogIG11dGF0ZSgKICAgICBgMjAxOWAgPSByb3VuZChmb3JtdWxhKGAyMDE4YCwyMDE4LGAyMDE2YCwyMDE2LDIwMTkpKQogICApCgphbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl80IDwtIHBpdm90X2xvbmdlcihhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl8zLCBjb2xzID0gLWMocmVnaW9uOmxldmVsX29mX2VkdWNhdGlvbiksbmFtZXNfdG8gPSAieWVhciIsdmFsdWVzX3RvID0gInBvcHVsYXRpb24iKSAlPiUKICAgbXV0YXRlKGFjcm9zcygtcG9wdWxhdGlvbiwgYXMuZmFjdG9yKSkKYGBgCgpgYGB7ciB2aXN1YWxpemF0aW9uIG9mIHRhYmxlIGFsZmFiZXRpemFjYW9fcG9wdWxhY2FvXzQsIGVjaG89RkFMU0V9CmhlYWQoYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNCkKYGBgCgpBcyB5b3UgY2FuIGltYWdpbmUsIHRoZSBlZHVjYXRpb24gbGV2ZWwgZGlzdHJpYnV0aW9ucyBhcmUgbm90IHN0YW5kYXJkaXplZC4gSSdtIGdvaW5nIHRvIHVzZSBhIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGlzIHBhdHRlcm4gYmV0d2VlbiB0aGUgUE5BRCB0YWJsZSBhbmQgdGhlIElORk9QRU4gdGFibGUuCgpgYGB7UiBGdW5jdGlvbiB0byBzdGFuZGFyZGl6ZSBlZHVjYXRpb24gbGV2ZWx9CnN0YW5kYXJkaXplX2xldmVsX29mX2VkdWNhdGlvbiA8LSBmdW5jdGlvbihncmFkZSkgewogICBzaW1wbGlmaWVkX2dyYWRlIDwtIGdzdWIoIiBcXChvciBlcXVpdmFsZW50XFwpIiwgIiIsIGdyYWRlKQogICByZWNvZGUoc2ltcGxpZmllZF9ncmFkZSwKICAgICAgICAgICJObyBlZHVjYXRpb24iID0gImlsbGl0ZXJhdGUiLAogICAgICAgICAgIkluY29tcGxldGUgRWxlbWVudGFyeSBTY2hvb2wiID0gImVsZW1lbnRhcnkgc2Nob29sIGluY29tcGxldGUiLAogICAgICAgICAgIkNvbXBsZXRlIEVsZW1lbnRhcnkgU2Nob29sIiA9ICJlbGVtZW50YXJ5IHNjaG9vbCBjb21wbGV0ZSIsCiAgICAgICAgICAiSW5jb21wbGV0ZSBIaWdoIFNjaG9vbCIgPSAiaGlnaCBzY2hvb2wgaW5jb21wbGV0ZSIsCiAgICAgICAgICAiQ29tcGxldGUgSGlnaCBTY2hvb2wiID0gImhpZ2ggc2Nob29sIGNvbXBsZXRlIiwKICAgICAgICAgICJJbmNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIgPSAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGluY29tcGxldGUiLAogICAgICAgICAgIkNvbXBsZXRlIENvbGxlZ2UvVW5pdmVyc2l0eSIgPSAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGNvbXBsZXRlIiwKICAgICAgICAgICJMaXRlcmFjeSB3aXRob3V0IHJlZ3VsYXIgY291cnNlcyIgPSAiZWxlbWVudGFyeSBzY2hvb2wgaW5jb21wbGV0ZQoiKQp9CmBgYAoKCmBgYHtyIHN0YW5kYXJkaXplZCBjb2x1bW5zLCBpbmNsdWRlPUZBTFNFfQojIEZpcnN0IHRoZSBQTkFEIHRhYmxlCmFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzUgPC0gYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNCAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IG1hcF9jaHIobGV2ZWxfb2ZfZWR1Y2F0aW9uLCBzdGFuZGFyZGl6ZV9sZXZlbF9vZl9lZHVjYXRpb24pKSAlPiUKICAgc2VsZWN0KCJ5ZWFyIiwgInJlZ2lvbiIsICJzdGF0ZSIsICJnZW5kZXIiLCAibGV2ZWxfb2ZfZWR1Y2F0aW9uIiwgInBvcHVsYXRpb24iKQoKIyBBbmQgdGhlbiB0aGUgSU5GT1BFTiB0YWJsZQppbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCA8LSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zX2ZpbmFsICU+JQogIG11dGF0ZShsZXZlbF9vZl9lZHVjYXRpb24gPSAgcmVjb2RlKGxldmVsX29mX2VkdWNhdGlvbiwKICAgImVkdWNhdGlvbiBhYm92ZSBjb2xsZWdlIG9yIHVuaXZlcnNpdHkgY29tcGxldGUiID0gImNvbGxlZ2Ugb3IgdW5pdmVyc2l0eSBjb21wbGV0ZSIsCiAgICJsaXRlcmF0ZSB3aXRob3V0IHJlZ3VsYXIgY291cnNlcyIgPSAiZWxlbWVudGFyeSBzY2hvb2wgaW5jb21wbGV0ZSIgKSklPiUKICAgZ3JvdXBfYnkoeWVhciwgcmVnaW9uLCBzdGF0ZSwgZ2VuZGVyLCBsZXZlbF9vZl9lZHVjYXRpb24pJT4lCiAgIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lCiAgIHNlbGVjdCgieWVhciIsICJyZWdpb24iLCAic3RhdGUiLCAiZ2VuZGVyIiwgImxldmVsX29mX2VkdWNhdGlvbiIsICJwcmlzb25lcnMiKQoKYGBgCgphZnRlciBydW5uaW5nIHRoZSBmdW5jdGlvbiBvbiBib3RoIHRhYmxlcywgaGVyZSBpcyB0aGUgcmVzdWx0OgoKIyMgUE5BREMgYW5kIElORk9QRU4gU3RhbmRhcmRpemVkIFRhYmxlcyB7LnRhYnNldCAudGFic2V0LWZhZGV9CgojIyMgTGl0ZXJhY3kgb2YgdGhlIHBvcHVsYXRpb24KCmBgYHtyIHN0YW5kYXJkaXplZCBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81IHZpc3VhbGl6YXRpb24sIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81LHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlcixsZXZlbF9vZl9lZHVjYXRpb24sIHBvcHVsYXRpb24pLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIyBMaXRlcmFjeSBvZiBwcmlzb25lcnMKYGBge3IgdmlldyBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCBwYXR0ZXJuLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzMxX3N0YW5kYXJkLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIE1pc3NpbmcgZGF0YSBpbiBJTkZPUEVOIHRhYmxlCgpJIG5vdGljZWQgdGhhdCBhZnRlciBhbGwgdGhlIHN0YW5kYXJkaXphdGlvbnMsIHRoZSB0YWJsZXMgY2FtZSBiYWNrIHdpdGggZGlmZmVyZW50IG51bWJlciBvZiBvYnNlcnZhdGlvbnMuIFRoZSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCB0YWJsZSBoYXMgYHIgbnJvdyhpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZClgIG9ic2VydmF0aW9ucywgd2hpbGUgYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNSBoYXMgYHIgbnJvdyhhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81KWAgb2JzZXJ2YXRpb25zLiBJIGRlY2lkZWQgdG8gaW52ZXN0aWdhdGUgdXNpbmcgYW50aV9qb2luIGFuZCBmb3VuZCB0aGF0IHRoZSBpbmZvcGVuIHRhYmxlIGRvZXMgbm90IGhhdmUgdGhlIG9ic2VydmF0aW9ucyBvZiB0aGUgdGFibGUgY3JlYXRlZCBiZWxvdy4KCmBgYHtyIG1pc3Npbmdfb2JzZXJ2YXRpb25zLCBpbmNsdWRlPUZBTFNFfQptaXNzaW5nX29ic2VydmF0aW9ucyA8LSBhbnRpX2pvaW4oYWxwaGFiZXRpemF0aW9uX3BvcHVsYXRpb25fNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fMzFfc3RhbmRhcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gYygieWVhciIsICJzdGF0ZSIsICJnZW5kZXIiLCAicmVnaW9uIiwgImxldmVsX29mX2VkdWNhdGlvbiIpKQpgYGAKICAKYGBge3IgaGVhZChtaXNzaW5nX29ic2VydmF0aW9ucyksIGVjaG89RkFMU0V9CmhlYWQobWlzc2luZ19vYnNlcnZhdGlvbnMpCmBgYAoKSW4gb3JkZXIgbm90IHRvIGxlYXZlIHRoZXNlIHZhbHVlcyBibGFuaywgSSBkZWNpZGVkIHRvIHVzZSBhIHNpbXBsZSBhdmVyYWdlIG9mIHRoZSBudW1iZXIgb2YgcHJpc29uZXJzIGluIG90aGVyIHllYXJzIGZvciBlYWNoIG1pc3Npbmcgb2JzZXJ2YXRpb24sIHVzZSB0aGlzIGF2ZXJhZ2UgYXMgdGhlIHZhbHVlIGFuZCBvbmx5IHRoZW4gY29tYmluZSB0aGUgUE5BREMgdGFibGVzIHdpdGggSU5GT1BFTi4KCmBgYHtyIEZpbHRlciBncm91cCBhbmQgYXZlcmFnZSBwcmlzb25lcnMgcGVyIGdyb3VwLCBpbmNsdWRlPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQphdmVyYWdlc19ieV9ncm91cCA8LSBpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCAlPiUKICAgZmlsdGVyKHllYXIgJWluJSBjKCIyMDE2IiwgIjIwMTgiLCAiMjAxOSIpIHwgeWVhciAlaW4lIGMoIjIwMTciLCAiMjAxOCIsICIyMDE5IikpICU+JQogICBncm91cF9ieShzdGF0ZSwgZ2VuZGVyLCByZWdpb24sIGxldmVsX29mX2VkdWNhdGlvbikgJT4lCiAgIHN1bW1hcmlzZShhdmVyYWdlX3ByaXNvbmVycyA9IG1lYW4ocHJpc29uZXJzKSkKCiMgVXBkYXRlIHRoZSBtaXNzaW5nX29ic2VydmF0aW9ucyBkYXRhZnJhbWUgd2l0aCBlc3RpbWF0ZWQgcHJpc29uZXIgdmFsdWVzCm1pc3Npbmdfb2JzZXJ2YXRpb25zXzJfdXBkYXRlZCA8LSBtZXJnZShtaXNzaW5nX29ic2VydmF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VzX2J5X2dyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJzdGF0ZSIsICJnZW5kZXIiLCJyZWdpb24iLCJsZXZlbF9vZl9lZHVjYXRpb24iKSxhbGwueCA9IFRSVUUsIGFsbC55ID0gRkFMU0UpCmBgYAoKYGBge3IgaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fNF9maW5hbCwgaW5jbHVkZT1GQUxTRX0KaW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb25fNF9maW5hbCA8LSByYmluZChpbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbl8zMV9zdGFuZGFyZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nX29ic2VydmF0aW9uc18yX3VwZGF0ZWQpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gaWZlbHNlKGlzLm5hKHByaXNvbmVycyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZV9wcmlzb25lcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpc29uZXJzKSwKICAgICAgICAgIHByaXNvbmVycyA9IHJvdW5kKHByaXNvbmVycywgMCkpICU+JQogICBzZWxlY3QoLWMoYXZlcmFnZV9wcmlzb25lcnMsIHBvcHVsYXRpb24pKQpgYGAKCk5vdyB0aGUgSU5GT1BFTiB0YWJsZSBjb250YWlucyBgciBucm93KGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzRfZmluYWwpYCBjb2x1bW5zLCBqdXN0IGxpa2UgdGhlIFBOQUQgdGFibGUsIHNvIEkgY2FuIGNvbWJpbmUgdGhlbS4KCmBgYHtyIFNldCB0aGUgY29ycmVjdCBvcmRlciBvZiBkZWdyZWVzIG9mIGVkdWNhdGlvbiwgaW5jbHVkZT1GQUxTRX0KZWR1Y2F0aW9uX2xldmVsX2NvcnJlY3Rfb3JkZXIgPC0gYygiaWxsaXRlcmF0ZSIsICJlbGVtZW50YXJ5IHNjaG9vbCBpbmNvbXBsZXRlIiwgImVsZW1lbnRhcnkgc2Nob29sIGNvbXBsZXRlIiwgImhpZ2ggc2Nob29sIGluY29tcGxldGUiLCAiaGlnaCBzY2hvb2wgY29tcGxldGUiLCAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGluY29tcGxldGUiLCAiY29sbGVnZSBvciB1bml2ZXJzaXR5IGNvbXBsZXRlIikKCgpwb3B1bGF0aW9uX2luZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uIDwtIGFzLmRhdGEuZnJhbWUobGVmdF9qb2luKGluZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uXzRfZmluYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWJldGl6YXRpb25fcG9wdWxhdGlvbl81LAogICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGdlbmRlciwgbGV2ZWxfb2ZfZWR1Y2F0aW9uKSkpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhcikpICU+JQogICBtdXRhdGVfYXQodmFycygtYyhwcmlzb25lcnMsIHBvcHVsYXRpb24sIHllYXIpKSwgYXMuZmFjdG9yKSAlPiUKICAgbXV0YXRlKGxldmVsX29mX2VkdWNhdGlvbiA9IGZhY3RvcihsZXZlbF9vZl9lZHVjYXRpb24sIGxldmVscyA9IGVkdWNhdGlvbl9sZXZlbF9jb3JyZWN0X29yZGVyKSkKYGBgCgojIyBQTkFEQyBUYWJsZSAtIElORk9QRU4gTGV2ZWwgb2YgRWR1Y2F0aW9uCgpgYGB7ciB2aWV3IHBvcHVsYWNhb19pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiAsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIElCR0UgRXRobmljaXR5IFRhYmxlCgpUaGlzIFRhYmxlIGhhcyB0aGUgZXRobmljIHBlcmNlbnRhZ2UgZGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gcG9wdWxhdGlvbiBieSBzdGF0ZS4gVGhlIGZpbGUgdG8gYmUgd29ya2VkIG9uIGhlcmUgaXMgY2FsbGVkICJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIiwgYW5kIGNhbiBiZSBmb3VuZCBvbiB0aGUgW0lCR0VdKGh0dHBzOi8vd3d3LmliZ2UuZ292LmJyL2VzdGF0aXN0aWNhcy9kb3dubG9hZHMtZXN0YXRpc3RpY2FzLmh0bWwpIHdlYnNpdGUuCiAKSSdsbCBza2lwIHRoZSBkYXRhIHJlYWRpbmcgcGFydCBhcyBpdCBkb2Vzbid0IGRpZmZlciBhdCBhbGwgZnJvbSB0aGUgcHJldmlvdXMgdGFibGVzLgpgYGB7ciBUYWJsZSAxLjEgRElTVCBQRVJDRVQgUkFDQSwgaW5jbHVkZT1GQUxTRX0KIyBHZXQgdGhlIG5hbWUgb2YgYWxsIHNoZWV0cyBpbiB0aGUgZmlsZQpzaGVldF9uYW1lc19ldGhuaWFfcmVnaW9uX3RhYmVsYV8xLjEgPC0gZXhjZWxfc2hlZXRzKCJQTkFEYy9UYWJlbGEgMS4xIERJU1QgUEVSQ0VUIFJBQ0EueGxzIikKCiMgSW5pdGlhbGl6ZSBhbiBlbXB0eSBkYXRhZnJhbWUKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb24gPC0gZGF0YS5mcmFtZSgpCgojIExvb3AgdG8gcmVhZCBlYWNoIHNoZWV0IGFuZCBhZGQgdG8gZGF0YWZyYW1lIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uCmZvciAoc2hlZXRfbmFtZV90YWJsZV8xLjEgaW4gc2hlZXRfbmFtZXNfZXRobmlhX3JlZ2lvbl90YWJlbGFfMS4xKSB7CiAgICMgUmVhZCB0aGUgY3VycmVudCBzaGVldAogICBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSA8LSByZWFkX3hscygiUE5BRGMvVGFiZWxhIDEuMSBESVNUIFBFUkNFVCBSQUNBLnhscyIsIHNoZWV0ID0gc2hlZXRfbmFtZV90YWJsZV8xLjEsIHJhbmdlID0gIkE1OkszNyIpCiAgCiAgICMgQWRkIGEgJ3llYXInIGNvbHVtbiB3aXRoIHRoZSBzaGVldCBuYW1lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4xJHllYXIgPC0gc2hlZXRfbmFtZV90YWJsZV8xLjEKICAKICAgIyBSZW5hbWUgY29sdW1ucwogICBjb2xuYW1lcyhjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSkgPC0gYygic3RhdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb3RhbCIsICJjdl90b3RhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaXRlIiwgImN2X2JyYW5jYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJsYWNrIiwgImN2X2JsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJvd24iLCAiY3ZfQnJvd24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZZWxsb3dfaW5kaWdlbm91cyIsICJjdl9ZZWxsb3dfaW5kaWdlbm91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllYXIiKQogIAogICAjIHJlbW92ZSB0aGUgZmlyc3QgbGluZQogICBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSA8LSBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMVstMSxdCiAgCiAgICMgQWRkIHRoZSBjdXJyZW50IHNoZWV0IHRvIHRoZSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbiBkYXRhZnJhbWUKICAgcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb24gPC0gYmluZF9yb3dzKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uLCBjdXJyZW50X3NoZWV0X3RhYmxlXzEuMSkKfQoKIyMgcmVtb3ZpbmcgY29lZmZpY2llbnQgb2YgdmFyaWF0aW9uIGNvbHVtbnMKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMiA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbiAlPiUKICAgc2VsZWN0KHllYXIsIHN0YXRlLCBUb3RhbCwgV2hpdGUsCiAgICAgICAgICBCbGFjaywgQnJvd24pICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgICAgICBzdGF0ZSA9IHN0YXRlX2RpY3RbYXMuY2hhcmFjdGVyKHN0YXRlKV0sICMjIHVzaW5nIHRoZSBzdGF0ZSBkaWN0aW9uYXJ5IHRvIGZpbHRlciByZWdpb25zCiAgICAgICAgICBzdGF0ZSA9IGFzLmZhY3RvcihzdGF0ZSkpICU+JQogICBuYS5vbWl0KCkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzIgPC0gYXMuZGF0YS5mcmFtZShwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl8yKQoKYGBgCgpgYGB7ciB2aWV3IGRpc3QgZXRobmljaXR5IGFuZCByZWdpb24sIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMikpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpUaGlzIHRhYmxlIGhhcyBkYXRhIGZyb20gMjAxMiB0byAyMDE4LiBJJ20gZ29pbmcgdG8gdXNlIHRoZSBmb3JtdWxhIHdlIGRpc2N1c3NlZCBhdCB0aGUgYmVnaW5uaW5nIHRvIGVzdGltYXRlIHRoZSBwb3B1bGF0aW9uIGluIDIwMTkuCkknbGwgc3RhcnQgYnkgdHJhbnNmb3JtaW5nIHRoZSBkYXRhIGluIHRoZSB0YWJsZSwgYXMgdGhlIG51bWJlciBwcmVzZW50IGluIHRoZSB0b3RhbCBjb2x1bW4gbXVzdCBzdGlsbCBiZSBtdWx0aXBsaWVkIGJ5IDEwMDAsIGFuZCB0aGUgZXRobmljaXR5IHZhbHVlcyBhcmUgaW4gcGVyY2VudGFnZSBpbiByZWxhdGlvbiB0byB0aGUgdG90YWwuCgpgYGB7ciB0dXJuIHBlcmNlbnRhZ2VzIGludG8gdmFsdWVzfQpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl8zIDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzIgJT4lCiAgIG11dGF0ZSgKICAgICBUb3RhbCA9IHJvdW5kKFRvdGFsKjEwMDApLAogICAgIFdoaXRlID0gcm91bmQoV2hpdGUqVG90YWwvMTAwKSwKICAgICBCbGFjayA9IHJvdW5kKEJsYWNrKlRvdGFsLzEwMCksCiAgICAgQnJvd24gPSByb3VuZChCcm93bipUb3RhbC8xMDApKQoKYGBgCgoKYGBge3IgcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fMyBjYWxjdWxhdGUgdmFsdWVzIGZvciAyMDE5LCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl80IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzMgJT4lCiAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB5ZWFyLCB2YWx1ZXNfZnJvbSA9IFRvdGFsOkJyb3duKQoKcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fNSA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl80ICU+JQogICBtdXRhdGUoCiAgICAgVG90YWxfMjAxOSA9IHJvdW5kKGZvcm11bGEoVG90YWxfMjAxOCwyMDE4LFRvdGFsXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgV2hpdGVfMjAxOSA9IHJvdW5kKGZvcm11bGEoV2hpdGVfMjAxOCwyMDE4LFdoaXRlXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgQnJvd25fMjAxOSA9IHJvdW5kKGZvcm11bGEoQnJvd25fMjAxOCwyMDE4LEJyb3duXzIwMTIsMjAxMiwyMDE5KSksCiAgICAgQmxhY2tfMjAxOSA9IHJvdW5kKGZvcm11bGEoQmxhY2tfMjAxOCwyMDE4LEJsYWNrXzIwMTIsMjAxMiwyMDE5KSkpCgpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9ldGhuaWNpdHlfYW5kX3JlZ2lvbl82IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzUgJT4lCiAgIHBpdm90X2xvbmdlcihjb2xzID0gLXN0YXRlLCBuYW1lc190byA9IGMoIi52YWx1ZSIsICJ5ZWFyIiksIG5hbWVzX3NlcCA9ICJfIikgJT4lCiAgIGZpbHRlcih5ZWFyICVpbiUgYygiMjAxNiIsIjIwMTciLCIyMDE4IiwiMjAxOSIpKSAlPiUKICAgc2VsZWN0KC1Ub3RhbCkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzcgPC0gcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfZXRobmljaXR5X2FuZF9yZWdpb25fNiAlPiUKICAgICBwaXZvdF9sb25nZXIoY29scyA9IGMoIkJsYWNrIiwgIldoaXRlIiwgIkJyb3duIiksCiAgICAgICAgICAgICAgICBuYW1lc190bz0iZXRobmljaXR5IiwKICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwb3B1bGF0aW9uIikKCmBgYAoKRmluYWxseSwgdGhlIHRhYmxlIHRoYXQgd2Ugd2lsbCB1c2UgdG8gbWF0Y2ggdGhhdCBvZiBJTkZPUEVOCmBgYHtyIHRhYmxlIHBvcHVsYXRpb25fZXRobmljaXR5LGluY2x1ZGU9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBvcHVsYXRpb25fZXRobmljaXR5IDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2V0aG5pY2l0eV9hbmRfcmVnaW9uXzcgJT4lCiAgIG1lcmdlKHN0YXRlX3JlZ2lvbiwgYnkgPSAic3RhdGUiLCBhbGwueCA9IFRSVUUpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgICAgZXRobmljaXR5ID0gaWZfZWxzZShldGhuaWNpdHkgPT0gIldoaXRlIiwgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZfZWxzZShldGhuaWNpdHkgJWluJSBjKCJCbGFjayIsICJCcm93biIpLCAiYmxhY2sgb3IgYnJvd24iLE5BKSkpICU+JQogICBncm91cF9ieSh5ZWFyLCBzdGF0ZSwgcmVnaW9uLCBldGhuaWNpdHkpICU+JQogICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bShwb3B1bGF0aW9uKSkgJT4lCiAgIHNlbGVjdCh5ZWFyLCByZWdpb24sIHN0YXRlLCBldGhuaWNpdHksIHBvcHVsYXRpb24pCgpgYGAKCgojIyBFdGhuaWMgRGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gUG9wdWxhdGlvbgoKYGBge3IgdmlldyBvZiBwb3B1bGF0aW9uX2V0aG5pY2l0eSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2V0aG5pY2l0eSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIyBNaXNzaW5nIE9ic2VydmF0aW9ucyBpbiB0aGUgSU5GT1BFTiBUYWJsZQpBZnRlciBtYW5pcHVsYXRpbmcgdGhlIGRhdGEgZnJvbSB0aGlzIElCR0UgdGFibGUsIEkgd2lsbCBjb21iaW5lIGl0IHdpdGggdGhlIElORk9QRU4gdGFibGUsIGluIG9yZGVyIHRvIGNvcnJlbGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHByaXNvbmVycyBhbmQgdGhlIHBvcHVsYXRpb24gZm9yIGVhY2ggdmFyaWFibGUuIEhvd2V2ZXIsIHdoZW4gY29tYmluaW5nIHRoZSBkYXRhZnJhbWVzLCBJIGRpc2NvdmVyZWQgdGhhdCB0aGVyZSBhcmUgbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlIGluZm9wZW5fZXRuaWFfM19maW5hbCB0YWJsZSBiZWNhdXNlIGl0IGhhcyBmZXdlciByb3dzIHRoYW4gdGhlIFBOQUQgdGFibGUuIEkgd2lsbCB1c2UgYW50aS1qb2luIHRvIGZpbmQgdGhlbSBhbmQgbGluZWFyIHJlZ3Jlc3Npb24gdG8gY2FsY3VsYXRlIHRoZW0KCmBgYHtyIGRpZmZlcmVuY2VfaW5mb3Blbl9wb3B1bGF0aW9uX2V0aG5pY2l0eSwgaW5jbHVkZT1GQUxTRX0KZGlmZmVyZW5jZV9pbmZvcGVuX3BvcHVsYXRpb25fZXRobmljaXR5IDwtIGFudGlfam9pbihwb3B1bGF0aW9uX2V0aG5pY2l0eSwgaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCwgYnkgPSBqb2luX2J5KHllYXIsIHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSkpICU+JQogICBtdXRhdGUoc3RhdGUgPSBhcy5jaGFyYWN0ZXIoc3RhdGUpKSAlPiUKICAgc2VsZWN0KC1wb3B1bGF0aW9uKQpgYGAKClRoZXNlIGFyZSB0aGUgbWlzc2luZyBvYnNlcnZhdGlvbnMgaW4gdGhlIElORk9QRU4gdGFibGUKYGBge3IgaGVhZChkaWZmZXJlbmNlX2luZm9wZW5fcG9wdWxhdGlvbl9ldGhuaWNpdHkpfQpoZWFkKGRpZmZlcmVuY2VfaW5mb3Blbl9wb3B1bGF0aW9uX2V0aG5pY2l0eSkKYGBgCgpgYGB7ciBzZXJnaXBlX2V0aG5pY2l0eSwgaW5jbHVkZT1GQUxTRX0Kc2VyZ2lwZV9ldGhuaWNpdHkgPC0gaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCAlPiUKICAgZmlsdGVyKHN0YXRlID09IlNFIiwgeWVhciA8IDIwMTkpCgoKIyBmdW5jdGlvbiB0byBwcmVkaWN0IHRoZSB5ZWFyIDIwMTkKcHJlZGljdF9pbmZvcGVuX2V0aG5pY2l0eSA8LSBmdW5jdGlvbihkYXRhKSB7CiAgIG1vZGVsIDwtIGxtKHByaXNvbmVycyB+IHllYXIsIGRhdGEgPSBkYXRhKQogICBwcmVkaWN0KG1vZGVsLCBuZXdkYXRhID0gZGF0YS5mcmFtZSh5ZWFyID0gMjAxOSkpCn0KCiMjIGZvcmVjYXN0IGZvciAyMDE5CnByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkgPC0gc2VyZ2lwZV9ldGhuaWNpdHkgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbiwgc3RhdGUsIGV0aG5pY2l0eSkgJT4lCiAgIG5lc3QoKSAlPiUKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKG1hcF9kYmwoZGF0YSwgcHJlZGljdF9pbmZvcGVuX2V0aG5pY2l0eSkpLAogICAgICAgICAgeWVhciA9IDIwMTkpICU+JSAjYWRkIHRoZSB5ZWFyIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZSAyMDE5CiAgIHNlbGVjdCgtZGF0YSkKYGBgCgpBZnRlciBzb21lIGNhbGN1bGF0aW9ucywgSSBhcnJpdmVkIGF0IHRoaXMgcmVzdWx0IG9mIHByZWRpY3RpbmcgcHJpc29uZXJzIGFuZCBlYWNoIG9ic2VydmF0aW9uOgpgYGB7ciBoZWFkKDIwMTlfcHJlZGljdGlvbnNfaW5mb3Blbl9ldGhuaWNpdHkpfQpoZWFkKHByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkpCmBgYAogIApOb3cgaXQgaXMgZW5vdWdoIHRvIGNvbWJpbmUgdGhlIHRhYmxlcyB3aXRoIGRhdGEgb24gdGhlIGV0aG5pY2l0eSBvZiB0aGUgdG90YWwgQnJhemlsaWFuIHBvcHVsYXRpb24gd2l0aCB0aGUgcHJpc29uIHBvcHVsYXRpb24gYW5kIHRoZW4gd2Ugd2lsbCBhcnJpdmUgYXQgdGhpcyB0YWJsZToKYGBge3IgY29tYmluZSBldGhuaWNpdHkgaW5mb3BlbiB0YWJsZXMgd2l0aCBtaXNzaW5nIGRhdGEsIGluY2x1ZGU9RkFMU0V9CnNlcmdpcGVfZXRobmljaXR5IDwtcmJpbmQoc2VyZ2lwZV9ldGhuaWNpdHksIHByZWRpY3Rpb25zXzIwMTlfaW5mb3Blbl9ldGhuaWNpdHkpCgojIyBmaW5hbGx5IHRoZSBjb21wbGV0ZSBpbmZvcGVuIHRhYmxlCmluZm9wZW5fZXRobmljaXR5XzQgPC0gcmJpbmQoaW5mb3Blbl9ldGhuaWNpdHlfM19maW5hbCwgc2VyZ2lwZV9ldGhuaWNpdHkpICU+JQogICBkaXN0aW5jdCgpCgojIyB0YWJsZSB3aXRoIGRhdGEgY29tYmluYXRpb24KcG9wdWxhdGlvbl9pbmZvcGVuX2V0aG5pY2l0eSA8LSBhcy5kYXRhLmZyYW1lKGxlZnRfam9pbihpbmZvcGVuX2V0aG5pY2l0eV80LCBwb3B1bGF0aW9uX2V0aG5pY2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ID0gam9pbl9ieSh5ZWFyLCByZWdpb24sIHN0YXRlLCBldGhuaWNpdHkpKSkgJT4lCiAgIG11dGF0ZV9hdCh2YXJzKC1jKHByaXNvbmVycywgcG9wdWxhdGlvbiwgeWVhcikpLCBhcy5mYWN0b3IpICU+JQogICBtdXRhdGUocHJpc29uZXJzID0gYXMubnVtZXJpYyhwcmlzb25lcnMpKQoKYGBgCiAgCiMjIFBOQURDIFRhYmxlIC0gSU5GT1BFTiBFdGhuaWNpdHkKICAKYGBge3IgdmlldyBvZiBwb3B1bGF0aW9uX2luZm9wZW5fZXRobmljaXR5IHRhYmxlLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl9ldGhuaWNpdHksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKIyBJQkdFIEFnZSBSYW5nZSBUYWJsZQoKVGhlIGZpbGUgdG8gYmUgd29ya2VkIG9uIGhlcmUgaXMgY2FsbGVkICJUYWJlbGEgMS4yIERJU1QgUE9QIEVUQVJJQS54bHMiLCBhbmQgY2FuIGJlIGZvdW5kIG9uIHRoZSBbSUJHRV0oaHR0cHM6Ly93d3cuaWJnZS5nb3YuYnIvZXN0YXRpc3RpY2FzL2Rvd25sb2Fkcy1lc3RhdGlzdGljYXMuaHRtbCkgd2Vic2l0ZS4KICAKVGhpcyB0YWJsZSBoYXMgZGF0YSBvbiB0aGUgYWdlIGdyb3VwIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcG9wdWxhdGlvbiBieSBldGhuaWNpdHkuCipJbmRpZ2Vub3VzIHBlb3BsZSwgQXNpYW5zIGFuZCBwZW9wbGUgd2l0aCBubyBkZWNsYXJhdGlvbiBvZiBjb2xvciBvciByYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgdG90YWwuKgoKYGBge3IgVGFibGUgMS4yIERJU1QgUE9QIEVUQVJJQSwgaW5jbHVkZT1GQUxTRX0KCiMgR2V0IHRoZSBuYW1lIG9mIGFsbCBzaGVldHMgaW4gdGhlIGZpbGUKbmFtZXNfc2hlZXRzX3BvcHVsYXRpb25fYnlfYWdlX3RhYmxlXzEuMiA8LSBleGNlbF9zaGVldHMoIlBOQURjL1RhYmVsYSAxLjIgRElTVCBQT1AgRVRBUklBLnhscyIpCgojIEluaXRpYWxpemUgYW4gZW1wdHkgZGF0YWZyYW1lCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSA8LSBkYXRhLmZyYW1lKCkKCiMgTG9vcCB0byByZWFkIGVhY2ggc2hlZXQgYW5kIGFkZCB0byBkYXRhZnJhbWUgZGlzdHJpYnV0aW9uX3BvcHVsYXRpb25fYnlfYWdlCmZvciAoc2hlZXRfbmFtZV90YWJsZV8xLjIgaW4gbmFtZXNfc2hlZXRzX3BvcHVsYXRpb25fYnlfYWdlX3RhYmxlXzEuMikgewogICAjIFJlYWQgdGhlIGN1cnJlbnQgc2hlZXQKICAgY3VycmVudF9zaGVldF90YWJsZV8xLjIgPC0gcmVhZF94bHMoIlBOQURjL1RhYmVsYSAxLjIgRElTVCBQT1AgRVRBUklBLnhscyIsIHNoZWV0ID0gc2hlZXRfbmFtZV90YWJsZV8xLjIsIHJhbmdlID0gIkE1OksyMyIpCiAgCiAgICMgQWRkIGEgJ3llYXInIGNvbHVtbiB3aXRoIHRoZSBzaGVldCBuYW1lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yJHllYXIgPC0gc2hlZXRfbmFtZV90YWJsZV8xLjIKICAKICAgIyBSZW5hbWUgY29sdW1ucwogICBjb2xuYW1lcyhjdXJyZW50X3NoZWV0X3RhYmxlXzEuMikgPC0gYygiYWdlX3JhbmdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwiLCAiY3ZfdG90YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGl0ZSIsICJjdl93aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsYWNrX2Jyb3duIiwgImN2X2JsYWNrX2Jyb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcG9ydGlvbl93aGl0ZSIsICJjdl9wcm9wb3J0aW9uX3doaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcG9ydGlvbl9ibGFja19icm93biIsICJjdl9wcm9wb3J0aW9uX2JsYWNrX2Jyb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieWVhciIpCiAgCiAgICMgcmVtb3ZlIHRoZSBmaXJzdCBsaW5lCiAgIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yIDwtIGN1cnJlbnRfc2hlZXRfdGFibGVfMS4yWy0xLF0KICAKICAgIyBBZGQgdGhlIGN1cnJlbnQgc2hlZXQgdG8gZGF0YWZyYW1lIGRpc3RyaWJ1dGlvbl9wb3B1bGF0aW9uX2J5X2FnZQogICBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2UgPC0gYmluZF9yb3dzKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSwgY3VycmVudF9zaGVldF90YWJsZV8xLjIpICU+JQogICAgIG11dGF0ZShhZ2VfcmFuZ2UgPSBjYXNlX3doZW4oCiAgICBzdHJfZGV0ZWN0KGFnZV9yYW5nZSwgIlxcZCsgYSBcXGQrIGFub3MiKSB+IHN0cl9yZXBsYWNlKGFnZV9yYW5nZSwgIihcXGQrKSBhIChcXGQrKSBhbm9zIiwgIlxcMSB0byBcXDIgeWVhcnMgb2xkIiksCiAgICBhZ2VfcmFuZ2UgPT0gIjgwIGFub3MgZSBtYWlzIiB+ICI4MCB5ZWFycyBvbGQgYW5kIG92ZXIiLAogICAgVFJVRSB+IGFnZV9yYW5nZSkpCiAgIAp9CmBgYAoKYGBge3IgdGFibGUgdmlldyBUYWJsZSAxLjIgUE9QIEVUQVJJQSBESVNULCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgpgYGB7ciBmaWx0ZXJpbmcgYW5kIG9yZ2FuaXppbmcgdGhlIGRhdGEgSSB3aWxsIG5lZWQsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8yIDwtIHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZSAlPiUKICAgc2VsZWN0KHllYXIsIGFnZV9yYW5nZSx0b3RhbCkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gYXMubnVtZXJpYyh5ZWFyKSwKICAgICAgICAgIGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpLAogICAgICAgICAgdG90YWwgPSB0b3RhbCoxMDAwKSAlPiUKICAgICBmaWx0ZXIoIXN0cl9kZXRlY3QoYWdlX3JhbmdlLCAiMCB0byA0IHllYXJzIG9sZHw1IHRvIDkgeWVhcnMgb2xkfDEwIHRvIDE0IHllYXJzIG9sZHwxNSB0byAxOSB5ZWFycyBvbGR8MjAgdG8gMjQgeWVhcnMgb2xkIikpCgpgYGAKCkxpa2UgdGhlIHByZXZpb3VzIHRhYmxlLCB0aGlzIG9uZSBvbmx5IGhhcyBkYXRhIGZyb20gMjAxMiB0byAyMDE4LCBzbyBJIHdpbGwgdXNlIHRoZSBzYW1lIGZvcm11bGEgdG8gcHJlZGljdCB0aGUgcG9wdWxhdGlvbiBpbiAyMDE5LgoKYGBge3IgcmFuZ2VfYWdlIHdpZGUsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8zIDwtIHBpdm90X3dpZGVyKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV8yLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IHllYXIsIHZhbHVlc19mcm9tID0gdG90YWwpCgpwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMyA8LSBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMyAlPiUKICAgbXV0YXRlKAogICAgIGAyMDE5YCA9IHJvdW5kKGZvcm11bGEoYDIwMThgLDIwMTgsYDIwMTJgLDIwMTIsMjAxOSkpCiAgICkKCnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80IDwtIHBpdm90X2xvbmdlcihwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IC1hZ2VfcmFuZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJ5ZWFyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBvcHVsYXRpb24iKSAlPiUKICAgZmlsdGVyKHllYXIgJWluJSBjKCIyMDE2IiwiMjAxNyIsIjIwMTgiLCIyMDE5IikpCmBgYAoKCiMjIFN0YW5kYXJkaXphdGlvbiBvZiBBZ2UgUmFuZ2VzCiAgCkFzIHlvdSBjYW4gc2VlIGJlbG93LCBhbHRob3VnaCB3ZSBub3cgaGF2ZSBkYXRhIGZyb20gMjAxNiB0byAyMDE5LCB0aGUgYWdlIGdyb3VwcyBhcmUgbm90IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhvc2UgZnJvbSBJTkZPUEVOLCBidXQgdGhleSBhcmUgdmVyeSBjbG9zZS4KYGBge3IgdGFibGUgdmlldyB3aXRoIGRhdGEgMjAxMiB0byAyMDE5LCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80LDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKV2hhdCBJJ20gZ29pbmcgdG8gZG8gaXMgY3JlYXRlIGEgZnVuY3Rpb24gdGhhdCBhZGp1c3RzIHRoZSBhZ2UgZ3JvdXBzIHRvIGJlIGluIGFjY29yZGFuY2Ugd2l0aCB0aG9zZSBvZiBJTkZPUEVOCmBgYHtyIGZ1bmN0aW9uIHRoYXQgYWRqdXN0cyB0aGUgYWdlIHJhbmdlfQphZGp1c3RfYWdlX3JhbmdlIDwtIGZ1bmN0aW9uKHJhbmdlKSB7CiAgIGlmIChyYW5nZSAlaW4lIGMoIjI1IHRvIDI5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCIyNSB0byAyOSB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiMzAgdG8gMzQgeWVhcnMgb2xkIikpIHsKICAgICByZXR1cm4oIjMwIHRvIDM0IHllYXJzIG9sZCIpCiAgIH0gZWxzZSBpZiAocmFuZ2UgJWluJSBjKCIzNSB0byAzOSB5ZWFycyBvbGQiLCAiNDAgdG8gNDQgeWVhcnMgb2xkIikpIHsKICAgICByZXR1cm4oIjM1IHRvIDQ1IHllYXJzIG9sZCIpCiAgIH0gZWxzZSBpZiAocmFuZ2UgJWluJSBjKCI0NSB0byA0OSB5ZWFycyBvbGQiLCAiNTAgdG8gNTQgeWVhcnMgb2xkIiwgIjU1IHRvIDU5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCI0NiB0byA2MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiNjAgdG8gNjQgeWVhcnMgb2xkIiwgIjY1IHRvIDY5IHllYXJzIG9sZCIpKSB7CiAgICAgcmV0dXJuKCI2MSB0byA3MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgaWYgKHJhbmdlICVpbiUgYygiNzAgdG8gNzQgeWVhcnMgb2xkIiwgIjc1IHRvIDc5IHllYXJzIG9sZCIsICI4MCB5ZWFycyBvbGQgYW5kIG92ZXIiKSkgewogICAgIHJldHVybigib3ZlciA3MCB5ZWFycyBvbGQiKQogICB9IGVsc2UgewogICAgIHJldHVybihOQSkKICAgfQp9CmBgYAoKYGBge3IgQWRqdXN0aW5nIGFnZSByYW5nZXMsIGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fZGlzdHJpYnV0aW9uX2J5X2FnZV80JGFnZV9yYW5nZSA8LSBzYXBwbHkocG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzQkYWdlX3JhbmdlLCBhZGp1c3RfYWdlX3JhbmdlKQpgYGAKCgpgYGB7ciB0YWJsZSBvcmdhbml6YXRpb24gYW5kIGRhdGEgc3VtbWFyaXphdGlvbiwgaW5jbHVkZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzUgPC0gcG9wdWxhdGlvbl9kaXN0cmlidXRpb25fYnlfYWdlXzQgJT4lCiAgIGdyb3VwX2J5KHllYXIsIGFnZV9yYW5nZSkgJT4lCiAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb24pKQpgYGAKCkhlcmUgeW91IGNhbiBoYXZlIGEgdmlzdWFsaXphdGlvbiBvZiB0aGUgdGFibGUgdGhhdCBJIGhhdmUgdW50aWwgdGhlbi4KYGBge3IgdmlldyBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCkl0IG1heSBiZSBub3RlZCB0aGF0IEkgZG8gbm90IGhhdmUgdGhlIDE4IHRvIDI0IHllYXIgb2xkIHBvcHVsYXRpb24uIEknbSBnb2luZyB0byBleHRyYWN0IHRoaXMgYWdlIHJhbmdlIGZyb20gYW5vdGhlciBQTkFEIHRhYmxlLCB3aGljaCB3ZSd2ZSB3b3JrZWQgb24gYmVmb3JlLgoKYGBge3IgcG9wdWxhdGlvbl8xOF90b18yNF95ZWFycyBvbGQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnMgPC0gcG5hZF80X3BvcHVsYXRpb25fYWdlICU+JQogICBmaWx0ZXIoZ3JlcGwoIjE4IGEgMjQgYW5vcyIsIGFnZV9ncm91cCksCiAgICAgICAgICBncmVwbCgiVG90YWzCuSIsIGV0aG5pY2l0eSkpICU+JQogICBzZWxlY3QoLWdlbmRlcikgJT4lICMgSSB3aWxsIHJlbW92ZSBnZW5kZXIgdG8gcmVtb3ZlIGR1cGxpY2F0ZXMgKGJlY2F1c2UgSSBoYXZlIGdlbmRlciBhbmQgZXRobmljaXR5KQogICByZW5hbWUoYWdlX3JhbmdlID0gYWdlX2dyb3VwLAogICAgICAgICAgcG9wdWxhdGlvbiA9IHZhbHVlKSU+JQogICBncm91cF9ieSh5ZWFyLCBhZ2VfcmFuZ2UsIGV0aG5pY2l0eSkgJT4lCiAgIHN1bW1hcmlzZShwb3B1bGF0aW9uID0gc3VtKHBvcHVsYXRpb24pKSAlPiUKICAgc2VsZWN0KC1ldGhuaWNpdHkpICU+JSAjIGZpbmFsbHkgSSByZW1vdmUgdGhlIGV0aG5pY2l0eSBjb2x1bW4gdGhhdCBvbmx5IGNvbnRhaW5zICdUb3RhbCcKICAgZHJvcF9uYSgpCmBgYAoKQXMgcHJldmlvdXNseSBkZW1vbnN0cmF0ZWQsIEkgd2lsbCB1c2UgYXJpdGhtZXRpYyB0byBwcmVkaWN0IHRoZSBwb3B1bGF0aW9uIGluIDIwMTkuCmBgYHtyIHBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnMgMjAxNiB0byAyMDE5LGluY2x1ZGU9RkFMU0V9CnBvcHVsYXRpb25fMThfdG9fMjRfeWVhcnNfd2lkZSA8LSBwaXZvdF93aWRlcihwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzLCBuYW1lc19mcm9tID0geWVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IHBvcHVsYXRpb24pCgpwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzXzIgPC0gcG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc193aWRlICU+JQogICBtdXRhdGUoCiAgICAgYDIwMTlgID0gcm91bmQoZm9ybXVsYShgMjAxOGAsMjAxOCxgMjAxNmAsMjAxNiwyMDE5KSkKICAgKQoKcG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc18zIDwtIHBpdm90X2xvbmdlcihwb3B1bGF0aW9uXzE4X3RvXzI0X3llYXJzXzIsIGNvbHMgPSAtYWdlX3JhbmdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc190bz0ieWVhciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJwb3B1bGF0aW9uIikgJT4lIAogIG11dGF0ZShhZ2VfcmFuZ2UgPSBjYXNlX3doZW4oYWdlX3JhbmdlID09ICIxOCBhIDI0IGFub3MiIH4gIjE4IHRvIDI0IHllYXJzIG9sZCIpKQpgYGAKCmBgYHtyIHBvcHVsYXRpb25fYWdlX3JhbmdlXywgZWNobz1GQUxTRX0KcG9wdWxhdGlvbl9hZ2VfcmFuZ2UgPC0gcmJpbmQocG9wdWxhdGlvbl8xOF90b18yNF95ZWFyc18zLCBwb3B1bGF0aW9uX2Rpc3RyaWJ1dGlvbl9ieV9hZ2VfNSkgJT4lIG11dGF0ZSgKICAgeWVhciA9IGFzLm51bWVyaWMoeWVhciksCiAgIGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpLAopCmBgYAogIAojIyBEaXN0cmlidXRpb24gb2YgdGhlIEFnZSBSYW5nZSBvZiB0aGUgQnJhemlsaWFuIFBvcHVsYXRpb24KICAKRmluYWxseSwgdGhlIHRhYmxlIHdpdGggYWxsIGFnZSBncm91cHMgZXF1YWwgdG8gSU5GT1BFTgpgYGB7ciB2aWV3IHBvcHVsYXRpb25fYWdlX3JhbmdlIHRhYmxlLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UocG9wdWxhdGlvbl9hZ2VfcmFuZ2UseWVhciksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAogIApOb3cgaXQgcmVtYWlucyBvbmx5IHRvIGNvbWJpbmUgdGhlIGFnZSByYW5nZSB0YWJsZXMuCmBgYHtyIGNvbWJpbmUgSU5GT1BFTiBhbmQgUE5BRCBhZ2UgZ3JvdXAgdGFibGVzIH0KcG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSA8LSBhcy5kYXRhLmZyYW1lKGxlZnRfam9pbihpbmZvcGVuX2FnZV9yYW5nZV80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0aW9uX2FnZV9yYW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIGFnZV9yYW5nZSkpKSAlPiUKICAgbXV0YXRlKGFnZV9yYW5nZSA9IGFzLmZhY3RvcihhZ2VfcmFuZ2UpKQoKYGBgCgoKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIGJ5IEFnZSBHcm91cAoKYGBge3IgdmlldyB0aGUgdGFibGUgcG9wdWxhY2FvX2luZm9wZW5fZmFpeGFfZXRhcmlhLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGFycmFuZ2UocG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSx5ZWFyKSwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIElCR0UgSW5jb21lIFRhYmxlCgojIyBUb3RhbCBwb3B1bGF0aW9uIGFnZWQgMTQgYW5kIG92ZXIuCgpJIG5lZWQgdGhpcyB0YWJsZSB3aXRoIHRoZSBnZW5lcmFsIHBvcHVsYXRpb24gb3ZlciAxNCB5ZWFycyBvbGQsIGFzIHRoZSBJQkdFIGluY29tZSB0YWJsZSBvbmx5IGNvbnNpZGVycyB0aGlzIGFnZSBncm91cC4gVGhlIHRhYmxlIG9uIGVkdWNhdGlvbiwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IHVzZWQsIGNvbnNpZGVycyB0aGlzIHJhbmdlIG9mIHRoZSBwb3B1bGF0aW9uLgoKYGBge3IgdG90YWxfcG9wdWxhdGlvbl8xNF95ZWFyc19vcl9tb3JlLCBpbmNsdWRlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyIDwtIGFscGhhYmV0aXphdGlvbl9wb3B1bGF0aW9uXzUgJT4lCiAgIGdyb3VwX2J5KHJlZ2lvbixzdGF0ZSx5ZWFyKSAlPiUKICAgc3VtbWFyaXplKHBvcHVsYXRpb24gPSBzdW0ocG9wdWxhdGlvbikpCmBgYAoKIyMjIFRhYmxlIG9mIFRvdGFsIFBvcHVsYXRpb24gYWdlZCAxNCBvciBPdmVyLgpgYGB7ciB2aWV3IFRvdGFsIHBvcHVsYXRpb24gYWdlZCAxNCBhbmQgb3ZlciwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMjIERhdGEgRXhwbGFuYXRpb24KClRoaXMgdGFibGUgaGFzIHRoZSBpbmNvbWUgZGlzdHJpYnV0aW9uIG9mIHRoZSBCcmF6aWxpYW4gcG9wdWxhdGlvbi4KVGhlIElCR0UgaXRzZWxmIHJlbGVhc2VkIGFuIFtpbmZvcm1hdGl2ZV0oaHR0cHM6Ly9iaWJsaW90ZWNhLmliZ2UuZ292LmJyL3Zpc3VhbGl6YWNhby9saXZyb3MvbGl2MTAxNzA5X2luZm9ybWF0aXZvLnBkZikgb24gdGhlIGluY29tZSBkaXN0cmlidXRpb24gb2YgdGhlIEJyYXppbGlhbiBwb3B1bGF0aW9uIGJldHdlZW4gMjAxMiBhbmQgMjAxOS4KCkkgd2lsbCBvbmx5IHdvcmsgd2l0aCBhIGZyYWN0aW9uIG9mIHRoZSBkYXRhIGF2YWlsYWJsZSBpbiB0aGlzIHRhYmxlOiBpbmNvbWUgdXN1YWxseSByZWNlaXZlZCwgYXQgYXZlcmFnZSBwcmljZXMgYW5kIG9ubHkgZm9yIHBlb3BsZSBhZ2VkIDE0IGFuZCBvdmVyLgpBY2NvcmRpbmcgdG8gdGhlIElCR0UsIHVzdWFsIGluY29tZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CiAgCiIgVGhlIHVzdWFsIGluY29tZSBjb25zaXN0cyBvZiB0aGUgbW9udGhseSBpbmNvbWUgcmVjZWl2ZWQgYnkgZW1wbG95ZWVzLCBlbXBsb3llcnMgYW5kIHNlbGYtZW1wbG95ZWQgd29ya2Vycywgd2l0aG91dCBleHRyYW9yZGluYXJ5IGluY3JlYXNlcyBvciBzcG9yYWRpYyBkaXNjb3VudHMuIEZvciB0aGUgZW1wbG95ZWUsIHRoZSBtb250aGx5IGluY29tZSB1c3VhbGx5IHJlY2VpdmVkIGV4Y2x1ZGVzIGFsbCBpbnN0YWxsbWVudHMgdGhhdCBhcmUgbm90IGNvbnRpbnVvdXMgKGFubnVhbCBib251cywgc2FsYXJ5IGxhdGUsIG92ZXJ0aW1lLCBhbm51YWwgcHJvZml0IHNoYXJpbmcsIDEzdGggc2FsYXJ5LCAxNHRoIHNhbGFyeSwgc2FsYXJ5IGFkdmFuY2UsIGV0Yy4pIGFuZCBkb2VzIG5vdCBjb25zaWRlciBvY2Nhc2lvbmFsIGRpc2NvdW50cyAoYWJzZW5jZXMsIHBhcnQgb2YgdGhlIDEzdGggc2FsYXJ5IGFudGljaXBhdGVkLCBwb3NzaWJsZSBkYW1hZ2UgY2F1c2VkIHRvIHRoZSBlbnRlcnByaXNlLCBldGMuKS4KICAKSWYgdGhlIGluY29tZSByZWNlaXZlZCBmcm9tIGFuIGVtcGxveWVlLCBzZWxmLWVtcGxveWVkIHdvcmtlciBhbmQgZW1wbG95ZXIgaXMgdmFyaWFibGUsIHRoZSB1c3VhbCBpbmNvbWUgaXMgY29uc2lkZXJlZCB0byBiZSB0aGUgYXZlcmFnZSBpbmNvbWUgcmVjZWl2ZWQgYnkgdGhlIHBlcnNvbiBpbiB0aGUgcGVyaW9kIGluIHdoaWNoIGhlL3NoZSBjYXJyaWVkIG91dCB0aGUgZGVjbGFyZWQgd29yayBpbiB0aGUgcmVmZXJlbmNlIHdlZWsuIFdoZW4gcmVtdW5lcmF0aW9uIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIHBlcmlvZCBvciBzZWFzb24gb2YgdGhlIHllYXIsIHRoZSBtb250aGx5IGluY29tZSB0aGF0IHRoZSBwZXJzb24gdXN1YWxseSBlYXJucyBpbiB0aGF0IHNlYXNvbmFsIHBlcmlvZCBpcyBjb25zaWRlcmVkLiIgW3NlZSBpdF0oaHR0cDovL2Z0cC5pYmdlLmdvdi5ici9UcmFiYWxob19lX1JlbmRpbWVudG8vUGVzcXVpc2FfTmFjaW9uYWxfcG9yX0Ftb3N0cmFfZGVfRG9taWNpbGlvc19jb250aW51YS9NZW5zYWwvZ2xvc3NhcmlvX3BuYWRjX21lbnNhbC5wZGYpCgojIyBEYXRhIEV4cGxvcmF0aW9uCgpgYGB7ciBQTkFEX0NvbnRpbnVhXzIwMTlfaW5jb21lc19hbGxfc291cmNlcywgaW5jbHVkZT1GQUxTRX0KaW5jb21lX2ZpbGVfcGF0aCA8LSAiUE5BRGMvUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzLnhsc3giCnNoZWV0X3VzZWQgPC0gIlJEUEMgKFRyYWIgaGFiK091dHJvcyBlZmV0aXZvKSIKCnBvcHVsYXRpb25faW5jb21lIDwtIHJlYWRfZXhjZWwoaW5jb21lX2ZpbGVfcGF0aCwgc2hlZXQgPSBzaGVldF91c2VkLCBza2lwID0gMTIpCgpwb3B1bGF0aW9uX3dhZ2VfcmFuZ2UgPC1wb3B1bGF0aW9uX2luY29tZSAlPiUKICAgZmlsdGVyKGBBYmVydHVyYSBnZW9ncsOhZmljYWAgPT0gIkJyYXNpbCIsCiAgICAgICAgIFRpcG8gPT0gIlZhbG9yIiwKICAgICAgICAgc3ViLmNsYXNzZSAlaW4lIGMoImF0w6kgNSUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNSUgYXTDqSAxMCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgMTAlIGF0w6kgMjAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDIwJSBhdMOpIDMwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSAzMCUgYXTDqSA0MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNDAlIGF0w6kgNTAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDUwJSBhdMOpIDYwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA2MCUgYXTDqSA3MCUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgNzAlIGF0w6kgODAlIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDgwJSBhdMOpIDkwJSIJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAibWFpcyBkZSA5MCUgYXTDqSA5NSUiCSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1haXMgZGUgOTUlIGF0w6kgOTklIgksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYWlzIGRlIDk5JSBhdMOpIDEwMCUiCSksCiAgICAgICAgIGluZCA9PSAiUmVuZGltZW50byBtw6lkaW8gbWVuc2FsIHJlYWwgZGFzIHBlc3NvYXMgZGUgMTQgYW5vcyBvdSBtYWlzIGRlIGlkYWRlLCBkZSB0b2RvcyBvcyB0cmFiYWxob3MsIGEgcHJlw6dvcyBtw6lkaW9zIGRvIGFubyIpICU+JSAKICBzZWxlY3Qoc3ViLmNsYXNzZSwgJzIwMTYnLCcyMDE3JywnMjAxOCcsJzIwMTknKSAlPiUKICBtdXRhdGUoc3ViLmNsYXNzID0gZ3N1YigiYXTDqSA1JSIsICJtYWlzIGRlIDAlIGF0w6kgNSUiLCBzdWIuY2xhc3NlKSkgJT4lCiAgc2VsZWN0KC1zdWIuY2xhc3NlKSAlPiUKICAgIG11dGF0ZShzdWIuY2xhc3MgPSBpZmVsc2Uoc3RyX2RldGVjdChzdWIuY2xhc3MsICJebWFpcyBkZSBcXGQrJSBhdMOpIFxcZCslJCIpLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJfcmVwbGFjZShzdWIuY2xhc3MsICJtYWlzIGRlIChcXGQrKSUgYXTDqSAoXFxkKyklIiwgIm1vcmUgdGhhbiBcXDElIHVwIHRvIFxcMiUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgc3ViLmNsYXNzKSkgJT4lIAogIHVuaXF1ZSgpCgpgYGAKVGhpcyB0YWJsZSBpcyB2ZXJ5IHNpbXBsZS4gSW4gdGhlICdjbGFzcycgY29sdW1uLCB3ZSBoYXZlIHRoZSBwZXJjZW50YWdlIGNsYXNzIG9mIHBlb3BsZSBieSBpbmNvbWUsIGFuZCBpbiB0aGUgb3RoZXIgY29sdW1ucywgdGhlIHVzdWFsIGluY29tZSBvZiB0aGlzIGNsYXNzIG9mIHBlb3BsZS4KICAKSSB3aWxsIHVzZSBhIHRhYmxlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgSUJHRSByZXBvcnQgdG8gYmV0dGVyIGV4ZW1wbGlmeSB0aGUgdXNlIG9mIHRoZSB0YWJsZQoKIVtTb3VyY2U6IElCR0UsIERpcmVjdG9yYXRlIG9mIFJlc2VhcmNoLCBDb29yZGluYXRpb24gb2YgV29yayBhbmQgSW5jb21lLCBDb250aW51b3VzIE5hdGlvbmFsIEhvdXNlaG9sZCBTYW1wbGUgU3VydmV5IDIwMTItMjAxOS48YnI+Jm5ic3A7Jm5ic3A7Tm90ZXM6PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzEuIFVzdWFsIGluY29tZSwgYXQgMjAxOSBhdmVyYWdlIHByaWNlcy48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4gSW5jb21lIHJhaXNlZCBvbmx5IGZvciBwZW9wbGUgYWdlZCAxNCBvciBvdmVyLl0oaHR0cHM6Ly9pLmliYi5jby9CdExRSDNYL1NjcmVlbnNob3QtMjAyMy0wNi0xMC1hdC0xOS0zOS0yNi1jb3B5LnBuZykKSW4gdGhlIGZpcnN0IGxpbmUgJzIwMTInLCBpbiB0aGUgY29sdW1uICdNb3JlIHRoYW4gODAlIHVwIHRvIDkwJScsIHdlIGhhdmUgdGhlIHZhbHVlIDMgMzUxLCB3aGljaCByZXByZXNlbnRzIGEgbW9udGhseSBpbmNvbWUgb2YgUiQgMywzNTEuMDAuIFRoYXQgaXMsIDkwJSBvZiBCcmF6aWxpYW5zIHJlY2VpdmUgdXAgdG8gdGhpcyBhbW91bnQsIG9ubHkgMTAlIHJlY2VpdmUgbW9yZSB0aGFuIHRoYXQuCgojIyBEYXRhIE1hbmlwdWxhdGluZwogIApTbyB0aGF0IEkgY2FuIHN0YW5kYXJkaXplIHRoZSBQTkFEIGFuZCBJTkZPUEVOIGluY29tZSB0YWJsZXMsIEkgd2lsbCBuZWVkIGFuIGFkanVzdG1lbnQgYWNjb3JkaW5nIHRvIHRoZSBtaW5pbXVtIHdhZ2UuIEZvciB0aGlzIEkgd2lsbCBjcmVhdGUgYSB0YWJsZSB3aXRoIHRoZSB2YWx1ZXMgb2YgdGhlIHllYXJzIDIwMTYgdG8gMjAxOS4KCmBgYHtyIG1pbmltdW1fc2FsYXJ5XzIwMTZfdG9fMjAxOX0KeWVhciA8LSBjKDIwMTksIDIwMTgsIDIwMTcsIDIwMTYpCm1pbmltdW1fc2FsYXJ5IDwtIGMoOTk4LjAwLCA5NTQuMDAsIDkzNy4wMCwgODgwLjAwKQptaW5pbXVtX3NhbGFyeV8yMDE2X3RvXzIwMTkgPC0gZGF0YS5mcmFtZSh5ZWFyLCBtaW5pbXVtX3NhbGFyeSkKYGBgCgpgYGB7ciBjb21iaW5lIHZhbHVlcyBvZiBtaW5pbXVtIHNhbGFyeSB3aXRoIHBvcHVsYXRpb24gc2FsYXJ5IHJhbmdlLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX3dhZ2VfcmFuZ2VfMiA8LSBwaXZvdF9sb25nZXIocG9wdWxhdGlvbl93YWdlX3JhbmdlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoIjIwMTYiLCAiMjAxNyIsICIyMDE4IiwgIjIwMTkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInllYXIiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gImluY29tZSIpJT4lCiAgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHllYXIpLAogICAgIHBvcHVsYXRpb25fcGVyY2VudGFnZSA9IGFzLm51bWVyaWMoY2FzZV93aGVuKAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gMCUgdXAgdG8gNSUiIH4gIjUiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDUlIHVwIHRvIDEwJSIgfiAiNSIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gMTAlIHVwIHRvIDIwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDIwJSB1cCB0byAzMCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiAzMCUgdXAgdG8gNDAlIiB+ICIxMCIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gNDAlIHVwIHRvIDUwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDUwJSB1cCB0byA2MCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA2MCUgdXAgdG8gNzAlIiB+ICIxMCIgLAogICAgIHN1Yi5jbGFzcyA9PSJtb3JlIHRoYW4gNzAlIHVwIHRvIDgwJSIgfiAiMTAiICwKICAgICBzdWIuY2xhc3MgPT0ibW9yZSB0aGFuIDgwJSB1cCB0byA5MCUiIH4gIjEwIiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5MCUgdXAgdG8gOTUlIiB+ICI1IiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5NSUgdXAgdG8gOTklIiB+ICI0IiAsCiAgICAgc3ViLmNsYXNzID09Im1vcmUgdGhhbiA5OSUgdXAgdG8gMTAwJSIgfiAiMSIgLAogICApKSkgJT4lCiAgIGxlZnRfam9pbihtaW5pbXVtX3NhbGFyeV8yMDE2X3RvXzIwMTksIGJ5ID0gInllYXIiKQoKYGBgCgpUaGlzIHRhYmxlIGNvbnNpZGVycyBvbmx5IHRoZSBwZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIHNvbWUgaW5jb21lLiBUaGUgSUJHRSBjb25zaWRlcnMgdW5lbXBsb3llZCBwZW9wbGUgd2hvIGFyZSBsb29raW5nIGZvciB3b3JrIGR1cmluZyB0aGUgc2FtcGxlIHBlcmlvZC4gSG93ZXZlciwgaXQgZG9lcyBub3QgY29uc2lkZXIgcGVvcGxlIHdpdGhvdXQgaW5jb21lIHdobyB3ZXJlIG5vdCBsb29raW5nIGZvciBhIGpvYiBhcyB1bmVtcGxveWVkLiBUaGlzIHBvcnRpb24gb2YgcGVvcGxlIHdpdGhvdXQgaW5jb21lIGlzIHRoZSBvbmUgd2UgYXJlIGdvaW5nIHRvIGRlYWwgd2l0aCBoZXJlLgogIApUbyBleHRyYWN0IHRoaXMgZGF0YSwgSSB3aWxsIHVzZSB0aGUgc2FtZSB0YWJsZSBhbHJlYWR5IHVzZWQsIHdoaWNoIGFsc28gaGFzIHRoaXMgaW5mb3JtYXRpb24uClRoZSAnUE5BRF9Db250aW51YV8yMDE5X1JlbmRpbWVudG9fZGVfVG9kYXNfYXNfRm9udGVzJyB0YWJsZSBoYXMgdGhlICJQZXJjZW50YWdlIG9mIHBlb3BsZSB3aXRoIGluY29tZSIgYXMgYW4gaW5kaWNhdG9yLCBzbyBJIHdpbGwgZXh0cmFjdCAnMTAwJScgZnJvbSB0aGlzIHZhbHVlIGFuZCBvYnRhaW4gdGhlIHBlcmNlbnRhZ2Ugb2YgcGVvcGxlIHdpdGhvdXQgaW5jb21lLgoKYGBge3IgYWRkIHRoZSBudW1iZXIgb2Ygbm9faW5jb21lLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpwZXJjZW50YWdlX2VtcGxveWVkIDwtcG9wdWxhdGlvbl9pbmNvbWUgJT4lCiAgICBmaWx0ZXIoYEFiZXJ0dXJhIGdlb2dyw6FmaWNhYCA9PSAiQnJhc2lsIiwKICAgICAgICAgVGlwbyA9PSAiVmFsb3IiLAogICAgICAgICBzdWIuY2xhc3NlICVpbiUgYygiVG9kYXMgYXMgZm9udGVzwrkiCSksCiAgICAgICAgIGluZCA9PSAiUGVyY2VudHVhbCBkZSBwZXNzb2FzIGNvbSByZW5kaW1lbnRvLCBuYSBwb3B1bGHDp8OjbyByZXNpZGVudGUiKSAlPiUgCiAgc2VsZWN0KHN1Yi5jbGFzc2UsICcyMDE2JywnMjAxNycsJzIwMTgnLCcyMDE5JykgJT4lIAogIHVuaXF1ZSgpCgpwZXJjZW50YWdlX2VtcGxveWVkXzJfbG9uZ19mb3JtYXQgPC0gcGl2b3RfbG9uZ2VyKHBlcmNlbnRhZ2VfZW1wbG95ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoIjIwMTYiLCAiMjAxNyIsIjIwMTgiLCAiMjAxOSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzX3RvPSJ5ZWFyIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190bz0icG9wdWxhdGlvbl9wZXJjZW50YWdlX3dpdGhfaW5jb21lIikKCnBlcmNlbnRhZ2VfcHBfd2l0aG91dF9pbmNvbWUgPC0gcGVyY2VudGFnZV9lbXBsb3llZF8yX2xvbmdfZm9ybWF0ICU+JQogICBtdXRhdGUocG9wdWxhdGlvbl93aXRob3V0X2luY29tZSA9ICgxMDAgLSBwb3B1bGF0aW9uX3BlcmNlbnRhZ2Vfd2l0aF9pbmNvbWUpLAogICAgICAgICAgaW5jb21lID0gMCwKICAgICAgICAgIHdhZ2VfcmFuZ2UgPSAiZG9lcyBub3QgcmVjZWl2ZSIsCiAgICAgICAgICB5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQoKbm9faW5jb21lIDwtIGxlZnRfam9pbihwZXJjZW50YWdlX3BwX3dpdGhvdXRfaW5jb21lLCBwb3B1bGF0aW9uX3RvdGFsXzE0X3llYXJzX29sZF9vcl9vdmVyLCBieSA9IGpvaW5fYnkoeWVhcikpICU+JQogICBtdXRhdGUocG9wdWxhdGlvbiA9IChwb3B1bGF0aW9uX3dpdGhvdXRfaW5jb21lKnBvcHVsYXRpb24pLzEwMCwpICU+JQogICBncm91cF9ieSh5ZWFyLCB3YWdlX3JhbmdlKSAlPiUKICAgc3VtbWFyaXNlKHBvcHVsYXRpb24gPSBzdW0ocG9wdWxhdGlvbikpICU+JQogICBzZWxlY3QoeWVhciwgd2FnZV9yYW5nZSwgcG9wdWxhdGlvbikKCmBgYAoKQmVmb3JlIG1lcmdpbmcgdGhlIHRhYmxlcywgSSBzdGlsbCBuZWVkIHRvIHN0YW5kYXJkaXplIHRoZSB2YXJpYWJsZXMuCmBgYHtyIGRlZmF1bHQgeWllbGQgdmFyaWFibGVzLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKIyBDcmVhdGluZyB0aGUgbmV3IGNvbHVtbiB3aXRoIHRoZSBjYXRlZ29yaWVzCnBvcHVsYXRpb25fd2FnZV9yYW5nZV8zIDwtIHBvcHVsYXRpb25fd2FnZV9yYW5nZV8yICU+JQogICBtdXRhdGUod2FnZV9yYW5nZSA9IGNhc2Vfd2hlbigKICAgICBpbmNvbWUgPj0gbWluaW11bV9zYWxhcnkgJiBpbmNvbWUgPCAyICogbWluaW11bV9zYWxhcnkgfiAiYmV0d2VlbiAxIGFuZCAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIsCiAgICAgaW5jb21lID49IDMvNCAqIG1pbmltdW1fc2FsYXJ5ICYgaW5jb21lIDwgbWluaW11bV9zYWxhcnkgfiAiYmV0d2VlbiAzLzQgYW5kIDEgbW9udGhseSBtaW5pbXVtIHdhZ2UiLAogICAgIGluY29tZSA+PSAyICogbWluaW11bV9zYWxhcnkgfiAib3ZlciAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIsCiAgICAgaW5jb21lID4gMCAmIGluY29tZTwgMy80ICogbWluaW11bV9zYWxhcnkgfiAibGVzcyB0aGFuIDMvNCBvZiB0aGUgbW9udGhseSBtaW5pbXVtIHdhZ2UiCiAgICkpICU+JQogICBzZWxlY3Qoc3ViLmNsYXNzLCB5ZWFyLCBwb3B1bGF0aW9uX3BlcmNlbnRhZ2UsIGluY29tZSx3YWdlX3JhbmdlKQoKCnBvcHVsYXRpb25fd2FnZV9yYW5nZV80IDwtbWVyZ2UocG9wdWxhdGlvbl93YWdlX3JhbmdlXzMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fdG90YWxfMTRfeWVhcnNfb2xkX29yX292ZXIsIGJ5ID0gInllYXIiKSAlPiUKICAgbXV0YXRlKHBhaWRfcG9wdWxhdGlvbiA9IHJvdW5kKChwb3B1bGF0aW9uICogcG9wdWxhdGlvbl9wZXJjZW50YWdlKS8xMDApKSAlPiUKICAgc2VsZWN0KHllYXIsIHdhZ2VfcmFuZ2UsIHBhaWRfcG9wdWxhdGlvbikgJT4lCiAgIHJlbmFtZShwb3B1bGF0aW9uID0gcGFpZF9wb3B1bGF0aW9uKQoKcG9wdWxhdGlvbl93YWdlX3JhbmdlXzUgPC0gcG9wdWxhdGlvbl93YWdlX3JhbmdlXzQgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHdhZ2VfcmFuZ2UpICU+JQogICBzdW1tYXJpc2UocG9wdWxhdGlvbiA9IHN1bShwb3B1bGF0aW9uKSkgJT4lCiAgIG11dGF0ZSh5ZWFyID0gYXMuZmFjdG9yKHllYXIpKQoKYGBgCgpgYGB7ciBzZXR0aW5nIGNvcnJlY3QgeWllbGQgb3JkZXJ9CiMgU2V0IHRoZSBjb3JyZWN0IG9yZGVyIG9mIHlpZWxkcwppbmNvbWVfcmFuZ2Vfb3JkZXIgPC0gYygiZG9lcyBub3QgcmVjZWl2ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlc3MgdGhhbiAzLzQgb2YgdGhlIG1vbnRobHkgbWluaW11bSB3YWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmV0d2VlbiAzLzQgYW5kIDEgbW9udGhseSBtaW5pbXVtIHdhZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZXR3ZWVuIDEgYW5kIDIgbW9udGhseSBtaW5pbXVtIHdhZ2VzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3ZlciAyIG1vbnRobHkgbWluaW11bSB3YWdlcyIpCgpwb3B1bGF0aW9uX3JlbXVuZXJhdGlvbl82IDwtIHJiaW5kKHBvcHVsYXRpb25fd2FnZV9yYW5nZV81LCBub19pbmNvbWUpJT4lCiAgIG11dGF0ZSh3YWdlX3JhbmdlID0gYXMuZmFjdG9yKHdhZ2VfcmFuZ2UpLAogICAgICAgICAgd2FnZV9yYW5nZSA9IGZhY3Rvcih3YWdlX3JhbmdlLCBsZXZlbHMgPSBpbmNvbWVfcmFuZ2Vfb3JkZXIpKQoKYGBgCgpGaW5hbGx5LCBhbiBvdmVydmlldyBvZiB0aGUgZGlzdHJpYnV0aW9uIG9mIGluY29tZSBpbiB0aGUgY291bnRyeToKCiMjIFBvcHVsYXRpb24gZGlzdHJpYnV0aW9uIHdpdGggYW5kIHdpdGhvdXQgaW5jb21lCgpgYGB7ciB2aWV3IHBvcHVsYXRpb24gd2l0aCBhbmQgd2l0aG91dCBpbmNvbWUsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShwb3B1bGF0aW9uX3JlbXVuZXJhdGlvbl82LHdhZ2VfcmFuZ2UseWVhciksMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAoKQmVmb3JlIG1lcmdpbmcgdGhlIGRhdGFmcmFtZXMsIEkgbm90aWNlZCB0aGF0IHRoZSBJbmZvcGVuIHRhYmxlIGRvZXMgbm90IGhhdmUgZGF0YSBvbiBwcmlzb25lciBwYXkgaW4gMjAxNyBmb3IgdGhlIHN0YXRlIG9mIFNhbyBQYXVsby4gSSB3aWxsIHVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBbQGxhcnNvbjE5ODhyZWZsZXhpdml0eV10byBwcmVkaWN0IHRoaXMgZGF0YS4gCgpgYGB7ciByZW11bmVyYXRpb24gb2YgcHJpc29uZXJzIGluIFNQIDIwMTd9CiMgU3Vic2V0IG9mIGRhdGEgZm9yIHRoZSBzdGF0ZSBvZiBTw6NvIFBhdWxvCmluZm9wZW5fc3AgPC0gaW5mb3Blbl93YWdlXzNfZmluYWxbaW5mb3Blbl93YWdlXzNfZmluYWwkc3RhdGUgPT0gJ1NQJywgXQpgYGAKICAKRnVuY3Rpb24gdG8gcHJlZGljdCB0aGUgbWlzc2luZyBkYXRhIG9uIHRoZSByZW11bmVyYXRpb24gb2YgcHJpc29uZXJzIGluIFNhbyBQYXVsbyBpbiAyMDE3CmBgYHtyIEZ1bmN0aW9uIHRvIHByZWRpY3QgbWlzc2luZyB2YWx1ZXMgb24gdGhlIHJlbXVuZXJhdGlvbiBvZiBwcmlzb25lcnMgaW4gU2FvIFBhdWxvfQpwcmVkaWN0X212IDwtIGZ1bmN0aW9uKHllYXIsIHByaXNvbmVycykgewogICBjb21wbGV0ZV9jYXNlcyA8LSAhaXMubmEocHJpc29uZXJzKQogICBhcHByb3goeCA9IGFzLm51bWVyaWMoeWVhcltjb21wbGV0ZV9jYXNlc10pLAogICAgICAgICAgeSA9IHByaXNvbmVyc1tjb21wbGV0ZV9jYXNlc10sCiAgICAgICAgICB4b3V0ID0gYXMubnVtZXJpYyh5ZWFyKSkkeQp9CmBgYAogIApBcHBseSB0aGUgZnVuY3Rpb24gZm9yIGVhY2ggZ2VuZGVyIGFuZCBjb21wZW5zYXRpb24gY29tYmluYXRpb24KYGBge3IgQXBwbHkgYSBmdW5jdGlvbiBmb3IgZWFjaCBnZW5kZXIgYW5kIGNvbXBlbnNhdGlvbiBjb21iaW5hdGlvbn0KaW5mb3Blbl9zcCA8LSBpbmZvcGVuX3NwICU+JQogICBncm91cF9ieSh3YWdlKSAlPiUKICAgbXV0YXRlKHByaXNvbmVycyA9IHJvdW5kKHByZWRpY3RfbXYoeWVhciwgcHJpc29uZXJzKSkpICU+JQogICB1bmdyb3VwKCkKYGBgCgpSZXBsYWNlIHRoZSBvcmlnaW5hbCBkYXRhIGZvciBTYW8gUGF1bG8gd2l0aCB0aGUgbmV3IHBvcHVsYXRlZCBkYXRhCmBgYHtyIGRhdGEgZmlsbGVkIGlufQppbmZvcGVuX3dhZ2VfM19maW5hbFtpbmZvcGVuX3dhZ2VfM19maW5hbCRzdGF0ZSA9PSAnU1AnLCBdIDwtIGluZm9wZW5fc3AKCmBgYAogIApGaW5hbGx5IHRoZSBmaW5hbCB0YWJsZSB0aGUgZXN0aW1hdGVkIGFtb3VudCBvZiBwcmlzb25lcnMgYnkgcmVtdW5lcmF0aW9uCmBgYHtyIGZpbmFsIHRhYmxlIGluZm9wZW5fd2FnZX0KaW5mb3Blbl93YWdlXzQgPC0gaW5mb3Blbl93YWdlXzNfZmluYWwgJT4lCiAgIGdyb3VwX2J5KHllYXIsIHdhZ2UpICU+JQogICBtdXRhdGUoeWVhciA9IGFzLmZhY3Rvcih5ZWFyKSkgJT4lCiAgIHN1bW1hcmlzZShwcmlzb25lcnMgPSBzdW0ocHJpc29uZXJzKSkgJT4lIAogICAgcmVuYW1lKHdhZ2VfcmFuZ2UgPSB3YWdlKQpgYGAKCkFmdGVyIGFsbCB0aGUgbWFuaXB1bGF0aW9ucywgSSBjYW4gZmluYWxseSBjb21iaW5lIHRoZSB0YWJsZXMuCgpgYGB7ciBwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBpbmNsdWRlPUZBTFNFfQpwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lIDwtIGFzLmRhdGEuZnJhbWUobGVmdF9qb2luKGluZm9wZW5fd2FnZV80LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVsYXRpb25fcmVtdW5lcmF0aW9uXzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBqb2luX2J5KHllYXIsIHdhZ2VfcmFuZ2UpKSkgJT4lCiAgIG11dGF0ZSh3YWdlX3JhbmdlID0gYXMuZmFjdG9yKHdhZ2VfcmFuZ2UpLAogICAgICAgICAgd2FnZV9yYW5nZSA9IGZhY3Rvcih3YWdlX3JhbmdlLCBsZXZlbHMgPSBpbmNvbWVfcmFuZ2Vfb3JkZXIpLAogICAgICAgICAgeWVhciA9IGFzLmZhY3Rvcih5ZWFyKSkKCmBgYAoKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIHdhZ2UgcmFuZ2UKCmBgYHtyIHBvcHVsYXRpb24gdmlld19pbmZvcGVuX2luY29tZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKCiMgUHJlc2VudGF0aW9uIG9mIENvbGxlY3RlZCBhbmQgTWFuaXB1bGF0ZWQgRGF0YTogey50YWJzZXQgLnRhYnNldC1mYWRlfQoKIyMgUE5BRCBUYWJsZSAtIElORk9QRU4gVG90YWwKCmBgYHtyIGZpbmFsIHZpZXcgcG9wdWxhY2FvX2luZm9wZW5fdG90YWwgLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl90b3RhbCwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCiAgCiMjIFBOQURDIFRhYmxlIC0gSU5GT1BFTiBMZXZlbCBvZiBFZHVjYXRpb24KYGBge3IgZmluYWwgdmlldyBwb3B1bGFjYW9faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24gLCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKHBvcHVsYXRpb25faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24sMTApKSAlPiUKICAgICBrYWJsZV9zdHlsaW5nKGZvbnRfc2l6ZSA9IDEyLCBmdWxsX3dpZHRoID0gVCwgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiwgImJvcmRlcmVkIikpCmBgYAogIAojIyBQTkFEQyBUYWJsZSAtIElORk9QRU4gRXRobmljaXR5CmBgYHtyIGZpbmFsIHZpZXcgcG9wdWxhdGlvbl9pbmZvcGVuX2V0aG5pY2l0eSB0YWJsZSwgZWNobz1GQUxTRX0Ka2FibGUoaGVhZChwb3B1bGF0aW9uX2luZm9wZW5fZXRobmljaXR5LDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgUE5BREMgdGFibGUgLSBJTkZPUEVOIEFnZSBSYW5nZQpgYGB7ZmluYWwgdmlzdWFsaXphdGlvbiB0YWJsZSBwb3B1bGFjYW9faW5mb3Blbl9mYWl4YV9ldGFyaWEsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQoYXJyYW5nZShwb3B1bGF0aW9uX2luZm9wZW5fYWdlX3JhbmdlLHllYXIpLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKICAKIyMgUE5BREMgVGFibGUgLSBJTkZPUEVOIFdhZ2UgUmFuZ2UKYGBge3IgZmluYWwgdmlldyBwb3B1bGFjYW9faW5mb3Blbl9pbmNvbWUsIGVjaG89RkFMU0V9CmthYmxlKGhlYWQocG9wdWxhdGlvbl9pbmZvcGVuX2xldmVsX29mX2VkdWNhdGlvbiwxMCkpICU+JQogICAgIGthYmxlX3N0eWxpbmcoZm9udF9zaXplID0gMTIsIGZ1bGxfd2lkdGggPSBULCBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiLCAiYm9yZGVyZWQiKSkKYGBgCgojIEFuYWx5emVzIGFuZCBDb3JyZWxhdGlvbnMuCgpNb3N0IG9mIHRoZSBwcm9qZWN0IHByb3Bvc2FsIGhhcyBhbHJlYWR5IGJlZW4gcGFzc2VkLiBGcm9tIHRoaXMgcG9pbnQgb24sIEkgZm9jdXMgbW9yZSBvbiBwcmVzZW50aW5nIHNvbWUgY29ycmVsYXRpb25zIGZvdW5kIGluIHRoZSB0YWJsZXMgd2Ugc2V0IHVwIGFuZCBwcmVzZW50IGEgbGl0dGxlIGFib3ZlLgogIAoKSSdsbCBzdGFydCBieSBjcmVhdGluZyBhIGNvbHVtbiB0aGF0IHJlbGF0ZXMgdGhlIG51bWJlciBvZiBwcmlzb25lcnMgdG8gdGhlIHRvdGFsIHBvcHVsYXRpb24sIGFuZCB0aGVuIEknbGwgcGxvdCBzb21lIGdyYXBocyB0aGF0IGlsbHVzdHJhdGUgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gZWFjaCB2YXJpYWJsZQoKIyMgRXRobmljaXR5IERhdGFmcmFtZQoKVGhlIHZhcmlhdGlvbiBpbiB0aGUgcGVyY2VudGFnZSBvZiBwcmlzb25lcnMgaW4gcmVsYXRpb24gdG8gcG9wdWxhdGlvbiBieSBldGhuaWNpdHkgc2hvd3MgdGhhdCBpbiBwcmFjdGljYWxseSBhbGwgc3RhdGVzLCB0aGVyZSBpcyBhIGhpZ2hlciBpbmNpZGVuY2Ugb2YgYnJvd24gYW5kIGJsYWNrIHByaXNvbmVycyBjb21wYXJlZCB0byB0aGUgcG9wdWxhdGlvbi4gVGhpcyBkb2VzIG5vdCBpbmRpY2F0ZSBjYXVzYWxpdHksIGFzIHRoZXJlIGFyZSBvdGhlciBmYWN0b3JzIHRoYXQgY291bGQgaW5mbHVlbmNlIGluZGl2aWR1YWxzIHRvIGNvbW1pdCBjcmltZXMgYW5kIGVuZCB1cCBpbiBqYWlsLiBIb3dldmVyLCBpdCBpcyBhIGZhY3QgdGhhdCByZXF1aXJlcyBmdXJ0aGVyIGludmVzdGlnYXRpb24uIEl0IHdvdWxkIGJlIGlkZWFsIHRvIGFzc2VzcyBhZGRpdGlvbmFsIHZhcmlhYmxlcywgc3VjaCBhcyBwb3RlbnRpYWwgcmFjaXNtIHdpdGhpbiB0aGUganVkaWNpYXJ5LCBhcyB3ZWxsIGFzIGVkdWNhdGlvbiBhbmQgaW5jb21lLCBhcyB3ZSBhcmUgZG9pbmcgaGVyZS4gSW4gdGhlIGZvbGxvd2luZyBncmFwaHMsIEkgcHJlc2VudCBzb21lIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcy4KCmBgYHtyIHBsb3Qgb2YgZXRobmljaXR5IGJ5IHN0YXRlIGdyYXBocywgZWNobz1GQUxTRX0KZ2dwbG90KHBvcHVsYXRpb25faW5mb3Blbl9ldGhuaWNpdHksIGFlcyh4PXllYXIsIHk9KHByaXNvbmVycy9wb3B1bGF0aW9uKSwgY29sb3I9ZXRobmljaXR5KSkgKwogICBnZW9tX2xpbmUoKSArCiAgIGZhY2V0X3dyYXAofnN0YXRlLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDUpICsKICAgbGFicyh4PSJZZWFyIiwgeT0iVmFsdWUiLCBjb2xvdXI9IkV0aG5pY2l0eSIpICsKICAgdGhlbWVfbWluaW1hbCgpICsKICAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSkKCmBgYAoKCiMjIEFnZSBSYW5nZSBEYXRhZnJhbWUKCkhlcmUgd2UgY2FuIG9ic2VydmUgYSBkZWNyZWFzZSBpbiB0aGUgcmF0ZSBvZiBwcmlzb25lcnMgaW4gdGhlIGFnZSBncm91cCBvZiAxOCB0byAyNCB5ZWFycyBvdmVyIHRpbWUuIFRoaXMgY2FuIGhhcHBlbiBmb3Igc2V2ZXJhbCByZWFzb25zLCBhbW9uZyB0aGVtIHRoZSBhZ2luZyBvZiB0aGUgcHJpc29uIHBvcHVsYXRpb24uIEhvd2V2ZXIsIGlmIHdlIHRha2UgYWxsIG90aGVyIGFnZSBncm91cHMsIHdlIGhhdmUgYSBjb25zaWRlcmFibGUgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBwcmlzb25lcnMgaW4gd2hhdCB3ZSBjYWxsICJ3b3JraW5nIGFnZSIsIHdoaWNoIGNvbXByaXNlcyB0aGUgcG9wdWxhdGlvbiB1cCB0byA2MSB5ZWFycyBvZiBhZ2UuIEl0J3MgcmVhbGx5IGZydXN0cmF0aW5nIHRvIHJlYWxpemUgdGhhdCBvdXIgIkJpbGwgR2F0ZXMiLCAiWnVja2VyYmVyZ3MiLCBhbmQgIkVsb24gTXVza3MiIGFyZSBiZWhpbmQgYmFycy4gVGhlIHBvcHVsYXRpb24gdGhhdCBzaG91bGQgYmUgaW4gY29sbGVnZSBpcyB0cmFwcGVkLCBieSBudW1lcm91cyBmYWN0b3JzLCBhbW9uZyB3aGljaCB0aGUgeW91bmcgYWdlLCBhbG9uZyB3aXRoIGxvdyBlZHVjYXRpb24gYW5kIGxhY2sgb2YgbW9uZXkuIEl0IHdvdWxkIHJlYWxseSBiZSBhIGRyZWFtIG5vdCB0byBoYXZlIHNvIG1hbnkgeW91bmcgcGVvcGxlIGFycmVzdGVkLgoKYGBge3IgZ2dwbG90IHBvcHVsYXRpb25faW5mb3Blbl9hZ2VfcmFuZ2UsIGVjaG89RkFMU0V9CgpnZ3Bsb3QocG9wdWxhdGlvbl9pbmZvcGVuX2FnZV9yYW5nZSwgYWVzKHg9eWVhciwgeT0ocHJpc29uZXJzL3BvcHVsYXRpb24pLCBjb2xvcj1hZ2VfcmFuZ2UpKSArCiAgIGdlb21fbGluZSgpICsKICAgZmFjZXRfd3JhcCh+YWdlX3JhbmdlLCBzY2FsZXMgPSAiZnJlZV95IiwgbmNvbCA9IDIpICsKICAgbGFicyh4PSJZZWFyIiwgeT0iVmFsdWUiKSArCiAgIHRoZW1lX21pbmltYWwoKSArCiAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCkpCgpgYGAKCgojIyBFZHVjYXRpb24gTGV2ZWwgRGF0YWZyYW1lCgpUaGlzIHRhYmxlIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcHJpc29uZXJzIGJ5IGxldmVsIG9mIGVkdWNhdGlvbi4gQ2xlYXJseSwgdGhlIGtleSB0dXJucyBpbiBpbmNvbXBsZXRlIHNlY29uZGFyeSBlZHVjYXRpb24sIHNpbmNlIGZyb20gdGhlbiBvbiwgdGhlIHBlcmNlbnRhZ2Ugb2YgcHJpc29uZXJzIG92ZXIgdGhlIHBvcHVsYXRpb24gZHJvcHMgZHJhc3RpY2FsbHkuIEl0IGlzIG5vIGxvbmdlciBhIG15c3RlcnkgdGhhdCBhIHBvcHVsYXRpb24gd2l0aCBsb3cgZWR1Y2F0aW9uIHVzdWFsbHkgaGFzIGEgaGlnaCBkZWdyZWUgb2YgdmlvbGVuY2UgYXMgYSByZXNwb25zZSwgdGFrZSBjb3VudHJpZXMgbGlrZSBub3J3YXksIG5ldGhlcmxhbmRzIGFuZCBqYXBhbiBmb3IgZXhhbXBsZSB3aGVyZSB0aGVyZSBhcmUgdmVyeSBmZXcgcHJpc29uZXJzLCBhbmQgY29tcGFyZSB0aGUgbGV2ZWwgb2YgYWNjZXNzIHRvIGhpZ2hlciBlZHVjYXRpb24gd2l0aCB0aGF0IG9mIEJyYXppbC4KCmBgYHtyIGdncGxvdCBwb3B1bGF0aW9uX2luZm9wZW5fbGV2ZWxfb2ZfZWR1Y2F0aW9uLCBlY2hvPUZBTFNFfQpnZ3Bsb3QoZGF0YSA9IHBvcHVsYXRpb25faW5mb3Blbl9sZXZlbF9vZl9lZHVjYXRpb24sIGFlcyh4ID0gbGV2ZWxfb2ZfZWR1Y2F0aW9uLCB5ID0gKHByaXNvbmVycy9wb3B1bGF0aW9uKSxmaWxsID0gbGV2ZWxfb2ZfZWR1Y2F0aW9uKSkgKwogICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKwogICBsYWJzKHggPSAiTGV2ZWwgb2YgRWR1Y2F0aW9uIiwgeSA9ICJJbm1hdGVzL1BvcHVsYXRpb24gUmF0aW8iLCBmaWxsID0gIkxldmVsIG9mIEVkdWNhdGlvbiIpICsKICAgZmFjZXRfd3JhcCh+c3RhdGUsIHNjYWxlcyA9ICJmcmVlX3kiLCBuY29sID0gNSkrCiAgICAgdGhlbWVfbWluaW1hbCgpICsKICAgICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKCiMjIEluY29tZXMgRGF0YWZyYW1lCgpIZXJlIHdlIGNhbiBvYnNlcnZlIHRoYXQgbW9zdCBvZiB0aGUgcHJpc29uIHBvcHVsYXRpb24gYXJlIHBlb3BsZSB3aG8gcmVjZWl2ZSB1cCB0byAxIG1vbnRobHkgbWluaW11bSB3YWdlLiBUaGlzIGFtb3VudCBiZXR3ZWVuIDMvNCBhbmQgMSBtb250aGx5IG1pbmltdW0gd2FnZSBpbmNsdWRlcyBzZXZlcmFsIHBlb3BsZSB3aG8gcmVjZWl2ZSBnb3Zlcm5tZW50IGFpZCBzdWNoIGFzICJCb2xzYSBGYW3DrWxpYSIgb3Igb3RoZXJzLiBUaGV5IGNhbm5vdCBiZSwgYWNjb3JkaW5nIHRvIHRoZSBJQkdFLCBjbGFzc2lmaWVkIGFzIHdpdGhvdXQgaW5jb21lIG9yIHVuZW1wbG95ZWQuCgpUaGUgSW50ZXItVW5pb24gRGVwYXJ0bWVudCBvZiBTdGF0aXN0aWNzIGFuZCBTb2Npb2Vjb25vbWljIFN0dWRpZXMgKERpZWVzZSksIG1vbnRobHkgcHVibGlzaGVzIHRoZSB2YWx1ZSBvZiB0aGUgY29zdCBvZiB0aGUgQmFzaWMgRm9vZCBCYXNrZXQgd2hpY2gsIGFjY29yZGluZyB0byB0aGUgYm9keSwgd291bGQgYmUgInN1ZmZpY2llbnQgZm9yIHRoZSBzdXN0ZW5hbmNlIGFuZCB3ZWxsLWJlaW5nIG9mIGFuIGFkdWx0IHdvcmtlciwgY29udGFpbmluZyBiYWxhbmNlZCBhbW91bnRzIG9mIHByb3RlaW4sIGNhbG9yaWVzLCBpcm9uIGNhbGNpdW0gYW5kIHBob3NwaG9ydXMuW0BNZXRvZG9sb2dpYV0iLiBJbiAyMDE5LCB0aGUgYXZlcmFnZSB2YWx1ZSBvZiB0aGUgbmF0aW9uYWwgRm9vZCBQYXJjZWwgd2FzIEJSTCA0MjIuMTksIHdoaWNoIHJlcHJlc2VudHMgYWxtb3N0IGhhbGYgdGhlIG1pbmltdW0gd2FnZSBhdCB0aGUgdGltZSAoQlJMIDk5OC4wMCkuCmBgYHtyIGdncGxvdCBwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBlY2hvPUZBTFNFIH0KCmdncGxvdChwb3B1bGF0aW9uX2luZm9wZW5faW5jb21lLCBhZXMoeD15ZWFyLCB5PShwcmlzb25lcnMvcG9wdWxhdGlvbiksIGZpbGw9d2FnZV9yYW5nZSkpICsKICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSArCiAgIHRoZW1lX21pbmltYWwoKSArCiAgIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIHByaXNvbmVycyBieSB5ZWFyIGFuZCB3YWdlIHJhbmdlIiwKICAgICAgICB4ID0gIlllYXIiLAogICAgICAgIHkgPSAiTnVtYmVyIG9mIFByaXNvbmVycyIsCiAgICAgICAgZmlsbCA9ICJ3YWdlX3JhbmdlIikgKwogICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKQoKYGBgCiMjIyBNaW5pbXVtIFdhZ2UgUmVxdWlyZWQKClRoZSBDb25zdGl0dXRpb24gb2YgQnJhemlsLCBlbmFjdGVkIGluIE9jdG9iZXIgMTk4OCwgbWFuZGF0ZXMgdGhhdCB0aGUgbWluaW11bSB3YWdlIHNob3VsZCBiZSBhIGxlZ2FsbHkgZGVmaW5lZCBhbmQgdW5pZm9ybSBhbW91bnQgbmF0aW9ud2lkZS4gSXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgdG8gbWVldCB0aGUgYmFzaWMgbmVlZHMgb2YgYSB3b3JrZXIgYW5kIHRoZWlyIGZhbWlseSwgaW5jbHVkaW5nIGhvdXNpbmcsIGZvb2QsIGVkdWNhdGlvbiwgaGVhbHRoLCBsZWlzdXJlLCBjbG90aGluZywgaHlnaWVuZSwgdHJhbnNwb3J0YXRpb24sIGFuZCBzb2NpYWwgc2VjdXJpdHkuIFRoZSBDb25zdGl0dXRpb24gYWxzbyByZXF1aXJlcyBwZXJpb2RpYyBhZGp1c3RtZW50cyB0byBtYWludGFpbiB0aGUgcHVyY2hhc2luZyBwb3dlciBvZiB0aGUgbWluaW11bSB3YWdlIChBcnRpY2xlIDcsIElWIG9mIHRoZSBGZWRlcmFsIENvbnN0aXR1dGlvbiBvZiBCcmF6aWwpLgoKRElFRVNFLCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBNaW5pbXVtIE5lY2Vzc2FyeSBXYWdlLCBhZGhlcmVzIHRvIHRoZXNlIGNvbnN0aXR1dGlvbmFsIHByb3Zpc2lvbnMuIFRoZXkgYmFzZSB0aGVpciBjYWxjdWxhdGlvbnMgb24gRGVjcmVlIExhdyBOby4gMzk5LCB3aGljaCBzdGlwdWxhdGVzIHRoYXQgdGhlIGNvc3Qgb2YgZm9vZCBmb3IgYW4gYWR1bHQgd29ya2VyIHNob3VsZCBub3QgYmUgbG93ZXIgdGhhbiB0aGUgZXhwZW5zZSBvZiB0aGUgQmFzaWMgRm9vZCBCYXNrZXQuCgpJbiB0aGVzZSBjYWxjdWxhdGlvbnMsIERJRUVTRSBjb25zaWRlcnMgYSBmYW1pbHkgbW9kZWwgY29uc2lzdGluZyBvZiB0d28gYWR1bHRzIGFuZCB0d28gY2hpbGRyZW4sIGFzc3VtaW5nIHRoYXQgdGhlIGNoaWxkcmVuJ3MgY29uc3VtcHRpb24gaXMgZXF1aXZhbGVudCB0byB0aGF0IG9mIGFuIGFkdWx0LgoKVGhlIG1ldGhvZCBmb3IgY2FsY3VsYXRpbmcgYSBmYW1pbHkncyBmb29kIGV4cGVuc2VzIGJlZ2lucyB3aXRoIHRoZSBjb3N0IG9mIHRoZSBtb3N0IGV4cGVuc2l2ZSBCYXNpYyBGb29kIEJhc2tldCBhbW9uZyB0aGUgMjcgQnJhemlsaWFuIGNhcGl0YWxzLCB3aGljaCBpcyB0aGVuIG11bHRpcGxpZWQgYnkgdGhyZWUuCgpbQERJRUVTRV0gY29uZHVjdGVkIHRoZSBGYW1pbHkgQnVkZ2V0IFN1cnZleSAoUE9GKSBpbiBTw6NvIFBhdWxvIGR1cmluZyB0aGUgcGVyaW9kIG9mIDk0Lzk1LiBUaGUgcmVzdWx0cyByZXZlYWxlZCB0aGF0IGZvb2QgYWNjb3VudGVkIGZvciAzNS43MSUgb2YgdGhlIGV4cGVuc2VzIG9mIGZhbWlsaWVzIGluIHRoZSBsb3dlc3QgaW5jb21lIGJyYWNrZXQuIEJ5IGNvbXBhcmluZyB0aGUgY29zdCBvZiBmb29kIGZvciBhIGZhbWlseSAodGhlIG1vc3QgZXhwZW5zaXZlIGJhc2tldCBtdWx0aXBsaWVkIGJ5IHRocmVlKSB3aXRoIHRoZSBwcm9wb3J0aW9uIG9mIHRoZXNlIGZhbWlsaWVzJyBidWRnZXQgYWxsb2NhdGVkIHRvIGZvb2QgKDM1LjcxJSksIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgYnVkZ2V0IHJlcXVpcmVkIHRvIGNvdmVyIG90aGVyIGV4cGVuc2VzIHN1Y2ggYXMgaG91c2luZywgY2xvdGhpbmcsIHRyYW5zcG9ydGF0aW9uLCBhbmQgbW9yZS4KClRoZXJlZm9yZSwgdGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nIHRoZSBNaW5pbXVtIFJlcXVpcmVkIFdhZ2UgY2FuIGJlIHN1bW1hcml6ZWQgYXMgZm9sbG93czoKJCRGLkYuQy4gPSAzKENDKSQkCgokJFxmcmFje0YuRi5DLn17WH0gPSBcZnJhY3swLjM1NzF9ezEuMDB9JCQKVXNpbmcgcnVsZSBvZiAzLCB3ZSBoYXZlOgokJEYuRi5DLiA9IFgoMC4zNTcxKSQkCnNvOgokJCBYID0gXGZyYWN7Ri5GLkMufXswLjM1NzF9ICQkCldoZXJlOgpGLkYuQy4gPSBGYW1pbHkgRm9vZCBDb3N0CmFuZCBDLkMuID0gQ29zdCBvZiB0aGUgaGlnaGVzdCB2YWx1ZSBGb29kIFBhcmNlbAoKVGhlIE5lY2Vzc2FyeSBNaW5pbXVtIFdhZ2UsIHdoaWNoIGlzIGNhbGN1bGF0ZWQgbW9udGhseSBhcyBhbiBhc3Nlc3NtZW50IG9mIHdoYXQgdGhlIGN1cnJlbnQgbWluaW11bSB3YWdlIHNob3VsZCBiZSwgYWxzbyBzZXJ2ZXMgYXMgYSB0b29sIHRoYXQgd29ya2VycycgdW5pb25zIHVzZSB0byBleHBvc2UgdGhlIHZpb2xhdGlvbiBvZiB0aGUgY29uc3RpdHV0aW9uYWwgcHJpbmNpcGxlIHRoYXQgZGVmaW5lcyB0aGUgcGFyYW1ldGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGxvd2VzdCBhbGxvd2FibGUgd2FnZS4gaW4gdGhlIGNvdW50cnkuCgpXZSBoYXZlIGJlbG93IHRoZSB2YWx1ZSBvZiB3aGF0IHdvdWxkIGJlIHRoZSBpZGVhbCBzYWxhcnkgb2YgdGhlIHdvcmtlciwgcHJvdmlkZWQgZm9yIGJ5IGxhdywgdG8gY292ZXIgYWxsIG1vbnRobHkgY29zdHMgb2YgaGlzIHJlc2lkZW5jZS4KCmBgYHtyIERJRUVTRSwgaW5jbHVkZT1GQUxTRX0KZGllZXNlXzIwMTlfdXMgPC0gcmVhZF9leGNlbCgiZGllZXNlXzIwMTlfdXMueGxzeCIpCgpgYGAKCmBgYHtyIERJRUVTRSB2aWV3LCBlY2hvPUZBTFNFfQprYWJsZShoZWFkKGRpZWVzZV8yMDE5X3VzLDEwKSkgJT4lCiAgICAga2FibGVfc3R5bGluZyhmb250X3NpemUgPSAxMiwgZnVsbF93aWR0aCA9IFQsIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIsICJib3JkZXJlZCIpKQpgYGAKClRocm91Z2ggdGhlc2UgZGF0YSwgd2UgY2FuIHNlZSB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgbWluaW11bSB2YWx1ZXMgYW5kIHRob3NlIG5lY2Vzc2FyeSBmb3IgdGhlIG1haW50ZW5hbmNlIG9mIHRoZSBob21lIGluIEJyYXppbC4gVGhlIGRlbWFuZCBmb3IgcG9saXRpY2FsIGFuZCBlY29ub21pYyByZWZvcm1zIGluIEJyYXppbCBpcyBub3QgcmVjZW50LiBTdGlsbCBpbiB0aGUgMTk3MHMsIHRoZSBncm91cCAiTGVnacOjbyBVcmJhbmEiIGFscmVhZHkgcmFpc2VkIHByb3Rlc3Qgd2l0aCB0aGUgc29uZyAiV2hhdCBjb3VudHJ5IGlzIHRoaXM/Ii4gSW4gdGhlIGZvbGxvd2luZyBkZWNhZGUsIHdlIGNhbiBzZWUgdGhlIHNpbmdlciBDYXp1emEgcHJvdGVzdGluZyB0aGUgc29uZyAiQnJhc2lsIiwgd2hpY2ggY2xlYXJseSB3b3VsZCBkZW5vdW5jZSB0aGUgbmF0aW9uJ3MgcG92ZXJ0eS4KClRoZSBwcmlzb24gcG9wdWxhdGlvbiBzYXlzIGEgbG90IGFib3V0IHRoZSBjb3VudHJ5LiBZb3VuZywgcG9vciwgbG93LWVkdWNhdGVkIGFuZCBkYXJrLXNraW5uZWQgcGVvcGxlIGFyZSBhdCB0aGUgdG9wIG9mIHRoZSBzdGF0aXN0aWNzLCB3aGljaCBzaWduYWxzIGFuIG9taXNzaW9uIG9uIHRoZSBwYXJ0IG9mIHRoZSBnb3Zlcm5tZW50LiBUaGUgUGVuYWwgQ29kZSwgaW4gaXRzIGFydGljbGUgMTM1LCBkZXNjcmliZXMgdGhlIGNyaW1lIG9mIG9taXNzaW9uIG9mIGhlbHAsIHdoaWNoIGNvbnNpc3RzIG9mIHRoZSBhdHRpdHVkZSBvZiBmYWlsaW5nIHRvIGhlbHAgcGVvcGxlIGluIGEgdnVsbmVyYWJsZSBzaXR1YXRpb24sIHN1Y2ggYXMgYWJhbmRvbmVkIG9yIGxvc3QgY2hpbGRyZW4sIGRpc2FibGVkIHBlb3BsZSwgd2l0aCBpbmp1cmllcywgb3IgaW4gYSBzaXR1YXRpb24gb2YgcmlzayBvciBkYW5nZXIuIEZvciB0aGF0IHJlYXNvbiwgdGhlIGdvdmVybm1lbnQgc2hvdWxkIGFsc28gYmUgYmVoaW5kIGJhcnMuCgoKCiMgQmlvZ3JhcGh5Cgo=