library(binom)
library(car)
library(collapsibleTree)
library(dbplyr)
library(dplyr)
library(EnvStats)
library(ggformula)
library(ggplot2)
library(gmodels)
library(htmltools)
library(ISLR)
library(knitr)
library(lawstat)
library(markdown)
library(mosaic)
library(mdsr)
library(mosaicData)
library(nycflights13)
library(olsrr)
library(plyr)
library(purrr)
library(plotly)
library(resampledata)
library(rmarkdown)
library(rpart)
library(rpart.plot)
library(rvest)
library(SDaA)
library(shiny)
library(stringi)
library(tibble)
library(tidyr)
library(tidyselect)
library(tinytex)
library(yaml)
library(shiny)
- A pharmaceutical company conducted an experiment to compare the mean
amount of time (in days) necessary for a patient to recover from the
effects and complications that follow the onset of the common cold. In
this experiment, thirty-one healthy females between the ages of 25 and
34 years of age were randomly divided into two groups.
In the first group, nVitC=15 females received a daily dose of 500
milligrams of Vitamin C. The second group consisted of nPlacebo=16
females, each of which was given a placebo, or rather a “fake” Vitamin C
tablet. The recovery time - the time until the common cold symptoms had
disappeared - for each of the thirty-one females was observed (in days).
The data are provided below.
Received 500 mgs of Vitamin C: 6, 7, 7, 7, 8, 7, 7, 8, 7, 8, 10, 6,
8, 5, 6
Received a placebo: 10, 12, 8, 6, 9, 8, 11, 9, 11, 8, 12, 11, 9, 8,
10, 9
- Do these data indicate that the recovery time is quicker with
Vitamin C than without? Carry out the appropriate statistical
investigation with a permutation test. Ensure you show “where” your
permutation test statistic lies on the distribution. Report your
(empirical) P-value and your statistical inference. For the number of
permutation tests, use 2999.
Prepare data, display boxplot, run basic stats
time = c(6, 7, 7, 7, 8, 7, 7, 8, 7, 8, 10, 6, 8, 5, 6, 10, 12, 8, 6, 9, 8, 11, 9, 11, 8, 12, 11, 9, 8, 10, 9)
ttment = c('vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc','vc', 'n','n','n','n','n','n','n','n','n','n','n','n','n','n','n','n')
df = data.frame(time, ttment)
head(df, 3)
ggplot(df, aes(x=ttment, y=time)) + geom_boxplot(col='red', fill='blue', width=0.5) + ggtitle('Cold recovery time comparing treatment vs no treatment') + coord_flip()

stats = favstats(~time | ttment, data = df)
stats
State Hypotheses H0: recovery time without treatment = recovery time
with treatment –> recovery time without treatment - recovery time
with treatment = 0 HA: recovery time without treatment != recovery time
with treatment –> recovery time without treatment - recovery time
with treatment > 0
Possible permutations of 31 people choosing 15 at the time
choose(31, 15)
[1] 300540195
proceed to do a random distribution of diference of means by
conducting a permutation test by sampling 15 data point without
replacement as treatment and the other 16 to the no treatment, calculate
the means difference between the groups and store this difference into a
vector for further calculations after we replicate this process 4999
more times as the first difference in means correspond to the observed
values. Total permutations 5000
Determine the mean difference between the groups
ttmentMeanDiff = stats$mean[1] - stats$mean[2]
ttmentMeanDiff
[1] 2.304167
N = 2999
meanDiff.Per = numeric(N) #create a vector to store differences of means
index = sample(31, 15, replace=FALSE) #randomly pick 15 out of 31
index
[1] 13 18 9 5 19 24 15 31 29 20 27 28 26 16 7
for(i in 1:N)
{ index = sample(31, 15, replace=FALSE) #randomly pick 15 numbers out of 31
meanDiff.Per[i] = mean(df$time[index]) - mean(df$time[-index]) #mean difference between recovery time no treatment and treatment
}
Now we convert the meanDiff vecto into a dataframe
perm.df = data.frame(meanDiff.Per)
head(perm.df, 4)
tail(perm.df, 4)
Display the distribution of man difference and the value for the
observed difference
hist(meanDiff.Per, xlab='Difference in recovery time between treated and untreated patients', ylab='Frequency', main='Permutation Test (3000) outcome', col='darkgreen')
abline(v=ttmentMeanDiff, col='red')

Compute Empirical P-value
pval = (1 + sum(meanDiff.Per >= (ttmentMeanDiff))) / (N + 1)
pval
[1] 0.0003333333
The observed difference in recovery time is greater than the values
obtain in the permutations test, plus the small Pvalue of 0.0006
indicate that the observed difference in means is larger than expected
if it was just random. For this reason we reject H0 and conclude that
there is a relation between treatment with Vitamin C and faster recovery
time.
t.test(~time|ttment, alternative="greater", data=df)
Welch Two Sample t-test
data: time by ttment
t = 4.445, df = 27.08, p-value = 6.723e-05
alternative hypothesis: true difference in means between group n and group vc is greater than 0
95 percent confidence interval:
1.421325 Inf
sample estimates:
mean in group n mean in group vc
9.437500 7.133333
Pvalue from T test is smaller than Empirical Pvalue.
- Re-test your statistical hypothesis in part (a) using the t-test. In
doing so, state any assumptions about these data or conditions you are
imposing on these data and conduct the necessary diagnostics to either
confirm or refute such assumptions. Ensure you provide both the P-value
and its interpretation related to these data.
We assumed the observed data has a normal distribution. We will
display the Normal probability plot to confirm this assumption on both
Vit c treatment and No treatment groups of observed values
ggplot(filter(df, ttment=="vc"), aes(sample= time)) + stat_qq(col='blue') + stat_qqline(col='red') + ggtitle('Normal Probability Distribution of Cold recovery Time: Vitamin c treatment')

ggplot(filter(df, ttment=="n"), aes(sample= time)) + stat_qq(col='blue') + stat_qqline(col='red') + ggtitle('Normal Probability Distribution of Cold recovery Time: No treatment')

- In a 1981 case , McCleskey v. Zant, lawyers for the defendent
demonstrated that amongst all African-American convicted murderers in
the state of Georgia, 35% were found guilty of killing caucasians and 6%
of those who killed African-Americans received the death penalty. As a
result, the lawyers claimed that racial discrimination was a factor in
sentencing. This was contested by lawyers for the State of Georgia. They
argued that “murders of black victims were more likely to be
unaggravated bar-room brawls, liquor-induced arguments, or lovers
quarrels” - crimes that rarely result in a death sentence. But, amongst
white-victims, there was a higher proportion of killings committed in
the course of an armed robbery or involving torture - which more often
result in death sentences.
The table below summarizes data for all African-American convicted
murders in Georgia, resulting from difference categories of crime. (For
example, Aggravation Level 1 consists of bar-room brawls, liquor-induced
arguments, etc., Aggravation Level 6 includes the most vicious,
cold-blooded, unprovoked crimes).
Sentenced to Death Not Sentenced to Death
v Victim was Caucasian 45 85
Victim was African-American 14 218
- Visualize these data with a bar-graph (see Assignment One) that
appropriately summarizes these counts.
conviction = rbind(c(45, 85), c(14, 218))
conviction
[,1] [,2]
[1,] 45 85
[2,] 14 218
rownames(conviction) = c("Victim was Caucasian", "Victim as African American")
colnames(conviction) = c("Sentenced to Death", "Not Sentenced to Death")
conviction
Sentenced to Death Not Sentenced to Death
Victim was Caucasian 45 85
Victim as African American 14 218
barplot(conviction, main="Convictions based on the victim's race", col=c("darkblue", "darkred"), legend=rownames(conviction))

- Do these data suggest that the race of the victim does appear to
affect whether an African-American convicted of murder in Georgia will
receive a death sentence? Interpret your findings. Should you reject the
null hypothesis, provide an interval with 95% coverage/confidence.
Hypotheses H0: The race of the victim and the sentence are
independent HA: the race of the victim and the sentence are not
independent
xchisq.test(conviction, correct=FALSE)
Pearson's Chi-squared test
data: x
X-squared = 49.888, df = 1, p-value = 1.628e-12
45.00 85.00
( 21.19) (108.81)
[26.76] [ 5.21]
< 5.17> <-2.28>
14.00 218.00
( 37.81) (194.19)
[15.00] [ 2.92]
<-3.87> < 1.71>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
prop.test(c(45, 14), c(130, 232), alternative="greater", correct=FALSE)
2-sample test for equality of proportions without continuity correction
data: c out of c45 out of 13014 out of 232
X-squared = 49.888, df = 1, p-value = 8.138e-13
alternative hypothesis: greater
95 percent confidence interval:
0.2125175 1.0000000
sample estimates:
prop 1 prop 2
0.34615385 0.06034483
through chisq test, we get a Pvalue that is very small, 1.62 e-12,
which is confimed through the prop test with Pvalue of 8.14e-13; the
confidence interval found through the prop test gives us 0.2125 - 1
These results confirm the rejection of the hypothesis null; we can say
that there is a relation between the race of the victim and the
sentence.
- Refer to a question from Assignment 1, where you were asked to refer
to certain variables of the General Society Survey of 2002. For your
convenience, the data file is linked below.
gss = read.csv("https://raw.githubusercontent.com/Statman44/Data602/main/GSS2002.csv")
head(gss, 3)
gss.df = gss[complete.cases(gss),]
gss.df
- Is there a relationship between one’s support for gun laws (variable
name is GunLaw) and their opinion about current government spending on
Science (variable name is SpendSci)? State the appropriate statistical
hypotheses.
tableGss = tally(~GunLaw + SpendSci, data=gss.df)
tableGss
SpendSci
GunLaw About right Too little Too much
Favor 39 24 6
Oppose 9 11 3
Hypotheses H0: Gun Law and Spending on Science are Independent HA:
Gun Law and Spending on Science are not independent
- Carry out the appropriate statistical test, providing both the test
statistic and the P-value.
xchisq.test(tableGss, simulate.p.value=TRUE)
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)
data: x
X-squared = 2.1048, df = NA, p-value = 0.3793
39 24 6
(36.00) (26.25) ( 6.75)
[0.250] [0.193] [0.083]
< 0.50> <-0.44> <-0.29>
9 11 3
(12.00) ( 8.75) ( 2.25)
[0.750] [0.579] [0.250]
<-0.87> < 0.76> < 0.50>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
According to the chi squared test we get a Pvalue of 0.918 and
Chi-squared of 2.1048
What can you conclude? Do these data support your null hypothesis
in part (a)? State your decision and conclusion. According to the
results we got, we fail to reject the hypothesis null. We can say that
there is no relation between Gun Law and Spending on Science.
Re-trace your result, in the form of a bar-graph, that was
provided in Assignment 1, Question 9. Can you infer from these data that
one’s level of Education is independent of their Race? Present your
findings in the form of a paragraph, outlining the decision you have
made, why you made the decision you made, and the P -value.
ggplot(data=gss) + geom_bar(aes(x = Education, fill = Race), position = "fill")

ggplot(data=gss) + geom_bar(aes(x = Education, fill=Race), position = "dodge", na.rm=TRUE)

tableGss1 = tally(~Education + Race, data=gss.df)
tableGss1
Race
Education Black Other White
Bachelors 2 1 24
Graduate 1 1 15
HS 5 2 29
Jr Col 1 0 7
Left HS 0 0 4
Hypotheses: H0: the level of education and Race are independent HA:
the level of education and race are not independent
xchisq.test(tableGss1, simulate.p.value=TRUE)
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)
data: x
X-squared = 2.5062, df = NA, p-value = 0.979
2 1 24
( 2.64) ( 1.17) (23.18)
[0.1557] [0.0258] [0.0287]
<-0.39> <-0.16> < 0.17>
1 1 15
( 1.66) ( 0.74) (14.60)
[0.2644] [0.0921] [0.0111]
<-0.51> < 0.30> < 0.11>
5 2 29
( 3.52) ( 1.57) (30.91)
[0.6205] [0.1208] [0.1184]
< 0.79> < 0.35> <-0.34>
1 0 7
( 0.78) ( 0.35) ( 6.87)
[0.0604] [0.3478] [0.0025]
< 0.25> <-0.59> < 0.05>
0 0 4
( 0.39) ( 0.17) ( 3.43)
[0.3913] [0.1739] [0.0930]
<-0.63> <-0.42> < 0.30>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
According to the results, Pvalue=1 so we fail to reject the
hypothesis null and conclude that there is no relation between one’s
level of education and race. By just looking at the graph, one would
think differently but when reading the table, we can see that most of
the people that participated in the survey are white; we conclude that
the statistical analysis is correct, and there is no relation between
the level of education and race.
A group of patients with a binge-eating disorder were randomly
assigned to take either the experimental drug fluvoxamine or the placebo
in a nine-week-long, double-blinded clinical trial. At the end of the
trial the condition of each patient was classified into one of four
categories: no response, moderate response, marked response, or
remission. The table below shows a cross-classification, or contingency
table, of these data.
No Response Moderate Response Marked response Remission
Fluvoxamine 15 7 3 15 Placebo 22 7 3 11
Do these data provide statistically significant evidence to conclude
that there is an association between the type of treatment received and
a patient’s response?
Hypotheses H0: The patient’s response to treatment and the use of
Fluvoxamine are independent HA: The patient’s response to treatment and
the use of Fluvoxamine are not independent
bingeTable = rbind(c(15, 7, 3, 15), c(22, 7, 3, 11))
rownames(bingeTable) = c("Fluvoxamine", "Placebo")
colnames(bingeTable) = c("No Response", "Moderate Response", "Marked Response", "Remission")
bingeTable
No Response Moderate Response Marked Response Remission
Fluvoxamine 15 7 3 15
Placebo 22 7 3 11
xchisq.test(bingeTable, simulate.p.value=TRUE)
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)
data: x
X-squared = 1.8337, df = NA, p-value = 0.6332
15.00 7.00 3.00 15.00
(17.83) ( 6.75) ( 2.89) (12.53)
[0.4496] [0.0095] [0.0041] [0.4869]
<-0.670> < 0.097> < 0.064> < 0.698>
22.00 7.00 3.00 11.00
(19.17) ( 7.25) ( 3.11) (13.47)
[0.4182] [0.0088] [0.0038] [0.4529]
< 0.647> <-0.094> <-0.062> <-0.673>
key:
observed
(expected)
[contribution to X-squared]
<Pearson residual>
We got a Pvalue of 0.6082 we conclude fail to reject the hypothesis
null and therefore we can say that there is no relation between the
treatment with Fluvoxamine and the response of the patients.
- A study conducted by Youmans and Jee2 looked at students who took a
research methods class in psychology. Two lecture sections of the same
course were taught by the same instructor. Students in each lecture
section were required to register in one of two Friday afternoon
discussion sections, or a tutorial. During the ninth week of
instruction, all students were asked to fill out an informal midsemester
evaluation in their Friday afternoon discussion session.
In half of the Friday afternoon discussion sections, the experimenter
(not the professor/instructor!) passed around a bag containing small
bars of chocolate that he simply had ‘left-over’ and ‘wanted to get rid
of’ so that students would not think the chocolate was a gift from their
professor/instructor. The evaluation was a survey that contained nine
questions. For each question the student provided a rating from 1 (very
poor) to 5 (excellent).
Question 9 posed the following: ``Compared to other instructors you
have had at this university, this instrutor is:’’ 1 (very poor) to 5
(excellent)
Compliments to the authors, they have provided me with the data in
this particular study. In the file you will find the raw data providing
the student responses for Question 9 (Q9) and the overall average
response for Questions 1 through 9 (Overall) for each student. Note: To
easily read this into your R session, select the “Raw” button prior,
then use the resulting URL.
Ssurvey = read.csv("https://raw.githubusercontent.com/Statman44/Data602/main/chocnochocratings.csv")
head(Ssurvey, 3)
- Pertaining to Question 9: Do these data suggest there is a treatment
effect? Test the existence of a treatment effect using a permutation
test. If a treatment effect is discovered, explain its meaning in the
context of these data. Carry out a permutation test, using 1999
iterations.
(You will have to carefully consider “what a treatment effect” is in
this scenario.)
The treatment here is the administration of chocolate. By looking at
the data we can see that they all were offered the chocolate but some
took it some others didn’t take the chocolate. Did the administration of
chocolate influence their survey response to Q9?
Hypotheses H0: The responses to Q9 in the survey and the treatment
are independent q9 treatment = q9 no treatment HA: the responses to Q9
in the survey and the treatment are not independent q9 treatment > q9
no treatment
Exploring the data
ggplot(Ssurvey, aes(x = GroupName, y = Q9)) + geom_boxplot(col="red", fill="blue", width=0.5) + ggtitle("Q9 Student Survey: treatment effect") + coord_flip()

favstats(~Q9|GroupName, data= Ssurvey)
obsdiff.ttmt = mean(~Q9, data = filter(Ssurvey, GroupName == "Chocolate")) - mean(~Q9, data = filter(Ssurvey, GroupName == "NOChoc"))
obsdiff.ttmt
[1] 0.2033333
Performing 1999 permutations
N = 1999
perms = numeric(N)
for(i in 1:N)
{ index = sample(98, 50, replace=FALSE)
perms[i] = mean(Ssurvey$Q9[index]) - mean(Ssurvey$Q9[-index])
}
perms.df = data.frame(perms)
head(perms.df,4)
tail(perms.df, 3)
Display a histogram to understand the distribution of the
permutations
hist(perms, xlab="Difference Between Mean answer to Q9 (Chocolate - NoChocolate)", ylab="Frequency", main="Outcome of 2000 Permutation Tests", col='blue')
abline(v = obsdiff.ttmt, col="red")

