install.packages("tidyverse")

setwd("/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators")

female <- read.csv("female.csv")

# Determine that R does consider female to be data frame
is.data.frame(female)

head(female)

library(tidyverse)

female <- female %>%
  filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States")

head(female)

colnames(female)

rel_col <- which(colnames(female)=="Country.Name" | colnames(female)== "X2014..YR2014." | colnames(female)== "X2017..YR2017." | colnames(female) == "X2021..YR2021." )
rel_col

female <- female[rel_col] %>% rename("2014" = 2, "2017" = 3, "2021" = 4)
head(female)

transpose_f <- data.frame(t(female[-1]))
colnames(transpose_f) <- female[, 1]
head(transpose_f)

print(sapply(transpose_f, class))

transpose_f$Brazil = as.numeric(transpose_f$Brazil) 
transpose_f$India = as.numeric(transpose_f$India)
transpose_f$"United States" = as.numeric(transpose_f$"United States")
head(transpose_f)

summarise_each(transpose_f, list(mean))

transpose_f %>%
  summarise(across(c(Brazil, India, "United States"), list(mean=mean, sd=sd)))

year <- c(2014, 2017,2021)
ggplot(data=transpose_f, aes(x=year, y=India, group=1)) +
  geom_line()+
  geom_point()

setwd("/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-2")

male <- read.csv(file = "male.csv")
male <- male %>%
  filter(Country.Name == "Brazil" | Country.Name == "India" | Country.Name == "United States") 

male <- male[rel_col] %>% 
  rename("2014" = 2, "2017" = 3, "2021" = 4)

transpose_m <- data.frame(t(male[-1]))
colnames(transpose_m) <- male[, 1]

transpose_m$Brazil = as.numeric(as.character(transpose_m$Brazil)) 
transpose_m$India = as.numeric(as.character(transpose_m$India))
transpose_m$"United States" = as.numeric(as.character((transpose_m$"United States")))

head(transpose_m)

transpose_m <- rename(transpose_m, "Brazil_m" = 1, "India_m" = 2, "United_States_m" = 3)

head(transpose_m)

transpose_m <- rownames_to_column(transpose_m, var="Year") 
transpose_f <- rownames_to_column(transpose_f, var="Year")

acct_owner_by_gender <- merge(x = transpose_m, y = transpose_f, by = "Year", all.x = TRUE)
acct_owner_by_gender <- rename(acct_owner_by_gender, "United_States" = 7)
head(acct_owner_by_gender)

gfg_plot <- ggplot(acct_owner_by_gender, aes(x=year)) +  
    geom_line(aes(y = India), color = "black") +
    geom_line(aes(y = India_m), color = "red") +
    geom_line(aes(y = Brazil), color = "green") +
    geom_line(aes(y = Brazil_m), color = "blue") +
    geom_line(aes(y = United_States), color = "purple") +
    geom_line(aes(y = United_States_m), color = "violet")

Part 1: (Cleaning up the final plot) The final plot is somewhat misleading: the y-axis is titled “India”. Write down the code that will change it to percentage ownership.

gfg_plot <- gfg_plot + ylab("percentage ownership")
gfg_plot

Part 2: (Drawing Conclusions) After drawing the plot that includes how percentages change over time, use this to draw some (fairly basic) conclusions on the how the ownership percentages have been changed. For example, you can discuss whether males have more account ownership than females and whether the data suggests that account ownership percentages are on the rise.

Based on the data and the plot that was generated for how percentage ownership changes over time. We can conclude that there seems to be almost a pivot, or shift in the overall data at roughly 2017. We can dissect this by understanding the relationship between male and female percentage ownership in each country. Starting with India, we can see that from 2014 to 2017 both male and female account ownership percentages were on the rise, however after that (from 2017 to 2020 and beyond) it’s been on a decline with male ownership percentage declining at a faster rate. However, for the most part males appear to have more account ownership than females in India, until the ending of data (most recent) where they appear to be the same.

Moving on to Brazil, we can see that males have had more account ownership than females from 2014 all the way up until the current (latest) available data. We can also see that for both males and females the account ownership percentages have been on the rise. From 2014 to roughly 2017 there definitely was a rise, however, from 2017 to the latest, there was a significantly greater rise (slope) in percentage ownership over time than compared with the rise in 2014 to 2017.

Lastly, looking at the United States, we can see that the data is not as straightforward as that of India and Brazil. We can see that from 2014 to some point in early-mid 2016 that females had more account ownership than males. However, from that same early-mid 2016 point up until somewhere late in 2017, males actually had more account ownership percentages than females. We can also see that from 2014 to 2017, male account ownership percentage was on the rise, whereas female account ownership percentages were declining. However, from 2017 all the way to the current (latest) data, male account ownership percentage has been on the decline, and female account ownership percentage is on the rise.

To conclude, we can see that, in general, when considering account percentage ownership, it has been on the rise and there is a greater percentage ownership now (in the current data) when compared to that of 2014. Also, except for the United States, it appears that historically males have had greater account ownership percentages than females based upon our data of Brazil and India.

Part 3: (Cherry Picking) Is it possible to say that account percentages have been increasing if you disregard a certain year? Does this change if you focus on a particular country and gender combinations?

For the first part of the question where is asks if we can conclude that account percentages have been increasing if we disregard a certain year, this is not the case. We would need to disregard multiple years for this to happen. For example, looking at the United State’s data, we see that the male account ownership percentage has been decreasing from 2017 all the way to the current (latest) data which is past 2020. The same can been seen in the data for India’s male data, where percentage ownernship has been decreasing from 2017 to the current [latest] data as well (past 2020).

