CONSORT flow

consort <- readRDS(here("data", "completion_summary.rds")) %>% 
  spread(reason, n) %>% 
  mutate(group = 1:n(),
         assigned = Approved + `Failed first attention check`,
         issue = str_replace_all(issue, "assistance", "assist.")) %>% 
  mutate(assigned_label = glue("Allocated to Group {group}\n{crackdown}\n{issue}\n{funding} funding\n\nN = {assigned}"),
         completed_label = glue("Completed\nN = {Approved}\n\n{`Failed first attention check`} failed\nattention check"))

assessed_eligibility_n <- sum(consort$Approved, consort$`Failed first attention check`, 
                              consort$`Took survey outisde of MTurk`)
ineligible_n <- sum(consort$`Took survey outisde of MTurk`)
randomized_n <- sum(consort$Approved, consort$`Failed first attention check`)


# https://aghaynes.wordpress.com/2018/05/09/flow-charts-in-r/
# set some parameters to use repeatedly
width <- 0.1
xs <- seq(0.1, 0.9, length.out = 8)
allocated_y <- 0.375
completed_y <- 0.125

box_gp_grey <- gpar(fill = ngo_cols("light grey"))
box_gp_blue_dk <- gpar(fill = ngo_cols("blue"), alpha = 0.75)
box_gp_blue_lt <- gpar(fill = ngo_cols("blue"), alpha = 0.35)
box_gp_green <- gpar(fill = ngo_cols("green"), alpha = 0.65)
box_gp_yellow <- gpar(fill = ngo_cols("yellow"))
box_gp_orange <- gpar(fill = ngo_cols("orange"), alpha = 0.65)

txt_gp <- gpar(fontfamily = "Encode Sans Condensed Medium", 
               fontface = "plain", fontsize = 8)

# Create boxes
total <- boxGrob(glue("Assessed for eligibility\n N = {assessed_eligibility_n}"), 
                 x = 0.5, y = 0.9, width = 2 * width,
                 box_gp = box_gp_blue_lt, txt_gp = txt_gp)
randomized <- boxGrob(glue("Randomized\n N = {randomized_n}"), 
                      x = 0.5, y = 0.65, width = 2 * width,
                      box_gp = box_gp_blue_dk, txt_gp = txt_gp)
ineligible <- boxGrob(glue("Participants excluded for\ncompleting Qualtrics survey\noutside of MTurk\n N = {ineligible_n}"), 
                      x = xs[7], y = 0.775, #width = 0.25,
                      box_gp = box_gp_yellow, txt_gp = txt_gp)

