Data Preparation

In this pre-registered study, we collected data from 300 participants. After exluding duplicate IP addresses and participants who failed attention checks, we obtained an analyzable sample of 225 participants.

Loading Packages

Before running this chunk, please load “Study 3.csv” into the R environment.

# packages should be loaded in the following order to avoid function conflicts
options(scipen = 99) # turns off scientific notation
library(psych) # for describing data
library(effsize) # for mean difference effect sizes
library(sjstats) # for eta-squared effect sizes
library(correlation) # for cleaner correlation test output
library(rmcorr) # for repeated-measures correlation tests
library(cocor) # for comparing dependent correlation coefficients
library(tidyverse) # for data manipulation and plotting

Attention Check

Participants were instructed to select zero (i.e., the middle option in the 9-point scale) as their response for the primary virtuosity measures that followed a modified scenario. Additionally, they were instructed to select the middle response option for two exploratory measures (i.e., moderately bad & moderately clear). If a participant failed to select the instructed response for any of the three measures, they would be excluded from the analyses.

S3 <- Study_3 %>% 
  filter(AttnVirtuosity == "0" & AttnBad == "Moderately bad" & AttnClear =="Moderately clear")

Variable Creation

Here, we create the relevant variables necessary to begin analyses for both the “Stranger” and the “Close Others” vignettes.

# Create a variable for virtuosity average in "stranger" and "close others" conditions
S3<- S3 %>%
  mutate_at(vars(theftRV, cakehoardRV, smokingRV, playbookRV,
                 officebonusRV, steroidsRV, revengeRV, envyRV,
                 responsibilityRV, insultingRV, racismRV, criticizingRV,
                 violenceRV, speedingRV, pestRV, lyingRV, gossipRV,
                 shootRV, cheatingRV, sexismRV,
                 theftSV, cakehoardSV, smokingSV, playbookSV,
                 officebonusSV, steroidsSV, revengeSV, envySV,
                 responsibilitySV, insultingSV, racismSV, criticizingSV,
                 violenceSV, speedingSV, pestSV, lyingSV, gossipSV,
                 shootSV, cheatingSV, sexismSV), as.numeric)

S3$StrangerAverage <- rowMeans(S3[, c("theftSV", "cakehoardSV", "smokingSV", "playbookSV",
             "officebonusSV", "steroidsSV", "revengeSV", "envySV",
             "responsibilitySV", "insultingSV", "racismSV", "criticizingSV",
             "violenceSV", "speedingSV", "pestSV", "lyingSV", "gossipSV",
             "shootSV", "cheatingSV", "sexismSV")], na.rm = T) # SV = Stranger Vignette

S3$CloseOtherAverage <- rowMeans(S3[, c("theftRV", "cakehoardRV", "smokingRV", "playbookRV",
             "officebonusRV", "steroidsRV", "revengeRV", "envyRV",
             "responsibilityRV", "insultingRV", "racismRV", "criticizingRV",
             "violenceRV", "speedingRV", "pestRV", "lyingRV", "gossipRV",
             "shootRV", "cheatingRV", "sexismRV")], na.rm = T) # RV = Relationship Vignette

# Separate Stranger virtuosity data from the main dataset (for certain later analyses)
S3_s <- S3 %>% # SV = Stranger Vignette; RV = Relationship Vignette
  select (-c("theftRV", "cakehoardRV", "smokingRV", "playbookRV",
             "officebonusRV", "steroidsRV", "revengeRV", "envyRV",
             "responsibilityRV", "insultingRV", "racismRV", "criticizingRV",
             "violenceRV", "speedingRV", "pestRV", "lyingRV", "gossipRV",
             "shootRV", "cheatingRV", "sexismRV"))

# Separate Close Other virtuosity data from the main dataset (for certain later analyses)
S3_co <- S3 %>% # SV = Stranger Vignette; RV = Relationship Vignette
  select (-c("theftSV", "cakehoardSV", "smokingSV", "playbookSV",
             "officebonusSV", "steroidsSV", "revengeSV", "envySV",
             "responsibilitySV", "insultingSV", "racismSV", "criticizingSV",
             "violenceSV", "speedingSV", "pestSV", "lyingSV", "gossipSV",
             "shootSV", "cheatingSV", "sexismSV"))

# Create a variable per scenario that indicates if each participant chose the hypothesized agent or not (Stranger)
S3_s <- S3_s %>%
  mutate(theft_hyp = if_else(theftSV > 0, 1, 0)) %>%
  mutate(cakehoard_hyp = if_else(cakehoardSV > 0, 1, 0)) %>%
  mutate(smoking_hyp = if_else(smokingSV > 0, 1, 0)) %>%
  mutate(playbook_hyp = if_else(playbookSV > 0, 1, 0)) %>%
  mutate(officebonus_hyp = if_else(officebonusSV > 0, 1, 0)) %>%
  mutate(steroids_hyp = if_else(steroidsSV > 0, 1, 0)) %>%
  mutate(revenge_hyp = if_else(revengeSV > 0, 1, 0)) %>%
  mutate(envy_hyp = if_else(envySV > 0, 1, 0)) %>%
  mutate(responsibility_hyp = if_else(responsibilitySV > 0, 1, 0)) %>%
  mutate(insulting_hyp = if_else(insultingSV > 0, 1, 0)) %>%
  mutate(racism_hyp = if_else(racismSV > 0, 1, 0)) %>%
  mutate(criticizing_hyp = if_else(criticizingSV > 0, 1, 0)) %>%
  mutate(violence_hyp = if_else(violenceSV > 0, 1, 0)) %>%
  mutate(speeding_hyp = if_else(speedingSV > 0, 1, 0)) %>%
  mutate(pest_hyp = if_else(pestSV > 0, 1, 0)) %>%
  mutate(lying_hyp = if_else(lyingSV > 0, 1, 0)) %>%
  mutate(gossip_hyp = if_else(gossipSV > 0, 1, 0)) %>%
  mutate(shoot_hyp = if_else(shootSV > 0, 1, 0)) %>%
  mutate(cheating_hyp = if_else(cheatingSV > 0, 1, 0)) %>%
  mutate(sexism_hyp = if_else(sexismSV > 0, 1, 0))

S3_s <- S3_s %>% # opposite
  mutate(theft_opp = if_else(theftSV < 0, 1, 0)) %>%
  mutate(cakehoard_opp = if_else(cakehoardSV < 0, 1, 0)) %>%
  mutate(smoking_opp = if_else(smokingSV < 0, 1, 0)) %>%
  mutate(playbook_opp = if_else(playbookSV < 0, 1, 0)) %>%
  mutate(officebonus_opp = if_else(officebonusSV < 0, 1, 0)) %>%
  mutate(steroids_opp = if_else(steroidsSV < 0, 1, 0)) %>%
  mutate(revenge_opp = if_else(revengeSV < 0, 1, 0)) %>%
  mutate(envy_opp = if_else(envySV < 0, 1, 0)) %>%
  mutate(responsibility_opp = if_else(responsibilitySV < 0, 1, 0)) %>%
  mutate(insulting_opp = if_else(insultingSV < 0, 1, 0)) %>%
  mutate(racism_opp = if_else(racismSV < 0, 1, 0)) %>%
  mutate(criticizing_opp = if_else(criticizingSV < 0, 1, 0)) %>%
  mutate(violence_opp = if_else(violenceSV < 0, 1, 0)) %>%
  mutate(speeding_opp = if_else(speedingSV < 0, 1, 0)) %>%
  mutate(pest_opp = if_else(pestSV < 0, 1, 0)) %>%
  mutate(lying_opp = if_else(lyingSV < 0, 1, 0)) %>%
  mutate(gossip_opp = if_else(gossipSV < 0, 1, 0)) %>%
  mutate(shoot_opp = if_else(shootSV < 0, 1, 0)) %>%
  mutate(cheating_opp = if_else(cheatingSV < 0, 1, 0)) %>%
  mutate(sexism_opp = if_else(sexismSV < 0, 1, 0))

# Create a variable per scenario that indicates if each participant chose the hypothesized agent or not (Close Other)
S3_co <- S3_co %>%
  mutate(theft_hyp = if_else(theftRV > 0, 1, 0)) %>%
  mutate(cakehoard_hyp = if_else(cakehoardRV > 0, 1, 0)) %>%
  mutate(smoking_hyp = if_else(smokingRV > 0, 1, 0)) %>%
  mutate(playbook_hyp = if_else(playbookRV > 0, 1, 0)) %>%
  mutate(officebonus_hyp = if_else(officebonusRV > 0, 1, 0)) %>%
  mutate(steroids_hyp = if_else(steroidsRV > 0, 1, 0)) %>%
  mutate(revenge_hyp = if_else(revengeRV > 0, 1, 0)) %>%
  mutate(envy_hyp = if_else(envyRV > 0, 1, 0)) %>%
  mutate(responsibility_hyp = if_else(responsibilityRV > 0, 1, 0)) %>%
  mutate(insulting_hyp = if_else(insultingRV > 0, 1, 0)) %>%
  mutate(racism_hyp = if_else(racismRV > 0, 1, 0)) %>%
  mutate(criticizing_hyp = if_else(criticizingRV > 0, 1, 0)) %>%
  mutate(violence_hyp = if_else(violenceRV > 0, 1, 0)) %>%
  mutate(speeding_hyp = if_else(speedingRV > 0, 1, 0)) %>%
  mutate(pest_hyp = if_else(pestRV > 0, 1, 0)) %>%
  mutate(lying_hyp = if_else(lyingRV > 0, 1, 0)) %>%
  mutate(gossip_hyp = if_else(gossipRV > 0, 1, 0)) %>%
  mutate(shoot_hyp = if_else(shootRV > 0, 1, 0)) %>%
  mutate(cheating_hyp = if_else(cheatingRV > 0, 1, 0)) %>%
  mutate(sexism_hyp = if_else(sexismRV > 0, 1, 0))

S3_co <- S3_co %>% # opposite
  mutate(theft_opp = if_else(theftRV < 0, 1, 0)) %>%
  mutate(cakehoard_opp = if_else(cakehoardRV < 0, 1, 0)) %>%
  mutate(smoking_opp = if_else(smokingRV < 0, 1, 0)) %>%
  mutate(playbook_opp = if_else(playbookRV < 0, 1, 0)) %>%
  mutate(officebonus_opp = if_else(officebonusRV < 0, 1, 0)) %>%
  mutate(steroids_opp = if_else(steroidsRV < 0, 1, 0)) %>%
  mutate(revenge_opp = if_else(revengeRV < 0, 1, 0)) %>%
  mutate(envy_opp = if_else(envyRV < 0, 1, 0)) %>%
  mutate(responsibility_opp = if_else(responsibilityRV < 0, 1, 0)) %>%
  mutate(insulting_opp = if_else(insultingRV < 0, 1, 0)) %>%
  mutate(racism_opp = if_else(racismRV < 0, 1, 0)) %>%
  mutate(criticizing_opp = if_else(criticizingRV < 0, 1, 0)) %>%
  mutate(violence_opp = if_else(violenceRV < 0, 1, 0)) %>%
  mutate(speeding_opp = if_else(speedingRV < 0, 1, 0)) %>%
  mutate(pest_opp = if_else(pestRV < 0, 1, 0)) %>%
  mutate(lying_opp = if_else(lyingRV < 0, 1, 0)) %>%
  mutate(gossip_opp = if_else(gossipRV < 0, 1, 0)) %>%
  mutate(shoot_opp = if_else(shootRV < 0, 1, 0)) %>%
  mutate(cheating_opp = if_else(cheatingRV < 0, 1, 0)) %>%
  mutate(sexism_opp = if_else(sexismRV < 0, 1, 0))

Group-Lvl Analyses

Simple Effects

For all t-tests, we conduct both one-tailed and two-tailed tests. Our pre-registration specified directional hypotheses which therefore ought to be analyzed with one-tailed tests. However, in order for readers to know any estimate’s uncertainty in both directions, we also conduct two-tailed tests to get relevant CIs.

Stranger Vignettes

# t-test using person-level averages across Stranger vignettes
S3_stranger_t <- t.test(S3$StrangerAverage, mu = 0, alternative = "greater") 
## 'greater' is for one-tailed p-value because of the non-tempted > tempted hypothesis
print(S3_stranger_t)

    One Sample t-test

data:  S3$StrangerAverage
t = 12.175, df = 224, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 0.8428247       Inf
sample estimates:
mean of x 
0.9751111 
S3_stranger_t_2side <- t.test(S3$StrangerAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(S3_stranger_t_2side)

    One Sample t-test

data:  S3$StrangerAverage
t = 12.175, df = 224, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.8172814 1.1329409
sample estimates:
mean of x 
0.9751111 
# returns cohen's d
effsize::cohen.d(S3$StrangerAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.8116613 (large)
Reference mu: 0
95 percent confidence interval:
    lower     upper 
0.5383086 1.0850140 

Close Other Vignettes

# t-test using person-level averages across Close Other vignettes
S3_closeother_t <- t.test(S3$CloseOtherAverage, mu = 0, alternative = "greater") 
## 'greater' is for one-tailed p-value because of the non-tempted > tempted hypothesis
print(S3_closeother_t)

    One Sample t-test

data:  S3$CloseOtherAverage
t = 13.978, df = 224, p-value < 0.00000000000000022
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
 0.9484665       Inf
sample estimates:
mean of x 
 1.075556 
S3_closeother_t_2side <- t.test(S3$CloseOtherAverage, mu = 0, alternative = "two.sided") 
## 'two.sided' is to get uncertainty estimates in both directions
print(S3_closeother_t_2side)

    One Sample t-test

data:  S3$CloseOtherAverage
t = 13.978, df = 224, p-value < 0.00000000000000022
alternative hypothesis: true mean is not equal to 0
95 percent confidence interval:
 0.9239267 1.2271844
sample estimates:
mean of x 
 1.075556 
# returns cohen's d
effsize::cohen.d(S3$CloseOtherAverage,
                 f = NA,
                 mu = 0,
                 data = data)

Cohen's d (single sample)

d estimate: 0.9318815 (large)
Reference mu: 0
95 percent confidence interval:
   lower    upper 
0.655240 1.208523 

Interaction

Repeated-Measures ANOVA

The purpose of this test is to determine whether there is a difference in mean virtuosity depending on condition (i.e., stranger vs close other).

# Prepare data by using pivot_longer on a new dataset
S3_anova <- S3 %>%
  dplyr::select(c(ResponseId, StrangerAverage, CloseOtherAverage))%>% 
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(StrangerAverage, CloseOtherAverage)),
               names_to = "Condition",
               values_to = "VirtuosityAverage")

# Repeated-Meausures ANOVA
S3_interaction_aov <- aov(VirtuosityAverage~Condition + Error(as.factor(ResponseId)), data = S3_anova)
summary(S3_interaction_aov)

Error: as.factor(ResponseId)
           Df Sum Sq Mean Sq F value Pr(>F)
Residuals 224    575   2.567               

Error: Within
           Df Sum Sq Mean Sq F value Pr(>F)  
Condition   1   1.14  1.1350   5.448 0.0205 *
Residuals 224  46.66  0.2083                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Paired-Samples t-Test

Replicates results of the repeated-measures ANOVA. These tests are statistically identical, but we conduct both in case researchers have preferences for one over the other.

S3_interaction_t <- t.test(VirtuosityAverage ~ Condition, data = S3_anova, alternative = "greater", paired = TRUE)
## 'less' is for one-tailed p-value because of the close other > stranger hypothesis
S3_interaction_t

    Paired t-test

data:  VirtuosityAverage by Condition
t = 2.3342, df = 224, p-value = 0.01024
alternative hypothesis: true mean difference is greater than 0
95 percent confidence interval:
 0.02936854        Inf
sample estimates:
mean difference 
      0.1004444 
S3_interaction_t_2side <- t.test(VirtuosityAverage ~ Condition, data = S3_anova, alternative = "two.sided", paired = TRUE) 
## 'two.sided' is to get uncertainty estimates in both directions
print(S3_interaction_t_2side)

    Paired t-test

data:  VirtuosityAverage by Condition
t = 2.3342, df = 224, p-value = 0.02047
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
 0.01564439 0.18524450
sample estimates:
mean difference 
      0.1004444 
# returns dz effect size and 95% CIs
effsize::cohen.d(VirtuosityAverage ~ Condition | Subject(ResponseId),
                 data = S3_anova %>% droplevels(), 
                 paired = T,
                 within = F)

Cohen's d

d estimate: 0.1556107 (negligible)
95 percent confidence interval:
    lower     upper 
0.0238017 0.2874197 
# returns d-av effect size and 95% CIs
effsize::cohen.d(VirtuosityAverage ~ Condition | Subject(ResponseId),
                 data = S3_anova %>% droplevels(), 
                 paired = T,
                 within = T)

Cohen's d

d estimate: 0.08507187 (negligible)
95 percent confidence interval:
     lower      upper 
0.01331514 0.15682860 

Person-Lvl Analyses

# create variables for whether hypotheses fit for each participant
S3 <- S3 %>%
  mutate(fits_stranger_hypothesis = if_else(StrangerAverage > 0, 1, 0)) %>%
  mutate(fits_closeother_hypothesis = if_else(CloseOtherAverage > 0, 1, 0)) %>%
  mutate(interaction = case_when(
    (CloseOtherAverage == 0 & StrangerAverage == 0) ~ "Zero, Zero, Zero",
    (CloseOtherAverage == 0 & StrangerAverage < 0) ~ "Zero, Neg, Pos",
    (CloseOtherAverage == 0 & StrangerAverage > 0) ~ "Zero, Pos, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage == 0) ~ "Neg, Zero, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage == StrangerAverage) ~ "Neg, Neg, Zero",
    (CloseOtherAverage < 0 &  StrangerAverage > 0) ~ "Neg, Pos, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage > StrangerAverage) ~ "Neg, Neg, Pos",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage < StrangerAverage) ~ "Neg, Neg, Neg",
    (CloseOtherAverage > 0 &  StrangerAverage == 0) ~ "Pos, Zero, Pos",
    (CloseOtherAverage > 0 &  StrangerAverage < 0) ~ "Pos, Neg, Pos",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage == StrangerAverage) ~ "Pos, Pos, Zero",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage < StrangerAverage) ~ "Pos, Pos, Neg",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage > StrangerAverage) ~ "Pos, Pos, Pos")) %>% # predicted pattern
  mutate(fits_interaction_hypothesis = if_else(interaction == "Pos, Pos, Pos", 1, 0))

Descriptive Pervasiveness

Stranger Vignettes

# How many participants fit hypothesis for Stranger vignettes
table(S3$fits_stranger_hypothesis) # 0 = no, 1 = yes

  0   1 
 50 175 

Close Other Vignettes

# How many participants fit hypothesis for Close Other vignettes
table(S3$fits_closeother_hypothesis) # 0 = no, 1 = yes

  0   1 
 42 183 

Interaction

# How many participants fit hypothesis for interaction (i.e., Stranger > 0, Close Other > 0, AND Close Other > Stranger)
table(S3$fits_interaction_hypothesis) # 0 = no, 1 = yes

  0   1 
138  87 

Randomization Test

This test is only possible for the complex interaction hypothesis, as randomly shuffling within-condition data would yield the same result across shufflings.

library(mosaic) # for randomly shuffling data

S3_random <- S3 %>% 
  dplyr::select(c(ResponseId, StrangerAverage, CloseOtherAverage))

S3_random <- S3_random %>% 
  mutate(interaction = case_when(
    (CloseOtherAverage == 0 & StrangerAverage == 0) ~ "Zero, Zero, Zero",
    (CloseOtherAverage == 0 & StrangerAverage < 0) ~ "Zero, Neg, Pos",
    (CloseOtherAverage == 0 & StrangerAverage > 0) ~ "Zero, Pos, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage == 0) ~ "Neg, Zero, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage == StrangerAverage) ~ "Neg, Neg, Zero",
    (CloseOtherAverage < 0 &  StrangerAverage > 0) ~ "Neg, Pos, Neg",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage > StrangerAverage) ~ "Neg, Neg, Pos",
    (CloseOtherAverage < 0 &  StrangerAverage < 0 & CloseOtherAverage < StrangerAverage) ~ "Neg, Neg, Neg",
    (CloseOtherAverage > 0 &  StrangerAverage == 0) ~ "Pos, Zero, Pos",
    (CloseOtherAverage > 0 &  StrangerAverage < 0) ~ "Pos, Neg, Pos",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage == StrangerAverage) ~ "Pos, Pos, Zero",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage < StrangerAverage) ~ "Pos, Pos, Neg",
    (CloseOtherAverage > 0 &  StrangerAverage > 0 & CloseOtherAverage > StrangerAverage) ~ "Pos, Pos, Pos"))

prop_S3 <- prop( ~ interaction == "Pos, Pos, Pos", data = S3_random) # create descriptive proportion of claimed pattern from Berman & Small
prop_S3_dp <- unname(prop_S3[1]) # get descriptive proportion proportion for interaction

nsim <- 1000 # number of random datasets to generate
nullprop_S3 <- rep(NA, nsim) # creating empty bin

for (i in 1:nsim) { # for loop to do random shuffling across nsim datasets and calculate proportions in those randomly shuffled datasets
  #permutation, size equal to number of observations for each condition
  S3_random$StrangerAverageR <- shuffle(S3_random$StrangerAverage) # shuffling Stranger values  
  S3_random$CloseOtherAverageR <- shuffle(S3_random$CloseOtherAverage) # shuffling CloseOther values
  
  ## Creating variable that distinguishes Ps who showed predicted (claimed) pattern from Ps who did not
  S3_R <- S3_random %>%
  mutate(interactionR = case_when(
    (CloseOtherAverageR == 0 & StrangerAverageR == 0) ~ "Zero, Zero, Zero",
    (CloseOtherAverageR == 0 & StrangerAverageR < 0) ~ "Zero, Neg, Pos",
    (CloseOtherAverageR == 0 & StrangerAverageR > 0) ~ "Zero, Pos, Neg",
    (CloseOtherAverageR < 0 &  StrangerAverageR == 0) ~ "Neg, Zero, Neg",
    (CloseOtherAverageR < 0 &  StrangerAverageR < 0 & CloseOtherAverageR == StrangerAverageR) ~ "Neg, Neg, Zero",
    (CloseOtherAverageR < 0 &  StrangerAverageR > 0) ~ "Neg, Pos, Neg",
    (CloseOtherAverageR < 0 &  StrangerAverageR < 0 & CloseOtherAverageR > StrangerAverageR) ~ "Neg, Neg, Pos",
    (CloseOtherAverageR < 0 &  StrangerAverageR < 0 & CloseOtherAverageR < StrangerAverageR) ~ "Neg, Neg, Neg",
    (CloseOtherAverageR > 0 &  StrangerAverageR == 0) ~ "Pos, Zero, Pos",
    (CloseOtherAverageR > 0 &  StrangerAverageR < 0) ~ "Pos, Neg, Pos",
    (CloseOtherAverageR > 0 &  StrangerAverageR > 0 & CloseOtherAverageR == StrangerAverageR) ~ "Pos, Pos, Zero",
    (CloseOtherAverageR > 0 &  StrangerAverageR > 0 & CloseOtherAverageR < StrangerAverageR) ~ "Pos, Pos, Neg",
    (CloseOtherAverageR > 0 &  StrangerAverageR > 0 & CloseOtherAverageR > StrangerAverageR) ~ "Pos, Pos, Pos"))

  
  nullprop_TF_S3 <-prop( ~ interactionR == "Pos, Pos, Pos", data = S3_R) # create proportion value of claimed direction 
  nullprop_S3[i]<- unname(nullprop_TF_S3[1]) # get claimed pattern proportion for randomly shuffled data and repeat for each nsim dataset
}

gf_histogram( ~ nullprop_S3, fill = ~ (nullprop_S3 >= prop_S3_dp)) # create histogram of how many randomly shuffled datasets lead to a prop value similar to or greater than empirical prop


#c(chance)-value for empirical proportion (similar to Grice's c-values computed in his OOM software)
prop( ~ nullprop_S3 >= prop_S3_dp) # suggests that empirical interaction proportion is extremely unlikely to have occurred by chance
prop_TRUE 
        0 

Frequentist Prevalence

# CREATE NECESSARY FREQUENTIST FUNCTION (code adapted from Donhauser et al.'s (2018) MATLAB code)

prevalence_test <- function(observed, alpha_ind=0.05, beta_ind=1, alpha_group=0.05, gamma_0=0.5) {
  
  # Inputs:
  # observed    = vector of p-values OR vector with two values, e.g., 'c(positive cases, total cases)'
  # alpha_ind   = alpha threshold for person-level tests, if 'observed' = vector of p-values (typically set to .05)
  # beta_ind    = sensitivity of person-level tests (probably set to 1.00)
  # alpha_group = see "outputs"
  # gamma_0     = null gamma value for empirical prevalence to be tested against (defaults to majority null)
  
  # Outputs:
  # p_null      = p-value for majority null or whatever null you specify in the gamma_0 argument (e.g., to specify a global null set "gamma_0 = 0") 
  # gamma_0     = highest gamma_0 value that can be rejected at threshold of 'alpha_group' given positive cases. Note this output is not the same as the input argument
  if(sum(observed > 1) == 0) {
    pvals <- observed
  } else {
    pvals <- c(rep(0, observed[1]), rep(1, observed[2]-observed[1]))
  }
  
  n <- length(pvals)
  k_obs <- sum(pvals < alpha_ind)
  kvals <- 0:n
  dgamma <- 0.001
  gammavals <- seq(0, 1, dgamma)
  
  p_k_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  p_kk_gamma <- matrix(0, nrow=length(gammavals), ncol=length(kvals))
  
  for(iGam in 1:length(gammavals)) {
    p_pos <- gammavals[iGam] * beta_ind + (1 - gammavals[iGam]) * alpha_ind
    p_neg <- gammavals[iGam] * (1 - beta_ind) + (1 - gammavals[iGam]) * (1 - alpha_ind)
    for(iK in 1:length(kvals)) {
      k <- kvals[iK]
      tmp <- choose(n, k) * p_pos^k * p_neg^(n - k)
      p_k_gamma[iGam, iK] <- tmp
      p_kk_gamma[iGam, iK] <- 1 - sum(p_k_gamma[iGam, 1:iK]) + tmp
    }
  }
  
  iK <- which(kvals == k_obs)
  p_null <- p_kk_gamma[which(gammavals == gamma_0), iK]
  
  index <- sum(p_kk_gamma[, iK] < alpha_group)
  if(index != 0) {
    gamma_0 <- gammavals[index]
  } else {
    gamma_0 <- 0
  }
  
  return(list(p_null=p_null, gamma_0=gamma_0, p_kk_gamma=p_kk_gamma, gammavals=gammavals, p_k_gamma=p_k_gamma))
}

Stranger Vignettes


k <- 175  # number of persons matching hypothesized / group-level pattern
n <- 175+50 # total N
stranger_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
stranger_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.00000000000001045501

Close Other Vignettes


k <- 183  # number of persons matching hypothesized / group-level pattern
n <- 183+42 # total N
closeother_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
closeother_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.000000000000006550436

Interaction


k <- 87  # number of persons matching hypothesized / group-level pattern
n <- 87+138 # total N
interaction_freqPrevalence <- prevalence_test(c(k, n)) # specify positive cases out of total cases for prev test function
interaction_freqPrevalence$p_null # print p-value testing against majority null
[1] 0.9999883

Bayesian Prevalence

# CREATE NECESSARY BAYES FUNCTIONS (code from Ince et al., 2021)
library(nleqslv)

bayesprev_map <- function(k, n, a=0.05, b=1) {
  # Bayesian maximum a posteriori estimate of population prevalence gamma
  # under a uniform prior
  # 
  # Args:
  #  k: number of participants/tests significant out of 
  #  n: total number of participants/tests
  #  a: alpha value of within-participant test (default=0.05)
  #  b: sensitivity/beta of within-participant test (default=1)
  
  gm <- (k/n -a)/(b-a)
  if(gm <0) gm <- 0
  if(gm>1) gm <- 1
  return(gm)
} 

bayesprev_posterior <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior of population prevalence gamma under a uniform prior
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior density
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  theta <- a + (b-a)*x
  post <- (b -a)*dbeta(theta,m1, m2)
  post <- post/(pbeta(b, m1, m2) - pbeta(a, m1, m2))
  return(post)
}


bayesprev_bound <- function(p, k, n, a=0.05, b=1) {
  # Bayesian lower bound of population prevalence gamma under a uniform prior
  #
  # Args:
  #  p : density the lower bound should bound (e.g. 0.95)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <-  k + 1
  m2 <- n - k + 1
  th_c <- qbeta( p*pbeta(a, m1, m2) + (1-p)*pbeta(b, m1, m2), m1, m2 )
  g_c <- (th_c -a)/(b-a)
  return(g_c)
}


bayesprev_hpdi <- function(p, k, n, a=0.05, b=1) {
  # Bayesian highest posterior density interval of population prevalence gamma
  # under a uniform prior
  #
  # Args:
  #  p : HPDI to return (e.g. 0.95 for 95%)
  #  k : number of participants significant out of 
  #  n : total number of participants
  #  a : alpha value of within-participant test (default=0.05)
  #  b : sensitivity/beta of within-participant test (default=1)
  
  m1 <- k+1
  m2 <- n-k+1
  
  if(m1 ==1) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(m2 ==1) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  if(k<= n*a) {
    endpts <- c(a, qbeta( (1 -p)*pbeta(a, m1, m2) + p*pbeta(b, m1, m2), m1, m2 ) ) 
    return((endpts -a)/(b-a))
  }
  
  if(k>= n*b) {
    endpts <- c( qbeta( p*pbeta(a, m1, m2) + (1- p)* pbeta(b, m1, m2), m1, m2 ) , b) 
    return( (endpts-a)/(b-a))
  }
  
  
  g <- function(x, m1, m2, a, b, p ) {
    y <- numeric(2)
    y[1] <-  pbeta(x[2], m1, m2) - pbeta(x[1], m1, m2) - p*(pbeta(b, m1, m2) - pbeta(a, m1, m2))
    y[2] <- log(dbeta(x[2], m1, m2)) - log(dbeta(x[1], m1, m2))
    return(y)
  }
  
  x_init <- numeric(2)
  
  p1 <- (1-p)/2 
  p2 <- (1 +p)/2
  
  x_init[1] <- qbeta( (1 -p1)*pbeta(a, m1, m2) + p1* pbeta(b, m1, m2), m1, m2 )
  x_init[2] <- qbeta( (1 -p2)*pbeta(a, m1, m2) + p2* pbeta(b, m1, m2), m1, m2 )
  
  opt <- nleqslv(x_init, g, method ="Newton", control=list(maxit=1000), m1=m1, m2=m2, a=a, b=b, p=p)
  
  if (opt$termcd ==1)  print("convergence achieved") 
  if (opt$termcd != 1)  print("failed to converge") 
  
  temp <- opt$x
  if (temp[1] <a) {
    temp[1] <- a
    temp[2] <- qbeta( (1 -p)*pbeta(a, m1, m2) + p* pbeta(b, m1, m2), m1, m2 )
  }
  if (temp[2] > b) {
    temp[1] <- qbeta( p*pbeta(a, m1, m2) + (1-p)* pbeta(b, m1, m2), m1, m2 )
    temp[2] <- b
  }
  endpts <- (temp -a)/(b-a)
  return(endpts) 
}


bayesprev_posteriorprob <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior probability in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : values of gamma at which to evaluate the posterior probability
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  return(p)
  
}

bayesprev_posteriorlogodds <- function(x, k, n, a=0.05, b=1) {
  # Bayesian posterior log-odds in favour of the population prevalence gamma being greater than x
  #
  # Args:
  # x : log-odds threshold
  # k : number of participants significant out of 
  # n : total number of participants
  # a : alpha value of within-participant test (default=0.05)
  # b : sensitivity/beta of within-participant test (default=1)
  
  theta <- a + (b-a)*x
  m1 <-  k + 1
  m2 <- n - k + 1
  p <- (pbeta(b,m1,m2)-pbeta(theta,m1,m2)) / (pbeta(b,m1,m2)-pbeta(a,m1,m2))
  lo<- log(p / (1 - p))
  return(lo)
  
}

Stranger Vignettes


k <- 175  # number of persons matching hypothesized / group-level pattern
n <- 175+50 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.7029325 0.7660819 0.8220047
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 1
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1

Close Other Vignettes


k <- 183  # number of persons matching hypothesized / group-level pattern
n <- 183+42 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.7435925 0.8035088 0.8552701
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 1
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1

Interaction


k <- 87  # number of persons matching hypothesized / group-level pattern
n <- 87+138 # total N
x <- 0.50 # minority cut-off of population prevalence gamma for Bayesian posterior probability
x_0 <- 0.00 # global null of population prevalence gamma for Bayesian posterior probability
map = bayesprev_map(k, n) # get maximum a posteriori (MAP) estimate (i.e., the likeliest person-level prevalence population value)
int = bayesprev_hpdi(0.96, k, n) # get 96% HPDIs
[1] "convergence achieved"
i1 = int[1] # get lower 96% HPDI
i2 = int[2] # get upper 96% HPDI
print(c(i1, map ,i2)) # print lower 96 HPDI, map estimate, and upper 96 HPDI
[1] 0.2862171 0.3543860 0.4255007
bayesprev_posteriorprob(x, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x
[1] 0.00001617156
bayesprev_posteriorprob(x_0, k, n) # Bayesian posterior probability in favor of population prevalence being greater than x_0
[1] 1

Primary Plots

# re-organize data to plot vignette-by-vignette variability

# stranger vignettes
S3_vignettes_s <- S3_s %>% 
  select(c(ResponseId,
           theft_hyp, cakehoard_hyp, smoking_hyp, playbook_hyp, officebonus_hyp, 
           steroids_hyp, revenge_hyp, envy_hyp, responsibility_hyp, insulting_hyp,
           racism_hyp, criticizing_hyp, violence_hyp, speeding_hyp, pest_hyp,
           lying_hyp, gossip_hyp, shoot_hyp, cheating_hyp, sexism_hyp,
           theft_opp, cakehoard_opp, smoking_opp, playbook_opp, officebonus_opp, 
           steroids_opp, revenge_opp, envy_opp, responsibility_opp, insulting_opp,
           racism_opp, criticizing_opp, violence_opp, speeding_opp, pest_opp,
           lying_opp, gossip_opp, shoot_opp, cheating_opp, sexism_opp)) %>% 
    mutate(theft = case_when(
    theft_hyp == 1 ~ "Yes",
    theft_opp == 1 ~ "No - Opposite",
    (theft_hyp == 0 & theft_opp == 0) ~ "No - Equal")) %>%
    mutate(cakehoard = case_when(
    cakehoard_hyp == 1 ~ "Yes",
    cakehoard_opp == 1 ~ "No - Opposite",
    (cakehoard_hyp == 0 & cakehoard_opp == 0) ~ "No - Equal")) %>%
    mutate(smoking = case_when(
    smoking_hyp == 1 ~ "Yes",
    smoking_opp == 1 ~ "No - Opposite",
    (smoking_hyp == 0 & smoking_opp == 0) ~ "No - Equal")) %>%
    mutate(playbook = case_when(
    playbook_hyp == 1 ~ "Yes",
    playbook_opp == 1 ~ "No - Opposite",
    (playbook_hyp == 0 & playbook_opp == 0) ~ "No - Equal")) %>%
    mutate(bonus = case_when(
    officebonus_hyp == 1 ~ "Yes",
    officebonus_opp == 1 ~ "No - Opposite",
    (officebonus_hyp == 0 & officebonus_opp == 0) ~ "No - Equal")) %>%
    mutate(steroids = case_when(
    steroids_hyp == 1 ~ "Yes",
    steroids_opp == 1 ~ "No - Opposite",
    (steroids_hyp == 0 & steroids_opp == 0) ~ "No - Equal")) %>%
    mutate(revenge = case_when(
    revenge_hyp == 1 ~ "Yes",
    revenge_opp == 1 ~ "No - Opposite",
    (revenge_hyp == 0 & revenge_opp == 0) ~ "No - Equal")) %>%
    mutate(envy = case_when(
    envy_hyp == 1 ~ "Yes",
    envy_opp == 1 ~ "No - Opposite",
    (envy_hyp == 0 & envy_opp == 0) ~ "No - Equal")) %>%
  mutate(responsibility = case_when(
    responsibility_hyp == 1 ~ "Yes",
    responsibility_opp == 1 ~ "No - Opposite",
    (responsibility_hyp == 0 & responsibility_opp == 0) ~ "No - Equal")) %>%
  mutate(insulting = case_when(
    insulting_hyp == 1 ~ "Yes",
    insulting_opp == 1 ~ "No - Opposite",
    (insulting_hyp == 0 & insulting_opp == 0) ~ "No - Equal")) %>%
  mutate(racism = case_when(
    racism_hyp == 1 ~ "Yes",
    racism_opp == 1 ~ "No - Opposite",
    (racism_hyp == 0 & racism_opp == 0) ~ "No - Equal")) %>%
  mutate(criticizing = case_when(
    criticizing_hyp == 1 ~ "Yes",
    criticizing_opp == 1 ~ "No - Opposite",
    (criticizing_hyp == 0 & criticizing_opp == 0) ~ "No - Equal")) %>%
    mutate(violence = case_when(
    violence_hyp == 1 ~ "Yes",
    violence_opp == 1 ~ "No - Opposite",
    (violence_hyp == 0 & violence_opp == 0) ~ "No - Equal")) %>%
  mutate(speeding = case_when(
    speeding_hyp == 1 ~ "Yes",
    speeding_opp == 1 ~ "No - Opposite",
    (speeding_hyp == 0 & speeding_opp == 0) ~ "No - Equal")) %>%
  mutate(pest = case_when(
    pest_hyp == 1 ~ "Yes",
    pest_opp == 1 ~ "No - Opposite",
    (pest_hyp == 0 & pest_opp == 0) ~ "No - Equal")) %>%
  mutate(lying = case_when(
    lying_hyp == 1 ~ "Yes",
    lying_opp == 1 ~ "No - Opposite",
    (lying_hyp == 0 & lying_opp == 0) ~ "No - Equal")) %>%
  mutate(gossip = case_when(
    gossip_hyp == 1 ~ "Yes",
    gossip_opp == 1 ~ "No - Opposite",
    (gossip_hyp == 0 & gossip_opp == 0) ~ "No - Equal")) %>%
  mutate(shoot = case_when(
    shoot_hyp == 1 ~ "Yes",
    shoot_opp == 1 ~ "No - Opposite",
    (shoot_hyp == 0 & shoot_opp == 0) ~ "No - Equal")) %>%
  mutate(cheating = case_when(
    cheating_hyp == 1 ~ "Yes",
    cheating_opp == 1 ~ "No - Opposite",
    (cheating_hyp == 0 & cheating_opp == 0) ~ "No - Equal")) %>%
  mutate(sexism = case_when(
    sexism_hyp == 1 ~ "Yes",
    sexism_opp == 1 ~ "No - Opposite",
    (sexism_hyp == 0 & sexism_opp == 0) ~ "No - Equal")) %>%
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(theft, cakehoard, smoking, playbook, bonus,
                         steroids,revenge, envy, responsibility,
                         insulting, racism, criticizing,violence,
                         speeding, pest, lying, gossip, shoot,
                         cheating,sexism)),
               names_to = "vignette_name",
               values_to = "fits_hyp") %>%
  drop_na(fits_hyp)

stranger_labs <- c("Theft", "Cake Hoarding", "Smoking", "Playbook", "Bonus", "Steroids", "Revenge",
                   "Envy", "Responsibility","Insulting", "Racism", "Criticizing", "Violence", "Speeding",
                   "Pest", "Lying", "Gossip", "Shooting", "Cheating","Sexism")
names(stranger_labs) <- c("theft", "cakehoard", "smoking", "playbook",
                          "bonus","steroids", "revenge", "envy",
                          "responsibility", "insulting","racism",
                          "criticizing","violence", "speeding", "pest",
                          "lying", "gossip", "shoot","cheating",
                          "sexism")

