Clean the data
#Clean variable names
ipeds_two <- clean_names(ipeds_two)
#Rename Variables names
ipeds_rename <- ipeds_two %>%
rename(
total_enrollment = 3,
total_bachelors_4 = 4,
total_bachelors_6 = 5,
race_unknown_men = 6,
race_unknown_women = 7,
Male = 8,
Female = 9,
hispanic_men = 10,
hispanic_women = 11,
aian_men = 12,
aian_women = 13,
asian_men = 14,
asian_women = 15,
black_men = 16,
black_women = 17,
nhpi_men = 18,
nhpi_women = 19,
white_men = 20,
white_women = 21,
multi_men = 22,
multi_women = 23) %>%
select(-24)
Wrangle the Data
Prepare Data for Graduation Rate Visualization
#Prepare data for visualization Graduate rate
ipeds_grad_overall <- ipeds_rename %>%
select(2:5)
ipeds_grad_overall <- ipeds_grad_overall %>%
mutate(graduation_four_rate = round(total_bachelors_4/total_enrollment,2),
graduation_six_rate = round(total_bachelors_6/total_enrollment,2),
perc_four_rate = paste0(sprintf("%4.1f", total_bachelors_4 / total_enrollment * 100), "%"),
perc_six_rate = paste0(sprintf("%4.1f", total_bachelors_6 / total_enrollment * 100), "%"))
Prepare Data for Disaggregation
#Prepare data to visualize by Gender
ipeds_gender <- ipeds_rename %>%
pivot_longer(cols = Male:Female, names_to = "sex", values_to = "total_enrolled") %>%
select(-(race_unknown_men:multi_women)) %>%
mutate(graduation_four_rate = round(total_bachelors_4/total_enrollment,4),
graduation_six_rate = round(total_bachelors_6/total_enrollment,4),
perc_four_rate = paste0(sprintf("%4.1f", total_bachelors_4 / total_enrollment * 100), "%"),
perc_six_rate = paste0(sprintf("%4.1f", total_bachelors_6 / total_enrollment * 100), "%")) %>%
rename(Graduation = total_enrolled) %>%
select(-(graduation_four_rate:perc_six_rate)) %>%
select(-total_bachelors_4, -total_bachelors_6) %>%
mutate(Graduation_perc = round(Graduation/total_enrollment,4),
perc_rate = paste0(sprintf("%4.1f", Graduation/total_enrollment * 100), "%"))
Visualize the Data
4-year Graduation Rate
#Visualize 4- year Graduate rate
ipeds_grad_overall %>%
mutate(highlight = ifelse(institution_name == "University of Washington-Seattle Campus", T, F)) %>%
ggplot(aes(x = reorder(institution_name, graduation_four_rate), y = graduation_four_rate)) +
geom_col(aes(fill = highlight)) +
scale_fill_manual(values = c("grey60", "#4b2e83")) +
coord_flip() +
labs(title = "4-year Graduation Rate",
subtitle = "For Far West Public Research Institutions",
x = "",
y = "",
fill= "Institution Name",
caption = "Data provided by Integrated Postsecondary Education Data System") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = perc_four_rate), hjust = 1, nudge_x = .1, color = "white", fontface = "bold" ) +
scale_y_continuous(labels = scales::percent)
6-Year Graduation Rate
# Visualize 6 year graduation rate
ipeds_grad_overall %>%
mutate(highlight = ifelse(institution_name == "University of Washington-Seattle Campus", T, F)) %>%
ggplot(aes(x = reorder(institution_name, graduation_six_rate), y = graduation_six_rate)) +
geom_col(aes(fill = highlight)) +
scale_fill_manual(values = c("grey60", "#4b2e83")) +
coord_flip() +
labs(title = "6-year Graduation Rate",
subtitle = "For Far West Public Research Institutions",
x = "",
y = "",
fill= "Institution Name",
caption = "Data provided by Integrated Postsecondary Education Data System") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = perc_six_rate), hjust = 1, nudge_x = .1, color = "white", fontface = "bold" ) +
scale_y_continuous(labels = scales::percent)
Female Graduation Rate
#Female Visualization
ipeds_gender %>%
filter(sex == "Female") %>%
mutate(highlight = ifelse(institution_name == "University of Washington-Seattle Campus", T, F)) %>%
ggplot(aes(x = reorder(institution_name, Graduation_perc), y = Graduation_perc)) +
geom_col(aes(fill = highlight)) +
scale_fill_manual(values = c("grey60", "#4b2e83")) +
coord_flip() +
labs(title = "Female Graduation Rate",
subtitle = "For Far West Public Research Institutions",
x = "",
y = "",
fill= "Institution Name",
caption = "Data provided by Integrated Postsecondary Education Data System") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = perc_rate), hjust = 1, nudge_x = .1, color = "white", fontface = "bold" ) +
scale_y_continuous(labels = scales::percent)
Male Graduation Rate
#Male Visualization
ipeds_gender %>%
filter(sex == "Male") %>%
mutate(highlight = ifelse(institution_name == "University of Washington-Seattle Campus", T, F)) %>%
ggplot(aes(x = reorder(institution_name, Graduation_perc), y = Graduation_perc)) +
geom_col(aes(fill = highlight)) +
scale_fill_manual(values = c("grey60", "#4b2e83")) +
coord_flip() +
labs(title = "Male Graduation Rate",
subtitle = "For Far West Public Research Institutions",
x = "",
y = "",
fill= "Institution Name",
caption = "Data provided by Integrated Postsecondary Education Data System") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = perc_rate), hjust = 1, nudge_x = .1, color = "white", fontface = "bold" ) +
scale_y_continuous(labels = scales::percent)
Facet Wrap of Female and Male Graduation Rate
ipeds_gender %>%
mutate(highlight = ifelse(institution_name == "University of Washington-Seattle Campus", T, F)) %>%
ggplot(aes(x = reorder(institution_name, Graduation_perc), y = Graduation_perc)) +
geom_col(aes(fill = highlight)) +
scale_fill_manual(values = c("grey60", "#4b2e83")) +
coord_flip() +
labs(title = "Graduation Rate",
subtitle = "For Far West Public Research Institutions",
x = "",
y = "",
fill= "Institution Name",
caption = "Data provided by Integrated Postsecondary Education Data System") +
theme_minimal() +
theme(axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.ticks.y = element_blank(),
legend.position = "none",
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()) +
geom_text(aes(label = perc_rate), hjust = 1, nudge_x = .1, color = "white", fontface = "bold" ) +
scale_y_continuous(labels = scales::percent) +
facet_wrap(~sex)
LS0tCnRpdGxlOiAiSURBIFIgTm90ZWJvb2siCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KLS0tCnRpdGxlOiAiVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uIEdyYWR1YXRpb24gUmF0ZSIKYXV0aG9yOiAiSmFtZXMgTGFtYXIgRm9zdGVyIgpkYXRlOiAiQXVndXN0IDIwLCAyMDIxIgpvdXRwdXQ6IAp0dWZ0ZTo6IHR1ZnRlX2h0bWwKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyfQojIFBhY2thZ2VzIGZvciBjbGVhbmluZywgd3JhbmdsaW5nLCBhbmQgdmlzdWFsaXppbmcKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShzY2FsZXMpCmBgYAoKIyBSZWFkIGluIHRoZSBkYXRhIApgYGB7cn0KaXBlZHNfdHdvIDwtIHJlYWRfY3N2KCJpcGVkc19maW5hbC5jc3YiKQpgYGAKIyBFeGFtaW5lIHRoZSBkYXRhIApgYGB7cn0KaGVhZChpcGVkcykKYGBgCiMgQ2xlYW4gdGhlIGRhdGEgCmBgYHtyfQojQ2xlYW4gdmFyaWFibGUgbmFtZXMgCmlwZWRzX3R3byA8LSBjbGVhbl9uYW1lcyhpcGVkc190d28pCgojUmVuYW1lIFZhcmlhYmxlcyBuYW1lcyAKCmlwZWRzX3JlbmFtZSA8LSBpcGVkc190d28gJT4lIAogIHJlbmFtZSgKICAgIHRvdGFsX2Vucm9sbG1lbnQgPSAzLAogICAgdG90YWxfYmFjaGVsb3JzXzQgPSA0LCAKICAgIHRvdGFsX2JhY2hlbG9yc182ID0gNSwKICAgIHJhY2VfdW5rbm93bl9tZW4gPSA2LCAKICAgIHJhY2VfdW5rbm93bl93b21lbiA9IDcsIAogICAgTWFsZSA9IDgsIAogICAgRmVtYWxlID0gOSwgCiAgICBoaXNwYW5pY19tZW4gPSAxMCwgCiAgICBoaXNwYW5pY193b21lbiA9IDExLCAKICAgIGFpYW5fbWVuID0gMTIsIAogICAgYWlhbl93b21lbiA9IDEzLCAKICAgIGFzaWFuX21lbiA9IDE0LCAKICAgIGFzaWFuX3dvbWVuID0gMTUsIAogICAgYmxhY2tfbWVuID0gMTYsIAogICAgYmxhY2tfd29tZW4gPSAxNywgCiAgICBuaHBpX21lbiA9IDE4LCAKICAgIG5ocGlfd29tZW4gPSAxOSwgCiAgICB3aGl0ZV9tZW4gPSAyMCwgCiAgICB3aGl0ZV93b21lbiA9IDIxLCAKICAgIG11bHRpX21lbiA9IDIyLCAKICAgIG11bHRpX3dvbWVuID0gMjMpICU+JSAKICBzZWxlY3QoLTI0KQpgYGAKIyBXcmFuZ2xlIHRoZSBEYXRhIAoKIyMgUHJlcGFyZSBEYXRhIGZvciBHcmFkdWF0aW9uIFJhdGUgVmlzdWFsaXphdGlvbiAKYGBge3J9CiNQcmVwYXJlIGRhdGEgZm9yIHZpc3VhbGl6YXRpb24gR3JhZHVhdGUgcmF0ZSAKaXBlZHNfZ3JhZF9vdmVyYWxsIDwtIGlwZWRzX3JlbmFtZSAlPiUgCiAgc2VsZWN0KDI6NSkKCmlwZWRzX2dyYWRfb3ZlcmFsbCA8LSBpcGVkc19ncmFkX292ZXJhbGwgJT4lIAogIG11dGF0ZShncmFkdWF0aW9uX2ZvdXJfcmF0ZSA9IHJvdW5kKHRvdGFsX2JhY2hlbG9yc180L3RvdGFsX2Vucm9sbG1lbnQsMiksCiAgICAgICAgIGdyYWR1YXRpb25fc2l4X3JhdGUgPSByb3VuZCh0b3RhbF9iYWNoZWxvcnNfNi90b3RhbF9lbnJvbGxtZW50LDIpLAogICAgICAgICBwZXJjX2ZvdXJfcmF0ZSA9IHBhc3RlMChzcHJpbnRmKCIlNC4xZiIsIHRvdGFsX2JhY2hlbG9yc180IC8gdG90YWxfZW5yb2xsbWVudCAqIDEwMCksICIlIiksCiAgICAgICAgIHBlcmNfc2l4X3JhdGUgPSBwYXN0ZTAoc3ByaW50ZigiJTQuMWYiLCB0b3RhbF9iYWNoZWxvcnNfNiAvIHRvdGFsX2Vucm9sbG1lbnQgKiAxMDApLCAiJSIpKSAKYGBgCgojIyBQcmVwYXJlIERhdGEgZm9yIERpc2FnZ3JlZ2F0aW9uIApgYGB7cn0KI1ByZXBhcmUgZGF0YSB0byB2aXN1YWxpemUgYnkgR2VuZGVyIAppcGVkc19nZW5kZXIgPC0gaXBlZHNfcmVuYW1lICU+JSAKICBwaXZvdF9sb25nZXIoY29scyA9IE1hbGU6RmVtYWxlLCBuYW1lc190byA9ICJzZXgiLCB2YWx1ZXNfdG8gPSAidG90YWxfZW5yb2xsZWQiKSAlPiUgCiAgc2VsZWN0KC0ocmFjZV91bmtub3duX21lbjptdWx0aV93b21lbikpICU+JSAKICAgbXV0YXRlKGdyYWR1YXRpb25fZm91cl9yYXRlID0gcm91bmQodG90YWxfYmFjaGVsb3JzXzQvdG90YWxfZW5yb2xsbWVudCw0KSwKICAgICAgICAgZ3JhZHVhdGlvbl9zaXhfcmF0ZSA9IHJvdW5kKHRvdGFsX2JhY2hlbG9yc182L3RvdGFsX2Vucm9sbG1lbnQsNCksCiAgICAgICAgIHBlcmNfZm91cl9yYXRlID0gcGFzdGUwKHNwcmludGYoIiU0LjFmIiwgdG90YWxfYmFjaGVsb3JzXzQgLyB0b3RhbF9lbnJvbGxtZW50ICogMTAwKSwgIiUiKSwKICAgICAgICAgcGVyY19zaXhfcmF0ZSA9IHBhc3RlMChzcHJpbnRmKCIlNC4xZiIsIHRvdGFsX2JhY2hlbG9yc182IC8gdG90YWxfZW5yb2xsbWVudCAqIDEwMCksICIlIikpICU+JSAKICByZW5hbWUoR3JhZHVhdGlvbiA9IHRvdGFsX2Vucm9sbGVkKSAlPiUgCiAgc2VsZWN0KC0oZ3JhZHVhdGlvbl9mb3VyX3JhdGU6cGVyY19zaXhfcmF0ZSkpICU+JSAKICBzZWxlY3QoLXRvdGFsX2JhY2hlbG9yc180LCAtdG90YWxfYmFjaGVsb3JzXzYpICU+JSAKICBtdXRhdGUoR3JhZHVhdGlvbl9wZXJjID0gcm91bmQoR3JhZHVhdGlvbi90b3RhbF9lbnJvbGxtZW50LDQpLAogICAgICAgICBwZXJjX3JhdGUgPSBwYXN0ZTAoc3ByaW50ZigiJTQuMWYiLCBHcmFkdWF0aW9uL3RvdGFsX2Vucm9sbG1lbnQgKiAxMDApLCAiJSIpKSAKYGBgCiMgVmlzdWFsaXplIHRoZSBEYXRhIAoKIyMgNC15ZWFyIEdyYWR1YXRpb24gUmF0ZSAKYGBge3J9CiNWaXN1YWxpemUgNC0geWVhciBHcmFkdWF0ZSByYXRlIAppcGVkc19ncmFkX292ZXJhbGwgJT4lIAogIG11dGF0ZShoaWdobGlnaHQgPSBpZmVsc2UoaW5zdGl0dXRpb25fbmFtZSA9PSAiVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLVNlYXR0bGUgQ2FtcHVzIiwgVCwgRikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGluc3RpdHV0aW9uX25hbWUsIGdyYWR1YXRpb25fZm91cl9yYXRlKSwgeSA9IGdyYWR1YXRpb25fZm91cl9yYXRlKSkgKyAKICBnZW9tX2NvbChhZXMoZmlsbCA9IGhpZ2hsaWdodCkpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTYwIiwgIiM0YjJlODMiKSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICI0LXllYXIgR3JhZHVhdGlvbiBSYXRlIiwKICAgICAgIHN1YnRpdGxlID0gIkZvciBGYXIgV2VzdCBQdWJsaWMgUmVzZWFyY2ggSW5zdGl0dXRpb25zIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIGZpbGw9ICJJbnN0aXR1dGlvbiBOYW1lIiwKICAgICAgIGNhcHRpb24gPSAiRGF0YSBwcm92aWRlZCBieSBJbnRlZ3JhdGVkIFBvc3RzZWNvbmRhcnkgRWR1Y2F0aW9uIERhdGEgU3lzdGVtIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNfZm91cl9yYXRlKSwgaGp1c3QgPSAxLCBudWRnZV94ID0gLjEsIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkKYGBgCgojIyA2LVllYXIgR3JhZHVhdGlvbiBSYXRlIApgYGB7cn0KIyBWaXN1YWxpemUgNiB5ZWFyIGdyYWR1YXRpb24gcmF0ZSAKaXBlZHNfZ3JhZF9vdmVyYWxsICU+JSAKICBtdXRhdGUoaGlnaGxpZ2h0ID0gaWZlbHNlKGluc3RpdHV0aW9uX25hbWUgPT0gIlVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi1TZWF0dGxlIENhbXB1cyIsIFQsIEYpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihpbnN0aXR1dGlvbl9uYW1lLCBncmFkdWF0aW9uX3NpeF9yYXRlKSwgeSA9IGdyYWR1YXRpb25fc2l4X3JhdGUpKSArIAogIGdlb21fY29sKGFlcyhmaWxsID0gaGlnaGxpZ2h0KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5NjAiLCAiIzRiMmU4MyIpKSArCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIjYteWVhciBHcmFkdWF0aW9uIFJhdGUiLAogICAgICAgc3VidGl0bGUgPSAiRm9yIEZhciBXZXN0IFB1YmxpYyBSZXNlYXJjaCBJbnN0aXR1dGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgZmlsbD0gIkluc3RpdHV0aW9uIE5hbWUiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIHByb3ZpZGVkIGJ5IEludGVncmF0ZWQgUG9zdHNlY29uZGFyeSBFZHVjYXRpb24gRGF0YSBTeXN0ZW0iKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY19zaXhfcmF0ZSksIGhqdXN0ID0gMSwgbnVkZ2VfeCA9IC4xLCBjb2xvciA9ICJ3aGl0ZSIsIGZvbnRmYWNlID0gImJvbGQiICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpCmBgYAoKCiMjIEZlbWFsZSBHcmFkdWF0aW9uIFJhdGUKYGBge3J9CiNGZW1hbGUgVmlzdWFsaXphdGlvbiAKaXBlZHNfZ2VuZGVyICU+JSAKICBmaWx0ZXIoc2V4ID09ICJGZW1hbGUiKSAlPiUgCiAgbXV0YXRlKGhpZ2hsaWdodCA9IGlmZWxzZShpbnN0aXR1dGlvbl9uYW1lID09ICJVbml2ZXJzaXR5IG9mIFdhc2hpbmd0b24tU2VhdHRsZSBDYW1wdXMiLCBULCBGKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoaW5zdGl0dXRpb25fbmFtZSwgR3JhZHVhdGlvbl9wZXJjKSwgeSA9IEdyYWR1YXRpb25fcGVyYykpICsgCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBoaWdobGlnaHQpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImdyZXk2MCIsICIjNGIyZTgzIikpICsKICBjb29yZF9mbGlwKCkgKwogIGxhYnModGl0bGUgPSAiRmVtYWxlIEdyYWR1YXRpb24gUmF0ZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJGb3IgRmFyIFdlc3QgUHVibGljIFJlc2VhcmNoIEluc3RpdHV0aW9ucyIsCiAgICAgICB4ID0gIiIsCiAgICAgICB5ID0gIiIsCiAgICAgICBmaWxsPSAiSW5zdGl0dXRpb24gTmFtZSIsCiAgICAgICBjYXB0aW9uID0gIkRhdGEgcHJvdmlkZWQgYnkgSW50ZWdyYXRlZCBQb3N0c2Vjb25kYXJ5IEVkdWNhdGlvbiBEYXRhIFN5c3RlbSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjX3JhdGUpLCBoanVzdCA9IDEsIG51ZGdlX3ggPSAuMSwgY29sb3IgPSAid2hpdGUiLCBmb250ZmFjZSA9ICJib2xkIiApICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gc2NhbGVzOjpwZXJjZW50KQpgYGAKCiMjIE1hbGUgR3JhZHVhdGlvbiBSYXRlIApgYGB7cn0KI01hbGUgVmlzdWFsaXphdGlvbiAKaXBlZHNfZ2VuZGVyICU+JSAKICBmaWx0ZXIoc2V4ID09ICJNYWxlIikgJT4lIAogIG11dGF0ZShoaWdobGlnaHQgPSBpZmVsc2UoaW5zdGl0dXRpb25fbmFtZSA9PSAiVW5pdmVyc2l0eSBvZiBXYXNoaW5ndG9uLVNlYXR0bGUgQ2FtcHVzIiwgVCwgRikpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKGluc3RpdHV0aW9uX25hbWUsIEdyYWR1YXRpb25fcGVyYyksIHkgPSBHcmFkdWF0aW9uX3BlcmMpKSArIAogIGdlb21fY29sKGFlcyhmaWxsID0gaGlnaGxpZ2h0KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5NjAiLCAiIzRiMmU4MyIpKSArCiAgY29vcmRfZmxpcCgpICsKICBsYWJzKHRpdGxlID0gIk1hbGUgR3JhZHVhdGlvbiBSYXRlIiwKICAgICAgIHN1YnRpdGxlID0gIkZvciBGYXIgV2VzdCBQdWJsaWMgUmVzZWFyY2ggSW5zdGl0dXRpb25zIiwKICAgICAgIHggPSAiIiwKICAgICAgIHkgPSAiIiwKICAgICAgIGZpbGw9ICJJbnN0aXR1dGlvbiBOYW1lIiwKICAgICAgIGNhcHRpb24gPSAiRGF0YSBwcm92aWRlZCBieSBJbnRlZ3JhdGVkIFBvc3RzZWNvbmRhcnkgRWR1Y2F0aW9uIERhdGEgU3lzdGVtIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNfcmF0ZSksIGhqdXN0ID0gMSwgbnVkZ2VfeCA9IC4xLCBjb2xvciA9ICJ3aGl0ZSIsIGZvbnRmYWNlID0gImJvbGQiICkgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnQpCmBgYAoKIyMgRmFjZXQgV3JhcCBvZiBGZW1hbGUgYW5kIE1hbGUgR3JhZHVhdGlvbiBSYXRlIApgYGB7cn0KaXBlZHNfZ2VuZGVyICU+JSAKICBtdXRhdGUoaGlnaGxpZ2h0ID0gaWZlbHNlKGluc3RpdHV0aW9uX25hbWUgPT0gIlVuaXZlcnNpdHkgb2YgV2FzaGluZ3Rvbi1TZWF0dGxlIENhbXB1cyIsIFQsIEYpKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihpbnN0aXR1dGlvbl9uYW1lLCBHcmFkdWF0aW9uX3BlcmMpLCB5ID0gR3JhZHVhdGlvbl9wZXJjKSkgKyAKICBnZW9tX2NvbChhZXMoZmlsbCA9IGhpZ2hsaWdodCkpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTYwIiwgIiM0YjJlODMiKSkgKwogIGNvb3JkX2ZsaXAoKSArCiAgbGFicyh0aXRsZSA9ICJHcmFkdWF0aW9uIFJhdGUiLAogICAgICAgc3VidGl0bGUgPSAiRm9yIEZhciBXZXN0IFB1YmxpYyBSZXNlYXJjaCBJbnN0aXR1dGlvbnMiLAogICAgICAgeCA9ICIiLAogICAgICAgeSA9ICIiLAogICAgICAgZmlsbD0gIkluc3RpdHV0aW9uIE5hbWUiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIHByb3ZpZGVkIGJ5IEludGVncmF0ZWQgUG9zdHNlY29uZGFyeSBFZHVjYXRpb24gRGF0YSBTeXN0ZW0iKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcy55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY19yYXRlKSwgaGp1c3QgPSAxLCBudWRnZV94ID0gLjEsIGNvbG9yID0gIndoaXRlIiwgZm9udGZhY2UgPSAiYm9sZCIgKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudCkgKwogIGZhY2V0X3dyYXAofnNleCkKYGBgCgoKCgoKCgoK