For the second question, technically yes, if we don’t consider the data for United States male, United States female (decreasing from 2014-2017), India male, then it appears the remaining data (India female, Brazil male, and Brazil female) indicates that account ownership percentages have been increasing overall. Or if we just want to focous on a particular country, then Brazil will achieve that same result of an overall increasing percentage ownership trend. We can’t do this with a gender combination (i.e. all males or females in our data set) because the data varies in each country.

Part 4:

install.packages("tidyverse")

setwd("/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-5")

primary <- read.csv("primary.csv")

# Determine that R does consider primary to be data frame
is.data.frame(primary)

head(primary)

library(tidyverse)

primary <- primary %>%
  filter(Country.Name == "Canada" | Country.Name == "China" | Country.Name == "United Kingdom" | Country.Name == "Germany" | Country.Name == "Chile")

head(primary)

colnames(primary)

rel_col <- which(colnames(primary)=="Country.Name" | colnames(primary)== "X2014..YR2014." | colnames(primary)== "X2017..YR2017." | colnames(primary) == "X2021..YR2021." )
rel_col

primary <- primary[rel_col] %>% rename("2014" = 2, "2017" = 3, "2021" = 4)
head(primary)

transpose_p <- data.frame(t(primary[-1]))
colnames(transpose_p) <- primary[, 1]
head(transpose_p)

print(sapply(transpose_p, class))

transpose_p$Canada = as.numeric(transpose_p$Canada) 
transpose_p$China = as.numeric(transpose_p$China)
transpose_p$"United Kingdom" = as.numeric(transpose_p$"United Kingdom")
transpose_p$"Germany" = as.numeric(transpose_p$"Germany")
transpose_p$"Chile" = as.numeric(transpose_p$"Chile")
head(transpose_p)

summarise_each(transpose_p, list(mean))

transpose_p %>%
  summarise(across(c(Canada, China, "United Kingdom", Germany, Chile), list(mean=mean, sd=sd)))

year <- c(2014, 2017,2021)
ggplot(data=transpose_p, aes(x=year, y=China, group=1)) +
  geom_line()+
  geom_point()

setwd("/Users/faizshaikh/Downloads/P_Data_Extract_From_World_Development_Indicators-6")

secondary <- read.csv(file = "secondary.csv")
secondary <- secondary %>%
  filter(Country.Name == "Canada" | Country.Name == "China" | Country.Name == "United Kingdom" | Country.Name == "Germany" | Country.Name == "Chile") 

secondary <- secondary[rel_col] %>% 
  rename("2014" = 2, "2017" = 3, "2021" = 4)

transpose_s <- data.frame(t(secondary[-1]))
colnames(transpose_s) <- secondary[, 1]

transpose_s$"Canada" = as.numeric(as.character(transpose_s$"Canada")) 
transpose_s$"China" = as.numeric(as.character(transpose_s$"China"))
transpose_s$"United Kingdom" = as.numeric(as.character(transpose_s$"United Kingdom"))
transpose_s$"Germany" = as.numeric(as.character(transpose_s$"Germany"))
transpose_s$"Chile" = as.numeric(as.character(transpose_s$"Chile"))

head(transpose_s)

transpose_s <- rename(transpose_s, "Canada_s" = 1, "China_s" = 2, "United_Kingdom_s" = 3, "Germany_s" = 4, "Chile_s" = 5)

head(transpose_s)

transpose_s <- rownames_to_column(transpose_s, var="Year") 
transpose_p <- rownames_to_column(transpose_p, var="Year")

acct_owner_by_education <- merge(x = transpose_s, y = transpose_p, by = "Year", all.x = TRUE)
acct_owner_by_education <- rename(acct_owner_by_education, "United_Kingdom" = 7)
head(acct_owner_by_education)


gfg_plot <- ggplot(data = transpose_p, aes(x = year)) +
  geom_line(aes(y = China, color = "China")) +
  geom_line(aes(y = Canada, color = "Canada")) +
  geom_line(aes(y = `United Kingdom`, color = "United Kingdom")) +
  geom_line(aes(y = Germany, color = "Germany")) +
  geom_line(aes(y = Chile, color = "Chile")) +
  geom_line(data = transpose_s, aes(y = China_s, color = "China_s")) +
  geom_line(data = transpose_s, aes(y = Canada_s, color = "Canada_s")) +
  geom_line(data = transpose_s, aes(y = United_Kingdom_s, color = "United Kingdom_s")) +
  geom_line(data = transpose_s, aes(y = Germany_s, color = "Germany_s")) +
  geom_line(data = transpose_s, aes(y = Chile_s, color = "Chile_s")) +
  ylab("Percentage Ownership")

gfg_plot

Now that we are using five countries, the data (and plot) certainly is more complicated. We must press the zoom button in order to fully see our plot in its appropriate scale since the countries vary drastically in their data in percentage ownership. We can once again dissect our plot country by country to truly understand it:

Starting with Canada, we can see that percentage ownership has been on the rise for secondary education, but not for primary education, which is actually on the decline. We can see that (generally) percentage ownership is greater in Canada for individuals with secondary education than for individuals with primary education.

Moving on to Chile, we can see that percentage ownership has been consistently on the rise for primary education individuals, with a greater rise from 2014 to roughly 2017. However, for secondary education, percentage ownership actually was on a decline from 2014 to roughly 2017, but has been on a rise since that point in 2017 to the current [latest] data. Also, percentage ownership has always been significantly greater for individuals in Chile with secondary education than individuals with primary education in the country.

