library(tidyverse)
library(readxl)                   # package to open excel files
library(plotly)                   # a graphics package, and alternative to ggplot2 

These are the packages that I used for this assignment.

glimpse(GSS)
Rows: 6,309
Columns: 15
$ year     <dbl> 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 20…
$ id_      <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,…
$ hrs2     <chr> ".i:  Inapplicable", ".i:  Inapplicable", ".i:  Inapplicable",…
$ childs   <chr> "0", "1", "1", "1", "2", "1", "2", "2", "2", "0", "2", "3", "3…
$ age      <chr> "25", "43", "30", "55", "37", "47", "57", "71", "46", "19", "5…
$ sex      <chr> "FEMALE", "MALE", "FEMALE", "FEMALE", "MALE", "MALE", "FEMALE"…
$ race     <chr> "White", "White", "White", "White", "White", "White", "White",…
$ courts   <chr> "About right", "Not harshly enough", ".i:  Inapplicable", ".i:…
$ relig    <chr> "Inter-nondenominational", "Protestant", "Protestant", "Protes…
$ attend   <chr> "About once or twice a year", "About once a month", "Every wee…
$ hapmar   <chr> ".i:  Inapplicable", "PRETTY HAPPY", ".i:  Inapplicable", ".i:…
$ class_   <chr> "Middle class", "Middle class", "Working class", "Upper class"…
$ premarsx <chr> "ALWAYS WRONG", ".i:  Inapplicable", ".i:  Inapplicable", ".i:…
$ xmarsex  <chr> "ALWAYS WRONG", "ALWAYS WRONG", ".i:  Inapplicable", ".i:  Ina…
$ spanking <chr> "STRONGLY AGREE", ".i:  Inapplicable", ".i:  Inapplicable", ".…

Question 1.

GSS |>
  
   mutate(race = as_factor(race)) |> 
   mutate(race = fct_recode(race,
                            NULL = ".i:  Inapplicable")) |>
  
  mutate(race = fct_infreq(race)) |>
  plot_ly(x = ~race) |> 
  add_histogram()
Warning: Ignoring 53 observationsWarning: Ignoring 53 observations

This is a histogram for the variable race. The majority of the people who took this survey are white.

Question 2.

