Overview of data

Balance of experimental conditions

Crackdown Issue Funding n
No crackdown Human rights Government 68
No crackdown Human rights Private 64
No crackdown Humanitarian assistance Government 68
No crackdown Humanitarian assistance Private 65
Crackdown Human rights Government 65
Crackdown Human rights Private 65
Crackdown Humanitarian assistance Government 68
Crackdown Humanitarian assistance Private 68
Total - - 531

Descriptive statistics table

vars_to_summarize <- tribble(
  ~variable, ~clean_name,
  "donate_likely", "Likelihood of donation",
  "donate_likely_bin", "Likelihood of donation (binary)",
  "amount_donate", "Amount hypothetically donated ($)",
  "gender", "Gender",
  "age", "Age",
  "income", "Income",
  "education", "Education",
  "religiosity", "Frequency of attending religious services",
  "ideology", "Political views",
  "political_knowledge", "Frequency of following public affairs",
  "give_charity", "Frequency of charitable donations",
  "volunteer", "Volunteered in past 12 months",
  "favor_humanitarian", "Prior favorability towards humanitarian NGOs",
  "favor_humanitarian_bin", "Prior favorability towards humanitarian NGOs (binary)",
  "favor_human_rights", "Prior favorability towards human rights NGOs",
  "favor_human_rights_bin", "Prior favorability towards human rights NGOs (binary)",
  "favor_development", "Prior favorability towards development NGOs",
  "favor_development_bin", "Prior favorability towards development NGOs (binary)",
  "check2", "Attention check 2"
)

results_summary_stats <- results %>% 
  select(one_of(vars_to_summarize$variable)) %>% 
  gather(variable, value) %>% 
  group_by(variable) %>% 
  nest() %>% 
  mutate(N = data %>% map_int(~ nrow(.)),
         summary = map2(.x = data, .y = variable, ~ md_summary_row(.x$value, .y, results))) %>% 
  left_join(vars_to_summarize, by = "variable") %>% 
  mutate(variable = factor(variable, levels = vars_to_summarize$variable, ordered = TRUE)) %>% 
  arrange(variable) %>% 
  select(-data, -variable) %>% 
  unnest(summary) %>% 
  select(Variable = clean_name, N, ` ` = spark, Details = summary)

results_summary_stats %>% 
  select(-N) %>% 
  pandoc.table.return(caption = "Descriptive statistics {#tbl:descriptive-stats}",
                      split.cell = 80, split.table = Inf) %T>% 
  cat(file = here("analysis", "output", "tables", "tbl-descriptive-stats.md")) %>%
  cat()
