Preparation Instructions

THE DATASETS

For this Challenge Problem assignment, you are going to be using the Data.World dataset on registered nurses in the United States between 1998 and 2020.1 The data includes total numbers of registered nurse and salary information at the state-level by year. The original documentation for this dataset can be found on its Tidy Tuesday page. [Note: I modified the names of the variables so there were no special characters or spaces, so be sure to inspect the names of the variables before working with the dataset.]

EXERCISES

Practice Problems

Now let’s practice making tables and data visualizations to answer questions. Each question is supposed to be stand alone and not build from each other (unless specified).

Use the following posed question for Questions 1-4:

What is the general trend of total number of registered nurses across the years 1998 and 2020 in the United States?

  1. Answer this question by creating a simple table of count of registered nurses by year using the gt package.
nurses %>%
  group_by(Year) %>%
  summarise(total_rn = sum(Total_Employed_RN, na.rm = TRUE)) %>%
  gt() %>%
  tab_header(title = "Total Number of Registered Nurses (1998-2020)", 
             subtitle = "Total number of employed nurses by year") %>%
  cols_label(total_rn = "Total Registered Nurses") %>%
  fmt_number(columns = total_rn, decimals = 0)
Total Number of Registered Nurses (1998-2020)
Total number of employed nurses by year
Year Total Registered Nurses
1998 2,043,250
1999 2,217,390
2000 2,203,940
2001 2,231,920
2002 2,253,860
2003 2,261,050
2004 2,327,450
2005 2,383,940
2006 2,433,610
2007 2,485,530
2008 2,560,710
2009 2,602,430
2010 2,673,150
2011 2,743,600
2012 2,652,290
2013 2,681,580
2014 2,705,890
2015 2,764,180
2016 2,875,400
2017 2,926,470
2018 2,972,150
2019 3,002,940
2020 3,006,970
  1. Answer this question by creating a data visualization of count of registered nurses by year. Be sure to use meaningful axis names, readable axis ticks, etc.
nurses %>%
  group_by(Year) %>%
  summarise(total_rn = sum(Total_Employed_RN, na.rm = TRUE)) %>%
  ggplot(aes(x = Year, y = total_rn)) +
  geom_line(color = "red", linewidth = 1.2) +
  geom_point(color = "black") + 
  labs(
    title = "Total Registered Nurses (1998-2020)",
    x = "Year", y = "Total Registered Nurses") + 
  theme_minimal() + 
  theme(plot.title = element_text(hjust = 0.5))

  1. Which data presentation, table or data visualization, do you think helps answers the question posed? Explain your reasoning.
  • The line graph is a better visualization for answering the question because it shows the trend in the total number of registered nurses over the years in a way that is easy to understand and follow.
  1. Using the data visualization and/or the table, provide an answer to the question.
  • Between 1998 and 2020, the total number of registered nurses in the United States increased steadily, with a slight decrease in 2012, followed by exponential growth since then.

Use the following posed question for Questions 5-9:

For the subset of states in the midwest (Minnesota, Wisconsin, Iowa, Illinois), how have the median hourly wages changed between 2000 and 2020?

  1. Answer this question by first wrangling the data and then creating a table of median hourly wages like the table below, where each row is a year (2000 or 2020), each row group is one of the Midwestern states, and there is a column for median hourly wages. Note that the states are reordered in a meaningful way (rather than by alphabetical) and the table has a title, meaningful column names, and values are formatted appropriately.

wages <- nurses %>% 
  filter(State %in% c("Minnesota", "Wisconsin", "Iowa", "Illinois"),
Year %in% c(2000, 2020)) %>%
  select(State, Year, Hourly_Wage_Median) %>%
group_by(State) %>%
  mutate(wage_order = max(Hourly_Wage_Median)) %>%
  ungroup() %>%
  arrange(desc(wage_order), State, Year) %>%
  select(-wage_order)

wages %>%
  gt(groupname_col = "State", rowname_col = "Year") %>%
  tab_header(title = "Median Hourly Wages (2000-2020)") %>%
  cols_label(Hourly_Wage_Median = "Registered Nurses Median Wage") %>%
  fmt_currency(columns = Hourly_Wage_Median, currency = "USD")
Median Hourly Wages (2000-2020)
Registered Nurses Median Wage
Minnesota
2000 $23.37
2020 $38.24
Wisconsin
2000 $20.81
2020 $35.35
Illinois
2000 $21.56
2020 $34.91
Iowa
2000 $17.46
2020 $29.39
  1. Answer this question in a similar manner to the previous subpart, but this time add a summary row that takes a difference between the two years, 2020 - 2000 (diff() function) for each state.

[Hint: You may need to arrange the data so that 2000 rows come first and then 2020 rows come next]

wages_changes <- wages %>% 
  filter(State %in% c("Minnesota", "Wisconsin", "Iowa", "Illinois"),
Year %in% c(2000, 2020)) %>%
  group_by(State, Year) %>%
  summarise(Hourly_Wage_Median = median(Hourly_Wage_Median, na.rm = TRUE), .groups = "drop")

nurse_wage <- wages_changes %>%
  pivot_wider(names_from = Year, values_from = Hourly_Wage_Median) %>%
  mutate(Change = `2020` - `2000`) %>%
  pivot_longer(cols = c(`2000`, `2020`, Change), names_to = "Year", values_to = "Hourly_Wage_Median") %>%
  mutate(
    State = factor(State, levels = c("Minnesota", "Wisconsin", "Illinois", "Iowa")),
    Year = factor(Year, levels = c("2000", "2020", "Change"))) %>%
  arrange(State, Year) 

nurse_wage %>%
   gt(groupname_col = "State", rowname_col = "Year") %>%
  tab_header(
    title = "Median Hourly Wage Changes (2000-2020)",
    subtitle = "Includes Median Wages 2000 & 2020") %>%
