Required packages
install.packages('forecast')
library(forecast)
library(readr)
library(dplyr)
library(tidyr)
library(magrittr)
Executive Summary
Three datasets were used in this assignment, GDP Per Capita.csv, Health Expenditure.csv and Metadata_Country.csv.
The GDP Per Capita data contains data of 264 countries from 1960 to 2018. The Health Expenditure data contains data of 264 countries from 2000 to 2017 and the Metadata contain details of these countries. Initial pre-processing step was to select data from 2008 to 2017 and columns that contains meaningful information. There were many missing values across all three datasets so we have set a condition to include only those rows that contains a maximum of 3 NA values. In Metadata we have only selected data which is complete.
Two of the datasets were converted into a tidy format and then all three datasets were merged together. Datatypes of the merged dataset were checked and then converted to the correct datatypes. Data was scanned for missing values, special values and obvious errors. Missing values were excluded from the dataset as they represent less than 5 percent of the data and to avoid any distortion in the dataset. Outliers were scanned using Tukey’s method of outlier detection. Outliers were kept as they are valid outliers and they provide vital information.
A new column was introduced using Current Health Expenditure Per Capita and GDP Per Capita called ‘Health Expenditure as Percent of GDP’. Relationship between the two major variables ‘Current Health Expenditure Per Capita’ and ‘GDP Per Capita’ was explored using the scatter plot. The relationship was not clear so both of these variables underwent transformation and were plotted again. Finally, the new scatterplot produced a more linear relationship.
Data
Data is collected from The World Bank Open Data website. The aim of this project is to preprocess the data so that it can be used for further data analysis and modelling. We have used 3 datasets for this project, Current Health Expenditure Per Capita (current US Dollar), GDP Per Capita (current US Dollar) and Country Metadata.
The Current Health Expenditure Per Capita in current US dollars dataset contains estimates of current health expenditure including healthcare goods and services consumed during each year in 264 countries from 2000 to 2017. https://data.worldbank.org/indicator/SH.XPD.CHEX.PC.CD
The GDP Per Capita in current US dollars dataset contains sum of gross value added by all resident producers in the economy during each year in 264 countries from 1960 to 2018. https://data.worldbank.org/indicator/NY.GDP.PCAP.CD
The Metadata which came with both of these datasets gives details about the income group and region for each of these countries.
All 3 datasets are merged to do this assignment.
Current Health Expenditure Per Capita (current US$) dataset includes the following varaibles:
- Country Name: Names of the Countries
- Country Code: Three letter code representing each country
- Indicator Name: Indicator representing variable name (Current Health Expenditure Per Capita (current US$))
- Indicator Code: Internal code for indicator name
- 2000 - 2017: Year, columns containing Current Health Expenditure (current US$) data
GDP Per Capita (current US$) dataset includes the following varaibles:
- Country Name: Names of the Countries
- Country Code: Three letter code representing each country
- Indicator Name: Indicator representing varaible name (GDP Per Capita (current US$))
- Indicator Code: Internal code for indicator name
- 1960 - 2018: Year, columns containing GDP Per Capita (current US$) data
Metadata dataset includes the following variables:
- Country Code: Three letter code representing each country
- Region: Region of the world
- IncomeGroup: Income group to which the country belongs
- SpecialNotes: Notes regarding the data
- TableName: Countries names
healthexp <- read_csv('Health Expenditure.csv', skip = 4)
gdp <- read_csv('GDP Per Capita.csv', skip = 4)
metadata <- read_csv('Metadata_Country.csv')
Tidy & Manipulate Data I
For this assignment we have selected specific columns from each of the 3 datasets:
- ‘Current Health Expenditure Per Capita (current US dollars)’
- ‘GDP Per Capita (current US dollars)’
- ‘Metadata’
In ‘Current Health Expenditure Per Capita (Current US dollars)’ and ‘GDP Per Capita (Current US dollars)’ datasets we have selected the following columns: ‘Country Name’, ‘Country Code’ and year columns from 2008 to 2017.
In ‘Metadata’ dataset we have selected ‘Country Code’ and ‘IncomeGroup’ columns.
healthexp_sel <- healthexp[, c(1,2,53:62)]
head(healthexp_sel)
gdp_sel <- gdp[, c(1,2,53:62)]
head(gdp_sel)
metadata_sel <- metadata[, c(1,3)]
head(metadata_sel)
Through the visual scan we can see that there are many missing values present in all 3 of the datasets. To deal with these missing values in the ‘healthexp_sel’ and ‘gdp_sel’ datasets we have set a condition in which rows from both of the datasets will be filtered out according to the rows of the ‘healthexp_sel’ that contains a maximum of 3 NA values.
In ‘metadata_sel’ dataset there are many missing values. We have identified the location of these missing values using ‘which()’ and ‘!complete.cases()’ functions and then removed all these missing values from the ‘metadata_sel’ dataset.
As we can see below:
condition <- which(rowSums(is.na(healthexp_sel)) <= 3)
healthexp_new <- healthexp_sel[condition, ]
head(healthexp_new)
gdp_new <- gdp_sel[condition, ]
head(gdp_new)
na_vec <- which(!complete.cases(metadata_sel))
na_vec
[1] 6 35 48 60 61 62 63 64 67 72 73 94 97 101 102 103 104 106 126 132 133 134 137 138 140 151 154 159 168 179
[31] 181 189 195 196 202 213 215 216 228 229 234 236 238 239 247 257
metadata_tidy <- metadata_sel[-na_vec, ]
head(metadata_tidy)
Two of our datasets does not follow the tidy data principles. In ‘Current Health Expenditure Per Capita (current US dollars)’ and ‘GDP Per Capita (current US dollars)’ datasets column names are not names of the variables but values of a variable. To tidy our datasets we have applied the tidyr package ‘gather()’ function which will transform the datasets from the wide format to the long format.
To tidy ‘Current Heath Expenditure Per Capita (current US dollars)’ dataset we have used tidyr package ‘gather()’ function in which we have taken our ‘heathexp_new’ dataset, set key as ‘Year’, set value as ‘Current_Health_Expenditure_Per_Capita_in_USD’ and gather columns from 3 to 12 from the ‘heathexp_new’ dataset.
To tidy ‘GDP Per Capita (current US dollars)’ dataset we have used tidyr package ‘gather()’ function in which we have taken our ‘gdp_new’ dataset, set key as ‘Year’, set value as ‘GDP_Per_Capita_in_USD’ and gather columns from 3 to 12 from the ‘gdp_new’ dataset.
The ‘metadata_tidy’ dataset is in a tidy format as each variable has its own column, each observation has its own row and each value has its own cell.
3 Tidy datasets available are: healthexp_tidy, gdp_tidy and metadata_tidy
healthexp_tidy <- gather(healthexp_new, key = 'Year', value = 'Current_Health_Expenditure_Per_Capita_in_USD', c(3:12))
head(healthexp_tidy)
gdp_tidy <- gather(gdp_new, key = 'Year', value = 'GDP_Per_Capita_in_USD', c(3:12))
head(gdp_tidy)
head(metadata_tidy)
Data: Joining Datasets
To join the tidy datasets we have used the dplyr package. We have used dplyr package ‘Mutating Joins’ function as it allows to add new variables to one data frame from matching observations in another. In this assignment to join the datasets we have used Mutating Joins - ‘inner_join()’ function as all 3 of our datasets have got many observations and we only wanted to keep thoes observations in our joined dataset which are common in all three of the datasets.
First, we have have used ‘inner_join()’ function to join ‘heathexp_tidy’ and ‘gdp_tidy’ datasets by their common attributes which are ‘Country Name’, ‘Country Code’ and ‘Year’. Next, to join the ‘metadata_tidy’ data with the ‘joined_data’ we have used the ‘inner_join()’ function and used common attribute ‘Country Code’ to join both of these datasets. Our complete joined dataset is ‘joined_data_final’ which has 1850 observations and 6 columns.
joined_data <- inner_join(healthexp_tidy, gdp_tidy, by = c('Country Name', 'Country Code', 'Year'))
head(joined_data)
Final ‘joined_data_final’ dataset:
joined_data_final <- inner_join(joined_data, metadata_tidy, by = 'Country Code')
head(joined_data_final)
NA
Checking dimensions and missing values in the final ‘joined_data_final’ dataset:
dim(joined_data_final)
[1] 1850 6
sum(is.na(joined_data_final))
[1] 13
Understand
Dimensions of the data frame are checked using dim() function. The ‘joined_data_final’ data frame has got 1850 rows and 6 columns. Column names are checked using colnames() function.
Data types of the variables are checked using the class() function.
The data types of the variables are:
- Country Name variable is of character data type
- Country Code variable is of character data type
- Year variable is of character data type
- Current_Health_Expenditure_Per_Capita_in_USD variable is of numeric data type
- GDP_Per_Capita_in_USD variable is of numeric data type
- IncomeGroup variable is of character data type
Types of numeric variables are checked using typeof() function. All numeric variables are of numeric type ‘double’.
The structure of the ‘joined_data_final’ data frame is checked using str() function. Four variables are of character data type and two variables are of numeric data type. To bring consistency we have converted ‘Country Name’ and ‘IncomeGroup’ variables into upper case using toupper() function. We can see that the ‘Current_Health_Expenditure_Per_Capita_in_USD’ and ‘GDP_Per_Capita_in_USD’ variables have got the right data types since they both are of numeric data type. We have converted ‘Country Code’ variable into a factor data type using as.factor() function as there are only 185 unique country codes available in the dataset. We have converted ‘Year’ variable into a factor data type using factor() function and set 10 levels as there are only 10 unique years in the dataset. We have converted ‘Country Name’ variable into a factor data type using as.factor() function as there are only 185 countries names in the dataset. We have converted ‘IncomeGroup’ variable into a factor data type using factor() function and set 4 different levels and then ordered them.
We have checked the levels in the ‘IncomeGroup’ variable using the levels() function to check the ordered levels.
We have checked the structure of the updated ‘joined_data_final’ using str() function. We can see that the updated dataset has 1850 observations and 6 columns. Three variables are of factor data type, one variable is of ordered factor data type and two variables are of numeric data type.
dim(joined_data_final)
[1] 1850 6
colnames(joined_data_final)
[1] "Country Name" "Country Code"
[3] "Year" "Current_Health_Expenditure_Per_Capita_in_USD"
[5] "GDP_Per_Capita_in_USD" "IncomeGroup"
class(joined_data_final$`Country Name`)
[1] "character"
class(joined_data_final$`Country Code`)
[1] "character"
class(joined_data_final$Year)
[1] "character"
class(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD)
[1] "numeric"
class(joined_data_final$GDP_Per_Capita_in_USD)
[1] "numeric"
class(joined_data_final$IncomeGroup)
[1] "character"
typeof(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD)
[1] "double"
typeof(joined_data_final$GDP_Per_Capita_in_USD)
[1] "double"
str(joined_data_final)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1850 obs. of 6 variables:
$ Country Name : chr "Afghanistan" "Angola" "Andorra" "United Arab Emirates" ...
$ Country Code : chr "AFG" "AGO" "AND" "ARE" ...
$ Year : chr "2008" "2008" "2008" "2008" ...
$ Current_Health_Expenditure_Per_Capita_in_USD: num 38.7 135.2 4201.7 1340 694.7 ...
$ GDP_Per_Capita_in_USD : num 365 4081 47785 44499 9021 ...
$ IncomeGroup : chr "Low income" "Lower middle income" "High income" "High income" ...
joined_data_final$`Country Name` <- toupper(joined_data_final$`Country Name`)
joined_data_final$IncomeGroup <- toupper(joined_data_final$IncomeGroup)
joined_data_final$`Country Code` <- as.factor(joined_data_final$`Country Code`)
joined_data_final$Year <- factor(joined_data_final$Year, levels = c('2008', '2009', '2010', '2011', '2012', '2013', '2014', '2015', '2016', '2017'))
joined_data_final$`Country Name` <- as.factor(joined_data_final$`Country Name`)
joined_data_final$IncomeGroup <- factor(joined_data_final$IncomeGroup, levels = c('LOW INCOME', 'LOWER MIDDLE INCOME', 'UPPER MIDDLE INCOME', 'HIGH INCOME'), ordered = TRUE)
levels(joined_data_final$IncomeGroup)
[1] "LOW INCOME" "LOWER MIDDLE INCOME" "UPPER MIDDLE INCOME" "HIGH INCOME"
str(joined_data_final)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1850 obs. of 6 variables:
$ Country Name : Factor w/ 185 levels "AFGHANISTAN",..: 1 4 3 175 6 7 5 8 9 10 ...
$ Country Code : Factor w/ 185 levels "AFG","AGO","AND",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Year : Factor w/ 10 levels "2008","2009",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Current_Health_Expenditure_Per_Capita_in_USD: num 38.7 135.2 4201.7 1340 694.7 ...
$ GDP_Per_Capita_in_USD : num 365 4081 47785 44499 9021 ...
$ IncomeGroup : Ord.factor w/ 4 levels "LOW INCOME"<"LOWER MIDDLE INCOME"<..: 1 2 4 4 3 3 4 4 4 3 ...
Scan I
First we have checked the sum of missing values in the ‘joined_data_final’ data frame using sum(is.na()) function. There are 13 missing values in total. Next we have checked the missing values in each column of the ‘joined_data_final’ data frame using colSums(is.na()) function. We can see that there are missing values in the ‘Current_Health_Expenditure_Per_Capita_in_USD’ and ‘GDP_Per_Capita_in_USD’ columns.
Next we have checked the location of the missing values in these columns using which(is.na()) function.
Then we have checked each column of the ‘joined_data_final’ dataset for any special values and obvious errors using is.infinite() and is.nan() functions.
Next, we have excluded the missing values from our dataset as the amount of the missing data is very small relatively to the size of the dataset (< 5%) and only selected observations from the ‘joined_data_final’ dataset which are complete using complete.cases() function.
The reason for selecting only thoes observations which are complete is because our data is from the ‘World Bank Open Data Bank’ and we know that the data is accurate so replacing the missing values in the ‘Current_Health_Expenditure_Per_Capita_in_USD’ and ‘GDP_Per_Capita_in_USD’ variables with the mean/median or with some other constant value will only create distortion in the dataset and will create bias in our analysis. We have checked the structure of the updated ‘joined_data_final’ dataset using str() function. The updated ‘joined_data_final’ dataset has 1837 observations and 6 columns.
sum(is.na(joined_data_final))
[1] 13
colSums(is.na(joined_data_final))
Country Name Country Code
0 0
Year Current_Health_Expenditure_Per_Capita_in_USD
0 4
GDP_Per_Capita_in_USD IncomeGroup
9 0
which(is.na(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD))
[1] 185 370 1662 1847
which(is.na(joined_data_final$GDP_Per_Capita_in_USD))
[1] 792 977 1162 1347 1473 1532 1658 1717 1843
sum(is.infinite(joined_data_final$`Country Name`))
[1] 0
sum(is.infinite(joined_data_final$`Country Code`))
[1] 0
sum(is.infinite(joined_data_final$Year))
[1] 0
sum(is.infinite(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD))
[1] 0
sum(is.infinite(joined_data_final$GDP_Per_Capita_in_USD))
[1] 0
sum(is.infinite(joined_data_final$IncomeGroup))
[1] 0
sum(is.nan(joined_data_final$`Country Name`))
[1] 0
sum(is.nan(joined_data_final$`Country Code`))
[1] 0
sum(is.nan(joined_data_final$Year))
[1] 0
sum(is.nan(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD))
[1] 0
sum(is.nan(joined_data_final$GDP_Per_Capita_in_USD))
[1] 0
sum(is.nan(joined_data_final$IncomeGroup))
[1] 0
joined_data_final <- joined_data_final[complete.cases(joined_data_final), ]
str(joined_data_final)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1837 obs. of 6 variables:
$ Country Name : Factor w/ 185 levels "AFGHANISTAN",..: 1 4 3 175 6 7 5 8 9 10 ...
$ Country Code : Factor w/ 185 levels "AFG","AGO","AND",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Year : Factor w/ 10 levels "2008","2009",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Current_Health_Expenditure_Per_Capita_in_USD: num 38.7 135.2 4201.7 1340 694.7 ...
$ GDP_Per_Capita_in_USD : num 365 4081 47785 44499 9021 ...
$ IncomeGroup : Ord.factor w/ 4 levels "LOW INCOME"<"LOWER MIDDLE INCOME"<..: 1 2 4 4 3 3 4 4 4 3 ...
Tidy & Manipulate Data II
We have created a new variable ‘Health_Expenditure_as_percent_of_GDP’ in our dataset ‘joined_data_final’ using dplyr mutate() function. The new variable ‘Heath_Expenditure_as_percent_of_GDP’ is created by dividing ‘Current_Health_Expenditure_Per_Capita_in_USD’ by the ‘GDP_Per_Capita_in_USD’ and multiplying the result by 100 to get in percentage.
We have checked the structure of the updated ‘joined_data_final’ dataset using str() function.
We can see that the updated new ‘joined_data_final’ dataset has 1837 observations and 7 columns. Three of the variables are of factor data type, one variable has ordered factor data type and three variables are of numeric data type.
joined_data_final <- mutate(joined_data_final, Health_Expenditure_as_percent_of_GDP = (Current_Health_Expenditure_Per_Capita_in_USD / GDP_Per_Capita_in_USD)*100)
head(joined_data_final)
str(joined_data_final)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1837 obs. of 7 variables:
$ Country Name : Factor w/ 185 levels "AFGHANISTAN",..: 1 4 3 175 6 7 5 8 9 10 ...
$ Country Code : Factor w/ 185 levels "AFG","AGO","AND",..: 1 2 3 4 5 6 7 8 9 10 ...
$ Year : Factor w/ 10 levels "2008","2009",..: 1 1 1 1 1 1 1 1 1 1 ...
$ Current_Health_Expenditure_Per_Capita_in_USD: num 38.7 135.2 4201.7 1340 694.7 ...
$ GDP_Per_Capita_in_USD : num 365 4081 47785 44499 9021 ...
$ IncomeGroup : Ord.factor w/ 4 levels "LOW INCOME"<"LOWER MIDDLE INCOME"<..: 1 2 4 4 3 3 4 4 4 3 ...
$ Health_Expenditure_as_percent_of_GDP : num 10.61 3.31 8.79 3.01 7.7 ...
Scan II
We have scan all numeric variables for any outliers present in them using ‘Tukeys method of outlier detection’ as all numeric variables have got non-symmetric data distributions as we can see in the histogram below.
hist(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD, main = 'Distribution of Health Expenditure Per Capita in USD', xlab = 'Heath Expenditure Per Capita in USD')

hist(joined_data_final$GDP_Per_Capita_in_USD, main = 'Distribution of GDP Per Capita in USD', xlab = 'GDP Per Capita in USD')

In the box plot below we can see that there are many outliers present in both the ‘Current_Health_Expenditure_Per_Capita_in_USD’ and ‘GDP_Per_Capita_in_USD’ variables.
joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD %>% boxplot(main="Box Plot of Current Health Expenditure Per Capita in USD", ylab="Current Health Expenditure", col = "grey")

joined_data_final$GDP_Per_Capita_in_USD %>% boxplot(main="Box Plot of GDP Per Capita in USD", ylab="GDP Per Capita", col = "grey")

To investigate these outliers we have created an upper outlier fence for both the ‘Current_Health_Expenditure_Per_Capita_in_USD’ and ‘GDP_Per_Capita_in_USD’ variables.
First, getting the Descriptive Statistics for Current Health Expenditure Per Capita in USD and GDP Per Capita in USD:
summary(joined_data_final$GDP_Per_Capita_in_USD)
Min. 1st Qu. Median Mean 3rd Qu. Max.
198.3 1655.8 5394.6 14446.7 16309.1 189170.9
summary(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD)
Min. 1st Qu. Median Mean 3rd Qu. Max.
10.97 81.20 326.91 1050.72 1006.94 10246.14
IQR(joined_data_final$GDP_Per_Capita_in_USD)
[1] 14653.27
IQR(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD)
[1] 925.7405
Upper Outlier Fence for Current Health Expenditure Per Capita in USD:
1006.94 + (1.5*925.7405)
[1] 2395.551
Upper Outlier Fence for GDP Per Capita in USD:
16309.1 + (1.5*14653.27)
[1] 38289
From the upper outlier fence of ‘Current_Health_Expenditure_Per_Capita_in_USD’ we can see that the outliers starts after current health expenditure per capita of 2395.551 in US dollars. To investigate these outliers we have used dplyr package ‘filter()’ function to check all thoes countries which have current health expenditure per capita greater then the upper outlier fence. We can see that all the outliers in the ‘Current_Health_Expenditure_Per_Capita_in_USD’ variable belongs to the HIGH INCOME ‘IncomeGroup’ countries from 2008 - 2017.
outlier_healthexp <- joined_data_final %>% filter(Current_Health_Expenditure_Per_Capita_in_USD > 2395.551)
outlier_healthexp
From the upper outlier fence of ‘GDP_Per_Capita_in_USD’ we can see that the outliers starts after gdp per capita of 38289 in US dollars. To investigate these outliers we have used dplyr package ‘filter()’ function to check all thoes countries which have gdp per capita greater then the upper outlier fence. We can see that all the outliers in the ‘GDP_Per_Capita_in_USD’ variable belongs to the HIGH INCOME ‘IncomeGroup’ countries from 2008 - 2017.
outlier_gdp <- joined_data_final %>% filter(GDP_Per_Capita_in_USD > 38289)
outlier_gdp
Further we have investigated these outliers using bivariate visualisation method - scatter plot in which we have seen the relationship between the current health expenditure per capita with the gdp per capita in USD.
plot(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD ~ joined_data_final$GDP_Per_Capita_in_USD, xlab = 'GDP Per Capita in USD', ylab = 'Health Expenditure in USD', main = 'Health Expenditure by GDP')

