1 Nobel Prize Winners

Georgios Karamanis gathered and shared data on Nobel prize winners over the years, with a fair amount of detail, and used in the tidytuesday series a while back. These data are to be used for the questions that follow.

readr::read_csv("https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2019/2019-05-14/nobel_winners.csv") -> nobel_winners 
variable class description
prize_year double Year that Nobel Prize was awarded
category character Field of study/category
prize character Prize Name
motivation character Motivation of the award
prize_share character Share eg 1 of 1, 1 of 2, 1 of 4, etc
laureate_id double ID assigned to each winner
laureate_type character Individual or organization
full_name character name of the winner
birth_date double birth date of winner
birth_city character birth city/state of winner
birth_country character birth country of winner
gender character binary gender of the winner
organization_name character organization name
organization_city character organization city
organization_country character organization country
death_date double death date of the winner (if dead)
death_city character death city (if dead)
death_country character death country (if dead)
  1. First create nobel.df that keeps only records starting in the year 1960, and only for the “Physics” category. Now generate an appropriate chart that shows the distribution of winners by birth_country
library(tidyverse)
library(tidylog)

nobel_winners %>%
  filter(category == "Physics", prize_year >= 1960) -> nobel.df

ggplot() +
  geom_bar(
    data = nobel.df,
    aes(x = birth_country)
    ) +
  labs(x = "Birth Country", y = "Number of Nobel Laureates", 
       title = "Bar-chart of Nobel Laureates by Country of Birth") + 
  coord_flip() 

  1. Now break this distribution out by gender to see how winners by country differs across gender
ggplot() +
  geom_bar(
    data = nobel.df,
    aes(x = birth_country, group = gender, fill = gender)
    ) +
  labs(x = "Birth Country", y = "Number of Nobel Laureates", 
       title = "Bar-chart of Nobel Laureates by Country of Birth") + 
  coord_flip() 

  1. Now go back to noble_winners, the full data-set, and create a simple plot that shows the distribution of prize winners by death_country, gender, and category
nobel_winners %>%
  filter(!is.na(death_country)) -> nobel.df

ggplot() +
  geom_bar(
    data = nobel.df,
    aes(x = death_country, group = gender, fill = gender)
    ) +
  labs(x = "Death Country", y = "Number of Nobel Laureates", 
       title = "Bar-chart of Nobel Laureates by Country of Death, Gender, and Prize category") + 
  coord_flip() +
  facet_wrap(~ category)

2 Water levels in the Great Lakes

Use the data-set given below. Note that water level is in meters.

library(readxl)
url <- "https://aniruhil.github.io/avsr/teaching/dataviz/greatlakes.xlsx"
destfile <- "greatlakes.xlsx"
curl::curl_download(url, destfile)
read_excel(destfile, col_types = c("date", 
     "numeric", "numeric", "numeric", "numeric", 
     "numeric")) -> greatlakes 

Now use an appropriate chart to show the water level for Lake Superior.

ggplot(
  data = greatlakes,
  aes(
    x = monthyear,
    y = Superior
    )
  ) +
  geom_line() +
  labs(
    x = "Date",
    y = "Water level, in meters",
    title = "Lake Superior's water levels over time"
  )

3 County Health Rankings

Download the 2017 County Health Rankings data SPSS format from here, Excel format from here and the accompanying codebook.

These data can be downloaded with the code provided below:

library(readxl)
url <- "https://aniruhil.github.io/avsr/teaching/dataviz/CountyHealthRankings2017.xlsx"
destfile <- "CountyHealthRankings2017.xlsx"
curl::curl_download(url, destfile)
read_excel(destfile) -> chr.df 

Construct appropriate plots that shows the relationship between the following pairs of variables

  1. Adult obesity and High school graduation
ggplot(
  data = chr.df,
  aes(x = Adult_obesity, y = High_school_graduation)
  ) +
  geom_point() +
  labs(x = "Adult Obesity (%)", y = "High School Graduation (%)") +
  scale_y_continuous(label = scales::percent) 

  1. Children in poverty and High school graduation
ggplot(
  data = chr.df,
  aes(x = Children_in_poverty, y = High_school_graduation)
  ) +
  geom_point() +
  labs(x = "Children in Poverty (%)", y = "High School Graduation (%)") +
  scale_y_continuous(label = scales::percent) 

  1. Preventable hospital stays and Unemployment rate