Find the Empirical Pvalue
(sum(perms >= obsdiff.ttmt) + 1 )/(N + 1) #computes empirical P-value
[1] 0.161
- Consider the variable Overall. Is there a treatment effect with
respect to the professor’s overall rating as a teacher? Apply the t-test
to these data. Interpret the meaning of the P-value. (chitest and
xchitest)
Hypotheses H0: the overall score and the treatment are independent
HA: the overall score and the treatment are not independent
tableSsurvey = tally(~Overall + GroupName, data=Ssurvey)
tableSsurvey
GroupName
Overall Chocolate NOChoc
2 0 1
2.44 1 0
2.56 1 1
2.67 1 0
2.78 0 1
2.89 2 1
3 2 3
3.11 0 2
3.33 0 2
3.44 1 1
3.56 1 2
3.67 6 2
3.78 2 4
3.89 2 6
4 3 3
4.11 3 0
4.22 3 8
4.33 2 2
4.44 3 2
4.56 6 3
4.67 3 2
4.78 1 0
4.89 3 0
5 4 2
Graphing Normal Probability plot for both Treatment and No
Treatment
ggplot(filter(Ssurvey, GroupName == "Chocolate"), aes(sample = Overall)) + stat_qq(col="blue") + stat_qqline(col="red") + ggtitle("Normal Probability Plot of Student Survey: Treatment")

ggplot(filter(Ssurvey, GroupName == "NOChoc"), aes(sample = Overall)) + stat_qq(col="blue") + stat_qqline(col="red") + ggtitle("Normal Probability Plot of Student Survey: No Treatment")