From the scatter plot we can see that there is a non-linear relationship between these two variables and there are some outliers present on the upper left side of the plot and on the right side of the plot. To investigate these outliers we have checked the location of these outliers using which.max() function as among these outliers is also the maximum value of the gdp per capita. Using the location of the maximum value of the gdp per capita we have located the country in the ‘joined_data_final’ to which it belongs.
# Max GDP Per Capita
joined_data_final[which.max(joined_data_final$GDP_Per_Capita_in_USD), ]
From our investigation we have discovered that ‘MONACO’ has got the highest gdp per capita in 2014 with the gdp per capita of 189170.9 US dollars and with current health expenditure per capita of 3863.573 US dollars. The health expenditure per capita as percent of gdp per capita is just 2.042372 percent.This indicates that although ‘MONACO’ has got a high gdp per capita however due to the health lifestyle and good public healthcare system in ‘MONACO’ the current health expenditure per capita is very small compared to the gdp per capita. It is due to this that in the scatter plot we can see that ’MONACO" is considered as an outlier.
There are also outliers in the upper left side of the scatter plot. To investigate these outliers we have checked the location of these outliers using which.max() function as among these outliers is also the maximum value of the current health expenditure per capita. Using the location of the maximum value of the current health expenditure per capita we have located the country in the ‘joined_data_final’ to which it belongs.
# Max Health Exp Per Capita
joined_data_final[which.max(joined_data_final$Current_Health_Expenditure_Per_Capita_in_USD), ]
From our investigation we have discovered that ‘UNITED STATES’ has got the highest current health expenditure per capita in 2017 with the current health expenditure per capita of 10246.14 US dollars and with gdp per capita of 59957.73 US dollars. The health expenditure as percent of gdp is 17.08894 percent. This indicates that although ‘UNITED STATES’ gdp per capita is not very high however due to the private health care system in ‘UNITED STATES’ the current health expenditure per capita is very large compared to the gdp per capita. It is due to this that in the scatter plot we can see that ‘UNITED STATES’ is considered as an outlier.
LS0tDQp0aXRsZTogIk1BVEgyMzQ5IFNlbWVzdGVyIDEsIDIwMjAiDQphdXRob3I6ICJGYWhhZCBKYW1zaGVkIHMzODM1NTk4Ig0Kc3VidGl0bGU6IEFzc2lnbm1lbnQgMg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQotLS0NCg0KDQojIyBSZXF1aXJlZCBwYWNrYWdlcyANCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCdmb3JlY2FzdCcpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShtYWdyaXR0cikNCmBgYA0KDQoNCiMjIEV4ZWN1dGl2ZSBTdW1tYXJ5IA0KDQpUaHJlZSBkYXRhc2V0cyB3ZXJlIHVzZWQgaW4gdGhpcyBhc3NpZ25tZW50LCBHRFAgUGVyIENhcGl0YS5jc3YsIEhlYWx0aCBFeHBlbmRpdHVyZS5jc3YgYW5kIE1ldGFkYXRhX0NvdW50cnkuY3N2Lg0KDQpUaGUgR0RQIFBlciBDYXBpdGEgZGF0YSBjb250YWlucyBkYXRhIG9mIDI2NCBjb3VudHJpZXMgZnJvbSAxOTYwIHRvIDIwMTguIFRoZSBIZWFsdGggRXhwZW5kaXR1cmUgZGF0YSBjb250YWlucyBkYXRhIG9mIDI2NCBjb3VudHJpZXMgZnJvbSAyMDAwIHRvIDIwMTcgYW5kIHRoZSBNZXRhZGF0YSBjb250YWluIGRldGFpbHMgb2YgdGhlc2UgY291bnRyaWVzLiBJbml0aWFsIHByZS1wcm9jZXNzaW5nIHN0ZXAgd2FzIHRvIHNlbGVjdCBkYXRhIGZyb20gMjAwOCB0byAyMDE3IGFuZCBjb2x1bW5zIHRoYXQgY29udGFpbnMgbWVhbmluZ2Z1bCBpbmZvcm1hdGlvbi4gVGhlcmUgd2VyZSBtYW55IG1pc3NpbmcgdmFsdWVzIGFjcm9zcyBhbGwgdGhyZWUgZGF0YXNldHMgc28gd2UgaGF2ZSBzZXQgYSBjb25kaXRpb24gdG8gaW5jbHVkZSBvbmx5IHRob3NlIHJvd3MgdGhhdCBjb250YWlucyBhIG1heGltdW0gb2YgMyBOQSB2YWx1ZXMuIEluIE1ldGFkYXRhIHdlIGhhdmUgb25seSBzZWxlY3RlZCBkYXRhIHdoaWNoIGlzIGNvbXBsZXRlLg0KDQpUd28gb2YgdGhlIGRhdGFzZXRzIHdlcmUgY29udmVydGVkIGludG8gYSB0aWR5IGZvcm1hdCBhbmQgdGhlbiBhbGwgdGhyZWUgZGF0YXNldHMgd2VyZSBtZXJnZWQgdG9nZXRoZXIuIERhdGF0eXBlcyBvZiB0aGUgbWVyZ2VkIGRhdGFzZXQgd2VyZSBjaGVja2VkIGFuZCB0aGVuIGNvbnZlcnRlZCB0byB0aGUgY29ycmVjdCBkYXRhdHlwZXMuIERhdGEgd2FzIHNjYW5uZWQgZm9yIG1pc3NpbmcgdmFsdWVzLCBzcGVjaWFsIHZhbHVlcyBhbmQgb2J2aW91cyBlcnJvcnMuIE1pc3NpbmcgdmFsdWVzIHdlcmUgZXhjbHVkZWQgZnJvbSB0aGUgZGF0YXNldCBhcyB0aGV5IHJlcHJlc2VudCBsZXNzIHRoYW4gNSBwZXJjZW50IG9mIHRoZSBkYXRhIGFuZCB0byBhdm9pZCBhbnkgZGlzdG9ydGlvbiBpbiB0aGUgZGF0YXNldC4gT3V0bGllcnMgd2VyZSBzY2FubmVkIHVzaW5nIFR1a2V54oCZcyBtZXRob2Qgb2Ygb3V0bGllciBkZXRlY3Rpb24uIE91dGxpZXJzIHdlcmUga2VwdCBhcyB0aGV5IGFyZSB2YWxpZCBvdXRsaWVycyBhbmQgdGhleSBwcm92aWRlIHZpdGFsIGluZm9ybWF0aW9uLg0KDQpBIG5ldyBjb2x1bW4gd2FzIGludHJvZHVjZWQgdXNpbmcgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSBhbmQgR0RQIFBlciBDYXBpdGEgY2FsbGVkIOKAmEhlYWx0aCBFeHBlbmRpdHVyZSBhcyBQZXJjZW50IG9mIEdEUOKAmS4gUmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHR3byBtYWpvciB2YXJpYWJsZXMg4oCYQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YeKAmSBhbmQg4oCYR0RQIFBlciBDYXBpdGHigJkgd2FzIGV4cGxvcmVkIHVzaW5nIHRoZSBzY2F0dGVyIHBsb3QuIFRoZSByZWxhdGlvbnNoaXAgd2FzIG5vdCBjbGVhciBzbyBib3RoIG9mIHRoZXNlIHZhcmlhYmxlcyB1bmRlcndlbnQgdHJhbnNmb3JtYXRpb24gYW5kIHdlcmUgcGxvdHRlZCBhZ2Fpbi4NCkZpbmFsbHksIHRoZSBuZXcgc2NhdHRlcnBsb3QgcHJvZHVjZWQgYSBtb3JlIGxpbmVhciByZWxhdGlvbnNoaXAuICANCg0KIyMgRGF0YSANCg0KRGF0YSBpcyBjb2xsZWN0ZWQgZnJvbSBUaGUgV29ybGQgQmFuayBPcGVuIERhdGEgd2Vic2l0ZS4gVGhlIGFpbSBvZiB0aGlzIHByb2plY3QgaXMgdG8gcHJlcHJvY2VzcyB0aGUgZGF0YSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGZvciBmdXJ0aGVyIGRhdGEgYW5hbHlzaXMgYW5kIG1vZGVsbGluZy4gV2UgaGF2ZSB1c2VkIDMgZGF0YXNldHMgZm9yIHRoaXMgcHJvamVjdCwgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSAoY3VycmVudCBVUyBEb2xsYXIpLCBHRFAgUGVyIENhcGl0YSAoY3VycmVudCBVUyBEb2xsYXIpIGFuZCBDb3VudHJ5IE1ldGFkYXRhLiANCg0KVGhlIEN1cnJlbnQgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgaW4gY3VycmVudCBVUyBkb2xsYXJzIGRhdGFzZXQgY29udGFpbnMgZXN0aW1hdGVzIG9mIGN1cnJlbnQgaGVhbHRoIGV4cGVuZGl0dXJlIGluY2x1ZGluZyBoZWFsdGhjYXJlIGdvb2RzIGFuZCBzZXJ2aWNlcyBjb25zdW1lZCBkdXJpbmcgZWFjaCB5ZWFyIGluIDI2NCBjb3VudHJpZXMgZnJvbSAyMDAwIHRvIDIwMTcuDQpodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guWFBELkNIRVguUEMuQ0QNCg0KVGhlIEdEUCBQZXIgQ2FwaXRhIGluIGN1cnJlbnQgVVMgZG9sbGFycyBkYXRhc2V0IGNvbnRhaW5zIHN1bSBvZiBncm9zcyB2YWx1ZSBhZGRlZCBieSBhbGwgcmVzaWRlbnQgcHJvZHVjZXJzIGluIHRoZSBlY29ub215IGR1cmluZyBlYWNoIHllYXIgaW4gMjY0IGNvdW50cmllcyBmcm9tIDE5NjAgdG8gMjAxOC4NCmh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9OWS5HRFAuUENBUC5DRA0KDQpUaGUgTWV0YWRhdGEgd2hpY2ggY2FtZSB3aXRoIGJvdGggb2YgdGhlc2UgZGF0YXNldHMgZ2l2ZXMgZGV0YWlscyBhYm91dCB0aGUgaW5jb21lIGdyb3VwIGFuZCByZWdpb24gZm9yIGVhY2ggb2YgdGhlc2UgY291bnRyaWVzLg0KDQpBbGwgMyBkYXRhc2V0cyBhcmUgbWVyZ2VkIHRvIGRvIHRoaXMgYXNzaWdubWVudC4NCg0KQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSAoY3VycmVudCBVUyQpIGRhdGFzZXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB2YXJhaWJsZXM6DQoNCjEuIENvdW50cnkgTmFtZTogTmFtZXMgb2YgdGhlIENvdW50cmllcw0KMi4gQ291bnRyeSBDb2RlOiBUaHJlZSBsZXR0ZXIgY29kZSByZXByZXNlbnRpbmcgZWFjaCBjb3VudHJ5DQozLiBJbmRpY2F0b3IgTmFtZTogSW5kaWNhdG9yIHJlcHJlc2VudGluZyB2YXJpYWJsZSBuYW1lIChDdXJyZW50IEhlYWx0aCBFeHBlbmRpdHVyZSBQZXIgQ2FwaXRhIChjdXJyZW50IFVTJCkpDQo0LiBJbmRpY2F0b3IgQ29kZTogSW50ZXJuYWwgY29kZSBmb3IgaW5kaWNhdG9yIG5hbWUNCjUuIDIwMDAgLSAyMDE3OiBZZWFyLCBjb2x1bW5zIGNvbnRhaW5pbmcgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgKGN1cnJlbnQgVVMkKSBkYXRhDQoNCkdEUCBQZXIgQ2FwaXRhIChjdXJyZW50IFVTJCkgZGF0YXNldCBpbmNsdWRlcyB0aGUgZm9sbG93aW5nIHZhcmFpYmxlczoNCg0KMS4gQ291bnRyeSBOYW1lOiBOYW1lcyBvZiB0aGUgQ291bnRyaWVzDQoyLiBDb3VudHJ5IENvZGU6IFRocmVlIGxldHRlciBjb2RlIHJlcHJlc2VudGluZyBlYWNoIGNvdW50cnkNCjMuIEluZGljYXRvciBOYW1lOiBJbmRpY2F0b3IgcmVwcmVzZW50aW5nIHZhcmFpYmxlIG5hbWUgKEdEUCBQZXIgQ2FwaXRhIChjdXJyZW50IFVTJCkpDQo0LiBJbmRpY2F0b3IgQ29kZTogSW50ZXJuYWwgY29kZSBmb3IgaW5kaWNhdG9yIG5hbWUNCjUuIDE5NjAgLSAyMDE4OiBZZWFyLCBjb2x1bW5zIGNvbnRhaW5pbmcgR0RQIFBlciBDYXBpdGEgKGN1cnJlbnQgVVMkKSBkYXRhDQoNCk1ldGFkYXRhIGRhdGFzZXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6DQoNCjEuIENvdW50cnkgQ29kZTogVGhyZWUgbGV0dGVyIGNvZGUgcmVwcmVzZW50aW5nIGVhY2ggY291bnRyeQ0KMi4gUmVnaW9uOiBSZWdpb24gb2YgdGhlIHdvcmxkIA0KMy4gSW5jb21lR3JvdXA6IEluY29tZSBncm91cCB0byB3aGljaCB0aGUgY291bnRyeSBiZWxvbmdzDQo0LiBTcGVjaWFsTm90ZXM6IE5vdGVzIHJlZ2FyZGluZyB0aGUgZGF0YQ0KNS4gVGFibGVOYW1lOiBDb3VudHJpZXMgbmFtZXMNCg0KYGBge3J9DQpoZWFsdGhleHAgPC0gcmVhZF9jc3YoJ0hlYWx0aCBFeHBlbmRpdHVyZS5jc3YnLCBza2lwID0gNCkNCmdkcCA8LSByZWFkX2NzdignR0RQIFBlciBDYXBpdGEuY3N2Jywgc2tpcCA9IDQpDQptZXRhZGF0YSA8LSByZWFkX2NzdignTWV0YWRhdGFfQ291bnRyeS5jc3YnKQ0KDQpgYGANCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJIA0KDQpGb3IgdGhpcyBhc3NpZ25tZW50IHdlIGhhdmUgc2VsZWN0ZWQgc3BlY2lmaWMgY29sdW1ucyBmcm9tIGVhY2ggb2YgdGhlIDMgZGF0YXNldHM6DQoNCjEuICdDdXJyZW50IEhlYWx0aCBFeHBlbmRpdHVyZSBQZXIgQ2FwaXRhIChjdXJyZW50IFVTIGRvbGxhcnMpJyANCjIuICdHRFAgUGVyIENhcGl0YSAoY3VycmVudCBVUyBkb2xsYXJzKScNCjMuICdNZXRhZGF0YScNCg0KSW4gJ0N1cnJlbnQgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgKEN1cnJlbnQgVVMgZG9sbGFycyknIGFuZCAnR0RQIFBlciBDYXBpdGEgKEN1cnJlbnQgVVMgZG9sbGFycyknIGRhdGFzZXRzIHdlIGhhdmUgc2VsZWN0ZWQgdGhlIGZvbGxvd2luZyBjb2x1bW5zOiAnQ291bnRyeSBOYW1lJywgJ0NvdW50cnkgQ29kZScgYW5kIHllYXIgY29sdW1ucyBmcm9tIDIwMDggdG8gMjAxNy4NCg0KSW4gJ01ldGFkYXRhJyBkYXRhc2V0IHdlIGhhdmUgc2VsZWN0ZWQgJ0NvdW50cnkgQ29kZScgYW5kICdJbmNvbWVHcm91cCcgY29sdW1ucy4NCg0KYGBge3J9DQpoZWFsdGhleHBfc2VsIDwtIGhlYWx0aGV4cFssIGMoMSwyLDUzOjYyKV0NCmhlYWQoaGVhbHRoZXhwX3NlbCkNCmBgYA0KDQpgYGB7cn0NCmdkcF9zZWwgPC0gZ2RwWywgYygxLDIsNTM6NjIpXQ0KaGVhZChnZHBfc2VsKQ0KYGBgDQoNCmBgYHtyfQ0KbWV0YWRhdGFfc2VsIDwtIG1ldGFkYXRhWywgYygxLDMpXQ0KaGVhZChtZXRhZGF0YV9zZWwpDQpgYGANClRocm91Z2ggdGhlIHZpc3VhbCBzY2FuIHdlIGNhbiBzZWUgdGhhdCB0aGVyZSBhcmUgbWFueSBtaXNzaW5nIHZhbHVlcyBwcmVzZW50IGluIGFsbCAzIG9mIHRoZSBkYXRhc2V0cy4gVG8gZGVhbCB3aXRoIHRoZXNlIG1pc3NpbmcgdmFsdWVzIGluIHRoZSAnaGVhbHRoZXhwX3NlbCcgYW5kICdnZHBfc2VsJyBkYXRhc2V0cyB3ZSBoYXZlIHNldCBhIGNvbmRpdGlvbiBpbiB3aGljaCByb3dzIGZyb20gYm90aCBvZiB0aGUgZGF0YXNldHMgd2lsbCBiZSBmaWx0ZXJlZCBvdXQgYWNjb3JkaW5nIHRvIHRoZSByb3dzIG9mIHRoZSAnaGVhbHRoZXhwX3NlbCcgdGhhdCBjb250YWlucyBhIG1heGltdW0gb2YgMyBOQSB2YWx1ZXMuDQoNCkluICdtZXRhZGF0YV9zZWwnIGRhdGFzZXQgdGhlcmUgYXJlIG1hbnkgbWlzc2luZyB2YWx1ZXMuIFdlIGhhdmUgaWRlbnRpZmllZCB0aGUgbG9jYXRpb24gb2YgdGhlc2UgbWlzc2luZyB2YWx1ZXMgdXNpbmcgJ3doaWNoKCknIGFuZCAnIWNvbXBsZXRlLmNhc2VzKCknIGZ1bmN0aW9ucyBhbmQgdGhlbiByZW1vdmVkIGFsbCB0aGVzZSBtaXNzaW5nIHZhbHVlcyBmcm9tIHRoZSAnbWV0YWRhdGFfc2VsJyBkYXRhc2V0Lg0KDQpBcyB3ZSBjYW4gc2VlIGJlbG93Og0KDQpgYGB7cn0NCmNvbmRpdGlvbiA8LSB3aGljaChyb3dTdW1zKGlzLm5hKGhlYWx0aGV4cF9zZWwpKSA8PSAzKQ0KaGVhbHRoZXhwX25ldyA8LSBoZWFsdGhleHBfc2VsW2NvbmRpdGlvbiwgXQ0KaGVhZChoZWFsdGhleHBfbmV3KQ0KYGBgDQoNCmBgYHtyfQ0KZ2RwX25ldyA8LSBnZHBfc2VsW2NvbmRpdGlvbiwgXQ0KaGVhZChnZHBfbmV3KQ0KYGBgDQoNCmBgYHtyfQ0KbmFfdmVjIDwtIHdoaWNoKCFjb21wbGV0ZS5jYXNlcyhtZXRhZGF0YV9zZWwpKQ0KbmFfdmVjDQptZXRhZGF0YV90aWR5IDwtIG1ldGFkYXRhX3NlbFstbmFfdmVjLCBdDQpoZWFkKG1ldGFkYXRhX3RpZHkpDQpgYGANCg0KVHdvIG9mIG91ciBkYXRhc2V0cyBkb2VzIG5vdCBmb2xsb3cgdGhlIHRpZHkgZGF0YSBwcmluY2lwbGVzLiBJbiAnQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSAoY3VycmVudCBVUyBkb2xsYXJzKScgYW5kICdHRFAgUGVyIENhcGl0YSAoY3VycmVudCBVUyBkb2xsYXJzKScgZGF0YXNldHMgY29sdW1uIG5hbWVzIGFyZSBub3QgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBidXQgdmFsdWVzIG9mIGEgdmFyaWFibGUuIFRvIHRpZHkgb3VyIGRhdGFzZXRzIHdlIGhhdmUgYXBwbGllZCB0aGUgdGlkeXIgcGFja2FnZSAnZ2F0aGVyKCknIGZ1bmN0aW9uIHdoaWNoIHdpbGwgdHJhbnNmb3JtIHRoZSBkYXRhc2V0cyBmcm9tIHRoZSB3aWRlIGZvcm1hdCB0byB0aGUgbG9uZyBmb3JtYXQuIA0KDQpUbyB0aWR5ICdDdXJyZW50IEhlYXRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgKGN1cnJlbnQgVVMgZG9sbGFycyknIGRhdGFzZXQgd2UgaGF2ZSB1c2VkIHRpZHlyIHBhY2thZ2UgJ2dhdGhlcigpJyBmdW5jdGlvbiBpbiB3aGljaCB3ZSBoYXZlIHRha2VuIG91ciAnaGVhdGhleHBfbmV3JyBkYXRhc2V0LCBzZXQga2V5IGFzICdZZWFyJywgc2V0IHZhbHVlIGFzICdDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCcgYW5kIGdhdGhlciBjb2x1bW5zIGZyb20gMyB0byAxMiBmcm9tIHRoZSAnaGVhdGhleHBfbmV3JyBkYXRhc2V0Lg0KDQpUbyB0aWR5ICdHRFAgUGVyIENhcGl0YSAoY3VycmVudCBVUyBkb2xsYXJzKScgZGF0YXNldCB3ZSBoYXZlIHVzZWQgdGlkeXIgcGFja2FnZSAnZ2F0aGVyKCknIGZ1bmN0aW9uIGluIHdoaWNoIHdlIGhhdmUgdGFrZW4gb3VyICdnZHBfbmV3JyBkYXRhc2V0LCBzZXQga2V5IGFzICdZZWFyJywgc2V0IHZhbHVlIGFzICdHRFBfUGVyX0NhcGl0YV9pbl9VU0QnIGFuZCBnYXRoZXIgY29sdW1ucyBmcm9tIDMgdG8gMTIgZnJvbSB0aGUgJ2dkcF9uZXcnIGRhdGFzZXQuDQoNClRoZSAnbWV0YWRhdGFfdGlkeScgZGF0YXNldCBpcyBpbiBhIHRpZHkgZm9ybWF0IGFzIGVhY2ggdmFyaWFibGUgaGFzIGl0cyBvd24gY29sdW1uLCBlYWNoIG9ic2VydmF0aW9uIGhhcyBpdHMgb3duIHJvdyBhbmQgZWFjaCB2YWx1ZSBoYXMgaXRzIG93biBjZWxsLg0KDQozIFRpZHkgZGF0YXNldHMgYXZhaWxhYmxlIGFyZTogaGVhbHRoZXhwX3RpZHksIGdkcF90aWR5IGFuZCBtZXRhZGF0YV90aWR5DQpgYGB7cn0NCmhlYWx0aGV4cF90aWR5IDwtIGdhdGhlcihoZWFsdGhleHBfbmV3LCBrZXkgPSAnWWVhcicsIHZhbHVlID0gJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJywgYygzOjEyKSkNCmhlYWQoaGVhbHRoZXhwX3RpZHkpDQpgYGANCmBgYHtyfQ0KZ2RwX3RpZHkgPC0gZ2F0aGVyKGdkcF9uZXcsIGtleSA9ICdZZWFyJywgdmFsdWUgPSAnR0RQX1Blcl9DYXBpdGFfaW5fVVNEJywgYygzOjEyKSkNCmhlYWQoZ2RwX3RpZHkpDQpgYGANCmBgYHtyfQ0KaGVhZChtZXRhZGF0YV90aWR5KQ0KYGBgDQoNCiMjCURhdGE6IEpvaW5pbmcgRGF0YXNldHMNCg0KVG8gam9pbiB0aGUgdGlkeSBkYXRhc2V0cyB3ZSBoYXZlIHVzZWQgdGhlIGRwbHlyIHBhY2thZ2UuIFdlIGhhdmUgdXNlZCBkcGx5ciBwYWNrYWdlICdNdXRhdGluZyBKb2lucycgZnVuY3Rpb24gYXMgaXQgYWxsb3dzIHRvIGFkZCBuZXcgdmFyaWFibGVzIHRvIG9uZSBkYXRhIGZyYW1lIGZyb20gbWF0Y2hpbmcgb2JzZXJ2YXRpb25zIGluIGFub3RoZXIuIEluIHRoaXMgYXNzaWdubWVudCB0byBqb2luIHRoZSBkYXRhc2V0cyB3ZSBoYXZlIHVzZWQgTXV0YXRpbmcgSm9pbnMgLSAnaW5uZXJfam9pbigpJyBmdW5jdGlvbiBhcyBhbGwgMyBvZiBvdXIgZGF0YXNldHMgaGF2ZSBnb3QgbWFueSBvYnNlcnZhdGlvbnMgYW5kIHdlIG9ubHkgd2FudGVkIHRvIGtlZXAgdGhvZXMgb2JzZXJ2YXRpb25zIGluIG91ciBqb2luZWQgZGF0YXNldCB3aGljaCBhcmUgY29tbW9uIGluIGFsbCB0aHJlZSBvZiB0aGUgZGF0YXNldHMuDQoNCkZpcnN0LCB3ZSBoYXZlIGhhdmUgdXNlZCAnaW5uZXJfam9pbigpJyBmdW5jdGlvbiB0byBqb2luICdoZWF0aGV4cF90aWR5JyBhbmQgJ2dkcF90aWR5JyBkYXRhc2V0cyBieSB0aGVpciBjb21tb24gYXR0cmlidXRlcyB3aGljaCBhcmUgJ0NvdW50cnkgTmFtZScsICdDb3VudHJ5IENvZGUnIGFuZCAnWWVhcicuIE5leHQsIHRvIGpvaW4gdGhlICdtZXRhZGF0YV90aWR5JyBkYXRhIHdpdGggdGhlICdqb2luZWRfZGF0YScgd2UgaGF2ZSB1c2VkIHRoZSAnaW5uZXJfam9pbigpJyBmdW5jdGlvbiBhbmQgdXNlZCBjb21tb24gYXR0cmlidXRlICdDb3VudHJ5IENvZGUnIHRvIGpvaW4gYm90aCBvZiB0aGVzZSBkYXRhc2V0cy4gT3VyIGNvbXBsZXRlIGpvaW5lZCBkYXRhc2V0IGlzICdqb2luZWRfZGF0YV9maW5hbCcgd2hpY2ggaGFzIDE4NTAgb2JzZXJ2YXRpb25zIGFuZCA2IGNvbHVtbnMuDQpgYGB7cn0NCmpvaW5lZF9kYXRhIDwtIGlubmVyX2pvaW4oaGVhbHRoZXhwX3RpZHksIGdkcF90aWR5LCBieSA9IGMoJ0NvdW50cnkgTmFtZScsICdDb3VudHJ5IENvZGUnLCAnWWVhcicpKQ0KaGVhZChqb2luZWRfZGF0YSkNCmBgYA0KDQpGaW5hbCAnam9pbmVkX2RhdGFfZmluYWwnIGRhdGFzZXQ6IA0KYGBge3J9DQpqb2luZWRfZGF0YV9maW5hbCA8LSBpbm5lcl9qb2luKGpvaW5lZF9kYXRhLCBtZXRhZGF0YV90aWR5LCBieSA9ICdDb3VudHJ5IENvZGUnKQ0KaGVhZChqb2luZWRfZGF0YV9maW5hbCkNCg0KYGBgDQpDaGVja2luZyBkaW1lbnNpb25zIGFuZCBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgZmluYWwgJ2pvaW5lZF9kYXRhX2ZpbmFsJyBkYXRhc2V0Og0KYGBge3J9DQpkaW0oam9pbmVkX2RhdGFfZmluYWwpDQpzdW0oaXMubmEoam9pbmVkX2RhdGFfZmluYWwpKQ0KYGBgDQoNCiMjIFVuZGVyc3RhbmQgDQoNCkRpbWVuc2lvbnMgb2YgdGhlIGRhdGEgZnJhbWUgYXJlIGNoZWNrZWQgdXNpbmcgZGltKCkgZnVuY3Rpb24uIFRoZSAnam9pbmVkX2RhdGFfZmluYWwnIGRhdGEgZnJhbWUgaGFzIGdvdCAxODUwIHJvd3MgYW5kIDYgY29sdW1ucy4gDQpDb2x1bW4gbmFtZXMgYXJlIGNoZWNrZWQgdXNpbmcgY29sbmFtZXMoKSBmdW5jdGlvbi4NCg0KRGF0YSB0eXBlcyBvZiB0aGUgdmFyaWFibGVzIGFyZSBjaGVja2VkIHVzaW5nIHRoZSBjbGFzcygpIGZ1bmN0aW9uLiANCg0KVGhlIGRhdGEgdHlwZXMgb2YgdGhlIHZhcmlhYmxlcyBhcmU6DQoNCjEuIENvdW50cnkgTmFtZSB2YXJpYWJsZSBpcyBvZiBjaGFyYWN0ZXIgZGF0YSB0eXBlIA0KMi4gQ291bnRyeSBDb2RlIHZhcmlhYmxlIGlzIG9mIGNoYXJhY3RlciBkYXRhIHR5cGUgDQozLiBZZWFyIHZhcmlhYmxlIGlzIG9mIGNoYXJhY3RlciBkYXRhIHR5cGUgDQo0LiBDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCB2YXJpYWJsZSBpcyBvZiBudW1lcmljIGRhdGEgdHlwZSANCjUuIEdEUF9QZXJfQ2FwaXRhX2luX1VTRCB2YXJpYWJsZSBpcyBvZiBudW1lcmljIGRhdGEgdHlwZSANCjYuIEluY29tZUdyb3VwIHZhcmlhYmxlIGlzIG9mIGNoYXJhY3RlciBkYXRhIHR5cGUgDQoNClR5cGVzIG9mIG51bWVyaWMgdmFyaWFibGVzIGFyZSBjaGVja2VkIHVzaW5nIHR5cGVvZigpIGZ1bmN0aW9uLiBBbGwgbnVtZXJpYyB2YXJpYWJsZXMgYXJlIG9mIG51bWVyaWMgdHlwZSAnZG91YmxlJy4NCg0KVGhlIHN0cnVjdHVyZSBvZiB0aGUgJ2pvaW5lZF9kYXRhX2ZpbmFsJyBkYXRhIGZyYW1lIGlzIGNoZWNrZWQgdXNpbmcgc3RyKCkgZnVuY3Rpb24uIEZvdXIgdmFyaWFibGVzIGFyZSBvZiBjaGFyYWN0ZXIgZGF0YSB0eXBlIGFuZCB0d28gdmFyaWFibGVzIGFyZSBvZiBudW1lcmljIGRhdGEgdHlwZS4gVG8gYnJpbmcgY29uc2lzdGVuY3kgd2UgaGF2ZSBjb252ZXJ0ZWQgJ0NvdW50cnkgTmFtZScgYW5kICdJbmNvbWVHcm91cCcgdmFyaWFibGVzIGludG8gdXBwZXIgY2FzZSB1c2luZyB0b3VwcGVyKCkgZnVuY3Rpb24uIFdlIGNhbiBzZWUgdGhhdCB0aGUgJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJyBhbmQgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgdmFyaWFibGVzIGhhdmUgZ290IHRoZSByaWdodCBkYXRhIHR5cGVzIHNpbmNlIHRoZXkgYm90aCBhcmUgb2YgbnVtZXJpYyBkYXRhIHR5cGUuIFdlIGhhdmUgY29udmVydGVkICdDb3VudHJ5IENvZGUnIHZhcmlhYmxlIGludG8gYSBmYWN0b3IgZGF0YSB0eXBlIHVzaW5nIGFzLmZhY3RvcigpIGZ1bmN0aW9uIGFzIHRoZXJlIGFyZSBvbmx5IDE4NSB1bmlxdWUgY291bnRyeSBjb2RlcyBhdmFpbGFibGUgaW4gdGhlIGRhdGFzZXQuIFdlIGhhdmUgY29udmVydGVkICdZZWFyJyB2YXJpYWJsZSBpbnRvIGEgZmFjdG9yIGRhdGEgdHlwZSB1c2luZyBmYWN0b3IoKSBmdW5jdGlvbiBhbmQgc2V0IDEwIGxldmVscyBhcyB0aGVyZSBhcmUgb25seSAxMCB1bmlxdWUgeWVhcnMgaW4gdGhlIGRhdGFzZXQuIFdlIGhhdmUgY29udmVydGVkICdDb3VudHJ5IE5hbWUnIHZhcmlhYmxlIGludG8gYSBmYWN0b3IgZGF0YSB0eXBlIHVzaW5nIGFzLmZhY3RvcigpIGZ1bmN0aW9uIGFzIHRoZXJlIGFyZSBvbmx5IDE4NSBjb3VudHJpZXMgbmFtZXMgaW4gdGhlIGRhdGFzZXQuIFdlIGhhdmUgY29udmVydGVkICdJbmNvbWVHcm91cCcgdmFyaWFibGUgaW50byBhIGZhY3RvciBkYXRhIHR5cGUgdXNpbmcgZmFjdG9yKCkgZnVuY3Rpb24gYW5kIHNldCA0IGRpZmZlcmVudCBsZXZlbHMgYW5kIHRoZW4gb3JkZXJlZCB0aGVtLiANCg0KV2UgaGF2ZSBjaGVja2VkIHRoZSBsZXZlbHMgaW4gdGhlICdJbmNvbWVHcm91cCcgdmFyaWFibGUgdXNpbmcgdGhlIGxldmVscygpIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBvcmRlcmVkIGxldmVscy4NCg0KV2UgaGF2ZSBjaGVja2VkIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHVwZGF0ZWQgJ2pvaW5lZF9kYXRhX2ZpbmFsJyB1c2luZyBzdHIoKSBmdW5jdGlvbi4gV2UgY2FuIHNlZSB0aGF0IHRoZSB1cGRhdGVkIGRhdGFzZXQgaGFzIDE4NTAgb2JzZXJ2YXRpb25zIGFuZCA2IGNvbHVtbnMuIFRocmVlIHZhcmlhYmxlcyBhcmUgb2YgZmFjdG9yIGRhdGEgdHlwZSwgb25lIHZhcmlhYmxlIGlzIG9mIG9yZGVyZWQgZmFjdG9yIGRhdGEgdHlwZSBhbmQgdHdvIHZhcmlhYmxlcyBhcmUgb2YgbnVtZXJpYyBkYXRhIHR5cGUuDQoNCmBgYHtyfQ0KZGltKGpvaW5lZF9kYXRhX2ZpbmFsKQ0KY29sbmFtZXMoam9pbmVkX2RhdGFfZmluYWwpDQpjbGFzcyhqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBOYW1lYCkNCmNsYXNzKGpvaW5lZF9kYXRhX2ZpbmFsJGBDb3VudHJ5IENvZGVgKQ0KY2xhc3Moam9pbmVkX2RhdGFfZmluYWwkWWVhcikNCmNsYXNzKGpvaW5lZF9kYXRhX2ZpbmFsJEN1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEKQ0KY2xhc3Moam9pbmVkX2RhdGFfZmluYWwkR0RQX1Blcl9DYXBpdGFfaW5fVVNEKQ0KY2xhc3Moam9pbmVkX2RhdGFfZmluYWwkSW5jb21lR3JvdXApDQp0eXBlb2Yoam9pbmVkX2RhdGFfZmluYWwkQ3VycmVudF9IZWFsdGhfRXhwZW5kaXR1cmVfUGVyX0NhcGl0YV9pbl9VU0QpDQp0eXBlb2Yoam9pbmVkX2RhdGFfZmluYWwkR0RQX1Blcl9DYXBpdGFfaW5fVVNEKQ0Kc3RyKGpvaW5lZF9kYXRhX2ZpbmFsKQ0Kam9pbmVkX2RhdGFfZmluYWwkYENvdW50cnkgTmFtZWAgPC0gdG91cHBlcihqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBOYW1lYCkNCmpvaW5lZF9kYXRhX2ZpbmFsJEluY29tZUdyb3VwIDwtIHRvdXBwZXIoam9pbmVkX2RhdGFfZmluYWwkSW5jb21lR3JvdXApDQpqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBDb2RlYCA8LSBhcy5mYWN0b3Ioam9pbmVkX2RhdGFfZmluYWwkYENvdW50cnkgQ29kZWApDQpqb2luZWRfZGF0YV9maW5hbCRZZWFyIDwtIGZhY3Rvcihqb2luZWRfZGF0YV9maW5hbCRZZWFyLCBsZXZlbHMgPSBjKCcyMDA4JywgJzIwMDknLCAnMjAxMCcsICcyMDExJywgJzIwMTInLCAnMjAxMycsICcyMDE0JywgJzIwMTUnLCAnMjAxNicsICcyMDE3JykpDQpqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBOYW1lYCA8LSBhcy5mYWN0b3Ioam9pbmVkX2RhdGFfZmluYWwkYENvdW50cnkgTmFtZWApDQpqb2luZWRfZGF0YV9maW5hbCRJbmNvbWVHcm91cCA8LSBmYWN0b3Ioam9pbmVkX2RhdGFfZmluYWwkSW5jb21lR3JvdXAsIGxldmVscyA9IGMoJ0xPVyBJTkNPTUUnLCAnTE9XRVIgTUlERExFIElOQ09NRScsICdVUFBFUiBNSURETEUgSU5DT01FJywgJ0hJR0ggSU5DT01FJyksIG9yZGVyZWQgPSBUUlVFKQ0KbGV2ZWxzKGpvaW5lZF9kYXRhX2ZpbmFsJEluY29tZUdyb3VwKQ0Kc3RyKGpvaW5lZF9kYXRhX2ZpbmFsKQ0KYGBgDQoNCiMjCVNjYW4gSSANCg0KRmlyc3Qgd2UgaGF2ZSBjaGVja2VkIHRoZSBzdW0gb2YgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICdqb2luZWRfZGF0YV9maW5hbCcgZGF0YSBmcmFtZSB1c2luZyBzdW0oaXMubmEoKSkgZnVuY3Rpb24uIFRoZXJlIGFyZSAxMyBtaXNzaW5nIHZhbHVlcyBpbiB0b3RhbC4gTmV4dCB3ZSBoYXZlIGNoZWNrZWQgdGhlIG1pc3NpbmcgdmFsdWVzIGluIGVhY2ggY29sdW1uIG9mIHRoZSAnam9pbmVkX2RhdGFfZmluYWwnIGRhdGEgZnJhbWUgdXNpbmcgY29sU3Vtcyhpcy5uYSgpKSBmdW5jdGlvbi4gV2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJyBhbmQgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgY29sdW1ucy4NCg0KTmV4dCB3ZSBoYXZlIGNoZWNrZWQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtaXNzaW5nIHZhbHVlcyBpbiB0aGVzZSBjb2x1bW5zIHVzaW5nIHdoaWNoKGlzLm5hKCkpIGZ1bmN0aW9uLg0KDQpUaGVuIHdlIGhhdmUgY2hlY2tlZCBlYWNoIGNvbHVtbiBvZiB0aGUgJ2pvaW5lZF9kYXRhX2ZpbmFsJyBkYXRhc2V0IGZvciBhbnkgc3BlY2lhbCB2YWx1ZXMgYW5kIG9idmlvdXMgZXJyb3JzIHVzaW5nIGlzLmluZmluaXRlKCkgYW5kIGlzLm5hbigpIGZ1bmN0aW9ucy4NCg0KTmV4dCwgd2UgaGF2ZSBleGNsdWRlZCB0aGUgbWlzc2luZyB2YWx1ZXMgZnJvbSBvdXIgZGF0YXNldCBhcyB0aGUgYW1vdW50IG9mIHRoZSBtaXNzaW5nIGRhdGEgaXMgdmVyeSBzbWFsbCByZWxhdGl2ZWx5IHRvIHRoZSBzaXplIG9mIHRoZSBkYXRhc2V0ICg8IDUlKSBhbmQgb25seSBzZWxlY3RlZCBvYnNlcnZhdGlvbnMgZnJvbSB0aGUgJ2pvaW5lZF9kYXRhX2ZpbmFsJyBkYXRhc2V0IHdoaWNoIGFyZSBjb21wbGV0ZSB1c2luZyBjb21wbGV0ZS5jYXNlcygpIGZ1bmN0aW9uLiANCg0KVGhlIHJlYXNvbiBmb3Igc2VsZWN0aW5nIG9ubHkgdGhvZXMgb2JzZXJ2YXRpb25zIHdoaWNoIGFyZSBjb21wbGV0ZSBpcyBiZWNhdXNlIG91ciBkYXRhIGlzIGZyb20gdGhlICdXb3JsZCBCYW5rIE9wZW4gRGF0YSBCYW5rJyBhbmQgd2Uga25vdyB0aGF0IHRoZSBkYXRhIGlzIGFjY3VyYXRlIHNvIHJlcGxhY2luZyB0aGUgbWlzc2luZyB2YWx1ZXMgaW4gdGhlICdDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCcgYW5kICdHRFBfUGVyX0NhcGl0YV9pbl9VU0QnIHZhcmlhYmxlcyB3aXRoIHRoZSBtZWFuL21lZGlhbiBvciB3aXRoIHNvbWUgb3RoZXIgY29uc3RhbnQgdmFsdWUgd2lsbCBvbmx5IGNyZWF0ZSBkaXN0b3J0aW9uIGluIHRoZSBkYXRhc2V0IGFuZCB3aWxsIGNyZWF0ZSBiaWFzIGluIG91ciBhbmFseXNpcy4gV2UgaGF2ZSBjaGVja2VkIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHVwZGF0ZWQgJ2pvaW5lZF9kYXRhX2ZpbmFsJyBkYXRhc2V0IHVzaW5nIHN0cigpIGZ1bmN0aW9uLiBUaGUgdXBkYXRlZCAnam9pbmVkX2RhdGFfZmluYWwnIGRhdGFzZXQgaGFzIDE4Mzcgb2JzZXJ2YXRpb25zIGFuZCA2IGNvbHVtbnMuIA0KYGBge3J9DQpzdW0oaXMubmEoam9pbmVkX2RhdGFfZmluYWwpKQ0KY29sU3Vtcyhpcy5uYShqb2luZWRfZGF0YV9maW5hbCkpDQp3aGljaChpcy5uYShqb2luZWRfZGF0YV9maW5hbCRDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCkpDQp3aGljaChpcy5uYShqb2luZWRfZGF0YV9maW5hbCRHRFBfUGVyX0NhcGl0YV9pbl9VU0QpKQ0Kc3VtKGlzLmluZmluaXRlKGpvaW5lZF9kYXRhX2ZpbmFsJGBDb3VudHJ5IE5hbWVgKSkNCnN1bShpcy5pbmZpbml0ZShqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBDb2RlYCkpDQpzdW0oaXMuaW5maW5pdGUoam9pbmVkX2RhdGFfZmluYWwkWWVhcikpDQpzdW0oaXMuaW5maW5pdGUoam9pbmVkX2RhdGFfZmluYWwkQ3VycmVudF9IZWFsdGhfRXhwZW5kaXR1cmVfUGVyX0NhcGl0YV9pbl9VU0QpKQ0Kc3VtKGlzLmluZmluaXRlKGpvaW5lZF9kYXRhX2ZpbmFsJEdEUF9QZXJfQ2FwaXRhX2luX1VTRCkpDQpzdW0oaXMuaW5maW5pdGUoam9pbmVkX2RhdGFfZmluYWwkSW5jb21lR3JvdXApKQ0Kc3VtKGlzLm5hbihqb2luZWRfZGF0YV9maW5hbCRgQ291bnRyeSBOYW1lYCkpDQpzdW0oaXMubmFuKGpvaW5lZF9kYXRhX2ZpbmFsJGBDb3VudHJ5IENvZGVgKSkNCnN1bShpcy5uYW4oam9pbmVkX2RhdGFfZmluYWwkWWVhcikpDQpzdW0oaXMubmFuKGpvaW5lZF9kYXRhX2ZpbmFsJEN1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEKSkNCnN1bShpcy5uYW4oam9pbmVkX2RhdGFfZmluYWwkR0RQX1Blcl9DYXBpdGFfaW5fVVNEKSkNCnN1bShpcy5uYW4oam9pbmVkX2RhdGFfZmluYWwkSW5jb21lR3JvdXApKQ0Kam9pbmVkX2RhdGFfZmluYWwgPC0gam9pbmVkX2RhdGFfZmluYWxbY29tcGxldGUuY2FzZXMoam9pbmVkX2RhdGFfZmluYWwpLCBdDQpzdHIoam9pbmVkX2RhdGFfZmluYWwpDQpgYGANCg0KIyMJVGlkeSAmIE1hbmlwdWxhdGUgRGF0YSBJSQ0KDQpXZSBoYXZlIGNyZWF0ZWQgYSBuZXcgdmFyaWFibGUgJ0hlYWx0aF9FeHBlbmRpdHVyZV9hc19wZXJjZW50X29mX0dEUCcgaW4gb3VyIGRhdGFzZXQgJ2pvaW5lZF9kYXRhX2ZpbmFsJyB1c2luZyBkcGx5ciBtdXRhdGUoKSBmdW5jdGlvbi4gVGhlIG5ldyB2YXJpYWJsZSAnSGVhdGhfRXhwZW5kaXR1cmVfYXNfcGVyY2VudF9vZl9HRFAnIGlzIGNyZWF0ZWQgYnkgZGl2aWRpbmcgJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJyBieSB0aGUgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgYW5kIG11bHRpcGx5aW5nIHRoZSByZXN1bHQgYnkgMTAwIHRvIGdldCBpbiBwZXJjZW50YWdlLg0KDQpXZSBoYXZlIGNoZWNrZWQgdGhlIHN0cnVjdHVyZSBvZiB0aGUgdXBkYXRlZCAnam9pbmVkX2RhdGFfZmluYWwnIGRhdGFzZXQgdXNpbmcgc3RyKCkgZnVuY3Rpb24uIA0KDQpXZSBjYW4gc2VlIHRoYXQgdGhlIHVwZGF0ZWQgbmV3ICdqb2luZWRfZGF0YV9maW5hbCcgZGF0YXNldCBoYXMgMTgzNyBvYnNlcnZhdGlvbnMgYW5kIDcgY29sdW1ucy4gVGhyZWUgb2YgdGhlIHZhcmlhYmxlcyBhcmUgb2YgZmFjdG9yIGRhdGEgdHlwZSwgb25lIHZhcmlhYmxlIGhhcyBvcmRlcmVkIGZhY3RvciBkYXRhIHR5cGUgYW5kIHRocmVlIHZhcmlhYmxlcyBhcmUgb2YgbnVtZXJpYyBkYXRhIHR5cGUuDQoNCmBgYHtyfQ0Kam9pbmVkX2RhdGFfZmluYWwgPC0gbXV0YXRlKGpvaW5lZF9kYXRhX2ZpbmFsLCBIZWFsdGhfRXhwZW5kaXR1cmVfYXNfcGVyY2VudF9vZl9HRFAgPSAoQ3VycmVudF9IZWFsdGhfRXhwZW5kaXR1cmVfUGVyX0NhcGl0YV9pbl9VU0QgLyBHRFBfUGVyX0NhcGl0YV9pbl9VU0QpKjEwMCkNCmhlYWQoam9pbmVkX2RhdGFfZmluYWwpDQpgYGANCg0KYGBge3J9DQpzdHIoam9pbmVkX2RhdGFfZmluYWwpDQpgYGANCg0KIyMJU2NhbiBJSQ0KDQpXZSBoYXZlIHNjYW4gYWxsIG51bWVyaWMgdmFyaWFibGVzIGZvciBhbnkgb3V0bGllcnMgcHJlc2VudCBpbiB0aGVtIHVzaW5nICdUdWtleXMgbWV0aG9kIG9mIG91dGxpZXIgZGV0ZWN0aW9uJyBhcyBhbGwgbnVtZXJpYyB2YXJpYWJsZXMgaGF2ZSBnb3Qgbm9uLXN5bW1ldHJpYyBkYXRhIGRpc3RyaWJ1dGlvbnMgYXMgd2UgY2FuIHNlZSBpbiB0aGUgaGlzdG9ncmFtIGJlbG93LiANCmBgYHtyfQ0KaGlzdChqb2luZWRfZGF0YV9maW5hbCRDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCwgbWFpbiA9ICdEaXN0cmlidXRpb24gb2YgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgaW4gVVNEJywgeGxhYiA9ICdIZWF0aCBFeHBlbmRpdHVyZSBQZXIgQ2FwaXRhIGluIFVTRCcpDQpgYGANCg0KYGBge3J9DQpoaXN0KGpvaW5lZF9kYXRhX2ZpbmFsJEdEUF9QZXJfQ2FwaXRhX2luX1VTRCwgbWFpbiA9ICdEaXN0cmlidXRpb24gb2YgR0RQIFBlciBDYXBpdGEgaW4gVVNEJywgeGxhYiA9ICdHRFAgUGVyIENhcGl0YSBpbiBVU0QnKQ0KYGBgDQpJbiB0aGUgYm94IHBsb3QgYmVsb3cgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGFyZSBtYW55IG91dGxpZXJzIHByZXNlbnQgaW4gYm90aCB0aGUgJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJyBhbmQgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgdmFyaWFibGVzLg0KYGBge3J9DQpqb2luZWRfZGF0YV9maW5hbCRDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCAlPiUgIGJveHBsb3QobWFpbj0iQm94IFBsb3Qgb2YgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSBpbiBVU0QiLCB5bGFiPSJDdXJyZW50IEhlYWx0aCBFeHBlbmRpdHVyZSIsIGNvbCA9ICJncmV5IikNCmBgYA0KYGBge3J9DQpqb2luZWRfZGF0YV9maW5hbCRHRFBfUGVyX0NhcGl0YV9pbl9VU0QgJT4lICBib3hwbG90KG1haW49IkJveCBQbG90IG9mIEdEUCBQZXIgQ2FwaXRhIGluIFVTRCIsIHlsYWI9IkdEUCBQZXIgQ2FwaXRhIiwgY29sID0gImdyZXkiKQ0KYGBgDQpUbyBpbnZlc3RpZ2F0ZSB0aGVzZSBvdXRsaWVycyB3ZSBoYXZlIGNyZWF0ZWQgYW4gdXBwZXIgb3V0bGllciBmZW5jZSBmb3IgYm90aCB0aGUgJ0N1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEJyBhbmQgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgdmFyaWFibGVzLg0KDQpGaXJzdCwgZ2V0dGluZyB0aGUgRGVzY3JpcHRpdmUgU3RhdGlzdGljcyBmb3IgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSBpbiBVU0QgYW5kIEdEUCBQZXIgQ2FwaXRhIGluIFVTRDoNCmBgYHtyfQ0Kc3VtbWFyeShqb2luZWRfZGF0YV9maW5hbCRHRFBfUGVyX0NhcGl0YV9pbl9VU0QpDQpzdW1tYXJ5KGpvaW5lZF9kYXRhX2ZpbmFsJEN1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEKQ0KSVFSKGpvaW5lZF9kYXRhX2ZpbmFsJEdEUF9QZXJfQ2FwaXRhX2luX1VTRCkNCklRUihqb2luZWRfZGF0YV9maW5hbCRDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCkNCmBgYA0KVXBwZXIgT3V0bGllciBGZW5jZSBmb3IgQ3VycmVudCBIZWFsdGggRXhwZW5kaXR1cmUgUGVyIENhcGl0YSBpbiBVU0Q6DQpgYGB7cn0NCjEwMDYuOTQgKyAoMS41KjkyNS43NDA1KQ0KYGBgDQpVcHBlciBPdXRsaWVyIEZlbmNlIGZvciBHRFAgUGVyIENhcGl0YSBpbiBVU0Q6DQpgYGB7cn0NCjE2MzA5LjEgKyAoMS41KjE0NjUzLjI3KQ0KYGBgDQpGcm9tIHRoZSB1cHBlciBvdXRsaWVyIGZlbmNlIG9mICdDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCcgd2UgY2FuIHNlZSB0aGF0IHRoZSBvdXRsaWVycyBzdGFydHMgYWZ0ZXIgY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmUgcGVyIGNhcGl0YSBvZiAyMzk1LjU1MSBpbiBVUyBkb2xsYXJzLiBUbyBpbnZlc3RpZ2F0ZSB0aGVzZSBvdXRsaWVycyB3ZSBoYXZlIHVzZWQgZHBseXIgcGFja2FnZSAnZmlsdGVyKCknIGZ1bmN0aW9uIHRvIGNoZWNrIGFsbCB0aG9lcyBjb3VudHJpZXMgd2hpY2ggaGF2ZSBjdXJyZW50IGhlYWx0aCBleHBlbmRpdHVyZSBwZXIgY2FwaXRhIGdyZWF0ZXIgdGhlbiB0aGUgdXBwZXIgb3V0bGllciBmZW5jZS4gV2UgY2FuIHNlZSB0aGF0IGFsbCB0aGUgb3V0bGllcnMgaW4gdGhlICdDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCcgdmFyaWFibGUgYmVsb25ncyB0byB0aGUgSElHSCBJTkNPTUUgJ0luY29tZUdyb3VwJyBjb3VudHJpZXMgZnJvbSAyMDA4IC0gMjAxNy4gDQpgYGB7cn0NCm91dGxpZXJfaGVhbHRoZXhwIDwtIGpvaW5lZF9kYXRhX2ZpbmFsICU+JSBmaWx0ZXIoQ3VycmVudF9IZWFsdGhfRXhwZW5kaXR1cmVfUGVyX0NhcGl0YV9pbl9VU0QgPiAyMzk1LjU1MSkNCm91dGxpZXJfaGVhbHRoZXhwDQpgYGANCkZyb20gdGhlIHVwcGVyIG91dGxpZXIgZmVuY2Ugb2YgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgd2UgY2FuIHNlZSB0aGF0IHRoZSBvdXRsaWVycyBzdGFydHMgYWZ0ZXIgZ2RwIHBlciBjYXBpdGEgb2YgMzgyODkgaW4gVVMgZG9sbGFycy4gVG8gaW52ZXN0aWdhdGUgdGhlc2Ugb3V0bGllcnMgd2UgaGF2ZSB1c2VkIGRwbHlyIHBhY2thZ2UgJ2ZpbHRlcigpJyBmdW5jdGlvbiB0byBjaGVjayBhbGwgdGhvZXMgY291bnRyaWVzIHdoaWNoIGhhdmUgZ2RwIHBlciBjYXBpdGEgZ3JlYXRlciB0aGVuIHRoZSB1cHBlciBvdXRsaWVyIGZlbmNlLiBXZSBjYW4gc2VlIHRoYXQgYWxsIHRoZSBvdXRsaWVycyBpbiB0aGUgJ0dEUF9QZXJfQ2FwaXRhX2luX1VTRCcgdmFyaWFibGUgYmVsb25ncyB0byB0aGUgSElHSCBJTkNPTUUgJ0luY29tZUdyb3VwJyBjb3VudHJpZXMgZnJvbSAyMDA4IC0gMjAxNy4NCmBgYHtyfQ0Kb3V0bGllcl9nZHAgPC0gam9pbmVkX2RhdGFfZmluYWwgJT4lIGZpbHRlcihHRFBfUGVyX0NhcGl0YV9pbl9VU0QgPiAzODI4OSkNCm91dGxpZXJfZ2RwDQpgYGANCkZ1cnRoZXIgd2UgaGF2ZSBpbnZlc3RpZ2F0ZWQgdGhlc2Ugb3V0bGllcnMgdXNpbmcgYml2YXJpYXRlIHZpc3VhbGlzYXRpb24gbWV0aG9kIC0gc2NhdHRlciBwbG90IGluIHdoaWNoIHdlIGhhdmUgc2VlbiB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGN1cnJlbnQgaGVhbHRoIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgd2l0aCB0aGUgZ2RwIHBlciBjYXBpdGEgaW4gVVNELg0KYGBge3J9DQpwbG90KGpvaW5lZF9kYXRhX2ZpbmFsJEN1cnJlbnRfSGVhbHRoX0V4cGVuZGl0dXJlX1Blcl9DYXBpdGFfaW5fVVNEIH4gam9pbmVkX2RhdGFfZmluYWwkR0RQX1Blcl9DYXBpdGFfaW5fVVNELCB4bGFiID0gJ0dEUCBQZXIgQ2FwaXRhIGluIFVTRCcsIHlsYWIgPSAnSGVhbHRoIEV4cGVuZGl0dXJlIGluIFVTRCcsIG1haW4gPSAnSGVhbHRoIEV4cGVuZGl0dXJlIGJ5IEdEUCcpDQpgYGANCkZyb20gdGhlICBzY2F0dGVyIHBsb3Qgd2UgY2FuIHNlZSB0aGF0IHRoZXJlIGlzIGEgbm9uLWxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzIGFuZCB0aGVyZSBhcmUgc29tZSBvdXRsaWVycyBwcmVzZW50IG9uIHRoZSB1cHBlciBsZWZ0IHNpZGUgb2YgdGhlIHBsb3QgYW5kIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBwbG90LiBUbyBpbnZlc3RpZ2F0ZSB0aGVzZSBvdXRsaWVycyB3ZSBoYXZlIGNoZWNrZWQgdGhlIGxvY2F0aW9uIG9mIHRoZXNlIG91dGxpZXJzIHVzaW5nIHdoaWNoLm1heCgpIGZ1bmN0aW9uIGFzIGFtb25nIHRoZXNlIG91dGxpZXJzIGlzIGFsc28gdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGdkcCBwZXIgY2FwaXRhLiBVc2luZyB0aGUgbG9jYXRpb24gb2YgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGdkcCBwZXIgY2FwaXRhIHdlIGhhdmUgbG9jYXRlZCB0aGUgY291bnRyeSBpbiB0aGUgJ2pvaW5lZF9kYXRhX2ZpbmFsJyB0byB3aGljaCBpdCBiZWxvbmdzLiANCmBgYHtyfQ0KIyBNYXggR0RQIFBlciBDYXBpdGENCmpvaW5lZF9kYXRhX2ZpbmFsW3doaWNoLm1heChqb2luZWRfZGF0YV9maW5hbCRHRFBfUGVyX0NhcGl0YV9pbl9VU0QpLCBdDQpgYGANCkZyb20gb3VyIGludmVzdGlnYXRpb24gd2UgaGF2ZSBkaXNjb3ZlcmVkIHRoYXQgJ01PTkFDTycgaGFzIGdvdCB0aGUgaGlnaGVzdCBnZHAgcGVyIGNhcGl0YSBpbiAyMDE0IHdpdGggdGhlIGdkcCBwZXIgY2FwaXRhIG9mIDE4OTE3MC45IFVTIGRvbGxhcnMgYW5kIHdpdGggY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmUgcGVyIGNhcGl0YSBvZiAzODYzLjU3MyBVUyBkb2xsYXJzLiBUaGUgaGVhbHRoIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgYXMgcGVyY2VudCBvZiBnZHAgcGVyIGNhcGl0YSBpcyBqdXN0IDIuMDQyMzcyIHBlcmNlbnQuVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbHRob3VnaCAnTU9OQUNPJyBoYXMgZ290IGEgaGlnaCBnZHAgcGVyIGNhcGl0YSBob3dldmVyIGR1ZSB0byB0aGUgaGVhbHRoIGxpZmVzdHlsZSBhbmQgZ29vZCBwdWJsaWMgaGVhbHRoY2FyZSBzeXN0ZW0gaW4gJ01PTkFDTycgdGhlIGN1cnJlbnQgaGVhbHRoIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgaXMgdmVyeSBzbWFsbCBjb21wYXJlZCB0byB0aGUgZ2RwIHBlciBjYXBpdGEuIEl0IGlzIGR1ZSB0byB0aGlzIHRoYXQgaW4gdGhlIHNjYXR0ZXIgcGxvdCB3ZSBjYW4gc2VlIHRoYXQgJ01PTkFDTyIgaXMgY29uc2lkZXJlZCBhcyBhbiBvdXRsaWVyLg0KDQpUaGVyZSBhcmUgYWxzbyBvdXRsaWVycyBpbiB0aGUgdXBwZXIgbGVmdCBzaWRlIG9mIHRoZSBzY2F0dGVyIHBsb3QuIFRvIGludmVzdGlnYXRlIHRoZXNlIG91dGxpZXJzIHdlIGhhdmUgY2hlY2tlZCB0aGUgbG9jYXRpb24gb2YgdGhlc2Ugb3V0bGllcnMgdXNpbmcgd2hpY2gubWF4KCkgZnVuY3Rpb24gYXMgYW1vbmcgdGhlc2Ugb3V0bGllcnMgaXMgYWxzbyB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmUgcGVyIGNhcGl0YS4gVXNpbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBjdXJyZW50IGhlYWx0aCBleHBlbmRpdHVyZSBwZXIgY2FwaXRhIHdlIGhhdmUgbG9jYXRlZCB0aGUgY291bnRyeSBpbiB0aGUgJ2pvaW5lZF9kYXRhX2ZpbmFsJyB0byB3aGljaCBpdCBiZWxvbmdzLg0KYGBge3J9DQojIE1heCBIZWFsdGggRXhwIFBlciBDYXBpdGENCmpvaW5lZF9kYXRhX2ZpbmFsW3doaWNoLm1heChqb2luZWRfZGF0YV9maW5hbCRDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCksIF0NCmBgYA0KRnJvbSBvdXIgaW52ZXN0aWdhdGlvbiB3ZSBoYXZlIGRpc2NvdmVyZWQgdGhhdCAnVU5JVEVEIFNUQVRFUycgaGFzIGdvdCB0aGUgaGlnaGVzdCBjdXJyZW50IGhlYWx0aCBleHBlbmRpdHVyZSBwZXIgY2FwaXRhIGluIDIwMTcgd2l0aCB0aGUgY3VycmVudCBoZWFsdGggZXhwZW5kaXR1cmUgcGVyIGNhcGl0YSBvZiAxMDI0Ni4xNCBVUyBkb2xsYXJzIGFuZCB3aXRoIGdkcCBwZXIgY2FwaXRhIG9mIDU5OTU3LjczIFVTIGRvbGxhcnMuIFRoZSBoZWFsdGggZXhwZW5kaXR1cmUgYXMgcGVyY2VudCBvZiBnZHAgaXMgMTcuMDg4OTQgcGVyY2VudC4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbHRob3VnaCAnVU5JVEVEIFNUQVRFUycgZ2RwIHBlciBjYXBpdGEgaXMgbm90IHZlcnkgaGlnaCBob3dldmVyIGR1ZSB0byB0aGUgcHJpdmF0ZSBoZWFsdGggY2FyZSBzeXN0ZW0gaW4gJ1VOSVRFRCBTVEFURVMnIHRoZSBjdXJyZW50IGhlYWx0aCBleHBlbmRpdHVyZSBwZXIgY2FwaXRhIGlzIHZlcnkgbGFyZ2UgY29tcGFyZWQgdG8gdGhlIGdkcCBwZXIgY2FwaXRhLiBJdCBpcyBkdWUgdG8gdGhpcyB0aGF0IGluIHRoZSBzY2F0dGVyIHBsb3Qgd2UgY2FuIHNlZSB0aGF0ICdVTklURUQgU1RBVEVTJyBpcyBjb25zaWRlcmVkIGFzIGFuIG91dGxpZXIuDQogIA0KIyMJVHJhbnNmb3JtIA0KDQpXZSBoYXZlIHNlZW4gYWJvdmUgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBDdXJyZW50IEhlYWx0aCBFeHBlbmRpdHVyZSBQZXIgY2FwaXRhIGluIFVTRCBpcyBub24tc3ltbWV0cmljIGFuZCB3ZSBjYW4gb2JzZXJ2ZSB0aGF0IHRoZSBDdXJyZW50IEhlYWx0aCBFeHBlbmRpdHVyZSBQZXIgQ2FwaXRhIGluIFVTRCBoYXZlIHJpZ2h0LXNrZXdlZCBkaXN0cmlidXRpb24uIEJ5IGFwcGx5aW5nIEJveC1Db3ggVHJhbnNmb3JtYXRpb24gb24gdGhlICdDdXJyZW50X0hlYWx0aF9FeHBlbmRpdHVyZV9QZXJfQ2FwaXRhX2luX1VTRCcgd2UgYXJlIGFibGUgdG8gdHJhbnNmb3JtIG5vbi1ub3JtYWwgZGF0YSBkaXN0cmlidXRpb24gb2YgdGhlIEN1cnJlbnQgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgaW4gVVNEIGludG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uIHRvIHNvbWUgZGVncmVlLiANCmBgYHtyfQ0KYm94Y294X2hlYWx0aGV4cCA8LSBCb3hDb3goam9pbmVkX2RhdGFfZmluYWwkQ3VycmVudF9IZWFsdGhfRXhwZW5kaXR1cmVfUGVyX0NhcGl0YV9pbl9VU0QsIGxhbWJkYSA9ICdhdXRvJykNCmhpc3QoYm94Y294X2hlYWx0aGV4cCkNCmBgYA0KV2UgaGF2ZSBzZWVuIGFib3ZlIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgR0RQIFBlciBjYXBpdGEgaW4gVVNEIGlzIG5vbi1zeW1tZXRyaWMgYW5kIHdlIGNhbiBvYnNlcnZlIHRoYXQgdGhlIEdEUCBQZXIgQ2FwaXRhIGluIFVTRCBoYXZlIHJpZ2h0LXNrZXdlZCBkaXN0cmlidXRpb24uIEJ5IGFwcGx5aW5nIE5hdHVyYWwgTG9nYXJpdGhtIFRyYW5zZm9ybWF0aW9uIG9uIHRoZSAnR0RQX1Blcl9DYXBpdGFfaW5fVVNEJyB3ZSBhcmUgYWJsZSB0byB0cmFuc2Zvcm0gbm9uLW5vcm1hbCBkYXRhIGRpc3RyaWJ1dGlvbiBpbnRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB0byBzb21lIGRlZ3JlZS4gDQpgYGB7cn0NCmxvZ19nZHAgPC0gbG9nKGpvaW5lZF9kYXRhX2ZpbmFsJEdEUF9QZXJfQ2FwaXRhX2luX1VTRCkNCmhpc3QobG9nX2dkcCkNCmBgYA0KV2UgaGF2ZSBzZWVuIGFib3ZlIGluIHRoZSBzY2F0dGVyIHBsb3QgdGhhdCB0aGVyZSBpcyBhIG5vbi1saW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIEN1cnJlbnQgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgaW4gVVNEIGFuZCBHRFAgUGVyIENhcGl0YSBpbiBVU0QuIEFmdGVyIGFwcGx5aW5nIEJveF9Db3ggVHJhbnNmb3JtYXRpb24gb24gdGhlIEN1cnJlbnQgSGVhbHRoIEV4cGVuZGl0dXJlIFBlciBDYXBpdGEgaW4gVVNEIGFuZCBOYXR1cmFsIExvZ2FyaXRobSBUcmFuc2Zvcm1hdGlvbiBvbiB0aGUgR0RQIFBlciBDYXBpdGEgaW4gVVNEIHdlIGhhdmUgZGV2ZWxvcGVkIGEgbmV3IHNjYXR0ZXIgcGxvdCBiZXR3ZWVuIHRoZXNlIHR3byB2YXJpYWJsZXMgYW5kIGZyb20gdGhlIHBsb3Qgd2UgY2FuIHNlZSB0aGF0IG5vdyB0aGVyZSBpcyBhIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVzZSB0d28gdmFyaWFibGVzIHRvIHNvbWUgZGVncmVlLg0KYGBge3J9DQpwbG90KGxvZ19nZHAsIGJveGNveF9oZWFsdGhleHAsIG1haW4gPSAnSGVhbHRoIEV4cGVuZGl0dXJlIGJ5IEdEUCcsIHhsYWIgPSAnTG9nX0dEUCcsIHlsYWIgPSAnQm94Q294X0hlYWx0aCBFeHBlbmRpdHVyZScpDQpgYGANCiMjCVJlZmVyZW5jZXMNCg0KVGhlIFdvcmxkIEJhbmsgRGF0YSAyMDIwLCBHRFAgcGVyIGNhcGl0YSAoY3VycmVudCBVUyQpLCANCmh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9OWS5HRFAuUENBUC5DRA0KDQpUaGUgV29ybGQgQmFuayBEYXRhIDIwMjAsIEN1cnJlbnQgaGVhbHRoIGV4cGVuZGl0dXJlIHBlciBjYXBpdGEgKGN1cnJlbnQgVVMkKSwgaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NILlhQRC5DSEVYLlBDLkNEDQoNCjxicj4NCjxicj4NCg==