Descriptive statistics {#tbl:descriptive-stats}
Variable Details
Likelihood of donation Extremely unlikely (46; 8.7%) | Somewhat unlikely (110; 20.7%) | Neither likely nor unlikely (138; 26.0%) | Somewhat likely (192; 36.2%) | Extremely likely (45; 8.5%)
Likelihood of donation (binary) Not likely (294; 55.4%) | Likely (237; 44.6%)
Amount hypothetically donated ($) Median: 10 | Mean: 22.4 | Std. Dev.: 25.67
Gender Female (291; 54.8%) | Male (237; 44.6%) | Other (1; 0.2%) | Prefer not to say (2; 0.4%)
Age Under 18 (1; 0.2%) | 18 – 24 (43; 8.1%) | 25 – 34 (207; 39.0%) | 35 – 44 (129; 24.3%) | 45 – 54 (90; 16.9%) | 55 – 64 (44; 8.3%) | 65 – 74 (16; 3.0%) | 75 – 84 (1; 0.2%)
Income Less than $10,000 (32; 6.0%) | $10,000 – $19,999 (43; 8.1%) | $20,000 – $29,999 (50; 9.4%) | $30,000 – $39,999 (78; 14.7%) | $40,000 – $49,999 (58; 10.9%) | $50,000 – $59,999 (55; 10.4%) | $60,000 – $69,999 (43; 8.1%) | $70,000 – $79,999 (38; 7.2%) | $80,000 – $89,999 (25; 4.7%) | $90,000 – $99,999 (30; 5.6%) | $100,000 – $149,999 (45; 8.5%) | More than $150,000 (21; 4.0%) | Prefer not to say (13; 2.4%)
Education Less than high school (2; 0.4%) | High school graduate (47; 8.9%) | Some college (128; 24.1%) | 2 year degree (68; 12.8%) | 4 year degree (212; 39.9%) | Graduate or professional degree (66; 12.4%) | Doctorate (8; 1.5%)
Frequency of attending religious services More than once a week (19; 3.6%) | Once a week (74; 13.9%) | Once or twice a month (50; 9.4%) | A few times a year (71; 13.4%) | Seldom (98; 18.5%) | Never (215; 40.5%) | Don’t know (4; 0.8%)
Political views Strong liberal (76; 14.3%) | Liberal (150; 28.2%) | Independent, leaning liberal (82; 15.4%) | Independent (80; 15.1%) | Independent, leaning conservative (60; 11.3%) | Conservative (61; 11.5%) | Very conservative (22; 4.1%)
Frequency of following public affairs Most of the time (217; 40.9%) | Some of the time (213; 40.1%) | Only now and then (84; 15.8%) | Hardly at all (17; 3.2%)
Frequency of charitable donations Once a week (37; 7.0%) | Once a month (105; 19.8%) | Once every three months (105; 19.8%) | Once every six months (102; 19.2%) | Once a year (89; 16.8%) | Once every few years (56; 10.5%) | Never (37; 7.0%)
Volunteered in past 12 months No (288; 54.24%) | Yes (243; 45.76%)
Prior favorability towards humanitarian NGOs Very unfavorable (2; 0.4%) | Unfavorable (6; 1.1%) | Neutral (39; 7.3%) | Favorable (235; 44.3%) | Very favorable (249; 46.9%)
Prior favorability towards humanitarian NGOs (binary) Not favorable (47; 8.9%) | Favorable (484; 91.1%)
Prior favorability towards human rights NGOs Very unfavorable (5; 0.9%) | Unfavorable (12; 2.3%) | Neutral (61; 11.5%) | Favorable (226; 42.6%) | Very favorable (227; 42.7%)
Prior favorability towards human rights NGOs (binary) Not favorable (78; 14.7%) | Favorable (453; 85.3%)
Prior favorability towards development NGOs Very unfavorable (5; 0.9%) | Unfavorable (8; 1.5%) | Neutral (45; 8.5%) | Favorable (235; 44.3%) | Very favorable (238; 44.8%)
Prior favorability towards development NGOs (binary) Not favorable (58; 10.9%) | Favorable (473; 89.1%)
Attention check 2 Correct (531; 100%)

Average likelihood and amount donated across conditions

Crackdown condition Issue condition Funding condition % likely to donate Amount donated (mean) Amount donated (sd) N
No crackdown Human rights Government 47.1% 22.4 24.8 68
Private 39.1% 19.3 22.4 64
Total 43.2% 20.9 23.6 132
Humanitarian assistance Government 44.1% 17.9 21.4 68
Private 40.0% 21.9 26.9 65
Total 42.1% 19.9 24.2 133
Total 42.6% 20.4 23.9 265
Crackdown Human rights Government 29.2% 19.4 25.8 65
Private 58.5% 28 26.4 65
Total 43.8% 23.7 26.3 130
Humanitarian assistance Government 51.5% 30.4 32.7 68
Private 47.1% 19.8 21.5 68
Total 49.3% 25.1 28.1 136
Total 46.6% 24.4 27.2 266
Total 44.6% 22.4 25.7 531


Visualize important variables

Amount donated


Treatment effects: Likelihood of donation

This time around, we’re not using interactionful regression models to calculate all these differences in groups. Instead we use real live Stan code to estimate the differences in group means and proportions!

Priors and models

We estimate the proportion of people responding that they’d be likely to donate to the organization with a binomial distribution, with a prior \(\theta\) distribution of \(\text{Beta}(5, 5)\). We build the following model in Stan:

\[ \begin{aligned} n_{\text{group 1, group 2}} &\sim \text{Binomial}(n_{\text{total in group}}, \theta_{\text{group}}) &\text{[likelihood]}\\ \text{Difference} &= n_{\text{group 2}} - n_{\text{group 1}} &\text{[difference in proportions]} \\ n &: \text{Number likely to donate} \\ \\ \theta_{\text{group 1, group 2}} &\sim \text{Beta}(5, 5) &\text{[prior prob. of being likely to donate]} \end{aligned} \]

Differences

tidied_diffs_likely <- all_models_likely %>% 
  unnest(posterior_chains_long) %>% 
  filter(.variable == "theta_diff") %>% 
  mutate(category = case_when(
    str_count(title, "\\|") == 0 ~ "Level 1",
    str_count(title, "\\|") == 1 ~ "Level 2",
    str_count(title, "\\|") == 2 ~ "Level 3"
  )) %>% 
  mutate(title = str_remove(title, " \\| Crackdown"))

level1_likely <- tidied_diffs_likely %>% 
  filter(category == "Level 1") %>%
  mutate(title = recode(title, 
                        Crackdown = "Crackdown −\nNo crackdown",
                        Issue = "Humanitarian\nassistance −\nHuman rights",
                        Funding = "Private −\nGovernment\nfunding")) %>% 
  mutate(title = fct_inorder(title))

plot_diff_likely_a <- ggplot(level1_likely, aes(x = .value, y = fct_rev(title), fill = title)) +
  geom_halfeyeh(.width = c(0.8, 0.95)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = percent_format(accuracy = 1)) +
  scale_fill_manual(values = ngo_cols(c("blue", "red", "orange"), name = FALSE), guide = FALSE) +
  labs(x = "Difference in donation likelihood", y = NULL, tag = "A") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

level2_likely <- tidied_diffs_likely %>% 
  filter(category == "Level 2") %>%
  mutate(condition = case_when(
    title %in% c("Human rights", "Humanitarian assistance") ~ "Issue",
    title %in% c("Government", "Private") ~ "Funding"
  )) %>% 
  mutate(facet_title = case_when(
    title %in% c("Human rights", "Humanitarian assistance") ~ paste(title, "issues"),
    title %in% c("Government", "Private") ~ paste(title, "funding")
  )) %>% 
  mutate(title = case_when(
    title %in% c("Humanitarian assistance", "Private") ~ "",
    TRUE ~ "Crackdown −\nNo crackdown")
  )

plot_diff_likely_b <- ggplot(filter(level2_likely, condition == "Issue"), 
                             aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("red", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = percent_format(accuracy = 1)) +
  labs(x = NULL, y = NULL, tag = "B") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

plot_diff_likely_c <- ggplot(filter(level2_likely, condition == "Funding"), 
                             aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("orange", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = percent_format(accuracy = 1)) +
  labs(x = "Difference in donation likelihood", y = NULL, tag = "C") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

level3_likely <- tidied_diffs_likely %>% 
  filter(category == "Level 3") %>%
  separate(title, c("issue", "funding"), sep = " \\| ") %>%
  mutate(issue = paste(issue, "issues"),
         funding = paste(funding, "funding")) %>% 
  mutate(facet_title = paste0(issue, "\n", funding)) %>% 
  mutate(title = case_when(
    funding == "Private funding" ~ "",
    TRUE ~ "Crackdown −\nNo crackdown")
  )

plot_diff_likely_d <- ggplot(level3_likely, aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("green", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = percent_format(accuracy = 1)) +
  labs(x = "Difference in donation likelihood", y = NULL, tag = "D",
       caption = "Point shows posterior median; thick black lines show 80% credible interval;\nthin black lines show 95% credible interval") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

plot_diffs_likely_all <- plot_diff_likely_a / 
  (plot_diff_likely_b / plot_diff_likely_c) / 
  plot_diff_likely_d

plot_diffs_likely_all

Likelihood of donation and differences in proportions in “crackdown” (treatment) and “no crackdown” (control) conditions; values represent posterior medians {#tbl:likely-diffs}
H1a % likelyTreatment % likelyControl \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Crackdown − No crackdown 46.8% 42.8% 3.9% 9.2% 0.83
Private − Government funding 46.4% 43.3% 3.1% 7.1% 0.76
Humanitarian assistance − Human rights 45.9% 43.8% 2.1% 4.7% 0.7
H2a and H3a % likelyCrackdown % likelyNo crackdown \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Human rights issues 44.2% 43.7% 0.6% 1.5% 0.54
Humanitarian assistance issues 49.4% 42.7% 6.8% 15.9% 0.88
Government funding 41.3% 45.9% -4.6% -10.1% 0.79
Private funding 52.5% 40.2% 12.2% 30.3% 0.98
H2a and H3a (nested) % likelyCrackdown % likelyNo crackdown \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Human rights issues, Government funding 31.9% 47.5% -15.4% -32.6% 0.98
Human rights issues, Private funding 57.5% 40.5% 17.0% 41.7% 0.98
Humanitarian assistance issues, Government funding 51.2% 44.8% 6.4% 14.4% 0.8
Humanitarian assistance issues, Private funding 47.5% 41.2% 6.2% 15.2% 0.79


Treatment effects: Amount donated

Priors and models

Following John Kruschke’s “Bayesian Estimation Supersedes the t-test (BEST)” procedure, we estimate means for each group with a t-distribution. We use the following priors for the distribution parameters:

\[ \begin{aligned} x_{\text{group 1, group 2}} &\sim \text{Student } t(\nu, \mu, \sigma) &\text{[likelihood]}\\ \text{Difference} &= x_{\text{group 2}} - x_{\text{group 1}} &\text{[difference in means]} \\ x &: \text{Mean amount donated} \\ \\ \nu &\sim \text{Exponential}(1 / 29) &\text{[prior normality]} \\ \mu_{\text{group 1, group 2}} &\sim \mathcal{N}(\bar{x}_{\text{group 1, group 2}}, 10) &\text{[prior donation mean per group]}\\ \sigma_{\text{group 1, group 2}} &\sim \text{Cauchy}(0, 1)&\text{[prior donation sd per group]} \end{aligned} \]

Differences

# This will generate a warning because unnest() puts the crackdown values into
# one column and we cheated by renaming issue and funding as crackdown, so it
# gets mad when combining the factors in crackdown with those in issue and
# funding. But because we only care about the diffs, we don't actually need the
# category labels here, so it's all good.
tidied_diffs_amount <- all_models_amount %>% 
  unnest(posterior_chains_long) %>% 
  filter(.variable == "mu_diff") %>% 
  mutate(category = case_when(
    str_count(title, "\\|") == 0 ~ "Level 1",
    str_count(title, "\\|") == 1 ~ "Level 2",
    str_count(title, "\\|") == 2 ~ "Level 3"
  )) %>% 
  mutate(title = str_remove(title, " \\| Crackdown"))

level1_amount <- tidied_diffs_amount %>% 
  filter(category == "Level 1") %>%
  mutate(title = recode(title, 
                        Crackdown = "Crackdown −\nNo crackdown",
                        Issue = "Humanitarian\nassistance −\nHuman rights",
                        Funding = "Private −\nGovernment\nfunding")) %>% 
  mutate(title = fct_inorder(title))

plot_diff_amount_a <- ggplot(level1_amount, aes(x = .value, y = fct_rev(title), fill = title)) +
  geom_vline(xintercept = 0) +
  geom_halfeyeh(.width = c(0.8, 0.95)) +
  scale_x_continuous(labels = dollar) +
  scale_fill_manual(values = ngo_cols(c("blue", "red", "orange"), name = FALSE), guide = FALSE) +
  labs(x = "Difference in amount donated", y = NULL, tag = "A") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

level2_amount <- tidied_diffs_amount %>% 
  filter(category == "Level 2") %>%
  mutate(condition = case_when(
    title %in% c("Human rights", "Humanitarian assistance") ~ "Issue",
    title %in% c("Government", "Private") ~ "Funding"
  )) %>% 
  mutate(facet_title = case_when(
    title %in% c("Human rights", "Humanitarian assistance") ~ paste(title, "issues"),
    title %in% c("Government", "Private") ~ paste(title, "funding")
  )) %>% 
  mutate(title = case_when(
    title %in% c("Humanitarian assistance", "Private") ~ "",
    TRUE ~ "Crackdown −\nNo crackdown")
  )

plot_diff_amount_b <- ggplot(filter(level2_amount, condition == "Issue"), 
                             aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("red", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = dollar) +
  labs(x = NULL, y = NULL, tag = "B") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

plot_diff_amount_c <- ggplot(filter(level2_amount, condition == "Funding"), 
                             aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("orange", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = dollar) +
  labs(x = "Difference in amount donated", y = NULL, tag = "C") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

level3_amount <- tidied_diffs_amount %>% 
  filter(category == "Level 3") %>%
  separate(title, c("issue", "funding"), sep = " \\| ") %>%
  mutate(issue = paste(issue, "issues"),
         funding = paste(funding, "funding")) %>% 
  mutate(facet_title = paste0(issue, "\n", funding)) %>% 
  mutate(title = case_when(
    funding == "Private funding" ~ "",
    TRUE ~ "Crackdown −\nNo crackdown")
  )

plot_diff_amount_d <- ggplot(level3_amount, aes(x = .value, y = fct_rev(title))) +
  geom_halfeyeh(.width = c(0.8, 0.95), fill = ngo_cols("green", name = FALSE)) +
  geom_vline(xintercept = 0) +
  scale_x_continuous(labels = dollar) +
  labs(x = "Difference in amount donated", y = NULL, tag = "D",
       caption = "Point shows posterior median; thick black lines show 80% credible interval;\nthin black lines show 95% credible interval") +
  facet_wrap(~ facet_title, scales = "free_y") +
  theme_ngos(base_size = 8) +
  theme(panel.grid.major.y = element_blank())

plot_diffs_amounts_all <- plot_diff_amount_a / 
  (plot_diff_amount_b / plot_diff_amount_c) / 
  plot_diff_amount_d

plot_diffs_amounts_all

tbl_amounts_tidy <- all_models_amount %>% 
  unnest(tidy) %>% 
  filter(term %in% c("mu", "mu_diff", "pct_change")) %>% 
  group_by(title) %>% 
  mutate(group_id = 1:n()) %>% 
  mutate(term = case_when(
    term == "mu" ~ paste0(term, "_", group_id),
    TRUE ~ term
  )) %>% 
  select(title, term, estimate) %>% 
  spread(term, estimate) %>% 
  mutate(category = case_when(
    str_count(title, "\\|") == 0 ~ "Level 1",
    str_count(title, "\\|") == 1 ~ "Level 2",
    str_count(title, "\\|") == 2 ~ "Level 3"
  )) %>% 
  ungroup()

tbl_amounts_probs <- all_models_amount %>% 
  unnest(posterior_chains_long) %>% 
  filter(.variable == "mu_diff") %>% 
  group_by(title) %>% 
  summarize(p.greater0 = mean(.value > 0),
            p.less0 = mean(.value < 0),
            p.diff.not0 = ifelse(median(.value) > 0, p.greater0, p.less0)) %>% 
  ungroup()

# Save combined table for later use in manuscript
tbl_amounts_tidy %>% 
  left_join(tbl_amounts_probs, by = "title") %>% 
  saveRDS(here("data", "derived_data", "results_models_amount.rds"))

tbl_amount_1 <- tbl_amounts_tidy %>% 
  left_join(tbl_amounts_probs, by = "title") %>% 
  filter(category == "Level 1") %>%
  mutate(title = recode(title, 
                        Crackdown = "Crackdown − No crackdown",
                        Issue = "*Humanitarian assistance − Human rights*",
                        Funding = "*Private − Government funding*")) %>% 
  mutate_at(vars(mu_1, mu_2, mu_diff, p.diff.not0), funs(as.character(round(., 2)))) %>% 
  mutate(pct_change = percent_format(accuracy = 0.1)(pct_change)) %>%
  select(`Frame` = title, `Amount~Treatment~` = mu_2, `Amount~Control~` = mu_1,
         `$\\Delta$` = mu_diff, `$\\%\\Delta$` = pct_change, 
         `$p(\\Delta \\neq 0)$` = p.diff.not0)
Mean values and differences in means for amount donated in “crackdown” (treatment) and “no crackdown” (control) conditions; values represent posterior medians {#tbl:amount-diffs}
H1b AmountTreatment AmountControl \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Crackdown − No crackdown 16.34 12.93 3.39 26.3% 0.97
Private − Government funding 15.13 13.71 1.42 10.4% 0.79
Humanitarian assistance − Human rights 14.06 14.85 -0.82 -5.5% 0.67
H2b and H3b AmountCrackdown AmountNo crackdown \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Human rights issues 17.4 14.86 2.54 17.2% 0.83
Humanitarian assistance issues 15.91 11.68 4.3 36.9% 0.95
Government funding 13.83 12.24 1.61 13.1% 0.74
Private funding 18.95 14.23 4.62 32.4% 0.97
H2b and H3b (nested) AmountCrackdown AmountNo crackdown \(\Delta\) \(\%\Delta\) \(p(\Delta \neq 0)\)
Human rights issues, Government funding 10.56 15.15 -4.46 -29.5% 0.91
Human rights issues, Private funding 23.76 14.5 9.19 63.8% 0.99
Humanitarian assistance issues, Government funding 21.42 11.89 9.35 77.9% 0.99
Humanitarian assistance issues, Private funding 15.69 15.72 -0.05 -0.3% 0.51

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=-O3 -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.2 (2018-12-20)
##  os       macOS Mojave 10.14.3        
##  system   x86_64, darwin15.6.0        
##  ui       X11                         
##  language (EN)                        
##  collate  en_US.UTF-8                 
##  ctype    en_US.UTF-8                 
##  tz       America/Denver              
##  date     2019-03-13                  
## 
## ─ Packages ──────────────────────────────────────────────────────────────
##  package                * version      date       lib
##  arrayhelpers             1.0-20160527 2016-05-28 [1]
##  assertthat               0.2.0        2017-04-11 [1]
##  backports                1.1.3        2018-12-14 [1]
##  base64enc                0.1-3        2015-07-28 [1]
##  bindr                    0.1.1        2018-03-13 [1]
##  bindrcpp               * 0.2.2        2018-03-29 [1]
##  boot                     1.3-20       2017-08-06 [1]
##  broom                  * 0.5.1        2018-12-05 [1]
##  callr                    3.1.1        2018-12-21 [1]
##  cellranger               1.1.0        2016-07-27 [1]
##  cli                      1.0.1        2018-09-25 [1]
##  coda                     0.19-2       2018-10-08 [1]
##  codetools                0.2-15       2016-10-05 [1]
##  colorspace               1.4-0        2019-01-13 [1]
##  crackdownsphilanthropy * 0.0.0.9000   2019-03-13 [1]
##  crayon                   1.3.4        2017-09-16 [1]
##  curl                     3.3          2019-01-10 [1]
##  dagitty                  0.2-2        2016-08-26 [1]
##  desc                     1.2.0        2018-05-01 [1]
##  devtools                 2.0.1        2018-10-26 [1]
##  digest                   0.6.18       2018-10-10 [1]
##  dplyr                  * 0.7.8        2018-11-10 [1]
##  evaluate                 0.13         2019-02-12 [1]
##  farver                   1.1.0        2018-11-20 [1]
##  forcats                * 0.3.0        2018-02-19 [1]
##  fs                       1.2.6        2018-08-23 [1]
##  generics                 0.0.2        2018-11-29 [1]
##  ggdag                  * 0.1.0        2018-03-27 [1]
##  ggforce                  0.1.3        2018-07-07 [1]
##  ggplot2                * 3.1.0        2018-10-25 [1]
##  ggraph                 * 1.0.2        2018-07-07 [1]
##  ggrepel                  0.8.0        2018-05-09 [1]
##  ggridges                 0.5.1        2018-09-27 [1]
##  ggstance               * 0.3.1        2018-07-20 [1]
##  glue                     1.3.0.9000   2019-02-09 [1]
##  gridExtra                2.3          2017-09-09 [1]
##  gtable                   0.2.0        2016-02-26 [1]
##  haven                    2.0.0        2018-11-22 [1]
##  here                   * 0.1          2017-05-28 [1]
##  hms                      0.4.2        2018-03-10 [1]
##  htmltools                0.3.6        2017-04-28 [1]
##  httr                     1.4.0        2018-12-11 [1]
##  igraph                   1.2.2        2018-07-27 [1]
##  inline                   0.3.15       2018-05-18 [1]
##  janitor                * 1.1.1        2018-07-31 [1]
##  jsonlite                 1.6          2018-12-07 [1]
##  knitr                    1.21         2018-12-10 [1]
##  labeling                 0.3          2014-08-23 [1]
##  lattice                  0.20-38      2018-11-04 [1]
##  lazyeval                 0.2.1        2017-10-29 [1]
##  loo                      2.0.0        2018-04-11 [1]
##  lubridate                1.7.4        2018-04-11 [1]
##  magrittr                 1.5          2014-11-22 [1]
##  MASS                     7.3-51.1     2018-11-01 [1]
##  matrixStats              0.54.0       2018-07-23 [1]
##  memoise                  1.1.0        2017-04-21 [1]
##  modelr                   0.1.2        2018-05-11 [1]
##  munsell                  0.5.0        2018-06-12 [1]
##  nlme                     3.1-137      2018-04-07 [1]
##  pander                 * 0.6.3        2018-11-06 [1]
##  patchwork              * 0.0.1        2019-01-24 [1]
##  pillar                   1.3.1        2018-12-15 [1]
##  pkgbuild                 1.0.2        2018-10-16 [1]
##  pkgconfig                2.0.2        2018-08-16 [1]
##  pkgload                  1.0.2        2018-10-29 [1]
##  plyr                     1.8.4        2016-06-08 [1]
##  prettyunits              1.0.2        2015-07-13 [1]
##  processx                 3.2.1.9000   2019-03-07 [1]
##  ps                       1.3.0        2018-12-21 [1]
##  purrr                  * 0.3.1        2019-03-03 [1]
##  R6                       2.4.0        2019-02-14 [1]
##  Rcpp                   * 1.0.0        2018-11-07 [1]
##  readr                  * 1.3.1        2018-12-21 [1]
##  readxl                   1.2.0        2018-12-19 [1]
##  remotes                  2.0.2        2018-10-30 [1]
##  rlang                    0.3.1        2019-01-08 [1]
##  rmarkdown                1.11         2018-12-08 [1]
##  rprojroot                1.3-2        2018-01-03 [1]
##  rstan                  * 2.18.2       2018-11-07 [1]
##  rstantools               1.5.1        2018-08-22 [1]
##  rstudioapi               0.9.0        2019-01-09 [1]
##  rvest                    0.3.2        2016-06-17 [1]
##  scales                 * 1.0.0        2018-08-09 [1]
##  sessioninfo              1.1.1        2018-11-05 [1]
##  StanHeaders            * 2.18.1       2019-01-28 [1]
##  stringi                  1.3.1        2019-02-13 [1]
##  stringr                * 1.4.0        2019-02-10 [1]
##  svUnit                   0.7-12       2014-03-02 [1]
##  testthat                 2.0.1        2018-10-13 [1]
##  tibble                 * 2.0.1        2019-01-12 [1]
##  tidybayes              * 1.0.3        2018-10-22 [1]
##  tidygraph                1.1.1        2018-11-20 [1]
##  tidyr                  * 0.8.2        2018-10-28 [1]
##  tidyselect               0.2.5        2018-10-11 [1]
##  tidyverse              * 1.2.1        2017-11-14 [1]
##  tweenr                   1.0.1        2018-12-14 [1]
##  units                    0.6-2        2018-12-05 [1]
##  usethis                  1.4.0        2018-08-14 [1]
##  V8                       2.0          2019-02-07 [1]
##  viridis                  0.5.1        2018-03-29 [1]
##  viridisLite              0.3.0        2018-02-01 [1]
##  withr                    2.1.2        2018-03-15 [1]
##  xfun                     0.5          2019-02-20 [1]
##  xml2                     1.2.0        2018-01-24 [1]
##  yaml                     2.2.0        2018-07-25 [1]
##  source                              
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.2)                      
##  local                               
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  Github (tidyverse/glue@8188cea)     
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  Github (thomasp85/patchwork@fd7958b)
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  Github (r-pkgs/processx@823819d)    
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.2)                      
##  CRAN (R 3.5.0)                      
##  CRAN (R 3.5.0)                      
## 
## [1] /Library/Frameworks/R.framework/Versions/3.5/Resources/library
LS0tCnRpdGxlOiAiUmVzdWx0cyIKYXV0aG9yOiAiQW5kcmV3IEhlaXNzIGFuZCBTdXBhcm5hIENoYXVkaHJ5IgpkYXRlOiAiTGFzdCBydW46IGByIGZvcm1hdChTeXMudGltZSgpLCAnJUYnKWAiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgcGFuZG9jX2FyZ3M6CiAgICAgIC0gIi0tZGVmYXVsdC1pbWFnZS1leHRlbnNpb249cG5nIgplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBsb2FkLWxpYnJhcmllcy1kYXRhLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShjcmFja2Rvd25zcGhpbGFudGhyb3B5KQpsaWJyYXJ5KHJzdGFuKQpsaWJyYXJ5KHRpZHliYXllcykKbGlicmFyeShicm9vbSkKbGlicmFyeShnZ3N0YW5jZSkKbGlicmFyeShnZ2RhZykKbGlicmFyeShnZ3JhcGgpCmxpYnJhcnkocGF0Y2h3b3JrKQpsaWJyYXJ5KHBhbmRlcikKbGlicmFyeShzY2FsZXMpCmxpYnJhcnkoamFuaXRvcikKbGlicmFyeShoZXJlKQoKc291cmNlKGhlcmUoImFuYWx5c2lzIiwgIm9wdGlvbnMuUiIpKQoKIyBMb2FkIGRhdGEKcmVzdWx0cyA8LSByZWFkUkRTKGhlcmUoImRhdGEiLCAiZGVyaXZlZF9kYXRhIiwgInJlc3VsdHNfY2xlYW4ucmRzIikpCiMgcXdyYXBzMjo6bGF6eWxvYWRfY2FjaGVfZGlyKCIwMl9hbmFseXNpc19jYWNoZS9odG1sIikKYGBgCgoKIyBDYXVzYWwgcGF0aHdheQoKT3VyIHRoZW9yeSBhbmQgaHlwb3RoZXNlcyBhcmUgbGFpZCBvdXQgaW4gdGhlIGNhdXNhbCBwYXRod2F5IGJlbG93LiBPdXIgb3V0Y29tZXMgKFk6ICUgbGlrZWx5IHRvIGRvbmF0ZSBhbmQgYW1vdW50IGRvbmF0ZWQpICJsaXN0ZW4gdG8iIG9yIHJlc3BvbmQgdG8gQyAoY3JhY2tkb3duKSwgd2hpY2ggaXMgb3VyIG1haW4gdHJlYXRtZW50IG9yIGV4cG9zdXJlLiBGdW5kaW5nIChGKSBhbmQgaXNzdWUgKEkpIHNlcnZlIGFzIGhldXJpc3RpY3MgZm9yIGRvbmF0aW9uIGFuZCBpbmZsdWVuY2UgYSBnb3Zlcm5tZW50J3MgZGVjaXNpb24gdG8gY3JhY2sgZG93biBvbiBOR09zLCBoZW5jZSB0aGUgZHVhbCBhcnJvd3MgdG8gQyBhbmQgWS4gCgpgYGB7ciBjYXVzYWwtZGFnLCBmaWcud2lkdGg9MTAvMywgZmlnLmhlaWdodD0yfQp0aGVvcnlfZGFnIDwtIGRhZ2lmeShZIH4gSSArIEMgKyBGLAogICAgICAgICAgICAgICAgICAgICBDIH4gSSArIEYsCiAgICAgICAgICAgICAgICAgICAgIG91dGNvbWUgPSAiWSIsCiAgICAgICAgICAgICAgICAgICAgIGV4cG9zdXJlID0gIkMiKSAlPiUgCiAgdGlkeV9kYWdpdHR5KGxheW91dCA9ICJzdWdpeWFtYSIpCgpwbG90X2RhZyA8LSBnZ3Bsb3QodGhlb3J5X2RhZywgYWVzKHggPSB4LCB5ID0geSwgeGVuZCA9IHhlbmQsIHllbmQgPSB5ZW5kKSkgKwogIGdlb21fZGFnX3BvaW50KHNpemUgPSA2KSArCiAgZ2VvbV9kYWdfZWRnZXMoc3RhcnRfY2FwID0gY2lyY2xlKDQsICJtbSIpLAogICAgICAgICAgICAgICAgIGVuZF9jYXAgPSBjaXJjbGUoNCwgIm1tIikpICsKICBnZW9tX2RhZ190ZXh0KHNpemUgPSBwdHMoNiksIGZhbWlseSA9ICJSb2JvdG8gQ29uZGVuc2VkIiwgZm9udGZhY2UgPSAiYm9sZCIpICsKICBzY2FsZV9kYWcoKSArCiAgdGhlbWVfbmdvcygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF9kYWcgJVQ+JSAKICBwcmludCgpICVUPiUKICBnZ3NhdmUoLiwgZmlsZW5hbWUgPSBoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAiZmlndXJlcyIsICJjYXVzYWwtcGF0aC5wZGYiKSwKICAgICAgICAgd2lkdGggPSAxMC8zLCBoZWlnaHQgPSAyLCB1bml0cyA9ICJpbiIsIGRldmljZSA9IGNhaXJvX3BkZikgJT4lIAogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgImNhdXNhbC1wYXRoLnBuZyIpLAogICAgICAgICB3aWR0aCA9IDEwLzMsIGhlaWdodCA9IDIsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgoKIyBPdmVydmlldyBvZiBkYXRhCgojIyBCYWxhbmNlIG9mIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zCgpgYGB7ciBjaGVjay1jb25kaXRpb25zLCByZXN1bHRzPSJhc2lzIn0KcmVzdWx0cyAlPiUgY291bnQoY3JhY2tkb3duLCBpc3N1ZSwgZnVuZGluZykgJT4lIAogIHJlbmFtZShDcmFja2Rvd24gPSBjcmFja2Rvd24sIElzc3VlID0gaXNzdWUsIEZ1bmRpbmcgPSBmdW5kaW5nKSAlPiUgCiAgamFuaXRvcjo6YWRvcm5fdG90YWxzKC4sIHdoZXJlID0gInJvdyIpICVUPiUgCiAgcGFuZG9jLnRhYmxlKCkgJT4lIAogIHBhbmRvYy50YWJsZS5yZXR1cm4oY2FwdGlvbiA9ICJCYWxhbmNlIG9mIGV4cGVyaW1lbnRhbCBjb25kaXRpb25zIHsjdGJsOmV4cGVyaW1lbnRhbC1jb25kaXRpb25zfSIpICU+JSAKICBjYXQoZmlsZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJ0YWJsZXMiLCAidGJsLWV4cGVyaW1lbnRhbC1jb25kaXRpb25zLm1kIikpCmBgYAoKIyMgRGVzY3JpcHRpdmUgc3RhdGlzdGljcyB0YWJsZQoKYGBge3IgdGJsLWRlc2NyaXB0aXZlLXN0YXRpc3RpY3MsIHJlc3VsdHM9ImFzaXMiLCB3YXJuaW5nPUZBTFNFfQp2YXJzX3RvX3N1bW1hcml6ZSA8LSB0cmliYmxlKAogIH52YXJpYWJsZSwgfmNsZWFuX25hbWUsCiAgImRvbmF0ZV9saWtlbHkiLCAiTGlrZWxpaG9vZCBvZiBkb25hdGlvbiIsCiAgImRvbmF0ZV9saWtlbHlfYmluIiwgIkxpa2VsaWhvb2Qgb2YgZG9uYXRpb24gKGJpbmFyeSkiLAogICJhbW91bnRfZG9uYXRlIiwgIkFtb3VudCBoeXBvdGhldGljYWxseSBkb25hdGVkICgkKSIsCiAgImdlbmRlciIsICJHZW5kZXIiLAogICJhZ2UiLCAiQWdlIiwKICAiaW5jb21lIiwgIkluY29tZSIsCiAgImVkdWNhdGlvbiIsICJFZHVjYXRpb24iLAogICJyZWxpZ2lvc2l0eSIsICJGcmVxdWVuY3kgb2YgYXR0ZW5kaW5nIHJlbGlnaW91cyBzZXJ2aWNlcyIsCiAgImlkZW9sb2d5IiwgIlBvbGl0aWNhbCB2aWV3cyIsCiAgInBvbGl0aWNhbF9rbm93bGVkZ2UiLCAiRnJlcXVlbmN5IG9mIGZvbGxvd2luZyBwdWJsaWMgYWZmYWlycyIsCiAgImdpdmVfY2hhcml0eSIsICJGcmVxdWVuY3kgb2YgY2hhcml0YWJsZSBkb25hdGlvbnMiLAogICJ2b2x1bnRlZXIiLCAiVm9sdW50ZWVyZWQgaW4gcGFzdCAxMiBtb250aHMiLAogICJmYXZvcl9odW1hbml0YXJpYW4iLCAiUHJpb3IgZmF2b3JhYmlsaXR5IHRvd2FyZHMgaHVtYW5pdGFyaWFuIE5HT3MiLAogICJmYXZvcl9odW1hbml0YXJpYW5fYmluIiwgIlByaW9yIGZhdm9yYWJpbGl0eSB0b3dhcmRzIGh1bWFuaXRhcmlhbiBOR09zIChiaW5hcnkpIiwKICAiZmF2b3JfaHVtYW5fcmlnaHRzIiwgIlByaW9yIGZhdm9yYWJpbGl0eSB0b3dhcmRzIGh1bWFuIHJpZ2h0cyBOR09zIiwKICAiZmF2b3JfaHVtYW5fcmlnaHRzX2JpbiIsICJQcmlvciBmYXZvcmFiaWxpdHkgdG93YXJkcyBodW1hbiByaWdodHMgTkdPcyAoYmluYXJ5KSIsCiAgImZhdm9yX2RldmVsb3BtZW50IiwgIlByaW9yIGZhdm9yYWJpbGl0eSB0b3dhcmRzIGRldmVsb3BtZW50IE5HT3MiLAogICJmYXZvcl9kZXZlbG9wbWVudF9iaW4iLCAiUHJpb3IgZmF2b3JhYmlsaXR5IHRvd2FyZHMgZGV2ZWxvcG1lbnQgTkdPcyAoYmluYXJ5KSIsCiAgImNoZWNrMiIsICJBdHRlbnRpb24gY2hlY2sgMiIKKQoKcmVzdWx0c19zdW1tYXJ5X3N0YXRzIDwtIHJlc3VsdHMgJT4lIAogIHNlbGVjdChvbmVfb2YodmFyc190b19zdW1tYXJpemUkdmFyaWFibGUpKSAlPiUgCiAgZ2F0aGVyKHZhcmlhYmxlLCB2YWx1ZSkgJT4lIAogIGdyb3VwX2J5KHZhcmlhYmxlKSAlPiUgCiAgbmVzdCgpICU+JSAKICBtdXRhdGUoTiA9IGRhdGEgJT4lIG1hcF9pbnQofiBucm93KC4pKSwKICAgICAgICAgc3VtbWFyeSA9IG1hcDIoLnggPSBkYXRhLCAueSA9IHZhcmlhYmxlLCB+IG1kX3N1bW1hcnlfcm93KC54JHZhbHVlLCAueSwgcmVzdWx0cykpKSAlPiUgCiAgbGVmdF9qb2luKHZhcnNfdG9fc3VtbWFyaXplLCBieSA9ICJ2YXJpYWJsZSIpICU+JSAKICBtdXRhdGUodmFyaWFibGUgPSBmYWN0b3IodmFyaWFibGUsIGxldmVscyA9IHZhcnNfdG9fc3VtbWFyaXplJHZhcmlhYmxlLCBvcmRlcmVkID0gVFJVRSkpICU+JSAKICBhcnJhbmdlKHZhcmlhYmxlKSAlPiUgCiAgc2VsZWN0KC1kYXRhLCAtdmFyaWFibGUpICU+JSAKICB1bm5lc3Qoc3VtbWFyeSkgJT4lIAogIHNlbGVjdChWYXJpYWJsZSA9IGNsZWFuX25hbWUsIE4sIGAgYCA9IHNwYXJrLCBEZXRhaWxzID0gc3VtbWFyeSkKCnJlc3VsdHNfc3VtbWFyeV9zdGF0cyAlPiUgCiAgc2VsZWN0KC1OKSAlPiUgCiAgcGFuZG9jLnRhYmxlLnJldHVybihjYXB0aW9uID0gIkRlc2NyaXB0aXZlIHN0YXRpc3RpY3MgeyN0Ymw6ZGVzY3JpcHRpdmUtc3RhdHN9IiwKICAgICAgICAgICAgICAgICAgICAgIHNwbGl0LmNlbGwgPSA4MCwgc3BsaXQudGFibGUgPSBJbmYpICVUPiUgCiAgY2F0KGZpbGUgPSBoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAidGFibGVzIiwgInRibC1kZXNjcmlwdGl2ZS1zdGF0cy5tZCIpKSAlPiUKICBjYXQoKQpgYGAKCiMjIEF2ZXJhZ2UgbGlrZWxpaG9vZCBhbmQgYW1vdW50IGRvbmF0ZWQgYWNyb3NzIGNvbmRpdGlvbnMKCmBgYHtyIHRibC1yZXN1bHRzLWNvbmRpdGlvbnMsIHJlc3VsdHM9ImFzaXMifQpjb25kaXRpb25zX3N1bW1hcnkgPC0gYmluZF9yb3dzKGdyb3VwX2J5KHJlc3VsdHMsIGNyYWNrZG93biwgaXNzdWUsIGZ1bmRpbmcpICU+JSBuZXN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkocmVzdWx0cywgY3JhY2tkb3duLCBpc3N1ZSkgJT4lIG5lc3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cF9ieShyZXN1bHRzLCBjcmFja2Rvd24pICU+JSBuZXN0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyAlPiUgbmVzdCgpKSAlPiUgCiAgYXJyYW5nZShjcmFja2Rvd24sIGlzc3VlLCBmdW5kaW5nKSAlPiUgCiAgbXV0YXRlKHN1bW1hcnkgPSBkYXRhICU+JQogICAgICAgICAgIG1hcCh+IHN1bW1hcml6ZSguLCBwY3RfbGlrZWx5ID0gdGFibGUoZG9uYXRlX2xpa2VseV9iaW4pW1siTGlrZWx5Il1dIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgoZG9uYXRlX2xpa2VseV9iaW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuX2RvbmF0aW9uID0gbWVhbihhbW91bnRfZG9uYXRlLCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzZF9kb25hdGlvbiA9IHNkKGFtb3VudF9kb25hdGUsIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gPSBucm93KC4pKSkpICU+JSAKICB1bm5lc3Qoc3VtbWFyeSkgJT4lIHNlbGVjdCgtZGF0YSkKCmNvbmRpdGlvbnNfc3VtbWFyeV9jbGVhbiA8LSBjb25kaXRpb25zX3N1bW1hcnkgJT4lIAogIG11dGF0ZShmdW5kaW5nID0gaWZlbHNlKGlzLm5hKGZ1bmRpbmcpICYgIWlzLm5hKGlzc3VlKSAsICIqVG90YWwqIiwgYXMuY2hhcmFjdGVyKGZ1bmRpbmcpKSwKICAgICAgICAgaXNzdWUgPSBpZmVsc2UoaXMubmEoaXNzdWUpICYgIWlzLm5hKGNyYWNrZG93biksICIqVG90YWwqIiwgYXMuY2hhcmFjdGVyKGlzc3VlKSksCiAgICAgICAgIGNyYWNrZG93biA9IGlmZWxzZShpcy5uYShjcmFja2Rvd24pLCAiKlRvdGFsKiIsIGFzLmNoYXJhY3RlcihjcmFja2Rvd24pKSkgJT4lIAogIGdyb3VwX2J5KGNyYWNrZG93bikgJT4lIAogIG11dGF0ZShpc3N1ZSA9IHJlcGxhY2UoaXNzdWUsIGR1cGxpY2F0ZWQoaXNzdWUpLCBOQSkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShjcmFja2Rvd24gPSByZXBsYWNlKGNyYWNrZG93biwgZHVwbGljYXRlZChjcmFja2Rvd24pLCBOQSkpICU+JSAKICBtdXRhdGUocGN0X2xpa2VseSA9IHBlcmNlbnQocGN0X2xpa2VseSkpICU+JSAKICByZW5hbWUoYENyYWNrZG93biBjb25kaXRpb25gID0gY3JhY2tkb3duLCBgSXNzdWUgY29uZGl0aW9uYCA9IGlzc3VlLAogICAgICAgICBgRnVuZGluZyBjb25kaXRpb25gID0gZnVuZGluZywgYCUgbGlrZWx5IHRvIGRvbmF0ZWAgPSBwY3RfbGlrZWx5LAogICAgICAgICBgQW1vdW50IGRvbmF0ZWQgKG1lYW4pYCA9IG1lYW5fZG9uYXRpb24sIGBBbW91bnQgZG9uYXRlZCAoc2QpYCA9IHNkX2RvbmF0aW9uKQoKY29uZGl0aW9uc19zdW1tYXJ5X2NsZWFuICVUPiUgCiAgcGFuZG9jLnRhYmxlKCkgJT4lIAogIHBhbmRvYy50YWJsZS5yZXR1cm4oY2FwdGlvbiA9ICJBdmVyYWdlIGxpa2VsaWhvb2QgYW5kIGFtb3VudCBkb25hdGVkIGFjcm9zcyBleHBlcmltZW50YWwgY29uZGl0aW9ucyB7I3RibDphdmctcmVzdWx0c30iKSAlPiUgCiAgY2F0KGZpbGUgPSBoZXJlKCJhbmFseXNpcyIsICJvdXRwdXQiLCAidGFibGVzIiwgInRibC1hdmctcmVzdWx0cy5tZCIpKQpgYGAKClwKCiMgVmlzdWFsaXplIGltcG9ydGFudCB2YXJpYWJsZXMKCiMjIExpa2VsaWhvb2Qgb2YgZG9uYXRpb24KCmBgYHtyIGZpZy1saWtlbGlob29kLWJhcnMsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTR9CmRvbmF0ZV9zdW1tYXJ5IDwtIHJlc3VsdHMgJT4lIAogIGNvdW50KGRvbmF0ZV9saWtlbHkpICU+JSAKICBtdXRhdGUocGVyYyA9IG4gLyBzdW0obikpICU+JSAKICBtdXRhdGUoaGlnaGxpZ2h0ID0gaWZlbHNlKGRvbmF0ZV9saWtlbHkgJWluJSBjKCJFeHRyZW1lbHkgbGlrZWx5IiwgIlNvbWV3aGF0IGxpa2VseSIpLCBUUlVFLCBGQUxTRSkpCgpwbG90X2RvbmF0ZV9zdW1tYXJ5IDwtIGdncGxvdChkb25hdGVfc3VtbWFyeSwgYWVzKHggPSBuLCB5ID0gZG9uYXRlX2xpa2VseSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGhpZ2hsaWdodCkpICsKICBnZW9tX2Jhcmgoc3RhdCA9ICJpZGVudGl0eSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gLyBzdW0oZG9uYXRlX3N1bW1hcnkkbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBuZ29fY29scygiZ3JlZW4iLCAiYmx1ZSIsIG5hbWUgPSBGQUxTRSksIGd1aWRlID0gRkFMU0UpICsKICBsYWJzKHggPSBOVUxMLCB5ID0gTlVMTCkgKwogIHRoZW1lX25nb3MoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF9kb25hdGVfc3VtbWFyeSAlVD4lIAogIHByaW50KCkgJVQ+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgImRvbmF0ZV9zdW1tYXJ5LnBkZiIpLAogICAgICAgICB3aWR0aCA9IDksIGhlaWdodCA9IDQsIHVuaXRzID0gImluIiwgZGV2aWNlID0gY2Fpcm9fcGRmKSAlPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAiZG9uYXRlX3N1bW1hcnkucG5nIiksCiAgICAgICAgIHdpZHRoID0gOSwgaGVpZ2h0ID0gNCwgdW5pdHMgPSAiaW4iLCB0eXBlID0gImNhaXJvIiwgZHBpID0gMzAwKQpgYGAKCiMjIEFtb3VudCBkb25hdGVkCgpgYGB7ciBmaWctYW1vdW50LWJhcnMsIGZpZy53aWR0aD05LCBmaWcuaGVpZ2h0PTIuNzV9CnBsb3RfYW1vdW50X3N1bW1hcnkgPC0gZ2dwbG90KHJlc3VsdHMsIGFlcyh4ID0gYW1vdW50X2RvbmF0ZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMjAsIGZpbGwgPSBuZ29fY29scygiYmx1ZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMKSArCiAgdGhlbWVfbmdvcygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF9hbW91bnRfc3VtbWFyeSAlVD4lIAogIHByaW50KCkgJVQ+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgImFtb3VudF9zdW1tYXJ5LnBkZiIpLAogICAgICAgICB3aWR0aCA9IDksIGhlaWdodCA9IDIuNzUsIHVuaXRzID0gImluIiwgZGV2aWNlID0gY2Fpcm9fcGRmKSAlPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAiYW1vdW50X3N1bW1hcnkucG5nIiksCiAgICAgICAgIHdpZHRoID0gOSwgaGVpZ2h0ID0gMi43NSwgdW5pdHMgPSAiaW4iLCB0eXBlID0gImNhaXJvIiwgZHBpID0gMzAwKQpgYGAKClwKCmBgYHtyIGFsbC1kYXRhc2V0cy1uZXN0ZWR9CmFsbF9tb2RlbHMgPC0gdHJpYmJsZSgKICB+dGl0bGUsIH5kZiwKICAiQ3JhY2tkb3duIiwgcmVzdWx0cywKICAjIEhhLCBjaGVhdCBoZXJlIGJ5IHJlbmFtaW5nIHRoZSBpc3N1ZSBhbmQgZnVuZGluZyBjb2x1bW5zIHRvIGNyYWNrZG93bi4gCiAgIyBBbGwgb3RoZXIgdGVzdHMgYXJlIGJhc2VkIG9uIHRoZSBjcmFja2Rvd24gY29sdW1uIGV4Y2VwdCB0aGVzZSB0d28sIHNvCiAgIyByYXRoZXIgdGhhbiBidWlsZCBhbGwgc29ydHMgb2YgY29udm9sdXRlZCBhcmd1bWVudHMgYW5kIGZ1bmN0aW9ucywgd2UganVzdAogICMgcmVuYW1lIHRoZXNlIGFzIGlzc3VlIGFuZCBmdW5kaW5nCiAgIklzc3VlIiwgbXV0YXRlKHJlc3VsdHMsIGNyYWNrZG93biA9IGlzc3VlKSwKICAiRnVuZGluZyIsIG11dGF0ZShyZXN1bHRzLCBjcmFja2Rvd24gPSBmdW5kaW5nKSwKICAjIENyZWF0ZSBhbGwgdGhlIG5lc3RlZCBjb25kaXRpb25zCiAgIkh1bWFuIHJpZ2h0cyB8IENyYWNrZG93biIsIGZpbHRlcihyZXN1bHRzLCBpc3N1ZSA9PSAiSHVtYW4gcmlnaHRzIiksCiAgIkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIHwgQ3JhY2tkb3duIiwgZmlsdGVyKHJlc3VsdHMsIGlzc3VlICE9ICJIdW1hbiByaWdodHMiKSwKICAiR292ZXJubWVudCB8IENyYWNrZG93biIsIGZpbHRlcihyZXN1bHRzLCBmdW5kaW5nID09ICJHb3Zlcm5tZW50IiksCiAgIlByaXZhdGUgfCBDcmFja2Rvd24iLCBmaWx0ZXIocmVzdWx0cywgZnVuZGluZyA9PSAiUHJpdmF0ZSIpLAogICJIdW1hbiByaWdodHMgfCBHb3Zlcm5tZW50IHwgQ3JhY2tkb3duIiwgZmlsdGVyKHJlc3VsdHMsIGlzc3VlID09ICJIdW1hbiByaWdodHMiLCBmdW5kaW5nID09ICJHb3Zlcm5tZW50IiksCiAgIkh1bWFuIHJpZ2h0cyB8IFByaXZhdGUgfCBDcmFja2Rvd24iLCBmaWx0ZXIocmVzdWx0cywgaXNzdWUgPT0gIkh1bWFuIHJpZ2h0cyIsIGZ1bmRpbmcgPT0gIlByaXZhdGUiKSwKICAiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UgfCBHb3Zlcm5tZW50IHwgQ3JhY2tkb3duIiwgZmlsdGVyKHJlc3VsdHMsIGlzc3VlICE9ICJIdW1hbiByaWdodHMiLCBmdW5kaW5nID09ICJHb3Zlcm5tZW50IiksCiAgIkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIHwgUHJpdmF0ZSB8IENyYWNrZG93biIsIGZpbHRlcihyZXN1bHRzLCBpc3N1ZSAhPSAiSHVtYW4gcmlnaHRzIiwgZnVuZGluZyA9PSAiUHJpdmF0ZSIpCikgCmBgYAoKIyBUcmVhdG1lbnQgZWZmZWN0czogTGlrZWxpaG9vZCBvZiBkb25hdGlvbgoKVGhpcyB0aW1lIGFyb3VuZCwgd2UncmUgbm90IHVzaW5nIGludGVyYWN0aW9uZnVsIHJlZ3Jlc3Npb24gbW9kZWxzIHRvIGNhbGN1bGF0ZSBhbGwgdGhlc2UgZGlmZmVyZW5jZXMgaW4gZ3JvdXBzLiBJbnN0ZWFkIHdlIHVzZSByZWFsIGxpdmUgU3RhbiBjb2RlIHRvIGVzdGltYXRlIHRoZSBkaWZmZXJlbmNlcyBpbiBncm91cCBtZWFucyBhbmQgcHJvcG9ydGlvbnMhIAoKIyMgUHJpb3JzIGFuZCBtb2RlbHMKCldlIGVzdGltYXRlIHRoZSBwcm9wb3J0aW9uIG9mIHBlb3BsZSByZXNwb25kaW5nIHRoYXQgdGhleSdkIGJlIGxpa2VseSB0byBkb25hdGUgdG8gdGhlIG9yZ2FuaXphdGlvbiB3aXRoIGEgYmlub21pYWwgZGlzdHJpYnV0aW9uLCB3aXRoIGEgcHJpb3IgJFx0aGV0YSQgZGlzdHJpYnV0aW9uIG9mICRcdGV4dHtCZXRhfSg1LCA1KSQuIFdlIGJ1aWxkIHRoZSBmb2xsb3dpbmcgbW9kZWwgaW4gU3RhbjoKCiQkClxiZWdpbnthbGlnbmVkfQpuX3tcdGV4dHtncm91cCAxLCBncm91cCAyfX0gJlxzaW0gXHRleHR7Qmlub21pYWx9KG5fe1x0ZXh0e3RvdGFsIGluIGdyb3VwfX0sIFx0aGV0YV97XHRleHR7Z3JvdXB9fSkgJlx0ZXh0e1tsaWtlbGlob29kXX1cXApcdGV4dHtEaWZmZXJlbmNlfSAmPSBuX3tcdGV4dHtncm91cCAyfX0gLSBuX3tcdGV4dHtncm91cCAxfX0gJlx0ZXh0e1tkaWZmZXJlbmNlIGluIHByb3BvcnRpb25zXX0gXFwKbiAmOiBcdGV4dHtOdW1iZXIgbGlrZWx5IHRvIGRvbmF0ZX0gXFwKXFwKXHRoZXRhX3tcdGV4dHtncm91cCAxLCBncm91cCAyfX0gJlxzaW0gXHRleHR7QmV0YX0oNSwgNSkgJlx0ZXh0e1twcmlvciBwcm9iLiBvZiBiZWluZyBsaWtlbHkgdG8gZG9uYXRlXX0KXGVuZHthbGlnbmVkfQokJAoKYGBge3IgcHJpb3JzLWxpa2VseSwgZmlnLndpZHRoPTIuNzUsIGZpZy5oZWlnaHQ9MS41LCBmaWcuYWxpZ249ImNlbnRlciJ9Cmxpa2VseV90aGV0YSA8LSBnZ3Bsb3QoZGF0YSA9IHRpYmJsZSh4ID0gYygwLCAxKSksIGFlcyh4ID0geCkpICsKICBnZW9tX2FyZWEoc3RhdCA9ICJmdW5jdGlvbiIsIGZ1biA9IGRiZXRhLCBhcmdzID0gbGlzdChzaGFwZTEgPSA1LCBzaGFwZTIgPSA1KSwgCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTgwIiwgY29sb3IgPSAiYmxhY2siKSArCiAgbGFicyh4ID0gZXhwcmVzc2lvbihQcm9iYWJpbGl0eSB+IG9mIH4gYmVpbmcgfiBsaWtlbHkgfiB0byB+IGRvbmF0ZSB+ICh0aGV0YSkpLCB5ID0gIkRlbnNpdHkiKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJsYWJlbCIsIHggPSAwLjUsIHkgPSAxLCBsYWJlbCA9ICJCZXRhKDUsIDUpIiwgc2l6ZSA9IHB0cyg5KSkgKwogIHRoZW1lX25nb3MoYmFzZV9zaXplID0gOSwgZGVuc2l0eSA9IFRSVUUpCmxpa2VseV90aGV0YQoKbGlrZWx5X3RoZXRhICVUPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAicHJpb3ItbGlrZWx5LnBkZiIpLAogICAgICAgICB3aWR0aCA9IDIuNzUsIGhlaWdodCA9IDEuNSwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSBjYWlyb19wZGYpICU+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgInByaW9yLWxpa2VseS5wbmciKSwKICAgICAgICAgd2lkdGggPSAyLjc1LCBoZWlnaHQgPSAxLjUsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgojIyBEaWZmZXJlbmNlcwoKYGBge3IgcnVuLWxpa2VseS1tb2RlbHMsIHJlc3VsdHM9ImhpZGUiLCBjYWNoZT1UUlVFfQojIFRoaXMgdGFrZXMgZm9yZXZlciBiZWNhdXNlIG9mIE1DTUMgc2FtcGxpbmcsIHNvIHRoaXMgY2h1bmsgaXMgY2FjaGVkCgojIFNhbXBsZSBmcm9tIHRoZSBjb21waWxlZCBtb2RlbAphbGxfbW9kZWxzX2xpa2VseV9ydW4gPC0gYWxsX21vZGVscyAlPiUgCiAgIyBTaW1wbGlmeSBkYXRhIGZvciBzZW5kaW5nIHRvIFN0YW4KICBtdXRhdGUoc3Rhbl9kYXRhX2NvdW50cyA9IGRmICU+JSBtYXAofiB7CiAgICBkZl9jb3VudHMgPC0gLnggJT4lIAogICAgICBjb3VudChjcmFja2Rvd24sIGRvbmF0ZV9saWtlbHlfYmluKSAlPiUgCiAgICAgIGdyb3VwX2J5KGNyYWNrZG93bikgJT4lIAogICAgICBtdXRhdGUodG90YWwgPSBzdW0obikpICU+JSAKICAgICAgZmlsdGVyKGRvbmF0ZV9saWtlbHlfYmluID09ICJMaWtlbHkiKQogICAgCiAgICByZXR1cm4obGlzdCgKICAgICAgbl90b3RhbF8xID0gZGZfY291bnRzJHRvdGFsWzFdLAogICAgICBuX3RvdGFsXzIgPSBkZl9jb3VudHMkdG90YWxbMl0sCiAgICAgIG5fbGlrZWx5XzEgPSBkZl9jb3VudHMkblsxXSwKICAgICAgbl9saWtlbHlfMiA9IGRmX2NvdW50cyRuWzJdCiAgICApKQogIH0pKSAlPiUgCiAgIyBSdW4gdGhlIGFjdHVhbCBtb2RlbCBvbiB0aGUgc2ltcGxpZmllZCBkYXRhCiAgbXV0YXRlKG1vZGVsID0gc3Rhbl9kYXRhX2NvdW50cyAlPiUgbWFwKH4gewogICAgc2FtcGxpbmcoZG9uYXRlX2xpa2VseSgpLCBkYXRhID0gLngsIGNvbnRyb2wgPSBsaXN0KG1heF90cmVlZGVwdGggPSAxNSksCiAgICAgICAgICAgICBjaGFpbnMgPSBDSEFJTlMsIGl0ZXIgPSBJVEVSLCB3YXJtdXAgPSBXQVJNVVAsIHNlZWQgPSBCQVlFU19TRUVEKQogIH0pKSAKCiMgRXh0cmFjdCBzdHVmZgphbGxfbW9kZWxzX2xpa2VseSA8LSBhbGxfbW9kZWxzX2xpa2VseV9ydW4gJT4lIAogICMgRXh0cmFjdCBwb3N0ZXJpb3IgY2hhaW5zCiAgbXV0YXRlKHBvc3Rlcmlvcl9jaGFpbnNfbG9uZyA9IG1hcChtb2RlbCwgfiB7CiAgICAgIC54ICU+JSBnYXRoZXJfZHJhd3ModGhldGFfMSwgdGhldGFfMiwgdGhldGFfZGlmZiwgcGN0X2NoYW5nZSkKICB9KSkgJT4lIAogIG11dGF0ZShwb3N0ZXJpb3JfY2hhaW5zX3dpZGUgPSBtYXAobW9kZWwsIH4gewogICAgICAueCAlPiUgc3ByZWFkX2RyYXdzKHRoZXRhXzEsIHRoZXRhXzIsIHRoZXRhX2RpZmYsIHBjdF9jaGFuZ2UpCiAgfSkpICU+JSAKICAjIEdldCBIREkgbWVkaWFucyBpbiB0aWR5IGZvcm0KICBtdXRhdGUodGlkeSA9IHBvc3Rlcmlvcl9jaGFpbnNfbG9uZyAlPiUgbWFwKH4gewogICAgLnggJT4lIG1lZGlhbl9oZGNpKCkgJT4lIHRvX2Jyb29tX25hbWVzKCkKICB9KSkKYGBgCgpgYGB7ciBwbG90LWxpa2VseS1kaWZmcywgd2FybmluZz1GQUxTRSwgZmlnLndpZHRoPTEwLzMsIGZpZy5oZWlnaHQ9NS41fQp0aWRpZWRfZGlmZnNfbGlrZWx5IDwtIGFsbF9tb2RlbHNfbGlrZWx5ICU+JSAKICB1bm5lc3QocG9zdGVyaW9yX2NoYWluc19sb25nKSAlPiUgCiAgZmlsdGVyKC52YXJpYWJsZSA9PSAidGhldGFfZGlmZiIpICU+JSAKICBtdXRhdGUoY2F0ZWdvcnkgPSBjYXNlX3doZW4oCiAgICBzdHJfY291bnQodGl0bGUsICJcXHwiKSA9PSAwIH4gIkxldmVsIDEiLAogICAgc3RyX2NvdW50KHRpdGxlLCAiXFx8IikgPT0gMSB+ICJMZXZlbCAyIiwKICAgIHN0cl9jb3VudCh0aXRsZSwgIlxcfCIpID09IDIgfiAiTGV2ZWwgMyIKICApKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gc3RyX3JlbW92ZSh0aXRsZSwgIiBcXHwgQ3JhY2tkb3duIikpCgpsZXZlbDFfbGlrZWx5IDwtIHRpZGllZF9kaWZmc19saWtlbHkgJT4lIAogIGZpbHRlcihjYXRlZ29yeSA9PSAiTGV2ZWwgMSIpICU+JQogIG11dGF0ZSh0aXRsZSA9IHJlY29kZSh0aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgIENyYWNrZG93biA9ICJDcmFja2Rvd24g4oiSXG5ObyBjcmFja2Rvd24iLAogICAgICAgICAgICAgICAgICAgICAgICBJc3N1ZSA9ICJIdW1hbml0YXJpYW5cbmFzc2lzdGFuY2Ug4oiSXG5IdW1hbiByaWdodHMiLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5kaW5nID0gIlByaXZhdGUg4oiSXG5Hb3Zlcm5tZW50XG5mdW5kaW5nIikpICU+JSAKICBtdXRhdGUodGl0bGUgPSBmY3RfaW5vcmRlcih0aXRsZSkpCgpwbG90X2RpZmZfbGlrZWx5X2EgPC0gZ2dwbG90KGxldmVsMV9saWtlbHksIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmN0X3Jldih0aXRsZSksIGZpbGwgPSB0aXRsZSkpICsKICBnZW9tX2hhbGZleWVoKC53aWR0aCA9IGMoMC44LCAwLjk1KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG5nb19jb2xzKGMoImJsdWUiLCAicmVkIiwgIm9yYW5nZSIpLCBuYW1lID0gRkFMU0UpLCBndWlkZSA9IEZBTFNFKSArCiAgbGFicyh4ID0gIkRpZmZlcmVuY2UgaW4gZG9uYXRpb24gbGlrZWxpaG9vZCIsIHkgPSBOVUxMLCB0YWcgPSAiQSIpICsKICB0aGVtZV9uZ29zKGJhc2Vfc2l6ZSA9IDgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCgpsZXZlbDJfbGlrZWx5IDwtIHRpZGllZF9kaWZmc19saWtlbHkgJT4lIAogIGZpbHRlcihjYXRlZ29yeSA9PSAiTGV2ZWwgMiIpICU+JQogIG11dGF0ZShjb25kaXRpb24gPSBjYXNlX3doZW4oCiAgICB0aXRsZSAlaW4lIGMoIkh1bWFuIHJpZ2h0cyIsICJIdW1hbml0YXJpYW4gYXNzaXN0YW5jZSIpIH4gIklzc3VlIiwKICAgIHRpdGxlICVpbiUgYygiR292ZXJubWVudCIsICJQcml2YXRlIikgfiAiRnVuZGluZyIKICApKSAlPiUgCiAgbXV0YXRlKGZhY2V0X3RpdGxlID0gY2FzZV93aGVuKAogICAgdGl0bGUgJWluJSBjKCJIdW1hbiByaWdodHMiLCAiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UiKSB+IHBhc3RlKHRpdGxlLCAiaXNzdWVzIiksCiAgICB0aXRsZSAlaW4lIGMoIkdvdmVybm1lbnQiLCAiUHJpdmF0ZSIpIH4gcGFzdGUodGl0bGUsICJmdW5kaW5nIikKICApKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gY2FzZV93aGVuKAogICAgdGl0bGUgJWluJSBjKCJIdW1hbml0YXJpYW4gYXNzaXN0YW5jZSIsICJQcml2YXRlIikgfiAiIiwKICAgIFRSVUUgfiAiQ3JhY2tkb3duIOKIklxuTm8gY3JhY2tkb3duIikKICApCgpwbG90X2RpZmZfbGlrZWx5X2IgPC0gZ2dwbG90KGZpbHRlcihsZXZlbDJfbGlrZWx5LCBjb25kaXRpb24gPT0gIklzc3VlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmN0X3Jldih0aXRsZSkpKSArCiAgZ2VvbV9oYWxmZXllaCgud2lkdGggPSBjKDAuOCwgMC45NSksIGZpbGwgPSBuZ29fY29scygicmVkIiwgbmFtZSA9IEZBTFNFKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCB0YWcgPSAiQiIpICsKICBmYWNldF93cmFwKH4gZmFjZXRfdGl0bGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfbmdvcyhiYXNlX3NpemUgPSA4KSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF9kaWZmX2xpa2VseV9jIDwtIGdncGxvdChmaWx0ZXIobGV2ZWwyX2xpa2VseSwgY29uZGl0aW9uID09ICJGdW5kaW5nIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmN0X3Jldih0aXRsZSkpKSArCiAgZ2VvbV9oYWxmZXllaCgud2lkdGggPSBjKDAuOCwgMC45NSksIGZpbGwgPSBuZ29fY29scygib3JhbmdlIiwgbmFtZSA9IEZBTFNFKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwogIGxhYnMoeCA9ICJEaWZmZXJlbmNlIGluIGRvbmF0aW9uIGxpa2VsaWhvb2QiLCB5ID0gTlVMTCwgdGFnID0gIkMiKSArCiAgZmFjZXRfd3JhcCh+IGZhY2V0X3RpdGxlLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX25nb3MoYmFzZV9zaXplID0gOCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKCmxldmVsM19saWtlbHkgPC0gdGlkaWVkX2RpZmZzX2xpa2VseSAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJMZXZlbCAzIikgJT4lCiAgc2VwYXJhdGUodGl0bGUsIGMoImlzc3VlIiwgImZ1bmRpbmciKSwgc2VwID0gIiBcXHwgIikgJT4lCiAgbXV0YXRlKGlzc3VlID0gcGFzdGUoaXNzdWUsICJpc3N1ZXMiKSwKICAgICAgICAgZnVuZGluZyA9IHBhc3RlKGZ1bmRpbmcsICJmdW5kaW5nIikpICU+JSAKICBtdXRhdGUoZmFjZXRfdGl0bGUgPSBwYXN0ZTAoaXNzdWUsICJcbiIsIGZ1bmRpbmcpKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gY2FzZV93aGVuKAogICAgZnVuZGluZyA9PSAiUHJpdmF0ZSBmdW5kaW5nIiB+ICIiLAogICAgVFJVRSB+ICJDcmFja2Rvd24g4oiSXG5ObyBjcmFja2Rvd24iKQogICkKCnBsb3RfZGlmZl9saWtlbHlfZCA8LSBnZ3Bsb3QobGV2ZWwzX2xpa2VseSwgYWVzKHggPSAudmFsdWUsIHkgPSBmY3RfcmV2KHRpdGxlKSkpICsKICBnZW9tX2hhbGZleWVoKC53aWR0aCA9IGMoMC44LCAwLjk1KSwgZmlsbCA9IG5nb19jb2xzKCJncmVlbiIsIG5hbWUgPSBGQUxTRSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsKICBsYWJzKHggPSAiRGlmZmVyZW5jZSBpbiBkb25hdGlvbiBsaWtlbGlob29kIiwgeSA9IE5VTEwsIHRhZyA9ICJEIiwKICAgICAgIGNhcHRpb24gPSAiUG9pbnQgc2hvd3MgcG9zdGVyaW9yIG1lZGlhbjsgdGhpY2sgYmxhY2sgbGluZXMgc2hvdyA4MCUgY3JlZGlibGUgaW50ZXJ2YWw7XG50aGluIGJsYWNrIGxpbmVzIHNob3cgOTUlIGNyZWRpYmxlIGludGVydmFsIikgKwogIGZhY2V0X3dyYXAofiBmYWNldF90aXRsZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9uZ29zKGJhc2Vfc2l6ZSA9IDgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCgpwbG90X2RpZmZzX2xpa2VseV9hbGwgPC0gcGxvdF9kaWZmX2xpa2VseV9hIC8gCiAgKHBsb3RfZGlmZl9saWtlbHlfYiAvIHBsb3RfZGlmZl9saWtlbHlfYykgLyAKICBwbG90X2RpZmZfbGlrZWx5X2QKCnBsb3RfZGlmZnNfbGlrZWx5X2FsbAoKcGxvdF9kaWZmc19saWtlbHlfYWxsICVUPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAibGlrZWx5LWRpZmZzLnBkZiIpLAogICAgICAgICB3aWR0aCA9IDEwLzMsIGhlaWdodCA9IDUuNSwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSBjYWlyb19wZGYpICU+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgImxpa2VseS1kaWZmcy5wbmciKSwKICAgICAgICAgd2lkdGggPSAxMC8zLCBoZWlnaHQgPSA1LjUsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgpgYGB7ciB0YmwtbGlrZWx5LWRpZmZzLWxldmVsMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2xpa2VseV90aWR5IDwtIGFsbF9tb2RlbHNfbGlrZWx5ICU+JSAKICB1bm5lc3QodGlkeSkgJT4lIAogIGZpbHRlcih0ZXJtICVpbiUgYygidGhldGFfMSIsICJ0aGV0YV8yIiwgInRoZXRhX2RpZmYiLCAicGN0X2NoYW5nZSIpKSAlPiUgCiAgc2VsZWN0KHRpdGxlLCB0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogIHNwcmVhZCh0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogIG11dGF0ZShjYXRlZ29yeSA9IGNhc2Vfd2hlbigKICAgIHN0cl9jb3VudCh0aXRsZSwgIlxcfCIpID09IDAgfiAiTGV2ZWwgMSIsCiAgICBzdHJfY291bnQodGl0bGUsICJcXHwiKSA9PSAxIH4gIkxldmVsIDIiLAogICAgc3RyX2NvdW50KHRpdGxlLCAiXFx8IikgPT0gMiB+ICJMZXZlbCAzIgogICkpIAoKdGJsX2xpa2VseV9wcm9icyA8LSBhbGxfbW9kZWxzX2xpa2VseSAlPiUgCiAgdW5uZXN0KHBvc3Rlcmlvcl9jaGFpbnNfbG9uZykgJT4lIAogIGZpbHRlcigudmFyaWFibGUgPT0gInRoZXRhX2RpZmYiKSAlPiUgCiAgZ3JvdXBfYnkodGl0bGUpICU+JSAKICBzdW1tYXJpemUocC5ncmVhdGVyMCA9IG1lYW4oLnZhbHVlID4gMCksCiAgICAgICAgICAgIHAubGVzczAgPSBtZWFuKC52YWx1ZSA8IDApLAogICAgICAgICAgICBwLmRpZmYubm90MCA9IGlmZWxzZShtZWRpYW4oLnZhbHVlKSA+IDAsIHAuZ3JlYXRlcjAsIHAubGVzczApKSAlPiUgCiAgdW5ncm91cCgpCgojIFNhdmUgY29tYmluZWQgdGFibGUgZm9yIGxhdGVyIHVzZSBpbiBtYW51c2NyaXB0CnRibF9saWtlbHlfdGlkeSAlPiUgCiAgbGVmdF9qb2luKHRibF9saWtlbHlfcHJvYnMsIGJ5ID0gInRpdGxlIikgJT4lIAogIHNhdmVSRFMoaGVyZSgiZGF0YSIsICJkZXJpdmVkX2RhdGEiLCAicmVzdWx0c19tb2RlbHNfbGlrZWx5LnJkcyIpKQogIAp0YmxfbGlrZWx5XzEgPC0gdGJsX2xpa2VseV90aWR5ICU+JSAKICBsZWZ0X2pvaW4odGJsX2xpa2VseV9wcm9icywgYnkgPSAidGl0bGUiKSAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJMZXZlbCAxIikgJT4lCiAgbXV0YXRlKHRpdGxlID0gcmVjb2RlKHRpdGxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgQ3JhY2tkb3duID0gIkNyYWNrZG93biDiiJIgTm8gY3JhY2tkb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgPSAiKkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIOKIkiBIdW1hbiByaWdodHMqIiwKICAgICAgICAgICAgICAgICAgICAgICAgRnVuZGluZyA9ICIqUHJpdmF0ZSDiiJIgR292ZXJubWVudCBmdW5kaW5nKiIpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnModGhldGFfMSwgdGhldGFfMiwgdGhldGFfZGlmZiwgcGN0X2NoYW5nZSksIAogICAgICAgICAgICBmdW5zKHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4xKSguKSkpICU+JSAKICBtdXRhdGUocC5kaWZmLm5vdDAgPSBhcy5jaGFyYWN0ZXIocm91bmQocC5kaWZmLm5vdDAsIDIpKSkgJT4lCiAgc2VsZWN0KEZyYW1lID0gdGl0bGUsIGAlIGxpa2VseX5UcmVhdG1lbnR+YCA9IHRoZXRhXzIsIGAlIGxpa2VseX5Db250cm9sfmAgPSB0aGV0YV8xLAogICAgICAgICBgJFxcRGVsdGEkYCA9IHRoZXRhX2RpZmYsIGAkXFwlXFxEZWx0YSRgID0gcGN0X2NoYW5nZSwgCiAgICAgICAgIGAkcChcXERlbHRhIFxcbmVxIDApJGAgPSBwLmRpZmYubm90MCkKYGBgCgpgYGB7ciB0YmwtbGlrZWx5LWRpZmZzLWxldmVsMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2xpa2VseV8yIDwtIHRibF9saWtlbHlfdGlkeSAlPiUgCiAgbGVmdF9qb2luKHRibF9saWtlbHlfcHJvYnMsIGJ5ID0gInRpdGxlIikgJT4lIAogIGZpbHRlcihjYXRlZ29yeSA9PSAiTGV2ZWwgMiIpICU+JQogIG11dGF0ZSh0aXRsZV9jbGVhbiA9IHN0cl9yZW1vdmUodGl0bGUsICIgXFx8IENyYWNrZG93biIpKSAlPiUgCiAgbXV0YXRlKHRpdGxlX2NsZWFuID0gY2FzZV93aGVuKAogICAgdGl0bGVfY2xlYW4gJWluJSBjKCJIdW1hbiByaWdodHMiLCAiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UiKSB+IHBhc3RlKHRpdGxlX2NsZWFuLCAiaXNzdWVzIiksCiAgICB0aXRsZV9jbGVhbiAlaW4lIGMoIkdvdmVybm1lbnQiLCAiUHJpdmF0ZSIpIH4gcGFzdGUodGl0bGVfY2xlYW4sICJmdW5kaW5nIikKICApKSAlPiUgCiAgbXV0YXRlKHRpdGxlX2NsZWFuID0gZmFjdG9yKHRpdGxlX2NsZWFuLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSHVtYW4gcmlnaHRzIGlzc3VlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIdW1hbml0YXJpYW4gYXNzaXN0YW5jZSBpc3N1ZXMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR292ZXJubWVudCBmdW5kaW5nIiwgIlByaXZhdGUgZnVuZGluZyIpKSkgJT4lIAogIGFycmFuZ2UodGl0bGVfY2xlYW4pICU+JSAKICBtdXRhdGVfYXQodmFycyh0aGV0YV8xLCB0aGV0YV8yLCB0aGV0YV9kaWZmLCBwY3RfY2hhbmdlKSwgCiAgICAgICAgICAgIGZ1bnMocGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKC4pKSkgJT4lIAogIG11dGF0ZShwLmRpZmYubm90MCA9IGFzLmNoYXJhY3Rlcihyb3VuZChwLmRpZmYubm90MCwgMikpKSAlPiUgCiAgbXV0YXRlKHRpdGxlX2NsZWFuID0gYXMuY2hhcmFjdGVyKHRpdGxlX2NsZWFuKSkgJT4lIAogIHNlbGVjdChgSH4yYX4gYW5kIEh+M2F+YCA9IHRpdGxlX2NsZWFuLCAKICAgICAgICAgYCUgbGlrZWx5fkNyYWNrZG93bn5gID0gdGhldGFfMiwgYCUgbGlrZWx5fk5vXFwgY3JhY2tkb3dufmAgPSB0aGV0YV8xLAogICAgICAgICBgJFxcRGVsdGEkYCA9IHRoZXRhX2RpZmYsIGAkXFwlXFxEZWx0YSRgID0gcGN0X2NoYW5nZSwgCiAgICAgICAgIGAkcChcXERlbHRhIFxcbmVxIDApJGAgPSBwLmRpZmYubm90MCkKYGBgCgpgYGB7ciB0YmwtbGlrZWx5LWRpZmZzLWxldmVsMywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2xpa2VseV8zIDwtIHRibF9saWtlbHlfdGlkeSAlPiUgCiAgbGVmdF9qb2luKHRibF9saWtlbHlfcHJvYnMsIGJ5ID0gInRpdGxlIikgJT4lIAogIGZpbHRlcihjYXRlZ29yeSA9PSAiTGV2ZWwgMyIpICU+JQogIG11dGF0ZSh0aXRsZV9jbGVhbiA9IHN0cl9yZW1vdmUodGl0bGUsICIgXFx8IENyYWNrZG93biIpKSAlPiUgCiAgc2VwYXJhdGUodGl0bGVfY2xlYW4sIGMoIklzc3VlIiwgIkZ1bmRpbmciKSwgc2VwID0gIiBcXHwgIikgJT4lIAogIG11dGF0ZShJc3N1ZSA9IGZhY3RvcihJc3N1ZSwgbGV2ZWxzID0gYygiSHVtYW4gcmlnaHRzIiwgIkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIikpLAogICAgICAgICBGdW5kaW5nID0gZmFjdG9yKEZ1bmRpbmcsIGxldmVscyA9IGMoIkdvdmVybm1lbnQiLCAiUHJpdmF0ZSIpKSkgJT4lIAogIGFycmFuZ2UoSXNzdWUsIEZ1bmRpbmcpICU+JSAKICBtdXRhdGVfYXQodmFycyh0aGV0YV8xLCB0aGV0YV8yLCB0aGV0YV9kaWZmLCBwY3RfY2hhbmdlKSwgCiAgICAgICAgICAgIGZ1bnMocGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKC4pKSkgJT4lIAogIG11dGF0ZShwLmRpZmYubm90MCA9IGFzLmNoYXJhY3Rlcihyb3VuZChwLmRpZmYubm90MCwgMikpKSAlPiUKICBtdXRhdGUoRnJhbWUgPSBwYXN0ZTAoSXNzdWUsICIgaXNzdWVzLCAiLCBGdW5kaW5nLCAiIGZ1bmRpbmciKSkgJT4lIAogIHNlbGVjdChgSH4yYX4gYW5kIEh+M2F+IChuZXN0ZWQpYCA9IEZyYW1lLAogICAgICAgICBgJSBsaWtlbHl+Q3JhY2tkb3dufmAgPSB0aGV0YV8yLCBgJSBsaWtlbHl+Tm9cXCBjcmFja2Rvd25+YCA9IHRoZXRhXzEsCiAgICAgICAgIGAkXFxEZWx0YSRgID0gdGhldGFfZGlmZiwgYCRcXCVcXERlbHRhJGAgPSBwY3RfY2hhbmdlLCAKICAgICAgICAgYCRwKFxcRGVsdGEgXFxuZXEgMCkkYCA9IHAuZGlmZi5ub3QwKQpgYGAKCmBgYHtyIGNvbWJpbmUtbGlrZWx5LXRhYmxlcywgcmVzdWx0cz0iYXNpcyJ9CnRibF9saWtlbHlfMl9oZWFkZXIgPC0gZW5mcmFtZShjb2xuYW1lcyh0YmxfbGlrZWx5XzIpKSAlPiUgCiAgbXV0YXRlKHZhbHVlID0gKHZhbHVlKSkgJT4lIAogIHNwcmVhZChuYW1lLCB2YWx1ZSkgJT4lIAogIHNldF9uYW1lcyhjb2xuYW1lcyh0YmxfbGlrZWx5XzEpKQoKdGJsX2xpa2VseV8zX2hlYWRlciA8LSBlbmZyYW1lKGNvbG5hbWVzKHRibF9saWtlbHlfMykpICU+JSAKICBtdXRhdGUodmFsdWUgPSAodmFsdWUpKSAlPiUgCiAgc3ByZWFkKG5hbWUsIHZhbHVlKSAlPiUgCiAgc2V0X25hbWVzKGNvbG5hbWVzKHRibF9saWtlbHlfMSkpCgpiaW5kX3Jvd3ModGJsX2xpa2VseV8xLCAKICAgICAgICAgIHRibF9saWtlbHlfMl9oZWFkZXIsIAogICAgICAgICAgc2V0X25hbWVzKHRibF9saWtlbHlfMiwgY29sbmFtZXModGJsX2xpa2VseV8xKSksCiAgICAgICAgICB0YmxfbGlrZWx5XzNfaGVhZGVyLAogICAgICAgICAgc2V0X25hbWVzKHRibF9saWtlbHlfMywgY29sbmFtZXModGJsX2xpa2VseV8xKSkpICU+JSAKICByZW5hbWUoYEh+MWF+YCA9IEZyYW1lKSAlPiUgCiAgcGFuZG9jLnRhYmxlLnJldHVybihjYXB0aW9uID0gJ0xpa2VsaWhvb2Qgb2YgZG9uYXRpb24gYW5kIGRpZmZlcmVuY2VzIGluIHByb3BvcnRpb25zIGluICJjcmFja2Rvd24iICh0cmVhdG1lbnQpIGFuZCAibm8gY3JhY2tkb3duIiAoY29udHJvbCkgY29uZGl0aW9uczsgdmFsdWVzIHJlcHJlc2VudCBwb3N0ZXJpb3IgbWVkaWFucyB7I3RibDpsaWtlbHktZGlmZnN9JywKICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnkgPSAibGNjY2NjIikgJVQ+JQogIGNhdCgpICU+JQogIGNhdChmaWxlID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgInRhYmxlcyIsICJ0YmwtbGlrZWx5LWRpZmZzLm1kIikpCmBgYAoKXAoKIyBUcmVhdG1lbnQgZWZmZWN0czogQW1vdW50IGRvbmF0ZWQKCiMjIFByaW9ycyBhbmQgbW9kZWxzCgpGb2xsb3dpbmcgW0pvaG4gS3J1c2Noa2UncyAiQmF5ZXNpYW4gRXN0aW1hdGlvbiBTdXBlcnNlZGVzIHRoZSB0LXRlc3QgKEJFU1QpIiBwcm9jZWR1cmVdKGh0dHA6Ly93d3cuaW5kaWFuYS5lZHUvfmtydXNjaGtlL0JFU1QvQkVTVC5wZGYpLCB3ZSBlc3RpbWF0ZSBtZWFucyBmb3IgZWFjaCBncm91cCB3aXRoIGEgdC1kaXN0cmlidXRpb24uIFdlIHVzZSB0aGUgZm9sbG93aW5nIHByaW9ycyBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBwYXJhbWV0ZXJzOgoKJCQKXGJlZ2lue2FsaWduZWR9Cnhfe1x0ZXh0e2dyb3VwIDEsIGdyb3VwIDJ9fSAmXHNpbSBcdGV4dHtTdHVkZW50IH0gdChcbnUsIFxtdSwgXHNpZ21hKSAmXHRleHR7W2xpa2VsaWhvb2RdfVxcClx0ZXh0e0RpZmZlcmVuY2V9ICY9IHhfe1x0ZXh0e2dyb3VwIDJ9fSAtIHhfe1x0ZXh0e2dyb3VwIDF9fSAmXHRleHR7W2RpZmZlcmVuY2UgaW4gbWVhbnNdfSBcXAp4ICY6IFx0ZXh0e01lYW4gYW1vdW50IGRvbmF0ZWR9IFxcClxcClxudSAmXHNpbSBcdGV4dHtFeHBvbmVudGlhbH0oMSAvIDI5KSAmXHRleHR7W3ByaW9yIG5vcm1hbGl0eV19IFxcClxtdV97XHRleHR7Z3JvdXAgMSwgZ3JvdXAgMn19ICZcc2ltIFxtYXRoY2Fse059KFxiYXJ7eH1fe1x0ZXh0e2dyb3VwIDEsIGdyb3VwIDJ9fSwgMTApICZcdGV4dHtbcHJpb3IgZG9uYXRpb24gbWVhbiBwZXIgZ3JvdXBdfVxcClxzaWdtYV97XHRleHR7Z3JvdXAgMSwgZ3JvdXAgMn19ICZcc2ltIFx0ZXh0e0NhdWNoeX0oMCwgMSkmXHRleHR7W3ByaW9yIGRvbmF0aW9uIHNkIHBlciBncm91cF19ClxlbmR7YWxpZ25lZH0KJCQKCmBgYHtyIHByaW9ycy1hbW91bnRzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0xLjV9CmFtb3VudF9udSA8LSBnZ3Bsb3QoZGF0YSA9IHRpYmJsZSh4ID0gYygwLCAyMDApKSwgYWVzKHggPSB4KSkgKwogIGdlb21fYXJlYShzdGF0ID0gImZ1bmN0aW9uIiwgZnVuID0gZGV4cCwgYXJncyA9IGxpc3QocmF0ZSA9IDEvMjkpLCAKICAgICAgICAgICAgZmlsbCA9ICJncmV5ODAiLCBjb2xvciA9ICJibGFjayIpICsKICBsYWJzKHggPSBleHByZXNzaW9uKE5vcm1hbGl0eSB+IHBhcmFtZXRlciB+IChudSkpLCB5ID0gIkRlbnNpdHkiKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJsYWJlbCIsIHggPSAxMDAsIHkgPSAwLjAwOSwgCiAgICAgICAgICAgbGFiZWwgPSAiRXhwb25lbnRpYWwoMS8yOSkiLCBzaXplID0gcHRzKDkpKSArCiAgdGhlbWVfbmdvcyhiYXNlX3NpemUgPSA5LCBkZW5zaXR5ID0gVFJVRSkKCmFtb3VudF9tdSA8LSBnZ3Bsb3QoZGF0YSA9IHRpYmJsZSh4ID0gYygwLCAxMDApKSwgYWVzKHggPSB4KSkgKwogIGdlb21fYXJlYShzdGF0ID0gImZ1bmN0aW9uIiwgZnVuID0gZG5vcm0sIGFyZ3MgPSBsaXN0KG1lYW4gPSA1MCwgc2QgPSAxMCksCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTgwIiwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoc2VxKDAsIDEwMCwgMjUpKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygi4oiSJDUwIiwgIuKIkiQyNSIsICJHcm91cCBhdmVyYWdlIiwgIiskMjUiLCAiKyQ1MCIpKSArCiAgYW5ub3RhdGUoZ2VvbSA9ICJsYWJlbCIsIHggPSA1MCwgeSA9IDAuMDEsIGxhYmVsID0gIk4oYmFyKHgpLCAxMCkiLCAKICAgICAgICAgICBwYXJzZSA9IFRSVUUsIHNpemUgPSBwdHMoOSkpICsKICBsYWJzKHggPSBleHByZXNzaW9uKEF2ZXJhZ2UgfiBkb25hdGVkIH4gKG11KSksIHkgPSBOVUxMKSArCiAgdGhlbWVfbmdvcyhiYXNlX3NpemUgPSA5LCBkZW5zaXR5ID0gVFJVRSkKCmFtb3VudF9zaWdtYSA8LSBnZ3Bsb3QoZGF0YSA9IHRpYmJsZSh4ID0gYygwLCAxMCkpLCBhZXMoeCA9IHgpKSArCiAgZ2VvbV9hcmVhKHN0YXQgPSAiZnVuY3Rpb24iLCBmdW4gPSBkY2F1Y2h5LCBhcmdzID0gbGlzdChsb2NhdGlvbiA9IDAsIHNjYWxlID0gMSksCiAgICAgICAgICAgIGZpbGwgPSAiZ3JleTgwIiwgY29sb3IgPSAiYmxhY2siKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGFubm90YXRlKGdlb20gPSAibGFiZWwiLCB4ID0gNSwgeSA9IDAuMDgsIGxhYmVsID0gIkNhdWNoeSgwLCAxKSIsIHNpemUgPSBwdHMoOSkpICsKICBsYWJzKHggPSBleHByZXNzaW9uKFNEIH4gZG9uYXRlZCB+IChzaWdtYSkpLCB5ID0gTlVMTCkgKwogIHRoZW1lX25nb3MoYmFzZV9zaXplID0gOSwgZGVuc2l0eSA9IFRSVUUpCgphbW91bnRfcHJpb3JzIDwtIGFtb3VudF9udSArIGFtb3VudF9tdSArIGFtb3VudF9zaWdtYQphbW91bnRfcHJpb3JzCgphbW91bnRfcHJpb3JzICVUPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAicHJpb3ItYW1vdW50LnBkZiIpLAogICAgICAgICB3aWR0aCA9IDgsIGhlaWdodCA9IDEuNSwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSBjYWlyb19wZGYpICU+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgInByaW9yLWFtb3VudC5wbmciKSwKICAgICAgICAgd2lkdGggPSA4LCBoZWlnaHQgPSAxLjUsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgoKIyMgRGlmZmVyZW5jZXMKCmBgYHtyIHJ1bi1hbW91bnQtbW9kZWxzLCByZXN1bHRzPSJoaWRlIiwgY2FjaGU9VFJVRX0KIyBTYW1wbGUgZnJvbSB0aGUgY29tcGlsZWQgbW9kZWwKYWxsX21vZGVsc19hbW91bnRfcnVuIDwtIGFsbF9tb2RlbHMgJT4lIAogICMgU2ltcGxpZnkgZGF0YSBmb3Igc2VuZGluZyB0byBTdGFuCiAgbXV0YXRlKHN0YW5fZGF0YSA9IGRmICU+JSBtYXAofiB7CiAgICBzZWxlY3QoLngsIGFtb3VudCA9IGFtb3VudF9kb25hdGUsIGdyb3VwID0gY3JhY2tkb3duKQogIH0pKSAlPiUgCiAgIyBSdW4gdGhlIGFjdHVhbCBtb2RlbCBvbiB0aGUgc2ltcGxpZmllZCBkYXRhCiAgbXV0YXRlKG1vZGVsID0gc3Rhbl9kYXRhICU+JSBtYXAofiB7CiAgICBzYW1wbGluZyhhbW91bnRfZG9uYXRlZF9iZXN0KCksIGRhdGEgPSBjb21wb3NlX2RhdGEoLngpLAogICAgICAgICAgICAgY2hhaW5zID0gQ0hBSU5TLCBpdGVyID0gSVRFUiwgd2FybXVwID0gV0FSTVVQLCBzZWVkID0gQkFZRVNfU0VFRCkKICB9KSkgCgojIEV4dHJhY3Qgc3R1ZmYKYWxsX21vZGVsc19hbW91bnQgPC0gYWxsX21vZGVsc19hbW91bnRfcnVuICU+JSAKICAjIEV4dHJhY3QgcG9zdGVyaW9yIGNoYWlucwogIG11dGF0ZShwb3N0ZXJpb3JfY2hhaW5zX2xvbmcgPSBtYXAyKG1vZGVsLCBzdGFuX2RhdGEsIH4gewogICAgLnggJT4lIAogICAgICByZWNvdmVyX3R5cGVzKC55KSAlPiUgCiAgICAgIGdhdGhlcl9kcmF3cyhtdVtncm91cF0sIHNpZ21hW2dyb3VwXSwgbXVfZGlmZiwgcGN0X2NoYW5nZSwgY29oZW5fZCwgY2xlcywgbnUsIGxvZzEwbnUpCiAgfSkpICU+JSAKICBtdXRhdGUocG9zdGVyaW9yX2NoYWluc193aWRlID0gbWFwMihtb2RlbCwgc3Rhbl9kYXRhLCB+IHsKICAgIC54ICU+JSAKICAgICAgcmVjb3Zlcl90eXBlcygueSkgJT4lIAogICAgICBzcHJlYWRfZHJhd3MobXVbZ3JvdXBdLCBzaWdtYVtncm91cF0sIG11X2RpZmYsIHBjdF9jaGFuZ2UsIGNvaGVuX2QsIGNsZXMsIG51LCBsb2cxMG51KQogIH0pKSAlPiUgCiAgIyBHZXQgSERJIG1lZGlhbnMgaW4gdGlkeSBmb3JtCiAgbXV0YXRlKHRpZHkgPSBwb3N0ZXJpb3JfY2hhaW5zX2xvbmcgJT4lIG1hcCh+IHsKICAgIC54ICU+JSBtZWRpYW5faGRjaSgpICU+JSB0b19icm9vbV9uYW1lcygpCiAgfSkpCmBgYAoKYGBge3IgcGxvdC1hbW91bnQtZGlmZnMsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0xMC8zLCBmaWcuaGVpZ2h0PTUuNX0KIyBUaGlzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIGJlY2F1c2UgdW5uZXN0KCkgcHV0cyB0aGUgY3JhY2tkb3duIHZhbHVlcyBpbnRvCiMgb25lIGNvbHVtbiBhbmQgd2UgY2hlYXRlZCBieSByZW5hbWluZyBpc3N1ZSBhbmQgZnVuZGluZyBhcyBjcmFja2Rvd24sIHNvIGl0CiMgZ2V0cyBtYWQgd2hlbiBjb21iaW5pbmcgdGhlIGZhY3RvcnMgaW4gY3JhY2tkb3duIHdpdGggdGhvc2UgaW4gaXNzdWUgYW5kCiMgZnVuZGluZy4gQnV0IGJlY2F1c2Ugd2Ugb25seSBjYXJlIGFib3V0IHRoZSBkaWZmcywgd2UgZG9uJ3QgYWN0dWFsbHkgbmVlZCB0aGUKIyBjYXRlZ29yeSBsYWJlbHMgaGVyZSwgc28gaXQncyBhbGwgZ29vZC4KdGlkaWVkX2RpZmZzX2Ftb3VudCA8LSBhbGxfbW9kZWxzX2Ftb3VudCAlPiUgCiAgdW5uZXN0KHBvc3Rlcmlvcl9jaGFpbnNfbG9uZykgJT4lIAogIGZpbHRlcigudmFyaWFibGUgPT0gIm11X2RpZmYiKSAlPiUgCiAgbXV0YXRlKGNhdGVnb3J5ID0gY2FzZV93aGVuKAogICAgc3RyX2NvdW50KHRpdGxlLCAiXFx8IikgPT0gMCB+ICJMZXZlbCAxIiwKICAgIHN0cl9jb3VudCh0aXRsZSwgIlxcfCIpID09IDEgfiAiTGV2ZWwgMiIsCiAgICBzdHJfY291bnQodGl0bGUsICJcXHwiKSA9PSAyIH4gIkxldmVsIDMiCiAgKSkgJT4lIAogIG11dGF0ZSh0aXRsZSA9IHN0cl9yZW1vdmUodGl0bGUsICIgXFx8IENyYWNrZG93biIpKQoKbGV2ZWwxX2Ftb3VudCA8LSB0aWRpZWRfZGlmZnNfYW1vdW50ICU+JSAKICBmaWx0ZXIoY2F0ZWdvcnkgPT0gIkxldmVsIDEiKSAlPiUKICBtdXRhdGUodGl0bGUgPSByZWNvZGUodGl0bGUsIAogICAgICAgICAgICAgICAgICAgICAgICBDcmFja2Rvd24gPSAiQ3JhY2tkb3duIOKIklxuTm8gY3JhY2tkb3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgSXNzdWUgPSAiSHVtYW5pdGFyaWFuXG5hc3Npc3RhbmNlIOKIklxuSHVtYW4gcmlnaHRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgRnVuZGluZyA9ICJQcml2YXRlIOKIklxuR292ZXJubWVudFxuZnVuZGluZyIpKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gZmN0X2lub3JkZXIodGl0bGUpKQoKcGxvdF9kaWZmX2Ftb3VudF9hIDwtIGdncGxvdChsZXZlbDFfYW1vdW50LCBhZXMoeCA9IC52YWx1ZSwgeSA9IGZjdF9yZXYodGl0bGUpLCBmaWxsID0gdGl0bGUpKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogIGdlb21faGFsZmV5ZWgoLndpZHRoID0gYygwLjgsIDAuOTUpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG5nb19jb2xzKGMoImJsdWUiLCAicmVkIiwgIm9yYW5nZSIpLCBuYW1lID0gRkFMU0UpLCBndWlkZSA9IEZBTFNFKSArCiAgbGFicyh4ID0gIkRpZmZlcmVuY2UgaW4gYW1vdW50IGRvbmF0ZWQiLCB5ID0gTlVMTCwgdGFnID0gIkEiKSArCiAgdGhlbWVfbmdvcyhiYXNlX3NpemUgPSA4KSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKbGV2ZWwyX2Ftb3VudCA8LSB0aWRpZWRfZGlmZnNfYW1vdW50ICU+JSAKICBmaWx0ZXIoY2F0ZWdvcnkgPT0gIkxldmVsIDIiKSAlPiUKICBtdXRhdGUoY29uZGl0aW9uID0gY2FzZV93aGVuKAogICAgdGl0bGUgJWluJSBjKCJIdW1hbiByaWdodHMiLCAiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UiKSB+ICJJc3N1ZSIsCiAgICB0aXRsZSAlaW4lIGMoIkdvdmVybm1lbnQiLCAiUHJpdmF0ZSIpIH4gIkZ1bmRpbmciCiAgKSkgJT4lIAogIG11dGF0ZShmYWNldF90aXRsZSA9IGNhc2Vfd2hlbigKICAgIHRpdGxlICVpbiUgYygiSHVtYW4gcmlnaHRzIiwgIkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIikgfiBwYXN0ZSh0aXRsZSwgImlzc3VlcyIpLAogICAgdGl0bGUgJWluJSBjKCJHb3Zlcm5tZW50IiwgIlByaXZhdGUiKSB+IHBhc3RlKHRpdGxlLCAiZnVuZGluZyIpCiAgKSkgJT4lIAogIG11dGF0ZSh0aXRsZSA9IGNhc2Vfd2hlbigKICAgIHRpdGxlICVpbiUgYygiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UiLCAiUHJpdmF0ZSIpIH4gIiIsCiAgICBUUlVFIH4gIkNyYWNrZG93biDiiJJcbk5vIGNyYWNrZG93biIpCiAgKQoKcGxvdF9kaWZmX2Ftb3VudF9iIDwtIGdncGxvdChmaWx0ZXIobGV2ZWwyX2Ftb3VudCwgY29uZGl0aW9uID09ICJJc3N1ZSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IC52YWx1ZSwgeSA9IGZjdF9yZXYodGl0bGUpKSkgKwogIGdlb21faGFsZmV5ZWgoLndpZHRoID0gYygwLjgsIDAuOTUpLCBmaWxsID0gbmdvX2NvbHMoInJlZCIsIG5hbWUgPSBGQUxTRSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSBOVUxMLCB0YWcgPSAiQiIpICsKICBmYWNldF93cmFwKH4gZmFjZXRfdGl0bGUsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgdGhlbWVfbmdvcyhiYXNlX3NpemUgPSA4KSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKQoKcGxvdF9kaWZmX2Ftb3VudF9jIDwtIGdncGxvdChmaWx0ZXIobGV2ZWwyX2Ftb3VudCwgY29uZGl0aW9uID09ICJGdW5kaW5nIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gLnZhbHVlLCB5ID0gZmN0X3Jldih0aXRsZSkpKSArCiAgZ2VvbV9oYWxmZXllaCgud2lkdGggPSBjKDAuOCwgMC45NSksIGZpbGwgPSBuZ29fY29scygib3JhbmdlIiwgbmFtZSA9IEZBTFNFKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gZG9sbGFyKSArCiAgbGFicyh4ID0gIkRpZmZlcmVuY2UgaW4gYW1vdW50IGRvbmF0ZWQiLCB5ID0gTlVMTCwgdGFnID0gIkMiKSArCiAgZmFjZXRfd3JhcCh+IGZhY2V0X3RpdGxlLCBzY2FsZXMgPSAiZnJlZV95IikgKwogIHRoZW1lX25nb3MoYmFzZV9zaXplID0gOCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IueSA9IGVsZW1lbnRfYmxhbmsoKSkKCmxldmVsM19hbW91bnQgPC0gdGlkaWVkX2RpZmZzX2Ftb3VudCAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJMZXZlbCAzIikgJT4lCiAgc2VwYXJhdGUodGl0bGUsIGMoImlzc3VlIiwgImZ1bmRpbmciKSwgc2VwID0gIiBcXHwgIikgJT4lCiAgbXV0YXRlKGlzc3VlID0gcGFzdGUoaXNzdWUsICJpc3N1ZXMiKSwKICAgICAgICAgZnVuZGluZyA9IHBhc3RlKGZ1bmRpbmcsICJmdW5kaW5nIikpICU+JSAKICBtdXRhdGUoZmFjZXRfdGl0bGUgPSBwYXN0ZTAoaXNzdWUsICJcbiIsIGZ1bmRpbmcpKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gY2FzZV93aGVuKAogICAgZnVuZGluZyA9PSAiUHJpdmF0ZSBmdW5kaW5nIiB+ICIiLAogICAgVFJVRSB+ICJDcmFja2Rvd24g4oiSXG5ObyBjcmFja2Rvd24iKQogICkKCnBsb3RfZGlmZl9hbW91bnRfZCA8LSBnZ3Bsb3QobGV2ZWwzX2Ftb3VudCwgYWVzKHggPSAudmFsdWUsIHkgPSBmY3RfcmV2KHRpdGxlKSkpICsKICBnZW9tX2hhbGZleWVoKC53aWR0aCA9IGMoMC44LCAwLjk1KSwgZmlsbCA9IG5nb19jb2xzKCJncmVlbiIsIG5hbWUgPSBGQUxTRSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IGRvbGxhcikgKwogIGxhYnMoeCA9ICJEaWZmZXJlbmNlIGluIGFtb3VudCBkb25hdGVkIiwgeSA9IE5VTEwsIHRhZyA9ICJEIiwKICAgICAgIGNhcHRpb24gPSAiUG9pbnQgc2hvd3MgcG9zdGVyaW9yIG1lZGlhbjsgdGhpY2sgYmxhY2sgbGluZXMgc2hvdyA4MCUgY3JlZGlibGUgaW50ZXJ2YWw7XG50aGluIGJsYWNrIGxpbmVzIHNob3cgOTUlIGNyZWRpYmxlIGludGVydmFsIikgKwogIGZhY2V0X3dyYXAofiBmYWNldF90aXRsZSwgc2NhbGVzID0gImZyZWVfeSIpICsKICB0aGVtZV9uZ29zKGJhc2Vfc2l6ZSA9IDgpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yLnkgPSBlbGVtZW50X2JsYW5rKCkpCgpwbG90X2RpZmZzX2Ftb3VudHNfYWxsIDwtIHBsb3RfZGlmZl9hbW91bnRfYSAvIAogIChwbG90X2RpZmZfYW1vdW50X2IgLyBwbG90X2RpZmZfYW1vdW50X2MpIC8gCiAgcGxvdF9kaWZmX2Ftb3VudF9kCgpwbG90X2RpZmZzX2Ftb3VudHNfYWxsCgpwbG90X2RpZmZzX2Ftb3VudHNfYWxsICVUPiUgCiAgZ2dzYXZlKC4sIGZpbGVuYW1lID0gaGVyZSgiYW5hbHlzaXMiLCAib3V0cHV0IiwgImZpZ3VyZXMiLCAiYW1vdW50LWRpZmZzLnBkZiIpLAogICAgICAgICB3aWR0aCA9IDEwLzMsIGhlaWdodCA9IDUuNSwgdW5pdHMgPSAiaW4iLCBkZXZpY2UgPSBjYWlyb19wZGYpICU+JQogIGdnc2F2ZSguLCBmaWxlbmFtZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJmaWd1cmVzIiwgImFtb3VudC1kaWZmcy5wbmciKSwKICAgICAgICAgd2lkdGggPSAxMC8zLCBoZWlnaHQgPSA1LjUsIHVuaXRzID0gImluIiwgdHlwZSA9ICJjYWlybyIsIGRwaSA9IDMwMCkKYGBgCgpgYGB7ciB0YmwtYW1vdW50LWRpZmZzLWxldmVsMSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2Ftb3VudHNfdGlkeSA8LSBhbGxfbW9kZWxzX2Ftb3VudCAlPiUgCiAgdW5uZXN0KHRpZHkpICU+JSAKICBmaWx0ZXIodGVybSAlaW4lIGMoIm11IiwgIm11X2RpZmYiLCAicGN0X2NoYW5nZSIpKSAlPiUgCiAgZ3JvdXBfYnkodGl0bGUpICU+JSAKICBtdXRhdGUoZ3JvdXBfaWQgPSAxOm4oKSkgJT4lIAogIG11dGF0ZSh0ZXJtID0gY2FzZV93aGVuKAogICAgdGVybSA9PSAibXUiIH4gcGFzdGUwKHRlcm0sICJfIiwgZ3JvdXBfaWQpLAogICAgVFJVRSB+IHRlcm0KICApKSAlPiUgCiAgc2VsZWN0KHRpdGxlLCB0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogIHNwcmVhZCh0ZXJtLCBlc3RpbWF0ZSkgJT4lIAogIG11dGF0ZShjYXRlZ29yeSA9IGNhc2Vfd2hlbigKICAgIHN0cl9jb3VudCh0aXRsZSwgIlxcfCIpID09IDAgfiAiTGV2ZWwgMSIsCiAgICBzdHJfY291bnQodGl0bGUsICJcXHwiKSA9PSAxIH4gIkxldmVsIDIiLAogICAgc3RyX2NvdW50KHRpdGxlLCAiXFx8IikgPT0gMiB+ICJMZXZlbCAzIgogICkpICU+JSAKICB1bmdyb3VwKCkKCnRibF9hbW91bnRzX3Byb2JzIDwtIGFsbF9tb2RlbHNfYW1vdW50ICU+JSAKICB1bm5lc3QocG9zdGVyaW9yX2NoYWluc19sb25nKSAlPiUgCiAgZmlsdGVyKC52YXJpYWJsZSA9PSAibXVfZGlmZiIpICU+JSAKICBncm91cF9ieSh0aXRsZSkgJT4lIAogIHN1bW1hcml6ZShwLmdyZWF0ZXIwID0gbWVhbigudmFsdWUgPiAwKSwKICAgICAgICAgICAgcC5sZXNzMCA9IG1lYW4oLnZhbHVlIDwgMCksCiAgICAgICAgICAgIHAuZGlmZi5ub3QwID0gaWZlbHNlKG1lZGlhbigudmFsdWUpID4gMCwgcC5ncmVhdGVyMCwgcC5sZXNzMCkpICU+JSAKICB1bmdyb3VwKCkKCiMgU2F2ZSBjb21iaW5lZCB0YWJsZSBmb3IgbGF0ZXIgdXNlIGluIG1hbnVzY3JpcHQKdGJsX2Ftb3VudHNfdGlkeSAlPiUgCiAgbGVmdF9qb2luKHRibF9hbW91bnRzX3Byb2JzLCBieSA9ICJ0aXRsZSIpICU+JSAKICBzYXZlUkRTKGhlcmUoImRhdGEiLCAiZGVyaXZlZF9kYXRhIiwgInJlc3VsdHNfbW9kZWxzX2Ftb3VudC5yZHMiKSkKCnRibF9hbW91bnRfMSA8LSB0YmxfYW1vdW50c190aWR5ICU+JSAKICBsZWZ0X2pvaW4odGJsX2Ftb3VudHNfcHJvYnMsIGJ5ID0gInRpdGxlIikgJT4lIAogIGZpbHRlcihjYXRlZ29yeSA9PSAiTGV2ZWwgMSIpICU+JQogIG11dGF0ZSh0aXRsZSA9IHJlY29kZSh0aXRsZSwgCiAgICAgICAgICAgICAgICAgICAgICAgIENyYWNrZG93biA9ICJDcmFja2Rvd24g4oiSIE5vIGNyYWNrZG93biIsCiAgICAgICAgICAgICAgICAgICAgICAgIElzc3VlID0gIipIdW1hbml0YXJpYW4gYXNzaXN0YW5jZSDiiJIgSHVtYW4gcmlnaHRzKiIsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmRpbmcgPSAiKlByaXZhdGUg4oiSIEdvdmVybm1lbnQgZnVuZGluZyoiKSkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKG11XzEsIG11XzIsIG11X2RpZmYsIHAuZGlmZi5ub3QwKSwgZnVucyhhcy5jaGFyYWN0ZXIocm91bmQoLiwgMikpKSkgJT4lIAogIG11dGF0ZShwY3RfY2hhbmdlID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKHBjdF9jaGFuZ2UpKSAlPiUKICBzZWxlY3QoYEZyYW1lYCA9IHRpdGxlLCBgQW1vdW50flRyZWF0bWVudH5gID0gbXVfMiwgYEFtb3VudH5Db250cm9sfmAgPSBtdV8xLAogICAgICAgICBgJFxcRGVsdGEkYCA9IG11X2RpZmYsIGAkXFwlXFxEZWx0YSRgID0gcGN0X2NoYW5nZSwgCiAgICAgICAgIGAkcChcXERlbHRhIFxcbmVxIDApJGAgPSBwLmRpZmYubm90MCkKYGBgCgpgYGB7ciB0YmwtYW1vdW50LWRpZmZzLWxldmVsMiwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2Ftb3VudF8yIDwtIHRibF9hbW91bnRzX3RpZHkgJT4lIAogIGxlZnRfam9pbih0YmxfYW1vdW50c19wcm9icywgYnkgPSAidGl0bGUiKSAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJMZXZlbCAyIikgJT4lCiAgbXV0YXRlKHRpdGxlX2NsZWFuID0gc3RyX3JlbW92ZSh0aXRsZSwgIiBcXHwgQ3JhY2tkb3duIikpICU+JSAKICBtdXRhdGUodGl0bGVfY2xlYW4gPSBjYXNlX3doZW4oCiAgICB0aXRsZV9jbGVhbiAlaW4lIGMoIkh1bWFuIHJpZ2h0cyIsICJIdW1hbml0YXJpYW4gYXNzaXN0YW5jZSIpIH4gcGFzdGUodGl0bGVfY2xlYW4sICJpc3N1ZXMiKSwKICAgIHRpdGxlX2NsZWFuICVpbiUgYygiR292ZXJubWVudCIsICJQcml2YXRlIikgfiBwYXN0ZSh0aXRsZV9jbGVhbiwgImZ1bmRpbmciKQogICkpICU+JSAKICBtdXRhdGUodGl0bGVfY2xlYW4gPSBmYWN0b3IodGl0bGVfY2xlYW4sIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJIdW1hbiByaWdodHMgaXNzdWVzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkh1bWFuaXRhcmlhbiBhc3Npc3RhbmNlIGlzc3VlcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHb3Zlcm5tZW50IGZ1bmRpbmciLCAiUHJpdmF0ZSBmdW5kaW5nIikpKSAlPiUgCiAgYXJyYW5nZSh0aXRsZV9jbGVhbikgJT4lIAogIG11dGF0ZV9hdCh2YXJzKG11XzEsIG11XzIsIG11X2RpZmYsIHAuZGlmZi5ub3QwKSwgZnVucyhhcy5jaGFyYWN0ZXIocm91bmQoLiwgMikpKSkgJT4lIAogIG11dGF0ZShwY3RfY2hhbmdlID0gcGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAwLjEpKHBjdF9jaGFuZ2UpKSAlPiUKICBtdXRhdGUodGl0bGVfY2xlYW4gPSBhcy5jaGFyYWN0ZXIodGl0bGVfY2xlYW4pKSAlPiUgCiAgc2VsZWN0KGBIfjJifiBhbmQgSH4zYn5gID0gdGl0bGVfY2xlYW4sIGBBbW91bnR+Q3JhY2tkb3dufmAgPSBtdV8yLCBgQW1vdW50fk5vXFwgY3JhY2tkb3dufmAgPSBtdV8xLAogICAgICAgICBgJFxcRGVsdGEkYCA9IG11X2RpZmYsIGAkXFwlXFxEZWx0YSRgID0gcGN0X2NoYW5nZSwgCiAgICAgICAgIGAkcChcXERlbHRhIFxcbmVxIDApJGAgPSBwLmRpZmYubm90MCkKYGBgCgpgYGB7ciB0YmwtYW1vdW50LWRpZmZzLWxldmVsMywgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KdGJsX2Ftb3VudF8zIDwtIHRibF9hbW91bnRzX3RpZHkgJT4lIAogIGxlZnRfam9pbih0YmxfYW1vdW50c19wcm9icywgYnkgPSAidGl0bGUiKSAlPiUgCiAgZmlsdGVyKGNhdGVnb3J5ID09ICJMZXZlbCAzIikgJT4lCiAgbXV0YXRlKHRpdGxlX2NsZWFuID0gc3RyX3JlbW92ZSh0aXRsZSwgIiBcXHwgQ3JhY2tkb3duIikpICU+JSAKICBzZXBhcmF0ZSh0aXRsZV9jbGVhbiwgYygiSXNzdWUiLCAiRnVuZGluZyIpLCBzZXAgPSAiIFxcfCAiKSAlPiUgCiAgbXV0YXRlKElzc3VlID0gZmFjdG9yKElzc3VlLCBsZXZlbHMgPSBjKCJIdW1hbiByaWdodHMiLCAiSHVtYW5pdGFyaWFuIGFzc2lzdGFuY2UiKSksCiAgICAgICAgIEZ1bmRpbmcgPSBmYWN0b3IoRnVuZGluZywgbGV2ZWxzID0gYygiR292ZXJubWVudCIsICJQcml2YXRlIikpKSAlPiUgCiAgYXJyYW5nZShJc3N1ZSwgRnVuZGluZykgJT4lIAogIG11dGF0ZShGcmFtZSA9IHBhc3RlMChJc3N1ZSwgIiBpc3N1ZXMsICIsIEZ1bmRpbmcsICIgZnVuZGluZyIpKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMobXVfMSwgbXVfMiwgbXVfZGlmZiwgcC5kaWZmLm5vdDApLCBmdW5zKGFzLmNoYXJhY3Rlcihyb3VuZCguLCAyKSkpKSAlPiUgCiAgbXV0YXRlKHBjdF9jaGFuZ2UgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDAuMSkocGN0X2NoYW5nZSkpICU+JQogIHNlbGVjdChgSH4yYn4gYW5kIEh+M2J+IChuZXN0ZWQpYCA9IEZyYW1lLAogICAgICAgICBgQW1vdW50fkNyYWNrZG93bn5gID0gbXVfMiwgYEFtb3VudH5Ob1xcIGNyYWNrZG93bn5gID0gbXVfMSwKICAgICAgICAgYCRcXERlbHRhJGAgPSBtdV9kaWZmLCBgJFxcJVxcRGVsdGEkYCA9IHBjdF9jaGFuZ2UsIAogICAgICAgICBgJHAoXFxEZWx0YSBcXG5lcSAwKSRgID0gcC5kaWZmLm5vdDApCmBgYAoKYGBge3IgY29tYmluZS1hbW91bnQtdGFibGVzLCByZXN1bHRzPSJhc2lzIn0KdGJsX2Ftb3VudF8yX2hlYWRlciA8LSBlbmZyYW1lKGNvbG5hbWVzKHRibF9hbW91bnRfMikpICU+JSAKICBtdXRhdGUodmFsdWUgPSAodmFsdWUpKSAlPiUgCiAgc3ByZWFkKG5hbWUsIHZhbHVlKSAlPiUgCiAgc2V0X25hbWVzKGNvbG5hbWVzKHRibF9hbW91bnRfMSkpCgp0YmxfYW1vdW50XzNfaGVhZGVyIDwtIGVuZnJhbWUoY29sbmFtZXModGJsX2Ftb3VudF8zKSkgJT4lIAogIG11dGF0ZSh2YWx1ZSA9ICh2YWx1ZSkpICU+JSAKICBzcHJlYWQobmFtZSwgdmFsdWUpICU+JSAKICBzZXRfbmFtZXMoY29sbmFtZXModGJsX2Ftb3VudF8xKSkKCmJpbmRfcm93cyh0YmxfYW1vdW50XzEsIAogICAgICAgICAgdGJsX2Ftb3VudF8yX2hlYWRlciwgCiAgICAgICAgICBzZXRfbmFtZXModGJsX2Ftb3VudF8yLCBjb2xuYW1lcyh0YmxfYW1vdW50XzEpKSwKICAgICAgICAgIHRibF9hbW91bnRfM19oZWFkZXIsCiAgICAgICAgICBzZXRfbmFtZXModGJsX2Ftb3VudF8zLCBjb2xuYW1lcyh0YmxfYW1vdW50XzEpKSkgJT4lIAogIHJlbmFtZShgSH4xYn5gID0gRnJhbWUpICU+JSAKICBwYW5kb2MudGFibGUucmV0dXJuKGNhcHRpb24gPSAnTWVhbiB2YWx1ZXMgYW5kIGRpZmZlcmVuY2VzIGluIG1lYW5zIGZvciBhbW91bnQgZG9uYXRlZCBpbiAiY3JhY2tkb3duIiAodHJlYXRtZW50KSBhbmQgIm5vIGNyYWNrZG93biIgKGNvbnRyb2wpIGNvbmRpdGlvbnM7IHZhbHVlcyByZXByZXNlbnQgcG9zdGVyaW9yIG1lZGlhbnMgeyN0Ymw6YW1vdW50LWRpZmZzfScsCiAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5ID0gImxjY2NjYyIpICVUPiUKICBjYXQoKSAlPiUKICBjYXQoZmlsZSA9IGhlcmUoImFuYWx5c2lzIiwgIm91dHB1dCIsICJ0YWJsZXMiLCAidGJsLWFtb3VudC1kaWZmcy5tZCIpKQpgYGAKCiMjIEVmZmVjdCBzaXplCgpgYGB7ciBhbW91bnQtZWZmZWN0LXNpemUsIHdhcm5pbmc9RkFMU0V9CiMgRWZmZWN0IHNpemUKIyAozrzigoEgLSDOvOKCgikgLyBzcXJ0KCAoz4PigoHCsiArIM+D4oKCwrIpIC8gMikKdGlkaWVkX2VmZl9zaXplX2Ftb3VudCA8LSBhbGxfbW9kZWxzX2Ftb3VudCAlPiUgCiAgdW5uZXN0KHBvc3Rlcmlvcl9jaGFpbnNfbG9uZykgJT4lIAogIGZpbHRlcigudmFyaWFibGUgPT0gImNvaGVuX2QiKSAlPiUgCiAgbXV0YXRlKGNhdGVnb3J5ID0gY2FzZV93aGVuKAogICAgc3RyX2NvdW50KHRpdGxlLCAiXFx8IikgPT0gMCB+ICJMZXZlbCAxIiwKICAgIHN0cl9jb3VudCh0aXRsZSwgIlxcfCIpID09IDEgfiAiTGV2ZWwgMiIsCiAgICBzdHJfY291bnQodGl0bGUsICJcXHwiKSA9PSAyIH4gIkxldmVsIDMiCiAgKSkgJT4lIAogIG11dGF0ZSh0aXRsZSA9IHN0cl9yZW1vdmUodGl0bGUsICIgXFx8IENyYWNrZG93biIpKSAlPiUgCiAgbXV0YXRlKHRpdGxlID0gZmN0X2lub3JkZXIodGl0bGUpKQoKZWZmZWN0X3NpemVzIDwtIHRyaWJibGUoCiAgfnNpemUsIH54X2VuZCwKICAiU21hbGwiLCAwLjIsCiAgIk1lZGl1bSIsIDAuNSwKICAiTGFyZ2UiLCAwLjgKKSAlPiUgCiAgbXV0YXRlKHhfc3RhcnQgPSAteF9lbmQpCgpnZ3Bsb3QodGlkaWVkX2VmZl9zaXplX2Ftb3VudCwgYWVzKHggPSAudmFsdWUsIHkgPSBmY3RfcmV2KHRpdGxlKSkpICsKICBnZW9tX2hhbGZleWVoKC53aWR0aCA9IGMoMC44LCAwLjk1KSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIHNpemUgPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygwLjIsIC0wLjIpLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gMC41KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygwLjUsIC0wLjUpLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gMC41KSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYygwLjUsIC0wLjUpLCBsaW5ldHlwZSA9ICJkb3R0ZWQiLCBzaXplID0gMC41KSArCiAgY29vcmRfY2FydGVzaWFuKHhsaW0gPSBjKC0wLjYsIDAuNikpICsKICBsYWJzKHggPSAiQ29oZW4ncyBkIChlZmZlY3Qgc2l6ZSkiLCB5ID0gTlVMTCkgKwogIHRoZW1lX25nb3MoKQpgYGAKClwKCiMgT3JpZ2luYWwgY29tcHV0aW5nIGVudmlyb25tZW50Cgo8YnV0dG9uIGRhdGEtdG9nZ2xlPSJjb2xsYXBzZSIgZGF0YS10YXJnZXQ9IiNzZXNzaW9uaW5mbyIgY2xhc3M9ImJ0biBidG4tcHJpbWFyeSBidG4tbWQgYnRuLWluZm8iPkhlcmUncyB3aGF0IHdlIHVzZWQgdGhlIGxhc3QgdGltZSB3ZSBidWlsdCB0aGlzIHBhZ2U8L2J1dHRvbj4KCjxkaXYgaWQ9InNlc3Npb25pbmZvIiBjbGFzcz0iY29sbGFwc2UiPgoKYGBge3Igc2hvdy1zZXNzaW9uLWluZm8sIGVjaG89VFJVRSwgd2lkdGg9MTAwfQp3cml0ZUxpbmVzKHJlYWRMaW5lcyhmaWxlLnBhdGgoU3lzLmdldGVudigiSE9NRSIpLCAiLlIvTWFrZXZhcnMiKSkpCgpkZXZ0b29sczo6c2Vzc2lvbl9pbmZvKCkKYGBgCgo8L2Rpdj4gCg==