group1 <- boxGrob(filter(consort, group == 1)$assigned_label,
                  x = xs[1], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group2 <- boxGrob(filter(consort, group == 2)$assigned_label,
                  x = xs[2], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group3 <- boxGrob(filter(consort, group == 3)$assigned_label,
                  x = xs[3], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group4 <- boxGrob(filter(consort, group == 4)$assigned_label,
                  x = xs[4], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group5 <- boxGrob(filter(consort, group == 5)$assigned_label,
                  x = xs[5], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group6 <- boxGrob(filter(consort, group == 6)$assigned_label,
                  x = xs[6], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group7 <- boxGrob(filter(consort, group == 7)$assigned_label,
                  x = xs[7], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)
group8 <- boxGrob(filter(consort, group == 8)$assigned_label,
                  x = xs[8], y = allocated_y, width = width, 
                  box_gp = box_gp_orange, txt_gp = txt_gp)

group1_completed <- boxGrob(filter(consort, group == 1)$completed_label, 
                            x = xs[1], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group2_completed <- boxGrob(filter(consort, group == 2)$completed_label, 
                            x = xs[2], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group3_completed <- boxGrob(filter(consort, group == 3)$completed_label, 
                            x = xs[3], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group4_completed <- boxGrob(filter(consort, group == 4)$completed_label, 
                            x = xs[4], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group5_completed <- boxGrob(filter(consort, group == 5)$completed_label, 
                            x = xs[5], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group6_completed <- boxGrob(filter(consort, group == 6)$completed_label, 
                            x = xs[6], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group7_completed <- boxGrob(filter(consort, group == 7)$completed_label, 
                            x = xs[7], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)
group8_completed <- boxGrob(filter(consort, group == 8)$completed_label, 
                            x = xs[8], y = completed_y, width = width,
                            box_gp = box_gp_green, txt_gp = txt_gp)

total_random_connect <- connectGrob(total, randomized, "v")
total_ineligible_connect <- connectGrob(total, ineligible, "-")

rand_connect1 <- connectGrob(randomized, group1, "N")
rand_connect2 <- connectGrob(randomized, group2, "N")
rand_connect3 <- connectGrob(randomized, group3, "N")
rand_connect4 <- connectGrob(randomized, group4, "N")
rand_connect5 <- connectGrob(randomized, group5, "N")
rand_connect6 <- connectGrob(randomized, group6, "N")
rand_connect7 <- connectGrob(randomized, group7, "N")
rand_connect8 <- connectGrob(randomized, group8, "N")

complete_connect1 <- connectGrob(group1, group1_completed, "N")
complete_connect2 <- connectGrob(group2, group2_completed, "N")
complete_connect3 <- connectGrob(group3, group3_completed, "N")
complete_connect4 <- connectGrob(group4, group4_completed, "N")
complete_connect5 <- connectGrob(group5, group5_completed, "N")
complete_connect6 <- connectGrob(group6, group6_completed, "N")
complete_connect7 <- connectGrob(group7, group7_completed, "N")
complete_connect8 <- connectGrob(group8, group8_completed, "N")

full_chart <- list(total, randomized, ineligible, total_random_connect, total_ineligible_connect,
                   group1, group2, group3, group4, group5, group6, group7, group8,
                   rand_connect1, rand_connect2, rand_connect3, rand_connect4, 
                   rand_connect5, rand_connect6, rand_connect7, rand_connect8,
                   group1_completed, group2_completed, group3_completed, group4_completed, 
                   group5_completed, group6_completed, group7_completed, group8_completed,
                   complete_connect1, complete_connect2, complete_connect3, complete_connect4, 
                   complete_connect5, complete_connect6, complete_connect7, complete_connect8) 

Characteristics of experiment samples

We compare our sample with demographic characteristics of the general population. Since there is no nationally representative sample for each of our demographic variables, we use two waves of the US Census’s Current Population Survey (CPS), with data from the Minnesota Population Center’s Integrated Public Use Microdata Series (IPUMS).

For general demographic information, we use data from the 2017 Annual Social and Economic Supplement (ASEC) for the CPS. From 2002–2015, the CPS included a Volunteer Supplement every September, so we use 2015 data for data on volunteering and donating to charity.

IPUMS requires that you manually generate a data extract through their website, so downloading data from them is not entirely automated or reproducible. We created two extracts (though this could have been combined into one), with the following variables

  • "data/ipums-cps/cps_2017.dat.gz": 2017 ASEC, with the following variables selected (in addition to whatever IPUMS preselects by default) (and weighted by ASECWT):
    • AGE
    • SEX
    • EDUC
    • INCTOT
  • "data/ipums-cps/cps_09_2015.dat.gz": September 2015 basic monthly CPS (which includes the Volunteer Supplement), with the following variables selected (and weighted by VLSUPPWT):
    • VLSTATUS
    • VLDONATE

We do not show other respondent demographic details because we don’t have good population-level data to compare our sample with. We could theoretically use Pew data for political preferences, but they collect data on party affiliation, while we collected data about respondent positions along a conservative–liberal spectrum, so the two variables aren’t comparable.

Characteristics of experimental sample {#tbl:exp-sample}
Variable Sample National median 90% HPDI
Female (%)a 54.4% 51.0% 3.4% (-0.1%, 6.9%)
Age (% 35+)a 48.0% 53.9% -6.0% (-9.9%, -2.6%)
Income (% $50,000+)a 50.7% 27.4% 22.0% (18.2%, 25.3%)
Education (% BA+)a 45.8% 29.9% 16.0% (12.8%, 19.6%)
Donated in past year (%)b 82.4% 48.8% 33.6% (30.9%, 36.2%)
Volunteered in past year (%)b 54.2% 75.1% -20.9% (-24.2%, -17.3%)
aAnnual CPS, March 2017
bMonthly CPS, September 2015
National value is outside the sample highest posterior density interval (HPDI)

Miscellaneous survey details

Average time to complete survey

Statistic Minutes
Minimum 00:42
Maximum 17:34
Mean 03:21
Standard deviation 02:04
Median 02:48

Amount donated (full)

Models

(1) (2) (3) (4) (5) (6)
Intercept 20.207  20.641  22.033  4.324  4.740  6.146 
(1.597) (2.239) (3.049) (4.514) (4.938) (5.207)
Crackdown (yes) 3.797  2.636  -2.692  3.178  2.349  -2.676 
(2.254) (3.055) (4.337) (2.108) (3.057) (4.227)
Issue (humanitarian)       -0.993  -4.030        -1.138  -3.359 
      (3.094) (4.312)       (3.059) (4.245)
Funding (private)             -2.867              -2.108 
            (4.444)             (4.279)
Crackdown × Issue       2.418  15.090        1.851  13.427 
      (4.366) (5.969)       (4.263) (6.023)
Crackdown × Funding             10.831              9.920 
            (6.274)             (6.090)
Issue × Funding             6.595              4.747 
            (6.013)             (6.082)
Crackdown × Issue × Funding             -25.544              -22.980 
            (8.628)             (8.702)
Prior favorability towards humanitarian NGOs                   1.220  1.340  1.177 
                  (3.691) (3.739) (3.762)
Give to charity once a month–once a year                   8.650  8.667  8.608 
                  (3.184) (3.150) (3.083)
Give to charity at least once a month                   7.435  7.470  7.388 
                  (3.696) (3.875) (3.669)
Volunteered in past year                   5.480  5.519  5.230 
                  (2.293) (2.359) (2.264)
Follow current political evens often                   -2.809  -2.728  -2.152 
                  (2.798) (2.933) (2.822)
Liberal political views                   8.270  8.267  8.105 
                  (2.340) (2.291) (2.386)
Bachelor’s degree or higher                   -2.445  -2.536  -2.464 
                  (2.218) (2.263) (2.236)
Attend religious services at least once a month                   9.817  9.833  9.230 
                  (2.696) (2.724) (2.796)
Income $50,000 or higher                   2.342  2.306  2.114 
                  (2.173) (2.286) (2.252)
Age 35 or higher                   1.924  1.974  1.693 
                  (2.199) (2.265) (2.302)
Observations 546      546      546      530      530      530     
Posterior sample size 4000.000  4000.000  4000.000  4000.000  4000.000  4000.000 
Sigma 25.517  25.569  25.386  24.699  24.746  24.549 
.

Coefficient plot

posterior_details <- data_frame(model_name = c("Basic model", "Full model"),
                                model = list(m_amount_cif,
                                             m_amount_cif_full)) %>% 
  mutate(posterior = model %>% map(~ as_data_frame(.)),
         tidy_summary = model %>% map(~ tidyMCMC(., conf.int = TRUE, conf.level = 0.9,
                                                 conf.method = "HPDinterval"))) 

coefs_posterior <- posterior_details %>%
  unnest(posterior) %>% 
  gather(term, value, -model_name) %>% 
  left_join(clean_coefs, by = "term") %>% 
  filter(term_clean != "Intercept") %>% 
  mutate(full_model = !simple_model)

coefs_summary <- posterior_details %>% 
  unnest(tidy_summary) %>% 
  left_join(clean_coefs, by = "term") %>% 
  filter(term_clean != "Intercept") %>% 
  mutate(full_model = !simple_model)

amount_coefs_full <- ggplot(coefs_posterior, aes(x = value, y = fct_rev(term_clean_fct))) +
  stat_density_ridges(aes(fill = model_name), alpha = 0.6, color = "black",
                      rel_min_height = 0.01, scale = 1.5, 
                      quantile_lines = TRUE, quantiles = 2) +
  geom_segment(data = coefs_summary, 
               aes(x = conf.low, xend = conf.high, 
                   y = fct_rev(term_clean_fct), yend = fct_rev(term_clean_fct)),
               size = 1) +
  geom_vline(xintercept = 0, linetype = "dotted", size = 1) + 
  scale_fill_manual(values = ngo_cols("red", "blue", name = FALSE), name = NULL) +
  labs(x = "Posterior median estimate + 90% credible interval", y = NULL,
       caption = "90% credible intervals shown in black. Solid vertical line = median; dotted vertical line = 0") +
  facet_wrap(~ full_model, scales = "free") + 
  theme_ngos() +
  theme(legend.position = "bottom",
        strip.text = element_blank())

amount_coefs_full %T>%
  print() %T>% 
  ggsave(., filename = here("output", "figures", "amount-coefs-full.pdf"),
         width = 8, height = 5, units = "in", device = cairo_pdf) %>% 
  ggsave(., filename = here("output", "figures", "amount-coefs-full.png"),
         width = 8, height = 5, units = "in", type = "cairo", dpi = 300)

Predicted medians across different variables

Charitable giving

Voluntarism and religiosity


Likelihood of donation (full)

Models

(1) (2) (3) (4) (5) (6)
Intercept -0.299  -0.283  -0.170  -2.241  -2.324  -2.247 
(0.120) (0.171) (0.234) (0.431) (0.489) (0.529)
Crackdown (yes) 0.140  0.020  -0.681  0.211  0.131  -0.620 
(0.166) (0.239) (0.340) (0.183) (0.254) (0.379)
Issue (humanitarian)       -0.034  -0.061        0.116  0.131 
      (0.236) (0.312)       (0.254) (0.359)
Funding (private)             -0.241              -0.219 
            (0.337)             (0.356)
Crackdown × Issue       0.227  0.898        0.175  0.883 
      (0.335) (0.452)       (0.360) (0.516)
Crackdown × Funding             1.399              1.462 
            (0.464)             (0.518)
Issue × Funding             0.086              0.010 
            (0.462)             (0.492)
Crackdown × Issue × Funding             -1.343              -1.405 
            (0.641)             (0.710)
Prior favorability towards humanitarian NGOs                   0.619  0.621  0.635 
                  (0.346) (0.357) (0.373)
Give to charity once a month–once a year                   1.722  1.728  1.759 
                  (0.318) (0.318) (0.325)
Give to charity at least once a month                   1.593  1.609  1.646 
                  (0.364) (0.359) (0.377)
Volunteered in past year                   -0.128  -0.149  -0.149 
                  (0.201) (0.199) (0.205)
Follow current political evens often                   -0.277  -0.256  -0.245 
                  (0.249) (0.259) (0.257)
Liberal political views                   0.630  0.637  0.653 
                  (0.203) (0.200) (0.203)
Bachelor’s degree or higher                   -0.101  -0.104  -0.114 
                  (0.203) (0.198) (0.193)
Attend religious services at least once a month                   0.257  0.238  0.216 
                  (0.228) (0.235) (0.227)
Income $50,000 or higher                   -0.067  -0.066  -0.081 
                  (0.191) (0.201) (0.197)
Age 35 or higher                   -0.325  -0.330  -0.376 
                  (0.197) (0.195) (0.199)
Observations 546      546      546      530      530      530     
Posterior sample size 4000.000  4000.000  4000.000  4000.000  4000.000  4000.000 
Sigma 1.000  1.000  1.000  1.000  1.000  1.000 
.

Coefficient plot

posterior_details_likely <- data_frame(model_name = c("Basic model", "Full model"),
                                       model = list(m_likely_cif,
                                                    m_likely_cif_full)) %>% 
  mutate(posterior = model %>% map(~ as_data_frame(.)),
         tidy_summary = model %>% map(~ tidyMCMC(., conf.int = TRUE, conf.level = 0.9,
                                                 conf.method = "HPDinterval"))) 

coefs_posterior_likely <- posterior_details_likely %>%
  unnest(posterior) %>% 
  gather(term, value, -model_name) %>% 
  left_join(clean_coefs, by = "term") %>% 
  filter(term_clean != "Intercept") %>% 
  mutate(full_model = !simple_model)

coefs_summary_likely <- posterior_details_likely %>% 
  unnest(tidy_summary) %>% 
  left_join(clean_coefs, by = "term") %>% 
  filter(term_clean != "Intercept") %>% 
  mutate(full_model = !simple_model)

likely_coefs_full <- ggplot(coefs_posterior_likely, aes(x = value, y = fct_rev(term_clean_fct))) +
  stat_density_ridges(aes(fill = model_name), alpha = 0.6, color = "black",
                      rel_min_height = 0.01, scale = 1.5, 
                      quantile_lines = TRUE, quantiles = 2) +
  geom_segment(data = coefs_summary_likely, 
               aes(x = conf.low, xend = conf.high, 
                   y = fct_rev(term_clean_fct), yend = fct_rev(term_clean_fct)),
               size = 1) +
  geom_vline(xintercept = 0, linetype = "dotted", size = 1) + 
  scale_fill_manual(values = ngo_cols("red", "blue", name = FALSE), name = NULL) +
  labs(x = "Posterior median estimate + 90% credible interval", y = NULL,
       caption = "90% credible intervals shown in black. Solid vertical line = median; dotted vertical line = 0") +
  facet_wrap(~ full_model, scales = "free") + 
  theme_ngos() +
  theme(legend.position = "bottom",
        strip.text = element_blank())

likely_coefs_full %T>%
  print() %T>% 
  ggsave(., filename = here("output", "figures", "likely-coefs-full.pdf"),
         width = 8, height = 5, units = "in", device = cairo_pdf) %>% 
  ggsave(., filename = here("output", "figures", "likely-coefs-full.png"),
         width = 8, height = 5, units = "in", type = "cairo", dpi = 300)

Original computing environment

## # http://dirk.eddelbuettel.com/blog/2017/11/27/#011_faster_package_installation_one
## VER=
## CCACHE=ccache
## CC=$(CCACHE) gcc$(VER)
## CXX=$(CCACHE) g++$(VER)
## CXXFLAGS=-Wno-unused-variable -Wno-unused-function -Wno-unused-local-typedefs
## CXX11=$(CCACHE) g++$(VER)
## CXX14=$(CCACHE) g++$(VER)
## FLIBS = -L`gfortran -print-file-name=libgfortran.dylib | xargs dirname`
## FC=$(CCACHE) gfortran$(VER)
## F77=$(CCACHE) gfortran$(VER)
## Session info -------------------------------------------------------------
##  setting  value                       
##  version  R version 3.5.1 (2018-07-02)
##  system   x86_64, darwin15.6.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  tz       America/Denver              
##  date     2018-07-19
## Packages -----------------------------------------------------------------
##  package      * version    date       source                              
##  abind          1.4-5      2016-07-21 CRAN (R 3.5.0)                      
##  acepack        1.4.1      2016-10-29 CRAN (R 3.5.0)                      
##  assertthat     0.2.0      2017-04-11 CRAN (R 3.5.0)                      
##  backports      1.1.2      2017-12-13 CRAN (R 3.5.0)                      
##  base         * 3.5.1      2018-07-05 local                               
##  base64enc      0.1-3      2015-07-28 CRAN (R 3.5.0)                      
##  bayesplot      1.5.0      2018-03-30 CRAN (R 3.5.0)                      
##  bindr          0.1.1      2018-03-13 CRAN (R 3.5.0)                      
##  bindrcpp     * 0.2.2      2018-03-29 CRAN (R 3.5.0)                      
##  broom        * 0.4.5      2018-07-03 CRAN (R 3.5.0)                      
##  cellranger     1.1.0      2016-07-27 CRAN (R 3.5.0)                      
##  checkmate      1.8.5      2017-10-24 CRAN (R 3.5.0)                      
##  cli            1.0.0      2017-11-05 CRAN (R 3.5.0)                      
##  cluster        2.0.7-1    2018-04-13 CRAN (R 3.5.1)                      
##  coda           0.19-1     2016-12-08 CRAN (R 3.5.0)                      
##  codetools      0.2-15     2016-10-05 CRAN (R 3.5.1)                      
##  colorspace     1.3-2      2016-12-14 CRAN (R 3.5.0)                      
##  colourpicker   1.0        2017-09-27 CRAN (R 3.5.0)                      
##  compiler       3.5.1      2018-07-05 local                               
##  crayon         1.3.4      2017-09-16 CRAN (R 3.5.0)                      
##  crosstalk      1.0.0      2016-12-21 CRAN (R 3.5.0)                      
##  data.table     1.10.4-3   2017-10-27 CRAN (R 3.5.0)                      
##  datasets     * 3.5.1      2018-07-05 local                               
##  devtools       1.13.5     2018-02-18 CRAN (R 3.5.0)                      
##  digest         0.6.15     2018-01-28 CRAN (R 3.5.0)                      
##  dplyr        * 0.7.6      2018-06-29 CRAN (R 3.5.1)                      
##  DT             0.4        2018-01-30 CRAN (R 3.5.0)                      
##  dygraphs       1.1.1.4    2017-01-04 CRAN (R 3.5.0)                      
##  evaluate       0.10.1     2017-06-24 CRAN (R 3.5.0)                      
##  forcats      * 0.3.0      2018-02-19 CRAN (R 3.5.0)                      
##  foreign        0.8-70     2017-11-28 CRAN (R 3.5.1)                      
##  forestplot     1.7.2      2017-09-16 CRAN (R 3.5.0)                      
##  Formula        1.2-2      2017-07-10 CRAN (R 3.5.0)                      
##  ggplot2      * 3.0.0      2018-07-03 CRAN (R 3.5.0)                      
##  ggridges     * 0.5.0      2018-04-05 CRAN (R 3.5.0)                      
##  ggstance     * 0.3        2016-11-16 CRAN (R 3.5.0)                      
##  glue         * 1.2.0.9000 2018-04-30 Github (tidyverse/glue@b538962)     
##  Gmisc        * 1.6.1      2018-04-21 CRAN (R 3.5.0)                      
##  graphics     * 3.5.1      2018-07-05 local                               
##  grDevices    * 3.5.1      2018-07-05 local                               
##  grid         * 3.5.1      2018-07-05 local                               
##  gridExtra    * 2.3        2017-09-09 CRAN (R 3.5.0)                      
##  gtable         0.2.0      2016-02-26 CRAN (R 3.5.0)                      
##  gtools         3.5.0      2015-05-29 CRAN (R 3.5.0)                      
##  haven          1.1.2      2018-06-27 CRAN (R 3.5.0)                      
##  here         * 0.1        2017-05-28 CRAN (R 3.5.0)                      
##  Hmisc          4.1-1      2018-01-03 CRAN (R 3.5.0)                      
##  hms            0.4.2      2018-03-10 CRAN (R 3.5.0)                      
##  htmlTable    * 1.11.2     2018-01-20 CRAN (R 3.5.0)                      
##  htmltools      0.3.6      2017-04-28 CRAN (R 3.5.0)                      
##  htmlwidgets    1.2        2018-04-19 CRAN (R 3.5.0)                      
##  httpuv         1.4.3      2018-05-10 cran (@1.4.3)                       
##  httr           1.3.1      2017-08-20 CRAN (R 3.5.0)                      
##  huxtable     * 4.0.1      2018-07-03 CRAN (R 3.5.0)                      
##  igraph         1.2.1      2018-03-10 CRAN (R 3.5.0)                      
##  inline         0.3.14     2015-04-13 CRAN (R 3.5.0)                      
##  ipumsr       * 0.2.0      2018-04-20 CRAN (R 3.5.0)                      
##  jsonlite       1.5        2017-06-01 CRAN (R 3.5.0)                      
##  knitr          1.20       2018-02-20 CRAN (R 3.5.0)                      
##  labeling       0.3        2014-08-23 CRAN (R 3.5.0)                      
##  later          0.7.3      2018-06-08 cran (@0.7.3)                       
##  lattice        0.20-35    2017-03-25 CRAN (R 3.5.1)                      
##  latticeExtra   0.6-28     2016-02-09 CRAN (R 3.5.0)                      
##  lazyeval       0.2.1      2017-10-29 CRAN (R 3.5.0)                      
##  lme4           1.1-17     2018-04-03 CRAN (R 3.5.0)                      
##  loo            2.0.0      2018-04-11 CRAN (R 3.5.0)                      
##  lubridate    * 1.7.4      2018-04-11 CRAN (R 3.5.0)                      
##  magrittr     * 1.5        2014-11-22 CRAN (R 3.5.0)                      
##  markdown       0.8        2017-04-20 CRAN (R 3.5.0)                      
##  MASS           7.3-50     2018-04-30 CRAN (R 3.5.1)                      
##  Matrix         1.2-14     2018-04-13 CRAN (R 3.5.1)                      
##  matrixStats    0.53.1     2018-02-11 CRAN (R 3.5.0)                      
##  memoise        1.1.0      2017-04-21 CRAN (R 3.5.0)                      
##  methods      * 3.5.1      2018-07-05 local                               
##  mime           0.5        2016-07-07 CRAN (R 3.5.0)                      
##  miniUI         0.1.1      2016-01-15 CRAN (R 3.5.0)                      
##  minqa          1.2.4      2014-10-09 CRAN (R 3.5.0)                      
##  mnormt         1.5-5      2016-10-15 CRAN (R 3.5.0)                      
##  modelr       * 0.1.2      2018-05-11 CRAN (R 3.5.0)                      
##  munsell        0.5.0      2018-06-12 cran (@0.5.0)                       
##  nlme           3.1-137    2018-04-07 CRAN (R 3.5.1)                      
##  nloptr         1.0.4      2017-08-22 CRAN (R 3.5.0)                      
##  nnet           7.3-12     2016-02-02 CRAN (R 3.5.1)                      
##  pander       * 0.6.1      2017-08-06 CRAN (R 3.5.0)                      
##  parallel       3.5.1      2018-07-05 local                               
##  patchwork    * 0.0.1      2018-07-16 Github (thomasp85/patchwork@7fb35b1)
##  pillar         1.2.3      2018-05-25 CRAN (R 3.5.0)                      
##  pkgconfig      2.0.1      2017-03-21 CRAN (R 3.5.0)                      
##  plyr           1.8.4      2016-06-08 CRAN (R 3.5.0)                      
##  promises       1.0.1      2018-04-13 CRAN (R 3.5.0)                      
##  psych          1.8.4      2018-05-06 cran (@1.8.4)                       
##  purrr        * 0.2.5      2018-05-29 cran (@0.2.5)                       
##  R6             2.2.2      2017-06-17 CRAN (R 3.5.0)                      
##  RColorBrewer   1.1-2      2014-12-07 CRAN (R 3.5.0)                      
##  Rcpp         * 0.12.17    2018-05-18 cran (@0.12.17)                     
##  readr        * 1.1.1      2017-05-16 CRAN (R 3.5.0)                      
##  readxl         1.1.0      2018-04-20 CRAN (R 3.5.0)                      
##  reshape2       1.4.3      2017-12-11 CRAN (R 3.5.0)                      
##  rlang          0.2.1      2018-05-30 CRAN (R 3.5.0)                      
##  rmarkdown      1.10       2018-06-11 CRAN (R 3.5.0)                      
##  rpart          4.1-13     2018-02-23 CRAN (R 3.5.1)                      
##  rprojroot      1.3-2      2018-01-03 CRAN (R 3.5.0)                      
##  rsconnect      0.8.8      2018-03-09 CRAN (R 3.5.0)                      
##  rstan        * 2.17.3     2018-01-20 CRAN (R 3.5.0)                      
##  rstanarm     * 2.17.4     2018-04-13 CRAN (R 3.5.0)                      
##  rstantools     1.5.0      2018-04-17 CRAN (R 3.5.0)                      
##  rstudioapi     0.7        2017-09-07 CRAN (R 3.5.0)                      
##  rvest          0.3.2      2016-06-17 CRAN (R 3.5.0)                      
##  scales       * 0.5.0.9000 2018-07-16 Github (hadley/scales@419236a)      
##  shiny          1.0.5      2017-08-23 CRAN (R 3.5.0)                      
##  shinyjs        1.0        2018-01-08 CRAN (R 3.5.0)                      
##  shinystan      2.5.0      2018-05-01 CRAN (R 3.5.0)                      
##  shinythemes    1.1.1      2016-10-12 CRAN (R 3.5.0)                      
##  splines        3.5.1      2018-07-05 local                               
##  StanHeaders  * 2.17.2     2018-01-20 CRAN (R 3.5.0)                      
##  stats        * 3.5.1      2018-07-05 local                               
##  stats4         3.5.1      2018-07-05 local                               
##  stringi        1.2.3      2018-06-12 CRAN (R 3.5.0)                      
##  stringr      * 1.3.1      2018-05-10 CRAN (R 3.5.0)                      
##  survival       2.42-3     2018-04-16 CRAN (R 3.5.1)                      
##  threejs        0.3.1      2017-08-13 CRAN (R 3.5.0)                      
##  tibble       * 1.4.2      2018-01-22 CRAN (R 3.5.0)                      
##  tidyr        * 0.8.1      2018-05-18 CRAN (R 3.5.0)                      
##  tidyselect     0.2.4      2018-02-26 CRAN (R 3.5.0)                      
##  tidyverse    * 1.2.1      2017-11-14 CRAN (R 3.5.0)                      
##  tools          3.5.1      2018-07-05 local                               
##  utils        * 3.5.1      2018-07-05 local                               
##  withr          2.1.2      2018-07-16 Github (jimhester/withr@fe56f20)    
##  XML            3.98-1.11  2018-04-16 CRAN (R 3.5.0)                      
##  xml2           1.2.0      2018-01-24 CRAN (R 3.5.0)                      
##  xtable         1.8-2      2016-02-05 CRAN (R 3.5.0)                      
##  xts            0.10-2     2018-03-14 CRAN (R 3.5.0)                      
##  yaml           2.1.19     2018-05-01 CRAN (R 3.5.0)                      
##  zeallot        0.1.0      2018-01-28 CRAN (R 3.5.0)                      
##  zoo            1.8-1      2018-01-08 CRAN (R 3.5.0)
LS0tCnRpdGxlOiAiQWRkaXRpb25hbCBhbmFseXNpcyIKYXV0aG9yOiAiQW5kcmV3IEhlaXNzIGFuZCBTdXBhcm5hIENoYXVkaHJ5IgpkYXRlOiAiTGFzdCBydW46IGByIGZvcm1hdChTeXMudGltZSgpLCAnJUIgJWUsICVZJylgIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBjb25zb2xlCi0tLQoKYGBge3IgbG9hZC1saWJyYXJpZXMtZGF0YSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KIyBMb2FkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShyc3RhbikKbGlicmFyeShyc3RhbmFybSkKbGlicmFyeShicm9vbSkKbGlicmFyeShnbHVlKQpsaWJyYXJ5KGdnc3RhbmNlKQpsaWJyYXJ5KGdncmlkZ2VzKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoZ3JpZEV4dHJhKQpsaWJyYXJ5KEdtaXNjKQpsaWJyYXJ5KHBhdGNod29yaykKbGlicmFyeShwYW5kZXIpCmxpYnJhcnkoc2NhbGVzKQpsaWJyYXJ5KGh1eHRhYmxlKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShtb2RlbHIpCmxpYnJhcnkoaXB1bXNyKQpsaWJyYXJ5KGhlcmUpCgpzb3VyY2UoaGVyZSgibGliIiwgImdyYXBoaWNzLlIiKSkKc291cmNlKGhlcmUoImxpYiIsICJwYW5kZXJfb3B0aW9ucy5SIikpCnNvdXJjZShoZXJlKCJsaWIiLCAibW9kZWxpbmcuUiIpKQoKIyBMb2FkIGRhdGEKcmVzdWx0cyA8LSByZWFkUkRTKGhlcmUoImRhdGEiLCAicmVzdWx0c19jbGVhbi5yZHMiKSkKYGBgCgojIENPTlNPUlQgZmxvdwoKYGBge3IgYnVpbGQtY29uc29ydH0KY29uc29ydCA8LSByZWFkUkRTKGhlcmUoImRhdGEiLCAiY29tcGxldGlvbl9zdW1tYXJ5LnJkcyIpKSAlPiUgCiAgc3ByZWFkKHJlYXNvbiwgbikgJT4lIAogIG11dGF0ZShncm91cCA9IDE6bigpLAogICAgICAgICBhc3NpZ25lZCA9IEFwcHJvdmVkICsgYEZhaWxlZCBmaXJzdCBhdHRlbnRpb24gY2hlY2tgLAogICAgICAgICBpc3N1ZSA9IHN0cl9yZXBsYWNlX2FsbChpc3N1ZSwgImFzc2lzdGFuY2UiLCAiYXNzaXN0LiIpKSAlPiUgCiAgbXV0YXRlKGFzc2lnbmVkX2xhYmVsID0gZ2x1ZSgiQWxsb2NhdGVkIHRvIEdyb3VwIHtncm91cH1cbntjcmFja2Rvd259XG57aXNzdWV9XG57ZnVuZGluZ30gZnVuZGluZ1xuXG5OID0ge2Fzc2lnbmVkfSIpLAogICAgICAgICBjb21wbGV0ZWRfbGFiZWwgPSBnbHVlKCJDb21wbGV0ZWRcbk4gPSB7QXBwcm92ZWR9XG5cbntgRmFpbGVkIGZpcnN0IGF0dGVudGlvbiBjaGVja2B9IGZhaWxlZFxuYXR0ZW50aW9uIGNoZWNrIikpCgphc3Nlc3NlZF9lbGlnaWJpbGl0eV9uIDwtIHN1bShjb25zb3J0JEFwcHJvdmVkLCBjb25zb3J0JGBGYWlsZWQgZmlyc3QgYXR0ZW50aW9uIGNoZWNrYCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvcnQkYFRvb2sgc3VydmV5IG91dGlzZGUgb2YgTVR1cmtgKQppbmVsaWdpYmxlX24gPC0gc3VtKGNvbnNvcnQkYFRvb2sgc3VydmV5IG91dGlzZGUgb2YgTVR1cmtgKQpyYW5kb21pemVkX24gPC0gc3VtKGNvbnNvcnQkQXBwcm92ZWQsIGNvbnNvcnQkYEZhaWxlZCBmaXJzdCBhdHRlbnRpb24gY2hlY2tgKQoKCiMgaHR0cHM6Ly9hZ2hheW5lcy53b3JkcHJlc3MuY29tLzIwMTgvMDUvMDkvZmxvdy1jaGFydHMtaW4tci8KIyBzZXQgc29tZSBwYXJhbWV0ZXJzIHRvIHVzZSByZXBlYXRlZGx5CndpZHRoIDwtIDAuMQp4cyA8LSBzZXEoMC4xLCAwLjksIGxlbmd0aC5vdXQgPSA4KQphbGxvY2F0ZWRfeSA8LSAwLjM3NQpjb21wbGV0ZWRfeSA8LSAwLjEyNQoKYm94X2dwX2dyZXkgPC0gZ3BhcihmaWxsID0gbmdvX2NvbHMoImxpZ2h0IGdyZXkiKSkKYm94X2dwX2JsdWVfZGsgPC0gZ3BhcihmaWxsID0gbmdvX2NvbHMoImJsdWUiKSwgYWxwaGEgPSAwLjc1KQpib3hfZ3BfYmx1ZV9sdCA8LSBncGFyKGZpbGwgPSBuZ29fY29scygiYmx1ZSIpLCBhbHBoYSA9IDAuMzUpCmJveF9ncF9ncmVlbiA8LSBncGFyKGZpbGwgPSBuZ29fY29scygiZ3JlZW4iKSwgYWxwaGEgPSAwLjY1KQpib3hfZ3BfeWVsbG93IDwtIGdwYXIoZmlsbCA9IG5nb19jb2xzKCJ5ZWxsb3ciKSkKYm94X2dwX29yYW5nZSA8LSBncGFyKGZpbGwgPSBuZ29fY29scygib3JhbmdlIiksIGFscGhhID0gMC42NSkKCnR4dF9ncCA8LSBncGFyKGZvbnRmYW1pbHkgPSAiRW5jb2RlIFNhbnMgQ29uZGVuc2VkIE1lZGl1bSIsIAogICAgICAgICAgICAgICBmb250ZmFjZSA9ICJwbGFpbiIsIGZvbnRzaXplID0gOCkKCiMgQ3JlYXRlIGJveGVzCnRvdGFsIDwtIGJveEdyb2IoZ2x1ZSgiQXNzZXNzZWQgZm9yIGVsaWdpYmlsaXR5XG4gTiA9IHthc3Nlc3NlZF9lbGlnaWJpbGl0eV9ufSIpLCAKICAgICAgICAgICAgICAgICB4ID0gMC41LCB5ID0gMC45LCB3aWR0aCA9IDIgKiB3aWR0aCwKICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3BfYmx1ZV9sdCwgdHh0X2dwID0gdHh0X2dwKQpyYW5kb21pemVkIDwtIGJveEdyb2IoZ2x1ZSgiUmFuZG9taXplZFxuIE4gPSB7cmFuZG9taXplZF9ufSIpLCAKICAgICAgICAgICAgICAgICAgICAgIHggPSAwLjUsIHkgPSAwLjY1LCB3aWR0aCA9IDIgKiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ibHVlX2RrLCB0eHRfZ3AgPSB0eHRfZ3ApCmluZWxpZ2libGUgPC0gYm94R3JvYihnbHVlKCJQYXJ0aWNpcGFudHMgZXhjbHVkZWQgZm9yXG5jb21wbGV0aW5nIFF1YWx0cmljcyBzdXJ2ZXlcbm91dHNpZGUgb2YgTVR1cmtcbiBOID0ge2luZWxpZ2libGVfbn0iKSwgCiAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbN10sIHkgPSAwLjc3NSwgI3dpZHRoID0gMC4yNSwKICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF95ZWxsb3csIHR4dF9ncCA9IHR4dF9ncCkKCmdyb3VwMSA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSAxKSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzFdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwMiA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSAyKSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzJdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwMyA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSAzKSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzNdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwNCA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSA0KSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzRdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwNSA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSA1KSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzVdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwNiA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSA2KSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzZdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwNyA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSA3KSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzddLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCmdyb3VwOCA8LSBib3hHcm9iKGZpbHRlcihjb25zb3J0LCBncm91cCA9PSA4KSRhc3NpZ25lZF9sYWJlbCwKICAgICAgICAgICAgICAgICAgeCA9IHhzWzhdLCB5ID0gYWxsb2NhdGVkX3ksIHdpZHRoID0gd2lkdGgsIAogICAgICAgICAgICAgICAgICBib3hfZ3AgPSBib3hfZ3Bfb3JhbmdlLCB0eHRfZ3AgPSB0eHRfZ3ApCgpncm91cDFfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDEpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbMV0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDJfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDIpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbMl0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDNfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDMpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbM10sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDRfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDQpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbNF0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDVfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDUpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbNV0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDZfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDYpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbNl0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDdfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDcpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbN10sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQpncm91cDhfY29tcGxldGVkIDwtIGJveEdyb2IoZmlsdGVyKGNvbnNvcnQsIGdyb3VwID09IDgpJGNvbXBsZXRlZF9sYWJlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHNbOF0sIHkgPSBjb21wbGV0ZWRfeSwgd2lkdGggPSB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveF9ncCA9IGJveF9ncF9ncmVlbiwgdHh0X2dwID0gdHh0X2dwKQoKdG90YWxfcmFuZG9tX2Nvbm5lY3QgPC0gY29ubmVjdEdyb2IodG90YWwsIHJhbmRvbWl6ZWQsICJ2IikKdG90YWxfaW5lbGlnaWJsZV9jb25uZWN0IDwtIGNvbm5lY3RHcm9iKHRvdGFsLCBpbmVsaWdpYmxlLCAiLSIpCgpyYW5kX2Nvbm5lY3QxIDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwMSwgIk4iKQpyYW5kX2Nvbm5lY3QyIDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwMiwgIk4iKQpyYW5kX2Nvbm5lY3QzIDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwMywgIk4iKQpyYW5kX2Nvbm5lY3Q0IDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwNCwgIk4iKQpyYW5kX2Nvbm5lY3Q1IDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwNSwgIk4iKQpyYW5kX2Nvbm5lY3Q2IDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwNiwgIk4iKQpyYW5kX2Nvbm5lY3Q3IDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwNywgIk4iKQpyYW5kX2Nvbm5lY3Q4IDwtIGNvbm5lY3RHcm9iKHJhbmRvbWl6ZWQsIGdyb3VwOCwgIk4iKQoKY29tcGxldGVfY29ubmVjdDEgPC0gY29ubmVjdEdyb2IoZ3JvdXAxLCBncm91cDFfY29tcGxldGVkLCAiTiIpCmNvbXBsZXRlX2Nvbm5lY3QyIDwtIGNvbm5lY3RHcm9iKGdyb3VwMiwgZ3JvdXAyX2NvbXBsZXRlZCwgIk4iKQpjb21wbGV0ZV9jb25uZWN0MyA8LSBjb25uZWN0R3JvYihncm91cDMsIGdyb3VwM19jb21wbGV0ZWQsICJOIikKY29tcGxldGVfY29ubmVjdDQgPC0gY29ubmVjdEdyb2IoZ3JvdXA0LCBncm91cDRfY29tcGxldGVkLCAiTiIpCmNvbXBsZXRlX2Nvbm5lY3Q1IDwtIGNvbm5lY3RHcm9iKGdyb3VwNSwgZ3JvdXA1X2NvbXBsZXRlZCwgIk4iKQpjb21wbGV0ZV9jb25uZWN0NiA8LSBjb25uZWN0R3JvYihncm91cDYsIGdyb3VwNl9jb21wbGV0ZWQsICJOIikKY29tcGxldGVfY29ubmVjdDcgPC0gY29ubmVjdEdyb2IoZ3JvdXA3LCBncm91cDdfY29tcGxldGVkLCAiTiIpCmNvbXBsZXRlX2Nvbm5lY3Q4IDwtIGNvbm5lY3RHcm9iKGdyb3VwOCwgZ3JvdXA4X2NvbXBsZXRlZCwgIk4iKQoKZnVsbF9jaGFydCA8LSBsaXN0KHRvdGFsLCByYW5kb21pemVkLCBpbmVsaWdpYmxlLCB0b3RhbF9yYW5kb21fY29ubmVjdCwgdG90YWxfaW5lbGlnaWJsZV9jb25uZWN0LAogICAgICAgICAgICAgICAgICAgZ3JvdXAxLCBncm91cDIsIGdyb3VwMywgZ3JvdXA0LCBncm91cDUsIGdyb3VwNiwgZ3JvdXA3LCBncm91cDgsCiAgICAgICAgICAgICAgICAgICByYW5kX2Nvbm5lY3QxLCByYW5kX2Nvbm5lY3QyLCByYW5kX2Nvbm5lY3QzLCByYW5kX2Nvbm5lY3Q0LCAKICAgICAgICAgICAgICAgICAgIHJhbmRfY29ubmVjdDUsIHJhbmRfY29ubmVjdDYsIHJhbmRfY29ubmVjdDcsIHJhbmRfY29ubmVjdDgsCiAgICAgICAgICAgICAgICAgICBncm91cDFfY29tcGxldGVkLCBncm91cDJfY29tcGxldGVkLCBncm91cDNfY29tcGxldGVkLCBncm91cDRfY29tcGxldGVkLCAKICAgICAgICAgICAgICAgICAgIGdyb3VwNV9jb21wbGV0ZWQsIGdyb3VwNl9jb21wbGV0ZWQsIGdyb3VwN19jb21wbGV0ZWQsIGdyb3VwOF9jb21wbGV0ZWQsCiAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9jb25uZWN0MSwgY29tcGxldGVfY29ubmVjdDIsIGNvbXBsZXRlX2Nvbm5lY3QzLCBjb21wbGV0ZV9jb25uZWN0NCwgCiAgICAgICAgICAgICAgICAgICBjb21wbGV0ZV9jb25uZWN0NSwgY29tcGxldGVfY29ubmVjdDYsIGNvbXBsZXRlX2Nvbm5lY3Q3LCBjb21wbGV0ZV9jb25uZWN0OCkgCmBgYAoKYGBge3Igc2hvdy1zYXZlLWNvbnNvcnQsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD02fQojIE9yZGluYXJpbHksIHlvdSBjYW4gdXNlIGdyaWQuZ3JhYigpIHRvIHNhdmUgdGhlIG91dHB1dCBvZiBhIGdyaWQgZmlndXJlIGludG8KIyBhbiBvYmplY3QgYW5kIHRoZW4gdXNlIHRoYXQgaW4gZ2dzYXZlKCkuIEhvd2V2ZXIsIHdoZW4ga25pdHRpbmcsIHRoaXMgY3JlYXRlcwojIGEgZHVwbGljYXRlIHBsb3QsIHdoaWNoIGlzIGZydXN0cmF0aW5nLiBTbyBpbnN0ZWFkLCB3ZSB1c2Ugd2FsaygpIHRvIHJlcHJpbnQKIyBhbGwgdGhlIGdyb2JzIHdpdGhpbiBzcGVjaWZpYyBwZGYgYW5kIHBuZyBkZXZpY2VzCiMKIyBTZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE3NTA5NzcwLzEyMDg5OCBmb3IgYSBzaW1pbGFyIGlzc3VlCgojIFNhdmUgYXMgUERGCmNhaXJvX3BkZihmaWxlbmFtZSA9IGhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwgImNvbnNvcnQucGRmIiksCiAgICAgICAgICB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQpncmlkLm5ld3BhZ2UoKQp3YWxrKGZ1bGxfY2hhcnQsIH4gcHJpbnQoLikpCmludmlzaWJsZShkZXYub2ZmKCkpCgojIFNhdmUgYXMgUE5HCnBuZyhmaWxlbmFtZSA9IGhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwgImNvbnNvcnQucG5nIiksIAogICAgd2lkdGggPSAxMCwgaGVpZ2h0ID0gNiwgdW5pdHMgPSAiaW4iLAogICAgYmcgPSAid2hpdGUiLCByZXMgPSAzMDAsIHR5cGUgPSAiY2Fpcm8iKQpncmlkLm5ld3BhZ2UoKQp3YWxrKGZ1bGxfY2hhcnQsIH4gcHJpbnQoLikpCmludmlzaWJsZShkZXYub2ZmKCkpCgojIFNob3cgaW4ga25pdHRlZCBkb2N1bWVudApncmlkLm5ld3BhZ2UoKQp3YWxrKGZ1bGxfY2hhcnQsIH4gcHJpbnQoLikpCmBgYAoKCiMgQ2hhcmFjdGVyaXN0aWNzIG9mIGV4cGVyaW1lbnQgc2FtcGxlcwoKV2UgY29tcGFyZSBvdXIgc2FtcGxlIHdpdGggZGVtb2dyYXBoaWMgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBnZW5lcmFsIHBvcHVsYXRpb24uIFNpbmNlIHRoZXJlIGlzIG5vIG5hdGlvbmFsbHkgcmVwcmVzZW50YXRpdmUgc2FtcGxlIGZvciBlYWNoIG9mIG91ciBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMsIHdlIHVzZSB0d28gd2F2ZXMgb2YgdGhlIFVTIENlbnN1cydzIEN1cnJlbnQgUG9wdWxhdGlvbiBTdXJ2ZXkgKENQUyksIHdpdGggZGF0YSBmcm9tIHRoZSBbTWlubmVzb3RhIFBvcHVsYXRpb24gQ2VudGVyJ3MgSW50ZWdyYXRlZCBQdWJsaWMgVXNlIE1pY3JvZGF0YSBTZXJpZXMgKElQVU1TKV0oaHR0cHM6Ly9jcHMuaXB1bXMub3JnL2Nwcy8pLgoKRm9yIGdlbmVyYWwgZGVtb2dyYXBoaWMgaW5mb3JtYXRpb24sIHdlIHVzZSBkYXRhIGZyb20gdGhlIDIwMTcgW0FubnVhbCBTb2NpYWwgYW5kIEVjb25vbWljIFN1cHBsZW1lbnQgKEFTRUMpXShodHRwczovL2Nwcy5pcHVtcy5vcmcvY3BzL2FzZWNfc2FtcGxlX25vdGVzLnNodG1sKSBmb3IgdGhlIENQUy4gRnJvbSAyMDAy4oCTMjAxNSwgdGhlIENQUyBpbmNsdWRlZCBhIFtWb2x1bnRlZXIgU3VwcGxlbWVudF0oaHR0cHM6Ly9jcHMuaXB1bXMub3JnL2Nwcy92b2x1bnRlZXJfc2FtcGxlX25vdGVzLnNodG1sKSBldmVyeSBTZXB0ZW1iZXIsIHNvIHdlIHVzZSAyMDE1IGRhdGEgZm9yIGRhdGEgb24gdm9sdW50ZWVyaW5nIGFuZCBkb25hdGluZyB0byBjaGFyaXR5LgoKSVBVTVMgcmVxdWlyZXMgdGhhdCB5b3UgbWFudWFsbHkgZ2VuZXJhdGUgYSBkYXRhIGV4dHJhY3QgdGhyb3VnaCB0aGVpciB3ZWJzaXRlLCBzbyBkb3dubG9hZGluZyBkYXRhIGZyb20gdGhlbSBpcyBub3QgZW50aXJlbHkgYXV0b21hdGVkIG9yIHJlcHJvZHVjaWJsZS4gV2UgY3JlYXRlZCB0d28gZXh0cmFjdHMgKHRob3VnaCB0aGlzIGNvdWxkIGhhdmUgYmVlbiBjb21iaW5lZCBpbnRvIG9uZSksIHdpdGggdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMKCi0gIGAiZGF0YS9pcHVtcy1jcHMvY3BzXzIwMTcuZGF0Lmd6ImA6IDIwMTcgQVNFQywgd2l0aCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBzZWxlY3RlZCAoaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgSVBVTVMgcHJlc2VsZWN0cyBieSBkZWZhdWx0KSAoYW5kIHdlaWdodGVkIGJ5IGBBU0VDV1RgKToKICAgIC0gYEFHRWAKICAgIC0gYFNFWGAKICAgIC0gYEVEVUNgCiAgICAtIGBJTkNUT1RgCi0gIGAiZGF0YS9pcHVtcy1jcHMvY3BzXzA5XzIwMTUuZGF0Lmd6ImA6IFNlcHRlbWJlciAyMDE1IGJhc2ljIG1vbnRobHkgQ1BTICh3aGljaCBpbmNsdWRlcyB0aGUgVm9sdW50ZWVyIFN1cHBsZW1lbnQpLCB3aXRoIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIHNlbGVjdGVkIChhbmQgd2VpZ2h0ZWQgYnkgYFZMU1VQUFdUYCk6CiAgICAtIGBWTFNUQVRVU2AKICAgIC0gYFZMRE9OQVRFYAoKV2UgZG8gbm90IHNob3cgb3RoZXIgcmVzcG9uZGVudCBkZW1vZ3JhcGhpYyBkZXRhaWxzIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBnb29kIHBvcHVsYXRpb24tbGV2ZWwgZGF0YSB0byBjb21wYXJlIG91ciBzYW1wbGUgd2l0aC4gV2UgY291bGQgdGhlb3JldGljYWxseSB1c2UgUGV3IGRhdGEgZm9yIHBvbGl0aWNhbCBwcmVmZXJlbmNlcywgYnV0IHRoZXkgY29sbGVjdCBkYXRhIG9uIHBhcnR5IGFmZmlsaWF0aW9uLCB3aGlsZSB3ZSBjb2xsZWN0ZWQgZGF0YSBhYm91dCByZXNwb25kZW50IHBvc2l0aW9ucyBhbG9uZyBhIGNvbnNlcnZhdGl2ZeKAk2xpYmVyYWwgc3BlY3RydW0sIHNvIHRoZSB0d28gdmFyaWFibGVzIGFyZW4ndCBjb21wYXJhYmxlLgoKYGBge3IgbG9hZC1jbGVhbi1jcHMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CmNwc18yMDE1X2RkaV9maWxlIDwtIGhlcmUoImRhdGEiLCAiaXB1bXMtY3BzIiwgImNwc18wOV8yMDE1LnhtbCIpCmNwc18yMDE1X2RhdGFfZmlsZSA8LSBoZXJlKCJkYXRhIiwgImlwdW1zLWNwcyIsICJjcHNfMDlfMjAxNS5kYXQuZ3oiKQoKY3BzXzIwMTVfZGRpIDwtIHJlYWRfaXB1bXNfZGRpKGNwc18yMDE1X2RkaV9maWxlKQpjcHNfMjAxNV9kYXRhIDwtIHJlYWRfaXB1bXNfbWljcm8oY3BzXzIwMTVfZGRpX2ZpbGUsIGRhdGFfZmlsZSA9IGNwc18yMDE1X2RhdGFfZmlsZSwgdmVyYm9zZSA9IEZBTFNFKQoKY3BzXzIwMTdfZGRpX2ZpbGUgPC0gaGVyZSgiZGF0YSIsICJpcHVtcy1jcHMiLCAiY3BzXzIwMTcueG1sIikKY3BzXzIwMTdfZGF0YV9maWxlIDwtIGhlcmUoImRhdGEiLCAiaXB1bXMtY3BzIiwgImNwc18yMDE3LmRhdC5neiIpCgpjcHNfMjAxN19kZGkgPC0gcmVhZF9pcHVtc19kZGkoY3BzXzIwMTdfZGRpX2ZpbGUpCmNwc18yMDE3X2RhdGEgPC0gcmVhZF9pcHVtc19taWNybyhjcHNfMjAxN19kZGlfZmlsZSwgZGF0YV9maWxlID0gY3BzXzIwMTdfZGF0YV9maWxlLCB2ZXJib3NlID0gRkFMU0UpCgojIFZvbHVudGVlcmluZyBkYXRhIGZyb20gU2VwdGVtYmVyIDIwMTUgb25seQpkZl92b2x1bnRlZXJpbmcgPC0gY3BzXzIwMTVfZGF0YSAlPiUgCiAgIyBSZW1vdmUgdmFsdWVzIG5vdCBpbiB0aGUgdW5pdmVyc2UKICBtdXRhdGVfYXQodmFycyhWTFNUQVRVUywgVkxET05BVEUpLCBmdW5zKGlmZWxzZSguID09IDk5LCBOQSwgLikpKQoKIyBBbGwgb3RoZXIgZGF0YSBmcm9tIGFubnVhbCBNYXJjaCAyMDE3IHN1cnZleQpkZl9kZW1vZ3JhcGhpY3MgPC0gY3BzXzIwMTdfZGF0YSAlPiUgCiAgIyBSZW1vdmUgdmFsdWVzIG5vdCBpbiB0aGUgdW5pdmVyc2UKICBtdXRhdGUoU0VYID0gaWZlbHNlKFNFWCA9PSA5LCBOQSwgU0VYKSwKICAgICAgICAgRURVQyA9IGlmZWxzZShFRFVDIDw9IDEgfCBFRFVDID09IDk5OSwgTkEsIEVEVUMpLAogICAgICAgICBJTkNUT1QgPSBpZmVsc2UoSU5DVE9UID09IDk5OTk5OTk5LCBOQSwgSU5DVE9UKSkKYGBgCgpgYGB7ciBwb3B1bGF0aW9uLXZhbHVlc30KZ2xvYmFsX2RlbW9ncmFwaGljcyA8LSBkZl9kZW1vZ3JhcGhpY3MgJT4lIAogIHN1bW1hcml6ZShhZ2UgPSB3ZWlnaHRlZC5tZWFuKEFHRSA+PSAzNSwgQVNFQ1dUKSwgCiAgICAgICAgICAgIGZlbWFsZSA9IHdlaWdodGVkLm1lYW4oU0VYID09IDIsIEFTRUNXVCksCiAgICAgICAgICAgIGNvbGxlZ2UgPSB3ZWlnaHRlZC5tZWFuKEVEVUMgPj0gMTExLCBBU0VDV1QsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgIGluY29tZSA9IHdlaWdodGVkLm1lYW4oSU5DVE9UID49IDUwMDAwLCBBU0VDV1QsIG5hLnJtID0gVFJVRSkpICU+JSAKICBjKCkKCmdsb2JhbF92b2wgPC0gZGZfdm9sdW50ZWVyaW5nICU+JSAKICBzdW1tYXJpemUodm9sdW50ZWVyaW5nID0gd2VpZ2h0ZWQubWVhbihWTFNUQVRVUyA9PSAyLCBWTFNVUFBXVCwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgZG9uYXRpbmcgPSB3ZWlnaHRlZC5tZWFuKFZMRE9OQVRFID09IDIsIFZMU1VQUFdULCBuYS5ybSA9IFRSVUUpKSAlPiUgCiAgYygpCgpnbG9iYWxfc3RhdHMgPC0gYyhnbG9iYWxfdm9sLCBnbG9iYWxfZGVtb2dyYXBoaWNzKQpgYGAKCmBgYHtyIHNhbXBsZS1wb3B1bGF0aW9uLWNoYXJhY3RlcmlzdGljcy1mcmVxLCBpbmNsdWRlPUZBTFNFLCBldmFsPUZBTFNFfQojIERlbW9ncmFwaGljIHZhcmlhYmxlcwp0YWJsZShyZXN1bHRzJGdlbmRlcl9iaW4pICU+JSBwcm9wLnRlc3QoLiwgcCA9IGdsb2JhbF9zdGF0cyRmZW1hbGUpCnRhYmxlKHJlc3VsdHMkZWR1Y2F0aW9uX2JpbikgJT4lIHByb3AudGVzdCguLCBwID0gZ2xvYmFsX3N0YXRzJGNvbGxlZ2UpCnRhYmxlKHJlc3VsdHMkaW5jb21lX2JpbikgJT4lIHByb3AudGVzdCguLCBwID0gZ2xvYmFsX3N0YXRzJGluY29tZSkKdGFibGUocmVzdWx0cyRhZ2VfYmluKSAlPiUgcHJvcC50ZXN0KC4sIHAgPSBnbG9iYWxfc3RhdHMkYWdlKQoKIyBWb2x1bnRlZXJpbmcKdGFibGUocmVzdWx0cyR2b2x1bnRlZXIpICU+JSBwcm9wLnRlc3QoLiwgcCA9IGdsb2JhbF9zdGF0cyR2b2x1bnRlZXJpbmcpCnRhYmxlKHJlc3VsdHMkZ2l2ZV9jaGFyaXR5XzIpICU+JSBwcm9wLnRlc3QoLiwgcCA9IGdsb2JhbF9zdGF0cyRkb25hdGluZykKYGBgCgpgYGB7ciBjb21waWxlLXN0YW4tbW9kZWwsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGNhY2hlPVRSVUV9CnByb3BfdGVzdF9iYXllc19zYXZlZCA8LSBoZXJlKCJsaWIiLCAiYmF5ZXNfcHJvcF90ZXN0LnJkcyIpCgppZiAoZmlsZS5leGlzdHMocHJvcF90ZXN0X2JheWVzX3NhdmVkKSkgewogIHByb3BfdGVzdF9iYXllcyA8LSByZWFkUkRTKHByb3BfdGVzdF9iYXllc19zYXZlZCkKfSBlbHNlIHsKICBwcm9wX3Rlc3RfYmF5ZXMgPC0gc3Rhbl9tb2RlbChoZXJlKCJsaWIiLCAiYmF5ZXNfcHJvcF90ZXN0LnN0YW4iKSkKICBzYXZlUkRTKHByb3BfdGVzdF9iYXllcywgcHJvcF90ZXN0X2JheWVzX3NhdmVkKQp9CmBgYAoKYGBge3Igc2FtcGxlLXBvcHVsYXRpb24tY2hhcmFjdGVyaXN0aWNzLCBjYWNoZT1UUlVFfQpjb21wYXJlX3NhbXBsZV90b19wb3BfYmF5ZXMgPC0gZnVuY3Rpb24oc2FtcGxlX3ZhbHVlLCBwb3B1bGF0aW9uX3ZhbHVlKSB7CiAgbWNtY19zYW1wbGVzIDwtIHNhbXBsaW5nKHByb3BfdGVzdF9iYXllcywgbGlzdCh4ID0gdGFibGUoc2FtcGxlX3ZhbHVlKVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX24gPSBsZW5ndGgoc2FtcGxlX3ZhbHVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcF9wcm9wID0gcG9wdWxhdGlvbl92YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWlucyA9IENIQUlOUywgaXRlciA9IElURVIsIHdhcm11cCA9IFdBUk1VUCwgc2VlZCA9IEJBWUVTX1NFRUQpCiAgCiAgdGlkaWVkIDwtIHRpZHlNQ01DKG1jbWNfc2FtcGxlcywgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45LCAKICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGUubWV0aG9kID0gIm1lZGlhbiIsIGNvbmYubWV0aG9kID0gIkhQRGludGVydmFsIikgJT4lCiAgICBtdXRhdGUoaW5faHBkaSA9IChwb3B1bGF0aW9uX3ZhbHVlID49IGNvbmYubG93ICYgcG9wdWxhdGlvbl92YWx1ZSA8PSBjb25mLmhpZ2gpKQogIAogIHRoZXRhcyA8LSB1bmxpc3QoZXh0cmFjdChtY21jX3NhbXBsZXMsICJ0aGV0YSIpKQogIHBvcF9xdWFudGlsZV9pbl9zYW1wbGUgPC0gZWNkZih0aGV0YXMpKHBvcHVsYXRpb25fdmFsdWUpCiAgCiAgaW5faHBkaSA8LSAocG9wdWxhdGlvbl92YWx1ZSA+PSB0aWRpZWRbMSxdJGNvbmYubG93ICYgCiAgICAgICAgICAgICAgICBwb3B1bGF0aW9uX3ZhbHVlIDw9IHRpZGllZFsxLF0kY29uZi5oaWdoKQogIAogIHJldHVybihsaXN0KG1jbWNfc2FtcGxlcyA9IG1jbWNfc2FtcGxlcywgdGlkaWVkID0gdGlkaWVkLCB0aGV0YV9pbl9ocGRpID0gaW5faHBkaSwKICAgICAgICAgICAgICBwb3BfcXVhbnRpbGVfaW5fc2FtcGxlID0gcG9wX3F1YW50aWxlX2luX3NhbXBsZSkpCn0KCmNhbGNfc2FtcGxlX3BvcCA8LSB0cmliYmxlKAogIH5WYXJpYWJsZSwgfnNhbXBsZV92YWx1ZSwgfk5hdGlvbmFsLAogICJGZW1hbGUgKCUpXmFeIiwgcmVzdWx0cyRnZW5kZXJfYmluLCBnbG9iYWxfc3RhdHMkZmVtYWxlLAogICJBZ2UgKCUgMzUrKV5hXiIsIHJlc3VsdHMkYWdlX2JpbiwgZ2xvYmFsX3N0YXRzJGFnZSwKICAiSW5jb21lICglICQ1MCwwMDArKV5hXiIsIHJlc3VsdHMkaW5jb21lX2JpbiwgZ2xvYmFsX3N0YXRzJGluY29tZSwKICAiRWR1Y2F0aW9uICglIEJBKyleYV4iLCByZXN1bHRzJGVkdWNhdGlvbl9iaW4sIGdsb2JhbF9zdGF0cyRjb2xsZWdlLAogICJEb25hdGVkIGluIHBhc3QgeWVhciAoJSleYl4iLCByZXN1bHRzJGdpdmVfY2hhcml0eV8yLCBnbG9iYWxfc3RhdHMkZG9uYXRpbmcsCiAgIlZvbHVudGVlcmVkIGluIHBhc3QgeWVhciAoJSleYl4iLCByZXN1bHRzJHZvbHVudGVlciwgZ2xvYmFsX3N0YXRzJHZvbHVudGVlcmluZwopICU+JSAKICBtdXRhdGUoU2FtcGxlID0gc2FtcGxlX3ZhbHVlICU+JSBtYXBfZGJsKH4gcHJvcC50YWJsZSh0YWJsZSguKSlbMV0pLAogICAgICAgICBwcm9wX3Rlc3RfYmF5ZXMgPSBtYXAyKC54ID0gc2FtcGxlX3ZhbHVlLCAueSA9IE5hdGlvbmFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZiA9IH4gY29tcGFyZV9zYW1wbGVfdG9fcG9wX2JheWVzKC54LCAueSkpKSAKYGBgCgpgYGB7ciB0Ymwtc2FtcGxlLWNoYXJhY3RlcmlzdGljcywgcmVzdWx0cz0iYXNpcyJ9CmZvcm1hdF9ocGRpIDwtIGZ1bmN0aW9uKHBvc3RfbG93ZXIsIHBvc3RfdXBwZXIsIHN0YXIsIGRpZ2l0cyA9IDEpIHsKICBnbHVlKCIoe2xvd2VyfSUsIHt1cHBlcn0lKXtzdGFyfSIsCiAgICAgICBsb3dlciA9IHJvdW5kKDEwMCAqIHBvc3RfbG93ZXIsIGRpZ2l0cyksCiAgICAgICB1cHBlciA9IHJvdW5kKDEwMCAqIHBvc3RfdXBwZXIsIGRpZ2l0cykpCn0KCnRibF9zYW1wbGVfcG9wIDwtIGNhbGNfc2FtcGxlX3BvcCAlPiUgCiAgbXV0YXRlKGluX2hwZGkgPSBwcm9wX3Rlc3RfYmF5ZXMgJT4lIG1hcF9sZ2wofiAuJHRoZXRhX2luX2hwZGkpLAogICAgICAgICBub3RfaHBkaV9zeW1ib2wgPSBpZmVsc2UoaW5faHBkaSwgIiIsICJe4oCgXiIpLAogICAgICAgICBkaWZmc190aWR5ID0gcHJvcF90ZXN0X2JheWVzICU+JSBtYXAofiAuJHRpZGllZFsyLF0pLAogICAgICAgICBkaWZmc19tZWRpYW4gPSBkaWZmc190aWR5ICU+JSBtYXBfZGJsKH4gLiRlc3RpbWF0ZSksCiAgICAgICAgIGRpZmZzX2hwZGlfZmFuY3kgPSBkaWZmc190aWR5ICU+JQogICAgICAgICAgIG1hcDJfY2hyKC54ID0gZGlmZnNfdGlkeSwgLnkgPSBub3RfaHBkaV9zeW1ib2wsIAogICAgICAgICAgICAgICAgICAgIC5mID0gfiBmb3JtYXRfaHBkaSgueCRjb25mLmxvdywgLngkY29uZi5oaWdoLCAueSkpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoTmF0aW9uYWwsIFNhbXBsZSwgZGlmZnNfbWVkaWFuKSwgZnVucyhwZXJjZW50KSkgJT4lIAogIHNlbGVjdChWYXJpYWJsZSwgU2FtcGxlLCBOYXRpb25hbCwgCiAgICAgICAgIGDiiIZ+bWVkaWFufmAgPSBkaWZmc19tZWRpYW4sCiAgICAgICAgIGA5MCUgSFBESWAgPSBkaWZmc19ocGRpX2ZhbmN5KQoKbm90ZV9yb3cgPC0gZGF0YV9mcmFtZShWYXJpYWJsZSA9IGMoIipeYV5Bbm51YWwgQ1BTLCBNYXJjaCAyMDE3KiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqXmJeTW9udGhseSBDUFMsIFNlcHRlbWJlciAyMDE1KiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIqXuKAoF5OYXRpb25hbCB2YWx1ZSBpcyBvdXRzaWRlIHRoZSBzYW1wbGUgaGlnaGVzdCBwb3N0ZXJpb3IgZGVuc2l0eSBpbnRlcnZhbCAoSFBESSkqIikpCgpiaW5kX3Jvd3ModGJsX3NhbXBsZV9wb3AsIG5vdGVfcm93KSAlPiUgCiAgcGFuZG9jLnRhYmxlLnJldHVybihrZWVwLmxpbmUuYnJlYWtzID0gVFJVRSwgc3R5bGUgPSAibXVsdGlsaW5lIiwganVzdGlmeSA9ICJsY2NjYyIsIAogICAgICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICJDaGFyYWN0ZXJpc3RpY3Mgb2YgZXhwZXJpbWVudGFsIHNhbXBsZSB7I3RibDpleHAtc2FtcGxlfSIpICVUPiUgCiAgY2F0KGZpbGUgPSBoZXJlKCJvdXRwdXQiLCAidGFibGVzIiwgInRibC1leHAtc2FtcGxlLm1kIikpICU+JSAKICBjYXQoKQpgYGAKCgojIE1pc2NlbGxhbmVvdXMgc3VydmV5IGRldGFpbHMKCiMjIEF2ZXJhZ2UgdGltZSB0byBjb21wbGV0ZSBzdXJ2ZXkKCmBgYHtyIGF2Zy10aW1lLCByZXN1bHRzPSJhc2lzIn0KZm10X21zIDwtIGZ1bmN0aW9uKHgpIHsKICBuX3NlY29uZHMgPC0gc2Vjb25kc190b19wZXJpb2QoeCkKICBzcHJpbnRmKCIlMDIuMGY6JTAyLjBmIiwgbWludXRlKG5fc2Vjb25kcyksIHNlY29uZChuX3NlY29uZHMpKQp9Cgp0aGVtZV9uZ29zX3RhYmxlIDwtIHR0aGVtZV9taW5pbWFsKAogIGNvcmUgPSAKICAgIGxpc3QoZmdfcGFyYW1zID0gCiAgICAgICAgICAgbGlzdChoanVzdCA9IDAsIHggPSAwLjEsCiAgICAgICAgICAgICAgICBmb250c2l6ZSA9IDcsIGZvbnRmYWNlID0gInBsYWluIiwKICAgICAgICAgICAgICAgIGZvbnRmYW1pbHkgPSAiRW5jb2RlIFNhbnMgQ29uZGVuc2VkIExpZ2h0IiksCiAgICAgICAgIGJnX3BhcmFtcyA9IGxpc3QoZmlsbCA9ICJ3aGl0ZSIpKSwKICBjb2xoZWFkID0gCiAgICBsaXN0KGZnX3BhcmFtcyA9IAogICAgICAgICAgIGxpc3QoaGp1c3QgPSAwLCB4ID0gMC4xLCBjb2wgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgZm9udHNpemUgPSA3LCBmb250ZmFjZSA9ICJwbGFpbiIsCiAgICAgICAgICAgICAgICBmb250ZmFtaWx5ID0gIkVuY29kZSBTYW5zIENvbmRlbnNlZCBTZW1pQm9sZCIpLAogICAgICAgICBiZ19wYXJhbXMgPSBsaXN0KGZpbGwgPSBuZ29fY29scygiYmx1ZSIpKSksCiAgcGFkZGluZyA9IHVuaXQoYyg0LCAyKSwgIm1tIikpCgp0aW1lX3N1bW1hcnkgPC0gcmVzdWx0cyAlPiUgCiAgc3VtbWFyaXplX2F0KHZhcnMoZHVyYXRpb24pLCBmdW5zKE1pbmltdW0gPSBtaW4sIE1heGltdW0gPSBtYXgsIE1lYW4gPSBtZWFuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFN0YW5kYXJkIGRldmlhdGlvbmAgPSBzZCwgTWVkaWFuID0gbWVkaWFuKSkgJT4lIAogIGdhdGhlcihTdGF0aXN0aWMsIHZhbHVlKSAlPiUgCiAgbXV0YXRlKE1pbnV0ZXMgPSBmbXRfbXModmFsdWUpKSAlPiUgCiAgc2VsZWN0KC12YWx1ZSkgCgpwYW5kb2MudGFibGUodGltZV9zdW1tYXJ5KQpgYGAKCmBgYHtyIGF2Zy10aW1lLXBsb3QsIGZpZy5oZWlnaHQ9Mi41LCBmaWcud2lkdGg9NH0Kc3VtbWFyeV9zdGF0cyA8LSB0YWJsZUdyb2IodGltZV9zdW1tYXJ5LCByb3dzID0gTlVMTCwgdGhlbWUgPSB0aGVtZV9uZ29zX3RhYmxlKSAlPiUgCiAgZ3RhYmxlOjpndGFibGVfYWRkX2dyb2IoLiwgZ3JvYnMgPSByZWN0R3JvYihncCA9IGdwYXIoZmlsbCA9IE5BLCBsd2QgPSAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IDEsIGIgPSBucm93KC4pLCBsID0gMSwgciA9IG5jb2woLikpCgpwbG90X2F2Z190aW1lIDwtIGdncGxvdChyZXN1bHRzLCBhZXMoeCA9IGR1cmF0aW9uKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbnMgPSA1MCwgZmlsbCA9IG5nb19jb2xzKCJibHVlIikpICsKICBzY2FsZV94X3RpbWUobGFiZWxzID0gZm10X21zKSArCiAgYW5ub3RhdGlvbl9jdXN0b20oc3VtbWFyeV9zdGF0cywgeG1pbiA9IDcwMCwgeG1heCA9IDkwMCwgeW1pbiA9IDMwLCB5bWF4ID0gNjApICsKICBsYWJzKHggPSAiTWludXRlcyBzcGVudCBvbiBleHBlcmltZW50IiwgeSA9ICJDb3VudCIpICsKICB0aGVtZV9uZ29zKGJhc2Vfc2l6ZSA9IDkuNSkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgpwbG90X2F2Z190aW1lICVUPiUgCiAgcHJpbnQoKSAlVD4lCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCAiYXZnLXRpbWUucGRmIiksCiAgICAgICAgIHdpZHRoID0gNCwgaGVpZ2h0ID0gMi4yNSwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSBjYWlyb19wZGYpICU+JSAKICBnZ3NhdmUoLiwgZmlsZW5hbWUgPSBoZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsICJhdmctdGltZS5wbmciKSwKICAgICAgICAgd2lkdGggPSA0LCBoZWlnaHQgPSAyLjI1LCB1bml0cyA9ICJpbiIsIHR5cGUgPSAiY2Fpcm8iLCBkcGkgPSAzMDApCmBgYAoKIyBBbW91bnQgZG9uYXRlZCAoZnVsbCkKCiMjIE1vZGVscwoKYGBge3IgYnVpbGQtbW9kZWxzLWFtb3VudC1mdWxsLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1UUlVFfQojIEJhc2ljIG1vZGVsCm1fYW1vdW50X2MgPC0gc3Rhbl9nbG0oYW1vdW50X2RvbmF0ZSB+IGNyYWNrZG93biwKICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmVzdWx0cywgZmFtaWx5ID0gZ2F1c3NpYW4oKSwKICAgICAgICAgICAgICAgICAgICAgICBwcmlvciA9IGNhdWNoeShsb2NhdGlvbiA9IDAsIHNjYWxlID0gMi41KSwKICAgICAgICAgICAgICAgICAgICAgICBwcmlvcl9pbnRlcmNlcHQgPSBjYXVjaHkobG9jYXRpb24gPSAwLCBzY2FsZSA9IDEwKSwKICAgICAgICAgICAgICAgICAgICAgICBjaGFpbnMgPSBDSEFJTlMsIGl0ZXIgPSBJVEVSLCB3YXJtdXAgPSBXQVJNVVAsIHNlZWQgPSBCQVlFU19TRUVEKQoKbV9hbW91bnRfY2kgPC0gdXBkYXRlKG1fYW1vdW50X2MsIC4gfiAuICsgaXNzdWUgKyBjcmFja2Rvd24gKiBpc3N1ZSkKCm1fYW1vdW50X2NpZiA8LSB1cGRhdGUobV9hbW91bnRfYywgLiB+IC4gKyAKICAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlICsgZnVuZGluZyArIGNyYWNrZG93biAqIGlzc3VlICsgY3JhY2tkb3duICogZnVuZGluZyArIAogICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWUgKiBmdW5kaW5nICsgY3JhY2tkb3duICogaXNzdWUgKiBmdW5kaW5nKQoKIyBJbnRlcmFjdGlvbiBtb2RlbHMgd2l0aCBleHRyYSBjb250cm9scwptX2Ftb3VudF9jX2Z1bGwgPC0gdXBkYXRlKG1fYW1vdW50X2MsIC4gfiAuICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXZvcl9odW1hbml0YXJpYW5fYmluICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlX2NoYXJpdHlfMyArIHZvbHVudGVlciArIHBvbGl0aWNhbF9rbm93bGVkZ2VfYmluICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW9sb2d5X2JpbiArIGVkdWNhdGlvbl9iaW4gKyByZWxpZ2lvc2l0eV9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX2JpbiArIGFnZV9iaW4pCgptX2Ftb3VudF9jaV9mdWxsIDwtIHVwZGF0ZShtX2Ftb3VudF9jaSwgLiB+IC4gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXZvcl9odW1hbml0YXJpYW5fYmluICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZV9jaGFyaXR5XzMgKyB2b2x1bnRlZXIgKyBwb2xpdGljYWxfa25vd2xlZGdlX2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlb2xvZ3lfYmluICsgZWR1Y2F0aW9uX2JpbiArIHJlbGlnaW9zaXR5X2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX2JpbiArIGFnZV9iaW4pCgptX2Ftb3VudF9jaWZfZnVsbCA8LSB1cGRhdGUobV9hbW91bnRfY2lmLCAuIH4gLiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdm9yX2h1bWFuaXRhcmlhbl9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVfY2hhcml0eV8zICsgdm9sdW50ZWVyICsgcG9saXRpY2FsX2tub3dsZWRnZV9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW9sb2d5X2JpbiArIGVkdWNhdGlvbl9iaW4gKyByZWxpZ2lvc2l0eV9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9iaW4gKyBhZ2VfYmluKQpgYGAKCmBgYHtyIHRibC1tb2RlbHMtYW1vdW50LWZ1bGwsIHdhcm5pbmc9RkFMU0UsIHJlc3VsdHM9ImFzaXMifQpodXhyZWcobV9hbW91bnRfYywgbV9hbW91bnRfY2ksIG1fYW1vdW50X2NpZiwgCiAgICAgICBtX2Ftb3VudF9jX2Z1bGwsIG1fYW1vdW50X2NpX2Z1bGwsIG1fYW1vdW50X2NpZl9mdWxsLAogICAgICAgY29lZnMgPSBjbGVhbl9jb2Vmc19uYW1lZCwKICAgICAgIHN0YXRpc3RpY3MgPSBtb2RlbF9zdGF0c19iYXllcywKICAgICAgIHN0YXJzID0gTlVMTCkgJVQ+JSAKICBwcmludF9odXgoKSAlPiUgCiAgdG9fbWQobWF4X3dpZHRoID0gMTAwKSAlPiUgCiAgY2F0KGZpbGUgPSBoZXJlKCJvdXRwdXQiLCAidGFibGVzIiwgInRibC1tb2RlbHMtYW1vdW50LWZ1bGwubWQiKSkKYGBgCgojIyBDb2VmZmljaWVudCBwbG90CgpgYGB7ciBtb2RlbHMtY29lZnMtcGxvdC1hbW91bnQsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTV9CnBvc3Rlcmlvcl9kZXRhaWxzIDwtIGRhdGFfZnJhbWUobW9kZWxfbmFtZSA9IGMoIkJhc2ljIG1vZGVsIiwgIkZ1bGwgbW9kZWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbCA9IGxpc3QobV9hbW91bnRfY2lmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Ftb3VudF9jaWZfZnVsbCkpICU+JSAKICBtdXRhdGUocG9zdGVyaW9yID0gbW9kZWwgJT4lIG1hcCh+IGFzX2RhdGFfZnJhbWUoLikpLAogICAgICAgICB0aWR5X3N1bW1hcnkgPSBtb2RlbCAlPiUgbWFwKH4gdGlkeU1DTUMoLiwgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZi5tZXRob2QgPSAiSFBEaW50ZXJ2YWwiKSkpIAoKY29lZnNfcG9zdGVyaW9yIDwtIHBvc3Rlcmlvcl9kZXRhaWxzICU+JQogIHVubmVzdChwb3N0ZXJpb3IpICU+JSAKICBnYXRoZXIodGVybSwgdmFsdWUsIC1tb2RlbF9uYW1lKSAlPiUgCiAgbGVmdF9qb2luKGNsZWFuX2NvZWZzLCBieSA9ICJ0ZXJtIikgJT4lIAogIGZpbHRlcih0ZXJtX2NsZWFuICE9ICJJbnRlcmNlcHQiKSAlPiUgCiAgbXV0YXRlKGZ1bGxfbW9kZWwgPSAhc2ltcGxlX21vZGVsKQoKY29lZnNfc3VtbWFyeSA8LSBwb3N0ZXJpb3JfZGV0YWlscyAlPiUgCiAgdW5uZXN0KHRpZHlfc3VtbWFyeSkgJT4lIAogIGxlZnRfam9pbihjbGVhbl9jb2VmcywgYnkgPSAidGVybSIpICU+JSAKICBmaWx0ZXIodGVybV9jbGVhbiAhPSAiSW50ZXJjZXB0IikgJT4lIAogIG11dGF0ZShmdWxsX21vZGVsID0gIXNpbXBsZV9tb2RlbCkKCmFtb3VudF9jb2Vmc19mdWxsIDwtIGdncGxvdChjb2Vmc19wb3N0ZXJpb3IsIGFlcyh4ID0gdmFsdWUsIHkgPSBmY3RfcmV2KHRlcm1fY2xlYW5fZmN0KSkpICsKICBzdGF0X2RlbnNpdHlfcmlkZ2VzKGFlcyhmaWxsID0gbW9kZWxfbmFtZSksIGFscGhhID0gMC42LCBjb2xvciA9ICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICByZWxfbWluX2hlaWdodCA9IDAuMDEsIHNjYWxlID0gMS41LCAKICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlX2xpbmVzID0gVFJVRSwgcXVhbnRpbGVzID0gMikgKwogIGdlb21fc2VnbWVudChkYXRhID0gY29lZnNfc3VtbWFyeSwgCiAgICAgICAgICAgICAgIGFlcyh4ID0gY29uZi5sb3csIHhlbmQgPSBjb25mLmhpZ2gsIAogICAgICAgICAgICAgICAgICAgeSA9IGZjdF9yZXYodGVybV9jbGVhbl9mY3QpLCB5ZW5kID0gZmN0X3Jldih0ZXJtX2NsZWFuX2ZjdCkpLAogICAgICAgICAgICAgICBzaXplID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRvdHRlZCIsIHNpemUgPSAxKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG5nb19jb2xzKCJyZWQiLCAiYmx1ZSIsIG5hbWUgPSBGQUxTRSksIG5hbWUgPSBOVUxMKSArCiAgbGFicyh4ID0gIlBvc3RlcmlvciBtZWRpYW4gZXN0aW1hdGUgKyA5MCUgY3JlZGlibGUgaW50ZXJ2YWwiLCB5ID0gTlVMTCwKICAgICAgIGNhcHRpb24gPSAiOTAlIGNyZWRpYmxlIGludGVydmFscyBzaG93biBpbiBibGFjay4gU29saWQgdmVydGljYWwgbGluZSA9IG1lZGlhbjsgZG90dGVkIHZlcnRpY2FsIGxpbmUgPSAwIikgKwogIGZhY2V0X3dyYXAofiBmdWxsX21vZGVsLCBzY2FsZXMgPSAiZnJlZSIpICsgCiAgdGhlbWVfbmdvcygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF9ibGFuaygpKQoKYW1vdW50X2NvZWZzX2Z1bGwgJVQ+JQogIHByaW50KCkgJVQ+JSAKICBnZ3NhdmUoLiwgZmlsZW5hbWUgPSBoZXJlKCJvdXRwdXQiLCAiZmlndXJlcyIsICJhbW91bnQtY29lZnMtZnVsbC5wZGYiKSwKICAgICAgICAgd2lkdGggPSA4LCBoZWlnaHQgPSA1LCB1bml0cyA9ICJpbiIsIGRldmljZSA9IGNhaXJvX3BkZikgJT4lIAogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwgImFtb3VudC1jb2Vmcy1mdWxsLnBuZyIpLAogICAgICAgICB3aWR0aCA9IDgsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgojIyBQcmVkaWN0ZWQgbWVkaWFucyBhY3Jvc3MgZGlmZmVyZW50IHZhcmlhYmxlcwoKKipDaGFyaXRhYmxlIGdpdmluZyoqCgpgYGB7ciBwbG90LWNoYXJpdHktYW1vdW50cywgZmlnLndpZHRoPTUsIGZpZy5oZWlnaHQ9NH0KbmV3ZGF0YV9tZWFucyA8LSByZXN1bHRzICU+JSAKICBzZWxlY3QoZmF2b3JfaHVtYW5pdGFyaWFuX2JpbiwgZmF2b3JfaHVtYW5fcmlnaHRzX2JpbiwgZmF2b3JfZGV2ZWxvcG1lbnRfYmluLAogICAgICAgICBnaXZlX2NoYXJpdHlfMywgdm9sdW50ZWVyLCBwb2xpdGljYWxfa25vd2xlZGdlX2JpbiwKICAgICAgICAgaWRlb2xvZ3lfYmluLCBlZHVjYXRpb25fYmluLCByZWxpZ2lvc2l0eV9iaW4sIGluY29tZV9iaW4sIGFnZV9iaW4pICU+JSAKICBzdW1tYXJpemVfYWxsKHR5cGljYWwpICU+JSAKICBtdXRhdGUoaWQgPSAxKQoKbmV3ZGF0YV9jb25kaXRpb25zX2NoYXJpdHkgPC0gcmVzdWx0cyAlPiUgZXhwYW5kKG5lc3RpbmcoY3JhY2tkb3duLCBnaXZlX2NoYXJpdHlfMykpICU+JSAKICBtdXRhdGUoaWQgPSAxKSAlPiUgCiAgbGVmdF9qb2luKHNlbGVjdChuZXdkYXRhX21lYW5zLCAtZ2l2ZV9jaGFyaXR5XzMpLCBieSA9ICJpZCIpICU+JSAKICBzZWxlY3QoLWlkKQoKY2hhaW5zX2ZpdHRlZF9jaGFyaXR5IDwtIHBvc3Rlcmlvcl9saW5wcmVkKG1fYW1vdW50X2NfZnVsbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhID0gbmV3ZGF0YV9jb25kaXRpb25zX2NoYXJpdHkpCgpjb2VmX3N1bW1hcnlfY2hhcml0eSA8LSBuZXdkYXRhX2NvbmRpdGlvbnNfY2hhcml0eSAlPiUgCiAgYmluZF9jb2xzKHRpZHlNQ01DKGNoYWluc19maXR0ZWRfY2hhcml0eSwgZXN0aW1hdGUubWV0aG9kID0gIm1lZGlhbiIsCiAgICAgICAgICAgICAgICAgICAgIGNvbmYuaW50ID0gVFJVRSwgY29uZi5sZXZlbCA9IDAuOSwgY29uZi5tZXRob2QgPSAiSFBEaW50ZXJ2YWwiKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKGNyYWNrZG93biwgZ2l2ZV9jaGFyaXR5XzMpLCBmdW5zKGZjdF9pbm9yZGVyKC4sIG9yZGVyZWQgPSBUUlVFKSkpCgpnZ3Bsb3QoY29lZl9zdW1tYXJ5X2NoYXJpdHksIGFlcyh4ID0gZmN0X3JldihnaXZlX2NoYXJpdHlfMyksIHkgPSBlc3RpbWF0ZSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjb25mLmxvdywgeW1heCA9IGNvbmYuaGlnaCwgY29sb3IgPSBjcmFja2Rvd24pLCAKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gbmdvX2NvbHMoIm9yYW5nZSIsICJncmVlbiIsIG5hbWUgPSBGQUxTRSksIG5hbWUgPSBOVUxMKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGxhYnMoeCA9ICJIb3cgb2Z0ZW4gZG8geW91IGdpdmUgdG8gY2hhcml0eT8iLCB5ID0gIk1lZGlhbiBhbW91bnQgZG9uYXRlZCIpICsKICB0aGVtZV9uZ29zKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoqKlZvbHVudGFyaXNtIGFuZCByZWxpZ2lvc2l0eSoqCgpgYGB7ciBwbG90LXZvbC1yZWxpZy1hbW91bnRzfQpuZXdkYXRhX2NvbmRpdGlvbnNfdm9sX3JlbGlnIDwtIHJlc3VsdHMgJT4lIAogIGV4cGFuZChuZXN0aW5nKGNyYWNrZG93biwgdm9sdW50ZWVyLCByZWxpZ2lvc2l0eV9iaW4pKSAlPiUgCiAgZmlsdGVyKCFpcy5uYShyZWxpZ2lvc2l0eV9iaW4pKSAlPiUgCiAgbXV0YXRlKGlkID0gMSkgJT4lIAogIGxlZnRfam9pbihzZWxlY3QobmV3ZGF0YV9tZWFucywgLXZvbHVudGVlciwgLXJlbGlnaW9zaXR5X2JpbiksIGJ5ID0gImlkIikgJT4lIAogIHNlbGVjdCgtaWQpCgpjaGFpbnNfZml0dGVkX3ZvbF9yZWxpZyA8LSBwb3N0ZXJpb3JfbGlucHJlZChtX2Ftb3VudF9jX2Z1bGwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdkYXRhID0gbmV3ZGF0YV9jb25kaXRpb25zX3ZvbF9yZWxpZykKCmNvZWZfc3VtbWFyeV92b2xfcmVsaWcgPC0gbmV3ZGF0YV9jb25kaXRpb25zX3ZvbF9yZWxpZyAlPiUgCiAgYmluZF9jb2xzKHRpZHlNQ01DKGNoYWluc19maXR0ZWRfdm9sX3JlbGlnLCBlc3RpbWF0ZS5tZXRob2QgPSAibWVkaWFuIiwKICAgICAgICAgICAgICAgICAgICAgY29uZi5pbnQgPSBUUlVFLCBjb25mLmxldmVsID0gMC45LCBjb25mLm1ldGhvZCA9ICJIUERpbnRlcnZhbCIpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoY3JhY2tkb3duLCB2b2x1bnRlZXIsIHJlbGlnaW9zaXR5X2JpbiksIGZ1bnMoZmN0X2lub3JkZXIoLiwgb3JkZXJlZCA9IFRSVUUpKSkgJT4lIAogIG11dGF0ZShyZWxpZ2lvc2l0eV9iaW4gPSBmY3RfcmVjb2RlKHJlbGlnaW9zaXR5X2JpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUmFyZWx5IGF0dGVuZCByZWxpZ2lvdXMgc2VydmljZXNgID0gIlJhcmVseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEF0dGVuZCByZWxpZ2lvdXMgc2VydmljZXNcbmF0IGxlYXN0IG9uY2UgYSBtb250aGAgPSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdCBsZWFzdCBvbmNlIGEgbW9udGgiKSkKCmdncGxvdChjb2VmX3N1bW1hcnlfdm9sX3JlbGlnLCBhZXMoeCA9IGZjdF9yZXYodm9sdW50ZWVyKSwgeSA9IGVzdGltYXRlKSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNvbmYubG93LCB5bWF4ID0gY29uZi5oaWdoLCBjb2xvciA9IGNyYWNrZG93biksIAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBuZ29fY29scygib3JhbmdlIiwgImdyZWVuIiwgbmFtZSA9IEZBTFNFKSwgbmFtZSA9IE5VTEwpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgbGFicyh4ID0gIkhhdmUgeW91IHZvbHVudGVlcmVkIGluIHRoZSBsYXN0IDEyIG1vbnRocz8iLCB5ID0gIk1lZGlhbiBhbW91bnQgZG9uYXRlZCIpICsKICBmYWNldF93cmFwKH4gcmVsaWdpb3NpdHlfYmluKSArCiAgdGhlbWVfbmdvcygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKClwKCiMgTGlrZWxpaG9vZCBvZiBkb25hdGlvbiAoZnVsbCkKCiMjIE1vZGVscwoKYGBge3IgYnVpbGQtbW9kZWxzLWxpa2VseS1mdWxsLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBjYWNoZT1UUlVFfQojIEJhc2ljIG1vZGVscwptX2xpa2VseV9jIDwtIHN0YW5fZ2xtKGRvbmF0ZV9saWtlbHlfYmluIH4gY3JhY2tkb3duLAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHRzLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksCiAgICAgICAgICAgICAgICAgICAgICAgcHJpb3IgPSBzdHVkZW50X3QoMywgMCwgMi41KSwKICAgICAgICAgICAgICAgICAgICAgICBwcmlvcl9pbnRlcmNlcHQgPSBzdHVkZW50X3QoMywgMCwgMTApLAogICAgICAgICAgICAgICAgICAgICAgIGNoYWlucyA9IENIQUlOUywgaXRlciA9IElURVIsIHdhcm11cCA9IFdBUk1VUCwgc2VlZCA9IEJBWUVTX1NFRUQpCgptX2xpa2VseV9jaSA8LSB1cGRhdGUobV9saWtlbHlfYywgLiB+IC4gKyBpc3N1ZSArIGNyYWNrZG93biAqIGlzc3VlKQoKbV9saWtlbHlfY2lmIDwtIHVwZGF0ZShtX2xpa2VseV9jLCAuIH4gLiArIAogICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWUgKyBmdW5kaW5nICsgY3JhY2tkb3duICogaXNzdWUgKyBjcmFja2Rvd24gKiBmdW5kaW5nICsgCiAgICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZSAqIGZ1bmRpbmcgKyBjcmFja2Rvd24gKiBpc3N1ZSAqIGZ1bmRpbmcpCgojIEludGVyYWN0aW9uIG1vZGVscyB3aXRoIGV4dHJhIGNvbnRyb2xzCm1fbGlrZWx5X2NfZnVsbCA8LSB1cGRhdGUobV9saWtlbHlfYywgLiB+IC4gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhdm9yX2h1bWFuaXRhcmlhbl9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZV9jaGFyaXR5XzMgKyB2b2x1bnRlZXIgKyBwb2xpdGljYWxfa25vd2xlZGdlX2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVvbG9neV9iaW4gKyBlZHVjYXRpb25fYmluICsgcmVsaWdpb3NpdHlfYmluICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9iaW4gKyBhZ2VfYmluKQoKbV9saWtlbHlfY2lfZnVsbCA8LSB1cGRhdGUobV9saWtlbHlfY2ksIC4gfiAuICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmF2b3JfaHVtYW5pdGFyaWFuX2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZV9jaGFyaXR5XzMgKyB2b2x1bnRlZXIgKyBwb2xpdGljYWxfa25vd2xlZGdlX2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlb2xvZ3lfYmluICsgZWR1Y2F0aW9uX2JpbiArIHJlbGlnaW9zaXR5X2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb21lX2JpbiArIGFnZV9iaW4pCgptX2xpa2VseV9jaWZfZnVsbCA8LSB1cGRhdGUobV9saWtlbHlfY2lmLCAuIH4gLiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYXZvcl9odW1hbml0YXJpYW5fYmluICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZV9jaGFyaXR5XzMgKyB2b2x1bnRlZXIgKyBwb2xpdGljYWxfa25vd2xlZGdlX2JpbiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW9sb2d5X2JpbiArIGVkdWNhdGlvbl9iaW4gKyByZWxpZ2lvc2l0eV9iaW4gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfYmluICsgYWdlX2JpbikKYGBgCgpgYGB7ciB0YmwtbW9kZWxzLWxpa2VseS1mdWxsLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSJhc2lzIn0KaHV4cmVnKG1fbGlrZWx5X2MsIG1fbGlrZWx5X2NpLCBtX2xpa2VseV9jaWYsIAogICAgICAgbV9saWtlbHlfY19mdWxsLCBtX2xpa2VseV9jaV9mdWxsLCBtX2xpa2VseV9jaWZfZnVsbCwKICAgICAgIGNvZWZzID0gY2xlYW5fY29lZnNfbmFtZWQsCiAgICAgICBzdGF0aXN0aWNzID0gbW9kZWxfc3RhdHNfYmF5ZXMsCiAgICAgICBzdGFycyA9IE5VTEwpICVUPiUgCiAgcHJpbnRfaHV4KCkgJT4lIAogIHRvX21kKG1heF93aWR0aCA9IDEwMCkgJT4lIAogIGNhdChmaWxlID0gaGVyZSgib3V0cHV0IiwgInRhYmxlcyIsICJ0YmwtbW9kZWxzLWxpa2VsaWhvb2QtZnVsbC5tZCIpKQpgYGAKCiMjIENvZWZmaWNpZW50IHBsb3QKCmBgYHtyIG1vZGVscy1jb2Vmcy1wbG90LWxpa2VseSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9NX0KcG9zdGVyaW9yX2RldGFpbHNfbGlrZWx5IDwtIGRhdGFfZnJhbWUobW9kZWxfbmFtZSA9IGMoIkJhc2ljIG1vZGVsIiwgIkZ1bGwgbW9kZWwiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBsaXN0KG1fbGlrZWx5X2NpZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbGlrZWx5X2NpZl9mdWxsKSkgJT4lIAogIG11dGF0ZShwb3N0ZXJpb3IgPSBtb2RlbCAlPiUgbWFwKH4gYXNfZGF0YV9mcmFtZSguKSksCiAgICAgICAgIHRpZHlfc3VtbWFyeSA9IG1vZGVsICU+JSBtYXAofiB0aWR5TUNNQyguLCBjb25mLmludCA9IFRSVUUsIGNvbmYubGV2ZWwgPSAwLjksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mLm1ldGhvZCA9ICJIUERpbnRlcnZhbCIpKSkgCgpjb2Vmc19wb3N0ZXJpb3JfbGlrZWx5IDwtIHBvc3Rlcmlvcl9kZXRhaWxzX2xpa2VseSAlPiUKICB1bm5lc3QocG9zdGVyaW9yKSAlPiUgCiAgZ2F0aGVyKHRlcm0sIHZhbHVlLCAtbW9kZWxfbmFtZSkgJT4lIAogIGxlZnRfam9pbihjbGVhbl9jb2VmcywgYnkgPSAidGVybSIpICU+JSAKICBmaWx0ZXIodGVybV9jbGVhbiAhPSAiSW50ZXJjZXB0IikgJT4lIAogIG11dGF0ZShmdWxsX21vZGVsID0gIXNpbXBsZV9tb2RlbCkKCmNvZWZzX3N1bW1hcnlfbGlrZWx5IDwtIHBvc3Rlcmlvcl9kZXRhaWxzX2xpa2VseSAlPiUgCiAgdW5uZXN0KHRpZHlfc3VtbWFyeSkgJT4lIAogIGxlZnRfam9pbihjbGVhbl9jb2VmcywgYnkgPSAidGVybSIpICU+JSAKICBmaWx0ZXIodGVybV9jbGVhbiAhPSAiSW50ZXJjZXB0IikgJT4lIAogIG11dGF0ZShmdWxsX21vZGVsID0gIXNpbXBsZV9tb2RlbCkKCmxpa2VseV9jb2Vmc19mdWxsIDwtIGdncGxvdChjb2Vmc19wb3N0ZXJpb3JfbGlrZWx5LCBhZXMoeCA9IHZhbHVlLCB5ID0gZmN0X3Jldih0ZXJtX2NsZWFuX2ZjdCkpKSArCiAgc3RhdF9kZW5zaXR5X3JpZGdlcyhhZXMoZmlsbCA9IG1vZGVsX25hbWUpLCBhbHBoYSA9IDAuNiwgY29sb3IgPSAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgcmVsX21pbl9oZWlnaHQgPSAwLjAxLCBzY2FsZSA9IDEuNSwgCiAgICAgICAgICAgICAgICAgICAgICBxdWFudGlsZV9saW5lcyA9IFRSVUUsIHF1YW50aWxlcyA9IDIpICsKICBnZW9tX3NlZ21lbnQoZGF0YSA9IGNvZWZzX3N1bW1hcnlfbGlrZWx5LCAKICAgICAgICAgICAgICAgYWVzKHggPSBjb25mLmxvdywgeGVuZCA9IGNvbmYuaGlnaCwgCiAgICAgICAgICAgICAgICAgICB5ID0gZmN0X3Jldih0ZXJtX2NsZWFuX2ZjdCksIHllbmQgPSBmY3RfcmV2KHRlcm1fY2xlYW5fZmN0KSksCiAgICAgICAgICAgICAgIHNpemUgPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAiZG90dGVkIiwgc2l6ZSA9IDEpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gbmdvX2NvbHMoInJlZCIsICJibHVlIiwgbmFtZSA9IEZBTFNFKSwgbmFtZSA9IE5VTEwpICsKICBsYWJzKHggPSAiUG9zdGVyaW9yIG1lZGlhbiBlc3RpbWF0ZSArIDkwJSBjcmVkaWJsZSBpbnRlcnZhbCIsIHkgPSBOVUxMLAogICAgICAgY2FwdGlvbiA9ICI5MCUgY3JlZGlibGUgaW50ZXJ2YWxzIHNob3duIGluIGJsYWNrLiBTb2xpZCB2ZXJ0aWNhbCBsaW5lID0gbWVkaWFuOyBkb3R0ZWQgdmVydGljYWwgbGluZSA9IDAiKSArCiAgZmFjZXRfd3JhcCh+IGZ1bGxfbW9kZWwsIHNjYWxlcyA9ICJmcmVlIikgKyAKICB0aGVtZV9uZ29zKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpCgpsaWtlbHlfY29lZnNfZnVsbCAlVD4lCiAgcHJpbnQoKSAlVD4lIAogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoIm91dHB1dCIsICJmaWd1cmVzIiwgImxpa2VseS1jb2Vmcy1mdWxsLnBkZiIpLAogICAgICAgICB3aWR0aCA9IDgsIGhlaWdodCA9IDUsIHVuaXRzID0gImluIiwgZGV2aWNlID0gY2Fpcm9fcGRmKSAlPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgib3V0cHV0IiwgImZpZ3VyZXMiLCAibGlrZWx5LWNvZWZzLWZ1bGwucG5nIiksCiAgICAgICAgIHdpZHRoID0gOCwgaGVpZ2h0ID0gNSwgdW5pdHMgPSAiaW4iLCB0eXBlID0gImNhaXJvIiwgZHBpID0gMzAwKQpgYGAKCgojIE9yaWdpbmFsIGNvbXB1dGluZyBlbnZpcm9ubWVudAoKPGJ1dHRvbiBkYXRhLXRvZ2dsZT0iY29sbGFwc2UiIGRhdGEtdGFyZ2V0PSIjc2Vzc2lvbmluZm8iIGNsYXNzPSJidG4gYnRuLXByaW1hcnkgYnRuLW1kIGJ0bi1pbmZvIj5IZXJlJ3Mgd2hhdCB3ZSB1c2VkIHRoZSBsYXN0IHRpbWUgd2UgYnVpbHQgdGhpcyBwYWdlPC9idXR0b24+Cgo8ZGl2IGlkPSJzZXNzaW9uaW5mbyIgY2xhc3M9ImNvbGxhcHNlIj4KCmBgYHtyIHNob3ctc2Vzc2lvbi1pbmZvLCBlY2hvPVRSVUV9CndyaXRlTGluZXMocmVhZExpbmVzKGZpbGUucGF0aChTeXMuZ2V0ZW52KCJIT01FIiksICIuUi9NYWtldmFycyIpKSkKCmRldnRvb2xzOjpzZXNzaW9uX2luZm8oKQpgYGAKCjwvZGl2PiAK