ggplot(
  data = chr.df,
  aes(x = Preventable_hospital_stays, y = Unemployment_rate)
  ) +
  geom_point() +
  labs(x = "Preventable Hospital Stays", y = "Unemployment Rate (%)") +
  scale_y_continuous(label = scales::percent) 

4 Unemployment Rates

Use the unemployment data given to you (unemprate.RData) and construct appropriate plots that show the distribution of unemployment rates across years for each of the four educational attainment groups.

load(here::here("data", "unemprate.RData"))

names(urate)
## [1] "yearmonth"  "educ_group" "rate"

Be sure to use a unique color for each educational attainment group

ggplot(
  data = urate,
  aes(x = yearmonth, y = rate, color = educ_group)
  ) +
  geom_line() +
  labs(
    x = "Date",
    y = "Unemployment Rate",
    color = "",
    title = "Unemployment Rate by Educational Attainment"
  ) +
  theme(legend.position = "bottom")

LS0tCnRpdGxlOiAiTVBBIDU4MzAgLSBTb2x1dGlvbnMgdG8gUHJhY3RpY2UgRXhlcmNpc2VzIgpzdWJ0aXRsZTogIlNwcmluZyAyMDIwIgphdXRob3I6ICJJTlNFUlQgWU9VUiBOQU1FIEhFUkUiCmRhdGU6ICJVcGRhdGVkIG9uIGByIFN5cy5EYXRlKClgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6IAogICAgZmlnX2NhcHRpb246IHllcwogICAgaGlnaGxpZ2h0OiB6ZW5idXJuCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBzZWxmX2NvbnRhaW5lZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Cgpib2R5eyAvKiBOb3JtYWwgICovCi8qICAgIGZvbnQtZmFtaWx5OiBMYXRvLCBzYW5zLXNlcmlmOyAgCiAgICAgIGZvbnQtZmFtaWx5OiBNdWt0YSwgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtZmFtaWx5OiAnTnVuaXRvIFNhbnMnLCBzYW5zLXNlcmlmOwogICAgICBmb250LWZhbWlseTogS2FybGEsIHNhbnMtc2VyaWY7ICAqLwogICAgICBmb250LWZhbWlseTogJ01lcnJpd2VhdGhlciBTYW5zJywgc2Fucy1zZXJpZjsgCiAgICAgIGZvbnQtc2l6ZTogMThweDsKICB9CgpoMS50aXRsZSB7CiAgZm9udC1zaXplOiAzOHB4OwogIGNvbG9yOiBEYXJrUmVkOwp9CgpoMSB7IC8qIEhlYWRlciAxICovCiAgZm9udC1zaXplOiAyOHB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDIgeyAvKiBIZWFkZXIgMiAqLwogICAgZm9udC1zaXplOiAyMnB4OwogIGNvbG9yOiBEYXJrQmx1ZTsKfQoKaDMgeyAvKiBIZWFkZXIgMyAqLwogIGZvbnQtc2l6ZTogMThweDsKICBjb2xvcjogRGFya0JsdWU7Cn0KCmNvZGUucnsgLyogQ29kZSBibG9jayAqLwogICAgZm9udC1mYW1pbHk6IE11a3RhLCBzYW5zLXNlcmlmOyAKICAgIGZvbnQtd2VpZ2h0OiA2MDA7ICAKICAgIGZvbnQtc2l6ZTogMThweDsKfQoKLyogcHJlIHsgLyogQ29kZSBibG9jayAtIGRldGVybWluZXMgY29kZSBzcGFjaW5nIGJldHdlZW4gbGluZXMgKi8KICAgIGZvbnQtc2l6ZTogMTZweDsKfSAqLwo8L3N0eWxlPgoKCmBgYHtyIGtsaXBweSwgZWNobyA9IEZBTFNFLCBpbmNsdWRlID0gVFJVRX0Ka2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScsIGNvbG9yID0gJ2Nvcm5mbG93ZXJibHVlJywgcG9zaXRpb24gPSBjKCd0b3AnLCAncmlnaHQnKSkKYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgZHBpID0gMzAwLCBjYWNoZSA9IEZBTFNFLCBmaWcuYWxpZ24gPSAiY2VudGVyIiwgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA4LCBvdXQud2lkdGggPSAiMTAwJSIsIGhpZ2hsaWdodCA9IFRSVUUpIApgYGAKCgojIE5vYmVsIFByaXplIFdpbm5lcnMgCkdlb3JnaW9zIEthcmFtYW5pcyBnYXRoZXJlZCBhbmQgc2hhcmVkIGRhdGEgb24gTm9iZWwgcHJpemUgd2lubmVycyBvdmVyIHRoZSB5ZWFycywgd2l0aCBhIGZhaXIgYW1vdW50IG9mIGRldGFpbCwgYW5kIHVzZWQgaW4gdGhlIGB0aWR5dHVlc2RheWAgc2VyaWVzIGEgd2hpbGUgYmFjay4gVGhlc2UgZGF0YSBhcmUgdG8gYmUgdXNlZCBmb3IgdGhlIHF1ZXN0aW9ucyB0aGF0IGZvbGxvdy4gCgpgYGB7ciBub2JlbC13aW5uZXJzfQpyZWFkcjo6cmVhZF9jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9yZm9yZGF0YXNjaWVuY2UvdGlkeXR1ZXNkYXkvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA1LTE0L25vYmVsX3dpbm5lcnMuY3N2IikgLT4gbm9iZWxfd2lubmVycyAKYGBgCgp8dmFyaWFibGUgICAgICAgICAgICAgfGNsYXNzICAgICB8ZGVzY3JpcHRpb24gfAp8Oi0tLXw6LS0tfDotLS0tLS0tLS0tLXwKfHByaXplX3llYXIgICAgICAgICAgIHxkb3VibGUgICAgfCBZZWFyIHRoYXQgTm9iZWwgUHJpemUgd2FzIGF3YXJkZWR8CnxjYXRlZ29yeSAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgRmllbGQgb2Ygc3R1ZHkvY2F0ZWdvcnl8Cnxwcml6ZSAgICAgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgUHJpemUgTmFtZSB8Cnxtb3RpdmF0aW9uICAgICAgICAgICB8Y2hhcmFjdGVyIHwgTW90aXZhdGlvbiBvZiB0aGUgYXdhcmQgfAp8cHJpemVfc2hhcmUgICAgICAgICAgfGNoYXJhY3RlciB8IFNoYXJlIGVnIDEgb2YgMSwgMSBvZiAyLCAxIG9mIDQsIGV0YyB8CnxsYXVyZWF0ZV9pZCAgICAgICAgICB8ZG91YmxlICAgIHwgSUQgYXNzaWduZWQgdG8gZWFjaCB3aW5uZXIgfAp8bGF1cmVhdGVfdHlwZSAgICAgICAgfGNoYXJhY3RlciB8IEluZGl2aWR1YWwgb3Igb3JnYW5pemF0aW9uICB8CnxmdWxsX25hbWUgICAgICAgICAgICB8Y2hhcmFjdGVyIHwgbmFtZSBvZiB0aGUgd2lubmVyfAp8YmlydGhfZGF0ZSAgICAgICAgICAgfGRvdWJsZSAgICB8IGJpcnRoIGRhdGUgb2Ygd2lubmVyIHwKfGJpcnRoX2NpdHkgICAgICAgICAgIHxjaGFyYWN0ZXIgfCBiaXJ0aCBjaXR5L3N0YXRlIG9mIHdpbm5lciB8CnxiaXJ0aF9jb3VudHJ5ICAgICAgICB8Y2hhcmFjdGVyIHwgYmlydGggY291bnRyeSBvZiB3aW5uZXIgfAp8Z2VuZGVyICAgICAgICAgICAgICAgfGNoYXJhY3RlciB8IGJpbmFyeSBnZW5kZXIgb2YgdGhlIHdpbm5lciB8Cnxvcmdhbml6YXRpb25fbmFtZSAgICB8Y2hhcmFjdGVyIHwgb3JnYW5pemF0aW9uIG5hbWUgfAp8b3JnYW5pemF0aW9uX2NpdHkgICAgfGNoYXJhY3RlciB8IG9yZ2FuaXphdGlvbiBjaXR5IHwKfG9yZ2FuaXphdGlvbl9jb3VudHJ5IHxjaGFyYWN0ZXIgfCBvcmdhbml6YXRpb24gY291bnRyeSB8CnxkZWF0aF9kYXRlICAgICAgICAgICB8ZG91YmxlICAgIHwgZGVhdGggZGF0ZSBvZiB0aGUgd2lubmVyIChpZiBkZWFkKSB8CnxkZWF0aF9jaXR5ICAgICAgICAgICB8Y2hhcmFjdGVyIHwgZGVhdGggY2l0eSAoaWYgZGVhZCkgfAp8ZGVhdGhfY291bnRyeSAgICAgICAgfGNoYXJhY3RlciB8IGRlYXRoIGNvdW50cnkgKGlmIGRlYWQpIHwKCgooYSkgRmlyc3QgY3JlYXRlIGBub2JlbC5kZmAgdGhhdCBrZWVwcyBvbmx5IHJlY29yZHMgc3RhcnRpbmcgaW4gdGhlIHllYXIgMTk2MCwgYW5kIG9ubHkgZm9yIHRoZSAiUGh5c2ljcyIgY2F0ZWdvcnkuIE5vdyBnZW5lcmF0ZSBhbiBhcHByb3ByaWF0ZSBjaGFydCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2Ygd2lubmVycyBieSBgYmlydGhfY291bnRyeWAgCgpgYGB7ciBxMX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkodGlkeWxvZykKCm5vYmVsX3dpbm5lcnMgJT4lCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJQaHlzaWNzIiwgcHJpemVfeWVhciA+PSAxOTYwKSAtPiBub2JlbC5kZgoKZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBiaXJ0aF9jb3VudHJ5KQogICAgKSArCiAgbGFicyh4ID0gIkJpcnRoIENvdW50cnkiLCB5ID0gIk51bWJlciBvZiBOb2JlbCBMYXVyZWF0ZXMiLCAKICAgICAgIHRpdGxlID0gIkJhci1jaGFydCBvZiBOb2JlbCBMYXVyZWF0ZXMgYnkgQ291bnRyeSBvZiBCaXJ0aCIpICsgCiAgY29vcmRfZmxpcCgpIApgYGAKCgooYikgTm93IGJyZWFrIHRoaXMgZGlzdHJpYnV0aW9uIG91dCBieSBgZ2VuZGVyYCB0byBzZWUgaG93IHdpbm5lcnMgYnkgY291bnRyeSBkaWZmZXJzIGFjcm9zcyBnZW5kZXIgCgpgYGB7ciBxMn0KZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBiaXJ0aF9jb3VudHJ5LCBncm91cCA9IGdlbmRlciwgZmlsbCA9IGdlbmRlcikKICAgICkgKwogIGxhYnMoeCA9ICJCaXJ0aCBDb3VudHJ5IiwgeSA9ICJOdW1iZXIgb2YgTm9iZWwgTGF1cmVhdGVzIiwgCiAgICAgICB0aXRsZSA9ICJCYXItY2hhcnQgb2YgTm9iZWwgTGF1cmVhdGVzIGJ5IENvdW50cnkgb2YgQmlydGgiKSArIAogIGNvb3JkX2ZsaXAoKSAKYGBgCgoKKGMpIE5vdyBnbyBiYWNrIHRvIGBub2JsZV93aW5uZXJzYCwgdGhlIGZ1bGwgZGF0YS1zZXQsIGFuZCBjcmVhdGUgYSBzaW1wbGUgcGxvdCB0aGF0IHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgcHJpemUgd2lubmVycyBieSBgZGVhdGhfY291bnRyeWAsIGBnZW5kZXJgLCBhbmQgYGNhdGVnb3J5YCAgCgpgYGB7ciBxM30Kbm9iZWxfd2lubmVycyAlPiUKICBmaWx0ZXIoIWlzLm5hKGRlYXRoX2NvdW50cnkpKSAtPiBub2JlbC5kZgoKZ2dwbG90KCkgKwogIGdlb21fYmFyKAogICAgZGF0YSA9IG5vYmVsLmRmLAogICAgYWVzKHggPSBkZWF0aF9jb3VudHJ5LCBncm91cCA9IGdlbmRlciwgZmlsbCA9IGdlbmRlcikKICAgICkgKwogIGxhYnMoeCA9ICJEZWF0aCBDb3VudHJ5IiwgeSA9ICJOdW1iZXIgb2YgTm9iZWwgTGF1cmVhdGVzIiwgCiAgICAgICB0aXRsZSA9ICJCYXItY2hhcnQgb2YgTm9iZWwgTGF1cmVhdGVzIGJ5IENvdW50cnkgb2YgRGVhdGgsIEdlbmRlciwgYW5kIFByaXplIGNhdGVnb3J5IikgKyAKICBjb29yZF9mbGlwKCkgKwogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkKYGBgCgoKIyBXYXRlciBsZXZlbHMgaW4gdGhlIEdyZWF0IExha2VzCgpVc2UgdGhlIGRhdGEtc2V0IGdpdmVuIGJlbG93LiAqTm90ZSB0aGF0IHdhdGVyIGxldmVsIGlzIGluIG1ldGVycy4qIAoKYGBge3IgZ3JlYXRsYWtlc30KbGlicmFyeShyZWFkeGwpCnVybCA8LSAiaHR0cHM6Ly9hbmlydWhpbC5naXRodWIuaW8vYXZzci90ZWFjaGluZy9kYXRhdml6L2dyZWF0bGFrZXMueGxzeCIKZGVzdGZpbGUgPC0gImdyZWF0bGFrZXMueGxzeCIKY3VybDo6Y3VybF9kb3dubG9hZCh1cmwsIGRlc3RmaWxlKQpyZWFkX2V4Y2VsKGRlc3RmaWxlLCBjb2xfdHlwZXMgPSBjKCJkYXRlIiwgCiAgICAgIm51bWVyaWMiLCAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAibnVtZXJpYyIpKSAtPiBncmVhdGxha2VzIApgYGAKCk5vdyB1c2UgYW4gYXBwcm9wcmlhdGUgY2hhcnQgdG8gc2hvdyB0aGUgd2F0ZXIgbGV2ZWwgZm9yIExha2UgU3VwZXJpb3IuIAoKYGBge3IgbGFrZXN9CmdncGxvdCgKICBkYXRhID0gZ3JlYXRsYWtlcywKICBhZXMoCiAgICB4ID0gbW9udGh5ZWFyLAogICAgeSA9IFN1cGVyaW9yCiAgICApCiAgKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnMoCiAgICB4ID0gIkRhdGUiLAogICAgeSA9ICJXYXRlciBsZXZlbCwgaW4gbWV0ZXJzIiwKICAgIHRpdGxlID0gIkxha2UgU3VwZXJpb3IncyB3YXRlciBsZXZlbHMgb3ZlciB0aW1lIgogICkKYGBgCgoKIyBDb3VudHkgSGVhbHRoIFJhbmtpbmdzCkRvd25sb2FkIHRoZSAyMDE3IENvdW50eSBIZWFsdGggUmFua2luZ3MgZGF0YSBbU1BTUyBmb3JtYXQgZnJvbSBoZXJlXShodHRwczovL2FuaXJ1aGlsLmdpdGh1Yi5pby9hdnNyL3RlYWNoaW5nL2RhdGF2aXovQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3LnNhdiksIFtFeGNlbCBmb3JtYXQgZnJvbSBoZXJlXShodHRwczovL2FuaXJ1aGlsLmdpdGh1Yi5pby9hdnNyL3RlYWNoaW5nL2RhdGF2aXovQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3Lnhsc3gpIGFuZCB0aGUgW2FjY29tcGFueWluZyBjb2RlYm9va10oaHR0cDovL3d3dy5jb3VudHloZWFsdGhyYW5raW5ncy5vcmcvc2l0ZXMvZGVmYXVsdC9maWxlcy8yMDE3VHJlbmRzRG9jdW1lbnRhdGlvbi5wZGYpLiAKClRoZXNlIGRhdGEgY2FuIGJlIGRvd25sb2FkZWQgd2l0aCB0aGUgY29kZSBwcm92aWRlZCBiZWxvdzogCgpgYGB7ciBncmVhdC1sYWtlc30KbGlicmFyeShyZWFkeGwpCnVybCA8LSAiaHR0cHM6Ly9hbmlydWhpbC5naXRodWIuaW8vYXZzci90ZWFjaGluZy9kYXRhdml6L0NvdW50eUhlYWx0aFJhbmtpbmdzMjAxNy54bHN4IgpkZXN0ZmlsZSA8LSAiQ291bnR5SGVhbHRoUmFua2luZ3MyMDE3Lnhsc3giCmN1cmw6OmN1cmxfZG93bmxvYWQodXJsLCBkZXN0ZmlsZSkKcmVhZF9leGNlbChkZXN0ZmlsZSkgLT4gY2hyLmRmIApgYGAKCkNvbnN0cnVjdCBhcHByb3ByaWF0ZSBwbG90cyB0aGF0IHNob3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgZm9sbG93aW5nIHBhaXJzIG9mIHZhcmlhYmxlcyAKCihhKSBBZHVsdCBvYmVzaXR5IGFuZCBIaWdoIHNjaG9vbCBncmFkdWF0aW9uIAoKYGBge3IgY2hyMX0KZ2dwbG90KAogIGRhdGEgPSBjaHIuZGYsCiAgYWVzKHggPSBBZHVsdF9vYmVzaXR5LCB5ID0gSGlnaF9zY2hvb2xfZ3JhZHVhdGlvbikKICApICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnMoeCA9ICJBZHVsdCBPYmVzaXR5ICglKSIsIHkgPSAiSGlnaCBTY2hvb2wgR3JhZHVhdGlvbiAoJSkiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsID0gc2NhbGVzOjpwZXJjZW50KSAKYGBgCgooYikgQ2hpbGRyZW4gaW4gcG92ZXJ0eSBhbmQgSGlnaCBzY2hvb2wgZ3JhZHVhdGlvbiAKCmBgYHtyIGNocjJ9CmdncGxvdCgKICBkYXRhID0gY2hyLmRmLAogIGFlcyh4ID0gQ2hpbGRyZW5faW5fcG92ZXJ0eSwgeSA9IEhpZ2hfc2Nob29sX2dyYWR1YXRpb24pCiAgKSArCiAgZ2VvbV9wb2ludCgpICsKICBsYWJzKHggPSAiQ2hpbGRyZW4gaW4gUG92ZXJ0eSAoJSkiLCB5ID0gIkhpZ2ggU2Nob29sIEdyYWR1YXRpb24gKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCkgCmBgYAoKKGMpIFByZXZlbnRhYmxlIGhvc3BpdGFsIHN0YXlzIGFuZCBVbmVtcGxveW1lbnQgcmF0ZSAKCmBgYHtyIGNocjN9CmdncGxvdCgKICBkYXRhID0gY2hyLmRmLAogIGFlcyh4ID0gUHJldmVudGFibGVfaG9zcGl0YWxfc3RheXMsIHkgPSBVbmVtcGxveW1lbnRfcmF0ZSkKICApICsKICBnZW9tX3BvaW50KCkgKwogIGxhYnMoeCA9ICJQcmV2ZW50YWJsZSBIb3NwaXRhbCBTdGF5cyIsIHkgPSAiVW5lbXBsb3ltZW50IFJhdGUgKCUpIikgKwogIHNjYWxlX3lfY29udGludW91cyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudCkgCmBgYAoKIyBVbmVtcGxveW1lbnQgUmF0ZXMKVXNlIHRoZSB1bmVtcGxveW1lbnQgZGF0YSBnaXZlbiB0byB5b3UgYCh1bmVtcHJhdGUuUkRhdGEpYCBhbmQgY29uc3RydWN0IGFwcHJvcHJpYXRlIHBsb3RzIHRoYXQgc2hvdyB0aGUgZGlzdHJpYnV0aW9uIG9mIHVuZW1wbG95bWVudCByYXRlcyBhY3Jvc3MgeWVhcnMgZm9yIGVhY2ggb2YgdGhlIGZvdXIgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCBncm91cHMuIAoKYGBge3IgdXJhdGV9CmxvYWQoaGVyZTo6aGVyZSgiZGF0YSIsICJ1bmVtcHJhdGUuUkRhdGEiKSkKCm5hbWVzKHVyYXRlKQpgYGAKCkJlIHN1cmUgdG8gdXNlIGEgdW5pcXVlIGNvbG9yIGZvciBlYWNoIGVkdWNhdGlvbmFsIGF0dGFpbm1lbnQgZ3JvdXAKCmBgYHtyIHVyYXRlMn0KZ2dwbG90KAogIGRhdGEgPSB1cmF0ZSwKICBhZXMoeCA9IHllYXJtb250aCwgeSA9IHJhdGUsIGNvbG9yID0gZWR1Y19ncm91cCkKICApICsKICBnZW9tX2xpbmUoKSArCiAgbGFicygKICAgIHggPSAiRGF0ZSIsCiAgICB5ID0gIlVuZW1wbG95bWVudCBSYXRlIiwKICAgIGNvbG9yID0gIiIsCiAgICB0aXRsZSA9ICJVbmVtcGxveW1lbnQgUmF0ZSBieSBFZHVjYXRpb25hbCBBdHRhaW5tZW50IgogICkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKQpgYGAKCg==