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.

print(“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.”) print(“”) print(“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 signifciantly greater rise (slope) in percentage ownership over time than compared with the rise in 2014 to 2017.”) print(“”) print(“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.”) print(“”) print(“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?

print(“”) print(“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).”) print(“”) print(“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: (Summarzing the data yourself) Do a similar analysis using the csv files: # 1: Account ownership at a financial institution or with a mobile-money-service provider, primary education or less (% of population ages 15+) # 2: Account ownership at a financial institution or with a mobile-money-service provider, secondary education or more (% of population ages 15+)

You should analyze exactly five countries. You are free to pick the countries but your choices should not include the United States, India nor Brazil. After a visual representation of the data is made, you should have a paragraph or two summarizing your conclusions. The summary should be about the length of half a page and no longer than a page.

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)

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

ggplot
ggplot

print(“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.”) print(“”) print(“We can once again dissect our plot country by country to truly understand it.”)

LS0tCnRpdGxlOiAiUHJvamVjdCAjMSAtIEZhaXogU2hhaWtoIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgppbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMiKQoKZmVtYWxlIDwtIHJlYWQuY3N2KCJmZW1hbGUuY3N2IikKCiMgRGV0ZXJtaW5lIHRoYXQgUiBkb2VzIGNvbnNpZGVyIGZlbWFsZSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUoZmVtYWxlKQoKaGVhZChmZW1hbGUpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKCmZlbWFsZSA8LSBmZW1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikKCmhlYWQoZmVtYWxlKQoKY29sbmFtZXMoZmVtYWxlKQoKcmVsX2NvbCA8LSB3aGljaChjb2xuYW1lcyhmZW1hbGUpPT0iQ291bnRyeS5OYW1lIiB8IGNvbG5hbWVzKGZlbWFsZSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMoZmVtYWxlKT09ICJYMjAxNy4uWVIyMDE3LiIgfCBjb2xuYW1lcyhmZW1hbGUpID09ICJYMjAyMS4uWVIyMDIxLiIgKQpyZWxfY29sCgpmZW1hbGUgPC0gZmVtYWxlW3JlbF9jb2xdICU+JSByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKaGVhZChmZW1hbGUpCgp0cmFuc3Bvc2VfZiA8LSBkYXRhLmZyYW1lKHQoZmVtYWxlWy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9mKSA8LSBmZW1hbGVbLCAxXQpoZWFkKHRyYW5zcG9zZV9mKQoKcHJpbnQoc2FwcGx5KHRyYW5zcG9zZV9mLCBjbGFzcykpCgp0cmFuc3Bvc2VfZiRCcmF6aWwgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9mJEJyYXppbCkgCnRyYW5zcG9zZV9mJEluZGlhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiRJbmRpYSkKdHJhbnNwb3NlX2YkIlVuaXRlZCBTdGF0ZXMiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfZiQiVW5pdGVkIFN0YXRlcyIpCmhlYWQodHJhbnNwb3NlX2YpCgpzdW1tYXJpc2VfZWFjaCh0cmFuc3Bvc2VfZiwgbGlzdChtZWFuKSkKCnRyYW5zcG9zZV9mICU+JQogIHN1bW1hcmlzZShhY3Jvc3MoYyhCcmF6aWwsIEluZGlhLCAiVW5pdGVkIFN0YXRlcyIpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9mLCBhZXMoeD15ZWFyLCB5PUluZGlhLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtMiIpCgptYWxlIDwtIHJlYWQuY3N2KGZpbGUgPSAibWFsZS5jc3YiKQptYWxlIDwtIG1hbGUgJT4lCiAgZmlsdGVyKENvdW50cnkuTmFtZSA9PSAiQnJhemlsIiB8IENvdW50cnkuTmFtZSA9PSAiSW5kaWEiIHwgQ291bnRyeS5OYW1lID09ICJVbml0ZWQgU3RhdGVzIikgCgptYWxlIDwtIG1hbGVbcmVsX2NvbF0gJT4lIAogIHJlbmFtZSgiMjAxNCIgPSAyLCAiMjAxNyIgPSAzLCAiMjAyMSIgPSA0KQoKdHJhbnNwb3NlX20gPC0gZGF0YS5mcmFtZSh0KG1hbGVbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX20pIDwtIG1hbGVbLCAxXQoKdHJhbnNwb3NlX20kQnJhemlsID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kQnJhemlsKSkgCnRyYW5zcG9zZV9tJEluZGlhID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX20kSW5kaWEpKQp0cmFuc3Bvc2VfbSQiVW5pdGVkIFN0YXRlcyIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcigodHJhbnNwb3NlX20kIlVuaXRlZCBTdGF0ZXMiKSkpCgpoZWFkKHRyYW5zcG9zZV9tKQoKdHJhbnNwb3NlX20gPC0gcmVuYW1lKHRyYW5zcG9zZV9tLCAiQnJhemlsX20iID0gMSwgIkluZGlhX20iID0gMiwgIlVuaXRlZF9TdGF0ZXNfbSIgPSAzKQoKaGVhZCh0cmFuc3Bvc2VfbSkKCnRyYW5zcG9zZV9tIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfbSwgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9mIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfZiwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZ2VuZGVyIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfbSwgeSA9IHRyYW5zcG9zZV9mLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2dlbmRlciA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9nZW5kZXIsICJVbml0ZWRfU3RhdGVzIiA9IDcpCmhlYWQoYWNjdF9vd25lcl9ieV9nZW5kZXIpCgpnZmdfcGxvdCA8LSBnZ3Bsb3QoYWNjdF9vd25lcl9ieV9nZW5kZXIsIGFlcyh4PXllYXIpKSArICAKICAgIGdlb21fbGluZShhZXMoeSA9IEluZGlhKSwgY29sb3IgPSAiYmxhY2siKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBJbmRpYV9tKSwgY29sb3IgPSAicmVkIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gQnJhemlsKSwgY29sb3IgPSAiZ3JlZW4iKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBCcmF6aWxfbSksIGNvbG9yID0gImJsdWUiKSArCiAgICBnZW9tX2xpbmUoYWVzKHkgPSBVbml0ZWRfU3RhdGVzKSwgY29sb3IgPSAicHVycGxlIikgKwogICAgZ2VvbV9saW5lKGFlcyh5ID0gVW5pdGVkX1N0YXRlc19tKSwgY29sb3IgPSAidmlvbGV0IikgCiAgICAKICAgIAojIFBhcnQgMTogKENsZWFuaW5nIHVwIHRoZSBmaW5hbCBwbG90KSBUaGUgZmluYWwgcGxvdCBpcyBzb21ld2hhdCBtaXNsZWFkaW5nOiB0aGUgeS1heGlzIGlzIHRpdGxlZCAiSW5kaWEiLiBXcml0ZSBkb3duIHRoZSBjb2RlIHRoYXQgd2lsbCBjaGFuZ2UgaXQgdG8gcGVyY2VudGFnZSBvd25lcnNoaXAuCiAgICBnZmdfcGxvdCA8LSBnZmdfcGxvdCArIHlsYWIoInBlcmNlbnRhZ2Ugb3duZXJzaGlwIikKICAgIApnZmdfcGxvdAoKCiMgUGFydCAyOiAoRHJhd2luZyBDb25jbHVzaW9ucykgQWZ0ZXIgZHJhd2luZyB0aGUgcGxvdCB0aGF0IGluY2x1ZGVzIGhvdyBwZXJjZW50YWdlcyBjaGFuZ2Ugb3ZlciB0aW1lLCB1c2UgdGhpcyB0byBkcmF3IHNvbWUgKGZhaXJseSBiYXNpYykgY29uY2x1c2lvbnMgb24gdGhlIGhvdyB0aGUgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgeW91IGNhbiBkaXNjdXNzIHdoZXRoZXIgbWFsZXMgaGF2ZSBtb3JlIGFjY291bnQgb3duZXJzaGlwIHRoYW4gZmVtYWxlcyBhbmQgd2hldGhlciB0aGUgZGF0YSBzdWdnZXN0cyB0aGF0IGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGFyZSBvbiB0aGUgcmlzZS4KCnByaW50KCJCYXNlZCBvbiB0aGUgZGF0YSBhbmQgdGhlIHBsb3QgdGhhdCB3YXMgZ2VuZXJhdGVkIGZvciBob3cgcGVyY2VudGFnZSBvd25lcnNoaXAgY2hhbmdlcyBvdmVyIHRpbWUuIFdlIGNhbiBjb25jbHVkZSB0aGF0IHRoZXJlIHNlZW1zIHRvIGJlIGFsbW9zdCBhIHBpdm90LCBvciBzaGlmdCBpbiB0aGUgb3ZlcmFsbAogZGF0YSBhdCByb3VnaGx5IDIwMTcuIFdlIGNhbiBkaXNzZWN0IHRoaXMgYnkgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIGluIGVhY2ggY291bnRyeS4gU3RhcnRpbmcgd2l0aCBJbmRpYSwgd2UgY2FuIHNlZSB0aGF0IAogZnJvbSAyMDE0IHRvIDIwMTcgYm90aCBtYWxlIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgd2VyZSBvbiB0aGUgcmlzZSwgaG93ZXZlciBhZnRlciB0aGF0IChmcm9tIDIwMTcgdG8gMjAyMCBhbmQgYmV5b25kKSBpdCdzIGJlZW4gb24gYSBkZWNsaW5lIHdpdGggbWFsZSBvd25lcnNoaXAgCiBwZXJjZW50YWdlIGRlY2xpbmluZyBhdCBhIGZhc3RlciByYXRlLiBIb3dldmVyLCBmb3IgdGhlIG1vc3QgcGFydCBtYWxlcyBhcHBlYXIgdG8gaGF2ZSBtb3JlIGFjY291bnQgb3duZXJzaGlwIHRoYW4gZmVtYWxlcyBpbiBJbmRpYSwgdW50aWwgdGhlIGVuZGluZyBvZiBkYXRhIChtb3N0IHJlY2VudCkgd2hlcmUgdGhleQogIGFwcGVhciB0byBiZSB0aGUgc2FtZS4iKQpwcmludCgiXG4iKQpwcmludCgiTW92aW5nIG9uIHRvIEJyYXppbCwgd2UgY2FuIHNlZSB0aGF0IG1hbGVzIGhhdmUgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBmZW1hbGVzIGZyb20gMjAxNCBhbGwgdGhlIHdheSB1cCB1bnRpbCB0aGUgY3VycmVudCAobGF0ZXN0KSBhdmFpbGFibGUgZGF0YS4gV2UgY2FuIGFsc28gc2VlCiB0aGF0IGZvciBib3RoIG1hbGVzIGFuZCBmZW1hbGVzIHRoZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gb24gdGhlIHJpc2UuIEZyb20gMjAxNCB0byByb3VnaGx5IDIwMTcgdGhlcmUgZGVmaW5pdGVseSB3YXMgYSByaXNlLCBob3dldmVyLCBmcm9tIDIwMTcgdG8gdGhlIGxhdGVzdCwgdGhlcmUKICB3YXMgYSBzaWduaWZjaWFudGx5IGdyZWF0ZXIgcmlzZSAoc2xvcGUpIGluIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG92ZXIgdGltZSB0aGFuIGNvbXBhcmVkIHdpdGggdGhlIHJpc2UgaW4gMjAxNCB0byAyMDE3LiIpCnByaW50KCJcbiIpCnByaW50KCJMYXN0bHksIGxvb2tpbmcgYXQgdGhlIFVuaXRlZCBTdGF0ZXMsIHdlIGNhbiBzZWUgdGhhdCB0aGUgZGF0YSBpcyBub3QgYXMgc3RyYWlnaHRmb3J3YXJkIGFzIHRoYXQgb2YgSW5kaWEgYW5kIEJyYXppbC4gV2UgY2FuIHNlZSB0aGF0IGZyb20gMjAxNCB0byBzb21lIHBvaW50IGluIGVhcmx5LW1pZCAyMDE2IHRoYXQKIGZlbWFsZXMgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgdGhhbiBtYWxlcy4gSG93ZXZlciwgZnJvbSB0aGF0IHNhbWUgZWFybHktbWlkIDIwMTYgcG9pbnQgdXAgdW50aWwgc29tZXdoZXJlIGxhdGUgaW4gMjAxNywgbWFsZXMgYWN0dWFsbHkgaGFkIG1vcmUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzLgogIFdlIGNhbiBhbHNvIHNlZSB0aGF0IGZyb20gMjAxNCB0byAyMDE3LCBtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2Ugd2FzIG9uIHRoZSByaXNlLCB3aGVyZWFzIGZlbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlcyB3ZXJlIGRlY2xpbmluZy4gSG93ZXZlciwgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZSBjdXJyZW50ICAobGF0ZXN0KSBkYXRhLCBtYWxlIGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2UgaGFzIGJlZW4gb24gdGhlIGRlY2xpbmUsIGFuZCBmZW1hbGUgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZSBpcyBvbiB0aGUgcmlzZS4iKQpwcmludCgiXG4iKQpwcmludCgiVG8gY29uY2x1ZGUsIHdlIGNhbiBzZWUgdGhhdCwgaW4gZ2VuZXJhbCwgd2hlbiBjb25zaWRlcmluZyBhY2NvdW50IHBlcmNlbnRhZ2Ugb3duZXJzaGlwLCBpdCBoYXMgYmVlbiBvbiB0aGUgcmlzZSBhbmQgdGhlcmUgaXMgYSBncmVhdGVyIHBlcmNlbnRhZ2Ugb3duZXJzaGlwIG5vdyAoaW4gdGhlIGN1cnJlbnQgZGF0YSkgd2hlbgogY29tcGFyZWQgdG8gdGhhdCBvZiAyMDE0LiBBbHNvLCBleGNlcHQgZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBpdCBhcHBlYXJzIHRoYXQgaGlzdG9yaWNhbGx5IG1hbGVzIGhhdmUgaGFkIGdyZWF0ZXIgYWNjb3VudCBvd25lcnNoaXAgcGVyY2VudGFnZXMgdGhhbiBmZW1hbGVzIGJhc2VkIHVwb24gb3VyIGRhdGEgb2YgQnJhemlsIGFuZCBJbmRpYS4iKQogCiAKIyBQYXJ0IDM6IChDaGVycnkgUGlja2luZykgSXMgaXQgcG9zc2libGUgdG8gc2F5IHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB5b3UgZGlzcmVnYXJkIGEgY2VydGFpbiB5ZWFyPyBEb2VzIHRoaXMgY2hhbmdlIGlmIHlvdSBmb2N1cyBvbiBhIHBhcnRpY3VsYXIgY291bnRyeSBhbmQgZ2VuZGVyIGNvbWJpbmF0aW9ucz8KCnByaW50KCJcbiIpCnByaW50KCJGb3IgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHF1ZXN0aW9uIHdoZXJlIGlzIGFza3MgaWYgd2UgY2FuIGNvbmNsdWRlIHRoYXQgYWNjb3VudCBwZXJjZW50YWdlcyBoYXZlIGJlZW4gaW5jcmVhc2luZyBpZiB3ZSBkaXNyZWdhcmQgYSBjZXJ0YWluIHllYXIsIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBXZSB3b3VsZCBuZWVkIHRvCmRpc3JlZ2FyZCBtdWx0aXBsZSB5ZWFycyBmb3IgdGhpcyB0byBoYXBwZW4uIEZvciBleGFtcGxlLCBsb29raW5nIGF0IHRoZSBVbml0ZWQgU3RhdGUncyBkYXRhLCB3ZSBzZWUgdGhhdCB0aGUgbWFsZSBhY2NvdW50IG93bmVyc2hpcCBwZXJjZW50YWdlIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IGFsbCB0aGUgd2F5IHRvIHRoZQpjdXJyZW50IChsYXRlc3QpIGRhdGEgd2hpY2ggaXMgcGFzdCAyMDIwLiBUaGUgc2FtZSBjYW4gYmVlbiBzZWVuIGluIHRoZSBkYXRhIGZvciBJbmRpYSdzIG1hbGUgZGF0YSwgd2hlcmUgcGVyY2VudGFnZSBvd25lcm5zaGlwIGhhcyBiZWVuIGRlY3JlYXNpbmcgZnJvbSAyMDE3IHRvIHRoZSBjdXJyZW50IFtsYXRlc3RdIGRhdGEgYXMKIHdlbGwgKHBhc3QgMjAyMCkuIikKIHByaW50KCJcbiIpCiBwcmludCgiVGVjaG5pY2FsbHkgeWVzLCBpZiB3ZSBkb24ndCBjb25zaWRlciB0aGUgZGF0YSBmb3IgVW5pdGVkIFN0YXRlcyBtYWxlLCBVbml0ZWQgU3RhdGVzIGZlbWFsZSAoZGVjcmVhc2luZyBmcm9tIDIwMTQtMjAxNyksIEluZGlhIG1hbGUsIHRoZW4gaXQgYXBwZWFycyB0aGUgcmVtYWluaW5nIGRhdGEKICAoSW5kaWEgZmVtYWxlLCBCcmF6aWwgbWFsZSwgYW5kIEJyYXppbCBmZW1hbGUpIGluZGljYXRlcyB0aGF0IGFjY291bnQgb3duZXJzaGlwIHBlcmNlbnRhZ2VzIGhhdmUgYmVlbiBpbmNyZWFzaW5nIG92ZXJhbGwuIE9yIGlmIHdlIGp1c3Qgd2FudCB0byBmb2NvdXMgb24gYSBwYXJ0aWN1bGFyIGNvdW50cnksIHRoZW4gQnJhemlsCiAgIHdpbGwgYWNoaWV2ZSB0aGF0IHNhbWUgcmVzdWx0IG9mIGFuIG92ZXJhbGwgaW5jcmVhc2luZyBwZXJjZW50YWdlIG93bmVyc2hpcCB0cmVuZC4gV2UgY2FuJ3QgZG8gdGhpcyB3aXRoIGEgZ2VuZGVyIGNvbWJpbmF0aW9uIChpLmUuIGFsbCBtYWxlcyBvciBmZW1hbGVzIGluIG91ciBkYXRhIHNldCkgYmVjYXVzZSB0aGUgZGF0YSAKICAgdmFyaWVzIGluIGVhY2ggY291bnRyeS4iKQogIAogIAogICNQYXJ0IDQ6IChTdW1tYXJ6aW5nIHRoZSBkYXRhIHlvdXJzZWxmKSBEbyBhIHNpbWlsYXIgYW5hbHlzaXMgdXNpbmcgdGhlIGNzdiBmaWxlczoKIyAxOiBBY2NvdW50IG93bmVyc2hpcCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB3aXRoIGEgbW9iaWxlLW1vbmV5LXNlcnZpY2UgcHJvdmlkZXIsIHByaW1hcnkgZWR1Y2F0aW9uIG9yIGxlc3MgKCUgb2YgcG9wdWxhdGlvbiBhZ2VzIDE1KykKIyAyOiBBY2NvdW50IG93bmVyc2hpcCBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB3aXRoIGEgbW9iaWxlLW1vbmV5LXNlcnZpY2UgcHJvdmlkZXIsIHNlY29uZGFyeSBlZHVjYXRpb24gb3IgbW9yZSAoJSBvZiBwb3B1bGF0aW9uIGFnZXMgMTUrKQoKIyBZb3Ugc2hvdWxkIGFuYWx5emUgZXhhY3RseSBmaXZlIGNvdW50cmllcy4gWW91IGFyZSBmcmVlIHRvIHBpY2sgdGhlIGNvdW50cmllcyBidXQgeW91ciBjaG9pY2VzIHNob3VsZCBub3QgaW5jbHVkZSB0aGUgVW5pdGVkIFN0YXRlcywgSW5kaWEgbm9yIEJyYXppbC4gQWZ0ZXIgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEgaXMgbWFkZSwgeW91IHNob3VsZCBoYXZlIGEgcGFyYWdyYXBoIG9yIHR3byBzdW1tYXJpemluZyB5b3VyIGNvbmNsdXNpb25zLiBUaGUgc3VtbWFyeSBzaG91bGQgYmUgYWJvdXQgdGhlIGxlbmd0aCBvZiBoYWxmIGEgcGFnZSBhbmQgbm8gbG9uZ2VyIHRoYW4gYSBwYWdlLgoKaW5zdGFsbC5wYWNrYWdlcygidGlkeXZlcnNlIikKCnNldHdkKCIvVXNlcnMvZmFpenNoYWlraC9Eb3dubG9hZHMvUF9EYXRhX0V4dHJhY3RfRnJvbV9Xb3JsZF9EZXZlbG9wbWVudF9JbmRpY2F0b3JzLTUiKQoKcHJpbWFyeSA8LSByZWFkLmNzdigicHJpbWFyeS5jc3YiKQoKIyBEZXRlcm1pbmUgdGhhdCBSIGRvZXMgY29uc2lkZXIgcHJpbWFyeSB0byBiZSBkYXRhIGZyYW1lCmlzLmRhdGEuZnJhbWUocHJpbWFyeSkKCmhlYWQocHJpbWFyeSkKCmxpYnJhcnkodGlkeXZlcnNlKQoKcHJpbWFyeSA8LSBwcmltYXJ5ICU+JQogIGZpbHRlcihDb3VudHJ5Lk5hbWUgPT0gIkNhbmFkYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaW5hIiB8IENvdW50cnkuTmFtZSA9PSAiVW5pdGVkIEtpbmdkb20iIHwgQ291bnRyeS5OYW1lID09ICJHZXJtYW55IiB8IENvdW50cnkuTmFtZSA9PSAiQ2hpbGUiKQoKaGVhZChwcmltYXJ5KQoKY29sbmFtZXMocHJpbWFyeSkKCnJlbF9jb2wgPC0gd2hpY2goY29sbmFtZXMocHJpbWFyeSk9PSJDb3VudHJ5Lk5hbWUiIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTQuLllSMjAxNC4iIHwgY29sbmFtZXMocHJpbWFyeSk9PSAiWDIwMTcuLllSMjAxNy4iIHwgY29sbmFtZXMocHJpbWFyeSkgPT0gIlgyMDIxLi5ZUjIwMjEuIiApCnJlbF9jb2wKCnByaW1hcnkgPC0gcHJpbWFyeVtyZWxfY29sXSAlPiUgcmVuYW1lKCIyMDE0IiA9IDIsICIyMDE3IiA9IDMsICIyMDIxIiA9IDQpCmhlYWQocHJpbWFyeSkKCnRyYW5zcG9zZV9wIDwtIGRhdGEuZnJhbWUodChwcmltYXJ5Wy0xXSkpCmNvbG5hbWVzKHRyYW5zcG9zZV9wKSA8LSBwcmltYXJ5WywgMV0KaGVhZCh0cmFuc3Bvc2VfcCkKCnByaW50KHNhcHBseSh0cmFuc3Bvc2VfcCwgY2xhc3MpKQoKdHJhbnNwb3NlX3AkQ2FuYWRhID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCRDYW5hZGEpIAp0cmFuc3Bvc2VfcCRDaGluYSA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkQ2hpbmEpCnRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIgPSBhcy5udW1lcmljKHRyYW5zcG9zZV9wJCJVbml0ZWQgS2luZ2RvbSIpCnRyYW5zcG9zZV9wJCJHZXJtYW55IiA9IGFzLm51bWVyaWModHJhbnNwb3NlX3AkIkdlcm1hbnkiKQp0cmFuc3Bvc2VfcCQiQ2hpbGUiID0gYXMubnVtZXJpYyh0cmFuc3Bvc2VfcCQiQ2hpbGUiKQpoZWFkKHRyYW5zcG9zZV9wKQoKc3VtbWFyaXNlX2VhY2godHJhbnNwb3NlX3AsIGxpc3QobWVhbikpCgp0cmFuc3Bvc2VfcCAlPiUKICBzdW1tYXJpc2UoYWNyb3NzKGMoQ2FuYWRhLCBDaGluYSwgIlVuaXRlZCBLaW5nZG9tIiwgR2VybWFueSwgQ2hpbGUpLCBsaXN0KG1lYW49bWVhbiwgc2Q9c2QpKSkKCnllYXIgPC0gYygyMDE0LCAyMDE3LDIwMjEpCmdncGxvdChkYXRhPXRyYW5zcG9zZV9wLCBhZXMoeD15ZWFyLCB5PUNoaW5hLCBncm91cD0xKSkgKwogIGdlb21fbGluZSgpKwogIGdlb21fcG9pbnQoKQoKc2V0d2QoIi9Vc2Vycy9mYWl6c2hhaWtoL0Rvd25sb2Fkcy9QX0RhdGFfRXh0cmFjdF9Gcm9tX1dvcmxkX0RldmVsb3BtZW50X0luZGljYXRvcnMtNiIpCgpzZWNvbmRhcnkgPC0gcmVhZC5jc3YoZmlsZSA9ICJzZWNvbmRhcnkuY3N2IikKc2Vjb25kYXJ5IDwtIHNlY29uZGFyeSAlPiUKICBmaWx0ZXIoQ291bnRyeS5OYW1lID09ICJDYW5hZGEiIHwgQ291bnRyeS5OYW1lID09ICJDaGluYSIgfCBDb3VudHJ5Lk5hbWUgPT0gIlVuaXRlZCBLaW5nZG9tIiB8IENvdW50cnkuTmFtZSA9PSAiR2VybWFueSIgfCBDb3VudHJ5Lk5hbWUgPT0gIkNoaWxlIikgCgpzZWNvbmRhcnkgPC0gc2Vjb25kYXJ5W3JlbF9jb2xdICU+JSAKICByZW5hbWUoIjIwMTQiID0gMiwgIjIwMTciID0gMywgIjIwMjEiID0gNCkKCnRyYW5zcG9zZV9zIDwtIGRhdGEuZnJhbWUodChzZWNvbmRhcnlbLTFdKSkKY29sbmFtZXModHJhbnNwb3NlX3MpIDwtIHNlY29uZGFyeVssIDFdCgp0cmFuc3Bvc2VfcyQiQ2FuYWRhIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJDYW5hZGEiKSkgCnRyYW5zcG9zZV9zJCJDaGluYSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiQ2hpbmEiKSkKdHJhbnNwb3NlX3MkIlVuaXRlZCBLaW5nZG9tIiA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHRyYW5zcG9zZV9zJCJVbml0ZWQgS2luZ2RvbSIpKQp0cmFuc3Bvc2VfcyQiR2VybWFueSIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcih0cmFuc3Bvc2VfcyQiR2VybWFueSIpKQp0cmFuc3Bvc2VfcyQiQ2hpbGUiID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIodHJhbnNwb3NlX3MkIkNoaWxlIikpCgpoZWFkKHRyYW5zcG9zZV9zKQoKdHJhbnNwb3NlX3MgPC0gcmVuYW1lKHRyYW5zcG9zZV9zLCAiQ2FuYWRhX3MiID0gMSwgIkNoaW5hX3MiID0gMiwgIlVuaXRlZF9LaW5nZG9tX3MiID0gMywgIkdlcm1hbnlfcyIgPSA0LCAiQ2hpbGVfcyIgPSA1KQoKaGVhZCh0cmFuc3Bvc2VfcykKCnRyYW5zcG9zZV9zIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcywgdmFyPSJZZWFyIikgCnRyYW5zcG9zZV9wIDwtIHJvd25hbWVzX3RvX2NvbHVtbih0cmFuc3Bvc2VfcCwgdmFyPSJZZWFyIikKCmFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uIDwtIG1lcmdlKHggPSB0cmFuc3Bvc2VfcywgeSA9IHRyYW5zcG9zZV9wLCBieSA9ICJZZWFyIiwgYWxsLnggPSBUUlVFKQphY2N0X293bmVyX2J5X2VkdWNhdGlvbiA8LSByZW5hbWUoYWNjdF9vd25lcl9ieV9lZHVjYXRpb24sICJVbml0ZWRfS2luZ2RvbSIgPSA3KQpoZWFkKGFjY3Rfb3duZXJfYnlfZWR1Y2F0aW9uKQoKZ2dwbG90KGRhdGEgPSB0cmFuc3Bvc2VfcCwgYWVzKHggPSB5ZWFyKSkgKwogIGdlb21fbGluZShhZXMoeSA9IENoaW5hLCBjb2xvciA9ICJDaGluYSIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gQ2FuYWRhLCBjb2xvciA9ICJDYW5hZGEiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGBVbml0ZWQgS2luZ2RvbWAsIGNvbG9yID0gIlVuaXRlZCBLaW5nZG9tIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBHZXJtYW55LCBjb2xvciA9ICJHZXJtYW55IikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBDaGlsZSwgY29sb3IgPSAiQ2hpbGUiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gQ2hpbmFfcywgY29sb3IgPSAiQ2hpbmFfcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBDYW5hZGFfcywgY29sb3IgPSAiQ2FuYWRhX3MiKSkgKwogIGdlb21fbGluZShkYXRhID0gdHJhbnNwb3NlX3MsIGFlcyh5ID0gVW5pdGVkX0tpbmdkb21fcywgY29sb3IgPSAiVW5pdGVkIEtpbmdkb21fcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBHZXJtYW55X3MsIGNvbG9yID0gIkdlcm1hbnlfcyIpKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB0cmFuc3Bvc2VfcywgYWVzKHkgPSBDaGlsZV9zLCBjb2xvciA9ICJDaGlsZV9zIikpCiAgCiAgeWxhYigiUGVyY2VudGFnZSBPd25lcnNoaXAiKQoKICAgIApnZmdfcGxvdAoKIVtnZ3Bsb3RdKC9Vc2Vycy9mYWl6c2hhaWtoL0Rlc2t0b3AvZ2dwbG90LnBuZykKCnByaW50KCJOb3cgdGhhdCB3ZSBhcmUgdXNpbmcgZml2ZSBjb3VudHJpZXMsIHRoZSBkYXRhIChhbmQgcGxvdCkgY2VydGFpbmx5IGlzIG1vcmUgY29tcGxpY2F0ZWQuIFdlIG11c3QgcHJlc3MgdGhlICJ6b29tIiBidXR0b24gaW4gb3JkZXIgdG8KIGZ1bGx5IHNlZSBvdXIgcGxvdCBpbiBpdHMgYXBwcm9wcmlhdGUgc2NhbGUgc2luY2UgdGhlIGNvdW50cmllcyB2YXJ5IGRyYXN0aWNhbGx5IGluIHRoZWlyIGRhdGEgaW4gcGVyY2VudGFnZSBvd25lcnNoaXAuIikKIHByaW50KCJcbiIpCiBwcmludCgiV2UgY2FuIG9uY2UgYWdhaW4gZGlzc2VjdCBvdXIgcGxvdCBjb3VudHJ5IGJ5IGNvdW50cnkgdG8gdHJ1bHkgdW5kZXJzdGFuZCBpdC4iKQ==