cols_label(Hourly_Wage_Median = "Registered Nurses Median Wage") %>%
fmt_currency(columns = Hourly_Wage_Median, currency = "USD")
Median Hourly Wage Changes (2000-2020)
Includes Median Wages 2000 & 2020
Registered Nurses Median Wage
Minnesota
2000 $23.37
2020 $38.24
Change $14.87
Wisconsin
2000 $20.81
2020 $35.35
Change $14.54
Illinois
2000 $21.56
2020 $34.91
Change $13.35
Iowa
2000 $17.46
2020 $29.39
Change $11.93
  1. Answer this question by creating a slopegraph of the median hourly wage for each year (2000 and 2020) for each Midwestern state. Be sure to take into account meaningful design elements as you create your plot (e.g., arranging the color in the legend in order of lines in plot).
median_wages <- wages %>% 
  filter(State %in% c("Minnesota", "Wisconsin", "Iowa", "Illinois"),
         Year %in% c(2000, 2020))

ggplot(median_wages, aes(x = Year, y = Hourly_Wage_Median, group = State, color = State)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 3) + 
  geom_text(aes(label = round(Hourly_Wage_Median, 1)),
            vjust = -0.5, size = 3, 
            position = position_nudge(y = 0.7)) + 
  scale_x_continuous(breaks = c(2000, 2020)) +
  scale_color_manual(values = c("red", "purple", "darkgreen", "blue")) + 
    labs(
      title = "Median Hourly Wage Changes (2000-2020)",
      x = "Year",
      y = "Median Hourly Wages",
      color = "State") +
    theme_minimal(base_size = 11) +
    theme(
      plot.title = element_text(hjust = 0.5, face = "bold"), 
      legend.title = element_text(face = "bold"),
      panel.grid.minor = element_blank()
    )

  1. Which data presentation, table or data visualization, do you think helps answers the question posed? Explain your reasoning.
  • Although the slopegraph shows that median hourly wages for registered nurses increased over time from 2000 to 2020, the table does a better job of showing how they changed. The second table is explicitly the best at answering the question because it includes wage changes across each state between 2000 and 2020.
  1. Using the data visualization and/or the table, provide an answer to the question.
  • Minnesota, with the highest hourly wage, had a median annual income change of $14.87 for registered nurses. Similarly, Wisconsin had a median yearly income change of $14.54. Illinois had a median income change of $13.35 among nurses, while Iowa, the state with the lowest hourly wage, had a median income change of $11.93.

Putting It All Together

Now let’s put the grammar of tables to use (in addition to data wrangling) to answer a question.

For nurses, how do the median annual salaries compare across the states pre-pandemic (2019) vs. post-pandemic (2020)?

  1. Wrangle the data to reproduce the end result in a table like this:

Tips:

  • Because this problem requires some tricky data wrangling that we haven’t covered yet (but will later), I have actually started this for you

  • You may still need to arrange the data so that 2019 rows come first and then 2020 rows come next.

  • The color palette in the table uses the following arguments: palette = c("#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab") and domain = NULL.

  • Your end result should show all 54 rows and not a subset of the rows, as shown in the image.

# you may need to change the name of the data set to match yours
wrangle_nurses <- nurses %>%
  filter(Year %in% c(2019, 2020)) %>%
  mutate(total_rn = Total_Employed_RN/1000, 
         annual_median = Annual_Salary_Median/1000) %>%
    select(State, Year, total_rn, annual_median) %>%
  pivot_wider(names_from = Year, values_from = c(total_rn, annual_median)) %>%
  mutate(pct_diff = annual_median_2020/annual_median_2019 - 1) %>%
  select(State, total_rn_2019, total_rn_2020, annual_median_2019, annual_median_2020, pct_diff) %>% 
  arrange(desc(pct_diff))