Looking at China’s data now, we can see that percentage ownership has always been consistently on the rise for secondary education individuals (within our data sets time frame). However, for primary education, percentage ownership was on a decline from 2014 to roughly 2017, but has been on a rise (similar slope/rate to that of secondary education individuals) since that point in 2017 to the current [latest] data. Also, percentage ownership used to be greater for primary education individuals in China from early/start 2014 to roughly mid-2014, but since that point to the current [latest] data, secondary education individuals in China have had greater percentage ownership.

Next up, looking at Germany’s data, we can see that percentage ownership has always been consistently on the rise for both primary and secondary education. However, we can see that this rise stops once the percentage ownership reaches 100 (since that is the maximum). We can see that primary education percentage ownership increased much faster and reached this threshold earlier (roughly 2017) compared to secondary education percentage ownership which only reached this threshold at the latest data point. Accordingly, only from 2014 to roughly late 2015 was percentage ownership greater for secondary education individuals, and from then until right before the current data, primary education individuals have had greater percentage ownership. However, currently percentage ownership is the same among both groups.

Lastly, looking at the UK’s data, we can see that percentage ownership has always been consistently on the decline for primary education individuals until roughly 2017. From then on (to the current [latest] data) it’s been consistently on the rise for the primary education group. For secondary education individuals, the data illustrates that percentage ownership has been consistently on the rise (with the greater slope (increase) from 2014 to 2017). We can see that from 2014 to early-2016 that primary education percentage ownership was greater, however from that early-2016 point up until early-2020 secondary education individuals had greater percentage ownership. From that early-2020 point to the current [latest] data, primary education percentage ownership was once again greater than secondary education individuals.

To summarize, the data really varies by country and educational level, but I can say, in general, the trend of the data illustrates percentage ownership was on the rise within the data time frame. We can also generally conclude that secondary education individuals tend to have greater percentage ownership than primary education individuals.

