Data
mentoring <- read_csv(
"Univ Entp Ctr Mentoring Data 12-18-24.csv",
col_types = cols(.default = col_character()),
name_repair = "unique"
)
#Remove the Qualtrics question-text and ImportId rows
mentoring <- mentoring %>%
slice(-(1:2))
#Convert columns to numeric/date/etc. where appropriate
mentoring <- mentoring %>%
type_convert()
#Remove the preview/test response
mentoring <- mentoring %>%
filter(DistributionChannel != "preview")
usable_obs <- mentoring %>%
summarise(
`Q39 - Satisfaction` = sum(!is.na(Q39_1)),
`Q26 - Mentor Training` = sum(!is.na(Q26)),
`Q12a - Mentor Screening` = sum(!is.na(Q12...29)),
`Q6 - Mentoring Type` = sum(!is.na(Q6)),
`Q27 - Mentee Training` = sum(!is.na(Q27)),
`Q17 - Number of Mentors` = sum(!is.na(Q17)),
`Q19 - Number of Mentees` = sum(!is.na(Q19)),
`Q32 - Meeting Requirements` = sum(!is.na(Q32))
) %>%
pivot_longer(
everything(),
names_to = "Variable",
values_to = "Usable Observations"
)
usable_obs
# A tibble: 8 × 2
Variable `Usable Observations`
<chr> <int>
1 Q39 - Satisfaction 26
2 Q26 - Mentor Training 27
3 Q12a - Mentor Screening 27
4 Q6 - Mentoring Type 40
5 Q27 - Mentee Training 27
6 Q17 - Number of Mentors 27
7 Q19 - Number of Mentees 26
8 Q32 - Meeting Requirements 27
Just showing that for most of the variables we actually care about,
we only have around 26–27 usable responses. So even though there were 55
usable survey responses overall, we don’t really have 55 observations
available for most of the analysis.
That makes regression harder, especially if we try to include several
variables at once. With such a small sample, adding more predictors can
make the results unstable and harder to trust. Because of that, I think
regression with one predictor at a time, or maybe two when there is a
good reason for it, makes more sense.
Even then, we would still need to check the usual regression
assumptions before relying on the results.
I know you really wanted to work with Q17 and Q19. My understanding
was that the goal was to see what characteristics are associated with
programs that have higher mentor or mentee counts. The issue is that the
data for these two variables is pretty messy. We have very low and very
high values, ranges, and responses reported per month, per semester,
etc., as you can see below. Because of that, any analysis using Q17 or
Q19 would be harder to clean and interpret, and the results would be
less straightforward.
head(mentoring$Q19[!is.na(mentoring$Q19)])
[1] "10-20 at any one time"
[2] "45"
[3] "Varies, but on average 20 per semester"
[4] "15-20"
[5] "90"
[6] "varies"
head(mentoring$Q17[!is.na(mentoring$Q19)])
[1] "35"
[2] "13"
[3] "30"
[4] "2-3"
[5] "100+"
[6] "We have a list of 300 interested mentors. Sometimes we try to make an individual match. At certain times during the year, we put out a mass call for mentors and usually get 25-50 responses."
It’s also important to have a defined set of things we actually want
to test instead of just running tests on everything and keeping whatever
comes out significant. If there really is no relationship, each test run
at the .05 level still has a 5% chance of showing a significant result
just by chance. So the more tests we run, the more likely we are to
eventually find something that looks significant even if it really
isn’t. Because of that, we need to adjust for the number of tests we
run, which makes it harder for a result to be considered statistically
significant.
For the main analysis, I think Q39 makes the most sense to focus on.
It is the cleanest outcome, directly measures satisfaction with the
success of the mentoring program, and we have enough usable responses to
compare groups. Based on the research question, the literature, and the
variables that make the most sense to compare, I want to test whether
satisfaction differs between centers that do and do not have mentor
training/orientation (Q26), systematic mentor screening (Q12a), group
mentoring (Q6), and mentee training/orientation (Q27).
Instead of running a separate regression for each one, which would
require more assumptions, I am using the Wilcoxon rank-sum test. This is
a nonparametric test that basically compares the satisfaction scores
between the two groups and tests whether there is enough of a difference
to be considered statistically significant.
Since we are doing four main tests, I am using a Bonferroni
adjustment to account for the increased chance of a false positive.
Instead of comparing each p-value to .05, we divide .05 by 4, giving us
a cutoff of .0125. My analysis is shown below. For the rest of the
variables, I would mainly use descriptive statistics rather than
continuing to run more and more significance tests.
Main Analysis (Q39)
Q39 vs Q26 (Mentor training/orientation)
h1 <- mentoring %>% select("Q26", "Q39_1") %>% filter(!is.na(Q26), !is.na(Q39_1))
dim(h1)
h1 %>% group_by(Q26) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q26 Avg_Sat_Score
<dbl> <dbl>
1 1 6.06
2 2 4.6
h1 %>% count(Q26)
# A tibble: 2 × 2
Q26 n
<dbl> <int>
1 1 16
2 2 10
h1$Q26 <- as.factor(h1$Q26)
model <- lm(Q39_1 ~ Q26, data = h1)
summary(model)
Call:
lm(formula = Q39_1 ~ Q26, data = h1)
Residuals:
Min 1Q Median 3Q Max
-2.6000 -0.0625 -0.0625 0.4000 2.4000
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.0625 0.2857 21.222 < 2e-16 ***
Q262 -1.4625 0.4606 -3.175 0.00408 **
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.143 on 24 degrees of freedom
Multiple R-squared: 0.2958, Adjusted R-squared: 0.2664
F-statistic: 10.08 on 1 and 24 DF, p-value: 0.00408
wilcox_test(Q39_1 ~ Q26,
data = h1,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q26 (1, 2)
Z = 2.825, p-value = 0.002416
alternative hypothesis: true mu is not equal to 0
Since 0.002416 < .0125, the exact Wilcoxon rank-sum test showed a
statistically significant difference in Q39 satisfaction between centers
that trained/oriented mentors and centers that did not. Centers that
trained mentors had higher satisfaction scores.
In the best-practices section of the white paper, I believe you said
something along the lines of mentors should be carefully selected,
trained, and monitored. And training helps create more consistent
mentoring experiences and “improves the likelihood of successful
mentoring relationships.” So this can help support that.
“Centers that trained/oriented mentors reported higher satisfaction
scores on average (6.06) than centers that did not (4.60). This
difference was statistically significant using the Bonferroni-adjusted
significance level (exact Wilcoxon rank-sum test, p = .0024; adjusted α
= .0125).”lastl
Q39 vs Q12a (Systematic Mentor Screening)
mentoring %>% select(Q12...29, ResponseId ) %>% filter(ResponseId %in% c("R_1L1NCLAo9DccZHy", "R_6kByFGcXtrDD9gM", "R_7g9Z78s3btx4dAl"))
h2 <- mentoring %>% select("Q12...29", "Q39_1") %>% filter(!is.na(Q12...29), !is.na(Q39_1))
dim(h2)
h2 %>% group_by(Q12...29) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q12...29 Avg_Sat_Score
<dbl> <dbl>
1 1 6.08
2 2 4.92
h2 %>% count(Q12...29)
# A tibble: 2 × 2
Q12...29 n
<dbl> <int>
1 1 13
2 2 13
h2$Q12...29 <- as.factor(h2$Q12...29)
wilcox_test(Q39_1 ~ Q12...29,
data = h2,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q12...29 (1, 2)
Z = 2.3445, p-value = 0.01752
alternative hypothesis: true mu is not equal to 0
Using the Bonferroni-adjusted significance level of .0125, the
difference was not statistically significant (p = .0175). However, there
was still a noticeable difference in the observed satisfaction scores.
Centers that systematically screened mentors had an average satisfaction
score of 6.08 compared with 4.92 for centers that did not. So while
there is not enough statistical evidence to call the result significant
after the adjustment, the pattern is still worth noting, especially
because it lines up with the literature.
I believe you said that mentor selection is an important factor, and
you specifically mention systematic identification and screening of
mentors as a recommended practice. So even though this result is not
statistically significant after the Bonferroni adjustment, the higher
satisfaction scores among centers that systematically screen mentors
still line up with and can help support that point.
Q39 vs Q6 (Group vs no group mentoring)
1 = Traditional mentoring 2 = Peer mentoring 3 = Group mentoring 4 =
Subject matter mentoring 5 = Other
mentoring %>% count(Q6)
h3 <- mentoring %>% select("Q6", "Q39_1") %>% filter(!is.na(Q6), !is.na(Q39_1))
dim(h3)
h3$Q6 <- as.character(h3$Q6)
h3$group_mentoring <- ifelse(
grepl("3", h3$Q6), 1, 2
)
h3 %>% group_by(group_mentoring) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
group_mentoring Avg_Sat_Score
<dbl> <dbl>
1 1 6.07
2 2 4.83
h3 %>% count(group_mentoring)
# A tibble: 2 × 2
group_mentoring n
<dbl> <int>
1 1 14
2 2 12
h3$group_mentoring <- as.factor(h3$group_mentoring)
wilcox_test(Q39_1 ~ group_mentoring,
data = h3,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by group_mentoring (1, 2)
Z = 2.2704, p-value = 0.02
alternative hypothesis: true mu is not equal to 0
Using the Bonferroni-adjusted significance level of .0125, this
result is not statistically significant (p = .0200). However, centers
that offered group mentoring still had higher satisfaction scores than
centers that did not, so there is still a noticeable difference in the
sample.
In the white paper, you discuss group mentoring as a model that
combines some of the benefits of traditional and peer mentoring, and you
also mention literature that recommends group or multiple mentoring in
higher education entrepreneurship programs. So while this result does
not meet the adjusted significance cutoff, it still goes in the same
direction as the literature and can help support that discussion.
“Centers that offered group mentoring reported higher satisfaction
scores on average (6.07) than centers that did not offer group mentoring
(4.83). However, the difference did not meet the Bonferroni-adjusted
significance level (exact Wilcoxon rank-sum test, p = .020; adjusted α =
.0125).”
Q39 vs Q27 (mentee training/orientation)
h4 <- mentoring %>% select("Q27", "Q39_1") %>% filter(!is.na(Q27), !is.na(Q39_1))
dim(h4)
h4 %>% group_by(Q27) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q27 Avg_Sat_Score
<dbl> <dbl>
1 1 6
2 2 4.82
h4 %>% count(Q27)
# A tibble: 2 × 2
Q27 n
<dbl> <int>
1 1 15
2 2 11
h4$Q27 <- as.factor(h4$Q27)
wilcox_test(Q39_1 ~ Q27,
data = h4,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q27 (1, 2)
Z = 2.1819, p-value = 0.02779
alternative hypothesis: true mu is not equal to 0
“Centers that trained/oriented mentees reported higher satisfaction
scores on average (6.00) than centers that did not (4.82). However, the
difference did not meet the Bonferroni-adjusted significance level
(exact Wilcoxon rank-sum test, p = .0278; adjusted α = .0125).”
This also lines up with the white paper, where you say that both
mentors and mentees benefit from selection, training, and monitoring,
and you specifically note that mentees also need training. So even
though this result is not statistically significant after the Bonferroni
adjustment, the pattern in the data still supports that idea.
Descriptive Comparisons
I also looked descriptively at software/platform use and whether the
Center was endowed. I did not include these as part of the four formal
hypothesis tests above because I wanted to limit the number of
significance tests being run.
For both comparisons, the average satisfaction scores happened to be
the same. Centers that used mentoring software/platforms had an average
satisfaction score of 5.00 compared with 5.87 for centers that did not
use software. Similarly, endowed Centers had an average satisfaction
score of 5.00 compared with 5.87 for Centers that were not endowed.
These two weren’t as tied to the literature as the others, but I saw
potential.
Q39 vs Q29 (software vs no software)
h5 <- mentoring %>% select("Q29", "Q39_1") %>% filter(!is.na(Q29), !is.na(Q39_1))
dim(h5)
h5$software <- ifelse(
grepl(9, h5$Q29), 2, 1
)
h5 %>% count(software)
# A tibble: 2 × 2
software n
<dbl> <int>
1 1 11
2 2 15
h5 %>% group_by(software) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
software Avg_Sat_Score
<dbl> <dbl>
1 1 5
2 2 5.87
Q39 vs Q40 (endowed)
h6 <- mentoring %>% select("Q40", "Q39_1") %>% filter(!is.na(Q40), !is.na(Q39_1))
dim(h6)
h6 %>% count(Q40)
# A tibble: 2 × 2
Q40 n
<dbl> <int>
1 1 11
2 2 15
h6 %>% group_by(Q40) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q40 Avg_Sat_Score
<dbl> <dbl>
1 1 5
2 2 5.87
Secondary Analysis (Q17, Q19 Analysis)
Cleaning Data
h7 <- mentoring %>% filter(!is.na(Q19))
h7 %>%
select(ResponseId, Q19)
# A tibble: 26 × 2
ResponseId Q19
<chr> <chr>
1 R_6kByFGcXtrDD9gM 10-20 at any one time
2 R_3DSuvNsKvRLzbDC 45
3 R_69I3YvqhQwelWAV Varies, but on average 20 per semester
4 R_3keU47VEwpCTqvv 15-20
5 R_1eQpcV7IaXVatlA 90
6 R_6fTXSDC9MbASfEM varies
7 R_1ihoyM0M3Z2lPG1 40+
8 R_3PTsrty8cQTVCGi 24 teams (75 students)
9 R_1uR7lvRTgWp1lQw 20
10 R_5ZGNn4d91ZltHTb 68
# ℹ 16 more rows
I decided to drop centers that gave responses like “varies,” “per
month,” or “annually” because those answers were not directly comparable
to the other mentee counts. For responses reported as a number with a
“+”, I used the stated number as a conservative estimate (for example,
100+ became 100). For ranges such as 10–20, I used the midpoint of the
range. This leaves us with 21 observations.
# dropping ids with the "a month" stuff
h7 <- h7 %>%
filter(!ResponseId %in% c(
"R_69I3YvqhQwelWAV",
"R_6fTXSDC9MbASfEM",
"R_1gZhRNgdQkOPqj7",
"R_3rpjXtCtopGgouZ",
"R_1uR7uWwaLikf5cJ"
))
h7 <- h7 %>%
mutate(
Q19 = case_when(
#10-20 at any one time -> midpoint = 15
ResponseId == "R_6kByFGcXtrDD9gM" ~ "15",
#15-20 -> midpoint = 18 (17.5 is weird)
ResponseId == "R_3keU47VEwpCTqvv" ~ "18",
#40+ -> use 40
ResponseId == "R_1ihoyM0M3Z2lPG1" ~ "40",
#24 teams (75 students) -> use 75 mentees
ResponseId == "R_3PTsrty8cQTVCGi" ~ "75",
#100+ -> use 100
ResponseId == "R_62X1veV8FqyOn7u" ~ "100",
#30+ -> use 30
ResponseId == "R_6oYkV2dub1z07M5" ~ "30",
TRUE ~ Q19
)
)
h7 <- h7 %>% mutate(Q19 = as.numeric(Q19))
h7 %>%
select(ResponseId, Q19)
# A tibble: 21 × 2
ResponseId Q19
<chr> <dbl>
1 R_6kByFGcXtrDD9gM 15
2 R_3DSuvNsKvRLzbDC 45
3 R_3keU47VEwpCTqvv 18
4 R_1eQpcV7IaXVatlA 90
5 R_1ihoyM0M3Z2lPG1 40
6 R_3PTsrty8cQTVCGi 75
7 R_1uR7lvRTgWp1lQw 20
8 R_5ZGNn4d91ZltHTb 68
9 R_5qdJti6oWwo85y6 30
10 R_6fJQhpX4tsywd21 25
# ℹ 11 more rows
h10 <- mentoring %>% filter(!is.na(Q17))
h10 <- h10 %>% filter(ResponseId != "R_6fTXSDC9MbASfEM")
h10 <- h10 %>%
mutate(
Q17 = case_when(
#2-3 -> midpoint
ResponseId == "R_3keU47VEwpCTqvv" ~ "2.5",
#100+ -> conservative lower bound
ResponseId == "R_1eQpcV7IaXVatlA" ~ "100",
#stable of >100 -> conservative lower bound
ResponseId == "R_1ihoyM0M3Z2lPG1" ~ "100",
#75 currently formally signed up; ~300 total list
#use the 75 currently signed up
ResponseId == "R_3PTsrty8cQTVCGi" ~ "75",
#Active 57; 260 on the roll
#use active mentors
ResponseId == "R_5ZGNn4d91ZltHTb" ~ "57",
#30 people -> 30
ResponseId == "R_1gZhRNgdQkOPqj7" ~ "30",
#80-100 -> midpoint
ResponseId == "R_3rpjXtCtopGgouZ" ~ "90",
#20-25 -> midpoint
ResponseId == "R_1wslaqFQKrvPQLG" ~ "22.5",
#25+ -> conservative lower bound
ResponseId == "R_6oYkV2dub1z07M5" ~ "25",
TRUE ~ Q17
)
)
h10 <- h10 %>% mutate(Q17 = as.numeric(Q17))
Q19 vs Q32 (Require/Specify Mentor Meetings)
h8 <- h7 %>% select(Q19, Q32)
h8 %>% count(Q32)
# A tibble: 2 × 2
Q32 n
<dbl> <int>
1 1 14
2 2 7
h8 %>% group_by(Q32) %>% summarise("Median Number of Mentees" = median(Q19))
# A tibble: 2 × 2
Q32 `Median Number of Mentees`
<dbl> <dbl>
1 1 42.5
2 2 18
Programs that require or specify mentor-mentee meetings had a higher
median number of mentees (42.5) than programs that did not (18). This
suggests that more structured programs tend to have more mentees.
h8$Q32 <- as.factor(h8$Q32)
wilcox_test(Q19 ~ Q32,
data = h8,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q19 by Q32 (1, 2)
Z = 2.3562, p-value = 0.01666
alternative hypothesis: true mu is not equal to 0
h11 <- h10 %>% select(Q17, Q32)
h11 %>% group_by(Q32) %>% summarise("Median Number of Mentors" = median(Q17))
# A tibble: 2 × 2
Q32 `Median Number of Mentors`
<dbl> <dbl>
1 1 50
2 2 27
h11$Q32 <- as.factor(h11$Q32)
wilcox_test(Q17 ~ Q32,
data = h11,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q17 by Q32 (1, 2)
Z = 1.669, p-value = 0.09861
alternative hypothesis: true mu is not equal to 0
Requested Additional Analysis
Q39 vs Q16 (Satisfaction vs Require identifying goals)
h16 <- mentoring %>% select("Q16", "Q39_1") %>% filter(!is.na(Q16), !is.na(Q39_1))
dim(h2)
h16 %>% group_by(Q16) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q16 Avg_Sat_Score
<dbl> <dbl>
1 1 5.57
2 2 5.42
h16 %>% count(Q16)
# A tibble: 2 × 2
Q16 n
<dbl> <int>
1 1 14
2 2 12
h16$Q16 <- as.factor(h16$Q16)
wilcox_test(Q39_1 ~ Q16,
data = h16,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q16 (1, 2)
Z = 0.35138, p-value = 0.7478
alternative hypothesis: true mu is not equal to 0
Q19 vs Q16 (Mentee Count vs Require identifying goals)
h17 <- h7 %>% select("Q16", "Q19") %>% filter(!is.na(Q16), !is.na(Q19))
dim(h17)
h17 %>% group_by(Q16) %>% summarise("Median Number of Mentees" = median(Q19))
# A tibble: 2 × 2
Q16 `Median Number of Mentees`
<dbl> <dbl>
1 1 35
2 2 25
h17$Q16 <- as.factor(h17$Q16)
wilcox_test(Q19 ~ Q16,
data = h17,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q19 by Q16 (1, 2)
Z = 0.91782, p-value = 0.3758
alternative hypothesis: true mu is not equal to 0
Q17 vs Q16 (Require identifying goals)
h18 <- h10 %>% select("Q16", "Q17") %>% filter(!is.na(Q16), !is.na(Q17))
dim(h18)
h18 %>% group_by(Q16) %>% summarise("Median Number of Mentors" = median(Q17))
# A tibble: 2 × 2
Q16 `Median Number of Mentors`
<dbl> <dbl>
1 1 45
2 2 27
h18$Q16 <- as.factor(h18$Q16)
wilcox_test(Q17 ~ Q16,
data = h18,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q17 by Q16 (1, 2)
Z = 1.2619, p-value = 0.2158
alternative hypothesis: true mu is not equal to 0
Q39 vs Q32 (Satisfaction vs Requiring meetings)
h19 <- mentoring %>% select("Q32", "Q39_1") %>% filter(!is.na(Q32), !is.na(Q39_1))
dim(h19)
h19 %>% group_by(Q32) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q32 Avg_Sat_Score
<dbl> <dbl>
1 1 5.5
2 2 5.5
h19 %>% count(Q32)
# A tibble: 2 × 2
Q32 n
<dbl> <int>
1 1 18
2 2 8
h19$Q32 <- as.factor(h19$Q32)
wilcox_test(Q39_1 ~ Q32,
data = h19,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q32 (1, 2)
Z = 0.35033, p-value = 0.7451
alternative hypothesis: true mu is not equal to 0
Q39 vs Q22 (Satisfaction vs Mentor’s Financial Involvement)
mentoring %>% group_by(Q22) %>% summarise(count = n())
# A tibble: 6 × 2
Q22 count
<dbl> <int>
1 1 2
2 2 14
3 3 2
4 4 8
5 5 1
6 NA 28
h20 <- mentoring %>%
mutate(
Q22_B = case_when(
Q22 %in% c(1, 2) ~ 2,
Q22 %in% c(3, 4) ~ 1,
TRUE ~ NA_real_
)
)
h21 <- h20 %>% select("Q22_B", "Q39_1") %>% filter(!is.na(Q22_B), !is.na(Q39_1))
dim(h21)
[1] 25 2
h21 %>% group_by(Q22_B) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q22_B Avg_Sat_Score
<dbl> <dbl>
1 1 5.4
2 2 5.47
h21 %>% count(Q22_B)
# A tibble: 2 × 2
Q22_B n
<dbl> <int>
1 1 10
2 2 15
h21$Q22_B <- as.factor(h21$Q22_B)
wilcox_test(Q39_1 ~ Q22_B,
data = h21,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q22_B (1, 2)
Z = 0, p-value = 1
alternative hypothesis: true mu is not equal to 0
Q39 vs Q28 (Satisfaction vs Protocol to Remove Mentor)
mentoring %>% group_by(Q28) %>% summarise(count = n())
# A tibble: 6 × 2
Q28 count
<dbl> <int>
1 1 4
2 3 2
3 4 13
4 12 7
5 13 1
6 NA 28
h22 <- mentoring %>%
mutate(
Q28_B = case_when(
Q28 %in% c("1", "2", "3", "12", "13") ~ 1,
Q28 == "4" ~ 2,
TRUE ~ NA_real_
)
)
h22 %>% group_by(Q28_B) %>% summarise(count = n())
# A tibble: 3 × 2
Q28_B count
<dbl> <int>
1 1 14
2 2 13
3 NA 28
h22 <- h22 %>% select("Q28_B", "Q39_1") %>% filter(!is.na(Q28_B), !is.na(Q39_1))
dim(h22)
[1] 26 2
h22 %>% group_by(Q28_B) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 2 × 2
Q28_B Avg_Sat_Score
<dbl> <dbl>
1 1 5.62
2 2 5.38
h22 %>% count(Q28_B)
# A tibble: 2 × 2
Q28_B n
<dbl> <int>
1 1 13
2 2 13
h22$Q28_B <- as.factor(h22$Q28_B)
wilcox_test(Q39_1 ~ Q28_B,
data = h22,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q39_1 by Q28_B (1, 2)
Z = 0.48508, p-value = 0.6313
alternative hypothesis: true mu is not equal to 0
Q39 vs Q23 (Online only meetings vs not)
mentoring %>% group_by(Q23) %>% summarise(count = n())
# A tibble: 7 × 2
Q23 count
<dbl> <int>
1 1 1
2 3 2
3 13 6
4 123 4
5 134 4
6 1234 10
7 NA 28
It appears that 25 centers offer in-person meetings, while only 2 do
not. This makes Q23 too unbalanced for a meaningful comparison.
Q19 vs Q29 (Mentee count vs Software use)
h24 <- h7 %>% select("Q29", "Q19") %>% filter(!is.na(Q29), !is.na(Q19))
dim(h24)
h24$software <- ifelse(
grepl(9, h24$Q29), 2, 1
)
h24 %>% count(software)
# A tibble: 2 × 2
software n
<dbl> <int>
1 1 7
2 2 14
h24 %>% group_by(software) %>% summarise("Median Number of Mentees" = median(Q19))
# A tibble: 2 × 2
software `Median Number of Mentees`
<dbl> <dbl>
1 1 30
2 2 27.5
h24$software <- as.factor(h24$software)
wilcox_test(Q19 ~ software,
data = h24,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q19 by software (1, 2)
Z = 0.4488, p-value = 0.675
alternative hypothesis: true mu is not equal to 0
Q17 vs Q29 (Mentor count vs Software use)
h25 <- h10 %>% select("Q29", "Q17") %>% filter(!is.na(Q29), !is.na(Q17))
dim(h25)
h25$software <- ifelse(
grepl(9, h25$Q29), 2, 1
)
h25 %>% count(software)
# A tibble: 2 × 2
software n
<dbl> <int>
1 1 11
2 2 15
h25 %>% group_by(software) %>% summarise("Median Number of Mentors" = median(Q17))
# A tibble: 2 × 2
software `Median Number of Mentors`
<dbl> <dbl>
1 1 40
2 2 25
h25$software <- as.factor(h25$software)
wilcox_test(Q17 ~ software,
data = h25,
distribution = "exact")
Exact Wilcoxon-Mann-Whitney Test
data: Q17 by software (1, 2)
Z = 1.819, p-value = 0.07047
alternative hypothesis: true mu is not equal to 0
Q39 vs Q31 (Satisfaction vs Majority Mentees Undergrad)
h31 <- mentoring %>%
mutate(
Q31_total = rowSums(across(Q31_1:Q31_8)),
Q31_B = case_when(
Q31_total == 100 & Q31_1 > 50 ~ 1,
Q31_total == 100 & Q31_1 <= 50 ~ 0,
TRUE ~ NA_real_
)
)
# Check group counts
h31 %>%
filter(!is.na(Q39_1)) %>%
count(Q31_B)
# A tibble: 3 × 2
Q31_B n
<dbl> <int>
1 0 10
2 1 15
3 NA 1
h31 %>% group_by(Q31_B) %>% summarise("Avg_Sat_Score" = mean(Q39_1))
# A tibble: 3 × 2
Q31_B Avg_Sat_Score
<dbl> <dbl>
1 0 5.9
2 1 5.27
3 NA NA
# Compare satisfaction
wilcox.test(Q39_1 ~ Q31_B, data = h31)
Wilcoxon rank sum test with continuity correction
data: Q39_1 by Q31_B
W = 91.5, p-value = 0.3493
alternative hypothesis: true location shift is not equal to 0
Holm Adjusted P-values
raw_p <- c(
Q39_Q26 = 0.002416,
Q39_Q9 = 0.005853,
Q39_Q12a = 0.01752,
Q39_Q6 = 0.02000,
Q39_Q27 = 0.02779,
Q19_Q32 = 0.01666,
Q17_Q32 = 0.09861,
Q19_Q9 = 0.06369,
Q17_Q9 = 0.11860,
Q39_Q16 = 0.74780,
Q19_Q16 = 0.37580,
Q17_Q16 = 0.21580,
Q39_Q32 = 0.74510,
Q39_Q22 = 1.00000,
Q39_Q28 = 0.63130,
Q39_Q37 = 0.39590,
Q19_Q29 = 0.67500,
Q17_Q29 = 0.07047,
Q39_Q31 = 0.34930
)
results <- data.frame(
Comparison = names(raw_p),
Raw_P = unname(raw_p),
Holm_P = unname(p.adjust(raw_p, method = "holm"))
)
results$Significant_Holm <- results$Holm_P < 0.05
results
Comparison Raw_P Holm_P Significant_Holm
1 Q39_Q26 0.002416 0.045904 TRUE
2 Q39_Q9 0.005853 0.105354 FALSE
3 Q39_Q12a 0.017520 0.283220 FALSE
4 Q39_Q6 0.020000 0.300000 FALSE
5 Q39_Q27 0.027790 0.389060 FALSE
6 Q19_Q32 0.016660 0.283220 FALSE
7 Q17_Q32 0.098610 1.000000 FALSE
8 Q19_Q9 0.063690 0.827970 FALSE
9 Q17_Q9 0.118600 1.000000 FALSE
10 Q39_Q16 0.747800 1.000000 FALSE
11 Q19_Q16 0.375800 1.000000 FALSE
12 Q17_Q16 0.215800 1.000000 FALSE
13 Q39_Q32 0.745100 1.000000 FALSE
14 Q39_Q22 1.000000 1.000000 FALSE
15 Q39_Q28 0.631300 1.000000 FALSE
16 Q39_Q37 0.395900 1.000000 FALSE
17 Q19_Q29 0.675000 1.000000 FALSE
18 Q17_Q29 0.070470 0.845640 FALSE
19 Q39_Q31 0.349300 1.000000 FALSE
Building Models
models <- mentoring %>%
mutate(
mentor_training = case_when(
Q26 == 1 ~ 1,
Q26 == 2 ~ 0,
TRUE ~ NA_real_
),
formal_program = case_when(
Q9 == 1 ~ 1,
Q9 == 2 ~ 0,
TRUE ~ NA_real_
),
mentor_screening = case_when(
Q12...29 == 1 ~ 1,
Q12...29 == 2 ~ 0,
TRUE ~ NA_real_
),
group_mentoring = case_when(
is.na(Q6) ~ NA_real_,
grepl("3", as.character(Q6)) ~ 1,
TRUE ~ 0
)
)
Model 1: Mentor training + formal program → Satisfaction
m1 <- models %>%
select(Q39_1, mentor_training, formal_program) %>%
filter(complete.cases(.))
m1 %>% count(mentor_training, formal_program)
# A tibble: 4 × 3
mentor_training formal_program n
<dbl> <dbl> <int>
1 0 0 3
2 0 1 7
3 1 0 2
4 1 1 14
model1 <- lm(
Q39_1 ~ mentor_training + formal_program,
data = m1
)
summary(model1)
Call:
lm(formula = Q39_1 ~ mentor_training + formal_program, data = m1)
Residuals:
Min 1Q Median 3Q Max
-1.3409 -0.2873 -0.2873 0.7127 1.8604
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.3409 0.4319 7.735 7.61e-08 ***
mentor_training 1.1477 0.3741 3.068 0.005442 **
formal_program 1.7987 0.4618 3.895 0.000729 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.9061 on 23 degrees of freedom
Multiple R-squared: 0.5757, Adjusted R-squared: 0.5388
F-statistic: 15.6 on 2 and 23 DF, p-value: 5.227e-05
Diagnostics
diagnostics1 <- m1 %>%
mutate(
residual = residuals(model1),
predicted = fitted(model1),
group = interaction(mentor_training, formal_program)
)
boxplot(residual ~ group,
data = diagnostics1,
main = "Residuals by Group",
xlab = "Mentor Training / Formal Program",
ylab = "Residuals")
stripchart(residual ~ group,
data = diagnostics1,
vertical = TRUE,
method = "jitter",
add = TRUE,
pch = 16)
abline(h = 0, col = "red", lty = 2)

car::leveneTest(residual ~ group,
data = diagnostics1,
center = median)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 0.8695 0.4718
22
shapiro.test(residuals(model1))
Shapiro-Wilk normality test
data: residuals(model1)
W = 0.89828, p-value = 0.01433
qqnorm(residuals(model1))
qqline(residuals(model1), col = "red")

# Cook's distance plot
plot(cooks.distance(model1),
type = "h",
main = "Cook's Distance - Model 1",
xlab = "Observation",
ylab = "Cook's Distance")
# Reference cutoff
abline(h = 4 / nobs(model1), col = "red", lty = 2)

which(cooks.distance(model1) > 4 / nobs(model1))
2 9 14 15 23
2 9 14 15 23
Model 2: Mentor screening + group mentoring → Satisfaction
(ignore)
m2 <- models %>%
select(Q39_1, mentor_screening, group_mentoring) %>%
filter(complete.cases(.))
m2 %>% count(mentor_screening, group_mentoring)
# A tibble: 4 × 3
mentor_screening group_mentoring n
<dbl> <dbl> <int>
1 0 0 8
2 0 1 5
3 1 0 4
4 1 1 9
model2 <- lm(
Q39_1 ~ mentor_screening + group_mentoring,
data = m2
)
summary(model2)
Call:
lm(formula = Q39_1 ~ mentor_screening + group_mentoring, data = m2)
Residuals:
Min 1Q Median 3Q Max
-2.5486 -0.3765 0.4514 0.5673 1.5972
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.5486 0.3670 12.394 1.16e-11 ***
mentor_screening 0.8543 0.4733 1.805 0.0842 .
group_mentoring 0.9737 0.4747 2.051 0.0518 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.148 on 23 degrees of freedom
Multiple R-squared: 0.319, Adjusted R-squared: 0.2598
F-statistic: 5.387 on 2 and 23 DF, p-value: 0.01205
lmtest::coeftest(model2, vcov. = sandwich::vcovHC(model2, type = "HC3"))
t test of coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 4.54858 0.48929 9.2962 2.974e-09 ***
mentor_screening 0.85425 0.51602 1.6555 0.11141
group_mentoring 0.97368 0.54166 1.7976 0.08538 .
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Diagnostics 2
diagnostics2 <- m2 %>%
mutate(
residual = residuals(model2),
predicted = fitted(model2),
group = interaction(mentor_screening, group_mentoring)
)
boxplot(residual ~ group,
data = diagnostics2,
main = "Residuals by Group",
xlab = "Mentor Screening / Group Mentoring",
ylab = "Residuals")
stripchart(residual ~ group,
data = diagnostics2,
vertical = TRUE,
method = "jitter",
add = TRUE,
pch = 16)
abline(h = 0, col = "red", lty = 2)

car::leveneTest(residual ~ group,
data = diagnostics2,
center = median)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 1.0817 0.3774
22
shapiro.test(residuals(model2))
Shapiro-Wilk normality test
data: residuals(model2)
W = 0.90717, p-value = 0.02272
qqnorm(residuals(model2))
qqline(residuals(model2), col = "red")

# Cook's distance plot
plot(cooks.distance(model2),
type = "h",
main = "Cook's Distance - Model 2",
xlab = "Observation",
ylab = "Cook's Distance")
# Reference cutoff
abline(h = 4 / nobs(model2), col = "red", lty = 2)

which(cooks.distance(model2) > 4 / nobs(model2))
14 15
14 15
Model 3: Required meetings + formal program → Number of mentees
m3 <- h7 %>%
mutate(
required_meetings = case_when(
Q32 == 1 ~ 1,
Q32 == 2 ~ 0,
TRUE ~ NA_real_
),
formal_program = case_when(
Q9 == 1 ~ 1,
Q9 == 2 ~ 0,
TRUE ~ NA_real_
)
) %>%
select(Q19, required_meetings, formal_program) %>%
filter(complete.cases(.))
m3 %>% count(required_meetings, formal_program)
# A tibble: 4 × 3
required_meetings formal_program n
<dbl> <dbl> <int>
1 0 0 2
2 0 1 5
3 1 0 3
4 1 1 11
model3 <- lm(
log(Q19) ~ required_meetings + formal_program,
data = m3
)
summary(model3)
Call:
lm(formula = log(Q19) ~ required_meetings + formal_program, data = m3)
Residuals:
Min 1Q Median 3Q Max
-1.4292 -0.4923 0.1902 0.4632 0.7681
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 2.3561 0.3404 6.921 1.81e-06 ***
required_meetings 0.6825 0.3000 2.275 0.0354 *
formal_program 0.8549 0.3321 2.575 0.0191 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.6461 on 18 degrees of freedom
Multiple R-squared: 0.4158, Adjusted R-squared: 0.3509
F-statistic: 6.406 on 2 and 18 DF, p-value: 0.007926
Diagnostics 3
diagnostics3 <- m3 %>%
mutate(
residual = residuals(model3),
predicted = fitted(model3),
group = interaction(required_meetings, formal_program)
)
boxplot(residual ~ group,
data = diagnostics3,
main = "Residuals by Group",
xlab = "Required Meetings / Formal Program",
ylab = "Residuals")
stripchart(residual ~ group,
data = diagnostics3,
vertical = TRUE,
method = "jitter",
add = TRUE,
pch = 16)
abline(h = 0, col = "red", lty = 2)

car::leveneTest(residual ~ group,
data = diagnostics3,
center = median)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 3 0.7576 0.5332
17
shapiro.test(residuals(model3))
Shapiro-Wilk normality test
data: residuals(model3)
W = 0.93028, p-value = 0.1394
qqnorm(residuals(model3))
qqline(residuals(model3), col = "red")

# Cook's distance plot
plot(cooks.distance(model3),
type = "h",
main = "Cook's Distance - Model 3",
xlab = "Observation",
ylab = "Cook's Distance")
# Reference cutoff
abline(h = 4 / nobs(model3), col = "red", lty = 2)

which(cooks.distance(model3) > 4 / nobs(model3))
12
12
LS0tCnRpdGxlOiAiTWVudG9yIFByb2dyYW0gU3VydmV5IERhdGEgQW5hbHlzaXMgKFppbW1lcm1hbikiCmF1dGhvcjogIkNoYXJsaWUgTW9yZ2FuIgpkYXRlOiAiIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDogCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiBubwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogbHVtZW4KICBwZGZfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIGZpZ193aWR0aDogMwogICAgZmlnX2hlaWdodDogMwogIHdvcmRfZG9jdW1lbnQ6IAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCi0tLQoKYGBge2NzcywgZWNobyA9IEZBTFNFfQojVE9DOjpiZWZvcmUgewogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1zaXplOiAxLjJlbTsKICBkaXNwbGF5OiBibG9jazsKICBjb2xvcjogbmF2eTsKICBtYXJnaW4tYm90dG9tOiAxMHB4Owp9CgoKZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLwogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsKICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsKICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7Cn0KCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovCiAgZm9udC1zaXplOiAyMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxNXB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IG5hdnk7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDE4cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9CgouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQoKcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCn0KYGBgCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IAojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgewogIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpCiAgbGlicmFyeSh0aWR5dmVyc2UpCn0KCmlmICghcmVxdWlyZSgiZHBseXIiKSkgewogIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKICBsaWJyYXJ5KGRwbHlyKQp9CgppZiAoIXJlcXVpcmUoImNvaW4iKSkgewogIGluc3RhbGwucGFja2FnZXMoImNvaW4iKQogIGxpYnJhcnkoY29pbikKfQojIyMjCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3UgY2FuIGNob29zZSB0byBpbmNsdWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIAogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICMgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGV0aGVyIHRvIGluY2x1ZGUgdGhlIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLgogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IE5BCiAgICAgICAgICAgICAgICAgICAgICApICAKYGBgCgojIyBEYXRhCmBgYHtyLCByZXN1bHRzPSdoaWRlJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbWVudG9yaW5nIDwtIHJlYWRfY3N2KAogICJVbml2IEVudHAgQ3RyIE1lbnRvcmluZyBEYXRhIDEyLTE4LTI0LmNzdiIsCiAgY29sX3R5cGVzID0gY29scyguZGVmYXVsdCA9IGNvbF9jaGFyYWN0ZXIoKSksCiAgbmFtZV9yZXBhaXIgPSAidW5pcXVlIgopCgojUmVtb3ZlIHRoZSBRdWFsdHJpY3MgcXVlc3Rpb24tdGV4dCBhbmQgSW1wb3J0SWQgcm93cwptZW50b3JpbmcgPC0gbWVudG9yaW5nICU+JQogIHNsaWNlKC0oMToyKSkKCiNDb252ZXJ0IGNvbHVtbnMgdG8gbnVtZXJpYy9kYXRlL2V0Yy4gd2hlcmUgYXBwcm9wcmlhdGUKbWVudG9yaW5nIDwtIG1lbnRvcmluZyAlPiUKICB0eXBlX2NvbnZlcnQoKQoKI1JlbW92ZSB0aGUgcHJldmlldy90ZXN0IHJlc3BvbnNlCm1lbnRvcmluZyA8LSBtZW50b3JpbmcgJT4lCiAgZmlsdGVyKERpc3RyaWJ1dGlvbkNoYW5uZWwgIT0gInByZXZpZXciKQpgYGAKCmBgYHtyfQp1c2FibGVfb2JzIDwtIG1lbnRvcmluZyAlPiUKICBzdW1tYXJpc2UoCiAgICBgUTM5IC0gU2F0aXNmYWN0aW9uYCA9IHN1bSghaXMubmEoUTM5XzEpKSwKICAgIGBRMjYgLSBNZW50b3IgVHJhaW5pbmdgID0gc3VtKCFpcy5uYShRMjYpKSwKICAgIGBRMTJhIC0gTWVudG9yIFNjcmVlbmluZ2AgPSBzdW0oIWlzLm5hKFExMi4uLjI5KSksCiAgICBgUTYgLSBNZW50b3JpbmcgVHlwZWAgPSBzdW0oIWlzLm5hKFE2KSksCiAgICBgUTI3IC0gTWVudGVlIFRyYWluaW5nYCA9IHN1bSghaXMubmEoUTI3KSksCiAgICBgUTE3IC0gTnVtYmVyIG9mIE1lbnRvcnNgID0gc3VtKCFpcy5uYShRMTcpKSwKICAgIGBRMTkgLSBOdW1iZXIgb2YgTWVudGVlc2AgPSBzdW0oIWlzLm5hKFExOSkpLAogICAgYFEzMiAtIE1lZXRpbmcgUmVxdWlyZW1lbnRzYCA9IHN1bSghaXMubmEoUTMyKSkKICApICU+JQogIHBpdm90X2xvbmdlcigKICAgIGV2ZXJ5dGhpbmcoKSwKICAgIG5hbWVzX3RvID0gIlZhcmlhYmxlIiwKICAgIHZhbHVlc190byA9ICJVc2FibGUgT2JzZXJ2YXRpb25zIgogICkKCnVzYWJsZV9vYnMKYGBgCgpKdXN0IHNob3dpbmcgdGhhdCBmb3IgbW9zdCBvZiB0aGUgdmFyaWFibGVzIHdlIGFjdHVhbGx5IGNhcmUgYWJvdXQsIHdlIG9ubHkgaGF2ZSBhcm91bmQgMjbigJMyNyB1c2FibGUgcmVzcG9uc2VzLiBTbyBldmVuIHRob3VnaCB0aGVyZSB3ZXJlIDU1IHVzYWJsZSBzdXJ2ZXkgcmVzcG9uc2VzIG92ZXJhbGwsIHdlIGRvbuKAmXQgcmVhbGx5IGhhdmUgNTUgb2JzZXJ2YXRpb25zIGF2YWlsYWJsZSBmb3IgbW9zdCBvZiB0aGUgYW5hbHlzaXMuCgpUaGF0IG1ha2VzIHJlZ3Jlc3Npb24gaGFyZGVyLCBlc3BlY2lhbGx5IGlmIHdlIHRyeSB0byBpbmNsdWRlIHNldmVyYWwgdmFyaWFibGVzIGF0IG9uY2UuIFdpdGggc3VjaCBhIHNtYWxsIHNhbXBsZSwgYWRkaW5nIG1vcmUgcHJlZGljdG9ycyBjYW4gbWFrZSB0aGUgcmVzdWx0cyB1bnN0YWJsZSBhbmQgaGFyZGVyIHRvIHRydXN0LiBCZWNhdXNlIG9mIHRoYXQsIEkgdGhpbmsgcmVncmVzc2lvbiB3aXRoIG9uZSBwcmVkaWN0b3IgYXQgYSB0aW1lLCBvciBtYXliZSB0d28gd2hlbiB0aGVyZSBpcyBhIGdvb2QgcmVhc29uIGZvciBpdCwgbWFrZXMgbW9yZSBzZW5zZS4KCkV2ZW4gdGhlbiwgd2Ugd291bGQgc3RpbGwgbmVlZCB0byBjaGVjayB0aGUgdXN1YWwgcmVncmVzc2lvbiBhc3N1bXB0aW9ucyBiZWZvcmUgcmVseWluZyBvbiB0aGUgcmVzdWx0cy4KCgpJIGtub3cgeW91IHJlYWxseSB3YW50ZWQgdG8gd29yayB3aXRoIFExNyBhbmQgUTE5LiBNeSB1bmRlcnN0YW5kaW5nIHdhcyB0aGF0IHRoZSBnb2FsIHdhcyB0byBzZWUgd2hhdCBjaGFyYWN0ZXJpc3RpY3MgYXJlIGFzc29jaWF0ZWQgd2l0aCBwcm9ncmFtcyB0aGF0IGhhdmUgaGlnaGVyIG1lbnRvciBvciBtZW50ZWUgY291bnRzLiBUaGUgaXNzdWUgaXMgdGhhdCB0aGUgZGF0YSBmb3IgdGhlc2UgdHdvIHZhcmlhYmxlcyBpcyBwcmV0dHkgbWVzc3kuIFdlIGhhdmUgdmVyeSBsb3cgYW5kIHZlcnkgaGlnaCB2YWx1ZXMsIHJhbmdlcywgYW5kIHJlc3BvbnNlcyByZXBvcnRlZCBwZXIgbW9udGgsIHBlciBzZW1lc3RlciwgZXRjLiwgYXMgeW91IGNhbiBzZWUgYmVsb3cuIEJlY2F1c2Ugb2YgdGhhdCwgYW55IGFuYWx5c2lzIHVzaW5nIFExNyBvciBRMTkgd291bGQgYmUgaGFyZGVyIHRvIGNsZWFuIGFuZCBpbnRlcnByZXQsIGFuZCB0aGUgcmVzdWx0cyB3b3VsZCBiZSBsZXNzIHN0cmFpZ2h0Zm9yd2FyZC4KCmBgYHtyfQpoZWFkKG1lbnRvcmluZyRRMTlbIWlzLm5hKG1lbnRvcmluZyRRMTkpXSkKYGBgCgpgYGB7cn0KaGVhZChtZW50b3JpbmckUTE3WyFpcy5uYShtZW50b3JpbmckUTE5KV0pCmBgYAoKSXQncyBhbHNvIGltcG9ydGFudCB0byBoYXZlIGEgZGVmaW5lZCBzZXQgb2YgdGhpbmdzIHdlIGFjdHVhbGx5IHdhbnQgdG8gdGVzdCBpbnN0ZWFkIG9mIGp1c3QgcnVubmluZyB0ZXN0cyBvbiBldmVyeXRoaW5nIGFuZCBrZWVwaW5nIHdoYXRldmVyIGNvbWVzIG91dCBzaWduaWZpY2FudC4gSWYgdGhlcmUgcmVhbGx5IGlzIG5vIHJlbGF0aW9uc2hpcCwgZWFjaCB0ZXN0IHJ1biBhdCB0aGUgLjA1IGxldmVsIHN0aWxsIGhhcyBhIDUlIGNoYW5jZSBvZiBzaG93aW5nIGEgc2lnbmlmaWNhbnQgcmVzdWx0IGp1c3QgYnkgY2hhbmNlLiBTbyB0aGUgbW9yZSB0ZXN0cyB3ZSBydW4sIHRoZSBtb3JlIGxpa2VseSB3ZSBhcmUgdG8gZXZlbnR1YWxseSBmaW5kIHNvbWV0aGluZyB0aGF0IGxvb2tzIHNpZ25pZmljYW50IGV2ZW4gaWYgaXQgcmVhbGx5IGlzbid0LiBCZWNhdXNlIG9mIHRoYXQsIHdlIG5lZWQgdG8gYWRqdXN0IGZvciB0aGUgbnVtYmVyIG9mIHRlc3RzIHdlIHJ1biwgd2hpY2ggbWFrZXMgaXQgaGFyZGVyIGZvciBhIHJlc3VsdCB0byBiZSBjb25zaWRlcmVkIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCgpGb3IgdGhlIG1haW4gYW5hbHlzaXMsIEkgdGhpbmsgUTM5IG1ha2VzIHRoZSBtb3N0IHNlbnNlIHRvIGZvY3VzIG9uLiBJdCBpcyB0aGUgY2xlYW5lc3Qgb3V0Y29tZSwgZGlyZWN0bHkgbWVhc3VyZXMgc2F0aXNmYWN0aW9uIHdpdGggdGhlIHN1Y2Nlc3Mgb2YgdGhlIG1lbnRvcmluZyBwcm9ncmFtLCBhbmQgd2UgaGF2ZSBlbm91Z2ggdXNhYmxlIHJlc3BvbnNlcyB0byBjb21wYXJlIGdyb3Vwcy4gQmFzZWQgb24gdGhlIHJlc2VhcmNoIHF1ZXN0aW9uLCB0aGUgbGl0ZXJhdHVyZSwgYW5kIHRoZSB2YXJpYWJsZXMgdGhhdCBtYWtlIHRoZSBtb3N0IHNlbnNlIHRvIGNvbXBhcmUsIEkgd2FudCB0byB0ZXN0IHdoZXRoZXIgc2F0aXNmYWN0aW9uIGRpZmZlcnMgYmV0d2VlbiBjZW50ZXJzIHRoYXQgZG8gYW5kIGRvIG5vdCBoYXZlIG1lbnRvciB0cmFpbmluZy9vcmllbnRhdGlvbiAoUTI2KSwgc3lzdGVtYXRpYyBtZW50b3Igc2NyZWVuaW5nIChRMTJhKSwgZ3JvdXAgbWVudG9yaW5nIChRNiksIGFuZCBtZW50ZWUgdHJhaW5pbmcvb3JpZW50YXRpb24gKFEyNykuCgpJbnN0ZWFkIG9mIHJ1bm5pbmcgYSBzZXBhcmF0ZSByZWdyZXNzaW9uIGZvciBlYWNoIG9uZSwgd2hpY2ggd291bGQgcmVxdWlyZSBtb3JlIGFzc3VtcHRpb25zLCBJIGFtIHVzaW5nIHRoZSBXaWxjb3hvbiByYW5rLXN1bSB0ZXN0LiBUaGlzIGlzIGEgbm9ucGFyYW1ldHJpYyB0ZXN0IHRoYXQgYmFzaWNhbGx5IGNvbXBhcmVzIHRoZSBzYXRpc2ZhY3Rpb24gc2NvcmVzIGJldHdlZW4gdGhlIHR3byBncm91cHMgYW5kIHRlc3RzIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIG9mIGEgZGlmZmVyZW5jZSB0byBiZSBjb25zaWRlcmVkIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuCgpTaW5jZSB3ZSBhcmUgZG9pbmcgZm91ciBtYWluIHRlc3RzLCBJIGFtIHVzaW5nIGEgQm9uZmVycm9uaSBhZGp1c3RtZW50IHRvIGFjY291bnQgZm9yIHRoZSBpbmNyZWFzZWQgY2hhbmNlIG9mIGEgZmFsc2UgcG9zaXRpdmUuIEluc3RlYWQgb2YgY29tcGFyaW5nIGVhY2ggcC12YWx1ZSB0byAuMDUsIHdlIGRpdmlkZSAuMDUgYnkgNCwgZ2l2aW5nIHVzIGEgY3V0b2ZmIG9mIC4wMTI1LiBNeSBhbmFseXNpcyBpcyBzaG93biBiZWxvdy4gRm9yIHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMsIEkgd291bGQgbWFpbmx5IHVzZSBkZXNjcmlwdGl2ZSBzdGF0aXN0aWNzIHJhdGhlciB0aGFuIGNvbnRpbnVpbmcgdG8gcnVuIG1vcmUgYW5kIG1vcmUgc2lnbmlmaWNhbmNlIHRlc3RzLgoKIyMgTWFpbiBBbmFseXNpcyAoUTM5KQoKIyMjIFEzOSB2cyBRMjYgKE1lbnRvciB0cmFpbmluZy9vcmllbnRhdGlvbikKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KaDEgPC0gbWVudG9yaW5nICU+JSBzZWxlY3QoIlEyNiIsICJRMzlfMSIpICU+JSBmaWx0ZXIoIWlzLm5hKFEyNiksICFpcy5uYShRMzlfMSkpIApkaW0oaDEpCmBgYAoKYGBge3J9CmgxICU+JSBncm91cF9ieShRMjYpICU+JSBzdW1tYXJpc2UoIkF2Z19TYXRfU2NvcmUiID0gbWVhbihRMzlfMSkpCmBgYAoKYGBge3J9CmgxICU+JSBjb3VudChRMjYpCmBgYAoKYGBge3J9CmgxJFEyNiA8LSBhcy5mYWN0b3IoaDEkUTI2KQoKbW9kZWwgPC0gbG0oUTM5XzEgfiBRMjYsIGRhdGEgPSBoMSkKc3VtbWFyeShtb2RlbCkKYGBgCgpgYGB7cn0Kd2lsY294X3Rlc3QoUTM5XzEgfiBRMjYsCiAgICAgICAgICAgIGRhdGEgPSBoMSwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgClNpbmNlIDAuMDAyNDE2IDwgLjAxMjUsIHRoZSBleGFjdCBXaWxjb3hvbiByYW5rLXN1bSB0ZXN0IHNob3dlZCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBRMzkgc2F0aXNmYWN0aW9uIGJldHdlZW4gY2VudGVycyB0aGF0IHRyYWluZWQvb3JpZW50ZWQgbWVudG9ycyBhbmQgY2VudGVycyB0aGF0IGRpZCBub3QuIENlbnRlcnMgdGhhdCB0cmFpbmVkIG1lbnRvcnMgaGFkIGhpZ2hlciBzYXRpc2ZhY3Rpb24gc2NvcmVzLgoKSW4gdGhlIGJlc3QtcHJhY3RpY2VzIHNlY3Rpb24gb2YgdGhlIHdoaXRlIHBhcGVyLCBJIGJlbGlldmUgeW91IHNhaWQgc29tZXRoaW5nIGFsb25nIHRoZSBsaW5lcyBvZiBtZW50b3JzIHNob3VsZCBiZSBjYXJlZnVsbHkgc2VsZWN0ZWQsIHRyYWluZWQsIGFuZCBtb25pdG9yZWQuIEFuZCB0cmFpbmluZyBoZWxwcyBjcmVhdGUgbW9yZSBjb25zaXN0ZW50IG1lbnRvcmluZyBleHBlcmllbmNlcyBhbmQg4oCcaW1wcm92ZXMgdGhlIGxpa2VsaWhvb2Qgb2Ygc3VjY2Vzc2Z1bCBtZW50b3JpbmcgcmVsYXRpb25zaGlwcy4iIFNvIHRoaXMgY2FuIGhlbHAgc3VwcG9ydCB0aGF0LgoKIkNlbnRlcnMgdGhhdCB0cmFpbmVkL29yaWVudGVkIG1lbnRvcnMgcmVwb3J0ZWQgaGlnaGVyIHNhdGlzZmFjdGlvbiBzY29yZXMgb24gYXZlcmFnZSAoNi4wNikgdGhhbiBjZW50ZXJzIHRoYXQgZGlkIG5vdCAoNC42MCkuIFRoaXMgZGlmZmVyZW5jZSB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCB1c2luZyB0aGUgQm9uZmVycm9uaS1hZGp1c3RlZCBzaWduaWZpY2FuY2UgbGV2ZWwgKGV4YWN0IFdpbGNveG9uIHJhbmstc3VtIHRlc3QsIHAgPSAuMDAyNDsgYWRqdXN0ZWQgzrEgPSAuMDEyNSkuImxhc3RsCgojIyMgUTM5IHZzIFExMmEgKFN5c3RlbWF0aWMgTWVudG9yIFNjcmVlbmluZykKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KbWVudG9yaW5nICU+JSBzZWxlY3QoUTEyLi4uMjksIFJlc3BvbnNlSWQgKSAlPiUgZmlsdGVyKFJlc3BvbnNlSWQgJWluJSBjKCJSXzFMMU5DTEFvOURjY1pIeSIsICJSXzZrQnlGR2NYdHJERDlnTSIsICJSXzdnOVo3OHMzYnR4NGRBbCIpKQpgYGAKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KaDIgPC0gbWVudG9yaW5nICU+JSBzZWxlY3QoIlExMi4uLjI5IiwgIlEzOV8xIikgJT4lIGZpbHRlcighaXMubmEoUTEyLi4uMjkpLCAhaXMubmEoUTM5XzEpKSAKZGltKGgyKQpgYGAKCmBgYHtyfQpoMiAlPiUgZ3JvdXBfYnkoUTEyLi4uMjkpICU+JSBzdW1tYXJpc2UoIkF2Z19TYXRfU2NvcmUiID0gbWVhbihRMzlfMSkpCmBgYAoKYGBge3J9CmgyICU+JSBjb3VudChRMTIuLi4yOSkKYGBgCgpgYGB7cn0KaDIkUTEyLi4uMjkgPC0gYXMuZmFjdG9yKGgyJFExMi4uLjI5KQoKd2lsY294X3Rlc3QoUTM5XzEgfiBRMTIuLi4yOSwKICAgICAgICAgICAgZGF0YSA9IGgyLAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKVXNpbmcgdGhlIEJvbmZlcnJvbmktYWRqdXN0ZWQgc2lnbmlmaWNhbmNlIGxldmVsIG9mIC4wMTI1LCB0aGUgZGlmZmVyZW5jZSB3YXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgKHAgPSAuMDE3NSkuIEhvd2V2ZXIsIHRoZXJlIHdhcyBzdGlsbCBhIG5vdGljZWFibGUgZGlmZmVyZW5jZSBpbiB0aGUgb2JzZXJ2ZWQgc2F0aXNmYWN0aW9uIHNjb3Jlcy4gQ2VudGVycyB0aGF0IHN5c3RlbWF0aWNhbGx5IHNjcmVlbmVkIG1lbnRvcnMgaGFkIGFuIGF2ZXJhZ2Ugc2F0aXNmYWN0aW9uIHNjb3JlIG9mIDYuMDggY29tcGFyZWQgd2l0aCA0LjkyIGZvciBjZW50ZXJzIHRoYXQgZGlkIG5vdC4gU28gd2hpbGUgdGhlcmUgaXMgbm90IGVub3VnaCBzdGF0aXN0aWNhbCBldmlkZW5jZSB0byBjYWxsIHRoZSByZXN1bHQgc2lnbmlmaWNhbnQgYWZ0ZXIgdGhlIGFkanVzdG1lbnQsIHRoZSBwYXR0ZXJuIGlzIHN0aWxsIHdvcnRoIG5vdGluZywgZXNwZWNpYWxseSBiZWNhdXNlIGl0IGxpbmVzIHVwIHdpdGggdGhlIGxpdGVyYXR1cmUuCgpJIGJlbGlldmUgeW91IHNhaWQgdGhhdCBtZW50b3Igc2VsZWN0aW9uIGlzIGFuIGltcG9ydGFudCBmYWN0b3IsIGFuZCB5b3Ugc3BlY2lmaWNhbGx5IG1lbnRpb24gc3lzdGVtYXRpYyBpZGVudGlmaWNhdGlvbiBhbmQgc2NyZWVuaW5nIG9mIG1lbnRvcnMgYXMgYSByZWNvbW1lbmRlZCBwcmFjdGljZS4gU28gZXZlbiB0aG91Z2ggdGhpcyByZXN1bHQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYWZ0ZXIgdGhlIEJvbmZlcnJvbmkgYWRqdXN0bWVudCwgdGhlIGhpZ2hlciBzYXRpc2ZhY3Rpb24gc2NvcmVzIGFtb25nIGNlbnRlcnMgdGhhdCBzeXN0ZW1hdGljYWxseSBzY3JlZW4gbWVudG9ycyBzdGlsbCBsaW5lIHVwIHdpdGggYW5kIGNhbiBoZWxwIHN1cHBvcnQgdGhhdCBwb2ludC4KCiMjIyBRMzkgdnMgUTYgKEdyb3VwIHZzIG5vIGdyb3VwIG1lbnRvcmluZykKCjEgPSBUcmFkaXRpb25hbCBtZW50b3JpbmcKMiA9IFBlZXIgbWVudG9yaW5nCjMgPSBHcm91cCBtZW50b3JpbmcKNCA9IFN1YmplY3QgbWF0dGVyIG1lbnRvcmluZwo1ID0gT3RoZXIKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KbWVudG9yaW5nICU+JSBjb3VudChRNikKYGBgCgoKYGBge3IsIHJlc3VsdHM9J2hpZGUnfQpoMyA8LSBtZW50b3JpbmcgJT4lIHNlbGVjdCgiUTYiLCAiUTM5XzEiKSAlPiUgZmlsdGVyKCFpcy5uYShRNiksICFpcy5uYShRMzlfMSkpIApkaW0oaDMpCmBgYAoKYGBge3J9CmgzJFE2IDwtIGFzLmNoYXJhY3RlcihoMyRRNikKCmgzJGdyb3VwX21lbnRvcmluZyA8LSBpZmVsc2UoCiAgZ3JlcGwoIjMiLCBoMyRRNiksIDEsIDIKKQpgYGAKCgpgYGB7cn0KaDMgJT4lIGdyb3VwX2J5KGdyb3VwX21lbnRvcmluZykgJT4lIHN1bW1hcmlzZSgiQXZnX1NhdF9TY29yZSIgPSBtZWFuKFEzOV8xKSkKYGBgCgpgYGB7cn0KaDMgJT4lIGNvdW50KGdyb3VwX21lbnRvcmluZykKYGBgCgpgYGB7cn0KaDMkZ3JvdXBfbWVudG9yaW5nIDwtIGFzLmZhY3RvcihoMyRncm91cF9tZW50b3JpbmcpCgp3aWxjb3hfdGVzdChRMzlfMSB+IGdyb3VwX21lbnRvcmluZywKICAgICAgICAgICAgZGF0YSA9IGgzLAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKVXNpbmcgdGhlIEJvbmZlcnJvbmktYWRqdXN0ZWQgc2lnbmlmaWNhbmNlIGxldmVsIG9mIC4wMTI1LCB0aGlzIHJlc3VsdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAocCA9IC4wMjAwKS4gSG93ZXZlciwgY2VudGVycyB0aGF0IG9mZmVyZWQgZ3JvdXAgbWVudG9yaW5nIHN0aWxsIGhhZCBoaWdoZXIgc2F0aXNmYWN0aW9uIHNjb3JlcyB0aGFuIGNlbnRlcnMgdGhhdCBkaWQgbm90LCBzbyB0aGVyZSBpcyBzdGlsbCBhIG5vdGljZWFibGUgZGlmZmVyZW5jZSBpbiB0aGUgc2FtcGxlLgoKSW4gdGhlIHdoaXRlIHBhcGVyLCB5b3UgZGlzY3VzcyBncm91cCBtZW50b3JpbmcgYXMgYSBtb2RlbCB0aGF0IGNvbWJpbmVzIHNvbWUgb2YgdGhlIGJlbmVmaXRzIG9mIHRyYWRpdGlvbmFsIGFuZCBwZWVyIG1lbnRvcmluZywgYW5kIHlvdSBhbHNvIG1lbnRpb24gbGl0ZXJhdHVyZSB0aGF0IHJlY29tbWVuZHMgZ3JvdXAgb3IgbXVsdGlwbGUgbWVudG9yaW5nIGluIGhpZ2hlciBlZHVjYXRpb24gZW50cmVwcmVuZXVyc2hpcCBwcm9ncmFtcy4gU28gd2hpbGUgdGhpcyByZXN1bHQgZG9lcyBub3QgbWVldCB0aGUgYWRqdXN0ZWQgc2lnbmlmaWNhbmNlIGN1dG9mZiwgaXQgc3RpbGwgZ29lcyBpbiB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgdGhlIGxpdGVyYXR1cmUgYW5kIGNhbiBoZWxwIHN1cHBvcnQgdGhhdCBkaXNjdXNzaW9uLgoKIkNlbnRlcnMgdGhhdCBvZmZlcmVkIGdyb3VwIG1lbnRvcmluZyByZXBvcnRlZCBoaWdoZXIgc2F0aXNmYWN0aW9uIHNjb3JlcyBvbiBhdmVyYWdlICg2LjA3KSB0aGFuIGNlbnRlcnMgdGhhdCBkaWQgbm90IG9mZmVyIGdyb3VwIG1lbnRvcmluZyAoNC44MykuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbmNlIGRpZCBub3QgbWVldCB0aGUgQm9uZmVycm9uaS1hZGp1c3RlZCBzaWduaWZpY2FuY2UgbGV2ZWwgKGV4YWN0IFdpbGNveG9uIHJhbmstc3VtIHRlc3QsIHAgPSAuMDIwOyBhZGp1c3RlZCDOsSA9IC4wMTI1KS4iCgojIyMgUTM5IHZzIFEyNyAobWVudGVlIHRyYWluaW5nL29yaWVudGF0aW9uKQoKYGBge3IsIHJlc3VsdHM9J2hpZGUnfQpoNCA8LSBtZW50b3JpbmcgJT4lIHNlbGVjdCgiUTI3IiwgIlEzOV8xIikgJT4lIGZpbHRlcighaXMubmEoUTI3KSwgIWlzLm5hKFEzOV8xKSkgCmRpbShoNCkKYGBgCgpgYGB7cn0KaDQgJT4lIGdyb3VwX2J5KFEyNykgJT4lIHN1bW1hcmlzZSgiQXZnX1NhdF9TY29yZSIgPSBtZWFuKFEzOV8xKSkKYGBgCgpgYGB7cn0KaDQgJT4lIGNvdW50KFEyNykKYGBgCgpgYGB7cn0KaDQkUTI3IDwtIGFzLmZhY3RvcihoNCRRMjcpCgp3aWxjb3hfdGVzdChRMzlfMSB+IFEyNywKICAgICAgICAgICAgZGF0YSA9IGg0LAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKIkNlbnRlcnMgdGhhdCB0cmFpbmVkL29yaWVudGVkIG1lbnRlZXMgcmVwb3J0ZWQgaGlnaGVyIHNhdGlzZmFjdGlvbiBzY29yZXMgb24gYXZlcmFnZSAoNi4wMCkgdGhhbiBjZW50ZXJzIHRoYXQgZGlkIG5vdCAoNC44MikuIEhvd2V2ZXIsIHRoZSBkaWZmZXJlbmNlIGRpZCBub3QgbWVldCB0aGUgQm9uZmVycm9uaS1hZGp1c3RlZCBzaWduaWZpY2FuY2UgbGV2ZWwgKGV4YWN0IFdpbGNveG9uIHJhbmstc3VtIHRlc3QsIHAgPSAuMDI3ODsgYWRqdXN0ZWQgzrEgPSAuMDEyNSkuIgoKVGhpcyBhbHNvIGxpbmVzIHVwIHdpdGggdGhlIHdoaXRlIHBhcGVyLCB3aGVyZSB5b3Ugc2F5IHRoYXQgYm90aCBtZW50b3JzIGFuZCBtZW50ZWVzIGJlbmVmaXQgZnJvbSBzZWxlY3Rpb24sIHRyYWluaW5nLCBhbmQgbW9uaXRvcmluZywgYW5kIHlvdSBzcGVjaWZpY2FsbHkgbm90ZSB0aGF0IG1lbnRlZXMgYWxzbyBuZWVkIHRyYWluaW5nLiBTbyBldmVuIHRob3VnaCB0aGlzIHJlc3VsdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBhZnRlciB0aGUgQm9uZmVycm9uaSBhZGp1c3RtZW50LCB0aGUgcGF0dGVybiBpbiB0aGUgZGF0YSBzdGlsbCBzdXBwb3J0cyB0aGF0IGlkZWEuCgojIyMgRGVzY3JpcHRpdmUgQ29tcGFyaXNvbnMgCgpJIGFsc28gbG9va2VkIGRlc2NyaXB0aXZlbHkgYXQgc29mdHdhcmUvcGxhdGZvcm0gdXNlIGFuZCB3aGV0aGVyIHRoZSBDZW50ZXIgd2FzIGVuZG93ZWQuIEkgZGlkIG5vdCBpbmNsdWRlIHRoZXNlIGFzIHBhcnQgb2YgdGhlIGZvdXIgZm9ybWFsIGh5cG90aGVzaXMgdGVzdHMgYWJvdmUgYmVjYXVzZSBJIHdhbnRlZCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIHNpZ25pZmljYW5jZSB0ZXN0cyBiZWluZyBydW4uCgpGb3IgYm90aCBjb21wYXJpc29ucywgdGhlIGF2ZXJhZ2Ugc2F0aXNmYWN0aW9uIHNjb3JlcyBoYXBwZW5lZCB0byBiZSB0aGUgc2FtZS4gQ2VudGVycyB0aGF0IHVzZWQgbWVudG9yaW5nIHNvZnR3YXJlL3BsYXRmb3JtcyBoYWQgYW4gYXZlcmFnZSBzYXRpc2ZhY3Rpb24gc2NvcmUgb2YgNS4wMCBjb21wYXJlZCB3aXRoIDUuODcgZm9yIGNlbnRlcnMgdGhhdCBkaWQgbm90IHVzZSBzb2Z0d2FyZS4gU2ltaWxhcmx5LCBlbmRvd2VkIENlbnRlcnMgaGFkIGFuIGF2ZXJhZ2Ugc2F0aXNmYWN0aW9uIHNjb3JlIG9mIDUuMDAgY29tcGFyZWQgd2l0aCA1Ljg3IGZvciBDZW50ZXJzIHRoYXQgd2VyZSBub3QgZW5kb3dlZC4KClRoZXNlIHR3byB3ZXJlbid0IGFzIHRpZWQgdG8gdGhlIGxpdGVyYXR1cmUgYXMgdGhlIG90aGVycywgYnV0IEkgc2F3IHBvdGVudGlhbC4KCiMjIyMgUTM5IHZzIFEyOSAoc29mdHdhcmUgdnMgbm8gc29mdHdhcmUpCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KaDUgPC0gbWVudG9yaW5nICU+JSBzZWxlY3QoIlEyOSIsICJRMzlfMSIpICU+JSBmaWx0ZXIoIWlzLm5hKFEyOSksICFpcy5uYShRMzlfMSkpIApkaW0oaDUpCmBgYApgYGB7cn0KaDUkc29mdHdhcmUgPC0gaWZlbHNlKAogIGdyZXBsKDksIGg1JFEyOSksIDIsIDEKKQoKaDUgJT4lIGNvdW50KHNvZnR3YXJlKQpgYGAKYGBge3J9Cmg1ICU+JSBncm91cF9ieShzb2Z0d2FyZSkgJT4lIHN1bW1hcmlzZSgiQXZnX1NhdF9TY29yZSIgPSBtZWFuKFEzOV8xKSkKYGBgCgojIyMjIFEzOSB2cyBRNDAgKGVuZG93ZWQpCgpgYGB7ciwgcmVzdWx0cyA9ICdoaWRlJ30KaDYgPC0gbWVudG9yaW5nICU+JSBzZWxlY3QoIlE0MCIsICJRMzlfMSIpICU+JSBmaWx0ZXIoIWlzLm5hKFE0MCksICFpcy5uYShRMzlfMSkpIApkaW0oaDYpCmBgYApgYGB7cn0KaDYgJT4lIGNvdW50KFE0MCkKYGBgCmBgYHtyfQpoNiAlPiUgZ3JvdXBfYnkoUTQwKSAlPiUgc3VtbWFyaXNlKCJBdmdfU2F0X1Njb3JlIiA9IG1lYW4oUTM5XzEpKQpgYGAKCiMjIFNlY29uZGFyeSBBbmFseXNpcyAoUTE3LCBRMTkgQW5hbHlzaXMpCgojIyMgQ2xlYW5pbmcgRGF0YQpgYGB7cn0KaDcgPC0gbWVudG9yaW5nICU+JSBmaWx0ZXIoIWlzLm5hKFExOSkpCgpoNyAlPiUKICBzZWxlY3QoUmVzcG9uc2VJZCwgUTE5KQpgYGAKCkkgZGVjaWRlZCB0byBkcm9wIGNlbnRlcnMgdGhhdCBnYXZlIHJlc3BvbnNlcyBsaWtlIOKAnHZhcmllcyzigJ0g4oCccGVyIG1vbnRoLOKAnSBvciDigJxhbm51YWxseeKAnSBiZWNhdXNlIHRob3NlIGFuc3dlcnMgd2VyZSBub3QgZGlyZWN0bHkgY29tcGFyYWJsZSB0byB0aGUgb3RoZXIgbWVudGVlIGNvdW50cy4gRm9yIHJlc3BvbnNlcyByZXBvcnRlZCBhcyBhIG51bWJlciB3aXRoIGEg4oCcK+KAnSwgSSB1c2VkIHRoZSBzdGF0ZWQgbnVtYmVyIGFzIGEgY29uc2VydmF0aXZlIGVzdGltYXRlIChmb3IgZXhhbXBsZSwgMTAwKyBiZWNhbWUgMTAwKS4gRm9yIHJhbmdlcyBzdWNoIGFzIDEw4oCTMjAsIEkgdXNlZCB0aGUgbWlkcG9pbnQgb2YgdGhlIHJhbmdlLiBUaGlzIGxlYXZlcyB1cyB3aXRoIDIxIG9ic2VydmF0aW9ucy4KCmBgYHtyfQoKIyBkcm9wcGluZyBpZHMgd2l0aCB0aGUgImEgbW9udGgiIHN0dWZmCmg3IDwtIGg3ICU+JQogIGZpbHRlcighUmVzcG9uc2VJZCAlaW4lIGMoCiAgICAiUl82OUkzWXZxaFF3ZWxXQVYiLAogICAgIlJfNmZUWFNEQzlNYkFTZkVNIiwKICAgICJSXzFnWmhSTmdkUWtPUHFqNyIsCiAgICAiUl8zcnBqWHRDdG9wR2dvdVoiLAogICAgIlJfMXVSN3VXd2FMaWtmNWNKIgogICkpCgpoNyA8LSBoNyAlPiUKICBtdXRhdGUoCiAgICBRMTkgPSBjYXNlX3doZW4oCiAgICAgICMxMC0yMCBhdCBhbnkgb25lIHRpbWUgLT4gbWlkcG9pbnQgPSAxNQogICAgICBSZXNwb25zZUlkID09ICJSXzZrQnlGR2NYdHJERDlnTSIgfiAiMTUiLAogICAgICAKICAgICAgIzE1LTIwIC0+IG1pZHBvaW50ID0gMTggKDE3LjUgaXMgd2VpcmQpCiAgICAgIFJlc3BvbnNlSWQgPT0gIlJfM2tlVTQ3VkV3cENUcXZ2IiB+ICIxOCIsCiAgICAgIAogICAgICAjNDArIC0+IHVzZSA0MAogICAgICBSZXNwb25zZUlkID09ICJSXzFpaG95TTBNM1oybFBHMSIgfiAiNDAiLAogICAgICAKICAgICAgIzI0IHRlYW1zICg3NSBzdHVkZW50cykgLT4gdXNlIDc1IG1lbnRlZXMKICAgICAgUmVzcG9uc2VJZCA9PSAiUl8zUFRzcnR5OGNRVFZDR2kiIH4gIjc1IiwKICAgICAgCiAgICAgICMxMDArIC0+IHVzZSAxMDAKICAgICAgUmVzcG9uc2VJZCA9PSAiUl82MlgxdmVWOEZxeU9uN3UiIH4gIjEwMCIsCiAgICAgIAogICAgICAjMzArIC0+IHVzZSAzMAogICAgICBSZXNwb25zZUlkID09ICJSXzZvWWtWMmR1YjF6MDdNNSIgfiAiMzAiLAogICAgICAKICAgICAgVFJVRSB+IFExOQogICAgKQogICkKCmg3IDwtIGg3ICU+JSBtdXRhdGUoUTE5ID0gYXMubnVtZXJpYyhRMTkpKQoKaDcgJT4lCiAgc2VsZWN0KFJlc3BvbnNlSWQsIFExOSkKYGBgCgpgYGB7cn0KaDEwIDwtIG1lbnRvcmluZyAlPiUgZmlsdGVyKCFpcy5uYShRMTcpKQoKaDEwIDwtIGgxMCAlPiUgZmlsdGVyKFJlc3BvbnNlSWQgIT0gIlJfNmZUWFNEQzlNYkFTZkVNIikKCmgxMCA8LSBoMTAgJT4lCiAgbXV0YXRlKAogICAgUTE3ID0gY2FzZV93aGVuKAogICAgICAKICAgICAgIzItMyAtPiBtaWRwb2ludAogICAgICBSZXNwb25zZUlkID09ICJSXzNrZVU0N1ZFd3BDVHF2diIgfiAiMi41IiwKICAgICAgCiAgICAgICMxMDArIC0+IGNvbnNlcnZhdGl2ZSBsb3dlciBib3VuZAogICAgICBSZXNwb25zZUlkID09ICJSXzFlUXBjVjdJYVhWYXRsQSIgfiAiMTAwIiwKICAgICAgCiAgICAgICNzdGFibGUgb2YgPjEwMCAtPiBjb25zZXJ2YXRpdmUgbG93ZXIgYm91bmQKICAgICAgUmVzcG9uc2VJZCA9PSAiUl8xaWhveU0wTTNaMmxQRzEiIH4gIjEwMCIsCiAgICAgIAogICAgICAjNzUgY3VycmVudGx5IGZvcm1hbGx5IHNpZ25lZCB1cDsgfjMwMCB0b3RhbCBsaXN0CiAgICAgICN1c2UgdGhlIDc1IGN1cnJlbnRseSBzaWduZWQgdXAKICAgICAgUmVzcG9uc2VJZCA9PSAiUl8zUFRzcnR5OGNRVFZDR2kiIH4gIjc1IiwKICAgICAgCiAgICAgICNBY3RpdmUgNTc7IDI2MCBvbiB0aGUgcm9sbAogICAgICAjdXNlIGFjdGl2ZSBtZW50b3JzCiAgICAgIFJlc3BvbnNlSWQgPT0gIlJfNVpHTm40ZDkxWmx0SFRiIiB+ICI1NyIsCiAgICAgIAogICAgICAjMzAgcGVvcGxlIC0+IDMwCiAgICAgIFJlc3BvbnNlSWQgPT0gIlJfMWdaaFJOZ2RRa09QcWo3IiB+ICIzMCIsCiAgICAgIAogICAgICAjODAtMTAwIC0+IG1pZHBvaW50CiAgICAgIFJlc3BvbnNlSWQgPT0gIlJfM3Jwalh0Q3RvcEdnb3VaIiB+ICI5MCIsCiAgICAgIAogICAgICAjMjAtMjUgLT4gbWlkcG9pbnQKICAgICAgUmVzcG9uc2VJZCA9PSAiUl8xd3NsYXFGUUtydlBRTEciIH4gIjIyLjUiLAogICAgICAKICAgICAgIzI1KyAtPiBjb25zZXJ2YXRpdmUgbG93ZXIgYm91bmQKICAgICAgUmVzcG9uc2VJZCA9PSAiUl82b1lrVjJkdWIxejA3TTUiIH4gIjI1IiwKICAgICAgCiAgICAgIFRSVUUgfiBRMTcKICAgICkKICApCgpoMTAgPC0gaDEwICU+JSBtdXRhdGUoUTE3ID0gYXMubnVtZXJpYyhRMTcpKQpgYGAKCiMjIyBRMTkgdnMgUTMyIChSZXF1aXJlL1NwZWNpZnkgTWVudG9yIE1lZXRpbmdzKQpgYGB7cn0KaDggPC0gaDcgJT4lIHNlbGVjdChRMTksIFEzMikKCmg4ICU+JSBjb3VudChRMzIpCmBgYApgYGB7cn0KaDggJT4lIGdyb3VwX2J5KFEzMikgJT4lIHN1bW1hcmlzZSgiTWVkaWFuIE51bWJlciBvZiBNZW50ZWVzIiA9IG1lZGlhbihRMTkpKQpgYGAKUHJvZ3JhbXMgdGhhdCByZXF1aXJlIG9yIHNwZWNpZnkgbWVudG9yLW1lbnRlZSBtZWV0aW5ncyBoYWQgYSBoaWdoZXIgbWVkaWFuIG51bWJlciBvZiBtZW50ZWVzICg0Mi41KSB0aGFuIHByb2dyYW1zIHRoYXQgZGlkIG5vdCAoMTgpLiBUaGlzIHN1Z2dlc3RzIHRoYXQgbW9yZSBzdHJ1Y3R1cmVkIHByb2dyYW1zIHRlbmQgdG8gaGF2ZSBtb3JlIG1lbnRlZXMuCgpgYGB7cn0KaDgkUTMyIDwtIGFzLmZhY3RvcihoOCRRMzIpCgp3aWxjb3hfdGVzdChRMTkgfiBRMzIsCiAgICAgICAgICAgIGRhdGEgPSBoOCwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgpgYGB7cn0KaDExIDwtIGgxMCAlPiUgc2VsZWN0KFExNywgUTMyKQoKaDExICU+JSBncm91cF9ieShRMzIpICU+JSBzdW1tYXJpc2UoIk1lZGlhbiBOdW1iZXIgb2YgTWVudG9ycyIgPSBtZWRpYW4oUTE3KSkKYGBgCgpgYGB7cn0KaDExJFEzMiA8LSBhcy5mYWN0b3IoaDExJFEzMikKCndpbGNveF90ZXN0KFExNyB+IFEzMiwKICAgICAgICAgICAgZGF0YSA9IGgxMSwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgoKIyMjIFExOSB2cyBROSAoRm9ybWFsIHZzIEluZm9ybWFsKQpgYGB7cn0KaDkgPC0gaDcgJT4lIHNlbGVjdChRMTksIFE5KQoKaDkgJT4lIGNvdW50KFE5KQpgYGAKCmBgYHtyfQpoOSAlPiUgZ3JvdXBfYnkoUTkpICU+JSBzdW1tYXJpc2UoIk1lZGlhbiBOdW1iZXIgb2YgTWVudGVlcyIgPSBtZWRpYW4oUTE5KSkKYGBgCgpgYGB7cn0KaDkkUTkgPC0gYXMuZmFjdG9yKGg5JFE5KQoKd2lsY294X3Rlc3QoUTE5IH4gUTksCiAgICAgICAgICAgIGRhdGEgPSBoOSwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgpQcm9ncmFtcyB0aGF0IHdlcmUgZm9ybWFsIGhhZCBhIGhpZ2hlciBtZWRpYW4gbnVtYmVyIG9mIG1lbnRlZXMgKDM1KSB0aGFuIGluZm9ybWFsIHByb2dyYW1zICgxNSkuIFRoaXMgc3VnZ2VzdHMgdGhhdCBtb3JlIHN0cnVjdHVyZWQsIGZvcm1hbCBtZW50b3JpbmcgcHJvZ3JhbXMgdGVuZCB0byBoYXZlIG1vcmUgbWVudGVlcy4KCmBgYHtyfQpoMTIgPC0gaDEwICU+JSBzZWxlY3QoUTE3LCBROSkKCmgxMiAlPiUgZ3JvdXBfYnkoUTkpICU+JSBzdW1tYXJpc2UoIk1lZGlhbiBOdW1iZXIgb2YgTWVudG9ycyIgPSBtZWRpYW4oUTE3KSkKYGBgCgpgYGB7cn0KaDEyJFE5IDwtIGFzLmZhY3RvcihoMTIkUTkpCgp3aWxjb3hfdGVzdChRMTcgfiBROSwKICAgICAgICAgICAgZGF0YSA9IGgxMiwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgojIyBSZXF1ZXN0ZWQgQWRkaXRpb25hbCBBbmFseXNpcwoKIyMjIFEzOSB2cyBRMTYgKFNhdGlzZmFjdGlvbiB2cyBSZXF1aXJlIGlkZW50aWZ5aW5nIGdvYWxzKQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CmgxNiA8LSBtZW50b3JpbmcgJT4lIHNlbGVjdCgiUTE2IiwgIlEzOV8xIikgJT4lIGZpbHRlcighaXMubmEoUTE2KSwgIWlzLm5hKFEzOV8xKSkgCmRpbShoMikKYGBgCgpgYGB7cn0KaDE2ICU+JSBncm91cF9ieShRMTYpICU+JSBzdW1tYXJpc2UoIkF2Z19TYXRfU2NvcmUiID0gbWVhbihRMzlfMSkpCmBgYAoKYGBge3J9CmgxNiAlPiUgY291bnQoUTE2KQpgYGAKCmBgYHtyfQpoMTYkUTE2IDwtIGFzLmZhY3RvcihoMTYkUTE2KQoKd2lsY294X3Rlc3QoUTM5XzEgfiBRMTYsCiAgICAgICAgICAgIGRhdGEgPSBoMTYsCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiA9ICJleGFjdCIpCmBgYAoKIyMjIFExOSB2cyBRMTYgKE1lbnRlZSBDb3VudCB2cyBSZXF1aXJlIGlkZW50aWZ5aW5nIGdvYWxzKQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CmgxNyA8LSBoNyAlPiUgc2VsZWN0KCJRMTYiLCAiUTE5IikgJT4lIGZpbHRlcighaXMubmEoUTE2KSwgIWlzLm5hKFExOSkpIApkaW0oaDE3KQpgYGAKCmBgYHtyfQpoMTcgJT4lIGdyb3VwX2J5KFExNikgJT4lIHN1bW1hcmlzZSgiTWVkaWFuIE51bWJlciBvZiBNZW50ZWVzIiA9IG1lZGlhbihRMTkpKQpgYGAKCmBgYHtyfQpoMTckUTE2IDwtIGFzLmZhY3RvcihoMTckUTE2KQoKd2lsY294X3Rlc3QoUTE5IH4gUTE2LAogICAgICAgICAgICBkYXRhID0gaDE3LAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKCiMjIyBRMTcgdnMgUTE2IChSZXF1aXJlIGlkZW50aWZ5aW5nIGdvYWxzKQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CmgxOCA8LSBoMTAgJT4lIHNlbGVjdCgiUTE2IiwgIlExNyIpICU+JSBmaWx0ZXIoIWlzLm5hKFExNiksICFpcy5uYShRMTcpKSAKZGltKGgxOCkKYGBgCgpgYGB7cn0KaDE4ICU+JSBncm91cF9ieShRMTYpICU+JSBzdW1tYXJpc2UoIk1lZGlhbiBOdW1iZXIgb2YgTWVudG9ycyIgPSBtZWRpYW4oUTE3KSkKYGBgCgpgYGB7cn0KaDE4JFExNiA8LSBhcy5mYWN0b3IoaDE4JFExNikKCndpbGNveF90ZXN0KFExNyB+IFExNiwKICAgICAgICAgICAgZGF0YSA9IGgxOCwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgojIyMgUTM5IHZzIFEzMiAoU2F0aXNmYWN0aW9uIHZzIFJlcXVpcmluZyBtZWV0aW5ncykKYGBge3IsIHJlc3VsdHM9J2hpZGUnfQpoMTkgPC0gbWVudG9yaW5nICU+JSBzZWxlY3QoIlEzMiIsICJRMzlfMSIpICU+JSBmaWx0ZXIoIWlzLm5hKFEzMiksICFpcy5uYShRMzlfMSkpIApkaW0oaDE5KQpgYGAKCmBgYHtyfQpoMTkgJT4lIGdyb3VwX2J5KFEzMikgJT4lIHN1bW1hcmlzZSgiQXZnX1NhdF9TY29yZSIgPSBtZWFuKFEzOV8xKSkKYGBgCgpgYGB7cn0KaDE5ICU+JSBjb3VudChRMzIpCmBgYAoKYGBge3J9CmgxOSRRMzIgPC0gYXMuZmFjdG9yKGgxOSRRMzIpCgp3aWxjb3hfdGVzdChRMzlfMSB+IFEzMiwKICAgICAgICAgICAgZGF0YSA9IGgxOSwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgojIyMgUTM5IHZzIFEyMiAoU2F0aXNmYWN0aW9uIHZzIE1lbnRvcuKAmXMgRmluYW5jaWFsIEludm9sdmVtZW50KQoKYGBge3J9Cm1lbnRvcmluZyAlPiUgZ3JvdXBfYnkoUTIyKSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbigpKQpgYGAKYGBge3J9CmgyMCA8LSBtZW50b3JpbmcgJT4lCiAgbXV0YXRlKAogICAgUTIyX0IgPSBjYXNlX3doZW4oCiAgICAgIFEyMiAlaW4lIGMoMSwgMikgfiAyLAogICAgICBRMjIgJWluJSBjKDMsIDQpIH4gMSwKICAgICAgVFJVRSB+IE5BX3JlYWxfCiAgICApCiAgKQpgYGAKCmBgYHtyfQpoMjEgPC0gaDIwICU+JSBzZWxlY3QoIlEyMl9CIiwgIlEzOV8xIikgJT4lIGZpbHRlcighaXMubmEoUTIyX0IpLCAhaXMubmEoUTM5XzEpKSAKZGltKGgyMSkKYGBgCgpgYGB7cn0KaDIxICU+JSBncm91cF9ieShRMjJfQikgJT4lIHN1bW1hcmlzZSgiQXZnX1NhdF9TY29yZSIgPSBtZWFuKFEzOV8xKSkKYGBgCgpgYGB7cn0KaDIxICU+JSBjb3VudChRMjJfQikKYGBgCgpgYGB7cn0KaDIxJFEyMl9CIDwtIGFzLmZhY3RvcihoMjEkUTIyX0IpCgp3aWxjb3hfdGVzdChRMzlfMSB+IFEyMl9CLAogICAgICAgICAgICBkYXRhID0gaDIxLAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKIyMjIFEzOSB2cyBRMjggKFNhdGlzZmFjdGlvbiB2cyBQcm90b2NvbCB0byBSZW1vdmUgTWVudG9yKQoKYGBge3J9Cm1lbnRvcmluZyAlPiUgZ3JvdXBfYnkoUTI4KSAlPiUgc3VtbWFyaXNlKGNvdW50ID0gbigpKQpgYGAKCmBgYHtyfQpoMjIgPC0gbWVudG9yaW5nICU+JQogIG11dGF0ZSgKICAgIFEyOF9CID0gY2FzZV93aGVuKAogICAgICBRMjggJWluJSBjKCIxIiwgIjIiLCAiMyIsICIxMiIsICIxMyIpIH4gMSwKICAgICAgUTI4ID09ICI0IiB+IDIsCiAgICAgIFRSVUUgfiBOQV9yZWFsXwogICAgKQogICkKYGBgCgpgYGB7cn0KaDIyICU+JSBncm91cF9ieShRMjhfQikgJT4lIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKYGBgCgpgYGB7cn0KaDIyIDwtIGgyMiAlPiUgc2VsZWN0KCJRMjhfQiIsICJRMzlfMSIpICU+JSBmaWx0ZXIoIWlzLm5hKFEyOF9CKSwgIWlzLm5hKFEzOV8xKSkgCmRpbShoMjIpCmBgYAoKYGBge3J9CmgyMiAlPiUgZ3JvdXBfYnkoUTI4X0IpICU+JSBzdW1tYXJpc2UoIkF2Z19TYXRfU2NvcmUiID0gbWVhbihRMzlfMSkpCmBgYAoKYGBge3J9CmgyMiAlPiUgY291bnQoUTI4X0IpCmBgYAoKYGBge3J9CmgyMiRRMjhfQiA8LSBhcy5mYWN0b3IoaDIyJFEyOF9CKQoKd2lsY294X3Rlc3QoUTM5XzEgfiBRMjhfQiwKICAgICAgICAgICAgZGF0YSA9IGgyMiwKICAgICAgICAgICAgZGlzdHJpYnV0aW9uID0gImV4YWN0IikKYGBgCgojIyMgUTM5IHZzIFEzNyAoSXMgeW91ciBtZW50b3JpbmcgcHJvZ3JhbSByZWxhdGVkIHRvIG9uZSBvZiB5b3VyIENlbnRlcuKAmXMgZ29hbHMpCgoKYGBge3J9CmgyMyA8LSBtZW50b3JpbmcgJT4lIHNlbGVjdCgiUTM3IiwgIlEzOV8xIikgJT4lIGZpbHRlcighaXMubmEoUTM3KSwgIWlzLm5hKFEzOV8xKSkgCmRpbShoMjMpCmBgYAoKYGBge3J9CmgyMyAlPiUgZ3JvdXBfYnkoUTM3KSAlPiUgc3VtbWFyaXNlKCJBdmdfU2F0X1Njb3JlIiA9IG1lYW4oUTM5XzEpKQpgYGAKCmBgYHtyfQpoMjMgJT4lIGNvdW50KFEzNykKYGBgCgpgYGB7cn0KaDIzJFEzNyA8LSBhcy5mYWN0b3IoaDIzJFEzNykKCndpbGNveF90ZXN0KFEzOV8xIH4gUTM3LAogICAgICAgICAgICBkYXRhID0gaDIzLAogICAgICAgICAgICBkaXN0cmlidXRpb24gPSAiZXhhY3QiKQpgYGAKCiMjIyBRMzkgdnMgUTIzIChPbmxpbmUgb25seSBtZWV0aW5ncyB2cyBub3QpCmBgYHtyfQptZW50b3JpbmcgJT4lIGdyb3VwX2J5KFEyMykgJT4lIHN1bW1hcmlzZShjb3VudCA9IG4oKSkKYGBgCgpJdCBhcHBlYXJzIHRoYXQgMjUgY2VudGVycyBvZmZlciBpbi1wZXJzb24gbWVldGluZ3MsIHdoaWxlIG9ubHkgMiBkbyBub3QuIFRoaXMgbWFrZXMgUTIzIHRvbyB1bmJhbGFuY2VkIGZvciBhIG1lYW5pbmdmdWwgY29tcGFyaXNvbi4KCiMjIyBRMTkgdnMgUTI5IChNZW50ZWUgY291bnQgdnMgU29mdHdhcmUgdXNlKQoKYGBge3IsIHJlc3VsdHM9J2hpZGUnfQpoMjQgPC0gaDcgJT4lIHNlbGVjdCgiUTI5IiwgIlExOSIpICU+JSBmaWx0ZXIoIWlzLm5hKFEyOSksICFpcy5uYShRMTkpKSAKZGltKGgyNCkKYGBgCgpgYGB7cn0KaDI0JHNvZnR3YXJlIDwtIGlmZWxzZSgKICBncmVwbCg5LCBoMjQkUTI5KSwgMiwgMQopCgpoMjQgJT4lIGNvdW50KHNvZnR3YXJlKQpgYGAKCmBgYHtyfQpoMjQgJT4lIGdyb3VwX2J5KHNvZnR3YXJlKSAlPiUgc3VtbWFyaXNlKCJNZWRpYW4gTnVtYmVyIG9mIE1lbnRlZXMiID0gbWVkaWFuKFExOSkpCmBgYAoKYGBge3J9CmgyNCRzb2Z0d2FyZSA8LSBhcy5mYWN0b3IoaDI0JHNvZnR3YXJlKQoKd2lsY294X3Rlc3QoUTE5IH4gc29mdHdhcmUsCiAgICAgICAgICAgIGRhdGEgPSBoMjQsCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiA9ICJleGFjdCIpCmBgYAoKIyMjIFExNyB2cyBRMjkgKE1lbnRvciBjb3VudCB2cyBTb2Z0d2FyZSB1c2UpCgpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CmgyNSA8LSBoMTAgJT4lIHNlbGVjdCgiUTI5IiwgIlExNyIpICU+JSBmaWx0ZXIoIWlzLm5hKFEyOSksICFpcy5uYShRMTcpKSAKZGltKGgyNSkKYGBgCgpgYGB7cn0KaDI1JHNvZnR3YXJlIDwtIGlmZWxzZSgKICBncmVwbCg5LCBoMjUkUTI5KSwgMiwgMQopCgpoMjUgJT4lIGNvdW50KHNvZnR3YXJlKQpgYGAKCmBgYHtyfQpoMjUgJT4lIGdyb3VwX2J5KHNvZnR3YXJlKSAlPiUgc3VtbWFyaXNlKCJNZWRpYW4gTnVtYmVyIG9mIE1lbnRvcnMiID0gbWVkaWFuKFExNykpCmBgYAoKYGBge3J9CmgyNSRzb2Z0d2FyZSA8LSBhcy5mYWN0b3IoaDI1JHNvZnR3YXJlKQoKd2lsY294X3Rlc3QoUTE3IH4gc29mdHdhcmUsCiAgICAgICAgICAgIGRhdGEgPSBoMjUsCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiA9ICJleGFjdCIpCmBgYAoKIyMjIFEzOSB2cyBRMzEgKFNhdGlzZmFjdGlvbiB2cyBNYWpvcml0eSBNZW50ZWVzIFVuZGVyZ3JhZCkKYGBge3J9CmgzMSA8LSBtZW50b3JpbmcgJT4lCiAgbXV0YXRlKAogICAgUTMxX3RvdGFsID0gcm93U3VtcyhhY3Jvc3MoUTMxXzE6UTMxXzgpKSwKICAgIFEzMV9CID0gY2FzZV93aGVuKAogICAgICBRMzFfdG90YWwgPT0gMTAwICYgUTMxXzEgPiA1MCB+IDEsCiAgICAgIFEzMV90b3RhbCA9PSAxMDAgJiBRMzFfMSA8PSA1MCB+IDAsCiAgICAgIFRSVUUgfiBOQV9yZWFsXwogICAgKQogICkKCiMgQ2hlY2sgZ3JvdXAgY291bnRzCmgzMSAlPiUKICBmaWx0ZXIoIWlzLm5hKFEzOV8xKSkgJT4lCiAgY291bnQoUTMxX0IpCgpoMzEgJT4lIGdyb3VwX2J5KFEzMV9CKSAlPiUgc3VtbWFyaXNlKCJBdmdfU2F0X1Njb3JlIiA9IG1lYW4oUTM5XzEpKQoKIyBDb21wYXJlIHNhdGlzZmFjdGlvbgp3aWxjb3gudGVzdChRMzlfMSB+IFEzMV9CLCBkYXRhID0gaDMxKQpgYGAKCiMjIyBRMzkgdnMgUTkgKEZvcm1hbCB2cyBpbmZvcm1hbCBjZW50ZXJzKQpgYGB7ciwgcmVzdWx0cz0naGlkZSd9CmgzMCA8LSBtZW50b3JpbmcgJT4lIHNlbGVjdCgiUTkiLCAiUTM5XzEiKSAlPiUgZmlsdGVyKCFpcy5uYShROSksICFpcy5uYShRMzlfMSkpIApkaW0oaDMwKQpgYGAKCmBgYHtyfQpoMzAgJT4lIGdyb3VwX2J5KFE5KSAlPiUgc3VtbWFyaXNlKCJBdmdfU2F0X1Njb3JlIiA9IG1lYW4oUTM5XzEpKQpgYGAKCmBgYHtyfQpoMzAgJT4lIGNvdW50KFE5KQpgYGAKCmBgYHtyfQpoMzAkUTkgPC0gYXMuZmFjdG9yKGgzMCRROSkKCndpbGNveF90ZXN0KFEzOV8xIH4gUTksCiAgICAgICAgICAgIGRhdGEgPSBoMzAsCiAgICAgICAgICAgIGRpc3RyaWJ1dGlvbiA9ICJleGFjdCIpCmBgYAoKIyMgSG9sbSBBZGp1c3RlZCBQLXZhbHVlcwoKYGBge3J9CnJhd19wIDwtIGMoCiAgUTM5X1EyNiAgPSAwLjAwMjQxNiwKICBRMzlfUTkgPSAwLjAwNTg1MywKICBRMzlfUTEyYSA9IDAuMDE3NTIsCiAgUTM5X1E2ICAgPSAwLjAyMDAwLAogIFEzOV9RMjcgID0gMC4wMjc3OSwKICBRMTlfUTMyICA9IDAuMDE2NjYsCiAgUTE3X1EzMiAgPSAwLjA5ODYxLAogIFExOV9ROSAgID0gMC4wNjM2OSwKICBRMTdfUTkgICA9IDAuMTE4NjAsCiAgUTM5X1ExNiAgPSAwLjc0NzgwLAogIFExOV9RMTYgID0gMC4zNzU4MCwKICBRMTdfUTE2ICA9IDAuMjE1ODAsCiAgUTM5X1EzMiAgPSAwLjc0NTEwLAogIFEzOV9RMjIgID0gMS4wMDAwMCwKICBRMzlfUTI4ICA9IDAuNjMxMzAsCiAgUTM5X1EzNyAgPSAwLjM5NTkwLAogIFExOV9RMjkgID0gMC42NzUwMCwKICBRMTdfUTI5ICA9IDAuMDcwNDcsCiAgUTM5X1EzMSAgPSAwLjM0OTMwCikKCnJlc3VsdHMgPC0gZGF0YS5mcmFtZSgKICBDb21wYXJpc29uID0gbmFtZXMocmF3X3ApLAogIFJhd19QID0gdW5uYW1lKHJhd19wKSwKICBIb2xtX1AgPSB1bm5hbWUocC5hZGp1c3QocmF3X3AsIG1ldGhvZCA9ICJob2xtIikpCikKCnJlc3VsdHMkU2lnbmlmaWNhbnRfSG9sbSA8LSByZXN1bHRzJEhvbG1fUCA8IDAuMDUKCnJlc3VsdHMKYGBgCgoKIyMgQnVpbGRpbmcgTW9kZWxzCgpgYGB7cn0KbW9kZWxzIDwtIG1lbnRvcmluZyAlPiUKICBtdXRhdGUoCiAgICBtZW50b3JfdHJhaW5pbmcgPSBjYXNlX3doZW4oCiAgICAgIFEyNiA9PSAxIH4gMSwKICAgICAgUTI2ID09IDIgfiAwLAogICAgICBUUlVFIH4gTkFfcmVhbF8KICAgICksCiAgICBmb3JtYWxfcHJvZ3JhbSA9IGNhc2Vfd2hlbigKICAgICAgUTkgPT0gMSB+IDEsCiAgICAgIFE5ID09IDIgfiAwLAogICAgICBUUlVFIH4gTkFfcmVhbF8KICAgICksCiAgICBtZW50b3Jfc2NyZWVuaW5nID0gY2FzZV93aGVuKAogICAgICBRMTIuLi4yOSA9PSAxIH4gMSwKICAgICAgUTEyLi4uMjkgPT0gMiB+IDAsCiAgICAgIFRSVUUgfiBOQV9yZWFsXwogICAgKSwKICAgIGdyb3VwX21lbnRvcmluZyA9IGNhc2Vfd2hlbigKICAgICAgaXMubmEoUTYpIH4gTkFfcmVhbF8sCiAgICAgIGdyZXBsKCIzIiwgYXMuY2hhcmFjdGVyKFE2KSkgfiAxLAogICAgICBUUlVFIH4gMAogICAgKQogICkKYGBgCgojIyMgTW9kZWwgMTogTWVudG9yIHRyYWluaW5nICsgZm9ybWFsIHByb2dyYW0g4oaSIFNhdGlzZmFjdGlvbgpgYGB7cn0KbTEgPC0gbW9kZWxzICU+JQogIHNlbGVjdChRMzlfMSwgbWVudG9yX3RyYWluaW5nLCBmb3JtYWxfcHJvZ3JhbSkgJT4lCiAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKQoKbTEgJT4lIGNvdW50KG1lbnRvcl90cmFpbmluZywgZm9ybWFsX3Byb2dyYW0pCgptb2RlbDEgPC0gbG0oCiAgUTM5XzEgfiBtZW50b3JfdHJhaW5pbmcgKyBmb3JtYWxfcHJvZ3JhbSwKICBkYXRhID0gbTEKKQoKc3VtbWFyeShtb2RlbDEpCmBgYAoKIyMjIyBEaWFnbm9zdGljcyAKYGBge3J9CmRpYWdub3N0aWNzMSA8LSBtMSAlPiUKICBtdXRhdGUoCiAgICByZXNpZHVhbCA9IHJlc2lkdWFscyhtb2RlbDEpLAogICAgcHJlZGljdGVkID0gZml0dGVkKG1vZGVsMSksCiAgICBncm91cCA9IGludGVyYWN0aW9uKG1lbnRvcl90cmFpbmluZywgZm9ybWFsX3Byb2dyYW0pCiAgKQoKYm94cGxvdChyZXNpZHVhbCB+IGdyb3VwLAogICAgICAgIGRhdGEgPSBkaWFnbm9zdGljczEsCiAgICAgICAgbWFpbiA9ICJSZXNpZHVhbHMgYnkgR3JvdXAiLAogICAgICAgIHhsYWIgPSAiTWVudG9yIFRyYWluaW5nIC8gRm9ybWFsIFByb2dyYW0iLAogICAgICAgIHlsYWIgPSAiUmVzaWR1YWxzIikKCnN0cmlwY2hhcnQocmVzaWR1YWwgfiBncm91cCwKICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MxLAogICAgICAgICAgIHZlcnRpY2FsID0gVFJVRSwKICAgICAgICAgICBtZXRob2QgPSAiaml0dGVyIiwKICAgICAgICAgICBhZGQgPSBUUlVFLAogICAgICAgICAgIHBjaCA9IDE2KQoKYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKYGBgCgpgYGB7cn0KY2FyOjpsZXZlbmVUZXN0KHJlc2lkdWFsIH4gZ3JvdXAsCiAgICAgICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MxLAogICAgICAgICAgICAgICAgY2VudGVyID0gbWVkaWFuKQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsMSkpCnFxbm9ybShyZXNpZHVhbHMobW9kZWwxKSkKcXFsaW5lKHJlc2lkdWFscyhtb2RlbDEpLCBjb2wgPSAicmVkIikKYGBgCmBgYHtyfQojIENvb2sncyBkaXN0YW5jZSBwbG90CnBsb3QoY29va3MuZGlzdGFuY2UobW9kZWwxKSwKICAgICB0eXBlID0gImgiLAogICAgIG1haW4gPSAiQ29vaydzIERpc3RhbmNlIC0gTW9kZWwgMSIsCiAgICAgeGxhYiA9ICJPYnNlcnZhdGlvbiIsCiAgICAgeWxhYiA9ICJDb29rJ3MgRGlzdGFuY2UiKQoKIyBSZWZlcmVuY2UgY3V0b2ZmCmFibGluZShoID0gNCAvIG5vYnMobW9kZWwxKSwgY29sID0gInJlZCIsIGx0eSA9IDIpCndoaWNoKGNvb2tzLmRpc3RhbmNlKG1vZGVsMSkgPiA0IC8gbm9icyhtb2RlbDEpKQpgYGAKCiMjIyBNb2RlbCAyOiBNZW50b3Igc2NyZWVuaW5nICsgZ3JvdXAgbWVudG9yaW5nIOKGkiBTYXRpc2ZhY3Rpb24gKGlnbm9yZSkKYGBge3J9Cm0yIDwtIG1vZGVscyAlPiUKICBzZWxlY3QoUTM5XzEsIG1lbnRvcl9zY3JlZW5pbmcsIGdyb3VwX21lbnRvcmluZykgJT4lCiAgZmlsdGVyKGNvbXBsZXRlLmNhc2VzKC4pKQoKbTIgJT4lIGNvdW50KG1lbnRvcl9zY3JlZW5pbmcsIGdyb3VwX21lbnRvcmluZykKCm1vZGVsMiA8LSBsbSgKICBRMzlfMSB+IG1lbnRvcl9zY3JlZW5pbmcgKyBncm91cF9tZW50b3JpbmcsCiAgZGF0YSA9IG0yCikKCnN1bW1hcnkobW9kZWwyKQpgYGAKCgpgYGB7cn0KbG10ZXN0Ojpjb2VmdGVzdChtb2RlbDIsIHZjb3YuID0gc2FuZHdpY2g6OnZjb3ZIQyhtb2RlbDIsIHR5cGUgPSAiSEMzIikpCmBgYAoKIyMjIyBEaWFnbm9zdGljcyAyCgpgYGB7cn0KZGlhZ25vc3RpY3MyIDwtIG0yICU+JQogIG11dGF0ZSgKICAgIHJlc2lkdWFsID0gcmVzaWR1YWxzKG1vZGVsMiksCiAgICBwcmVkaWN0ZWQgPSBmaXR0ZWQobW9kZWwyKSwKICAgIGdyb3VwID0gaW50ZXJhY3Rpb24obWVudG9yX3NjcmVlbmluZywgZ3JvdXBfbWVudG9yaW5nKQogICkKCmJveHBsb3QocmVzaWR1YWwgfiBncm91cCwKICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MyLAogICAgICAgIG1haW4gPSAiUmVzaWR1YWxzIGJ5IEdyb3VwIiwKICAgICAgICB4bGFiID0gIk1lbnRvciBTY3JlZW5pbmcgLyBHcm91cCBNZW50b3JpbmciLAogICAgICAgIHlsYWIgPSAiUmVzaWR1YWxzIikKCnN0cmlwY2hhcnQocmVzaWR1YWwgfiBncm91cCwKICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MyLAogICAgICAgICAgIHZlcnRpY2FsID0gVFJVRSwKICAgICAgICAgICBtZXRob2QgPSAiaml0dGVyIiwKICAgICAgICAgICBhZGQgPSBUUlVFLAogICAgICAgICAgIHBjaCA9IDE2KQoKYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKYGBgCgpgYGB7cn0KY2FyOjpsZXZlbmVUZXN0KHJlc2lkdWFsIH4gZ3JvdXAsCiAgICAgICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MyLAogICAgICAgICAgICAgICAgY2VudGVyID0gbWVkaWFuKQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsMikpCnFxbm9ybShyZXNpZHVhbHMobW9kZWwyKSkKcXFsaW5lKHJlc2lkdWFscyhtb2RlbDIpLCBjb2wgPSAicmVkIikKYGBgCgpgYGB7cn0KIyBDb29rJ3MgZGlzdGFuY2UgcGxvdApwbG90KGNvb2tzLmRpc3RhbmNlKG1vZGVsMiksCiAgICAgdHlwZSA9ICJoIiwKICAgICBtYWluID0gIkNvb2sncyBEaXN0YW5jZSAtIE1vZGVsIDIiLAogICAgIHhsYWIgPSAiT2JzZXJ2YXRpb24iLAogICAgIHlsYWIgPSAiQ29vaydzIERpc3RhbmNlIikKCiMgUmVmZXJlbmNlIGN1dG9mZgphYmxpbmUoaCA9IDQgLyBub2JzKG1vZGVsMiksIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQp3aGljaChjb29rcy5kaXN0YW5jZShtb2RlbDIpID4gNCAvIG5vYnMobW9kZWwyKSkKYGBgCgpgYGB7cn0KCmBgYAoKIyMjIE1vZGVsIDM6IFJlcXVpcmVkIG1lZXRpbmdzICsgZm9ybWFsIHByb2dyYW0g4oaSIE51bWJlciBvZiBtZW50ZWVzCmBgYHtyfQptMyA8LSBoNyAlPiUKICBtdXRhdGUoCiAgICByZXF1aXJlZF9tZWV0aW5ncyA9IGNhc2Vfd2hlbigKICAgICAgUTMyID09IDEgfiAxLAogICAgICBRMzIgPT0gMiB+IDAsCiAgICAgIFRSVUUgfiBOQV9yZWFsXwogICAgKSwKICAgIGZvcm1hbF9wcm9ncmFtID0gY2FzZV93aGVuKAogICAgICBROSA9PSAxIH4gMSwKICAgICAgUTkgPT0gMiB+IDAsCiAgICAgIFRSVUUgfiBOQV9yZWFsXwogICAgKQogICkgJT4lCiAgc2VsZWN0KFExOSwgcmVxdWlyZWRfbWVldGluZ3MsIGZvcm1hbF9wcm9ncmFtKSAlPiUKICBmaWx0ZXIoY29tcGxldGUuY2FzZXMoLikpCgptMyAlPiUgY291bnQocmVxdWlyZWRfbWVldGluZ3MsIGZvcm1hbF9wcm9ncmFtKQoKbW9kZWwzIDwtIGxtKAogIGxvZyhRMTkpIH4gcmVxdWlyZWRfbWVldGluZ3MgKyBmb3JtYWxfcHJvZ3JhbSwKICBkYXRhID0gbTMKKQoKc3VtbWFyeShtb2RlbDMpCmBgYAoKIyMjIyBEaWFnbm9zdGljcyAzCgpgYGB7cn0KZGlhZ25vc3RpY3MzIDwtIG0zICU+JQogIG11dGF0ZSgKICAgIHJlc2lkdWFsID0gcmVzaWR1YWxzKG1vZGVsMyksCiAgICBwcmVkaWN0ZWQgPSBmaXR0ZWQobW9kZWwzKSwKICAgIGdyb3VwID0gaW50ZXJhY3Rpb24ocmVxdWlyZWRfbWVldGluZ3MsIGZvcm1hbF9wcm9ncmFtKQogICkKCmJveHBsb3QocmVzaWR1YWwgfiBncm91cCwKICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MzLAogICAgICAgIG1haW4gPSAiUmVzaWR1YWxzIGJ5IEdyb3VwIiwKICAgICAgICB4bGFiID0gIlJlcXVpcmVkIE1lZXRpbmdzIC8gRm9ybWFsIFByb2dyYW0iLAogICAgICAgIHlsYWIgPSAiUmVzaWR1YWxzIikKCnN0cmlwY2hhcnQocmVzaWR1YWwgfiBncm91cCwKICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MzLAogICAgICAgICAgIHZlcnRpY2FsID0gVFJVRSwKICAgICAgICAgICBtZXRob2QgPSAiaml0dGVyIiwKICAgICAgICAgICBhZGQgPSBUUlVFLAogICAgICAgICAgIHBjaCA9IDE2KQoKYWJsaW5lKGggPSAwLCBjb2wgPSAicmVkIiwgbHR5ID0gMikKYGBgCgpgYGB7cn0KY2FyOjpsZXZlbmVUZXN0KHJlc2lkdWFsIH4gZ3JvdXAsCiAgICAgICAgICAgICAgICBkYXRhID0gZGlhZ25vc3RpY3MzLAogICAgICAgICAgICAgICAgY2VudGVyID0gbWVkaWFuKQpgYGAKCmBgYHtyfQpzaGFwaXJvLnRlc3QocmVzaWR1YWxzKG1vZGVsMykpCnFxbm9ybShyZXNpZHVhbHMobW9kZWwzKSkKcXFsaW5lKHJlc2lkdWFscyhtb2RlbDMpLCBjb2wgPSAicmVkIikKYGBgCgpgYGB7cn0KIyBDb29rJ3MgZGlzdGFuY2UgcGxvdApwbG90KGNvb2tzLmRpc3RhbmNlKG1vZGVsMyksCiAgICAgdHlwZSA9ICJoIiwKICAgICBtYWluID0gIkNvb2sncyBEaXN0YW5jZSAtIE1vZGVsIDMiLAogICAgIHhsYWIgPSAiT2JzZXJ2YXRpb24iLAogICAgIHlsYWIgPSAiQ29vaydzIERpc3RhbmNlIikKCiMgUmVmZXJlbmNlIGN1dG9mZgphYmxpbmUoaCA9IDQgLyBub2JzKG1vZGVsMyksIGNvbCA9ICJyZWQiLCBsdHkgPSAyKQp3aGljaChjb29rcy5kaXN0YW5jZShtb2RlbDMpID4gNCAvIG5vYnMobW9kZWwzKSkKYGBgCgoK