# close other vignettes
S3_vignettes_co <- S3_co %>% 
  select(c(ResponseId,
           theft_hyp, cakehoard_hyp, smoking_hyp, playbook_hyp, officebonus_hyp, 
           steroids_hyp, revenge_hyp, envy_hyp, responsibility_hyp, insulting_hyp,
           racism_hyp, criticizing_hyp, violence_hyp, speeding_hyp, pest_hyp,
           lying_hyp, gossip_hyp, shoot_hyp, cheating_hyp, sexism_hyp,
           theft_opp, cakehoard_opp, smoking_opp, playbook_opp, officebonus_opp, 
           steroids_opp, revenge_opp, envy_opp, responsibility_opp, insulting_opp,
           racism_opp, criticizing_opp, violence_opp, speeding_opp, pest_opp,
           lying_opp, gossip_opp, shoot_opp, cheating_opp, sexism_opp)) %>% 
    mutate(theft = case_when(
    theft_hyp == 1 ~ "Yes",
    theft_opp == 1 ~ "No - Opposite",
    (theft_hyp == 0 & theft_opp == 0) ~ "No - Equal")) %>%
    mutate(cakehoard = case_when(
    cakehoard_hyp == 1 ~ "Yes",
    cakehoard_opp == 1 ~ "No - Opposite",
    (cakehoard_hyp == 0 & cakehoard_opp == 0) ~ "No - Equal")) %>%
    mutate(smoking = case_when(
    smoking_hyp == 1 ~ "Yes",
    smoking_opp == 1 ~ "No - Opposite",
    (smoking_hyp == 0 & smoking_opp == 0) ~ "No - Equal")) %>%
    mutate(playbook = case_when(
    playbook_hyp == 1 ~ "Yes",
    playbook_opp == 1 ~ "No - Opposite",
    (playbook_hyp == 0 & playbook_opp == 0) ~ "No - Equal")) %>%
    mutate(bonus = case_when(
    officebonus_hyp == 1 ~ "Yes",
    officebonus_opp == 1 ~ "No - Opposite",
    (officebonus_hyp == 0 & officebonus_opp == 0) ~ "No - Equal")) %>%
    mutate(steroids = case_when(
    steroids_hyp == 1 ~ "Yes",
    steroids_opp == 1 ~ "No - Opposite",
    (steroids_hyp == 0 & steroids_opp == 0) ~ "No - Equal")) %>%
    mutate(revenge = case_when(
    revenge_hyp == 1 ~ "Yes",
    revenge_opp == 1 ~ "No - Opposite",
    (revenge_hyp == 0 & revenge_opp == 0) ~ "No - Equal")) %>%
    mutate(envy = case_when(
    envy_hyp == 1 ~ "Yes",
    envy_opp == 1 ~ "No - Opposite",
    (envy_hyp == 0 & envy_opp == 0) ~ "No - Equal")) %>%
  mutate(responsibility = case_when(
    responsibility_hyp == 1 ~ "Yes",
    responsibility_opp == 1 ~ "No - Opposite",
    (responsibility_hyp == 0 & responsibility_opp == 0) ~ "No - Equal")) %>%
  mutate(insulting = case_when(
    insulting_hyp == 1 ~ "Yes",
    insulting_opp == 1 ~ "No - Opposite",
    (insulting_hyp == 0 & insulting_opp == 0) ~ "No - Equal")) %>%
  mutate(racism = case_when(
    racism_hyp == 1 ~ "Yes",
    racism_opp == 1 ~ "No - Opposite",
    (racism_hyp == 0 & racism_opp == 0) ~ "No - Equal")) %>%
  mutate(criticizing = case_when(
    criticizing_hyp == 1 ~ "Yes",
    criticizing_opp == 1 ~ "No - Opposite",
    (criticizing_hyp == 0 & criticizing_opp == 0) ~ "No - Equal")) %>%
    mutate(violence = case_when(
    violence_hyp == 1 ~ "Yes",
    violence_opp == 1 ~ "No - Opposite",
    (violence_hyp == 0 & violence_opp == 0) ~ "No - Equal")) %>%
  mutate(speeding = case_when(
    speeding_hyp == 1 ~ "Yes",
    speeding_opp == 1 ~ "No - Opposite",
    (speeding_hyp == 0 & speeding_opp == 0) ~ "No - Equal")) %>%
  mutate(pest = case_when(
    pest_hyp == 1 ~ "Yes",
    pest_opp == 1 ~ "No - Opposite",
    (pest_hyp == 0 & pest_opp == 0) ~ "No - Equal")) %>%
  mutate(lying = case_when(
    lying_hyp == 1 ~ "Yes",
    lying_opp == 1 ~ "No - Opposite",
    (lying_hyp == 0 & lying_opp == 0) ~ "No - Equal")) %>%
  mutate(gossip = case_when(
    gossip_hyp == 1 ~ "Yes",
    gossip_opp == 1 ~ "No - Opposite",
    (gossip_hyp == 0 & gossip_opp == 0) ~ "No - Equal")) %>%
  mutate(shoot = case_when(
    shoot_hyp == 1 ~ "Yes",
    shoot_opp == 1 ~ "No - Opposite",
    (shoot_hyp == 0 & shoot_opp == 0) ~ "No - Equal")) %>%
  mutate(cheating = case_when(
    cheating_hyp == 1 ~ "Yes",
    cheating_opp == 1 ~ "No - Opposite",
    (cheating_hyp == 0 & cheating_opp == 0) ~ "No - Equal")) %>%
  mutate(sexism = case_when(
    sexism_hyp == 1 ~ "Yes",
    sexism_opp == 1 ~ "No - Opposite",
    (sexism_hyp == 0 & sexism_opp == 0) ~ "No - Equal")) %>%
  group_by(ResponseId) %>%
  pivot_longer(cols = (c(theft, cakehoard, smoking, playbook, bonus,
                         steroids,revenge, envy, responsibility,
                         insulting, racism, criticizing,violence,
                         speeding, pest, lying, gossip, shoot,
                         cheating,sexism)),
               names_to = "vignette_name",
               values_to = "fits_hyp") %>%
  drop_na(fits_hyp)

closeother_labs <- c("Theft", "Cake Hoarding", "Smoking", "Playbook", "Bonus", "Steroids", "Revenge",
                   "Envy", "Responsibility","Insulting", "Racism", "Criticizing", "Violence", "Speeding",
                   "Pest", "Lying", "Gossip", "Shooting", "Cheating","Sexism")
names(closeother_labs) <- c("theft", "cakehoard", "smoking", "playbook",
                          "bonus","steroids", "revenge", "envy",
                          "responsibility", "insulting","racism",
                          "criticizing","violence", "speeding", "pest",
                          "lying", "gossip", "shoot","cheating",
                          "sexism")

Stranger Vignettes

print(S3_s_vigplot <- ggplot(S3_vignettes_s, 
                               aes(x = as.character(fits_hyp), 
                                  fill = as.character(fits_hyp))) +
  geom_bar() +
  scale_fill_manual(values = c("grey30","#8b1616", "#CEA335"), name = "Fits Hypothesis")+
  scale_y_continuous(limits = c(-0.1,100.1), breaks = c(0, 20, 40, 60, 80, 100)) +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~ vignette_name, ncol = 5, labeller = labeller(vignette_name = stranger_labs)) +
  theme(axis.title.x = element_blank(), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_blank(), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S3_s_vigplot.png")
Saving 14.1 x 9.04 in image

Close Other Vignettes

print(S3_co_vigplot <- ggplot(S3_vignettes_co, 
                               aes(x = as.character(fits_hyp), 
                                  fill = as.character(fits_hyp))) +
  geom_bar() +
  scale_fill_manual(values = c("grey30","#8b1616", "#CEA335"), name = "Fits Hypothesis")+
  scale_y_continuous(limits = c(-0.1,100.1), breaks = c(0, 20, 40, 60, 80, 100)) +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~ vignette_name, ncol = 5, labeller = labeller(vignette_name = closeother_labs)) +
  theme(axis.title.x = element_blank(), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_blank(), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 16),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S3_co_vigplot.png")
Saving 14.1 x 9.04 in image

Interaction

# Create a variable that determines which pattern out of every possible combination of results a particular participant followed 
S3 <- S3 %>%
  mutate("Interaction" = case_when(
    (CloseOtherAverage == 0 & StrangerAverage == 0) ~ "Zero, Zero, Zero",
    (CloseOtherAverage == 0 & StrangerAverage < 0) ~ "Zero, Neg, Pos",
    (CloseOtherAverage == 0 & StrangerAverage > 0) ~ "Zero, Pos, Neg",
    (CloseOtherAverage < 0 & StrangerAverage == 0) ~ "Neg, Zero, Neg",
    (CloseOtherAverage < 0 & StrangerAverage < 0 & CloseOtherAverage == StrangerAverage) ~ "Neg, Neg, Zero",
    (CloseOtherAverage < 0 & StrangerAverage > 0) ~ "Neg, Pos, Neg",
    (CloseOtherAverage < 0 & StrangerAverage < 0 & CloseOtherAverage > StrangerAverage) ~ "Neg, Neg, Pos",
    (CloseOtherAverage < 0 & StrangerAverage < 0 & CloseOtherAverage < StrangerAverage) ~ "Neg, Neg, Neg",
    (CloseOtherAverage > 0 & StrangerAverage == 0) ~ "Pos, Zero, Pos",
    (CloseOtherAverage > 0 & StrangerAverage < 0) ~ "Pos, Neg, Pos", 
    (CloseOtherAverage > 0 & StrangerAverage > 0 & CloseOtherAverage == StrangerAverage) ~ "Pos, Pos, Zero",
    (CloseOtherAverage > 0 & StrangerAverage > 0 & CloseOtherAverage < StrangerAverage) ~ "Pos, Pos, Neg",
    (CloseOtherAverage > 0 & StrangerAverage > 0 & CloseOtherAverage > StrangerAverage) ~ "Pos, Pos, Pos"))

# define levels
factor_levels <- c("Neg, Neg, Neg",
                   "Neg, Neg, Pos",
                   "Neg, Neg, Zero",
                   "Neg, Pos, Neg",
                   "Neg, Zero, Neg",
                   "Pos, Neg, Pos",
                   "Pos, Pos, Neg",
                   "Pos, Pos, Pos", # predicted pattern
                   "Pos, Pos, Zero",
                   "Pos, Zero, Pos",
                   "Zero, Neg, Pos",
                   "Zero, Pos, Neg",
                   "Zero, Zero, Zero")

# make variable a factor
S3$Interaction <- factor(S3$Interaction, levels = factor_levels)
# Visualize the frequency of every pattern
print(S3_int_plot <- ggplot(data = S3, aes(x = Interaction, fill = Interaction)) +
  geom_bar(position = "dodge", size = 0.5) +
        coord_cartesian(ylim = c(-0.5, 100.5)) +
        scale_x_discrete(drop = FALSE) +
        scale_fill_manual(drop = FALSE, values = c(
                                     "lightgrey", 
                                     "azure4",
                                     "lightgrey",
                                     "lightgrey",
                                     "lightgrey",
                                     "azure4", 
                                     "lightgrey",
                                     "black", # group-level pattern based on factor_levels,
                                     "lightgrey",
                                     "azure4", 
                                     "azure4", 
                                     "lightgrey",
                                     "lightgrey")) +
        theme_classic() +
        theme(legend.position = "none") + 
        xlab("\nInteraction Pattern (Stranger Judgment, Close Other Judgment, Close Other - Stranger)") +
        ylab("Participant Count\n") +  
        theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 20),
              axis.text.x = element_text(color = "black", size = 14, angle = 60, vjust = 0.5, hjust=0.5),
              axis.text.y = element_text(color = "black", size = 18),
              strip.text.x = element_text(color = "black", size = 20),
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))


ggsave("S3_int_plot.png")
Saving 14.1 x 9.04 in image

Robustness Plots

Here, we investigate the number of participants matching predicted effects by demographics in order to catalog the generality (or lack thereof) of these effects across levels of various the demographics that we collected.

# create yes/no variable for simple hypotheses
S3_s <- S3_s %>%
  mutate(fits_hyp = if_else(StrangerAverage > 0, "Yes", "No"))

# create yes/no variable for simple hypotheses
S3_co <- S3_co %>%
  mutate(fits_hyp = if_else(CloseOtherAverage > 0, "Yes", "No"))

# create yes/no variable for interaction hypothesis
S3 <- S3 %>%
  mutate(fits_hyp = if_else(Interaction == "Pos, Pos, Pos", "Yes", "No"))

Education

Stranger Vignettes

print(S3_s_educ <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_educ <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_educ <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Education) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Political Party

Stranger Vignettes

print(S3_s_pol <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~PoliticalParty) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_pol <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~PoliticalParty) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_pol <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~PoliticalParty) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Religiosity

Stranger Vignettes

print(S3_s_relig <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_relig <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_relig <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Religiosity) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Urban vs Rural

Stranger Vignettes

print(S3_s_urb <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~LivingArea) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_urb <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~LivingArea) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_urb <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~LivingArea) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Gender

Stranger Vignettes

print(S3_s_gender <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_gender <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_gender <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Gender) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Race

# make race one variable
S3_s <- S3_s %>%
  mutate(Race = coalesce(`Race/Ethnicity_1`, `Race/Ethnicity_2`, `Race/Ethnicity_3`, `Race/Ethnicity_4`, 
                         `Race/Ethnicity_5`, `Race/Ethnicity_6`, `Race/Ethnicity_7`, `Race/Ethnicity_8`))

S3_co <- S3_co %>%
  mutate(Race = coalesce(`Race/Ethnicity_1`, `Race/Ethnicity_2`, `Race/Ethnicity_3`, `Race/Ethnicity_4`, 
                         `Race/Ethnicity_5`, `Race/Ethnicity_6`, `Race/Ethnicity_7`, `Race/Ethnicity_8`))

S3 <- S3 %>%
  mutate(Race = coalesce(`Race/Ethnicity_1`, `Race/Ethnicity_2`, `Race/Ethnicity_3`, `Race/Ethnicity_4`, 
                         `Race/Ethnicity_5`, `Race/Ethnicity_6`, `Race/Ethnicity_7`, `Race/Ethnicity_8`))

Stranger Vignettes