GSS |>
  
   mutate(spanking = as_factor(spanking)) |> 
   mutate(spanking = fct_recode(spanking,
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  
   plot_ly(x = ~spanking) |> 
  add_histogram()
Warning: Ignoring 3066 observationsWarning: Ignoring 3066 observations

This is a histogram showing whether people favor spanking their children as a form of discipline. A good percentage of the respondents agree that spanking is okay when disciplining kids.

Question 3.

GSS |>
  
   mutate(spanking = as_factor(spanking)) |> 
   mutate(spanking = fct_recode(spanking,
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(spanking = as.numeric(spanking)) |>
  
  mutate(race = as_factor(race)) |> 
  mutate(race = fct_recode(race,
                            NULL = ".i:  Inapplicable")) |>
  
  
  plot_ly(x = ~race, y = ~spanking) |> 
  add_boxplot()
Warning: Ignoring 3097 observationsWarning: Ignoring 3097 observations

This is a boxplot comparing favor of spanking as discipline and different races.

Question 4.

GSS |>
  
   mutate(childs = as_factor(childs)) |> 
   mutate(childs = fct_recode(childs, 
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose")) |>    
                            
  mutate(childs = as.numeric(childs)) |>
  
  
  plot_ly(x = ~childs) |> 
  add_histogram()
Warning: Ignoring 16 observationsWarning: Ignoring 16 observations

This is a histogram showing how many children the people that took the survey have. Most people that took this survey either claimed having zero or three children.

Question 5.

GSS |>
  
   mutate(spanking = as_factor(spanking)) |> 
   mutate(spanking = fct_recode(spanking,
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(childs = as_factor(childs)) |> 
  mutate(childs = fct_recode(childs,
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose")) |>   
                            
  mutate(childs = as.numeric(childs)) |>
  
  plot_ly(x = ~spanking, y = ~childs) |> 
  add_boxplot()
Warning: Ignoring 3074 observationsWarning: Ignoring 3074 observations

This is a boxplot with favor of spanking as the categorical variable compared to participants number of children as the numerical variable. It appears that those who strongly disagreed with spanking as a form of discipline had less kids.

Question 6.

GSS |>
  
   mutate(hapmar = as_factor(hapmar)) |> 
   mutate(hapmar = fct_recode(hapmar, 
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(hapmar = fct_infreq(hapmar)) |>                       
  
  plot_ly(x = ~hapmar) |> 
  add_histogram()
Warning: Ignoring 4251 observationsWarning: Ignoring 4251 observations

This is a histogram showing the survey’s participants opinions on their marriages. Most of the participants expressed being very happy with their marriage.

Question 7.

GSS |>
  
   mutate(class_ = as_factor(class_)) |> 
   mutate(class_ = fct_recode(class_, 
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(class_ = fct_infreq(class_)) |> 
  
  mutate(class_ = fct_relevel(class_,
                              c("Lower class",
                                "Working class",
                                "Middle class",
                                "Upper class"))) |>
  
  plot_ly(x = ~class_) |> 
  add_histogram()
Warning: Ignoring 55 observationsWarning: Ignoring 55 observations

This is a histogram showing what socioeconomic class the participants of this survey rated themselves. This graph shows that most participants rated themselves either middle or working class.

Question 8.

GSS |>
  
   mutate(class_ = as_factor(class_)) |> 
   mutate(class_ = fct_recode(class_, 
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(class_ = fct_infreq(class_)) |> 
  
  mutate(class_ = fct_relevel(class_,
                              c("Lower class",
                                "Working class",
                                "Middle class",
                                "Upper class"))) |>
  
  mutate(hapmar = as_factor(hapmar)) |> 
  mutate(hapmar = fct_recode(hapmar, 
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(hapmar = fct_infreq(hapmar)) |>
  
  plot_ly(x = ~class_, color = ~hapmar) |> 
  add_histogram()
Warning: Ignoring 55 observationsWarning: Ignoring 55 observations

This is a graph comparing the participants happiness with their marriages and their socioeconomic status. The graph shows that participants that are middle and working class tend to be happier in their marriages.

Question 9.

GSS |>
  
   mutate(age = as_factor(age)) |> 
   mutate(age = fct_recode(age, 
                            NULL = ".n:  No answer")) |>
  
   
  mutate(age = fct_collapse(age,
                              "Under 30" = c("18","19","20",
                                          "21",
                                          "22",
                                          "23",
                                          "24",
                                          "25",
                                          "26",
                                          "27",
                                          "28",
                                          "29"),
                              "30s" = c("30",
                                          "31",
                                          "32",
                                          "33",
                                          "34",
                                          "35",
                                          "36",
                                          "37",
                                          "38",
                                          "39"),
                              "40s" = c("40",
                                          "41",
                                          "42",
                                          "43",
                                          "44",
                                          "45",
                                          "46",
                                          "47",
                                          "48",
                                          "49"),
                            "50s" = c ("50",
                                       "51",
                                       "52",
                                       "53",
                                       "54",
                                       "55",
                                       "56",
                                       "57",
                                       "58",
                                       "59"),
                            "60s" = c ("60",
                                       "61",
                                       "62",
                                       "63",
                                       "64",
                                       "65",
                                       "66",
                                       "67",
                                       "68",
                                       "69"),
                            "70s" = c ("70",
                                       "71",
                                       "72",
                                       "73",
                                       "74",
                                       "75",
                                       "76",
                                       "77",
                                       "78",
                                       "79"),
                            "80 and up" = c ("80",
                                       "81",
                                       "82",
                                       "83",
                                       "84",
                                       "85",
                                       "86",
                                       "87",
                                       "88",
                                       "89 or older"))) |>
                                       
  mutate(age = fct_infreq(age)) |>
  drop_na(age) |>
  plot_ly(x = ~age) |> 
  add_histogram()

This is a graph showing the ages of the participants and how many participants are in each age group.

Question 10.

GSS |>
  
   mutate(age = as_factor(age)) |> 
   mutate(age = fct_recode(age, 
                            NULL = ".n:  No answer")) |>
  
   mutate(age = fct_collapse(age,
                              "Under 30" = c("18","19","20",
                                          "21",
                                          "22",
                                          "23",
                                          "24",
                                          "25",
                                          "26",
                                          "27",
                                          "28",
                                          "29"),
                              "30s" = c("30",
                                          "31",
                                          "32",
                                          "33",
                                          "34",
                                          "35",
                                          "36",
                                          "37",
                                          "38",
                                          "39"),
                              "40s" = c("40",
                                          "41",
                                          "42",
                                          "43",
                                          "44",
                                          "45",
                                          "46",
                                          "47",
                                          "48",
                                          "49"),
                            "50s" = c ("50",
                                       "51",
                                       "52",
                                       "53",
                                       "54",
                                       "55",
                                       "56",
                                       "57",
                                       "58",
                                       "59"),
                            "60s" = c ("60",
                                       "61",
                                       "62",
                                       "63",
                                       "64",
                                       "65",
                                       "66",
                                       "67",
                                       "68",
                                       "69"),
                            "70s" = c ("70",
                                       "71",
                                       "72",
                                       "73",
                                       "74",
                                       "75",
                                       "76",
                                       "77",
                                       "78",
                                       "79"),
                            "80 and up" = c ("80",
                                       "81",
                                       "82",
                                       "83",
                                       "84",
                                       "85",
                                       "86",
                                       "87",
                                       "88",
                                       "89 or older"))) |>
                                       
  mutate(age = fct_infreq(age)) |>
  drop_na(age) |>
  
  
   mutate(hapmar = as_factor(hapmar)) |> 
   mutate(hapmar = fct_recode(hapmar, 
                            NULL = ".i:  Inapplicable",
                            NULL = ".d:  Do not Know/Cannot Choose",
                            NULL = ".n:  No answer",
                            NULL = ".s:  Skipped on Web")) |>
  
  mutate(hapmar = fct_infreq(hapmar)) |>
  
  plot_ly(x = ~hapmar, y = ~age) |> 
  add_histogram2d()

This is a heatmap comparing the participants happiness with their marriages and their different ages. The heatmap shows that there are are more people that report being very happy in their marriages than pretty happy or not too happy.

LS0tCnRpdGxlOiAiR1NTIFN1cnZleSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkgICAgICAgICAgICAgICAgICAgIyBwYWNrYWdlIHRvIG9wZW4gZXhjZWwgZmlsZXMKbGlicmFyeShwbG90bHkpICAgICAgICAgICAgICAgICAgICMgYSBncmFwaGljcyBwYWNrYWdlLCBhbmQgYWx0ZXJuYXRpdmUgdG8gZ2dwbG90MiAKYGBgCgpUaGVzZSBhcmUgdGhlIHBhY2thZ2VzIHRoYXQgSSB1c2VkIGZvciB0aGlzIGFzc2lnbm1lbnQuCgpgYGB7cn0KZ2xpbXBzZShHU1MpCmBgYAoKUXVlc3Rpb24gMS4KCmBgYHtyfQpHU1MgfD4KICAKICAgbXV0YXRlKHJhY2UgPSBhc19mYWN0b3IocmFjZSkpIHw+IAogICBtdXRhdGUocmFjZSA9IGZjdF9yZWNvZGUocmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLmk6ICBJbmFwcGxpY2FibGUiKSkgfD4KICAKICBtdXRhdGUocmFjZSA9IGZjdF9pbmZyZXEocmFjZSkpIHw+CiAgcGxvdF9seSh4ID0gfnJhY2UpIHw+IAogIGFkZF9oaXN0b2dyYW0oKQpgYGAKClRoaXMgaXMgYSBoaXN0b2dyYW0gZm9yIHRoZSB2YXJpYWJsZSByYWNlLiBUaGUgbWFqb3JpdHkgb2YgdGhlIHBlb3BsZSB3aG8gdG9vayB0aGlzIHN1cnZleSBhcmUgd2hpdGUuIAoKUXVlc3Rpb24gMi4gCgpgYGB7cn0KR1NTIHw+CiAgCiAgIG11dGF0ZShzcGFua2luZyA9IGFzX2ZhY3RvcihzcGFua2luZykpIHw+IAogICBtdXRhdGUoc3BhbmtpbmcgPSBmY3RfcmVjb2RlKHNwYW5raW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuaTogIEluYXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5kOiAgRG8gbm90IEtub3cvQ2Fubm90IENob29zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5uOiAgTm8gYW5zd2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLnM6ICBTa2lwcGVkIG9uIFdlYiIpKSB8PgogIAogIAogICBwbG90X2x5KHggPSB+c3BhbmtpbmcpIHw+IAogIGFkZF9oaXN0b2dyYW0oKQpgYGAKClRoaXMgaXMgYSBoaXN0b2dyYW0gc2hvd2luZyB3aGV0aGVyIHBlb3BsZSBmYXZvciBzcGFua2luZyB0aGVpciBjaGlsZHJlbiBhcyBhIGZvcm0gb2YgZGlzY2lwbGluZS4gQSBnb29kIHBlcmNlbnRhZ2Ugb2YgdGhlIHJlc3BvbmRlbnRzIGFncmVlIHRoYXQgc3BhbmtpbmcgaXMgb2theSB3aGVuIGRpc2NpcGxpbmluZyBraWRzLiAKClF1ZXN0aW9uIDMuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoc3BhbmtpbmcgPSBhc19mYWN0b3Ioc3BhbmtpbmcpKSB8PiAKICAgbXV0YXRlKHNwYW5raW5nID0gZmN0X3JlY29kZShzcGFua2luZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLmk6ICBJbmFwcGxpY2FibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuZDogIERvIG5vdCBLbm93L0Nhbm5vdCBDaG9vc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIubjogIE5vIGFuc3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5zOiAgU2tpcHBlZCBvbiBXZWIiKSkgfD4KICAKICBtdXRhdGUoc3BhbmtpbmcgPSBhcy5udW1lcmljKHNwYW5raW5nKSkgfD4KICAKICBtdXRhdGUocmFjZSA9IGFzX2ZhY3RvcihyYWNlKSkgfD4gCiAgbXV0YXRlKHJhY2UgPSBmY3RfcmVjb2RlKHJhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5pOiAgSW5hcHBsaWNhYmxlIikpIHw+CiAgCiAgCiAgcGxvdF9seSh4ID0gfnJhY2UsIHkgPSB+c3BhbmtpbmcpIHw+IAogIGFkZF9ib3hwbG90KCkKYGBgCgpUaGlzIGlzIGEgYm94cGxvdCBjb21wYXJpbmcgZmF2b3Igb2Ygc3BhbmtpbmcgYXMgZGlzY2lwbGluZSBhbmQgZGlmZmVyZW50IHJhY2VzLiAKClF1ZXN0aW9uIDQuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoY2hpbGRzID0gYXNfZmFjdG9yKGNoaWxkcykpIHw+IAogICBtdXRhdGUoY2hpbGRzID0gZmN0X3JlY29kZShjaGlsZHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuaTogIEluYXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5kOiAgRG8gbm90IEtub3cvQ2Fubm90IENob29zZSIpKSB8PiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIG11dGF0ZShjaGlsZHMgPSBhcy5udW1lcmljKGNoaWxkcykpIHw+CiAgCiAgCiAgcGxvdF9seSh4ID0gfmNoaWxkcykgfD4gCiAgYWRkX2hpc3RvZ3JhbSgpCmBgYAoKVGhpcyBpcyBhIGhpc3RvZ3JhbSBzaG93aW5nIGhvdyBtYW55IGNoaWxkcmVuIHRoZSBwZW9wbGUgdGhhdCB0b29rIHRoZSBzdXJ2ZXkgaGF2ZS4gTW9zdCBwZW9wbGUgdGhhdCB0b29rIHRoaXMgc3VydmV5IGVpdGhlciBjbGFpbWVkIGhhdmluZyB6ZXJvIG9yIHRocmVlIGNoaWxkcmVuLiAKClF1ZXN0aW9uIDUuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoc3BhbmtpbmcgPSBhc19mYWN0b3Ioc3BhbmtpbmcpKSB8PiAKICAgbXV0YXRlKHNwYW5raW5nID0gZmN0X3JlY29kZShzcGFua2luZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLmk6ICBJbmFwcGxpY2FibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuZDogIERvIG5vdCBLbm93L0Nhbm5vdCBDaG9vc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIubjogIE5vIGFuc3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5zOiAgU2tpcHBlZCBvbiBXZWIiKSkgfD4KICAKICBtdXRhdGUoY2hpbGRzID0gYXNfZmFjdG9yKGNoaWxkcykpIHw+IAogIG11dGF0ZShjaGlsZHMgPSBmY3RfcmVjb2RlKGNoaWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLmk6ICBJbmFwcGxpY2FibGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuZDogIERvIG5vdCBLbm93L0Nhbm5vdCBDaG9vc2UiKSkgfD4gICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIG11dGF0ZShjaGlsZHMgPSBhcy5udW1lcmljKGNoaWxkcykpIHw+CiAgCiAgcGxvdF9seSh4ID0gfnNwYW5raW5nLCB5ID0gfmNoaWxkcykgfD4gCiAgYWRkX2JveHBsb3QoKQpgYGAKClRoaXMgaXMgYSBib3hwbG90IHdpdGggZmF2b3Igb2Ygc3BhbmtpbmcgYXMgdGhlIGNhdGVnb3JpY2FsIHZhcmlhYmxlIGNvbXBhcmVkIHRvIHBhcnRpY2lwYW50cyBudW1iZXIgb2YgY2hpbGRyZW4gYXMgdGhlIG51bWVyaWNhbCB2YXJpYWJsZS4gSXQgYXBwZWFycyB0aGF0IHRob3NlIHdobyBzdHJvbmdseSBkaXNhZ3JlZWQgd2l0aCBzcGFua2luZyBhcyBhIGZvcm0gb2YgZGlzY2lwbGluZSBoYWQgbGVzcyBraWRzLiAKClF1ZXN0aW9uIDYuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoaGFwbWFyID0gYXNfZmFjdG9yKGhhcG1hcikpIHw+IAogICBtdXRhdGUoaGFwbWFyID0gZmN0X3JlY29kZShoYXBtYXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuaTogIEluYXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5kOiAgRG8gbm90IEtub3cvQ2Fubm90IENob29zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5uOiAgTm8gYW5zd2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLnM6ICBTa2lwcGVkIG9uIFdlYiIpKSB8PgogIAogIG11dGF0ZShoYXBtYXIgPSBmY3RfaW5mcmVxKGhhcG1hcikpIHw+ICAgICAgICAgICAgICAgICAgICAgICAKICAKICBwbG90X2x5KHggPSB+aGFwbWFyKSB8PiAKICBhZGRfaGlzdG9ncmFtKCkKYGBgCgpUaGlzIGlzIGEgaGlzdG9ncmFtIHNob3dpbmcgdGhlIHN1cnZleSdzIHBhcnRpY2lwYW50cyBvcGluaW9ucyBvbiB0aGVpciBtYXJyaWFnZXMuIE1vc3Qgb2YgdGhlIHBhcnRpY2lwYW50cyBleHByZXNzZWQgYmVpbmcgdmVyeSBoYXBweSB3aXRoIHRoZWlyIG1hcnJpYWdlLiAKClF1ZXN0aW9uIDcuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoY2xhc3NfID0gYXNfZmFjdG9yKGNsYXNzXykpIHw+IAogICBtdXRhdGUoY2xhc3NfID0gZmN0X3JlY29kZShjbGFzc18sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuZDogIERvIG5vdCBLbm93L0Nhbm5vdCBDaG9vc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIubjogIE5vIGFuc3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5zOiAgU2tpcHBlZCBvbiBXZWIiKSkgfD4KICAKICBtdXRhdGUoY2xhc3NfID0gZmN0X2luZnJlcShjbGFzc18pKSB8PiAKICAKICBtdXRhdGUoY2xhc3NfID0gZmN0X3JlbGV2ZWwoY2xhc3NfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJMb3dlciBjbGFzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvcmtpbmcgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWRkbGUgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBjbGFzcyIpKSkgfD4KICAKICBwbG90X2x5KHggPSB+Y2xhc3NfKSB8PiAKICBhZGRfaGlzdG9ncmFtKCkKYGBgCgpUaGlzIGlzIGEgaGlzdG9ncmFtIHNob3dpbmcgd2hhdCBzb2Npb2Vjb25vbWljIGNsYXNzIHRoZSBwYXJ0aWNpcGFudHMgb2YgdGhpcyBzdXJ2ZXkgcmF0ZWQgdGhlbXNlbHZlcy4gVGhpcyBncmFwaCBzaG93cyB0aGF0IG1vc3QgcGFydGljaXBhbnRzIHJhdGVkIHRoZW1zZWx2ZXMgZWl0aGVyIG1pZGRsZSBvciB3b3JraW5nIGNsYXNzLiAKClF1ZXN0aW9uIDguIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoY2xhc3NfID0gYXNfZmFjdG9yKGNsYXNzXykpIHw+IAogICBtdXRhdGUoY2xhc3NfID0gZmN0X3JlY29kZShjbGFzc18sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuZDogIERvIG5vdCBLbm93L0Nhbm5vdCBDaG9vc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIubjogIE5vIGFuc3dlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5zOiAgU2tpcHBlZCBvbiBXZWIiKSkgfD4KICAKICBtdXRhdGUoY2xhc3NfID0gZmN0X2luZnJlcShjbGFzc18pKSB8PiAKICAKICBtdXRhdGUoY2xhc3NfID0gZmN0X3JlbGV2ZWwoY2xhc3NfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJMb3dlciBjbGFzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvcmtpbmcgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWRkbGUgY2xhc3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcHBlciBjbGFzcyIpKSkgfD4KICAKICBtdXRhdGUoaGFwbWFyID0gYXNfZmFjdG9yKGhhcG1hcikpIHw+IAogIG11dGF0ZShoYXBtYXIgPSBmY3RfcmVjb2RlKGhhcG1hciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5pOiAgSW5hcHBsaWNhYmxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLmQ6ICBEbyBub3QgS25vdy9DYW5ub3QgQ2hvb3NlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLm46ICBObyBhbnN3ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuczogIFNraXBwZWQgb24gV2ViIikpIHw+CiAgCiAgbXV0YXRlKGhhcG1hciA9IGZjdF9pbmZyZXEoaGFwbWFyKSkgfD4KICAKICBwbG90X2x5KHggPSB+Y2xhc3NfLCBjb2xvciA9IH5oYXBtYXIpIHw+IAogIGFkZF9oaXN0b2dyYW0oKQpgYGAKClRoaXMgaXMgYSBncmFwaCBjb21wYXJpbmcgdGhlIHBhcnRpY2lwYW50cyBoYXBwaW5lc3Mgd2l0aCB0aGVpciBtYXJyaWFnZXMgYW5kIHRoZWlyIHNvY2lvZWNvbm9taWMgc3RhdHVzLiBUaGUgZ3JhcGggc2hvd3MgdGhhdCBwYXJ0aWNpcGFudHMgdGhhdCBhcmUgbWlkZGxlIGFuZCB3b3JraW5nIGNsYXNzIHRlbmQgdG8gYmUgaGFwcGllciBpbiB0aGVpciBtYXJyaWFnZXMuIAoKUXVlc3Rpb24gOS4gCgpgYGB7cn0KR1NTIHw+CiAgCiAgIG11dGF0ZShhZ2UgPSBhc19mYWN0b3IoYWdlKSkgfD4gCiAgIG11dGF0ZShhZ2UgPSBmY3RfcmVjb2RlKGFnZSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5uOiAgTm8gYW5zd2VyIikpIHw+CiAgCiAgIAogIG11dGF0ZShhZ2UgPSBmY3RfY29sbGFwc2UoYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5kZXIgMzAiID0gYygiMTgiLCIxOSIsIjIwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjI5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMHMiID0gYygiMzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQwcyIgPSBjKCI0MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0NiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0OSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUwcyIgPSBjICgiNTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MHMiID0gYyAoIjYwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjY5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzBzIiA9IGMgKCI3MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3NiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI3OSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgwIGFuZCB1cCIgPSBjICgiODAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiODkgb3Igb2xkZXIiKSkpIHw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIG11dGF0ZShhZ2UgPSBmY3RfaW5mcmVxKGFnZSkpIHw+CiAgZHJvcF9uYShhZ2UpIHw+CiAgcGxvdF9seSh4ID0gfmFnZSkgfD4gCiAgYWRkX2hpc3RvZ3JhbSgpCmBgYAoKVGhpcyBpcyBhIGdyYXBoIHNob3dpbmcgdGhlIGFnZXMgb2YgdGhlIHBhcnRpY2lwYW50cyBhbmQgaG93IG1hbnkgcGFydGljaXBhbnRzIGFyZSBpbiBlYWNoIGFnZSBncm91cC4gIAoKUXVlc3Rpb24gMTAuIAoKYGBge3J9CkdTUyB8PgogIAogICBtdXRhdGUoYWdlID0gYXNfZmFjdG9yKGFnZSkpIHw+IAogICBtdXRhdGUoYWdlID0gZmN0X3JlY29kZShhZ2UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIubjogIE5vIGFuc3dlciIpKSB8PgogIAogICBtdXRhdGUoYWdlID0gZmN0X2NvbGxhcHNlKGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVyIDMwIiA9IGMoIjE4IiwiMTkiLCIyMCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyNyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyOSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzBzIiA9IGMoIjMwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjM5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0MHMiID0gYygiNDAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MHMiID0gYyAoIjUwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjU5IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNjBzIiA9IGMgKCI2MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2MyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2OCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2OSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjcwcyIgPSBjICgiNzAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNzkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICI4MCBhbmQgdXAiID0gYyAoIjgwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjgzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg1IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg2IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg3IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg4IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjg5IG9yIG9sZGVyIikpKSB8PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBtdXRhdGUoYWdlID0gZmN0X2luZnJlcShhZ2UpKSB8PgogIGRyb3BfbmEoYWdlKSB8PgogIAogIAogICBtdXRhdGUoaGFwbWFyID0gYXNfZmFjdG9yKGhhcG1hcikpIHw+IAogICBtdXRhdGUoaGFwbWFyID0gZmN0X3JlY29kZShoYXBtYXIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCA9ICIuaTogIEluYXBwbGljYWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5kOiAgRG8gbm90IEtub3cvQ2Fubm90IENob29zZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMID0gIi5uOiAgTm8gYW5zd2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgPSAiLnM6ICBTa2lwcGVkIG9uIFdlYiIpKSB8PgogIAogIG11dGF0ZShoYXBtYXIgPSBmY3RfaW5mcmVxKGhhcG1hcikpIHw+CiAgCiAgcGxvdF9seSh4ID0gfmhhcG1hciwgeSA9IH5hZ2UpIHw+IAogIGFkZF9oaXN0b2dyYW0yZCgpCmBgYAoKVGhpcyBpcyBhIGhlYXRtYXAgY29tcGFyaW5nIHRoZSBwYXJ0aWNpcGFudHMgaGFwcGluZXNzIHdpdGggdGhlaXIgbWFycmlhZ2VzIGFuZCB0aGVpciBkaWZmZXJlbnQgYWdlcy4gVGhlIGhlYXRtYXAgc2hvd3MgdGhhdCB0aGVyZSBhcmUgYXJlIG1vcmUgcGVvcGxlIHRoYXQgcmVwb3J0IGJlaW5nIHZlcnkgaGFwcHkgaW4gdGhlaXIgbWFycmlhZ2VzIHRoYW4gcHJldHR5IGhhcHB5IG9yIG5vdCB0b28gaGFwcHkuIAoKCg==