LS0tCnRpdGxlOiAiUHJvamVjdCAjMSAtIEZhaXogU2hhaWtoIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMiKQoKZmVtYWxlIDwtIHJlYWQuY3N2KCJmZW1hbGUuY3N2IikKCiMgRGV0ZXJtaW5lIHRoYXQgUiBkb2VzIGNvbnNpZGVyIGZlbWFsZSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUoZmVtYWxlKQoKaGVhZChmZW1hbGUpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmZlbWFsZSA8LSBmZW1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikKCmhlYWQoZmVtYWxlKQoKY29sbmFtZXMoZmVtYWxlKQoKcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0iQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhmZW1hbGUpID09ICJYMjAyMS4uWVIyMDIxLiIgKQpyZWxfY29sCgpmZW1hbGUgPC0gZmVtYWxlW3JlbF9jb2xdICU+JSByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKaGVhZChmZW1hbGUpCgp0cmFuc3Bvc2VfZiA8LSBkYXRhLmZyYW1lKHQoZmVtYWxlWy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQpoZWFkKHRyYW5zcG9zZV9mKQoKcHJpbnQoc2FwcGx5KHRyYW5zcG9zZV9mLCBjbGFzcykpCgp0cmFuc3Bvc2VfZiRCcmF6aWwgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJEJyYXppbCkgCnRyYW5zcG9zZV9mJEluZGlhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRJbmRpYSkKdHJhbnNwb3NlX2YkIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIpCmhlYWQodHJhbnNwb3NlX2YpCgpzdW1tYXJpc2VfZWFjaCh0cmFuc3Bvc2VfZiwgbGlzdChtZWFuKSkKCnRyYW5zcG9zZV9mICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoYyhCcmF6aWwsIEluZGlhLCAiVW5pdGVkIFN0YXRlcyIpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtMiIpCgptYWxlIDwtIHJlYWQuY3N2KGZpbGUgPSAibWFsZS5jc3YiKQptYWxlIDwtIG1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikgCgptYWxlIDwtIG1hbGVbcmVsX2NvbF0gJT4lIAogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQoKdHJhbnNwb3NlX20gPC0gZGF0YS5mcmFtZSh0KG1hbGVbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX20pIDwtIG1hbGVbLCAxXQoKdHJhbnNwb3NlX20kQnJhemlsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kQnJhemlsKSkgCnRyYW5zcG9zZV9tJEluZGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kSW5kaWEpKQp0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX20kIlVuaXRlZCBTdGF0ZXMiKSkpCgpoZWFkKHRyYW5zcG9zZV9tKQoKdHJhbnNwb3NlX20gPC0gcmVuYW1lKHRyYW5zcG9zZV9tLCAiQnJhemlsX20iID0gMSwgIkluZGlhX20iID0gMiwgIlVuaXRlZF9TdGF0ZXNfbSIgPSAzKQoKaGVhZCh0cmFuc3Bvc2VfbSkKCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZ2VuZGVyIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfbSwgeSA9IHRyYW5zcG9zZV9mLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpCgpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICAKICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYV9tKSwgY29sb3IgPSAicmVkIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfU3RhdGVzKSwgY29sb3IgPSAicHVycGxlIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikKYGBgCgojIFBhcnQgMTogKENsZWFuaW5nIHVwIHRoZSBmaW5hbCBwbG90KSBUaGUgZmluYWwgcGxvdCBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgeS1heGlzIGlzIHRpdGxlZCAiSW5kaWEiLiBXcml0ZSBkb3duIHRoZSBjb2RlIHRoYXQgd2lsbCBjaGFuZ2UgaXQgdG8gcGVyY2VudGFnZSBvd25lcnNoaXAuCmBgYHtyfQpnZmdfcGxvdCA8LSBnZmdfcGxvdCArIHlsYWIoInBlcmNlbnRhZ2Ugb3duZXJzaGlwIikKZ2ZnX3Bsb3QKYGBgCgoKICAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3Rfb3JpZy5wbmcpCgojIFBhcnQgMjogKERyYXdpbmcgQ29uY2x1c2lvbnMpIEFmdGVyIGRyYXdpbmcgdGhlIHBsb3QgdGhhdCBpbmNsdWRlcyBob3cgcGVyY2VudGFnZXMgY2hhbmdlIG92ZXIgdGltZSwgdXNlIHRoaXMgdG8gZHJhdyBzb21lIChmYWlybHkgYmFzaWMpIGNvbmNsdXNpb25zIG9uIHRoZSBob3cgdGhlIG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gY2hhbmdlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gZGlzY3VzcyB3aGV0aGVyIG1hbGVzIGhhdmUgbW9yZSBhY2NvdW50IG93bmVyc2hpcCB0aGFuIGZlbWFsZXMgYW5kIHdoZXRoZXIgdGhlIGRhdGEgc3VnZ2VzdHMgdGhhdCBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBhcmUgb24gdGhlIHJpc2UuCgpCYXNlZCBvbiB0aGUgZGF0YSBhbmQgdGhlIHBsb3QgdGhhdCB3YXMgZ2VuZXJhdGVkIGZvciBob3cgcGVyY2VudGFnZSBvd25lcnNoaXAgY2hhbmdlcyBvdmVyIHRpbWUuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIHNlZW1zIHRvIGJlIGFsbW9zdCBhIHBpdm90LCBvciBzaGlmdCBpbiB0aGUgb3ZlcmFsbCBkYXRhIGF0IHJvdWdobHkgMjAxNy4gV2UgY2FuIGRpc3NlY3QgdGhpcyBieSB1bmRlcnN0YW5kaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbGUgcGVyY2VudGFnZSBvd25lcnNoaXAgaW4gZWFjaCBjb3VudHJ5LiBTdGFydGluZyB3aXRoIEluZGlhLCB3ZSBjYW4gc2VlIHRoYXQgZnJvbSAyMDE0IHRvIDIwMTcgYm90aCBtYWxlIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBvbiB0aGUgcmlzZSwgaG93ZXZlciBhZnRlciB0aGF0IChmcm9tIDIwMTcgdG8gMjAyMCBhbmQgYmV5b25kKSBpdCdzIGJlZW4gb24gYSBkZWNsaW5lIHdpdGggbWFsZSBvd25lcnNoaXAgcGVyY2VudGFnZSBkZWNsaW5pbmcgYXQgYSBmYXN0ZXIgcmF0ZS4gSG93ZXZlciwgZm9yIHRoZSBtb3N0IHBhcnQgbWFsZXMgYXBwZWFyIHRvIGhhdmUgbW9yZSBhY2NvdW50IG93bmVyc2hpcCB0aGFuIGZlbWFsZXMgaW4gSW5kaWEsIHVudGlsIHRoZSBlbmRpbmcgb2YgZGF0YSAobW9zdCByZWNlbnQpIHdoZXJlIHRoZXkgYXBwZWFyIHRvIGJlIHRoZSBzYW1lLgoKTW92aW5nIG9uIHRvIEJyYXppbCwgd2UgY2FuIHNlZSB0aGF0IG1hbGVzIGhhdmUgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBmZW1hbGVzIGZyb20gMjAxNCBhbGwgdGhlIHdheSB1cCB1bnRpbCB0aGUgY3VycmVudCAobGF0ZXN0KSBhdmFpbGFibGUgZGF0YS4gV2UgY2FuIGFsc28gc2VlIHRoYXQgZm9yIGJvdGggbWFsZXMgYW5kIGZlbWFsZXMgdGhlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBvbiB0aGUgcmlzZS4gRnJvbSAyMDE0IHRvIHJvdWdobHkgMjAxNyB0aGVyZSBkZWZpbml0ZWx5IHdhcyBhIHJpc2UsIGhvd2V2ZXIsIGZyb20gMjAxNyB0byB0aGUgbGF0ZXN0LCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudGx5IGdyZWF0ZXIgcmlzZSAoc2xvcGUpIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG92ZXIgdGltZSB0aGFuIGNvbXBhcmVkIHdpdGggdGhlIHJpc2UgaW4gMjAxNCB0byAyMDE3LgoKTGFzdGx5LCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGVzLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGRhdGEgaXMgbm90IGFzIHN0cmFpZ2h0Zm9yd2FyZCBhcyB0aGF0IG9mIEluZGlhIGFuZCBCcmF6aWwuIFdlIGNhbiBzZWUgdGhhdCBmcm9tIDIwMTQgdG8gc29tZSBwb2ludCBpbiBlYXJseS1taWQgMjAxNiB0aGF0IGZlbWFsZXMgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBtYWxlcy4gSG93ZXZlciwgZnJvbSB0aGF0IHNhbWUgZWFybHktbWlkIDIwMTYgcG9pbnQgdXAgdW50aWwgc29tZXdoZXJlIGxhdGUgaW4gMjAxNywgbWFsZXMgYWN0dWFsbHkgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzLiBXZSBjYW4gYWxzbyBzZWUgdGhhdCBmcm9tIDIwMTQgdG8gMjAxNywgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIHdhcyBvbiB0aGUgcmlzZSwgd2hlcmVhcyBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBkZWNsaW5pbmcuIEhvd2V2ZXIsIGZyb20gMjAxNyBhbGwgdGhlIHdheSB0byB0aGUgY3VycmVudCAgKGxhdGVzdCkgZGF0YSwgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIG9uIHRoZSBkZWNsaW5lLCBhbmQgZmVtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2UgaXMgb24gdGhlIHJpc2UuCiAgClRvIGNvbmNsdWRlLCB3ZSBjYW4gc2VlIHRoYXQsIGluIGdlbmVyYWwsIHdoZW4gY29uc2lkZXJpbmcgYWNjb3VudCBwZXJjZW50YWdlIG93bmVyc2hpcCwgaXQgaGFzIGJlZW4gb24gdGhlIHJpc2UgYW5kIHRoZXJlIGlzIGEgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcCBub3cgKGluIHRoZSBjdXJyZW50IGRhdGEpIHdoZW4gY29tcGFyZWQgdG8gdGhhdCBvZiAyMDE0LiBBbHNvLCBleGNlcHQgZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBpdCBhcHBlYXJzIHRoYXQgaGlzdG9yaWNhbGx5IG1hbGVzIGhhdmUgaGFkIGdyZWF0ZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzIGJhc2VkIHVwb24gb3VyIGRhdGEgb2YgQnJhemlsIGFuZCBJbmRpYS4KCiMgUGFydCAzOiAoQ2hlcnJ5IFBpY2tpbmcpIElzIGl0IHBvc3NpYmxlIHRvIHNheSB0aGF0IGFjY291bnQgcGVyY2VudGFnZXMgaGF2ZSBiZWVuIGluY3JlYXNpbmcgaWYgeW91IGRpc3JlZ2FyZCBhIGNlcnRhaW4geWVhcj8gRG9lcyB0aGlzIGNoYW5nZSBpZiB5b3UgZm9jdXMgb24gYSBwYXJ0aWN1bGFyIGNvdW50cnkgYW5kIGdlbmRlciBjb21iaW5hdGlvbnM/CgpGb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHF1ZXN0aW9uIHdoZXJlIGlzIGFza3MgaWYgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB3ZSBkaXNyZWdhcmQgYSBjZXJ0YWluIHllYXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBXZSB3b3VsZCBuZWVkIHRvCmRpc3JlZ2FyZCBtdWx0aXBsZSB5ZWFycyBmb3IgdGhpcyB0byBoYXBwZW4uIEZvciBleGFtcGxlLCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGUncyBkYXRhLCB3ZSBzZWUgdGhhdCB0aGUgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZQpjdXJyZW50IChsYXRlc3QpIGRhdGEgd2hpY2ggaXMgcGFzdCAyMDIwLiBUaGUgc2FtZSBjYW4gYmVlbiBzZWVuIGluIHRoZSBkYXRhIGZvciBJbmRpYSdzIG1hbGUgZGF0YSwgd2hlcmUgcGVyY2VudGFnZSBvd25lcm5zaGlwIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IHRvIHRoZSBjdXJyZW50IFtsYXRlc3RdIGRhdGEgYXMgd2VsbCAocGFzdCAyMDIwKS4KIApGb3IgdGhlIHNlY29uZCBxdWVzdGlvbiwgdGVjaG5pY2FsbHkgeWVzLCBpZiB3ZSBkb24ndCBjb25zaWRlciB0aGUgZGF0YSBmb3IgVW5pdGVkIFN0YXRlcyBtYWxlLCBVbml0ZWQgU3RhdGVzIGZlbWFsZSAoZGVjcmVhc2luZyBmcm9tIDIwMTQtMjAxNyksIEluZGlhIG1hbGUsIHRoZW4gaXQgYXBwZWFycyB0aGUgcmVtYWluaW5nIGRhdGEgKEluZGlhIGZlbWFsZSwgQnJhemlsIG1hbGUsIGFuZCBCcmF6aWwgZmVtYWxlKSBpbmRpY2F0ZXMgdGhhdCBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBvdmVyYWxsLiBPciBpZiB3ZSBqdXN0IHdhbnQgdG8gZm9jb3VzIG9uIGEgcGFydGljdWxhciBjb3VudHJ5LCB0aGVuIEJyYXppbCB3aWxsIGFjaGlldmUgdGhhdCBzYW1lIHJlc3VsdCBvZiBhbiBvdmVyYWxsIGluY3JlYXNpbmcgcGVyY2VudGFnZSBvd25lcnNoaXAgdHJlbmQuIFdlIGNhbid0IGRvIHRoaXMgd2l0aCBhIGdlbmRlciBjb21iaW5hdGlvbiAoaS5lLiBhbGwgbWFsZXMgb3IgZmVtYWxlcyBpbiBvdXIgZGF0YSBzZXQpIGJlY2F1c2UgdGhlIGRhdGEgdmFyaWVzIGluIGVhY2ggY291bnRyeS4KICAKIyBQYXJ0IDQ6CgpgYGB7cn0KaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKCnNldHdkKCIvVXNlcnMvZmFpenNoYWlraC9Eb3dubG9hZHMvUF9EYXRhX0V4dHJhY3RfRnJvbV9Xb3JsZF9EZXZlbG9wbWVudF9JbmRpY2F0b3JzLTUiKQoKcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQoKIyBEZXRlcm1pbmUgdGhhdCBSIGRvZXMgY29uc2lkZXIgcHJpbWFyeSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUocHJpbWFyeSkKCmhlYWQocHJpbWFyeSkKCmxpYnJhcnkodGlkeXZlcnNlKQoKcHJpbWFyeSA8LSBwcmltYXJ5ICU+JQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkNhbmFkYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaW5hIiB8IENvdW50cnkuTmFtZSA9PSAiVW5pdGVkIEtpbmdkb20iIHwgQ291bnRyeS5OYW1lID09ICJHZXJtYW55IiB8IENvdW50cnkuTmFtZSA9PSAiQ2hpbGUiKQoKaGVhZChwcmltYXJ5KQoKY29sbmFtZXMocHJpbWFyeSkKCnJlbF9jb2wgPC0gd2hpY2goY29sbmFtZXMocHJpbWFyeSk9PSJDb3VudHJ5Lk5hbWUiIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMocHJpbWFyeSkgPT0gIlgyMDIxLi5ZUjIwMjEuIiApCnJlbF9jb2wKCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpCmhlYWQocHJpbWFyeSkKCnRyYW5zcG9zZV9wIDwtIGRhdGEuZnJhbWUodChwcmltYXJ5Wy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0KaGVhZCh0cmFuc3Bvc2VfcCkKCnByaW50KHNhcHBseSh0cmFuc3Bvc2VfcCwgY2xhc3MpKQoKdHJhbnNwb3NlX3AkQ2FuYWRhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCRDYW5hZGEpIAp0cmFuc3Bvc2VfcCRDaGluYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkQ2hpbmEpCnRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIpCnRyYW5zcG9zZV9wJCJHZXJtYW55IiA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkIkdlcm1hbnkiKQp0cmFuc3Bvc2VfcCQiQ2hpbGUiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCQiQ2hpbGUiKQpoZWFkKHRyYW5zcG9zZV9wKQoKc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX3AsIGxpc3QobWVhbikpCgp0cmFuc3Bvc2VfcCAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGMoQ2FuYWRhLCBDaGluYSwgIlVuaXRlZCBLaW5nZG9tIiwgR2VybWFueSwgQ2hpbGUpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9wLCBhZXMoeD15ZWFyLCB5PUNoaW5hLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtNiIpCgpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoZmlsZSA9ICJzZWNvbmRhcnkuY3N2IikKc2Vjb25kYXJ5IDwtIHNlY29uZGFyeSAlPiUKICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJDYW5hZGEiIHwgQ291bnRyeS5OYW1lID09ICJDaGluYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIlVuaXRlZCBLaW5nZG9tIiB8IENvdW50cnkuTmFtZSA9PSAiR2VybWFueSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaWxlIikgCgpzZWNvbmRhcnkgPC0gc2Vjb25kYXJ5W3JlbF9jb2xdICU+JSAKICByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKCnRyYW5zcG9zZV9zIDwtIGRhdGEuZnJhbWUodChzZWNvbmRhcnlbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX3MpIDwtIHNlY29uZGFyeVssIDFdCgp0cmFuc3Bvc2VfcyQiQ2FuYWRhIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJDYW5hZGEiKSkgCnRyYW5zcG9zZV9zJCJDaGluYSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiQ2hpbmEiKSkKdHJhbnNwb3NlX3MkIlVuaXRlZCBLaW5nZG9tIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJVbml0ZWQgS2luZ2RvbSIpKQp0cmFuc3Bvc2VfcyQiR2VybWFueSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiR2VybWFueSIpKQp0cmFuc3Bvc2VfcyQiQ2hpbGUiID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkIkNoaWxlIikpCgpoZWFkKHRyYW5zcG9zZV9zKQoKdHJhbnNwb3NlX3MgPC0gcmVuYW1lKHRyYW5zcG9zZV9zLCAiQ2FuYWRhX3MiID0gMSwgIkNoaW5hX3MiID0gMiwgIlVuaXRlZF9LaW5nZG9tX3MiID0gMywgIkdlcm1hbnlfcyIgPSA0LCAiQ2hpbGVfcyIgPSA1KQoKaGVhZCh0cmFuc3Bvc2VfcykKCnRyYW5zcG9zZV9zIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcywgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9wIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcCwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcywgeSA9IHRyYW5zcG9zZV9wLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2VkdWNhdGlvbiA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24sICJVbml0ZWRfS2luZ2RvbSIgPSA3KQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQoKCmdmZ19wbG90IDwtIGdncGxvdChkYXRhID0gdHJhbnNwb3NlX3AsIGFlcyh4ID0geWVhcikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBDaGluYSwgY29sb3IgPSAiQ2hpbmEiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IENhbmFkYSwgY29sb3IgPSAiQ2FuYWRhIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBgVW5pdGVkIEtpbmdkb21gLCBjb2xvciA9ICJVbml0ZWQgS2luZ2RvbSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gR2VybWFueSwgY29sb3IgPSAiR2VybWFueSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2hpbGUsIGNvbG9yID0gIkNoaWxlIikpICsKICBnZW9tX2xpbmUoZGF0YSA9IHRyYW5zcG9zZV9zLCBhZXMoeSA9IENoaW5hX3MsIGNvbG9yID0gIkNoaW5hX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2FuYWRhX3MsIGNvbG9yID0gIkNhbmFkYV9zIikpICsKICBnZW9tX2xpbmUoZGF0YSA9IHRyYW5zcG9zZV9zLCBhZXMoeSA9IFVuaXRlZF9LaW5nZG9tX3MsIGNvbG9yID0gIlVuaXRlZCBLaW5nZG9tX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gR2VybWFueV9zLCBjb2xvciA9ICJHZXJtYW55X3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2hpbGVfcywgY29sb3IgPSAiQ2hpbGVfcyIpKSArCiAgeWxhYigiUGVyY2VudGFnZSBPd25lcnNoaXAiKQoKZ2ZnX3Bsb3QKCmBgYAoKTm93IHRoYXQgd2UgYXJlIHVzaW5nIGZpdmUgY291bnRyaWVzLCB0aGUgZGF0YSAoYW5kIHBsb3QpIGNlcnRhaW5seSBpcyBtb3JlIGNvbXBsaWNhdGVkLiBXZSBtdXN0IHByZXNzIHRoZSB6b29tIGJ1dHRvbiBpbiBvcmRlciB0byBmdWxseSBzZWUgb3VyIHBsb3QgaW4gaXRzIGFwcHJvcHJpYXRlIHNjYWxlIHNpbmNlIHRoZSBjb3VudHJpZXMgdmFyeSBkcmFzdGljYWxseSBpbiB0aGVpciBkYXRhIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwLiBXZSBjYW4gb25jZSBhZ2FpbiBkaXNzZWN0IG91ciBwbG90IGNvdW50cnkgYnkgY291bnRyeSB0byB0cnVseSB1bmRlcnN0YW5kIGl0OgogCiAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3RfQ2FuYWRhLnBuZykKClN0YXJ0aW5nIHdpdGggQ2FuYWRhLCB3ZSBjYW4gc2VlIHRoYXQgcGVyY2VudGFnZSBvd25lcnNoaXAgaGFzIGJlZW4gb24gdGhlIHJpc2UgZm9yIHNlY29uZGFyeSBlZHVjYXRpb24sIGJ1dCBub3QgZm9yIHByaW1hcnkgZWR1Y2F0aW9uLCB3aGljaCBpcyBhY3R1YWxseSBvbiB0aGUgZGVjbGluZS4gV2UgY2FuIHNlZSB0aGF0IChnZW5lcmFsbHkpIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGlzIGdyZWF0ZXIgaW4gQ2FuYWRhIGZvciBpbmRpdmlkdWFscyB3aXRoIHNlY29uZGFyeSBlZHVjYXRpb24gdGhhbiBmb3IgaW5kaXZpZHVhbHMgd2l0aCBwcmltYXJ5IGVkdWNhdGlvbi4KIAogICFbXSgvVXNlcnMvZmFpenNoYWlraC9EZXNrdG9wL2dncGxvdF9DaGlsZS5wbmcpCiAKTW92aW5nIG9uIHRvIENoaWxlLCB3ZSBjYW4gc2VlIHRoYXQgcGVyY2VudGFnZSBvd25lcnNoaXAgaGFzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciBwcmltYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscywgd2l0aCBhIGdyZWF0ZXIgcmlzZSBmcm9tIDIwMTQgdG8gcm91Z2hseSAyMDE3LiBIb3dldmVyLCBmb3Igc2Vjb25kYXJ5IGVkdWNhdGlvbiwgcGVyY2VudGFnZSBvd25lcnNoaXAgYWN0dWFsbHkgd2FzIG9uIGEgZGVjbGluZSBmcm9tIDIwMTQgdG8gcm91Z2hseSAyMDE3LCBidXQgaGFzIGJlZW4gb24gYSByaXNlIHNpbmNlIHRoYXQgcG9pbnQgaW4gMjAxNyB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLiBBbHNvLCBwZXJjZW50YWdlIG93bmVyc2hpcCBoYXMgYWx3YXlzIGJlZW4gc2lnbmlmaWNhbnRseSBncmVhdGVyIGZvciBpbmRpdmlkdWFscyBpbiBDaGlsZSB3aXRoIHNlY29uZGFyeSBlZHVjYXRpb24gdGhhbiBpbmRpdmlkdWFscyB3aXRoIHByaW1hcnkgZWR1Y2F0aW9uIGluIHRoZSBjb3VudHJ5LgogCiAgICFbXSgvVXNlcnMvZmFpenNoYWlraC9EZXNrdG9wL2dncGxvdF9DaGluYS5wbmcpCiAgIApMb29raW5nIGF0IENoaW5hJ3MgZGF0YSBub3csIHdlIGNhbiBzZWUgdGhhdCBwZXJjZW50YWdlIG93bmVyc2hpcCBoYXMgYWx3YXlzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzICh3aXRoaW4gb3VyIGRhdGEgc2V0cyB0aW1lIGZyYW1lKS4gSG93ZXZlciwgZm9yIHByaW1hcnkgZWR1Y2F0aW9uLCBwZXJjZW50YWdlIG93bmVyc2hpcCB3YXMgb24gYSBkZWNsaW5lIGZyb20gMjAxNCB0byByb3VnaGx5IDIwMTcsIGJ1dCBoYXMgYmVlbiBvbiBhIHJpc2UgKHNpbWlsYXIgc2xvcGUvcmF0ZSB0byB0aGF0IG9mIHNlY29uZGFyeSBlZHVjYXRpb24gaW5kaXZpZHVhbHMpIHNpbmNlIHRoYXQgcG9pbnQgaW4gMjAxNyB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLiBBbHNvLCBwZXJjZW50YWdlIG93bmVyc2hpcCB1c2VkIHRvIGJlIGdyZWF0ZXIgZm9yIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGluIENoaW5hIGZyb20gZWFybHkvc3RhcnQgMjAxNCB0byByb3VnaGx5IG1pZC0yMDE0LCBidXQgc2luY2UgdGhhdCBwb2ludCB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLCBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGluIENoaW5hIGhhdmUgaGFkIGdyZWF0ZXIgcGVyY2VudGFnZSBvd25lcnNoaXAuCiAKICAgIVtdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90X0dlcm1hbnkucG5nKQogICAKTmV4dCB1cCwgbG9va2luZyBhdCBHZXJtYW55J3MgZGF0YSwgd2UgY2FuIHNlZSB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBhbHdheXMgYmVlbiBjb25zaXN0ZW50bHkgb24gdGhlIHJpc2UgZm9yIGJvdGggcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGVkdWNhdGlvbi4gSG93ZXZlciwgd2UgY2FuIHNlZSB0aGF0IHRoaXMgcmlzZSBzdG9wcyBvbmNlIHRoZSBwZXJjZW50YWdlIG93bmVyc2hpcCByZWFjaGVzIDEwMCAoc2luY2UgdGhhdCBpcyB0aGUgbWF4aW11bSkuIFdlIGNhbiBzZWUgdGhhdCBwcmltYXJ5IGVkdWNhdGlvbiBwZXJjZW50YWdlIG93bmVyc2hpcCBpbmNyZWFzZWQgbXVjaCBmYXN0ZXIgYW5kIHJlYWNoZWQgdGhpcyB0aHJlc2hvbGQgZWFybGllciAocm91Z2hseSAyMDE3KSBjb21wYXJlZCB0byBzZWNvbmRhcnkgZWR1Y2F0aW9uIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIHdoaWNoIG9ubHkgcmVhY2hlZCB0aGlzIHRocmVzaG9sZCBhdCB0aGUgbGF0ZXN0IGRhdGEgcG9pbnQuIEFjY29yZGluZ2x5LCBvbmx5IGZyb20gMjAxNCB0byByb3VnaGx5IGxhdGUgMjAxNSB3YXMgcGVyY2VudGFnZSBvd25lcnNoaXAgZ3JlYXRlciBmb3Igc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscywgYW5kIGZyb20gdGhlbiB1bnRpbCByaWdodCBiZWZvcmUgdGhlIGN1cnJlbnQgZGF0YSwgcHJpbWFyeSBlZHVjYXRpb24gaW5kaXZpZHVhbHMgaGF2ZSBoYWQgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcC4gSG93ZXZlciwgY3VycmVudGx5IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGlzIHRoZSBzYW1lIGFtb25nIGJvdGggZ3JvdXBzLgoKICAgIVtdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90X1VuaXRlZF9LaW5nZG9tLnBuZykKICAgIApMYXN0bHksIGxvb2tpbmcgYXQgdGhlIFVLJ3MgZGF0YSwgd2UgY2FuIHNlZSB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBhbHdheXMgYmVlbiBjb25zaXN0ZW50bHkgb24gdGhlIGRlY2xpbmUgZm9yIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIHVudGlsIHJvdWdobHkgMjAxNy4gRnJvbSB0aGVuIG9uICh0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhKSBpdCdzIGJlZW4gY29uc2lzdGVudGx5IG9uIHRoZSByaXNlIGZvciB0aGUgcHJpbWFyeSBlZHVjYXRpb24gZ3JvdXAuIEZvciBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzLCB0aGUgZGF0YSBpbGx1c3RyYXRlcyB0aGF0IHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGhhcyBiZWVuIGNvbnNpc3RlbnRseSBvbiB0aGUgcmlzZSAod2l0aCB0aGUgZ3JlYXRlciBzbG9wZSAoaW5jcmVhc2UpIGZyb20gMjAxNCB0byAyMDE3KS4gV2UgY2FuIHNlZSB0aGF0IGZyb20gMjAxNCB0byBlYXJseS0yMDE2IHRoYXQgcHJpbWFyeSBlZHVjYXRpb24gcGVyY2VudGFnZSBvd25lcnNoaXAgd2FzIGdyZWF0ZXIsIGhvd2V2ZXIgZnJvbSB0aGF0IGVhcmx5LTIwMTYgcG9pbnQgdXAgdW50aWwgZWFybHktMjAyMCBzZWNvbmRhcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzIGhhZCBncmVhdGVyIHBlcmNlbnRhZ2Ugb3duZXJzaGlwLiBGcm9tIHRoYXQgZWFybHktMjAyMCBwb2ludCB0byB0aGUgY3VycmVudCBbbGF0ZXN0XSBkYXRhLCBwcmltYXJ5IGVkdWNhdGlvbiBwZXJjZW50YWdlIG93bmVyc2hpcCB3YXMgb25jZSBhZ2FpbiBncmVhdGVyIHRoYW4gc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscy4KIAogICAhW10oL1VzZXJzL2ZhaXpzaGFpa2gvRGVza3RvcC9nZ3Bsb3QucG5nKQogClRvIHN1bW1hcml6ZSwgdGhlIGRhdGEgcmVhbGx5IHZhcmllcyBieSBjb3VudHJ5IGFuZCBlZHVjYXRpb25hbCBsZXZlbCwgYnV0IEkgY2FuIHNheSwgaW4gZ2VuZXJhbCwgdGhlIHRyZW5kIG9mIHRoZSBkYXRhIGlsbHVzdHJhdGVzIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIHdhcyBvbiB0aGUgcmlzZSB3aXRoaW4gdGhlIGRhdGEgdGltZSBmcmFtZS4gV2UgY2FuIGFsc28gZ2VuZXJhbGx5IGNvbmNsdWRlIHRoYXQgc2Vjb25kYXJ5IGVkdWNhdGlvbiBpbmRpdmlkdWFscyB0ZW5kIHRvIGhhdmUgZ3JlYXRlciBwZXJjZW50YWdlIG93bmVyc2hpcCB0aGFuIHByaW1hcnkgZWR1Y2F0aW9uIGluZGl2aWR1YWxzLg==