t.test(~Overall | GroupName, data = Ssurvey, alternative='greater')
Welch Two Sample t-test
data: Overall by GroupName
t = 1.6616, df = 95.93, p-value = 0.04993
alternative hypothesis: true difference in means between group Chocolate and group NOChoc is greater than 0
95 percent confidence interval:
9.400666e-05 Inf
sample estimates:
mean in group Chocolate mean in group NOChoc
4.072000 3.849792
According the the Pvalue we get from the t.test of 0.05, and the
empirical Pvalue of 0.161, we fail to reject the hypothesis null and
conclude that the professor’s overall rating is independent of the
student’s treatment with chocolate
chisq.test(tableSsurvey, simulate.p.value=TRUE)
Pearson's Chi-squared test with simulated p-value (based on 2000 replicates)
data: tableSsurvey
X-squared = 24.842, df = NA, p-value = 0.3708
- Consider the test suggested in part (a). Why would a t-test not be a
recommended statistical method to carry out the test in part (a)?
Explain your answer in a few sentences.
R./ We can see in the boxplots how similar the stats for the 2 groups
are, this is confirmed by the favstats results. the permutation will
help magnify the differences between the two groups and give statistical
significance to the difference, if any. Permutations are good when we do
not know much about the population and we don’t need to do
assumptions.
LS0tCnRpdGxlOiAiNjAyLUFzc2lnbWVudDQtMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CmxpYnJhcnkoYmlub20pCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGNvbGxhcHNpYmxlVHJlZSkKbGlicmFyeShkYnBseXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoRW52U3RhdHMpCmxpYnJhcnkoZ2dmb3JtdWxhKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ21vZGVscykKbGlicmFyeShodG1sdG9vbHMpCmxpYnJhcnkoSVNMUikKbGlicmFyeShrbml0cikKbGlicmFyeShsYXdzdGF0KQpsaWJyYXJ5KG1hcmtkb3duKQpsaWJyYXJ5KG1vc2FpYykKbGlicmFyeShtZHNyKQpsaWJyYXJ5KG1vc2FpY0RhdGEpCmxpYnJhcnkobnljZmxpZ2h0czEzKQpsaWJyYXJ5KG9sc3JyKQpsaWJyYXJ5KHBseXIpCmxpYnJhcnkocHVycnIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJlc2FtcGxlZGF0YSkKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkocnBhcnQpCmxpYnJhcnkocnBhcnQucGxvdCkKbGlicmFyeShydmVzdCkKbGlicmFyeShTRGFBKQpsaWJyYXJ5KHNoaW55KQpsaWJyYXJ5KHN0cmluZ2kpCmxpYnJhcnkodGliYmxlKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHRpZHlzZWxlY3QpCmxpYnJhcnkodGlueXRleCkKbGlicmFyeSh5YW1sKQpsaWJyYXJ5KHNoaW55KQpgYGAKCjEuIEEgcGhhcm1hY2V1dGljYWwgY29tcGFueSBjb25kdWN0ZWQgYW4gZXhwZXJpbWVudCB0byBjb21wYXJlIHRoZSBtZWFuIGFtb3VudCBvZiB0aW1lIChpbiBkYXlzKSBuZWNlc3NhcnkgZm9yIGEgcGF0aWVudCB0byByZWNvdmVyIGZyb20gdGhlIGVmZmVjdHMgYW5kIGNvbXBsaWNhdGlvbnMgdGhhdCBmb2xsb3cgdGhlIG9uc2V0IG9mIHRoZSBjb21tb24gY29sZC4gSW4gdGhpcyBleHBlcmltZW50LCB0aGlydHktb25lIGhlYWx0aHkgZmVtYWxlcyBiZXR3ZWVuIHRoZSBhZ2VzIG9mIDI1IGFuZCAzNCB5ZWFycyBvZiBhZ2Ugd2VyZSByYW5kb21seSBkaXZpZGVkIGludG8gdHdvIGdyb3Vwcy4KCkluIHRoZSBmaXJzdCBncm91cCwgblZpdEM9MTUgIGZlbWFsZXMgcmVjZWl2ZWQgYSBkYWlseSBkb3NlIG9mIDUwMCBtaWxsaWdyYW1zIG9mIFZpdGFtaW4gQy4gVGhlIHNlY29uZCBncm91cCBjb25zaXN0ZWQgb2YgblBsYWNlYm89MTYgZmVtYWxlcywgZWFjaCBvZiB3aGljaCB3YXMgZ2l2ZW4gYSBwbGFjZWJvLCBvciByYXRoZXIgYSDigJxmYWtl4oCdIFZpdGFtaW4gQyB0YWJsZXQuIFRoZSByZWNvdmVyeSB0aW1lIC0gdGhlIHRpbWUgdW50aWwgdGhlIGNvbW1vbiBjb2xkIHN5bXB0b21zIGhhZCBkaXNhcHBlYXJlZCAtIGZvciBlYWNoIG9mIHRoZSB0aGlydHktb25lIGZlbWFsZXMgd2FzIG9ic2VydmVkIChpbiBkYXlzKS4gVGhlIGRhdGEgYXJlIHByb3ZpZGVkIGJlbG93LgoKUmVjZWl2ZWQgNTAwIG1ncyBvZiBWaXRhbWluIEM6IDYsIDcsIDcsIDcsIDgsIDcsIDcsIDgsIDcsIDgsIDEwLCA2LCA4LCA1LCA2CgpSZWNlaXZlZCBhIHBsYWNlYm86IDEwLCAxMiwgOCwgNiwgOSwgOCwgMTEsIDksIDExLCA4LCAxMiwgMTEsIDksIDgsIDEwLCA5CgphLiBEbyB0aGVzZSBkYXRhIGluZGljYXRlIHRoYXQgdGhlIHJlY292ZXJ5IHRpbWUgaXMgcXVpY2tlciB3aXRoIFZpdGFtaW4gQyB0aGFuIHdpdGhvdXQ/IENhcnJ5IG91dCB0aGUgYXBwcm9wcmlhdGUgc3RhdGlzdGljYWwgaW52ZXN0aWdhdGlvbiB3aXRoIGEgcGVybXV0YXRpb24gdGVzdC4gRW5zdXJlIHlvdSBzaG93IOKAnHdoZXJl4oCdIHlvdXIgcGVybXV0YXRpb24gdGVzdCBzdGF0aXN0aWMgbGllcyBvbiB0aGUgZGlzdHJpYnV0aW9uLiBSZXBvcnQgeW91ciAoZW1waXJpY2FsKSBQLXZhbHVlIGFuZCB5b3VyIHN0YXRpc3RpY2FsIGluZmVyZW5jZS4gRm9yIHRoZSBudW1iZXIgb2YgcGVybXV0YXRpb24gdGVzdHMsIHVzZSAyOTk5LgoKUHJlcGFyZSBkYXRhLCBkaXNwbGF5IGJveHBsb3QsIHJ1biBiYXNpYyBzdGF0cwoKYGBge3J9CnRpbWUgPSBjKDYsIDcsIDcsIDcsIDgsIDcsIDcsIDgsIDcsIDgsIDEwLCA2LCA4LCA1LCA2LCAxMCwgMTIsIDgsIDYsIDksIDgsIDExLCA5LCAxMSwgOCwgMTIsIDExLCA5LCA4LCAxMCwgOSkKdHRtZW50ID0gYygndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywndmMnLCd2YycsJ3ZjJywgJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nLCduJywnbicsJ24nKQoKZGYgPSBkYXRhLmZyYW1lKHRpbWUsIHR0bWVudCkKaGVhZChkZiwgMykKYGBgCmBgYHtyfQpnZ3Bsb3QoZGYsIGFlcyh4PXR0bWVudCwgeT10aW1lKSkgKyBnZW9tX2JveHBsb3QoY29sPSdyZWQnLCBmaWxsPSdibHVlJywgd2lkdGg9MC41KSArIGdndGl0bGUoJ0NvbGQgcmVjb3ZlcnkgdGltZSBjb21wYXJpbmcgdHJlYXRtZW50IHZzIG5vIHRyZWF0bWVudCcpICsgY29vcmRfZmxpcCgpCmBgYApgYGB7cn0Kc3RhdHMgPSBmYXZzdGF0cyh+dGltZSB8IHR0bWVudCwgZGF0YSA9IGRmKQpzdGF0cwpgYGAKCgpTdGF0ZSBIeXBvdGhlc2VzCiAgICAgICAgICBIMDogcmVjb3ZlcnkgdGltZSB3aXRob3V0IHRyZWF0bWVudCA9IHJlY292ZXJ5IHRpbWUgd2l0aCB0cmVhdG1lbnQgIC0tPiByZWNvdmVyeSB0aW1lIHdpdGhvdXQgdHJlYXRtZW50IC0gcmVjb3ZlcnkgdGltZSB3aXRoIHRyZWF0bWVudCA9IDAKICAgICAgICAgIEhBOiByZWNvdmVyeSB0aW1lIHdpdGhvdXQgdHJlYXRtZW50ICE9IHJlY292ZXJ5IHRpbWUgd2l0aCB0cmVhdG1lbnQgLS0+IHJlY292ZXJ5IHRpbWUgd2l0aG91dCB0cmVhdG1lbnQgLSByZWNvdmVyeSB0aW1lIHdpdGggdHJlYXRtZW50ID4gMAogICAgICAgICAgClBvc3NpYmxlIHBlcm11dGF0aW9ucyBvZiAzMSBwZW9wbGUgY2hvb3NpbmcgMTUgYXQgdGhlIHRpbWUKYGBge3J9CmNob29zZSgzMSwgMTUpCmBgYApwcm9jZWVkIHRvIGRvIGEgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvZiBkaWZlcmVuY2Ugb2YgbWVhbnMgYnkgY29uZHVjdGluZyBhIHBlcm11dGF0aW9uIHRlc3QgYnkgc2FtcGxpbmcgMTUgZGF0YSBwb2ludCB3aXRob3V0IHJlcGxhY2VtZW50IGFzIHRyZWF0bWVudCBhbmQgdGhlIG90aGVyIDE2IHRvIHRoZSBubyB0cmVhdG1lbnQsIGNhbGN1bGF0ZSB0aGUgbWVhbnMgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBncm91cHMgYW5kIHN0b3JlIHRoaXMgZGlmZmVyZW5jZSBpbnRvIGEgdmVjdG9yIGZvciBmdXJ0aGVyIGNhbGN1bGF0aW9ucyBhZnRlciB3ZSByZXBsaWNhdGUgdGhpcyBwcm9jZXNzIDQ5OTkgbW9yZSB0aW1lcyBhcyB0aGUgZmlyc3QgZGlmZmVyZW5jZSBpbiBtZWFucyBjb3JyZXNwb25kIHRvIHRoZSBvYnNlcnZlZCB2YWx1ZXMuIFRvdGFsIHBlcm11dGF0aW9ucyA1MDAwCgpEZXRlcm1pbmUgdGhlIG1lYW4gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBncm91cHMKYGBge3J9CnR0bWVudE1lYW5EaWZmID0gc3RhdHMkbWVhblsxXSAtIHN0YXRzJG1lYW5bMl0KdHRtZW50TWVhbkRpZmYKYGBgCmBgYHtyfQpOID0gMjk5OQptZWFuRGlmZi5QZXIgPSBudW1lcmljKE4pICNjcmVhdGUgYSB2ZWN0b3IgdG8gc3RvcmUgZGlmZmVyZW5jZXMgb2YgbWVhbnMKaW5kZXggPSBzYW1wbGUoMzEsIDE1LCByZXBsYWNlPUZBTFNFKSAjcmFuZG9tbHkgcGljayAxNSBvdXQgb2YgMzEKaW5kZXgKZm9yKGkgaW4gMTpOKQp7IGluZGV4ID0gc2FtcGxlKDMxLCAxNSwgcmVwbGFjZT1GQUxTRSkgI3JhbmRvbWx5IHBpY2sgMTUgbnVtYmVycyBvdXQgb2YgMzEKICBtZWFuRGlmZi5QZXJbaV0gPSBtZWFuKGRmJHRpbWVbaW5kZXhdKSAtIG1lYW4oZGYkdGltZVstaW5kZXhdKSAjbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gcmVjb3ZlcnkgdGltZSBubyB0cmVhdG1lbnQgYW5kIHRyZWF0bWVudAp9CmBgYApOb3cgd2UgY29udmVydCB0aGUgbWVhbkRpZmYgdmVjdG8gaW50byBhIGRhdGFmcmFtZQpgYGB7cn0KcGVybS5kZiA9IGRhdGEuZnJhbWUobWVhbkRpZmYuUGVyKQpoZWFkKHBlcm0uZGYsIDQpCmBgYApgYGB7cn0KdGFpbChwZXJtLmRmLCA0KQpgYGAKRGlzcGxheSB0aGUgZGlzdHJpYnV0aW9uIG9mIG1hbiBkaWZmZXJlbmNlIGFuZCB0aGUgdmFsdWUgZm9yIHRoZSBvYnNlcnZlZCBkaWZmZXJlbmNlCmBgYHtyfQpoaXN0KG1lYW5EaWZmLlBlciwgeGxhYj0nRGlmZmVyZW5jZSBpbiByZWNvdmVyeSB0aW1lIGJldHdlZW4gdHJlYXRlZCBhbmQgdW50cmVhdGVkIHBhdGllbnRzJywgeWxhYj0nRnJlcXVlbmN5JywgbWFpbj0nUGVybXV0YXRpb24gVGVzdCAoMzAwMCkgb3V0Y29tZScsIGNvbD0nZGFya2dyZWVuJykKYWJsaW5lKHY9dHRtZW50TWVhbkRpZmYsIGNvbD0ncmVkJykKYGBgCkNvbXB1dGUgRW1waXJpY2FsIFAtdmFsdWUKYGBge3J9CnB2YWwgPSAoMSArIHN1bShtZWFuRGlmZi5QZXIgPj0gKHR0bWVudE1lYW5EaWZmKSkpIC8gKE4gKyAxKQpwdmFsCmBgYApUaGUgb2JzZXJ2ZWQgZGlmZmVyZW5jZSBpbiByZWNvdmVyeSB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWVzIG9idGFpbiBpbiB0aGUgcGVybXV0YXRpb25zIHRlc3QsIHBsdXMgdGhlIHNtYWxsIFB2YWx1ZSBvZiAwLjAwMDYgaW5kaWNhdGUgdGhhdCB0aGUgb2JzZXJ2ZWQgZGlmZmVyZW5jZSBpbiBtZWFucyBpcyBsYXJnZXIgdGhhbiBleHBlY3RlZCBpZiBpdCB3YXMganVzdCByYW5kb20uIEZvciB0aGlzIHJlYXNvbiB3ZSByZWplY3QgSDAgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgYSByZWxhdGlvbiBiZXR3ZWVuIHRyZWF0bWVudCB3aXRoIFZpdGFtaW4gQyBhbmQgZmFzdGVyIHJlY292ZXJ5IHRpbWUuCgpgYGB7cn0KdC50ZXN0KH50aW1lfHR0bWVudCwgYWx0ZXJuYXRpdmU9ImdyZWF0ZXIiLCBkYXRhPWRmKQpgYGAKUHZhbHVlIGZyb20gVCB0ZXN0IGlzIHNtYWxsZXIgdGhhbiBFbXBpcmljYWwgUHZhbHVlLiAgCgpiLiBSZS10ZXN0IHlvdXIgc3RhdGlzdGljYWwgaHlwb3RoZXNpcyBpbiBwYXJ0IChhKSB1c2luZyB0aGUgdC10ZXN0LiBJbiBkb2luZyBzbywgc3RhdGUgYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZXNlIGRhdGEgb3IgY29uZGl0aW9ucyB5b3UgYXJlIGltcG9zaW5nIG9uIHRoZXNlIGRhdGEgYW5kIGNvbmR1Y3QgdGhlIG5lY2Vzc2FyeSBkaWFnbm9zdGljcyB0byBlaXRoZXIgY29uZmlybSBvciByZWZ1dGUgc3VjaCBhc3N1bXB0aW9ucy4gRW5zdXJlIHlvdSBwcm92aWRlIGJvdGggdGhlIFAtdmFsdWUgYW5kIGl0cyBpbnRlcnByZXRhdGlvbiByZWxhdGVkIHRvIHRoZXNlIGRhdGEuCgoKV2UgYXNzdW1lZCB0aGUgb2JzZXJ2ZWQgZGF0YSBoYXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBXZSB3aWxsIGRpc3BsYXkgdGhlIE5vcm1hbCBwcm9iYWJpbGl0eSBwbG90IHRvIGNvbmZpcm0gdGhpcyBhc3N1bXB0aW9uIG9uIGJvdGggVml0IGMgdHJlYXRtZW50IGFuZCBObyB0cmVhdG1lbnQgZ3JvdXBzIG9mIG9ic2VydmVkIHZhbHVlcwpgYGB7cn0KZ2dwbG90KGZpbHRlcihkZiwgdHRtZW50PT0idmMiKSwgYWVzKHNhbXBsZT0gdGltZSkpICsgc3RhdF9xcShjb2w9J2JsdWUnKSArIHN0YXRfcXFsaW5lKGNvbD0ncmVkJykgKyBnZ3RpdGxlKCdOb3JtYWwgUHJvYmFiaWxpdHkgRGlzdHJpYnV0aW9uIG9mIENvbGQgcmVjb3ZlcnkgVGltZTogVml0YW1pbiBjIHRyZWF0bWVudCcpCmBgYApgYGB7cn0KZ2dwbG90KGZpbHRlcihkZiwgdHRtZW50PT0ibiIpLCBhZXMoc2FtcGxlPSB0aW1lKSkgKyBzdGF0X3FxKGNvbD0nYmx1ZScpICsgc3RhdF9xcWxpbmUoY29sPSdyZWQnKSArIGdndGl0bGUoJ05vcm1hbCBQcm9iYWJpbGl0eSBEaXN0cmlidXRpb24gb2YgQ29sZCByZWNvdmVyeSBUaW1lOiBObyB0cmVhdG1lbnQnKQpgYGAKCgoyLiBJbiBhIDE5ODEgY2FzZSAsIE1jQ2xlc2tleSB2LiBaYW50LCBsYXd5ZXJzIGZvciB0aGUgZGVmZW5kZW50IGRlbW9uc3RyYXRlZCB0aGF0IGFtb25nc3QgYWxsIEFmcmljYW4tQW1lcmljYW4gY29udmljdGVkIG11cmRlcmVycyBpbiB0aGUgc3RhdGUgb2YgR2VvcmdpYSwgMzUlIHdlcmUgZm91bmQgZ3VpbHR5IG9mIGtpbGxpbmcgY2F1Y2FzaWFucyBhbmQgNiUgb2YgdGhvc2Ugd2hvIGtpbGxlZCBBZnJpY2FuLUFtZXJpY2FucyByZWNlaXZlZCB0aGUgZGVhdGggcGVuYWx0eS4gQXMgYSByZXN1bHQsIHRoZSBsYXd5ZXJzIGNsYWltZWQgdGhhdCByYWNpYWwgZGlzY3JpbWluYXRpb24gd2FzIGEgZmFjdG9yIGluIHNlbnRlbmNpbmcuIFRoaXMgd2FzIGNvbnRlc3RlZCBieSBsYXd5ZXJzIGZvciB0aGUgU3RhdGUgb2YgR2VvcmdpYS4gVGhleSBhcmd1ZWQgdGhhdCDigJxtdXJkZXJzIG9mIGJsYWNrIHZpY3RpbXMgd2VyZSBtb3JlIGxpa2VseSB0byBiZSB1bmFnZ3JhdmF0ZWQgYmFyLXJvb20gYnJhd2xzLCBsaXF1b3ItaW5kdWNlZCBhcmd1bWVudHMsIG9yIGxvdmVycyBxdWFycmVsc+KAnSAtIGNyaW1lcyB0aGF0IHJhcmVseSByZXN1bHQgaW4gYSBkZWF0aCBzZW50ZW5jZS4gQnV0LCBhbW9uZ3N0IHdoaXRlLXZpY3RpbXMsIHRoZXJlIHdhcyBhIGhpZ2hlciBwcm9wb3J0aW9uIG9mIGtpbGxpbmdzIGNvbW1pdHRlZCBpbiB0aGUgY291cnNlIG9mIGFuIGFybWVkIHJvYmJlcnkgb3IgaW52b2x2aW5nIHRvcnR1cmUgLSB3aGljaCBtb3JlIG9mdGVuIHJlc3VsdCBpbiBkZWF0aCBzZW50ZW5jZXMuCgpUaGUgdGFibGUgYmVsb3cgc3VtbWFyaXplcyBkYXRhIGZvciBhbGwgQWZyaWNhbi1BbWVyaWNhbiBjb252aWN0ZWQgbXVyZGVycyBpbiBHZW9yZ2lhLCByZXN1bHRpbmcgZnJvbSBkaWZmZXJlbmNlIGNhdGVnb3JpZXMgb2YgY3JpbWUuIChGb3IgZXhhbXBsZSwgQWdncmF2YXRpb24gTGV2ZWwgMSBjb25zaXN0cyBvZiBiYXItcm9vbSBicmF3bHMsIGxpcXVvci1pbmR1Y2VkIGFyZ3VtZW50cywgZXRjLiwgQWdncmF2YXRpb24gTGV2ZWwgNiBpbmNsdWRlcyB0aGUgbW9zdCB2aWNpb3VzLCBjb2xkLWJsb29kZWQsIHVucHJvdm9rZWQgY3JpbWVzKS4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW50ZW5jZWQgdG8gRGVhdGggICAgICAgIE5vdCBTZW50ZW5jZWQgdG8gRGVhdGgKICAgICAgICAgICAgICAgICAgICAgdiAgVmljdGltIHdhcyBDYXVjYXNpYW4gICAgICAgICAgNDUgICAgICAgICAgICAgICAgICAgICAgICAgIDg1CiAgICAgICAgICAgICAgICAgVmljdGltIHdhcyBBZnJpY2FuLUFtZXJpY2FuICAgICAgICAgIDE0ICAgICAgICAgICAgICAgICAgICAgICAgIDIxOAogICAgICAgICAgICAgICAgIAphLiBWaXN1YWxpemUgdGhlc2UgZGF0YSB3aXRoIGEgYmFyLWdyYXBoIChzZWUgQXNzaWdubWVudCBPbmUpIHRoYXQgYXBwcm9wcmlhdGVseSBzdW1tYXJpemVzIHRoZXNlIGNvdW50cy4KICAKYGBge3J9Cgpjb252aWN0aW9uID0gcmJpbmQoYyg0NSwgODUpLCBjKDE0LCAyMTgpKQpjb252aWN0aW9uCmBgYApgYGB7cn0Kcm93bmFtZXMoY29udmljdGlvbikgPSBjKCJWaWN0aW0gd2FzIENhdWNhc2lhbiIsICJWaWN0aW0gYXMgQWZyaWNhbiBBbWVyaWNhbiIpCmNvbG5hbWVzKGNvbnZpY3Rpb24pID0gYygiU2VudGVuY2VkIHRvIERlYXRoIiwgIk5vdCBTZW50ZW5jZWQgdG8gRGVhdGgiKQpjb252aWN0aW9uCmBgYAogIApgYGB7cn0KCmJhcnBsb3QoY29udmljdGlvbiwgbWFpbj0iQ29udmljdGlvbnMgYmFzZWQgb24gdGhlICB2aWN0aW0ncyByYWNlIiwgY29sPWMoImRhcmtibHVlIiwgImRhcmtyZWQiKSwgbGVnZW5kPXJvd25hbWVzKGNvbnZpY3Rpb24pKSAKYGBgCgpiLiBEbyB0aGVzZSBkYXRhIHN1Z2dlc3QgdGhhdCB0aGUgcmFjZSBvZiB0aGUgdmljdGltIGRvZXMgYXBwZWFyIHRvIGFmZmVjdCB3aGV0aGVyIGFuIEFmcmljYW4tQW1lcmljYW4gY29udmljdGVkIG9mIG11cmRlciBpbiBHZW9yZ2lhIHdpbGwgcmVjZWl2ZSBhIGRlYXRoIHNlbnRlbmNlPyBJbnRlcnByZXQgeW91ciBmaW5kaW5ncy4gU2hvdWxkIHlvdSByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcywgcHJvdmlkZSBhbiBpbnRlcnZhbCB3aXRoIDk1JSBjb3ZlcmFnZS9jb25maWRlbmNlLgoKSHlwb3RoZXNlcwpIMDogVGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlIGFyZSBpbmRlcGVuZGVudApIQTogdGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlIGFyZSBub3QgaW5kZXBlbmRlbnQKICAKYGBge3J9CnhjaGlzcS50ZXN0KGNvbnZpY3Rpb24sIGNvcnJlY3Q9RkFMU0UpCmBgYApgYGB7cn0KcHJvcC50ZXN0KGMoNDUsIDE0KSwgYygxMzAsIDIzMiksIGFsdGVybmF0aXZlPSJncmVhdGVyIiwgY29ycmVjdD1GQUxTRSkKYGBgCnRocm91Z2ggY2hpc3EgdGVzdCwgd2UgZ2V0IGEgUHZhbHVlIHRoYXQgaXMgdmVyeSBzbWFsbCwgMS42MiBlLTEyLCB3aGljaCBpcyBjb25maW1lZCB0aHJvdWdoIHRoZSBwcm9wIHRlc3Qgd2l0aCBQdmFsdWUgb2YgOC4xNGUtMTM7IHRoZSBjb25maWRlbmNlIGludGVydmFsIGZvdW5kIHRocm91Z2ggdGhlIHByb3AgdGVzdCBnaXZlcyB1cyAwLjIxMjUgLSAxClRoZXNlIHJlc3VsdHMgY29uZmlybSB0aGUgcmVqZWN0aW9uIG9mIHRoZSBoeXBvdGhlc2lzIG51bGw7IHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBhIHJlbGF0aW9uIGJldHdlZW4gdGhlIHJhY2Ugb2YgdGhlIHZpY3RpbSBhbmQgdGhlIHNlbnRlbmNlLiAKCjMuIFJlZmVyIHRvIGEgcXVlc3Rpb24gZnJvbSBBc3NpZ25tZW50IDEsIHdoZXJlIHlvdSB3ZXJlIGFza2VkIHRvIHJlZmVyIHRvIGNlcnRhaW4gdmFyaWFibGVzIG9mIHRoZSBHZW5lcmFsIFNvY2lldHkgU3VydmV5IG9mIDIwMDIuIEZvciB5b3VyIGNvbnZlbmllbmNlLCB0aGUgZGF0YSBmaWxlIGlzIGxpbmtlZCBiZWxvdy4KCmBgYHtyfQpnc3MgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1N0YXRtYW40NC9EYXRhNjAyL21haW4vR1NTMjAwMi5jc3YiKQpoZWFkKGdzcywgMykKYGBgCmBgYHtyfQpnc3MuZGYgPSBnc3NbY29tcGxldGUuY2FzZXMoZ3NzKSxdCmdzcy5kZgpgYGAKCmEuIElzIHRoZXJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gb25l4oCZcyBzdXBwb3J0IGZvciBndW4gbGF3cyAodmFyaWFibGUgbmFtZSBpcyBHdW5MYXcpIGFuZCB0aGVpciBvcGluaW9uIGFib3V0IGN1cnJlbnQgZ292ZXJubWVudCBzcGVuZGluZyBvbiBTY2llbmNlICh2YXJpYWJsZSBuYW1lIGlzIFNwZW5kU2NpKT8gU3RhdGUgdGhlIGFwcHJvcHJpYXRlIHN0YXRpc3RpY2FsIGh5cG90aGVzZXMuCgpgYGB7cn0KdGFibGVHc3MgPSB0YWxseSh+R3VuTGF3ICsgU3BlbmRTY2ksIGRhdGE9Z3NzLmRmKQp0YWJsZUdzcwpgYGAKSHlwb3RoZXNlcwpIMDogR3VuIExhdyBhbmQgU3BlbmRpbmcgb24gU2NpZW5jZSBhcmUgSW5kZXBlbmRlbnQKSEE6IEd1biBMYXcgYW5kIFNwZW5kaW5nIG9uIFNjaWVuY2UgYXJlIG5vdCBpbmRlcGVuZGVudAoKYi4gQ2Fycnkgb3V0IHRoZSBhcHByb3ByaWF0ZSBzdGF0aXN0aWNhbCB0ZXN0LCBwcm92aWRpbmcgYm90aCB0aGUgdGVzdCBzdGF0aXN0aWMgYW5kIHRoZSBQLXZhbHVlLgoKYGBge3J9CnhjaGlzcS50ZXN0KHRhYmxlR3NzLCBzaW11bGF0ZS5wLnZhbHVlPVRSVUUpCmBgYApBY2NvcmRpbmcgdG8gdGhlIGNoaSBzcXVhcmVkIHRlc3Qgd2UgZ2V0IGEgUHZhbHVlIG9mIDAuOTE4IGFuZCBDaGktc3F1YXJlZCBvZiAyLjEwNDgKCmMuIFdoYXQgY2FuIHlvdSBjb25jbHVkZT8gRG8gdGhlc2UgZGF0YSBzdXBwb3J0IHlvdXIgbnVsbCBoeXBvdGhlc2lzIGluIHBhcnQgKGEpPyBTdGF0ZSB5b3VyIGRlY2lzaW9uIGFuZCBjb25jbHVzaW9uLgpBY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMgd2UgZ290LCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsLiBXZSBjYW4gc2F5IHRoYXQgdGhlcmUgaXMgbm8gcmVsYXRpb24gYmV0d2VlbiBHdW4gTGF3IGFuZCBTcGVuZGluZyBvbiBTY2llbmNlLgoKZC4gUmUtdHJhY2UgeW91ciByZXN1bHQsIGluIHRoZSBmb3JtIG9mIGEgYmFyLWdyYXBoLCB0aGF0IHdhcyBwcm92aWRlZCBpbiBBc3NpZ25tZW50IDEsIFF1ZXN0aW9uIDkuIENhbiB5b3UgaW5mZXIgZnJvbSB0aGVzZSBkYXRhIHRoYXQgb25l4oCZcyBsZXZlbCBvZiBFZHVjYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlaXIgUmFjZT8gUHJlc2VudCB5b3VyIGZpbmRpbmdzIGluIHRoZSBmb3JtIG9mIGEgcGFyYWdyYXBoLCBvdXRsaW5pbmcgdGhlIGRlY2lzaW9uIHlvdSBoYXZlIG1hZGUsIHdoeSB5b3UgbWFkZSB0aGUgZGVjaXNpb24geW91IG1hZGUsIGFuZCB0aGUgUAotdmFsdWUuCgpgYGB7cn0KZ2dwbG90KGRhdGE9Z3NzKSArIGdlb21fYmFyKGFlcyh4ID0gRWR1Y2F0aW9uLCBmaWxsID0gUmFjZSksIHBvc2l0aW9uID0gImZpbGwiKQpgYGAKYGBge3J9CmdncGxvdChkYXRhPWdzcykgKyBnZW9tX2JhcihhZXMoeCA9IEVkdWNhdGlvbiwgZmlsbD1SYWNlKSwgcG9zaXRpb24gPSAiZG9kZ2UiLCBuYS5ybT1UUlVFKQpgYGAKYGBge3J9CnRhYmxlR3NzMSA9IHRhbGx5KH5FZHVjYXRpb24gKyBSYWNlLCBkYXRhPWdzcy5kZikKdGFibGVHc3MxCmBgYAoKCkh5cG90aGVzZXM6CkgwOiB0aGUgbGV2ZWwgb2YgZWR1Y2F0aW9uIGFuZCBSYWNlIGFyZSBpbmRlcGVuZGVudApIQTogdGhlIGxldmVsIG9mIGVkdWNhdGlvbiBhbmQgcmFjZSBhcmUgbm90IGluZGVwZW5kZW50CgpgYGB7cn0KeGNoaXNxLnRlc3QodGFibGVHc3MxLCBzaW11bGF0ZS5wLnZhbHVlPVRSVUUpCmBgYApBY2NvcmRpbmcgdG8gdGhlIHJlc3VsdHMsIFB2YWx1ZT0xIHNvIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBoeXBvdGhlc2lzIG51bGwgYW5kIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgbm8gcmVsYXRpb24gYmV0d2VlbiBvbmUncyBsZXZlbCBvZiBlZHVjYXRpb24gYW5kIHJhY2UuIApCeSBqdXN0IGxvb2tpbmcgYXQgdGhlIGdyYXBoLCBvbmUgd291bGQgdGhpbmsgZGlmZmVyZW50bHkgYnV0IHdoZW4gcmVhZGluZyB0aGUgdGFibGUsIHdlIGNhbiBzZWUgdGhhdCBtb3N0IG9mIHRoZSBwZW9wbGUgdGhhdCBwYXJ0aWNpcGF0ZWQgaW4gdGhlIHN1cnZleSBhcmUgd2hpdGU7IHdlIGNvbmNsdWRlIHRoYXQgdGhlIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGlzIGNvcnJlY3QsIGFuZCB0aGVyZSBpcyBubyByZWxhdGlvbiBiZXR3ZWVuIHRoZSBsZXZlbCBvZiBlZHVjYXRpb24gYW5kIHJhY2UuCiAKCjQuIEEgZ3JvdXAgb2YgcGF0aWVudHMgd2l0aCBhIGJpbmdlLWVhdGluZyBkaXNvcmRlciB3ZXJlIHJhbmRvbWx5IGFzc2lnbmVkIHRvIHRha2UgZWl0aGVyIHRoZSBleHBlcmltZW50YWwgZHJ1ZyBmbHV2b3hhbWluZSBvciB0aGUgcGxhY2VibyBpbiBhIG5pbmUtd2Vlay1sb25nLCBkb3VibGUtYmxpbmRlZCBjbGluaWNhbCB0cmlhbC4gQXQgdGhlIGVuZCBvZiB0aGUgdHJpYWwgdGhlIGNvbmRpdGlvbiBvZiBlYWNoIHBhdGllbnQgd2FzIGNsYXNzaWZpZWQgaW50byBvbmUgb2YgZm91ciBjYXRlZ29yaWVzOiBubyByZXNwb25zZSwgbW9kZXJhdGUgcmVzcG9uc2UsIG1hcmtlZCByZXNwb25zZSwgb3IgcmVtaXNzaW9uLiBUaGUgdGFibGUgYmVsb3cgc2hvd3MgYSBjcm9zcy1jbGFzc2lmaWNhdGlvbiwgb3IgY29udGluZ2VuY3kgdGFibGUsIG9mIHRoZXNlIGRhdGEuCgogICAgICAgICAgICAgIE5vIFJlc3BvbnNlICAgICAgICBNb2RlcmF0ZSBSZXNwb25zZSAgICAgICBNYXJrZWQgcmVzcG9uc2UgICAgIFJlbWlzc2lvbiAgICAgCkZsdXZveGFtaW5lICAgICAgIDE1ICAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgIDE1ClBsYWNlYm8gICAgICAgICAgIDIyICAgICAgICAgICAgICAgICAgICA3ICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAgICAgICAgIDExCgpEbyB0aGVzZSBkYXRhIHByb3ZpZGUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IHRoZXJlIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIHR5cGUgb2YgdHJlYXRtZW50IHJlY2VpdmVkIGFuZCBhIHBhdGllbnTigJlzIHJlc3BvbnNlPwoKSHlwb3RoZXNlcwpIMDogVGhlIHBhdGllbnQncyByZXNwb25zZSB0byB0cmVhdG1lbnQgYW5kIHRoZSB1c2Ugb2YgRmx1dm94YW1pbmUgYXJlIGluZGVwZW5kZW50CkhBOiBUaGUgcGF0aWVudCdzIHJlc3BvbnNlIHRvIHRyZWF0bWVudCBhbmQgdGhlIHVzZSBvZiBGbHV2b3hhbWluZSBhcmUgbm90IGluZGVwZW5kZW50CgpgYGB7cn0KYmluZ2VUYWJsZSA9IHJiaW5kKGMoMTUsIDcsIDMsIDE1KSwgYygyMiwgNywgMywgMTEpKQpyb3duYW1lcyhiaW5nZVRhYmxlKSA9IGMoIkZsdXZveGFtaW5lIiwgIlBsYWNlYm8iKQpjb2xuYW1lcyhiaW5nZVRhYmxlKSA9IGMoIk5vIFJlc3BvbnNlIiwgIk1vZGVyYXRlIFJlc3BvbnNlIiwgIk1hcmtlZCBSZXNwb25zZSIsICJSZW1pc3Npb24iKQpiaW5nZVRhYmxlCmBgYApgYGB7cn0KeGNoaXNxLnRlc3QoYmluZ2VUYWJsZSwgc2ltdWxhdGUucC52YWx1ZT1UUlVFKQpgYGAKV2UgZ290IGEgUHZhbHVlIG9mIDAuNjA4MiB3ZSBjb25jbHVkZSBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsIGFuZCB0aGVyZWZvcmUgd2UgY2FuIHNheSB0aGF0IHRoZXJlIGlzIG5vIHJlbGF0aW9uIGJldHdlZW4gdGhlIHRyZWF0bWVudCB3aXRoIEZsdXZveGFtaW5lIGFuZCB0aGUgcmVzcG9uc2Ugb2YgdGhlIHBhdGllbnRzLgoKCgo1LiBBIHN0dWR5IGNvbmR1Y3RlZCBieSBZb3VtYW5zIGFuZCBKZWUyIGxvb2tlZCBhdCBzdHVkZW50cyB3aG8gdG9vayBhIHJlc2VhcmNoIG1ldGhvZHMgY2xhc3MgaW4gcHN5Y2hvbG9neS4gVHdvIGxlY3R1cmUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgY291cnNlIHdlcmUgdGF1Z2h0IGJ5IHRoZSBzYW1lIGluc3RydWN0b3IuIFN0dWRlbnRzIGluIGVhY2ggbGVjdHVyZSBzZWN0aW9uIHdlcmUgcmVxdWlyZWQgdG8gcmVnaXN0ZXIgaW4gb25lIG9mIHR3byBGcmlkYXkgYWZ0ZXJub29uIGRpc2N1c3Npb24gc2VjdGlvbnMsIG9yIGEgdHV0b3JpYWwuIER1cmluZyB0aGUgbmludGggd2VlayBvZiBpbnN0cnVjdGlvbiwgYWxsIHN0dWRlbnRzIHdlcmUgYXNrZWQgdG8gZmlsbCBvdXQgYW4gaW5mb3JtYWwgbWlkc2VtZXN0ZXIgZXZhbHVhdGlvbiBpbiB0aGVpciBGcmlkYXkgYWZ0ZXJub29uIGRpc2N1c3Npb24gc2Vzc2lvbi4KCkluIGhhbGYgb2YgdGhlIEZyaWRheSBhZnRlcm5vb24gZGlzY3Vzc2lvbiBzZWN0aW9ucywgdGhlIGV4cGVyaW1lbnRlciAobm90IHRoZSBwcm9mZXNzb3IvaW5zdHJ1Y3RvciEpIHBhc3NlZCBhcm91bmQgYSBiYWcgY29udGFpbmluZyBzbWFsbCBiYXJzIG9mIGNob2NvbGF0ZSB0aGF0IGhlIHNpbXBseSBoYWQg4oCYbGVmdC1vdmVy4oCZIGFuZCDigJh3YW50ZWQgdG8gZ2V0IHJpZCBvZuKAmSBzbyB0aGF0IHN0dWRlbnRzIHdvdWxkIG5vdCB0aGluayB0aGUgY2hvY29sYXRlIHdhcyBhIGdpZnQgZnJvbSB0aGVpciBwcm9mZXNzb3IvaW5zdHJ1Y3Rvci4gVGhlIGV2YWx1YXRpb24gd2FzIGEgc3VydmV5IHRoYXQgY29udGFpbmVkIG5pbmUgcXVlc3Rpb25zLiBGb3IgZWFjaCBxdWVzdGlvbiB0aGUgc3R1ZGVudCBwcm92aWRlZCBhIHJhdGluZyBmcm9tIDEgKHZlcnkgcG9vcikgdG8gNSAoZXhjZWxsZW50KS4KClF1ZXN0aW9uIDkgcG9zZWQgdGhlIGZvbGxvd2luZzoKICAgICAgYGBDb21wYXJlZCB0byBvdGhlciBpbnN0cnVjdG9ycyB5b3UgaGF2ZSBoYWQgYXQgdGhpcyB1bml2ZXJzaXR5LCB0aGlzIGluc3RydXRvciBpczrigJnigJkgMSAodmVyeSBwb29yKSB0byA1IChleGNlbGxlbnQpCgpDb21wbGltZW50cyB0byB0aGUgYXV0aG9ycywgdGhleSBoYXZlIHByb3ZpZGVkIG1lIHdpdGggdGhlIGRhdGEgaW4gdGhpcyBwYXJ0aWN1bGFyIHN0dWR5LiBJbiB0aGUgZmlsZSB5b3Ugd2lsbCBmaW5kIHRoZSByYXcgZGF0YSBwcm92aWRpbmcgdGhlIHN0dWRlbnQgcmVzcG9uc2VzIGZvciBRdWVzdGlvbiA5IChROSkgYW5kIHRoZSBvdmVyYWxsIGF2ZXJhZ2UgcmVzcG9uc2UgZm9yIFF1ZXN0aW9ucyAxIHRocm91Z2ggOSAoT3ZlcmFsbCkgZm9yIGVhY2ggc3R1ZGVudC4gTm90ZTogVG8gZWFzaWx5IHJlYWQgdGhpcyBpbnRvIHlvdXIgUiBzZXNzaW9uLCBzZWxlY3QgdGhlIOKAnFJhd+KAnSBidXR0b24gcHJpb3IsIHRoZW4gdXNlIHRoZSByZXN1bHRpbmcgVVJMLgoKYGBge3J9ClNzdXJ2ZXkgPSByZWFkLmNzdigiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1N0YXRtYW40NC9EYXRhNjAyL21haW4vY2hvY25vY2hvY3JhdGluZ3MuY3N2IikKaGVhZChTc3VydmV5LCAzKQpgYGAKYS4gUGVydGFpbmluZyB0byBRdWVzdGlvbiA5OiBEbyB0aGVzZSBkYXRhIHN1Z2dlc3QgdGhlcmUgaXMgYSB0cmVhdG1lbnQgZWZmZWN0PyBUZXN0IHRoZSBleGlzdGVuY2Ugb2YgYSB0cmVhdG1lbnQgZWZmZWN0IHVzaW5nIGEgcGVybXV0YXRpb24gdGVzdC4gSWYgYSB0cmVhdG1lbnQgZWZmZWN0IGlzIGRpc2NvdmVyZWQsIGV4cGxhaW4gaXRzIG1lYW5pbmcgaW4gdGhlIGNvbnRleHQgb2YgdGhlc2UgZGF0YS4gQ2Fycnkgb3V0IGEgcGVybXV0YXRpb24gdGVzdCwgdXNpbmcgMTk5OSBpdGVyYXRpb25zLgoKKFlvdSB3aWxsIGhhdmUgdG8gY2FyZWZ1bGx5IGNvbnNpZGVyIOKAnHdoYXQgYSB0cmVhdG1lbnQgZWZmZWN04oCdIGlzIGluIHRoaXMgc2NlbmFyaW8uKQoKVGhlIHRyZWF0bWVudCBoZXJlIGlzIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiBjaG9jb2xhdGUuIEJ5IGxvb2tpbmcgYXQgdGhlIGRhdGEgd2UgY2FuIHNlZSB0aGF0IHRoZXkgYWxsIHdlcmUgb2ZmZXJlZCB0aGUgY2hvY29sYXRlIGJ1dCBzb21lIHRvb2sgaXQgc29tZSBvdGhlcnMgZGlkbid0IHRha2UgdGhlIGNob2NvbGF0ZS4gRGlkIHRoZSBhZG1pbmlzdHJhdGlvbiBvZiBjaG9jb2xhdGUgaW5mbHVlbmNlIHRoZWlyIHN1cnZleSByZXNwb25zZSB0byBROT8KCkh5cG90aGVzZXMKSDA6IFRoZSByZXNwb25zZXMgdG8gUTkgaW4gdGhlIHN1cnZleSBhbmQgdGhlIHRyZWF0bWVudCBhcmUgaW5kZXBlbmRlbnQgIHE5IHRyZWF0bWVudCA9IHE5IG5vIHRyZWF0bWVudApIQTogdGhlIHJlc3BvbnNlcyB0byBROSBpbiB0aGUgc3VydmV5IGFuZCB0aGUgdHJlYXRtZW50IGFyZSBub3QgaW5kZXBlbmRlbnQgICAgICAgcTkgdHJlYXRtZW50ID4gcTkgbm8gdHJlYXRtZW50CgoKRXhwbG9yaW5nIHRoZSBkYXRhCmBgYHtyfQpnZ3Bsb3QoU3N1cnZleSwgYWVzKHggPSBHcm91cE5hbWUsIHkgPSBROSkpICsgZ2VvbV9ib3hwbG90KGNvbD0icmVkIiwgZmlsbD0iYmx1ZSIsIHdpZHRoPTAuNSkgKyBnZ3RpdGxlKCJROSBTdHVkZW50IFN1cnZleTogdHJlYXRtZW50IGVmZmVjdCIpICsgY29vcmRfZmxpcCgpCmBgYApgYGB7cn0KZmF2c3RhdHMoflE5fEdyb3VwTmFtZSwgZGF0YT0gU3N1cnZleSkKYGBgCgpgYGB7cn0Kb2JzZGlmZi50dG10ID0gbWVhbih+UTksIGRhdGEgPSBmaWx0ZXIoU3N1cnZleSwgR3JvdXBOYW1lID09ICJDaG9jb2xhdGUiKSkgLSBtZWFuKH5ROSwgZGF0YSA9IGZpbHRlcihTc3VydmV5LCBHcm91cE5hbWUgPT0gIk5PQ2hvYyIpKQpvYnNkaWZmLnR0bXQKYGBgClBlcmZvcm1pbmcgMTk5OSBwZXJtdXRhdGlvbnMKYGBge3J9Ck4gPSAxOTk5IApwZXJtcyA9IG51bWVyaWMoTikgCmZvcihpIGluIDE6TikKeyBpbmRleCA9IHNhbXBsZSg5OCwgNTAsIHJlcGxhY2U9RkFMU0UpIAogIHBlcm1zW2ldID0gbWVhbihTc3VydmV5JFE5W2luZGV4XSkgLSBtZWFuKFNzdXJ2ZXkkUTlbLWluZGV4XSkgCn0KYGBgCgpgYGB7cn0KcGVybXMuZGYgPSBkYXRhLmZyYW1lKHBlcm1zKQpoZWFkKHBlcm1zLmRmLDQpCmBgYApgYGB7cn0KdGFpbChwZXJtcy5kZiwgMykKYGBgCgpEaXNwbGF5IGEgaGlzdG9ncmFtIHRvIHVuZGVyc3RhbmQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcGVybXV0YXRpb25zCmBgYHtyfQpoaXN0KHBlcm1zLCB4bGFiPSJEaWZmZXJlbmNlIEJldHdlZW4gTWVhbiBhbnN3ZXIgdG8gUTkgKENob2NvbGF0ZSAtIE5vQ2hvY29sYXRlKSIsIHlsYWI9IkZyZXF1ZW5jeSIsIG1haW49Ik91dGNvbWUgb2YgMjAwMCBQZXJtdXRhdGlvbiBUZXN0cyIsIGNvbD0nYmx1ZScpCmFibGluZSh2ID0gb2JzZGlmZi50dG10LCBjb2w9InJlZCIpCmBgYApGaW5kIHRoZSBFbXBpcmljYWwgUHZhbHVlCmBgYHtyfQooc3VtKHBlcm1zID49IG9ic2RpZmYudHRtdCkgKyAxICkvKE4gKyAxKSAgI2NvbXB1dGVzIGVtcGlyaWNhbCBQLXZhbHVlCmBgYApiLiBDb25zaWRlciB0aGUgdmFyaWFibGUgT3ZlcmFsbC4gSXMgdGhlcmUgYSB0cmVhdG1lbnQgZWZmZWN0IHdpdGggcmVzcGVjdCB0byB0aGUgcHJvZmVzc29y4oCZcyBvdmVyYWxsIHJhdGluZyBhcyBhIHRlYWNoZXI/IEFwcGx5IHRoZSB0LXRlc3QgdG8gdGhlc2UgZGF0YS4gSW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIHRoZSBQLXZhbHVlLiAoY2hpdGVzdCBhbmQgeGNoaXRlc3QpCgoKSHlwb3RoZXNlcwpIMDogdGhlIG92ZXJhbGwgc2NvcmUgYW5kIHRoZSB0cmVhdG1lbnQgYXJlIGluZGVwZW5kZW50CkhBOiB0aGUgb3ZlcmFsbCBzY29yZSBhbmQgdGhlIHRyZWF0bWVudCBhcmUgbm90IGluZGVwZW5kZW50CgoKYGBge3J9CnRhYmxlU3N1cnZleSA9IHRhbGx5KH5PdmVyYWxsICsgR3JvdXBOYW1lLCBkYXRhPVNzdXJ2ZXkpCnRhYmxlU3N1cnZleQpgYGAKR3JhcGhpbmcgTm9ybWFsIFByb2JhYmlsaXR5IHBsb3QgZm9yIGJvdGggVHJlYXRtZW50IGFuZCBObyBUcmVhdG1lbnQKCmBgYHtyfQpnZ3Bsb3QoZmlsdGVyKFNzdXJ2ZXksIEdyb3VwTmFtZSA9PSAiQ2hvY29sYXRlIiksIGFlcyhzYW1wbGUgPSBPdmVyYWxsKSkgKyBzdGF0X3FxKGNvbD0iYmx1ZSIpICsgc3RhdF9xcWxpbmUoY29sPSJyZWQiKSArIGdndGl0bGUoIk5vcm1hbCBQcm9iYWJpbGl0eSBQbG90IG9mIFN0dWRlbnQgU3VydmV5OiBUcmVhdG1lbnQiKQpgYGAKYGBge3J9CmdncGxvdChmaWx0ZXIoU3N1cnZleSwgR3JvdXBOYW1lID09ICJOT0Nob2MiKSwgYWVzKHNhbXBsZSA9IE92ZXJhbGwpKSArIHN0YXRfcXEoY29sPSJibHVlIikgKyBzdGF0X3FxbGluZShjb2w9InJlZCIpICsgZ2d0aXRsZSgiTm9ybWFsIFByb2JhYmlsaXR5IFBsb3Qgb2YgU3R1ZGVudCBTdXJ2ZXk6IE5vIFRyZWF0bWVudCIpCmBgYApgYGB7cn0KdC50ZXN0KH5PdmVyYWxsIHwgR3JvdXBOYW1lLCBkYXRhID0gU3N1cnZleSwgYWx0ZXJuYXRpdmU9J2dyZWF0ZXInKQpgYGAKQWNjb3JkaW5nIHRoZSB0aGUgUHZhbHVlIHdlIGdldCBmcm9tIHRoZSB0LnRlc3Qgb2YgMC4wNSwgYW5kIHRoZSBlbXBpcmljYWwgUHZhbHVlIG9mIDAuMTYxLCB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBudWxsIGFuZCBjb25jbHVkZSB0aGF0IHRoZSBwcm9mZXNzb3IncyBvdmVyYWxsIHJhdGluZyBpcyBpbmRlcGVuZGVudCBvZiB0aGUgc3R1ZGVudCdzIHRyZWF0bWVudCB3aXRoIGNob2NvbGF0ZSAKCgpgYGB7cn0KY2hpc3EudGVzdCh0YWJsZVNzdXJ2ZXksIHNpbXVsYXRlLnAudmFsdWU9VFJVRSkKYGBgCmMuIENvbnNpZGVyIHRoZSB0ZXN0IHN1Z2dlc3RlZCBpbiBwYXJ0IChhKS4gV2h5IHdvdWxkIGEgdC10ZXN0IG5vdCBiZSBhIHJlY29tbWVuZGVkIHN0YXRpc3RpY2FsIG1ldGhvZCB0byBjYXJyeSBvdXQgdGhlIHRlc3QgaW4gcGFydCAoYSk/IEV4cGxhaW4geW91ciBhbnN3ZXIgaW4gYSBmZXcgc2VudGVuY2VzLgoKUi4vIFdlIGNhbiBzZWUgaW4gdGhlIGJveHBsb3RzIGhvdyBzaW1pbGFyIHRoZSBzdGF0cyBmb3IgdGhlIDIgZ3JvdXBzIGFyZSwgdGhpcyBpcyBjb25maXJtZWQgYnkgdGhlIGZhdnN0YXRzIHJlc3VsdHMuIHRoZSBwZXJtdXRhdGlvbiB3aWxsIGhlbHAgbWFnbmlmeSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGdyb3VwcyBhbmQgZ2l2ZSBzdGF0aXN0aWNhbCBzaWduaWZpY2FuY2UgdG8gdGhlIGRpZmZlcmVuY2UsIGlmIGFueS4gUGVybXV0YXRpb25zIGFyZSBnb29kIHdoZW4gd2UgZG8gbm90IGtub3cgbXVjaCBhYm91dCB0aGUgcG9wdWxhdGlvbiBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhc3N1bXB0aW9ucy4gCgoKCgo=