print(S3_s_race <- ggplot(S3_s, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Close Other Vignettes

print(S3_co_race <- ggplot(S3_co, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

Interaction

print(S3_race <- ggplot(S3, aes(x = fits_hyp)) +
  geom_bar(fill = "grey30") +
  xlab("\nMatched Predicted Interaction Pattern") +
  ylab("Number of Participants\n") +
  theme_classic() +
  facet_wrap(~Race) +
  theme(axis.title.x = element_text(size = 18), 
              axis.title.y = element_text(size = 18),
              axis.text.x = element_text(color = "black", size = 16), 
              axis.text.y = element_text(color = "black", size = 16),
              strip.text.x = element_text(color = "black", size = 12),
              legend.position = "right",
              legend.title = element_text(color = "black", size = 18),
              legend.text = element_text(color = "black", size = 16)))

LS0tDQp0aXRsZTogIlN0dWR5IDM6IEV4dGVuc2lvbiB3LyBQYXJ0aWNpcGFudC1HZW5lcmF0ZWQgU3RpbXVsaSAmIFJlbGF0aW9uc2hpcCBDb250ZXh0Ig0KYXV0aG9yOiAiSGVsZW4gUGFkaWxsYSBGb25nICYgUnlhbiBNLiBNY01hbnVzIg0KZGF0ZTogJ2ByIGZvcm1hdChTeXMudGltZSgpLCAiJUIgJWQsICVZIilgJw0Kb3V0cHV0OiANCiAgaHRtbF9ub3RlYm9vazoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogICAgdGhlbWU6IGRhcmtseQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA1DQogICAgdG9jX2Zsb2F0OiB5ZXMNCi0tLQ0KDQojIERhdGEgUHJlcGFyYXRpb24gey50YWJzZXR9DQoNCkluIHRoaXMgcHJlLXJlZ2lzdGVyZWQgc3R1ZHksIHdlIGNvbGxlY3RlZCBkYXRhIGZyb20gMzAwIHBhcnRpY2lwYW50cy4gQWZ0ZXIgZXhsdWRpbmcgZHVwbGljYXRlIElQIGFkZHJlc3NlcyBhbmQgcGFydGljaXBhbnRzIHdobyBmYWlsZWQgYXR0ZW50aW9uIGNoZWNrcywgd2Ugb2J0YWluZWQgYW4gYW5hbHl6YWJsZSBzYW1wbGUgb2YgMjI1IHBhcnRpY2lwYW50cy4NCg0KIyMgTG9hZGluZyBQYWNrYWdlcw0KDQpCZWZvcmUgcnVubmluZyB0aGlzIGNodW5rLCBwbGVhc2UgbG9hZCAiU3R1ZHkgMy5jc3YiIGludG8gdGhlIFIgZW52aXJvbm1lbnQuDQoNCmBgYHtyfQ0KIyBwYWNrYWdlcyBzaG91bGQgYmUgbG9hZGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgdG8gYXZvaWQgZnVuY3Rpb24gY29uZmxpY3RzDQpvcHRpb25zKHNjaXBlbiA9IDk5KSAjIHR1cm5zIG9mZiBzY2llbnRpZmljIG5vdGF0aW9uDQpsaWJyYXJ5KHBzeWNoKSAjIGZvciBkZXNjcmliaW5nIGRhdGENCmxpYnJhcnkoZWZmc2l6ZSkgIyBmb3IgbWVhbiBkaWZmZXJlbmNlIGVmZmVjdCBzaXplcw0KbGlicmFyeShzanN0YXRzKSAjIGZvciBldGEtc3F1YXJlZCBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoY29ycmVsYXRpb24pICMgZm9yIGNsZWFuZXIgY29ycmVsYXRpb24gdGVzdCBvdXRwdXQNCmxpYnJhcnkocm1jb3JyKSAjIGZvciByZXBlYXRlZC1tZWFzdXJlcyBjb3JyZWxhdGlvbiB0ZXN0cw0KbGlicmFyeShjb2NvcikgIyBmb3IgY29tcGFyaW5nIGRlcGVuZGVudCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMNCmxpYnJhcnkodGlkeXZlcnNlKSAjIGZvciBkYXRhIG1hbmlwdWxhdGlvbiBhbmQgcGxvdHRpbmcNCmBgYA0KDQojIyBBdHRlbnRpb24gQ2hlY2sNCg0KUGFydGljaXBhbnRzIHdlcmUgaW5zdHJ1Y3RlZCB0byBzZWxlY3QgemVybyAoaS5lLiwgdGhlIG1pZGRsZSBvcHRpb24gaW4gdGhlIDktcG9pbnQgc2NhbGUpIGFzIHRoZWlyIHJlc3BvbnNlIGZvciB0aGUgcHJpbWFyeSB2aXJ0dW9zaXR5IG1lYXN1cmVzIHRoYXQgZm9sbG93ZWQgYSBtb2RpZmllZCBzY2VuYXJpby4gQWRkaXRpb25hbGx5LCB0aGV5IHdlcmUgaW5zdHJ1Y3RlZCB0byBzZWxlY3QgdGhlIG1pZGRsZSByZXNwb25zZSBvcHRpb24gZm9yIHR3byBleHBsb3JhdG9yeSBtZWFzdXJlcyAoaS5lLiwgbW9kZXJhdGVseSBiYWQgJiBtb2RlcmF0ZWx5IGNsZWFyKS4gSWYgYSBwYXJ0aWNpcGFudCBmYWlsZWQgdG8gc2VsZWN0IHRoZSBpbnN0cnVjdGVkIHJlc3BvbnNlIGZvciBhbnkgb2YgdGhlIHRocmVlIG1lYXN1cmVzLCB0aGV5IHdvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGFuYWx5c2VzLg0KDQpgYGB7cn0NClMzIDwtIFN0dWR5XzMgJT4lIA0KICBmaWx0ZXIoQXR0blZpcnR1b3NpdHkgPT0gIjAiICYgQXR0bkJhZCA9PSAiTW9kZXJhdGVseSBiYWQiICYgQXR0bkNsZWFyID09Ik1vZGVyYXRlbHkgY2xlYXIiKQ0KYGBgDQoNCiMjIFZhcmlhYmxlIENyZWF0aW9uDQoNCkhlcmUsIHdlIGNyZWF0ZSB0aGUgcmVsZXZhbnQgdmFyaWFibGVzIG5lY2Vzc2FyeSB0byBiZWdpbiBhbmFseXNlcyBmb3IgYm90aCB0aGUgIlN0cmFuZ2VyIiBhbmQgdGhlICJDbG9zZSBPdGhlcnMiIHZpZ25ldHRlcy4NCg0KYGBge3J9DQojIENyZWF0ZSBhIHZhcmlhYmxlIGZvciB2aXJ0dW9zaXR5IGF2ZXJhZ2UgaW4gInN0cmFuZ2VyIiBhbmQgImNsb3NlIG90aGVycyIgY29uZGl0aW9ucw0KUzM8LSBTMyAlPiUNCiAgbXV0YXRlX2F0KHZhcnModGhlZnRSViwgY2FrZWhvYXJkUlYsIHNtb2tpbmdSViwgcGxheWJvb2tSViwNCiAgICAgICAgICAgICAgICAgb2ZmaWNlYm9udXNSViwgc3Rlcm9pZHNSViwgcmV2ZW5nZVJWLCBlbnZ5UlYsDQogICAgICAgICAgICAgICAgIHJlc3BvbnNpYmlsaXR5UlYsIGluc3VsdGluZ1JWLCByYWNpc21SViwgY3JpdGljaXppbmdSViwNCiAgICAgICAgICAgICAgICAgdmlvbGVuY2VSViwgc3BlZWRpbmdSViwgcGVzdFJWLCBseWluZ1JWLCBnb3NzaXBSViwNCiAgICAgICAgICAgICAgICAgc2hvb3RSViwgY2hlYXRpbmdSViwgc2V4aXNtUlYsDQogICAgICAgICAgICAgICAgIHRoZWZ0U1YsIGNha2Vob2FyZFNWLCBzbW9raW5nU1YsIHBsYXlib29rU1YsDQogICAgICAgICAgICAgICAgIG9mZmljZWJvbnVzU1YsIHN0ZXJvaWRzU1YsIHJldmVuZ2VTViwgZW52eVNWLA0KICAgICAgICAgICAgICAgICByZXNwb25zaWJpbGl0eVNWLCBpbnN1bHRpbmdTViwgcmFjaXNtU1YsIGNyaXRpY2l6aW5nU1YsDQogICAgICAgICAgICAgICAgIHZpb2xlbmNlU1YsIHNwZWVkaW5nU1YsIHBlc3RTViwgbHlpbmdTViwgZ29zc2lwU1YsDQogICAgICAgICAgICAgICAgIHNob290U1YsIGNoZWF0aW5nU1YsIHNleGlzbVNWKSwgYXMubnVtZXJpYykNCg0KUzMkU3RyYW5nZXJBdmVyYWdlIDwtIHJvd01lYW5zKFMzWywgYygidGhlZnRTViIsICJjYWtlaG9hcmRTViIsICJzbW9raW5nU1YiLCAicGxheWJvb2tTViIsDQogICAgICAgICAgICAgIm9mZmljZWJvbnVzU1YiLCAic3Rlcm9pZHNTViIsICJyZXZlbmdlU1YiLCAiZW52eVNWIiwNCiAgICAgICAgICAgICAicmVzcG9uc2liaWxpdHlTViIsICJpbnN1bHRpbmdTViIsICJyYWNpc21TViIsICJjcml0aWNpemluZ1NWIiwNCiAgICAgICAgICAgICAidmlvbGVuY2VTViIsICJzcGVlZGluZ1NWIiwgInBlc3RTViIsICJseWluZ1NWIiwgImdvc3NpcFNWIiwNCiAgICAgICAgICAgICAic2hvb3RTViIsICJjaGVhdGluZ1NWIiwgInNleGlzbVNWIildLCBuYS5ybSA9IFQpICMgU1YgPSBTdHJhbmdlciBWaWduZXR0ZQ0KDQpTMyRDbG9zZU90aGVyQXZlcmFnZSA8LSByb3dNZWFucyhTM1ssIGMoInRoZWZ0UlYiLCAiY2FrZWhvYXJkUlYiLCAic21va2luZ1JWIiwgInBsYXlib29rUlYiLA0KICAgICAgICAgICAgICJvZmZpY2Vib251c1JWIiwgInN0ZXJvaWRzUlYiLCAicmV2ZW5nZVJWIiwgImVudnlSViIsDQogICAgICAgICAgICAgInJlc3BvbnNpYmlsaXR5UlYiLCAiaW5zdWx0aW5nUlYiLCAicmFjaXNtUlYiLCAiY3JpdGljaXppbmdSViIsDQogICAgICAgICAgICAgInZpb2xlbmNlUlYiLCAic3BlZWRpbmdSViIsICJwZXN0UlYiLCAibHlpbmdSViIsICJnb3NzaXBSViIsDQogICAgICAgICAgICAgInNob290UlYiLCAiY2hlYXRpbmdSViIsICJzZXhpc21SViIpXSwgbmEucm0gPSBUKSAjIFJWID0gUmVsYXRpb25zaGlwIFZpZ25ldHRlDQoNCiMgU2VwYXJhdGUgU3RyYW5nZXIgdmlydHVvc2l0eSBkYXRhIGZyb20gdGhlIG1haW4gZGF0YXNldCAoZm9yIGNlcnRhaW4gbGF0ZXIgYW5hbHlzZXMpDQpTM19zIDwtIFMzICU+JSAjIFNWID0gU3RyYW5nZXIgVmlnbmV0dGU7IFJWID0gUmVsYXRpb25zaGlwIFZpZ25ldHRlDQogIHNlbGVjdCAoLWMoInRoZWZ0UlYiLCAiY2FrZWhvYXJkUlYiLCAic21va2luZ1JWIiwgInBsYXlib29rUlYiLA0KICAgICAgICAgICAgICJvZmZpY2Vib251c1JWIiwgInN0ZXJvaWRzUlYiLCAicmV2ZW5nZVJWIiwgImVudnlSViIsDQogICAgICAgICAgICAgInJlc3BvbnNpYmlsaXR5UlYiLCAiaW5zdWx0aW5nUlYiLCAicmFjaXNtUlYiLCAiY3JpdGljaXppbmdSViIsDQogICAgICAgICAgICAgInZpb2xlbmNlUlYiLCAic3BlZWRpbmdSViIsICJwZXN0UlYiLCAibHlpbmdSViIsICJnb3NzaXBSViIsDQogICAgICAgICAgICAgInNob290UlYiLCAiY2hlYXRpbmdSViIsICJzZXhpc21SViIpKQ0KDQojIFNlcGFyYXRlIENsb3NlIE90aGVyIHZpcnR1b3NpdHkgZGF0YSBmcm9tIHRoZSBtYWluIGRhdGFzZXQgKGZvciBjZXJ0YWluIGxhdGVyIGFuYWx5c2VzKQ0KUzNfY28gPC0gUzMgJT4lICMgU1YgPSBTdHJhbmdlciBWaWduZXR0ZTsgUlYgPSBSZWxhdGlvbnNoaXAgVmlnbmV0dGUNCiAgc2VsZWN0ICgtYygidGhlZnRTViIsICJjYWtlaG9hcmRTViIsICJzbW9raW5nU1YiLCAicGxheWJvb2tTViIsDQogICAgICAgICAgICAgIm9mZmljZWJvbnVzU1YiLCAic3Rlcm9pZHNTViIsICJyZXZlbmdlU1YiLCAiZW52eVNWIiwNCiAgICAgICAgICAgICAicmVzcG9uc2liaWxpdHlTViIsICJpbnN1bHRpbmdTViIsICJyYWNpc21TViIsICJjcml0aWNpemluZ1NWIiwNCiAgICAgICAgICAgICAidmlvbGVuY2VTViIsICJzcGVlZGluZ1NWIiwgInBlc3RTViIsICJseWluZ1NWIiwgImdvc3NpcFNWIiwNCiAgICAgICAgICAgICAic2hvb3RTViIsICJjaGVhdGluZ1NWIiwgInNleGlzbVNWIikpDQoNCiMgQ3JlYXRlIGEgdmFyaWFibGUgcGVyIHNjZW5hcmlvIHRoYXQgaW5kaWNhdGVzIGlmIGVhY2ggcGFydGljaXBhbnQgY2hvc2UgdGhlIGh5cG90aGVzaXplZCBhZ2VudCBvciBub3QgKFN0cmFuZ2VyKQ0KUzNfcyA8LSBTM19zICU+JQ0KICBtdXRhdGUodGhlZnRfaHlwID0gaWZfZWxzZSh0aGVmdFNWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY2FrZWhvYXJkX2h5cCA9IGlmX2Vsc2UoY2FrZWhvYXJkU1YgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzbW9raW5nX2h5cCA9IGlmX2Vsc2Uoc21va2luZ1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocGxheWJvb2tfaHlwID0gaWZfZWxzZShwbGF5Ym9va1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUob2ZmaWNlYm9udXNfaHlwID0gaWZfZWxzZShvZmZpY2Vib251c1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc3Rlcm9pZHNfaHlwID0gaWZfZWxzZShzdGVyb2lkc1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocmV2ZW5nZV9oeXAgPSBpZl9lbHNlKHJldmVuZ2VTViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGVudnlfaHlwID0gaWZfZWxzZShlbnZ5U1YgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShyZXNwb25zaWJpbGl0eV9oeXAgPSBpZl9lbHNlKHJlc3BvbnNpYmlsaXR5U1YgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShpbnN1bHRpbmdfaHlwID0gaWZfZWxzZShpbnN1bHRpbmdTViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHJhY2lzbV9oeXAgPSBpZl9lbHNlKHJhY2lzbVNWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY3JpdGljaXppbmdfaHlwID0gaWZfZWxzZShjcml0aWNpemluZ1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUodmlvbGVuY2VfaHlwID0gaWZfZWxzZSh2aW9sZW5jZVNWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc3BlZWRpbmdfaHlwID0gaWZfZWxzZShzcGVlZGluZ1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocGVzdF9oeXAgPSBpZl9lbHNlKHBlc3RTViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGx5aW5nX2h5cCA9IGlmX2Vsc2UobHlpbmdTViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGdvc3NpcF9oeXAgPSBpZl9lbHNlKGdvc3NpcFNWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2hvb3RfaHlwID0gaWZfZWxzZShzaG9vdFNWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY2hlYXRpbmdfaHlwID0gaWZfZWxzZShjaGVhdGluZ1NWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2V4aXNtX2h5cCA9IGlmX2Vsc2Uoc2V4aXNtU1YgPiAwLCAxLCAwKSkNCg0KUzNfcyA8LSBTM19zICU+JSAjIG9wcG9zaXRlDQogIG11dGF0ZSh0aGVmdF9vcHAgPSBpZl9lbHNlKHRoZWZ0U1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShjYWtlaG9hcmRfb3BwID0gaWZfZWxzZShjYWtlaG9hcmRTViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHNtb2tpbmdfb3BwID0gaWZfZWxzZShzbW9raW5nU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShwbGF5Ym9va19vcHAgPSBpZl9lbHNlKHBsYXlib29rU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShvZmZpY2Vib251c19vcHAgPSBpZl9lbHNlKG9mZmljZWJvbnVzU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzdGVyb2lkc19vcHAgPSBpZl9lbHNlKHN0ZXJvaWRzU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShyZXZlbmdlX29wcCA9IGlmX2Vsc2UocmV2ZW5nZVNWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoZW52eV9vcHAgPSBpZl9lbHNlKGVudnlTViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHJlc3BvbnNpYmlsaXR5X29wcCA9IGlmX2Vsc2UocmVzcG9uc2liaWxpdHlTViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGluc3VsdGluZ19vcHAgPSBpZl9lbHNlKGluc3VsdGluZ1NWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocmFjaXNtX29wcCA9IGlmX2Vsc2UocmFjaXNtU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShjcml0aWNpemluZ19vcHAgPSBpZl9lbHNlKGNyaXRpY2l6aW5nU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZSh2aW9sZW5jZV9vcHAgPSBpZl9lbHNlKHZpb2xlbmNlU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzcGVlZGluZ19vcHAgPSBpZl9lbHNlKHNwZWVkaW5nU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShwZXN0X29wcCA9IGlmX2Vsc2UocGVzdFNWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUobHlpbmdfb3BwID0gaWZfZWxzZShseWluZ1NWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoZ29zc2lwX29wcCA9IGlmX2Vsc2UoZ29zc2lwU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzaG9vdF9vcHAgPSBpZl9lbHNlKHNob290U1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShjaGVhdGluZ19vcHAgPSBpZl9lbHNlKGNoZWF0aW5nU1YgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzZXhpc21fb3BwID0gaWZfZWxzZShzZXhpc21TViA8IDAsIDEsIDApKQ0KDQojIENyZWF0ZSBhIHZhcmlhYmxlIHBlciBzY2VuYXJpbyB0aGF0IGluZGljYXRlcyBpZiBlYWNoIHBhcnRpY2lwYW50IGNob3NlIHRoZSBoeXBvdGhlc2l6ZWQgYWdlbnQgb3Igbm90IChDbG9zZSBPdGhlcikNClMzX2NvIDwtIFMzX2NvICU+JQ0KICBtdXRhdGUodGhlZnRfaHlwID0gaWZfZWxzZSh0aGVmdFJWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY2FrZWhvYXJkX2h5cCA9IGlmX2Vsc2UoY2FrZWhvYXJkUlYgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShzbW9raW5nX2h5cCA9IGlmX2Vsc2Uoc21va2luZ1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocGxheWJvb2tfaHlwID0gaWZfZWxzZShwbGF5Ym9va1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUob2ZmaWNlYm9udXNfaHlwID0gaWZfZWxzZShvZmZpY2Vib251c1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc3Rlcm9pZHNfaHlwID0gaWZfZWxzZShzdGVyb2lkc1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocmV2ZW5nZV9oeXAgPSBpZl9lbHNlKHJldmVuZ2VSViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGVudnlfaHlwID0gaWZfZWxzZShlbnZ5UlYgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShyZXNwb25zaWJpbGl0eV9oeXAgPSBpZl9lbHNlKHJlc3BvbnNpYmlsaXR5UlYgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShpbnN1bHRpbmdfaHlwID0gaWZfZWxzZShpbnN1bHRpbmdSViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHJhY2lzbV9oeXAgPSBpZl9lbHNlKHJhY2lzbVJWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY3JpdGljaXppbmdfaHlwID0gaWZfZWxzZShjcml0aWNpemluZ1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUodmlvbGVuY2VfaHlwID0gaWZfZWxzZSh2aW9sZW5jZVJWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc3BlZWRpbmdfaHlwID0gaWZfZWxzZShzcGVlZGluZ1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocGVzdF9oeXAgPSBpZl9lbHNlKHBlc3RSViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGx5aW5nX2h5cCA9IGlmX2Vsc2UobHlpbmdSViA+IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGdvc3NpcF9oeXAgPSBpZl9lbHNlKGdvc3NpcFJWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2hvb3RfaHlwID0gaWZfZWxzZShzaG9vdFJWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoY2hlYXRpbmdfaHlwID0gaWZfZWxzZShjaGVhdGluZ1JWID4gMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc2V4aXNtX2h5cCA9IGlmX2Vsc2Uoc2V4aXNtUlYgPiAwLCAxLCAwKSkNCg0KUzNfY28gPC0gUzNfY28gJT4lICMgb3Bwb3NpdGUNCiAgbXV0YXRlKHRoZWZ0X29wcCA9IGlmX2Vsc2UodGhlZnRSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGNha2Vob2FyZF9vcHAgPSBpZl9lbHNlKGNha2Vob2FyZFJWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoc21va2luZ19vcHAgPSBpZl9lbHNlKHNtb2tpbmdSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHBsYXlib29rX29wcCA9IGlmX2Vsc2UocGxheWJvb2tSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKG9mZmljZWJvbnVzX29wcCA9IGlmX2Vsc2Uob2ZmaWNlYm9udXNSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHN0ZXJvaWRzX29wcCA9IGlmX2Vsc2Uoc3Rlcm9pZHNSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHJldmVuZ2Vfb3BwID0gaWZfZWxzZShyZXZlbmdlUlYgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShlbnZ5X29wcCA9IGlmX2Vsc2UoZW52eVJWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUocmVzcG9uc2liaWxpdHlfb3BwID0gaWZfZWxzZShyZXNwb25zaWJpbGl0eVJWIDwgMCwgMSwgMCkpICU+JQ0KICBtdXRhdGUoaW5zdWx0aW5nX29wcCA9IGlmX2Vsc2UoaW5zdWx0aW5nUlYgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShyYWNpc21fb3BwID0gaWZfZWxzZShyYWNpc21SViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGNyaXRpY2l6aW5nX29wcCA9IGlmX2Vsc2UoY3JpdGljaXppbmdSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHZpb2xlbmNlX29wcCA9IGlmX2Vsc2UodmlvbGVuY2VSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHNwZWVkaW5nX29wcCA9IGlmX2Vsc2Uoc3BlZWRpbmdSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHBlc3Rfb3BwID0gaWZfZWxzZShwZXN0UlYgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShseWluZ19vcHAgPSBpZl9lbHNlKGx5aW5nUlYgPCAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShnb3NzaXBfb3BwID0gaWZfZWxzZShnb3NzaXBSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHNob290X29wcCA9IGlmX2Vsc2Uoc2hvb3RSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKGNoZWF0aW5nX29wcCA9IGlmX2Vsc2UoY2hlYXRpbmdSViA8IDAsIDEsIDApKSAlPiUNCiAgbXV0YXRlKHNleGlzbV9vcHAgPSBpZl9lbHNlKHNleGlzbVJWIDwgMCwgMSwgMCkpDQpgYGANCg0KIyBHcm91cC1MdmwgQW5hbHlzZXMgey50YWJzZXR9DQoNCiMjIFNpbXBsZSBFZmZlY3RzIHsudGFic2V0fQ0KDQpGb3IgYWxsIHQtdGVzdHMsIHdlIGNvbmR1Y3QgYm90aCBvbmUtdGFpbGVkIGFuZCB0d28tdGFpbGVkIHRlc3RzLiBPdXIgcHJlLXJlZ2lzdHJhdGlvbiBzcGVjaWZpZWQgZGlyZWN0aW9uYWwgaHlwb3RoZXNlcyB3aGljaCB0aGVyZWZvcmUgb3VnaHQgdG8gYmUgYW5hbHl6ZWQgd2l0aCBvbmUtdGFpbGVkIHRlc3RzLiBIb3dldmVyLCBpbiBvcmRlciBmb3IgcmVhZGVycyB0byBrbm93IGFueSBlc3RpbWF0ZSdzIHVuY2VydGFpbnR5IGluIGJvdGggZGlyZWN0aW9ucywgd2UgYWxzbyBjb25kdWN0IHR3by10YWlsZWQgdGVzdHMgdG8gZ2V0IHJlbGV2YW50IENJcy4NCg0KIyMjIFN0cmFuZ2VyIFZpZ25ldHRlcw0KYGBge3J9DQojIHQtdGVzdCB1c2luZyBwZXJzb24tbGV2ZWwgYXZlcmFnZXMgYWNyb3NzIFN0cmFuZ2VyIHZpZ25ldHRlcw0KUzNfc3RyYW5nZXJfdCA8LSB0LnRlc3QoUzMkU3RyYW5nZXJBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKSANCiMjICdncmVhdGVyJyBpcyBmb3Igb25lLXRhaWxlZCBwLXZhbHVlIGJlY2F1c2Ugb2YgdGhlIG5vbi10ZW1wdGVkID4gdGVtcHRlZCBoeXBvdGhlc2lzDQpwcmludChTM19zdHJhbmdlcl90KQ0KDQpTM19zdHJhbmdlcl90XzJzaWRlIDwtIHQudGVzdChTMyRTdHJhbmdlckF2ZXJhZ2UsIG11ID0gMCwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikgDQojIyAndHdvLnNpZGVkJyBpcyB0byBnZXQgdW5jZXJ0YWludHkgZXN0aW1hdGVzIGluIGJvdGggZGlyZWN0aW9ucw0KcHJpbnQoUzNfc3RyYW5nZXJfdF8yc2lkZSkNCg0KIyByZXR1cm5zIGNvaGVuJ3MgZA0KZWZmc2l6ZTo6Y29oZW4uZChTMyRTdHJhbmdlckF2ZXJhZ2UsDQogICAgICAgICAgICAgICAgIGYgPSBOQSwNCiAgICAgICAgICAgICAgICAgbXUgPSAwLA0KICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSkNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3J9DQojIHQtdGVzdCB1c2luZyBwZXJzb24tbGV2ZWwgYXZlcmFnZXMgYWNyb3NzIENsb3NlIE90aGVyIHZpZ25ldHRlcw0KUzNfY2xvc2VvdGhlcl90IDwtIHQudGVzdChTMyRDbG9zZU90aGVyQXZlcmFnZSwgbXUgPSAwLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikgDQojIyAnZ3JlYXRlcicgaXMgZm9yIG9uZS10YWlsZWQgcC12YWx1ZSBiZWNhdXNlIG9mIHRoZSBub24tdGVtcHRlZCA+IHRlbXB0ZWQgaHlwb3RoZXNpcw0KcHJpbnQoUzNfY2xvc2VvdGhlcl90KQ0KDQpTM19jbG9zZW90aGVyX3RfMnNpZGUgPC0gdC50ZXN0KFMzJENsb3NlT3RoZXJBdmVyYWdlLCBtdSA9IDAsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFMzX2Nsb3Nlb3RoZXJfdF8yc2lkZSkNCg0KIyByZXR1cm5zIGNvaGVuJ3MgZA0KZWZmc2l6ZTo6Y29oZW4uZChTMyRDbG9zZU90aGVyQXZlcmFnZSwNCiAgICAgICAgICAgICAgICAgZiA9IE5BLA0KICAgICAgICAgICAgICAgICBtdSA9IDAsDQogICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhKQ0KYGBgDQoNCiMjIEludGVyYWN0aW9uIHsudGFic2V0fQ0KDQojIyMgUmVwZWF0ZWQtTWVhc3VyZXMgQU5PVkENCg0KVGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiBtZWFuIHZpcnR1b3NpdHkgZGVwZW5kaW5nIG9uIGNvbmRpdGlvbiAoaS5lLiwgc3RyYW5nZXIgdnMgY2xvc2Ugb3RoZXIpLg0KYGBge3J9DQojIFByZXBhcmUgZGF0YSBieSB1c2luZyBwaXZvdF9sb25nZXIgb24gYSBuZXcgZGF0YXNldA0KUzNfYW5vdmEgPC0gUzMgJT4lDQogIGRwbHlyOjpzZWxlY3QoYyhSZXNwb25zZUlkLCBTdHJhbmdlckF2ZXJhZ2UsIENsb3NlT3RoZXJBdmVyYWdlKSklPiUgDQogIGdyb3VwX2J5KFJlc3BvbnNlSWQpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IChjKFN0cmFuZ2VyQXZlcmFnZSwgQ2xvc2VPdGhlckF2ZXJhZ2UpKSwNCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gIkNvbmRpdGlvbiIsDQogICAgICAgICAgICAgICB2YWx1ZXNfdG8gPSAiVmlydHVvc2l0eUF2ZXJhZ2UiKQ0KDQojIFJlcGVhdGVkLU1lYXVzdXJlcyBBTk9WQQ0KUzNfaW50ZXJhY3Rpb25fYW92IDwtIGFvdihWaXJ0dW9zaXR5QXZlcmFnZX5Db25kaXRpb24gKyBFcnJvcihhcy5mYWN0b3IoUmVzcG9uc2VJZCkpLCBkYXRhID0gUzNfYW5vdmEpDQpzdW1tYXJ5KFMzX2ludGVyYWN0aW9uX2FvdikNCmBgYA0KIyMjIFBhaXJlZC1TYW1wbGVzIHQtVGVzdA0KDQpSZXBsaWNhdGVzIHJlc3VsdHMgb2YgdGhlIHJlcGVhdGVkLW1lYXN1cmVzIEFOT1ZBLiBUaGVzZSB0ZXN0cyBhcmUgc3RhdGlzdGljYWxseSBpZGVudGljYWwsIGJ1dCB3ZSBjb25kdWN0IGJvdGggaW4gY2FzZSByZXNlYXJjaGVycyBoYXZlIHByZWZlcmVuY2VzIGZvciBvbmUgb3ZlciB0aGUgb3RoZXIuDQpgYGB7cn0NClMzX2ludGVyYWN0aW9uX3QgPC0gdC50ZXN0KFZpcnR1b3NpdHlBdmVyYWdlIH4gQ29uZGl0aW9uLCBkYXRhID0gUzNfYW5vdmEsIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBwYWlyZWQgPSBUUlVFKQ0KIyMgJ2xlc3MnIGlzIGZvciBvbmUtdGFpbGVkIHAtdmFsdWUgYmVjYXVzZSBvZiB0aGUgY2xvc2Ugb3RoZXIgPiBzdHJhbmdlciBoeXBvdGhlc2lzDQpTM19pbnRlcmFjdGlvbl90DQoNClMzX2ludGVyYWN0aW9uX3RfMnNpZGUgPC0gdC50ZXN0KFZpcnR1b3NpdHlBdmVyYWdlIH4gQ29uZGl0aW9uLCBkYXRhID0gUzNfYW5vdmEsIGFsdGVybmF0aXZlID0gInR3by5zaWRlZCIsIHBhaXJlZCA9IFRSVUUpIA0KIyMgJ3R3by5zaWRlZCcgaXMgdG8gZ2V0IHVuY2VydGFpbnR5IGVzdGltYXRlcyBpbiBib3RoIGRpcmVjdGlvbnMNCnByaW50KFMzX2ludGVyYWN0aW9uX3RfMnNpZGUpDQoNCiMgcmV0dXJucyBkeiBlZmZlY3Qgc2l6ZSBhbmQgOTUlIENJcw0KZWZmc2l6ZTo6Y29oZW4uZChWaXJ0dW9zaXR5QXZlcmFnZSB+IENvbmRpdGlvbiB8IFN1YmplY3QoUmVzcG9uc2VJZCksDQogICAgICAgICAgICAgICAgIGRhdGEgPSBTM19hbm92YSAlPiUgZHJvcGxldmVscygpLCANCiAgICAgICAgICAgICAgICAgcGFpcmVkID0gVCwNCiAgICAgICAgICAgICAgICAgd2l0aGluID0gRikNCg0KIyByZXR1cm5zIGQtYXYgZWZmZWN0IHNpemUgYW5kIDk1JSBDSXMNCmVmZnNpemU6OmNvaGVuLmQoVmlydHVvc2l0eUF2ZXJhZ2UgfiBDb25kaXRpb24gfCBTdWJqZWN0KFJlc3BvbnNlSWQpLA0KICAgICAgICAgICAgICAgICBkYXRhID0gUzNfYW5vdmEgJT4lIGRyb3BsZXZlbHMoKSwgDQogICAgICAgICAgICAgICAgIHBhaXJlZCA9IFQsDQogICAgICAgICAgICAgICAgIHdpdGhpbiA9IFQpDQpgYGANCg0KIyBQZXJzb24tTHZsIEFuYWx5c2VzIHsudGFic2V0fQ0KYGBge3J9DQojIGNyZWF0ZSB2YXJpYWJsZXMgZm9yIHdoZXRoZXIgaHlwb3RoZXNlcyBmaXQgZm9yIGVhY2ggcGFydGljaXBhbnQNClMzIDwtIFMzICU+JQ0KICBtdXRhdGUoZml0c19zdHJhbmdlcl9oeXBvdGhlc2lzID0gaWZfZWxzZShTdHJhbmdlckF2ZXJhZ2UgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShmaXRzX2Nsb3Nlb3RoZXJfaHlwb3RoZXNpcyA9IGlmX2Vsc2UoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwLCAxLCAwKSkgJT4lDQogIG11dGF0ZShpbnRlcmFjdGlvbiA9IGNhc2Vfd2hlbigNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPT0gMCAmIFN0cmFuZ2VyQXZlcmFnZSA9PSAwKSB+ICJaZXJvLCBaZXJvLCBaZXJvIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPT0gMCAmIFN0cmFuZ2VyQXZlcmFnZSA8IDApIH4gIlplcm8sIE5lZywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPT0gMCAmIFN0cmFuZ2VyQXZlcmFnZSA+IDApIH4gIlplcm8sIFBvcywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPCAwICYgIFN0cmFuZ2VyQXZlcmFnZSA9PSAwKSB+ICJOZWcsIFplcm8sIE5lZyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPT0gU3RyYW5nZXJBdmVyYWdlKSB+ICJOZWcsIE5lZywgWmVybyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2UgPiAwKSB+ICJOZWcsIFBvcywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPCAwICYgIFN0cmFuZ2VyQXZlcmFnZSA8IDAgJiBDbG9zZU90aGVyQXZlcmFnZSA+IFN0cmFuZ2VyQXZlcmFnZSkgfiAiTmVnLCBOZWcsIFBvcyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPCBTdHJhbmdlckF2ZXJhZ2UpIH4gIk5lZywgTmVnLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA+IDAgJiAgU3RyYW5nZXJBdmVyYWdlID09IDApIH4gIlBvcywgWmVybywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZSA8IDApIH4gIlBvcywgTmVnLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA+IDAgJiAgU3RyYW5nZXJBdmVyYWdlID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlID09IFN0cmFuZ2VyQXZlcmFnZSkgfiAiUG9zLCBQb3MsIFplcm8iLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA+IDAgJiAgU3RyYW5nZXJBdmVyYWdlID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlIDwgU3RyYW5nZXJBdmVyYWdlKSB+ICJQb3MsIFBvcywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZSA+IDAgJiBDbG9zZU90aGVyQXZlcmFnZSA+IFN0cmFuZ2VyQXZlcmFnZSkgfiAiUG9zLCBQb3MsIFBvcyIpKSAlPiUgIyBwcmVkaWN0ZWQgcGF0dGVybg0KICBtdXRhdGUoZml0c19pbnRlcmFjdGlvbl9oeXBvdGhlc2lzID0gaWZfZWxzZShpbnRlcmFjdGlvbiA9PSAiUG9zLCBQb3MsIFBvcyIsIDEsIDApKQ0KYGBgDQoNCiMjIERlc2NyaXB0aXZlIFBlcnZhc2l2ZW5lc3Mgey50YWJzZXR9DQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyfQ0KIyBIb3cgbWFueSBwYXJ0aWNpcGFudHMgZml0IGh5cG90aGVzaXMgZm9yIFN0cmFuZ2VyIHZpZ25ldHRlcw0KdGFibGUoUzMkZml0c19zdHJhbmdlcl9oeXBvdGhlc2lzKSAjIDAgPSBubywgMSA9IHllcw0KYGBgDQojIyMgQ2xvc2UgT3RoZXIgVmlnbmV0dGVzDQpgYGB7cn0NCiMgSG93IG1hbnkgcGFydGljaXBhbnRzIGZpdCBoeXBvdGhlc2lzIGZvciBDbG9zZSBPdGhlciB2aWduZXR0ZXMNCnRhYmxlKFMzJGZpdHNfY2xvc2VvdGhlcl9oeXBvdGhlc2lzKSAjIDAgPSBubywgMSA9IHllcw0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyfQ0KIyBIb3cgbWFueSBwYXJ0aWNpcGFudHMgZml0IGh5cG90aGVzaXMgZm9yIGludGVyYWN0aW9uIChpLmUuLCBTdHJhbmdlciA+IDAsIENsb3NlIE90aGVyID4gMCwgQU5EIENsb3NlIE90aGVyID4gU3RyYW5nZXIpDQp0YWJsZShTMyRmaXRzX2ludGVyYWN0aW9uX2h5cG90aGVzaXMpICMgMCA9IG5vLCAxID0geWVzDQpgYGANCg0KIyMgUmFuZG9taXphdGlvbiBUZXN0DQpUaGlzIHRlc3QgaXMgb25seSBwb3NzaWJsZSBmb3IgdGhlIGNvbXBsZXggaW50ZXJhY3Rpb24gaHlwb3RoZXNpcywgYXMgcmFuZG9tbHkgc2h1ZmZsaW5nIHdpdGhpbi1jb25kaXRpb24gZGF0YSB3b3VsZCB5aWVsZCB0aGUgc2FtZSByZXN1bHQgYWNyb3NzIHNodWZmbGluZ3MuDQpgYGB7cn0NCmxpYnJhcnkobW9zYWljKSAjIGZvciByYW5kb21seSBzaHVmZmxpbmcgZGF0YQ0KDQpTM19yYW5kb20gPC0gUzMgJT4lIA0KICBkcGx5cjo6c2VsZWN0KGMoUmVzcG9uc2VJZCwgU3RyYW5nZXJBdmVyYWdlLCBDbG9zZU90aGVyQXZlcmFnZSkpDQoNClMzX3JhbmRvbSA8LSBTM19yYW5kb20gJT4lIA0KICBtdXRhdGUoaW50ZXJhY3Rpb24gPSBjYXNlX3doZW4oDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID09IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPT0gMCkgfiAiWmVybywgWmVybywgWmVybyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID09IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPCAwKSB+ICJaZXJvLCBOZWcsIFBvcyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID09IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPiAwKSB+ICJaZXJvLCBQb3MsIE5lZyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2UgPT0gMCkgfiAiTmVnLCBaZXJvLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiAgU3RyYW5nZXJBdmVyYWdlIDwgMCAmIENsb3NlT3RoZXJBdmVyYWdlID09IFN0cmFuZ2VyQXZlcmFnZSkgfiAiTmVnLCBOZWcsIFplcm8iLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiAgU3RyYW5nZXJBdmVyYWdlID4gMCkgfiAiTmVnLCBQb3MsIE5lZyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPiBTdHJhbmdlckF2ZXJhZ2UpIH4gIk5lZywgTmVnLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiAgU3RyYW5nZXJBdmVyYWdlIDwgMCAmIENsb3NlT3RoZXJBdmVyYWdlIDwgU3RyYW5nZXJBdmVyYWdlKSB+ICJOZWcsIE5lZywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZSA9PSAwKSB+ICJQb3MsIFplcm8sIFBvcyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID4gMCAmICBTdHJhbmdlckF2ZXJhZ2UgPCAwKSB+ICJQb3MsIE5lZywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZSA+IDAgJiBDbG9zZU90aGVyQXZlcmFnZSA9PSBTdHJhbmdlckF2ZXJhZ2UpIH4gIlBvcywgUG9zLCBaZXJvIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZSA+IDAgJiBDbG9zZU90aGVyQXZlcmFnZSA8IFN0cmFuZ2VyQXZlcmFnZSkgfiAiUG9zLCBQb3MsIE5lZyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID4gMCAmICBTdHJhbmdlckF2ZXJhZ2UgPiAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPiBTdHJhbmdlckF2ZXJhZ2UpIH4gIlBvcywgUG9zLCBQb3MiKSkNCg0KcHJvcF9TMyA8LSBwcm9wKCB+IGludGVyYWN0aW9uID09ICJQb3MsIFBvcywgUG9zIiwgZGF0YSA9IFMzX3JhbmRvbSkgIyBjcmVhdGUgZGVzY3JpcHRpdmUgcHJvcG9ydGlvbiBvZiBjbGFpbWVkIHBhdHRlcm4gZnJvbSBCZXJtYW4gJiBTbWFsbA0KcHJvcF9TM19kcCA8LSB1bm5hbWUocHJvcF9TM1sxXSkgIyBnZXQgZGVzY3JpcHRpdmUgcHJvcG9ydGlvbiBwcm9wb3J0aW9uIGZvciBpbnRlcmFjdGlvbg0KDQpuc2ltIDwtIDEwMDAgIyBudW1iZXIgb2YgcmFuZG9tIGRhdGFzZXRzIHRvIGdlbmVyYXRlDQpudWxscHJvcF9TMyA8LSByZXAoTkEsIG5zaW0pICMgY3JlYXRpbmcgZW1wdHkgYmluDQoNCmZvciAoaSBpbiAxOm5zaW0pIHsgIyBmb3IgbG9vcCB0byBkbyByYW5kb20gc2h1ZmZsaW5nIGFjcm9zcyBuc2ltIGRhdGFzZXRzIGFuZCBjYWxjdWxhdGUgcHJvcG9ydGlvbnMgaW4gdGhvc2UgcmFuZG9tbHkgc2h1ZmZsZWQgZGF0YXNldHMNCiAgI3Blcm11dGF0aW9uLCBzaXplIGVxdWFsIHRvIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgZm9yIGVhY2ggY29uZGl0aW9uDQogIFMzX3JhbmRvbSRTdHJhbmdlckF2ZXJhZ2VSIDwtIHNodWZmbGUoUzNfcmFuZG9tJFN0cmFuZ2VyQXZlcmFnZSkgIyBzaHVmZmxpbmcgU3RyYW5nZXIgdmFsdWVzICANCiAgUzNfcmFuZG9tJENsb3NlT3RoZXJBdmVyYWdlUiA8LSBzaHVmZmxlKFMzX3JhbmRvbSRDbG9zZU90aGVyQXZlcmFnZSkgIyBzaHVmZmxpbmcgQ2xvc2VPdGhlciB2YWx1ZXMNCiAgDQogICMjIENyZWF0aW5nIHZhcmlhYmxlIHRoYXQgZGlzdGluZ3Vpc2hlcyBQcyB3aG8gc2hvd2VkIHByZWRpY3RlZCAoY2xhaW1lZCkgcGF0dGVybiBmcm9tIFBzIHdobyBkaWQgbm90DQogIFMzX1IgPC0gUzNfcmFuZG9tICU+JQ0KICBtdXRhdGUoaW50ZXJhY3Rpb25SID0gY2FzZV93aGVuKA0KICAgIChDbG9zZU90aGVyQXZlcmFnZVIgPT0gMCAmIFN0cmFuZ2VyQXZlcmFnZVIgPT0gMCkgfiAiWmVybywgWmVybywgWmVybyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlUiA9PSAwICYgU3RyYW5nZXJBdmVyYWdlUiA8IDApIH4gIlplcm8sIE5lZywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2VSID09IDAgJiBTdHJhbmdlckF2ZXJhZ2VSID4gMCkgfiAiWmVybywgUG9zLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZVIgPCAwICYgIFN0cmFuZ2VyQXZlcmFnZVIgPT0gMCkgfiAiTmVnLCBaZXJvLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZVIgPCAwICYgIFN0cmFuZ2VyQXZlcmFnZVIgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2VSID09IFN0cmFuZ2VyQXZlcmFnZVIpIH4gIk5lZywgTmVnLCBaZXJvIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2VSIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2VSID4gMCkgfiAiTmVnLCBQb3MsIE5lZyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlUiA8IDAgJiAgU3RyYW5nZXJBdmVyYWdlUiA8IDAgJiBDbG9zZU90aGVyQXZlcmFnZVIgPiBTdHJhbmdlckF2ZXJhZ2VSKSB+ICJOZWcsIE5lZywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2VSIDwgMCAmICBTdHJhbmdlckF2ZXJhZ2VSIDwgMCAmIENsb3NlT3RoZXJBdmVyYWdlUiA8IFN0cmFuZ2VyQXZlcmFnZVIpIH4gIk5lZywgTmVnLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZVIgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZVIgPT0gMCkgfiAiUG9zLCBaZXJvLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZVIgPiAwICYgIFN0cmFuZ2VyQXZlcmFnZVIgPCAwKSB+ICJQb3MsIE5lZywgUG9zIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2VSID4gMCAmICBTdHJhbmdlckF2ZXJhZ2VSID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlUiA9PSBTdHJhbmdlckF2ZXJhZ2VSKSB+ICJQb3MsIFBvcywgWmVybyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlUiA+IDAgJiAgU3RyYW5nZXJBdmVyYWdlUiA+IDAgJiBDbG9zZU90aGVyQXZlcmFnZVIgPCBTdHJhbmdlckF2ZXJhZ2VSKSB+ICJQb3MsIFBvcywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2VSID4gMCAmICBTdHJhbmdlckF2ZXJhZ2VSID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlUiA+IFN0cmFuZ2VyQXZlcmFnZVIpIH4gIlBvcywgUG9zLCBQb3MiKSkNCg0KICANCiAgbnVsbHByb3BfVEZfUzMgPC1wcm9wKCB+IGludGVyYWN0aW9uUiA9PSAiUG9zLCBQb3MsIFBvcyIsIGRhdGEgPSBTM19SKSAjIGNyZWF0ZSBwcm9wb3J0aW9uIHZhbHVlIG9mIGNsYWltZWQgZGlyZWN0aW9uIA0KICBudWxscHJvcF9TM1tpXTwtIHVubmFtZShudWxscHJvcF9URl9TM1sxXSkgIyBnZXQgY2xhaW1lZCBwYXR0ZXJuIHByb3BvcnRpb24gZm9yIHJhbmRvbWx5IHNodWZmbGVkIGRhdGEgYW5kIHJlcGVhdCBmb3IgZWFjaCBuc2ltIGRhdGFzZXQNCn0NCg0KZ2ZfaGlzdG9ncmFtKCB+IG51bGxwcm9wX1MzLCBmaWxsID0gfiAobnVsbHByb3BfUzMgPj0gcHJvcF9TM19kcCkpICMgY3JlYXRlIGhpc3RvZ3JhbSBvZiBob3cgbWFueSByYW5kb21seSBzaHVmZmxlZCBkYXRhc2V0cyBsZWFkIHRvIGEgcHJvcCB2YWx1ZSBzaW1pbGFyIHRvIG9yIGdyZWF0ZXIgdGhhbiBlbXBpcmljYWwgcHJvcA0KDQojYyhjaGFuY2UpLXZhbHVlIGZvciBlbXBpcmljYWwgcHJvcG9ydGlvbiAoc2ltaWxhciB0byBHcmljZSdzIGMtdmFsdWVzIGNvbXB1dGVkIGluIGhpcyBPT00gc29mdHdhcmUpDQpwcm9wKCB+IG51bGxwcm9wX1MzID49IHByb3BfUzNfZHApICMgc3VnZ2VzdHMgdGhhdCBlbXBpcmljYWwgaW50ZXJhY3Rpb24gcHJvcG9ydGlvbiBpcyBleHRyZW1lbHkgdW5saWtlbHkgdG8gaGF2ZSBvY2N1cnJlZCBieSBjaGFuY2UNCmBgYA0KDQojIyBGcmVxdWVudGlzdCBQcmV2YWxlbmNlIHsudGFic2V0fQ0KYGBge3J9DQojIENSRUFURSBORUNFU1NBUlkgRlJFUVVFTlRJU1QgRlVOQ1RJT04gKGNvZGUgYWRhcHRlZCBmcm9tIERvbmhhdXNlciBldCBhbC4ncyAoMjAxOCkgTUFUTEFCIGNvZGUpDQoNCnByZXZhbGVuY2VfdGVzdCA8LSBmdW5jdGlvbihvYnNlcnZlZCwgYWxwaGFfaW5kPTAuMDUsIGJldGFfaW5kPTEsIGFscGhhX2dyb3VwPTAuMDUsIGdhbW1hXzA9MC41KSB7DQogIA0KICAjIElucHV0czoNCiAgIyBvYnNlcnZlZCAgICA9IHZlY3RvciBvZiBwLXZhbHVlcyBPUiB2ZWN0b3Igd2l0aCB0d28gdmFsdWVzLCBlLmcuLCAnYyhwb3NpdGl2ZSBjYXNlcywgdG90YWwgY2FzZXMpJw0KICAjIGFscGhhX2luZCAgID0gYWxwaGEgdGhyZXNob2xkIGZvciBwZXJzb24tbGV2ZWwgdGVzdHMsIGlmICdvYnNlcnZlZCcgPSB2ZWN0b3Igb2YgcC12YWx1ZXMgKHR5cGljYWxseSBzZXQgdG8gLjA1KQ0KICAjIGJldGFfaW5kICAgID0gc2Vuc2l0aXZpdHkgb2YgcGVyc29uLWxldmVsIHRlc3RzIChwcm9iYWJseSBzZXQgdG8gMS4wMCkNCiAgIyBhbHBoYV9ncm91cCA9IHNlZSAib3V0cHV0cyINCiAgIyBnYW1tYV8wICAgICA9IG51bGwgZ2FtbWEgdmFsdWUgZm9yIGVtcGlyaWNhbCBwcmV2YWxlbmNlIHRvIGJlIHRlc3RlZCBhZ2FpbnN0IChkZWZhdWx0cyB0byBtYWpvcml0eSBudWxsKQ0KICANCiAgIyBPdXRwdXRzOg0KICAjIHBfbnVsbCAgICAgID0gcC12YWx1ZSBmb3IgbWFqb3JpdHkgbnVsbCBvciB3aGF0ZXZlciBudWxsIHlvdSBzcGVjaWZ5IGluIHRoZSBnYW1tYV8wIGFyZ3VtZW50IChlLmcuLCB0byBzcGVjaWZ5IGEgZ2xvYmFsIG51bGwgc2V0ICJnYW1tYV8wID0gMCIpIA0KICAjIGdhbW1hXzAgICAgID0gaGlnaGVzdCBnYW1tYV8wIHZhbHVlIHRoYXQgY2FuIGJlIHJlamVjdGVkIGF0IHRocmVzaG9sZCBvZiAnYWxwaGFfZ3JvdXAnIGdpdmVuIHBvc2l0aXZlIGNhc2VzLiBOb3RlIHRoaXMgb3V0cHV0IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgaW5wdXQgYXJndW1lbnQNCiAgaWYoc3VtKG9ic2VydmVkID4gMSkgPT0gMCkgew0KICAgIHB2YWxzIDwtIG9ic2VydmVkDQogIH0gZWxzZSB7DQogICAgcHZhbHMgPC0gYyhyZXAoMCwgb2JzZXJ2ZWRbMV0pLCByZXAoMSwgb2JzZXJ2ZWRbMl0tb2JzZXJ2ZWRbMV0pKQ0KICB9DQogIA0KICBuIDwtIGxlbmd0aChwdmFscykNCiAga19vYnMgPC0gc3VtKHB2YWxzIDwgYWxwaGFfaW5kKQ0KICBrdmFscyA8LSAwOm4NCiAgZGdhbW1hIDwtIDAuMDAxDQogIGdhbW1hdmFscyA8LSBzZXEoMCwgMSwgZGdhbW1hKQ0KICANCiAgcF9rX2dhbW1hIDwtIG1hdHJpeCgwLCBucm93PWxlbmd0aChnYW1tYXZhbHMpLCBuY29sPWxlbmd0aChrdmFscykpDQogIHBfa2tfZ2FtbWEgPC0gbWF0cml4KDAsIG5yb3c9bGVuZ3RoKGdhbW1hdmFscyksIG5jb2w9bGVuZ3RoKGt2YWxzKSkNCiAgDQogIGZvcihpR2FtIGluIDE6bGVuZ3RoKGdhbW1hdmFscykpIHsNCiAgICBwX3BvcyA8LSBnYW1tYXZhbHNbaUdhbV0gKiBiZXRhX2luZCArICgxIC0gZ2FtbWF2YWxzW2lHYW1dKSAqIGFscGhhX2luZA0KICAgIHBfbmVnIDwtIGdhbW1hdmFsc1tpR2FtXSAqICgxIC0gYmV0YV9pbmQpICsgKDEgLSBnYW1tYXZhbHNbaUdhbV0pICogKDEgLSBhbHBoYV9pbmQpDQogICAgZm9yKGlLIGluIDE6bGVuZ3RoKGt2YWxzKSkgew0KICAgICAgayA8LSBrdmFsc1tpS10NCiAgICAgIHRtcCA8LSBjaG9vc2UobiwgaykgKiBwX3Bvc15rICogcF9uZWdeKG4gLSBrKQ0KICAgICAgcF9rX2dhbW1hW2lHYW0sIGlLXSA8LSB0bXANCiAgICAgIHBfa2tfZ2FtbWFbaUdhbSwgaUtdIDwtIDEgLSBzdW0ocF9rX2dhbW1hW2lHYW0sIDE6aUtdKSArIHRtcA0KICAgIH0NCiAgfQ0KICANCiAgaUsgPC0gd2hpY2goa3ZhbHMgPT0ga19vYnMpDQogIHBfbnVsbCA8LSBwX2trX2dhbW1hW3doaWNoKGdhbW1hdmFscyA9PSBnYW1tYV8wKSwgaUtdDQogIA0KICBpbmRleCA8LSBzdW0ocF9ra19nYW1tYVssIGlLXSA8IGFscGhhX2dyb3VwKQ0KICBpZihpbmRleCAhPSAwKSB7DQogICAgZ2FtbWFfMCA8LSBnYW1tYXZhbHNbaW5kZXhdDQogIH0gZWxzZSB7DQogICAgZ2FtbWFfMCA8LSAwDQogIH0NCiAgDQogIHJldHVybihsaXN0KHBfbnVsbD1wX251bGwsIGdhbW1hXzA9Z2FtbWFfMCwgcF9ra19nYW1tYT1wX2trX2dhbW1hLCBnYW1tYXZhbHM9Z2FtbWF2YWxzLCBwX2tfZ2FtbWE9cF9rX2dhbW1hKSkNCn0NCg0KYGBgDQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyfQ0KDQprIDwtIDE3NSAgIyBudW1iZXIgb2YgcGVyc29ucyBtYXRjaGluZyBoeXBvdGhlc2l6ZWQgLyBncm91cC1sZXZlbCBwYXR0ZXJuDQpuIDwtIDE3NSs1MCAjIHRvdGFsIE4NCnN0cmFuZ2VyX2ZyZXFQcmV2YWxlbmNlIDwtIHByZXZhbGVuY2VfdGVzdChjKGssIG4pKSAjIHNwZWNpZnkgcG9zaXRpdmUgY2FzZXMgb3V0IG9mIHRvdGFsIGNhc2VzIGZvciBwcmV2IHRlc3QgZnVuY3Rpb24NCnN0cmFuZ2VyX2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gMTgzICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTgzKzQyICMgdG90YWwgTg0KY2xvc2VvdGhlcl9mcmVxUHJldmFsZW5jZSA8LSBwcmV2YWxlbmNlX3Rlc3QoYyhrLCBuKSkgIyBzcGVjaWZ5IHBvc2l0aXZlIGNhc2VzIG91dCBvZiB0b3RhbCBjYXNlcyBmb3IgcHJldiB0ZXN0IGZ1bmN0aW9uDQpjbG9zZW90aGVyX2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7cn0NCg0KayA8LSA4NyAgIyBudW1iZXIgb2YgcGVyc29ucyBtYXRjaGluZyBoeXBvdGhlc2l6ZWQgLyBncm91cC1sZXZlbCBwYXR0ZXJuDQpuIDwtIDg3KzEzOCAjIHRvdGFsIE4NCmludGVyYWN0aW9uX2ZyZXFQcmV2YWxlbmNlIDwtIHByZXZhbGVuY2VfdGVzdChjKGssIG4pKSAjIHNwZWNpZnkgcG9zaXRpdmUgY2FzZXMgb3V0IG9mIHRvdGFsIGNhc2VzIGZvciBwcmV2IHRlc3QgZnVuY3Rpb24NCmludGVyYWN0aW9uX2ZyZXFQcmV2YWxlbmNlJHBfbnVsbCAjIHByaW50IHAtdmFsdWUgdGVzdGluZyBhZ2FpbnN0IG1ham9yaXR5IG51bGwNCmBgYA0KDQojIyBCYXllc2lhbiBQcmV2YWxlbmNlIHsudGFic2V0fQ0KYGBge3J9DQojIENSRUFURSBORUNFU1NBUlkgQkFZRVMgRlVOQ1RJT05TIChjb2RlIGZyb20gSW5jZSBldCBhbC4sIDIwMjEpDQpsaWJyYXJ5KG5sZXFzbHYpDQoNCmJheWVzcHJldl9tYXAgPC0gZnVuY3Rpb24oaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBtYXhpbXVtIGEgcG9zdGVyaW9yaSBlc3RpbWF0ZSBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWENCiAgIyB1bmRlciBhIHVuaWZvcm0gcHJpb3INCiAgIyANCiAgIyBBcmdzOg0KICAjICBrOiBudW1iZXIgb2YgcGFydGljaXBhbnRzL3Rlc3RzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyAgbjogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cy90ZXN0cw0KICAjICBhOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjICBiOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICBnbSA8LSAoay9uIC1hKS8oYi1hKQ0KICBpZihnbSA8MCkgZ20gPC0gMA0KICBpZihnbT4xKSBnbSA8LSAxDQogIHJldHVybihnbSkNCn0gDQoNCmJheWVzcHJldl9wb3N0ZXJpb3IgPC0gZnVuY3Rpb24oeCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBwb3N0ZXJpb3Igb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyB4IDogdmFsdWVzIG9mIGdhbW1hIGF0IHdoaWNoIHRvIGV2YWx1YXRlIHRoZSBwb3N0ZXJpb3IgZGVuc2l0eQ0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHRoZXRhIDwtIGEgKyAoYi1hKSp4DQogIHBvc3QgPC0gKGIgLWEpKmRiZXRhKHRoZXRhLG0xLCBtMikNCiAgcG9zdCA8LSBwb3N0LyhwYmV0YShiLCBtMSwgbTIpIC0gcGJldGEoYSwgbTEsIG0yKSkNCiAgcmV0dXJuKHBvc3QpDQp9DQoNCg0KYmF5ZXNwcmV2X2JvdW5kIDwtIGZ1bmN0aW9uKHAsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gbG93ZXIgYm91bmQgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyAgcCA6IGRlbnNpdHkgdGhlIGxvd2VyIGJvdW5kIHNob3VsZCBib3VuZCAoZS5nLiAwLjk1KQ0KICAjICBrIDogbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBzaWduaWZpY2FudCBvdXQgb2YgDQogICMgIG4gOiB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzDQogICMgIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjICBiIDogc2Vuc2l0aXZpdHkvYmV0YSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0xKQ0KICANCiAgbTEgPC0gIGsgKyAxDQogIG0yIDwtIG4gLSBrICsgMQ0KICB0aF9jIDwtIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS1wKSpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICBnX2MgPC0gKHRoX2MgLWEpLyhiLWEpDQogIHJldHVybihnX2MpDQp9DQoNCg0KYmF5ZXNwcmV2X2hwZGkgPC0gZnVuY3Rpb24ocCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBoaWdoZXN0IHBvc3RlcmlvciBkZW5zaXR5IGludGVydmFsIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBnYW1tYQ0KICAjIHVuZGVyIGEgdW5pZm9ybSBwcmlvcg0KICAjDQogICMgQXJnczoNCiAgIyAgcCA6IEhQREkgdG8gcmV0dXJuIChlLmcuIDAuOTUgZm9yIDk1JSkNCiAgIyAgayA6IG51bWJlciBvZiBwYXJ0aWNpcGFudHMgc2lnbmlmaWNhbnQgb3V0IG9mIA0KICAjICBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjICBhIDogYWxwaGEgdmFsdWUgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MC4wNSkNCiAgIyAgYiA6IHNlbnNpdGl2aXR5L2JldGEgb2Ygd2l0aGluLXBhcnRpY2lwYW50IHRlc3QgKGRlZmF1bHQ9MSkNCiAgDQogIG0xIDwtIGsrMQ0KICBtMiA8LSBuLWsrMQ0KICANCiAgaWYobTEgPT0xKSB7DQogICAgZW5kcHRzIDwtIGMoYSwgcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSApIA0KICAgIHJldHVybigoZW5kcHRzIC1hKS8oYi1hKSkNCiAgfQ0KICANCiAgaWYobTIgPT0xKSB7DQogICAgZW5kcHRzIDwtIGMoIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS0gcCkqIHBiZXRhKGIsIG0xLCBtMiksIG0xLCBtMiApICwgYikgDQogICAgcmV0dXJuKCAoZW5kcHRzLWEpLyhiLWEpKQ0KICB9DQogIA0KICBpZihrPD0gbiphKSB7DQogICAgZW5kcHRzIDwtIGMoYSwgcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCpwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSApIA0KICAgIHJldHVybigoZW5kcHRzIC1hKS8oYi1hKSkNCiAgfQ0KICANCiAgaWYoaz49IG4qYikgew0KICAgIGVuZHB0cyA8LSBjKCBxYmV0YSggcCpwYmV0YShhLCBtMSwgbTIpICsgKDEtIHApKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKSAsIGIpIA0KICAgIHJldHVybiggKGVuZHB0cy1hKS8oYi1hKSkNCiAgfQ0KICANCiAgDQogIGcgPC0gZnVuY3Rpb24oeCwgbTEsIG0yLCBhLCBiLCBwICkgew0KICAgIHkgPC0gbnVtZXJpYygyKQ0KICAgIHlbMV0gPC0gIHBiZXRhKHhbMl0sIG0xLCBtMikgLSBwYmV0YSh4WzFdLCBtMSwgbTIpIC0gcCoocGJldGEoYiwgbTEsIG0yKSAtIHBiZXRhKGEsIG0xLCBtMikpDQogICAgeVsyXSA8LSBsb2coZGJldGEoeFsyXSwgbTEsIG0yKSkgLSBsb2coZGJldGEoeFsxXSwgbTEsIG0yKSkNCiAgICByZXR1cm4oeSkNCiAgfQ0KICANCiAgeF9pbml0IDwtIG51bWVyaWMoMikNCiAgDQogIHAxIDwtICgxLXApLzIgDQogIHAyIDwtICgxICtwKS8yDQogIA0KICB4X2luaXRbMV0gPC0gcWJldGEoICgxIC1wMSkqcGJldGEoYSwgbTEsIG0yKSArIHAxKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICB4X2luaXRbMl0gPC0gcWJldGEoICgxIC1wMikqcGJldGEoYSwgbTEsIG0yKSArIHAyKiBwYmV0YShiLCBtMSwgbTIpLCBtMSwgbTIgKQ0KICANCiAgb3B0IDwtIG5sZXFzbHYoeF9pbml0LCBnLCBtZXRob2QgPSJOZXd0b24iLCBjb250cm9sPWxpc3QobWF4aXQ9MTAwMCksIG0xPW0xLCBtMj1tMiwgYT1hLCBiPWIsIHA9cCkNCiAgDQogIGlmIChvcHQkdGVybWNkID09MSkgIHByaW50KCJjb252ZXJnZW5jZSBhY2hpZXZlZCIpIA0KICBpZiAob3B0JHRlcm1jZCAhPSAxKSAgcHJpbnQoImZhaWxlZCB0byBjb252ZXJnZSIpIA0KICANCiAgdGVtcCA8LSBvcHQkeA0KICBpZiAodGVtcFsxXSA8YSkgew0KICAgIHRlbXBbMV0gPC0gYQ0KICAgIHRlbXBbMl0gPC0gcWJldGEoICgxIC1wKSpwYmV0YShhLCBtMSwgbTIpICsgcCogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgfQ0KICBpZiAodGVtcFsyXSA+IGIpIHsNCiAgICB0ZW1wWzFdIDwtIHFiZXRhKCBwKnBiZXRhKGEsIG0xLCBtMikgKyAoMS1wKSogcGJldGEoYiwgbTEsIG0yKSwgbTEsIG0yICkNCiAgICB0ZW1wWzJdIDwtIGINCiAgfQ0KICBlbmRwdHMgPC0gKHRlbXAgLWEpLyhiLWEpDQogIHJldHVybihlbmRwdHMpIA0KfQ0KDQoNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iIDwtIGZ1bmN0aW9uKHgsIGssIG4sIGE9MC4wNSwgYj0xKSB7DQogICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm91ciBvZiB0aGUgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGJlaW5nIGdyZWF0ZXIgdGhhbiB4DQogICMNCiAgIyBBcmdzOg0KICAjIHggOiB2YWx1ZXMgb2YgZ2FtbWEgYXQgd2hpY2ggdG8gZXZhbHVhdGUgdGhlIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICB0aGV0YSA8LSBhICsgKGItYSkqeA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHAgPC0gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKHRoZXRhLG0xLG0yKSkgLyAocGJldGEoYixtMSxtMiktcGJldGEoYSxtMSxtMikpDQogIHJldHVybihwKQ0KICANCn0NCg0KYmF5ZXNwcmV2X3Bvc3RlcmlvcmxvZ29kZHMgPC0gZnVuY3Rpb24oeCwgaywgbiwgYT0wLjA1LCBiPTEpIHsNCiAgIyBCYXllc2lhbiBwb3N0ZXJpb3IgbG9nLW9kZHMgaW4gZmF2b3VyIG9mIHRoZSBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgYmVpbmcgZ3JlYXRlciB0aGFuIHgNCiAgIw0KICAjIEFyZ3M6DQogICMgeCA6IGxvZy1vZGRzIHRocmVzaG9sZA0KICAjIGsgOiBudW1iZXIgb2YgcGFydGljaXBhbnRzIHNpZ25pZmljYW50IG91dCBvZiANCiAgIyBuIDogdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cw0KICAjIGEgOiBhbHBoYSB2YWx1ZSBvZiB3aXRoaW4tcGFydGljaXBhbnQgdGVzdCAoZGVmYXVsdD0wLjA1KQ0KICAjIGIgOiBzZW5zaXRpdml0eS9iZXRhIG9mIHdpdGhpbi1wYXJ0aWNpcGFudCB0ZXN0IChkZWZhdWx0PTEpDQogIA0KICB0aGV0YSA8LSBhICsgKGItYSkqeA0KICBtMSA8LSAgayArIDENCiAgbTIgPC0gbiAtIGsgKyAxDQogIHAgPC0gKHBiZXRhKGIsbTEsbTIpLXBiZXRhKHRoZXRhLG0xLG0yKSkgLyAocGJldGEoYixtMSxtMiktcGJldGEoYSxtMSxtMikpDQogIGxvPC0gbG9nKHAgLyAoMSAtIHApKQ0KICByZXR1cm4obG8pDQogIA0KfQ0KYGBgDQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyfQ0KDQprIDwtIDE3NSAgIyBudW1iZXIgb2YgcGVyc29ucyBtYXRjaGluZyBoeXBvdGhlc2l6ZWQgLyBncm91cC1sZXZlbCBwYXR0ZXJuDQpuIDwtIDE3NSs1MCAjIHRvdGFsIE4NCnggPC0gMC41MCAjIG1pbm9yaXR5IGN1dC1vZmYgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCnhfMCA8LSAwLjAwICMgZ2xvYmFsIG51bGwgb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGdhbW1hIGZvciBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkNCm1hcCA9IGJheWVzcHJldl9tYXAoaywgbikgIyBnZXQgbWF4aW11bSBhIHBvc3RlcmlvcmkgKE1BUCkgZXN0aW1hdGUgKGkuZS4sIHRoZSBsaWtlbGllc3QgcGVyc29uLWxldmVsIHByZXZhbGVuY2UgcG9wdWxhdGlvbiB2YWx1ZSkNCmludCA9IGJheWVzcHJldl9ocGRpKDAuOTYsIGssIG4pICMgZ2V0IDk2JSBIUERJcw0KaTEgPSBpbnRbMV0gIyBnZXQgbG93ZXIgOTYlIEhQREkNCmkyID0gaW50WzJdICMgZ2V0IHVwcGVyIDk2JSBIUERJDQpwcmludChjKGkxLCBtYXAgLGkyKSkgIyBwcmludCBsb3dlciA5NiBIUERJLCBtYXAgZXN0aW1hdGUsIGFuZCB1cHBlciA5NiBIUERJDQpiYXllc3ByZXZfcG9zdGVyaW9ycHJvYih4LCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHgNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHhfMCwgaywgbikgIyBCYXllc2lhbiBwb3N0ZXJpb3IgcHJvYmFiaWxpdHkgaW4gZmF2b3Igb2YgcG9wdWxhdGlvbiBwcmV2YWxlbmNlIGJlaW5nIGdyZWF0ZXIgdGhhbiB4XzANCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3J9DQoNCmsgPC0gMTgzICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gMTgzKzQyICMgdG90YWwgTg0KeCA8LSAwLjUwICMgbWlub3JpdHkgY3V0LW9mZiBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KeF8wIDwtIDAuMDAgIyBnbG9iYWwgbnVsbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KbWFwID0gYmF5ZXNwcmV2X21hcChrLCBuKSAjIGdldCBtYXhpbXVtIGEgcG9zdGVyaW9yaSAoTUFQKSBlc3RpbWF0ZSAoaS5lLiwgdGhlIGxpa2VsaWVzdCBwZXJzb24tbGV2ZWwgcHJldmFsZW5jZSBwb3B1bGF0aW9uIHZhbHVlKQ0KaW50ID0gYmF5ZXNwcmV2X2hwZGkoMC45NiwgaywgbikgIyBnZXQgOTYlIEhQRElzDQppMSA9IGludFsxXSAjIGdldCBsb3dlciA5NiUgSFBESQ0KaTIgPSBpbnRbMl0gIyBnZXQgdXBwZXIgOTYlIEhQREkNCnByaW50KGMoaTEsIG1hcCAsaTIpKSAjIHByaW50IGxvd2VyIDk2IEhQREksIG1hcCBlc3RpbWF0ZSwgYW5kIHVwcGVyIDk2IEhQREkNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHgsIGssIG4pICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBiZWluZyBncmVhdGVyIHRoYW4geA0KYmF5ZXNwcmV2X3Bvc3RlcmlvcnByb2IoeF8wLCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHhfMA0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyfQ0KDQprIDwtIDg3ICAjIG51bWJlciBvZiBwZXJzb25zIG1hdGNoaW5nIGh5cG90aGVzaXplZCAvIGdyb3VwLWxldmVsIHBhdHRlcm4NCm4gPC0gODcrMTM4ICMgdG90YWwgTg0KeCA8LSAwLjUwICMgbWlub3JpdHkgY3V0LW9mZiBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KeF8wIDwtIDAuMDAgIyBnbG9iYWwgbnVsbCBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgZ2FtbWEgZm9yIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eQ0KbWFwID0gYmF5ZXNwcmV2X21hcChrLCBuKSAjIGdldCBtYXhpbXVtIGEgcG9zdGVyaW9yaSAoTUFQKSBlc3RpbWF0ZSAoaS5lLiwgdGhlIGxpa2VsaWVzdCBwZXJzb24tbGV2ZWwgcHJldmFsZW5jZSBwb3B1bGF0aW9uIHZhbHVlKQ0KaW50ID0gYmF5ZXNwcmV2X2hwZGkoMC45NiwgaywgbikgIyBnZXQgOTYlIEhQRElzDQppMSA9IGludFsxXSAjIGdldCBsb3dlciA5NiUgSFBESQ0KaTIgPSBpbnRbMl0gIyBnZXQgdXBwZXIgOTYlIEhQREkNCnByaW50KGMoaTEsIG1hcCAsaTIpKSAjIHByaW50IGxvd2VyIDk2IEhQREksIG1hcCBlc3RpbWF0ZSwgYW5kIHVwcGVyIDk2IEhQREkNCmJheWVzcHJldl9wb3N0ZXJpb3Jwcm9iKHgsIGssIG4pICMgQmF5ZXNpYW4gcG9zdGVyaW9yIHByb2JhYmlsaXR5IGluIGZhdm9yIG9mIHBvcHVsYXRpb24gcHJldmFsZW5jZSBiZWluZyBncmVhdGVyIHRoYW4geA0KYmF5ZXNwcmV2X3Bvc3RlcmlvcnByb2IoeF8wLCBrLCBuKSAjIEJheWVzaWFuIHBvc3RlcmlvciBwcm9iYWJpbGl0eSBpbiBmYXZvciBvZiBwb3B1bGF0aW9uIHByZXZhbGVuY2UgYmVpbmcgZ3JlYXRlciB0aGFuIHhfMA0KYGBgDQoNCiMgUHJpbWFyeSBQbG90cyB7LnRhYnNldH0NCmBgYHtyfQ0KIyByZS1vcmdhbml6ZSBkYXRhIHRvIHBsb3QgdmlnbmV0dGUtYnktdmlnbmV0dGUgdmFyaWFiaWxpdHkNCg0KIyBzdHJhbmdlciB2aWduZXR0ZXMNClMzX3ZpZ25ldHRlc19zIDwtIFMzX3MgJT4lIA0KICBzZWxlY3QoYyhSZXNwb25zZUlkLA0KICAgICAgICAgICB0aGVmdF9oeXAsIGNha2Vob2FyZF9oeXAsIHNtb2tpbmdfaHlwLCBwbGF5Ym9va19oeXAsIG9mZmljZWJvbnVzX2h5cCwgDQogICAgICAgICAgIHN0ZXJvaWRzX2h5cCwgcmV2ZW5nZV9oeXAsIGVudnlfaHlwLCByZXNwb25zaWJpbGl0eV9oeXAsIGluc3VsdGluZ19oeXAsDQogICAgICAgICAgIHJhY2lzbV9oeXAsIGNyaXRpY2l6aW5nX2h5cCwgdmlvbGVuY2VfaHlwLCBzcGVlZGluZ19oeXAsIHBlc3RfaHlwLA0KICAgICAgICAgICBseWluZ19oeXAsIGdvc3NpcF9oeXAsIHNob290X2h5cCwgY2hlYXRpbmdfaHlwLCBzZXhpc21faHlwLA0KICAgICAgICAgICB0aGVmdF9vcHAsIGNha2Vob2FyZF9vcHAsIHNtb2tpbmdfb3BwLCBwbGF5Ym9va19vcHAsIG9mZmljZWJvbnVzX29wcCwgDQogICAgICAgICAgIHN0ZXJvaWRzX29wcCwgcmV2ZW5nZV9vcHAsIGVudnlfb3BwLCByZXNwb25zaWJpbGl0eV9vcHAsIGluc3VsdGluZ19vcHAsDQogICAgICAgICAgIHJhY2lzbV9vcHAsIGNyaXRpY2l6aW5nX29wcCwgdmlvbGVuY2Vfb3BwLCBzcGVlZGluZ19vcHAsIHBlc3Rfb3BwLA0KICAgICAgICAgICBseWluZ19vcHAsIGdvc3NpcF9vcHAsIHNob290X29wcCwgY2hlYXRpbmdfb3BwLCBzZXhpc21fb3BwKSkgJT4lIA0KICAgIG11dGF0ZSh0aGVmdCA9IGNhc2Vfd2hlbigNCiAgICB0aGVmdF9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHRoZWZ0X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgICh0aGVmdF9oeXAgPT0gMCAmIHRoZWZ0X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShjYWtlaG9hcmQgPSBjYXNlX3doZW4oDQogICAgY2FrZWhvYXJkX2h5cCA9PSAxIH4gIlllcyIsDQogICAgY2FrZWhvYXJkX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChjYWtlaG9hcmRfaHlwID09IDAgJiBjYWtlaG9hcmRfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogICAgbXV0YXRlKHNtb2tpbmcgPSBjYXNlX3doZW4oDQogICAgc21va2luZ19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHNtb2tpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNtb2tpbmdfaHlwID09IDAgJiBzbW9raW5nX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShwbGF5Ym9vayA9IGNhc2Vfd2hlbigNCiAgICBwbGF5Ym9va19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHBsYXlib29rX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChwbGF5Ym9va19oeXAgPT0gMCAmIHBsYXlib29rX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShib251cyA9IGNhc2Vfd2hlbigNCiAgICBvZmZpY2Vib251c19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIG9mZmljZWJvbnVzX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChvZmZpY2Vib251c19oeXAgPT0gMCAmIG9mZmljZWJvbnVzX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShzdGVyb2lkcyA9IGNhc2Vfd2hlbigNCiAgICBzdGVyb2lkc19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHN0ZXJvaWRzX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChzdGVyb2lkc19oeXAgPT0gMCAmIHN0ZXJvaWRzX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShyZXZlbmdlID0gY2FzZV93aGVuKA0KICAgIHJldmVuZ2VfaHlwID09IDEgfiAiWWVzIiwNCiAgICByZXZlbmdlX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChyZXZlbmdlX2h5cCA9PSAwICYgcmV2ZW5nZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgICBtdXRhdGUoZW52eSA9IGNhc2Vfd2hlbigNCiAgICBlbnZ5X2h5cCA9PSAxIH4gIlllcyIsDQogICAgZW52eV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoZW52eV9oeXAgPT0gMCAmIGVudnlfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShyZXNwb25zaWJpbGl0eSA9IGNhc2Vfd2hlbigNCiAgICByZXNwb25zaWJpbGl0eV9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHJlc3BvbnNpYmlsaXR5X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChyZXNwb25zaWJpbGl0eV9oeXAgPT0gMCAmIHJlc3BvbnNpYmlsaXR5X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoaW5zdWx0aW5nID0gY2FzZV93aGVuKA0KICAgIGluc3VsdGluZ19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIGluc3VsdGluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoaW5zdWx0aW5nX2h5cCA9PSAwICYgaW5zdWx0aW5nX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUocmFjaXNtID0gY2FzZV93aGVuKA0KICAgIHJhY2lzbV9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHJhY2lzbV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAocmFjaXNtX2h5cCA9PSAwICYgcmFjaXNtX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoY3JpdGljaXppbmcgPSBjYXNlX3doZW4oDQogICAgY3JpdGljaXppbmdfaHlwID09IDEgfiAiWWVzIiwNCiAgICBjcml0aWNpemluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoY3JpdGljaXppbmdfaHlwID09IDAgJiBjcml0aWNpemluZ19vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgICBtdXRhdGUodmlvbGVuY2UgPSBjYXNlX3doZW4oDQogICAgdmlvbGVuY2VfaHlwID09IDEgfiAiWWVzIiwNCiAgICB2aW9sZW5jZV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAodmlvbGVuY2VfaHlwID09IDAgJiB2aW9sZW5jZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNwZWVkaW5nID0gY2FzZV93aGVuKA0KICAgIHNwZWVkaW5nX2h5cCA9PSAxIH4gIlllcyIsDQogICAgc3BlZWRpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNwZWVkaW5nX2h5cCA9PSAwICYgc3BlZWRpbmdfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShwZXN0ID0gY2FzZV93aGVuKA0KICAgIHBlc3RfaHlwID09IDEgfiAiWWVzIiwNCiAgICBwZXN0X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChwZXN0X2h5cCA9PSAwICYgcGVzdF9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKGx5aW5nID0gY2FzZV93aGVuKA0KICAgIGx5aW5nX2h5cCA9PSAxIH4gIlllcyIsDQogICAgbHlpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKGx5aW5nX2h5cCA9PSAwICYgbHlpbmdfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShnb3NzaXAgPSBjYXNlX3doZW4oDQogICAgZ29zc2lwX2h5cCA9PSAxIH4gIlllcyIsDQogICAgZ29zc2lwX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChnb3NzaXBfaHlwID09IDAgJiBnb3NzaXBfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShzaG9vdCA9IGNhc2Vfd2hlbigNCiAgICBzaG9vdF9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHNob290X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChzaG9vdF9oeXAgPT0gMCAmIHNob290X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoY2hlYXRpbmcgPSBjYXNlX3doZW4oDQogICAgY2hlYXRpbmdfaHlwID09IDEgfiAiWWVzIiwNCiAgICBjaGVhdGluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoY2hlYXRpbmdfaHlwID09IDAgJiBjaGVhdGluZ19vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNleGlzbSA9IGNhc2Vfd2hlbigNCiAgICBzZXhpc21faHlwID09IDEgfiAiWWVzIiwNCiAgICBzZXhpc21fb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNleGlzbV9oeXAgPT0gMCAmIHNleGlzbV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgZ3JvdXBfYnkoUmVzcG9uc2VJZCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gKGModGhlZnQsIGNha2Vob2FyZCwgc21va2luZywgcGxheWJvb2ssIGJvbnVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJvaWRzLHJldmVuZ2UsIGVudnksIHJlc3BvbnNpYmlsaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGluc3VsdGluZywgcmFjaXNtLCBjcml0aWNpemluZyx2aW9sZW5jZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZGluZywgcGVzdCwgbHlpbmcsIGdvc3NpcCwgc2hvb3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgY2hlYXRpbmcsc2V4aXNtKSksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ2aWduZXR0ZV9uYW1lIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJmaXRzX2h5cCIpICU+JQ0KICBkcm9wX25hKGZpdHNfaHlwKQ0KDQpzdHJhbmdlcl9sYWJzIDwtIGMoIlRoZWZ0IiwgIkNha2UgSG9hcmRpbmciLCAiU21va2luZyIsICJQbGF5Ym9vayIsICJCb251cyIsICJTdGVyb2lkcyIsICJSZXZlbmdlIiwNCiAgICAgICAgICAgICAgICAgICAiRW52eSIsICJSZXNwb25zaWJpbGl0eSIsIkluc3VsdGluZyIsICJSYWNpc20iLCAiQ3JpdGljaXppbmciLCAiVmlvbGVuY2UiLCAiU3BlZWRpbmciLA0KICAgICAgICAgICAgICAgICAgICJQZXN0IiwgIkx5aW5nIiwgIkdvc3NpcCIsICJTaG9vdGluZyIsICJDaGVhdGluZyIsIlNleGlzbSIpDQpuYW1lcyhzdHJhbmdlcl9sYWJzKSA8LSBjKCJ0aGVmdCIsICJjYWtlaG9hcmQiLCAic21va2luZyIsICJwbGF5Ym9vayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJib251cyIsInN0ZXJvaWRzIiwgInJldmVuZ2UiLCAiZW52eSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNwb25zaWJpbGl0eSIsICJpbnN1bHRpbmciLCJyYWNpc20iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JpdGljaXppbmciLCJ2aW9sZW5jZSIsICJzcGVlZGluZyIsICJwZXN0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgImx5aW5nIiwgImdvc3NpcCIsICJzaG9vdCIsImNoZWF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNleGlzbSIpDQoNCiMgY2xvc2Ugb3RoZXIgdmlnbmV0dGVzDQpTM192aWduZXR0ZXNfY28gPC0gUzNfY28gJT4lIA0KICBzZWxlY3QoYyhSZXNwb25zZUlkLA0KICAgICAgICAgICB0aGVmdF9oeXAsIGNha2Vob2FyZF9oeXAsIHNtb2tpbmdfaHlwLCBwbGF5Ym9va19oeXAsIG9mZmljZWJvbnVzX2h5cCwgDQogICAgICAgICAgIHN0ZXJvaWRzX2h5cCwgcmV2ZW5nZV9oeXAsIGVudnlfaHlwLCByZXNwb25zaWJpbGl0eV9oeXAsIGluc3VsdGluZ19oeXAsDQogICAgICAgICAgIHJhY2lzbV9oeXAsIGNyaXRpY2l6aW5nX2h5cCwgdmlvbGVuY2VfaHlwLCBzcGVlZGluZ19oeXAsIHBlc3RfaHlwLA0KICAgICAgICAgICBseWluZ19oeXAsIGdvc3NpcF9oeXAsIHNob290X2h5cCwgY2hlYXRpbmdfaHlwLCBzZXhpc21faHlwLA0KICAgICAgICAgICB0aGVmdF9vcHAsIGNha2Vob2FyZF9vcHAsIHNtb2tpbmdfb3BwLCBwbGF5Ym9va19vcHAsIG9mZmljZWJvbnVzX29wcCwgDQogICAgICAgICAgIHN0ZXJvaWRzX29wcCwgcmV2ZW5nZV9vcHAsIGVudnlfb3BwLCByZXNwb25zaWJpbGl0eV9vcHAsIGluc3VsdGluZ19vcHAsDQogICAgICAgICAgIHJhY2lzbV9vcHAsIGNyaXRpY2l6aW5nX29wcCwgdmlvbGVuY2Vfb3BwLCBzcGVlZGluZ19vcHAsIHBlc3Rfb3BwLA0KICAgICAgICAgICBseWluZ19vcHAsIGdvc3NpcF9vcHAsIHNob290X29wcCwgY2hlYXRpbmdfb3BwLCBzZXhpc21fb3BwKSkgJT4lIA0KICAgIG11dGF0ZSh0aGVmdCA9IGNhc2Vfd2hlbigNCiAgICB0aGVmdF9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHRoZWZ0X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgICh0aGVmdF9oeXAgPT0gMCAmIHRoZWZ0X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShjYWtlaG9hcmQgPSBjYXNlX3doZW4oDQogICAgY2FrZWhvYXJkX2h5cCA9PSAxIH4gIlllcyIsDQogICAgY2FrZWhvYXJkX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChjYWtlaG9hcmRfaHlwID09IDAgJiBjYWtlaG9hcmRfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogICAgbXV0YXRlKHNtb2tpbmcgPSBjYXNlX3doZW4oDQogICAgc21va2luZ19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHNtb2tpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNtb2tpbmdfaHlwID09IDAgJiBzbW9raW5nX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShwbGF5Ym9vayA9IGNhc2Vfd2hlbigNCiAgICBwbGF5Ym9va19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHBsYXlib29rX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChwbGF5Ym9va19oeXAgPT0gMCAmIHBsYXlib29rX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShib251cyA9IGNhc2Vfd2hlbigNCiAgICBvZmZpY2Vib251c19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIG9mZmljZWJvbnVzX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChvZmZpY2Vib251c19oeXAgPT0gMCAmIG9mZmljZWJvbnVzX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShzdGVyb2lkcyA9IGNhc2Vfd2hlbigNCiAgICBzdGVyb2lkc19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHN0ZXJvaWRzX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChzdGVyb2lkc19oeXAgPT0gMCAmIHN0ZXJvaWRzX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICAgIG11dGF0ZShyZXZlbmdlID0gY2FzZV93aGVuKA0KICAgIHJldmVuZ2VfaHlwID09IDEgfiAiWWVzIiwNCiAgICByZXZlbmdlX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChyZXZlbmdlX2h5cCA9PSAwICYgcmV2ZW5nZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgICBtdXRhdGUoZW52eSA9IGNhc2Vfd2hlbigNCiAgICBlbnZ5X2h5cCA9PSAxIH4gIlllcyIsDQogICAgZW52eV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoZW52eV9oeXAgPT0gMCAmIGVudnlfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShyZXNwb25zaWJpbGl0eSA9IGNhc2Vfd2hlbigNCiAgICByZXNwb25zaWJpbGl0eV9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHJlc3BvbnNpYmlsaXR5X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChyZXNwb25zaWJpbGl0eV9oeXAgPT0gMCAmIHJlc3BvbnNpYmlsaXR5X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoaW5zdWx0aW5nID0gY2FzZV93aGVuKA0KICAgIGluc3VsdGluZ19oeXAgPT0gMSB+ICJZZXMiLA0KICAgIGluc3VsdGluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoaW5zdWx0aW5nX2h5cCA9PSAwICYgaW5zdWx0aW5nX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUocmFjaXNtID0gY2FzZV93aGVuKA0KICAgIHJhY2lzbV9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHJhY2lzbV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAocmFjaXNtX2h5cCA9PSAwICYgcmFjaXNtX29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoY3JpdGljaXppbmcgPSBjYXNlX3doZW4oDQogICAgY3JpdGljaXppbmdfaHlwID09IDEgfiAiWWVzIiwNCiAgICBjcml0aWNpemluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoY3JpdGljaXppbmdfaHlwID09IDAgJiBjcml0aWNpemluZ19vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgICBtdXRhdGUodmlvbGVuY2UgPSBjYXNlX3doZW4oDQogICAgdmlvbGVuY2VfaHlwID09IDEgfiAiWWVzIiwNCiAgICB2aW9sZW5jZV9vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAodmlvbGVuY2VfaHlwID09IDAgJiB2aW9sZW5jZV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNwZWVkaW5nID0gY2FzZV93aGVuKA0KICAgIHNwZWVkaW5nX2h5cCA9PSAxIH4gIlllcyIsDQogICAgc3BlZWRpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNwZWVkaW5nX2h5cCA9PSAwICYgc3BlZWRpbmdfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShwZXN0ID0gY2FzZV93aGVuKA0KICAgIHBlc3RfaHlwID09IDEgfiAiWWVzIiwNCiAgICBwZXN0X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChwZXN0X2h5cCA9PSAwICYgcGVzdF9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKGx5aW5nID0gY2FzZV93aGVuKA0KICAgIGx5aW5nX2h5cCA9PSAxIH4gIlllcyIsDQogICAgbHlpbmdfb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKGx5aW5nX2h5cCA9PSAwICYgbHlpbmdfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShnb3NzaXAgPSBjYXNlX3doZW4oDQogICAgZ29zc2lwX2h5cCA9PSAxIH4gIlllcyIsDQogICAgZ29zc2lwX29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChnb3NzaXBfaHlwID09IDAgJiBnb3NzaXBfb3BwID09IDApIH4gIk5vIC0gRXF1YWwiKSkgJT4lDQogIG11dGF0ZShzaG9vdCA9IGNhc2Vfd2hlbigNCiAgICBzaG9vdF9oeXAgPT0gMSB+ICJZZXMiLA0KICAgIHNob290X29wcCA9PSAxIH4gIk5vIC0gT3Bwb3NpdGUiLA0KICAgIChzaG9vdF9oeXAgPT0gMCAmIHNob290X29wcCA9PSAwKSB+ICJObyAtIEVxdWFsIikpICU+JQ0KICBtdXRhdGUoY2hlYXRpbmcgPSBjYXNlX3doZW4oDQogICAgY2hlYXRpbmdfaHlwID09IDEgfiAiWWVzIiwNCiAgICBjaGVhdGluZ19vcHAgPT0gMSB+ICJObyAtIE9wcG9zaXRlIiwNCiAgICAoY2hlYXRpbmdfaHlwID09IDAgJiBjaGVhdGluZ19vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgbXV0YXRlKHNleGlzbSA9IGNhc2Vfd2hlbigNCiAgICBzZXhpc21faHlwID09IDEgfiAiWWVzIiwNCiAgICBzZXhpc21fb3BwID09IDEgfiAiTm8gLSBPcHBvc2l0ZSIsDQogICAgKHNleGlzbV9oeXAgPT0gMCAmIHNleGlzbV9vcHAgPT0gMCkgfiAiTm8gLSBFcXVhbCIpKSAlPiUNCiAgZ3JvdXBfYnkoUmVzcG9uc2VJZCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gKGModGhlZnQsIGNha2Vob2FyZCwgc21va2luZywgcGxheWJvb2ssIGJvbnVzLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJvaWRzLHJldmVuZ2UsIGVudnksIHJlc3BvbnNpYmlsaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgIGluc3VsdGluZywgcmFjaXNtLCBjcml0aWNpemluZyx2aW9sZW5jZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBzcGVlZGluZywgcGVzdCwgbHlpbmcsIGdvc3NpcCwgc2hvb3QsDQogICAgICAgICAgICAgICAgICAgICAgICAgY2hlYXRpbmcsc2V4aXNtKSksDQogICAgICAgICAgICAgICBuYW1lc190byA9ICJ2aWduZXR0ZV9uYW1lIiwNCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJmaXRzX2h5cCIpICU+JQ0KICBkcm9wX25hKGZpdHNfaHlwKQ0KDQpjbG9zZW90aGVyX2xhYnMgPC0gYygiVGhlZnQiLCAiQ2FrZSBIb2FyZGluZyIsICJTbW9raW5nIiwgIlBsYXlib29rIiwgIkJvbnVzIiwgIlN0ZXJvaWRzIiwgIlJldmVuZ2UiLA0KICAgICAgICAgICAgICAgICAgICJFbnZ5IiwgIlJlc3BvbnNpYmlsaXR5IiwiSW5zdWx0aW5nIiwgIlJhY2lzbSIsICJDcml0aWNpemluZyIsICJWaW9sZW5jZSIsICJTcGVlZGluZyIsDQogICAgICAgICAgICAgICAgICAgIlBlc3QiLCAiTHlpbmciLCAiR29zc2lwIiwgIlNob290aW5nIiwgIkNoZWF0aW5nIiwiU2V4aXNtIikNCm5hbWVzKGNsb3Nlb3RoZXJfbGFicykgPC0gYygidGhlZnQiLCAiY2FrZWhvYXJkIiwgInNtb2tpbmciLCAicGxheWJvb2siLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiYm9udXMiLCJzdGVyb2lkcyIsICJyZXZlbmdlIiwgImVudnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicmVzcG9uc2liaWxpdHkiLCAiaW5zdWx0aW5nIiwicmFjaXNtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNyaXRpY2l6aW5nIiwidmlvbGVuY2UiLCAic3BlZWRpbmciLCAicGVzdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJseWluZyIsICJnb3NzaXAiLCAic2hvb3QiLCJjaGVhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJzZXhpc20iKQ0KYGBgDQoNCiMjIFN0cmFuZ2VyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX3NfdmlncGxvdCA8LSBnZ3Bsb3QoUzNfdmlnbmV0dGVzX3MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gYXMuY2hhcmFjdGVyKGZpdHNfaHlwKSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IGFzLmNoYXJhY3RlcihmaXRzX2h5cCkpKSArDQogIGdlb21fYmFyKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJncmV5MzAiLCIjOGIxNjE2IiwgIiNDRUEzMzUiKSwgbmFtZSA9ICJGaXRzIEh5cG90aGVzaXMiKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTAuMSwxMDAuMSksIGJyZWFrcyA9IGMoMCwgMjAsIDQwLCA2MCwgODAsIDEwMCkpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH4gdmlnbmV0dGVfbmFtZSwgbmNvbCA9IDUsIGxhYmVsbGVyID0gbGFiZWxsZXIodmlnbmV0dGVfbmFtZSA9IHN0cmFuZ2VyX2xhYnMpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCg0KZ2dzYXZlKCJTM19zX3ZpZ3Bsb3QucG5nIikNCmBgYA0KIyMgQ2xvc2UgT3RoZXIgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfY29fdmlncGxvdCA8LSBnZ3Bsb3QoUzNfdmlnbmV0dGVzX2NvLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IGFzLmNoYXJhY3RlcihmaXRzX2h5cCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBhcy5jaGFyYWN0ZXIoZml0c19oeXApKSkgKw0KICBnZW9tX2JhcigpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTMwIiwiIzhiMTYxNiIsICIjQ0VBMzM1IiksIG5hbWUgPSAiRml0cyBIeXBvdGhlc2lzIikrDQogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKC0wLjEsMTAwLjEpLCBicmVha3MgPSBjKDAsIDIwLCA0MCwgNjAsIDgwLCAxMDApKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+IHZpZ25ldHRlX25hbWUsIG5jb2wgPSA1LCBsYWJlbGxlciA9IGxhYmVsbGVyKHZpZ25ldHRlX25hbWUgPSBjbG9zZW90aGVyX2xhYnMpKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCg0KZ2dzYXZlKCJTM19jb192aWdwbG90LnBuZyIpDQpgYGANCiMjIEludGVyYWN0aW9uDQpgYGB7cn0NCiMgQ3JlYXRlIGEgdmFyaWFibGUgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhdHRlcm4gb3V0IG9mIGV2ZXJ5IHBvc3NpYmxlIGNvbWJpbmF0aW9uIG9mIHJlc3VsdHMgYSBwYXJ0aWN1bGFyIHBhcnRpY2lwYW50IGZvbGxvd2VkIA0KUzMgPC0gUzMgJT4lDQogIG11dGF0ZSgiSW50ZXJhY3Rpb24iID0gY2FzZV93aGVuKA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA9PSAwICYgU3RyYW5nZXJBdmVyYWdlID09IDApIH4gIlplcm8sIFplcm8sIFplcm8iLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA9PSAwICYgU3RyYW5nZXJBdmVyYWdlIDwgMCkgfiAiWmVybywgTmVnLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA9PSAwICYgU3RyYW5nZXJBdmVyYWdlID4gMCkgfiAiWmVybywgUG9zLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPT0gMCkgfiAiTmVnLCBaZXJvLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPT0gU3RyYW5nZXJBdmVyYWdlKSB+ICJOZWcsIE5lZywgWmVybyIsDQogICAgKENsb3NlT3RoZXJBdmVyYWdlIDwgMCAmIFN0cmFuZ2VyQXZlcmFnZSA+IDApIH4gIk5lZywgUG9zLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPiBTdHJhbmdlckF2ZXJhZ2UpIH4gIk5lZywgTmVnLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA8IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPCAwICYgQ2xvc2VPdGhlckF2ZXJhZ2UgPCBTdHJhbmdlckF2ZXJhZ2UpIH4gIk5lZywgTmVnLCBOZWciLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA+IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPT0gMCkgfiAiUG9zLCBaZXJvLCBQb3MiLA0KICAgIChDbG9zZU90aGVyQXZlcmFnZSA+IDAgJiBTdHJhbmdlckF2ZXJhZ2UgPCAwKSB+ICJQb3MsIE5lZywgUG9zIiwgDQogICAgKENsb3NlT3RoZXJBdmVyYWdlID4gMCAmIFN0cmFuZ2VyQXZlcmFnZSA+IDAgJiBDbG9zZU90aGVyQXZlcmFnZSA9PSBTdHJhbmdlckF2ZXJhZ2UpIH4gIlBvcywgUG9zLCBaZXJvIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgU3RyYW5nZXJBdmVyYWdlID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlIDwgU3RyYW5nZXJBdmVyYWdlKSB+ICJQb3MsIFBvcywgTmVnIiwNCiAgICAoQ2xvc2VPdGhlckF2ZXJhZ2UgPiAwICYgU3RyYW5nZXJBdmVyYWdlID4gMCAmIENsb3NlT3RoZXJBdmVyYWdlID4gU3RyYW5nZXJBdmVyYWdlKSB+ICJQb3MsIFBvcywgUG9zIikpDQoNCiMgZGVmaW5lIGxldmVscw0KZmFjdG9yX2xldmVscyA8LSBjKCJOZWcsIE5lZywgTmVnIiwNCiAgICAgICAgICAgICAgICAgICAiTmVnLCBOZWcsIFBvcyIsDQogICAgICAgICAgICAgICAgICAgIk5lZywgTmVnLCBaZXJvIiwNCiAgICAgICAgICAgICAgICAgICAiTmVnLCBQb3MsIE5lZyIsDQogICAgICAgICAgICAgICAgICAgIk5lZywgWmVybywgTmVnIiwNCiAgICAgICAgICAgICAgICAgICAiUG9zLCBOZWcsIFBvcyIsDQogICAgICAgICAgICAgICAgICAgIlBvcywgUG9zLCBOZWciLA0KICAgICAgICAgICAgICAgICAgICJQb3MsIFBvcywgUG9zIiwgIyBwcmVkaWN0ZWQgcGF0dGVybg0KICAgICAgICAgICAgICAgICAgICJQb3MsIFBvcywgWmVybyIsDQogICAgICAgICAgICAgICAgICAgIlBvcywgWmVybywgUG9zIiwNCiAgICAgICAgICAgICAgICAgICAiWmVybywgTmVnLCBQb3MiLA0KICAgICAgICAgICAgICAgICAgICJaZXJvLCBQb3MsIE5lZyIsDQogICAgICAgICAgICAgICAgICAgIlplcm8sIFplcm8sIFplcm8iKQ0KDQojIG1ha2UgdmFyaWFibGUgYSBmYWN0b3INClMzJEludGVyYWN0aW9uIDwtIGZhY3RvcihTMyRJbnRlcmFjdGlvbiwgbGV2ZWxzID0gZmFjdG9yX2xldmVscykNCmBgYA0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCiMgVmlzdWFsaXplIHRoZSBmcmVxdWVuY3kgb2YgZXZlcnkgcGF0dGVybg0KcHJpbnQoUzNfaW50X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBTMywgYWVzKHggPSBJbnRlcmFjdGlvbiwgZmlsbCA9IEludGVyYWN0aW9uKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIsIHNpemUgPSAwLjUpICsNCiAgICAgICAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKC0wLjUsIDEwMC41KSkgKw0KICAgICAgICBzY2FsZV94X2Rpc2NyZXRlKGRyb3AgPSBGQUxTRSkgKw0KICAgICAgICBzY2FsZV9maWxsX21hbnVhbChkcm9wID0gRkFMU0UsIHZhbHVlcyA9IGMoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpZ2h0Z3JleSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhenVyZTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWdodGdyZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWdodGdyZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWdodGdyZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhenVyZTQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlnaHRncmV5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxhY2siLCAjIGdyb3VwLWxldmVsIHBhdHRlcm4gYmFzZWQgb24gZmFjdG9yX2xldmVscywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlnaHRncmV5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXp1cmU0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF6dXJlNCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWdodGdyZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaWdodGdyZXkiKSkgKw0KICAgICAgICB0aGVtZV9jbGFzc2ljKCkgKw0KICAgICAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgDQogICAgICAgIHhsYWIoIlxuSW50ZXJhY3Rpb24gUGF0dGVybiAoU3RyYW5nZXIgSnVkZ21lbnQsIENsb3NlIE90aGVyIEp1ZGdtZW50LCBDbG9zZSBPdGhlciAtIFN0cmFuZ2VyKSIpICsNCiAgICAgICAgeWxhYigiUGFydGljaXBhbnQgQ291bnRcbiIpICsgIA0KICAgICAgICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNCwgYW5nbGUgPSA2MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTAuNSksDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDIwKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCg0KZ2dzYXZlKCJTM19pbnRfcGxvdC5wbmciKQ0KYGBgDQoNCiMgUm9idXN0bmVzcyBQbG90cyB7LnRhYnNldH0NCkhlcmUsIHdlIGludmVzdGlnYXRlIHRoZSBudW1iZXIgb2YgcGFydGljaXBhbnRzIG1hdGNoaW5nIHByZWRpY3RlZCBlZmZlY3RzIGJ5IGRlbW9ncmFwaGljcyBpbiBvcmRlciB0byBjYXRhbG9nIHRoZSBnZW5lcmFsaXR5IChvciBsYWNrIHRoZXJlb2YpIG9mIHRoZXNlIGVmZmVjdHMgYWNyb3NzIGxldmVscyBvZiB2YXJpb3VzIHRoZSBkZW1vZ3JhcGhpY3MgdGhhdCB3ZSBjb2xsZWN0ZWQuDQpgYGB7cn0NCiMgY3JlYXRlIHllcy9ubyB2YXJpYWJsZSBmb3Igc2ltcGxlIGh5cG90aGVzZXMNClMzX3MgPC0gUzNfcyAlPiUNCiAgbXV0YXRlKGZpdHNfaHlwID0gaWZfZWxzZShTdHJhbmdlckF2ZXJhZ2UgPiAwLCAiWWVzIiwgIk5vIikpDQoNCiMgY3JlYXRlIHllcy9ubyB2YXJpYWJsZSBmb3Igc2ltcGxlIGh5cG90aGVzZXMNClMzX2NvIDwtIFMzX2NvICU+JQ0KICBtdXRhdGUoZml0c19oeXAgPSBpZl9lbHNlKENsb3NlT3RoZXJBdmVyYWdlID4gMCwgIlllcyIsICJObyIpKQ0KDQojIGNyZWF0ZSB5ZXMvbm8gdmFyaWFibGUgZm9yIGludGVyYWN0aW9uIGh5cG90aGVzaXMNClMzIDwtIFMzICU+JQ0KICBtdXRhdGUoZml0c19oeXAgPSBpZl9lbHNlKEludGVyYWN0aW9uID09ICJQb3MsIFBvcywgUG9zIiwgIlllcyIsICJObyIpKQ0KYGBgDQoNCiMjIEVkdWNhdGlvbiB7LnRhYnNldH0NCg0KIyMjIFN0cmFuZ2VyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX3NfZWR1YyA8LSBnZ3Bsb3QoUzNfcywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5FZHVjYXRpb24pICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgQ2xvc2UgT3RoZXIgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfY29fZWR1YyA8LSBnZ3Bsb3QoUzNfY28sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+RWR1Y2F0aW9uKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfZWR1YyA8LSBnZ3Bsb3QoUzMsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIEludGVyYWN0aW9uIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+RWR1Y2F0aW9uKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KDQojIyBQb2xpdGljYWwgUGFydHkgey50YWJzZXR9DQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTM19zX3BvbCA8LSBnZ3Bsb3QoUzNfcywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5Qb2xpdGljYWxQYXJ0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBDbG9zZSBPdGhlciBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTM19jb19wb2wgPC0gZ2dwbG90KFMzX2NvLCBhZXMoeCA9IGZpdHNfaHlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyZXkzMCIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflBvbGl0aWNhbFBhcnR5KSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfcG9sIDwtIGdncGxvdChTMywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5Qb2xpdGljYWxQYXJ0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0KIyMgUmVsaWdpb3NpdHkgey50YWJzZXR9DQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTM19zX3JlbGlnIDwtIGdncGxvdChTM19zLCBhZXMoeCA9IGZpdHNfaHlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyZXkzMCIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflJlbGlnaW9zaXR5KSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX2NvX3JlbGlnIDwtIGdncGxvdChTM19jbywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5SZWxpZ2lvc2l0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBJbnRlcmFjdGlvbg0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX3JlbGlnIDwtIGdncGxvdChTMywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5SZWxpZ2lvc2l0eSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0KIyMgVXJiYW4gdnMgUnVyYWwgey50YWJzZXR9DQoNCiMjIyBTdHJhbmdlciBWaWduZXR0ZXMNCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTM19zX3VyYiA8LSBnZ3Bsb3QoUzNfcywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5MaXZpbmdBcmVhKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX2NvX3VyYiA8LSBnZ3Bsb3QoUzNfY28sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+TGl2aW5nQXJlYSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCiMjIyBJbnRlcmFjdGlvbg0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX3VyYiA8LSBnZ3Bsb3QoUzMsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIEludGVyYWN0aW9uIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+TGl2aW5nQXJlYSkgKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwgDQogICAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLA0KICAgICAgICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksIA0KICAgICAgICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNiksDQogICAgICAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxMiksDQogICAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsDQogICAgICAgICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSkpDQpgYGANCg0KIyMgR2VuZGVyIHsudGFic2V0fQ0KDQojIyMgU3RyYW5nZXIgVmlnbmV0dGVzDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfc19nZW5kZXIgPC0gZ2dwbG90KFMzX3MsIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+R2VuZGVyKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX2NvX2dlbmRlciA8LSBnZ3Bsb3QoUzNfY28sIGFlcyh4ID0gZml0c19oeXApKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZ3JleTMwIikgKw0KICB4bGFiKCJcbk1hdGNoZWQgUHJlZGljdGVkIFBhdHRlcm4iKSArDQogIHlsYWIoIk51bWJlciBvZiBQYXJ0aWNpcGFudHNcbiIpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZmFjZXRfd3JhcCh+R2VuZGVyKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIEludGVyYWN0aW9uDQpgYGB7ciwgZmlnLndpZHRoID0gMTQsIGZpZy5oZWlnaHQgPSA5LCBvdXQud2lkdGggPSAiNzUlIiwgb3V0LmhlaWdodCA9ICI3NSUifQ0KcHJpbnQoUzNfZ2VuZGVyIDwtIGdncGxvdChTMywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5HZW5kZXIpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQoNCiMjIFJhY2Ugey50YWJzZXR9DQpgYGB7cn0NCiMgbWFrZSByYWNlIG9uZSB2YXJpYWJsZQ0KUzNfcyA8LSBTM19zICU+JQ0KICBtdXRhdGUoUmFjZSA9IGNvYWxlc2NlKGBSYWNlL0V0aG5pY2l0eV8xYCwgYFJhY2UvRXRobmljaXR5XzJgLCBgUmFjZS9FdGhuaWNpdHlfM2AsIGBSYWNlL0V0aG5pY2l0eV80YCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgYFJhY2UvRXRobmljaXR5XzVgLCBgUmFjZS9FdGhuaWNpdHlfNmAsIGBSYWNlL0V0aG5pY2l0eV83YCwgYFJhY2UvRXRobmljaXR5XzhgKSkNCg0KUzNfY28gPC0gUzNfY28gJT4lDQogIG11dGF0ZShSYWNlID0gY29hbGVzY2UoYFJhY2UvRXRobmljaXR5XzFgLCBgUmFjZS9FdGhuaWNpdHlfMmAsIGBSYWNlL0V0aG5pY2l0eV8zYCwgYFJhY2UvRXRobmljaXR5XzRgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBgUmFjZS9FdGhuaWNpdHlfNWAsIGBSYWNlL0V0aG5pY2l0eV82YCwgYFJhY2UvRXRobmljaXR5XzdgLCBgUmFjZS9FdGhuaWNpdHlfOGApKQ0KDQpTMyA8LSBTMyAlPiUNCiAgbXV0YXRlKFJhY2UgPSBjb2FsZXNjZShgUmFjZS9FdGhuaWNpdHlfMWAsIGBSYWNlL0V0aG5pY2l0eV8yYCwgYFJhY2UvRXRobmljaXR5XzNgLCBgUmFjZS9FdGhuaWNpdHlfNGAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIGBSYWNlL0V0aG5pY2l0eV81YCwgYFJhY2UvRXRobmljaXR5XzZgLCBgUmFjZS9FdGhuaWNpdHlfN2AsIGBSYWNlL0V0aG5pY2l0eV84YCkpDQpgYGANCg0KIyMjIFN0cmFuZ2VyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX3NfcmFjZSA8LSBnZ3Bsb3QoUzNfcywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5SYWNlKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KIyMjIENsb3NlIE90aGVyIFZpZ25ldHRlcw0KYGBge3IsIGZpZy53aWR0aCA9IDE0LCBmaWcuaGVpZ2h0ID0gOSwgb3V0LndpZHRoID0gIjc1JSIsIG91dC5oZWlnaHQgPSAiNzUlIn0NCnByaW50KFMzX2NvX3JhY2UgPC0gZ2dwbG90KFMzX2NvLCBhZXMoeCA9IGZpdHNfaHlwKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyZXkzMCIpICsNCiAgeGxhYigiXG5NYXRjaGVkIFByZWRpY3RlZCBQYXR0ZXJuIikgKw0KICB5bGFiKCJOdW1iZXIgb2YgUGFydGljaXBhbnRzXG4iKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGZhY2V0X3dyYXAoflJhY2UpICsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksIA0KICAgICAgICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLCANCiAgICAgICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpLA0KICAgICAgICAgICAgICBzdHJpcC50ZXh0LnggPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTIpLA0KICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiLA0KICAgICAgICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTgpLA0KICAgICAgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibGFjayIsIHNpemUgPSAxNikpKQ0KYGBgDQojIyMgSW50ZXJhY3Rpb24NCmBgYHtyLCBmaWcud2lkdGggPSAxNCwgZmlnLmhlaWdodCA9IDksIG91dC53aWR0aCA9ICI3NSUiLCBvdXQuaGVpZ2h0ID0gIjc1JSJ9DQpwcmludChTM19yYWNlIDwtIGdncGxvdChTMywgYWVzKHggPSBmaXRzX2h5cCkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJncmV5MzAiKSArDQogIHhsYWIoIlxuTWF0Y2hlZCBQcmVkaWN0ZWQgSW50ZXJhY3Rpb24gUGF0dGVybiIpICsNCiAgeWxhYigiTnVtYmVyIG9mIFBhcnRpY2lwYW50c1xuIikgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBmYWNldF93cmFwKH5SYWNlKSArDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTgpLCANCiAgICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxOCksDQogICAgICAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwgDQogICAgICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE2KSwNCiAgICAgICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDEyKSwNCiAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IiwNCiAgICAgICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDE4KSwNCiAgICAgICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAiYmxhY2siLCBzaXplID0gMTYpKSkNCmBgYA0KDQoNCg0KDQoNCg0KDQo=