wrangle_nurses %>%
  gt() %>% 
  tab_header(
    title = md("**For nurses, how do the median annual salaries compare across the states pre-pandemic (2019) vs. post-pandemic (2020)?**")) %>%
    cols_label( 
      State = "State",
      total_rn_2019 = html("2019<sup>1</sup>"),
      total_rn_2020 = html("2020<sup>1</sup>"),
      annual_median_2019 = html("2019<sup>2</sup>"),
      annual_median_2020 = html("2020<sup>2</sup>"),
      pct_diff = html("Relative Percent Change<sup>3</sup>")) %>%
  fmt_number(columns = c(total_rn_2019, total_rn_2020), decimals = 2) %>%
  fmt_currency(columns = c(annual_median_2019, annual_median_2020), currency = "USD", decimals = 2) %>%
  fmt_percent(columns = pct_diff, decimals = 2) %>%

  gt_color_rows(columns = pct_diff,
    palette = c("#ffffff", "#f2fbd2", "#c9ecb4", "#93d3ab", "#35b0ab"),
    domain = NULL) %>%
  tab_source_note(
  source_note = html("Data source: Registered Nurses dataset (Tidy Tuesday, Oct. 05, 2019)<br>
    1 Total employed, registered nurses, (per a thousand)<br>
    2 Median annual salary, (per a thousand)<br>
    3 Median annual salary percent change = 2020/2019 − 1"))  
## Warning: Domain not specified, defaulting to observed range within each
## specified column.
For nurses, how do the median annual salaries compare across the states pre-pandemic (2019) vs. post-pandemic (2020)?
State 20191 20201 20192 20202 Relative Percent Change3
Washington 58.00 59.30 $83.49 $89.65 7.38%
California 302.77 307.06 $110.62 $118.41 7.04%
North Dakota 9.75 9.97 $64.68 $68.80 6.37%
Wyoming 5.12 5.01 $66.29 $70.45 6.28%
Guam 0.68 0.69 $56.36 $58.98 4.65%
Nebraska 23.80 24.06 $65.01 $68.01 4.61%
Maryland 53.15 51.48 $76.78 $79.81 3.95%
Alaska 6.21 6.24 $90.55 $94.07 3.89%
Oregon 36.66 36.84 $93.37 $96.79 3.66%
South Carolina 46.86 45.93 $63.75 $66.05 3.61%
Pennsylvania 148.04 146.64 $70.54 $72.97 3.44%
North Carolina 99.96 99.11 $64.60 $66.82 3.44%
Louisiana 40.87 41.69 $64.04 $66.24 3.44%
Vermont 7.02 6.81 $67.37 $69.67 3.41%
Arkansas 25.21 25.30 $60.34 $62.33 3.30%
Oklahoma 31.35 32.95 $63.65 $65.68 3.19%
Massachusetts 81.02 84.03 $87.54 $90.29 3.14%
Virginia 66.04 66.45 $70.23 $72.42 3.12%
Utah 21.65 23.69 $65.24 $67.18 2.97%
New Mexico 17.35 17.10 $73.18 $75.35 2.97%
New Hampshire 14.32 13.84 $72.69 $74.84 2.96%
Kansas 30.37 29.43 $60.80 $62.55 2.88%
New York 178.32 178.55 $87.33 $89.84 2.87%
Arizona 54.59 55.52 $76.82 $79.01 2.85%
Idaho 14.11 12.80 $69.32 $71.28 2.83%
West Virginia 19.83 19.80 $61.45 $63.18 2.82%
Missouri 68.84 71.56 $62.47 $64.22 2.80%
Wisconsin 61.93 63.63 $71.56 $73.54 2.77%
Iowa 32.98 32.61 $59.49 $61.13 2.76%
Ohio 125.47 129.09 $65.79 $67.58 2.72%
Texas 218.09 219.33 $73.40 $75.32 2.62%
Florida 181.67 183.13 $65.83 $67.51 2.55%
Virgin Islands 0.46 0.52 $70.44 $72.12 2.39%
South Dakota 12.95 13.13 $58.67 $60.00 2.27%
Mississippi 29.55 28.80 $58.59 $59.85 2.15%
Indiana 67.51 66.46 $63.67 $65.00 2.09%
Colorado 52.51 52.33 $75.10 $76.50 1.86%
Georgia 75.43 73.23 $68.41 $69.63 1.78%
Tennessee 63.33 61.04 $61.20 $62.22 1.67%
Kentucky 43.84 42.94 $62.18 $63.06 1.42%
Connecticut 34.74 33.40 $81.63 $82.77 1.40%
Illinois 129.53 127.45 $71.62 $72.61 1.38%
New Jersey 80.14 78.59 $83.92 $84.99 1.28%
Minnesota 71.00 70.82 $78.56 $79.54 1.25%
Montana 10.31 9.98 $67.92 $68.74 1.21%
Michigan 96.90 97.82 $72.26 $73.04 1.08%
Maine 14.49 14.16 $68.94 $69.51 0.83%
Nevada 22.94 23.42 $87.40 $87.96 0.64%
Puerto Rico 19.51 19.25 $33.07 $33.15 0.24%
Rhode Island 12.63 12.15 $83.14 $83.06 −0.10%
Hawaii 11.33 11.26 $110.70 $110.41 −0.26%
Alabama 49.19 48.85 $58.80 $58.63 −0.29%
Delaware 11.73 11.41 $72.83 $72.11 −0.99%
District of Columbia 10.89 10.32 $91.47 $89.44 −2.22%
Data source: Registered Nurses dataset (Tidy Tuesday, Oct. 05, 2019)
1 Total employed, registered nurses, (per a thousand)
2 Median annual salary, (per a thousand)
3 Median annual salary percent change = 2020/2019 − 1
  1. Use the the table to provide an answer to the question.
  • The table shows that between 2019 and 2020, the median annual salary for registered nurses had increased in most states. The largest increase in annual wages occurred in Washington, California, North Dakota, and Wyoming. On the other hand, states like the District of Columbia, Alabama, Delaware, Rhode Island, and Hawaii saw a slight decrease in registered nurse annual salaries. Overall, the pattern of wage growth indicates the continual rise in nurses’ wages since the COVID-19 pandemic began.

  1. Source: Tidy Tuesday dataset from May 7, 2019.↩︎

LS0tCnRpdGxlOiAiV2VlayA5IENoYWxsZW5nZSBQcm9ibGVtIgphdXRob3I6ICJCaWxzdW1hIEFkZW1hIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQotLS0KCiMjIyBQcmVwYXJhdGlvbiBJbnN0cnVjdGlvbnMKCi0gQmUgc3VyZSB0byBjaGFuZ2UgdGhlIGF1dGhvciBpbiB0aGUgWUFNTCB0byB5b3VyIG5hbWUuIFJlbWVtYmVyIHRvIGtlZXAgaXQgaW5zaWRlIHRoZSBxdW90ZXMuCgotIFF1ZXN0aW9ucyB0aGF0IHJlcXVpcmUgdGhlIHVzZSBvZiBSIHdpbGwgaGF2ZSBhbiBSIGNvZGUgY2h1bmsgYmVsb3cgaXQuCgotIERvd25sb2FkIHRoZSBSZWdpc3RlcmVkIE51cnNlcyBkYXRhc2V0ICh0aXRsZWQgKm51cnNlcy5jc3YqKSBhbmQgKm51cnNlcy1zYWxhcnkucG5nKiBmcm9tIHRoZSBDYW52YXMgcGFnZSBmb3IgdGhpcyBhc3NpZ25tZW50IGFuZCBzYXZlIHRoZXNlIGZpbGVzIHRvIHRoZSBmb2xkZXIgd2hlcmUgdGhlIFJNRCBmaWxlIGlzIGxvY2F0ZWQuIAoKLSBUaGVyZSBpcyBsZXNzIGhhbmQtaG9sZGluZyBpbiB0aGlzIGFzc2lnbm1lbnQuCiAgICAtIFRoZSBwYWNrYWdlcyB0aGF0IG5lZWQgdG8gYmUgbG9hZGVkIHdpbGwgbm8gbG9uZ2VyIGJlIHByb3ZpZGVkIGluIHRoZSBzZXR1cCBjb2RlIGNodW5rLiBZb3UgYXJlIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRoZSBhcHByb3ByaWF0ZSBwYWNrYWdlcyBmb3IgdGhlIGFzc2lnbm1lbnQuCiAgICAtIFF1ZXN0aW9ucyBvbiBleGFtaW5pbmcgdGhlIGRhdGEgd2lsbCBubyBsb25nZXIgYmUgcHJvdmlkZWQuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBzZW5zZSBvZiB0aGUgZGF0YSBwcmlvciB0byBjb21wbGV0aW5nIHRoZSBhbmFseXNlcy4gCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShndCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ3RFeHRyYXMpCm51cnNlcyA8LSByZWFkLmNzdigibnVyc2VzLmNzdiIsIGhlYWRlciA9IFRSVUUpCgoKCmBgYAoKIyMjIyBUSEUgREFUQVNFVFMKCkZvciB0aGlzIENoYWxsZW5nZSBQcm9ibGVtIGFzc2lnbm1lbnQsIHlvdSBhcmUgZ29pbmcgdG8gYmUgdXNpbmcgdGhlIERhdGEuV29ybGQgZGF0YXNldCBvbiByZWdpc3RlcmVkIG51cnNlcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBiZXR3ZWVuIDE5OTggYW5kIDIwMjAuXltTb3VyY2U6IFtUaWR5IFR1ZXNkYXkgZGF0YXNldCBmcm9tIE1heSA3LCAyMDE5XShodHRwczovL2dpdGh1Yi5jb20vcmZvcmRhdGFzY2llbmNlL3RpZHl0dWVzZGF5L3RyZWUvbWFzdGVyL2RhdGEvMjAxOS8yMDE5LTA1LTA3KS5dICBUaGUgZGF0YSBpbmNsdWRlcyB0b3RhbCBudW1iZXJzIG9mIHJlZ2lzdGVyZWQgbnVyc2UgYW5kIHNhbGFyeSBpbmZvcm1hdGlvbiBhdCB0aGUgc3RhdGUtbGV2ZWwgYnkgeWVhci4gVGhlIG9yaWdpbmFsIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZGF0YXNldCBjYW4gYmUgZm91bmQgb24gaXRzIFtUaWR5IFR1ZXNkYXkgcGFnZV0oaHR0cHM6Ly9naXRodWIuY29tL3Jmb3JkYXRhc2NpZW5jZS90aWR5dHVlc2RheS90cmVlL21hc3Rlci9kYXRhLzIwMjEvMjAyMS0xMC0wNSkuIFtOb3RlOiBJIG1vZGlmaWVkIHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIHNvIHRoZXJlIHdlcmUgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIHNwYWNlcywgc28gYmUgc3VyZSB0byBpbnNwZWN0IHRoZSBuYW1lcyBvZiB0aGUgdmFyaWFibGVzIGJlZm9yZSB3b3JraW5nIHdpdGggdGhlIGRhdGFzZXQuXQoKIyMjIyBFWEVSQ0lTRVMKCioqUHJhY3RpY2UgUHJvYmxlbXMqKgoKTm93IGxldCdzIHByYWN0aWNlIG1ha2luZyB0YWJsZXMgYW5kIGRhdGEgdmlzdWFsaXphdGlvbnMgdG8gYW5zd2VyIHF1ZXN0aW9ucy4gRWFjaCBxdWVzdGlvbiBpcyBzdXBwb3NlZCB0byBiZSBzdGFuZCBhbG9uZSBhbmQgbm90IGJ1aWxkIGZyb20gZWFjaCBvdGhlciAodW5sZXNzIHNwZWNpZmllZCkuIAoKKipVc2UgdGhlIGZvbGxvd2luZyBwb3NlZCBxdWVzdGlvbiBmb3IgUXVlc3Rpb25zIDEtNDoqKgoKKipXaGF0IGlzIHRoZSBnZW5lcmFsIHRyZW5kIG9mIHRvdGFsIG51bWJlciBvZiByZWdpc3RlcmVkIG51cnNlcyBhY3Jvc3MgdGhlIHllYXJzIDE5OTggYW5kIDIwMjAgaW4gdGhlIFVuaXRlZCBTdGF0ZXM/KiogCgooQCkgQW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkgY3JlYXRpbmcgYSBzaW1wbGUgdGFibGUgb2YgY291bnQgb2YgcmVnaXN0ZXJlZCBudXJzZXMgYnkgeWVhciB1c2luZyB0aGUgZ3QgcGFja2FnZS4KCmBgYHtyfQpudXJzZXMgJT4lCiAgZ3JvdXBfYnkoWWVhcikgJT4lCiAgc3VtbWFyaXNlKHRvdGFsX3JuID0gc3VtKFRvdGFsX0VtcGxveWVkX1JOLCBuYS5ybSA9IFRSVUUpKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiVG90YWwgTnVtYmVyIG9mIFJlZ2lzdGVyZWQgTnVyc2VzICgxOTk4LTIwMjApIiwgCiAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJUb3RhbCBudW1iZXIgb2YgZW1wbG95ZWQgbnVyc2VzIGJ5IHllYXIiKSAlPiUKICBjb2xzX2xhYmVsKHRvdGFsX3JuID0gIlRvdGFsIFJlZ2lzdGVyZWQgTnVyc2VzIikgJT4lCiAgZm10X251bWJlcihjb2x1bW5zID0gdG90YWxfcm4sIGRlY2ltYWxzID0gMCkKYGBgCgooQCkgQW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkgY3JlYXRpbmcgYSBkYXRhIHZpc3VhbGl6YXRpb24gb2YgY291bnQgb2YgcmVnaXN0ZXJlZCBudXJzZXMgYnkgeWVhci4gQmUgc3VyZSB0byB1c2UgbWVhbmluZ2Z1bCBheGlzIG5hbWVzLCByZWFkYWJsZSBheGlzIHRpY2tzLCBldGMuCgpgYGB7cn0KbnVyc2VzICU+JQogIGdyb3VwX2J5KFllYXIpICU+JQogIHN1bW1hcmlzZSh0b3RhbF9ybiA9IHN1bShUb3RhbF9FbXBsb3llZF9STiwgbmEucm0gPSBUUlVFKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gWWVhciwgeSA9IHRvdGFsX3JuKSkgKwogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLCBsaW5ld2lkdGggPSAxLjIpICsKICBnZW9tX3BvaW50KGNvbG9yID0gImJsYWNrIikgKyAKICBsYWJzKAogICAgdGl0bGUgPSAiVG90YWwgUmVnaXN0ZXJlZCBOdXJzZXMgKDE5OTgtMjAyMCkiLAogICAgeCA9ICJZZWFyIiwgeSA9ICJUb3RhbCBSZWdpc3RlcmVkIE51cnNlcyIpICsgCiAgdGhlbWVfbWluaW1hbCgpICsgCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCmBgYAoKKEApIFdoaWNoIGRhdGEgcHJlc2VudGF0aW9uLCB0YWJsZSBvciBkYXRhIHZpc3VhbGl6YXRpb24sIGRvIHlvdSB0aGluayBoZWxwcyBhbnN3ZXJzIHRoZSBxdWVzdGlvbiBwb3NlZD8gRXhwbGFpbiB5b3VyIHJlYXNvbmluZy4KCiAgLSBUaGUgbGluZSBncmFwaCBpcyBhIGJldHRlciB2aXN1YWxpemF0aW9uIGZvciBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uIGJlY2F1c2UgaXQgc2hvd3MgdGhlIHRyZW5kIGluIHRoZSB0b3RhbCBudW1iZXIgb2YgcmVnaXN0ZXJlZCBudXJzZXMgb3ZlciB0aGUgeWVhcnMgaW4gYSB3YXkgdGhhdCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIGZvbGxvdy4gCiAgCihAKSBVc2luZyB0aGUgZGF0YSB2aXN1YWxpemF0aW9uIGFuZC9vciB0aGUgdGFibGUsIHByb3ZpZGUgYW4gYW5zd2VyIHRvIHRoZSBxdWVzdGlvbi4KCi0gQmV0d2VlbiAxOTk4IGFuZCAyMDIwLCB0aGUgdG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgbnVyc2VzIGluIHRoZSBVbml0ZWQgU3RhdGVzIGluY3JlYXNlZCBzdGVhZGlseSwgd2l0aCBhIHNsaWdodCBkZWNyZWFzZSBpbiAyMDEyLCBmb2xsb3dlZCBieSBleHBvbmVudGlhbCBncm93dGggc2luY2UgdGhlbi4gCgoqKlVzZSB0aGUgZm9sbG93aW5nIHBvc2VkIHF1ZXN0aW9uIGZvciBRdWVzdGlvbnMgNS05OioqCgoqKkZvciB0aGUgc3Vic2V0IG9mIHN0YXRlcyBpbiB0aGUgbWlkd2VzdCAoTWlubmVzb3RhLCBXaXNjb25zaW4sIElvd2EsIElsbGlub2lzKSwgaG93IGhhdmUgdGhlIG1lZGlhbiBob3VybHkgd2FnZXMgY2hhbmdlZCBiZXR3ZWVuIDIwMDAgYW5kIDIwMjA/KiogCgooQCkgQW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkgZmlyc3Qgd3JhbmdsaW5nIHRoZSBkYXRhIGFuZCB0aGVuIGNyZWF0aW5nIGEgdGFibGUgb2YgKm1lZGlhbiBob3VybHkgd2FnZXMqIGxpa2UgdGhlIHRhYmxlIGJlbG93LCB3aGVyZSBlYWNoIHJvdyBpcyBhIHllYXIgKDIwMDAgb3IgMjAyMCksIGVhY2ggcm93IGdyb3VwIGlzIG9uZSBvZiB0aGUgTWlkd2VzdGVybiBzdGF0ZXMsIGFuZCB0aGVyZSBpcyBhIGNvbHVtbiBmb3IgbWVkaWFuIGhvdXJseSB3YWdlcy4gTm90ZSB0aGF0IHRoZSBzdGF0ZXMgYXJlIHJlb3JkZXJlZCBpbiBhIG1lYW5pbmdmdWwgd2F5IChyYXRoZXIgdGhhbiBieSBhbHBoYWJldGljYWwpIGFuZCB0aGUgdGFibGUgaGFzIGEgdGl0bGUsIG1lYW5pbmdmdWwgY29sdW1uIG5hbWVzLCBhbmQgdmFsdWVzIGFyZSBmb3JtYXR0ZWQgYXBwcm9wcmlhdGVseS4gCgohW10oTWVkaWFuX0hvdXJseV9XYWdlcy5wbmcpCgpgYGB7cn0Kd2FnZXMgPC0gbnVyc2VzICU+JSAKICBmaWx0ZXIoU3RhdGUgJWluJSBjKCJNaW5uZXNvdGEiLCAiV2lzY29uc2luIiwgIklvd2EiLCAiSWxsaW5vaXMiKSwKWWVhciAlaW4lIGMoMjAwMCwgMjAyMCkpICU+JQogIHNlbGVjdChTdGF0ZSwgWWVhciwgSG91cmx5X1dhZ2VfTWVkaWFuKSAlPiUKZ3JvdXBfYnkoU3RhdGUpICU+JQogIG11dGF0ZSh3YWdlX29yZGVyID0gbWF4KEhvdXJseV9XYWdlX01lZGlhbikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGRlc2Mod2FnZV9vcmRlciksIFN0YXRlLCBZZWFyKSAlPiUKICBzZWxlY3QoLXdhZ2Vfb3JkZXIpCgp3YWdlcyAlPiUKICBndChncm91cG5hbWVfY29sID0gIlN0YXRlIiwgcm93bmFtZV9jb2wgPSAiWWVhciIpICU+JQogIHRhYl9oZWFkZXIodGl0bGUgPSAiTWVkaWFuIEhvdXJseSBXYWdlcyAoMjAwMC0yMDIwKSIpICU+JQogIGNvbHNfbGFiZWwoSG91cmx5X1dhZ2VfTWVkaWFuID0gIlJlZ2lzdGVyZWQgTnVyc2VzIE1lZGlhbiBXYWdlIikgJT4lCiAgZm10X2N1cnJlbmN5KGNvbHVtbnMgPSBIb3VybHlfV2FnZV9NZWRpYW4sIGN1cnJlbmN5ID0gIlVTRCIpCgoKCmBgYAoKKEApIEFuc3dlciB0aGlzIHF1ZXN0aW9uIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gdGhlIHByZXZpb3VzIHN1YnBhcnQsIGJ1dCB0aGlzIHRpbWUgYWRkIGEgc3VtbWFyeSByb3cgdGhhdCB0YWtlcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHllYXJzLCAyMDIwIC0gMjAwMCAoYGRpZmYoKWAgZnVuY3Rpb24pIGZvciBlYWNoIHN0YXRlLiAKICAKKltIaW50OiBZb3UgbWF5IG5lZWQgdG8gYXJyYW5nZSB0aGUgZGF0YSBzbyB0aGF0IDIwMDAgcm93cyBjb21lIGZpcnN0IGFuZCB0aGVuIDIwMjAgcm93cyBjb21lIG5leHRdKgogIApgYGB7cn0Kd2FnZXNfY2hhbmdlcyA8LSB3YWdlcyAlPiUgCiAgZmlsdGVyKFN0YXRlICVpbiUgYygiTWlubmVzb3RhIiwgIldpc2NvbnNpbiIsICJJb3dhIiwgIklsbGlub2lzIiksClllYXIgJWluJSBjKDIwMDAsIDIwMjApKSAlPiUKICBncm91cF9ieShTdGF0ZSwgWWVhcikgJT4lCiAgc3VtbWFyaXNlKEhvdXJseV9XYWdlX01lZGlhbiA9IG1lZGlhbihIb3VybHlfV2FnZV9NZWRpYW4sIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpCgpudXJzZV93YWdlIDwtIHdhZ2VzX2NoYW5nZXMgJT4lCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFllYXIsIHZhbHVlc19mcm9tID0gSG91cmx5X1dhZ2VfTWVkaWFuKSAlPiUKICBtdXRhdGUoQ2hhbmdlID0gYDIwMjBgIC0gYDIwMDBgKSAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IGMoYDIwMDBgLCBgMjAyMGAsIENoYW5nZSksIG5hbWVzX3RvID0gIlllYXIiLCB2YWx1ZXNfdG8gPSAiSG91cmx5X1dhZ2VfTWVkaWFuIikgJT4lCiAgbXV0YXRlKAogICAgU3RhdGUgPSBmYWN0b3IoU3RhdGUsIGxldmVscyA9IGMoIk1pbm5lc290YSIsICJXaXNjb25zaW4iLCAiSWxsaW5vaXMiLCAiSW93YSIpKSwKICAgIFllYXIgPSBmYWN0b3IoWWVhciwgbGV2ZWxzID0gYygiMjAwMCIsICIyMDIwIiwgIkNoYW5nZSIpKSkgJT4lCiAgYXJyYW5nZShTdGF0ZSwgWWVhcikgCgpudXJzZV93YWdlICU+JQogICBndChncm91cG5hbWVfY29sID0gIlN0YXRlIiwgcm93bmFtZV9jb2wgPSAiWWVhciIpICU+JQogIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJNZWRpYW4gSG91cmx5IFdhZ2UgQ2hhbmdlcyAoMjAwMC0yMDIwKSIsCiAgICBzdWJ0aXRsZSA9ICJJbmNsdWRlcyBNZWRpYW4gV2FnZXMgMjAwMCAmIDIwMjAiKSAlPiUKY29sc19sYWJlbChIb3VybHlfV2FnZV9NZWRpYW4gPSAiUmVnaXN0ZXJlZCBOdXJzZXMgTWVkaWFuIFdhZ2UiKSAlPiUKZm10X2N1cnJlbmN5KGNvbHVtbnMgPSBIb3VybHlfV2FnZV9NZWRpYW4sIGN1cnJlbmN5ID0gIlVTRCIpCgoKCgoKYGBgCgooQCkgQW5zd2VyIHRoaXMgcXVlc3Rpb24gYnkgY3JlYXRpbmcgYSBzbG9wZWdyYXBoIG9mIHRoZSBtZWRpYW4gaG91cmx5IHdhZ2UgZm9yIGVhY2ggeWVhciAoMjAwMCBhbmQgMjAyMCkgZm9yIGVhY2ggTWlkd2VzdGVybiBzdGF0ZS4gQmUgc3VyZSB0byB0YWtlIGludG8gYWNjb3VudCBtZWFuaW5nZnVsIGRlc2lnbiBlbGVtZW50cyBhcyB5b3UgY3JlYXRlIHlvdXIgcGxvdCAoZS5nLiwgYXJyYW5naW5nIHRoZSBjb2xvciBpbiB0aGUgbGVnZW5kIGluIG9yZGVyIG9mIGxpbmVzIGluIHBsb3QpLgogIApgYGB7cn0KbWVkaWFuX3dhZ2VzIDwtIHdhZ2VzICU+JSAKICBmaWx0ZXIoU3RhdGUgJWluJSBjKCJNaW5uZXNvdGEiLCAiV2lzY29uc2luIiwgIklvd2EiLCAiSWxsaW5vaXMiKSwKICAgICAgICAgWWVhciAlaW4lIGMoMjAwMCwgMjAyMCkpCgpnZ3Bsb3QobWVkaWFuX3dhZ2VzLCBhZXMoeCA9IFllYXIsIHkgPSBIb3VybHlfV2FnZV9NZWRpYW4sIGdyb3VwID0gU3RhdGUsIGNvbG9yID0gU3RhdGUpKSArCiAgZ2VvbV9saW5lKGxpbmV3aWR0aCA9IDEuMikgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsgCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKEhvdXJseV9XYWdlX01lZGlhbiwgMSkpLAogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSAzLCAKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9udWRnZSh5ID0gMC43KSkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYygyMDAwLCAyMDIwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAicHVycGxlIiwgImRhcmtncmVlbiIsICJibHVlIikpICsgCiAgICBsYWJzKAogICAgICB0aXRsZSA9ICJNZWRpYW4gSG91cmx5IFdhZ2UgQ2hhbmdlcyAoMjAwMC0yMDIwKSIsCiAgICAgIHggPSAiWWVhciIsCiAgICAgIHkgPSAiTWVkaWFuIEhvdXJseSBXYWdlcyIsCiAgICAgIGNvbG9yID0gIlN0YXRlIikgKwogICAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMSkgKwogICAgdGhlbWUoCiAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLAogICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpCiAgICApCmBgYAoKKEApIFdoaWNoIGRhdGEgcHJlc2VudGF0aW9uLCB0YWJsZSBvciBkYXRhIHZpc3VhbGl6YXRpb24sIGRvIHlvdSB0aGluayBoZWxwcyBhbnN3ZXJzIHRoZSBxdWVzdGlvbiBwb3NlZD8gRXhwbGFpbiB5b3VyIHJlYXNvbmluZy4gCgogLSBBbHRob3VnaCB0aGUgc2xvcGVncmFwaCBzaG93cyB0aGF0IG1lZGlhbiBob3VybHkgd2FnZXMgZm9yIHJlZ2lzdGVyZWQgbnVyc2VzIGluY3JlYXNlZCBvdmVyIHRpbWUgZnJvbSAyMDAwIHRvIDIwMjAsIHRoZSB0YWJsZSBkb2VzIGEgYmV0dGVyIGpvYiBvZiBzaG93aW5nIGhvdyB0aGV5IGNoYW5nZWQuIFRoZSBzZWNvbmQgdGFibGUgaXMgZXhwbGljaXRseSB0aGUgYmVzdCBhdCBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uIGJlY2F1c2UgaXQgaW5jbHVkZXMgd2FnZSBjaGFuZ2VzIGFjcm9zcyBlYWNoIHN0YXRlIGJldHdlZW4gMjAwMCBhbmQgMjAyMC4gCgogIAooQCkgVXNpbmcgdGhlIGRhdGEgdmlzdWFsaXphdGlvbiBhbmQvb3IgdGhlIHRhYmxlLCBwcm92aWRlIGFuIGFuc3dlciB0byB0aGUgcXVlc3Rpb24uCgotIE1pbm5lc290YSwgd2l0aCB0aGUgaGlnaGVzdCBob3VybHkgd2FnZSwgaGFkIGEgbWVkaWFuIGFubnVhbCBpbmNvbWUgY2hhbmdlIG9mICQxNC44NyBmb3IgcmVnaXN0ZXJlZCBudXJzZXMuIFNpbWlsYXJseSwgV2lzY29uc2luIGhhZCBhIG1lZGlhbiB5ZWFybHkgaW5jb21lIGNoYW5nZSBvZiAkMTQuNTQuIElsbGlub2lzIGhhZCBhIG1lZGlhbiBpbmNvbWUgY2hhbmdlIG9mICQxMy4zNSBhbW9uZyBudXJzZXMsIHdoaWxlIElvd2EsIHRoZSBzdGF0ZSB3aXRoIHRoZSBsb3dlc3QgaG91cmx5IHdhZ2UsIGhhZCBhIG1lZGlhbiBpbmNvbWUgY2hhbmdlIG9mICQxMS45My4gCgoKCioqUHV0dGluZyBJdCBBbGwgVG9nZXRoZXIqKgoKTm93IGxldCdzIHB1dCB0aGUgZ3JhbW1hciBvZiB0YWJsZXMgdG8gdXNlIChpbiBhZGRpdGlvbiB0byBkYXRhIHdyYW5nbGluZykgdG8gYW5zd2VyIGEgcXVlc3Rpb24uCgo8cCBhbGlnbj0iY2VudGVyIj4KKipGb3IgbnVyc2VzLCBob3cgZG8gdGhlIG1lZGlhbiBhbm51YWwgc2FsYXJpZXMgY29tcGFyZSBhY3Jvc3MgdGhlIHN0YXRlcyBwcmUtcGFuZGVtaWMgKDIwMTkpIHZzLiBwb3N0LXBhbmRlbWljICgyMDIwKT8qKgo8L3A+CgooQCkgV3JhbmdsZSB0aGUgZGF0YSB0byByZXByb2R1Y2UgdGhlIGVuZCByZXN1bHQgaW4gYSB0YWJsZSBsaWtlIHRoaXM6IAoKPHAgYWxpZ249ImNlbnRlciI+CiFbXShudXJzZXMtc2FsYXJ5LnBuZyl7d2lkdGg9OTAlfTwvcD4gCgoqKlRpcHM6KiogCgotIEJlY2F1c2UgdGhpcyBwcm9ibGVtIHJlcXVpcmVzIHNvbWUgdHJpY2t5IGRhdGEgd3JhbmdsaW5nIHRoYXQgd2UgaGF2ZW4ndCBjb3ZlcmVkIHlldCAoYnV0IHdpbGwgbGF0ZXIpLCBJIGhhdmUgYWN0dWFsbHkgc3RhcnRlZCB0aGlzIGZvciB5b3UKCi0gWW91IG1heSBzdGlsbCBuZWVkIHRvIGFycmFuZ2UgdGhlIGRhdGEgc28gdGhhdCAyMDE5IHJvd3MgY29tZSBmaXJzdCBhbmQgdGhlbiAyMDIwIHJvd3MgY29tZSBuZXh0LgoKLSBUaGUgY29sb3IgcGFsZXR0ZSBpbiB0aGUgdGFibGUgdXNlcyB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czogYHBhbGV0dGUgPSBjKCIjZmZmZmZmIiwgIiNmMmZiZDIiLCAiI2M5ZWNiNCIsICIjOTNkM2FiIiwgIiMzNWIwYWIiKWAgYW5kIGBkb21haW4gPSBOVUxMYC4KCi0gWW91ciBlbmQgcmVzdWx0IHNob3VsZCBzaG93IGFsbCA1NCByb3dzIGFuZCBub3QgYSBzdWJzZXQgb2YgdGhlIHJvd3MsIGFzIHNob3duIGluIHRoZSBpbWFnZS4KCmBgYHtyfQojIHlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGRhdGEgc2V0IHRvIG1hdGNoIHlvdXJzCndyYW5nbGVfbnVyc2VzIDwtIG51cnNlcyAlPiUKICBmaWx0ZXIoWWVhciAlaW4lIGMoMjAxOSwgMjAyMCkpICU+JQogIG11dGF0ZSh0b3RhbF9ybiA9IFRvdGFsX0VtcGxveWVkX1JOLzEwMDAsIAogICAgICAgICBhbm51YWxfbWVkaWFuID0gQW5udWFsX1NhbGFyeV9NZWRpYW4vMTAwMCkgJT4lCiAgICBzZWxlY3QoU3RhdGUsIFllYXIsIHRvdGFsX3JuLCBhbm51YWxfbWVkaWFuKSAlPiUKICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gWWVhciwgdmFsdWVzX2Zyb20gPSBjKHRvdGFsX3JuLCBhbm51YWxfbWVkaWFuKSkgJT4lCiAgbXV0YXRlKHBjdF9kaWZmID0gYW5udWFsX21lZGlhbl8yMDIwL2FubnVhbF9tZWRpYW5fMjAxOSAtIDEpICU+JQogIHNlbGVjdChTdGF0ZSwgdG90YWxfcm5fMjAxOSwgdG90YWxfcm5fMjAyMCwgYW5udWFsX21lZGlhbl8yMDE5LCBhbm51YWxfbWVkaWFuXzIwMjAsIHBjdF9kaWZmKSAlPiUgCiAgYXJyYW5nZShkZXNjKHBjdF9kaWZmKSkKCgp3cmFuZ2xlX251cnNlcyAlPiUKICBndCgpICU+JSAKICB0YWJfaGVhZGVyKAogICAgdGl0bGUgPSBtZCgiKipGb3IgbnVyc2VzLCBob3cgZG8gdGhlIG1lZGlhbiBhbm51YWwgc2FsYXJpZXMgY29tcGFyZSBhY3Jvc3MgdGhlIHN0YXRlcyBwcmUtcGFuZGVtaWMgKDIwMTkpIHZzLiBwb3N0LXBhbmRlbWljICgyMDIwKT8qKiIpKSAlPiUKICAgIGNvbHNfbGFiZWwoIAogICAgICBTdGF0ZSA9ICJTdGF0ZSIsCiAgICAgIHRvdGFsX3JuXzIwMTkgPSBodG1sKCIyMDE5PHN1cD4xPC9zdXA+IiksCiAgICAgIHRvdGFsX3JuXzIwMjAgPSBodG1sKCIyMDIwPHN1cD4xPC9zdXA+IiksCiAgICAgIGFubnVhbF9tZWRpYW5fMjAxOSA9IGh0bWwoIjIwMTk8c3VwPjI8L3N1cD4iKSwKICAgICAgYW5udWFsX21lZGlhbl8yMDIwID0gaHRtbCgiMjAyMDxzdXA+Mjwvc3VwPiIpLAogICAgICBwY3RfZGlmZiA9IGh0bWwoIlJlbGF0aXZlIFBlcmNlbnQgQ2hhbmdlPHN1cD4zPC9zdXA+IikpICU+JQogIGZtdF9udW1iZXIoY29sdW1ucyA9IGModG90YWxfcm5fMjAxOSwgdG90YWxfcm5fMjAyMCksIGRlY2ltYWxzID0gMikgJT4lCiAgZm10X2N1cnJlbmN5KGNvbHVtbnMgPSBjKGFubnVhbF9tZWRpYW5fMjAxOSwgYW5udWFsX21lZGlhbl8yMDIwKSwgY3VycmVuY3kgPSAiVVNEIiwgZGVjaW1hbHMgPSAyKSAlPiUKICBmbXRfcGVyY2VudChjb2x1bW5zID0gcGN0X2RpZmYsIGRlY2ltYWxzID0gMikgJT4lCgogIGd0X2NvbG9yX3Jvd3MoY29sdW1ucyA9IHBjdF9kaWZmLAogICAgcGFsZXR0ZSA9IGMoIiNmZmZmZmYiLCAiI2YyZmJkMiIsICIjYzllY2I0IiwgIiM5M2QzYWIiLCAiIzM1YjBhYiIpLAogICAgZG9tYWluID0gTlVMTCkgJT4lCiAgdGFiX3NvdXJjZV9ub3RlKAogIHNvdXJjZV9ub3RlID0gaHRtbCgiRGF0YSBzb3VyY2U6IFJlZ2lzdGVyZWQgTnVyc2VzIGRhdGFzZXQgKFRpZHkgVHVlc2RheSwgT2N0LiAwNSwgMjAxOSk8YnI+CiAgICAxIFRvdGFsIGVtcGxveWVkLCByZWdpc3RlcmVkIG51cnNlcywgKHBlciBhIHRob3VzYW5kKTxicj4KICAgIDIgTWVkaWFuIGFubnVhbCBzYWxhcnksIChwZXIgYSB0aG91c2FuZCk8YnI+CiAgICAzIE1lZGlhbiBhbm51YWwgc2FsYXJ5IHBlcmNlbnQgY2hhbmdlID0gMjAyMC8yMDE5IOKIkiAxIikpICAKCmBgYAoKXHZzcGFjZXswLjVjbX0KCihAKSBVc2UgdGhlIHRoZSB0YWJsZSB0byBwcm92aWRlIGFuIGFuc3dlciB0byB0aGUgcXVlc3Rpb24uCgotIFRoZSB0YWJsZSBzaG93cyB0aGF0IGJldHdlZW4gMjAxOSBhbmQgMjAyMCwgdGhlIG1lZGlhbiBhbm51YWwgc2FsYXJ5IGZvciByZWdpc3RlcmVkIG51cnNlcyBoYWQgaW5jcmVhc2VkIGluIG1vc3Qgc3RhdGVzLiBUaGUgbGFyZ2VzdCBpbmNyZWFzZSBpbiBhbm51YWwgd2FnZXMgb2NjdXJyZWQgaW4gV2FzaGluZ3RvbiwgQ2FsaWZvcm5pYSwgTm9ydGggRGFrb3RhLCBhbmQgV3lvbWluZy4gT24gdGhlIG90aGVyIGhhbmQsIHN0YXRlcyBsaWtlIHRoZSBEaXN0cmljdCBvZiBDb2x1bWJpYSwgQWxhYmFtYSwgRGVsYXdhcmUsIFJob2RlIElzbGFuZCwgYW5kIEhhd2FpaSBzYXcgYSBzbGlnaHQgZGVjcmVhc2UgaW4gcmVnaXN0ZXJlZCBudXJzZSBhbm51YWwgc2FsYXJpZXMuIE92ZXJhbGwsIHRoZSBwYXR0ZXJuIG9mIHdhZ2UgZ3Jvd3RoIGluZGljYXRlcyB0aGUgY29udGludWFsIHJpc2UgaW4gbnVyc2Vz4oCZIHdhZ2VzIHNpbmNlIHRoZSBDT1ZJRC0xOSBwYW5kZW1pYyBiZWdhbi4K