I. Data
There are two main data types: qualitative and quantitative. The previous module on Proportion Testing dealt with qualitative data sets. This module will deal with quantitative data.
We have two main tools when working with quantitative data:
- \(t\)-procedures
- ANOVA
The \(t\)-test works well but is limited to single sample tests and situations where the grouping variable has only two levels, like marital status: married vs. not married. If we have a grouping variable like class rank in college which has four levels, we need to use ANOVA (Analysis of Variance).
Initializing RStudio
The data set we will use primarily is Data3350 which was produced in 2015 during an undergraduate research project about personality and humor. The VarsData3350 PDF file has descriptions of each variable in the Data3350 file. Both are available for download in D2L. Be sure to put the Data3350 in your R folder in Documents, and make sure your working directory is set the same way (Session menu). The code block below uses the library function to ensure that the Mosaic package is loaded and will import the data frame used in this module: Data3350.
library(mosaic)
library(readxl)
Data3350 = read_excel("Data3350.xlsx")
II. Assumptions for \(t\)-tests and ANOVA
The \(t\)-tests and ANAOVA are built on three main assumptions about the structure of the data:
- Normality: The data points were drawn at random from a normal distribution.
- Independence: The scores of each data point were independent of all the other observations.
- Homogeneity of Variances: Standard deviations of all populations and sub-populations are equal.
To check the normality assumption, we can inspect a histogram (shape) and box plot (check for outliers). Independence cannot be verified by statistical analysis – the researcher who collects the data must do the job properly. We can check homogeneity with statistical procedures. Yet, in many cases, the procedures we use to verify homogeneity are less accurate than the \(t\)-tests and ANOVA’s themselves. We try to ensure issues with homogeneity will not cause problems by avoiding sharply unequal group sizes.
1. Checking Normality
The \(t\)-statistic is robust which means that minor violations of its assumptions don’t cause inaccuracies in the resulting \(p\)-values. The \(F\)-statistic (for ANOVA) is even more robust than \(t\). The bottom line: for moderate sample sizes, no data checks are needed. The \(t\)- and \(F\)-statistics hold up well under stress. Only for small sample sizes are data checks needed.
Verifying Normality Assumption: \(t\)-Procedures
\[\begin{array}{ccl} \textbf{Sample Size} && \textbf{Data Check}\\ \hline
n \geq 40 && \text{No data checks needed due to robustness of }t\\
15 \leq n < 40 && \text{Check box plot, verify no outliers}\\
n < 15 && \text{Also check histogram (need approximate normality)}
\end{array}\]
For independent samples \(t\)-tests, we use the overall sample size. If \(n_1\) and \(n_2\) are the sample size of groups 1 and 2 respectively, then for the purposes of the chart above \[n=n_1+n_2\]
Verifying Normality Assumption: ANOVA
\[\begin{array}{ccl} \textbf{Sample Size} && \textbf{Data Check}\\ \hline
n \geq 20 && \text{No data checks needed due to robustness of }F\\
n < 20 && \text{Do not run an ANOVA}
\end{array}\]
As with the \(t\)-test, the \(n\) in the chart for ANOVA refers to overall sample size: the total number of observations including all samples. In either case, if the data checks fail, the data are not appropriate for these procedures, and the researcher stop immediately. Statistical apps will produce \(p\)-values with garbage data just as easily as with good data. The researcher conducting the quantitative analysis is responsible for checking the data for appropriateness.
2. Checking Homogeneity
The robustness of \(t\) and \(F\) will ensure reasonable accuracy of the resulting \(p\)-values even when the standard deviations are different so long as the group sizes are not sharply unequal. What is sharply unequal? We would not wish to see the following data set for a \(t\)-test.
Hypothesis Testing Steps
- Identify correct procedure
- Setup null \((H_0)\) and alternate \((H_a)\) hypotheses
- Verification: are data appropriate for procedure?
- Set \(\alpha\) (\(\alpha = .05\) is default value)
- Run Stats App to determine \(p\)-value
- Statistical Conclusion: “Reject \(H_0\)” or“Fail to reject \(H_0\)”
- Research conclusion
\[\begin{array}{ccccc} &&&\textbf{Polar Bears} && \textbf{Grizzly Bears}\\ \hline
\overline{x} &&& 800 && 900\\
s &&& 125 && 275\\
n &&& 8 && 28
\end{array}\]
We require the ratio of largest-to-smallest group size to be no more than \(2:1\). In the above example, the standard deviations are clearly not equal, and the group size ratio is \(3.5:1\), a classic example of sharply unequal groups.
The same recommendation holds true for ANOVA’s where we require that the largest group have no more than twice as many observations as the smallest group. With even slight differences in standard deviations and sharply unequal group sizes, the data are not appropriate for either \(t\)-procedures or ANOVA. In a more advanced statistics class, we have options for investigation. At this level, however, just don’t run the ANOVA or \(t\)-test under suspicious circumstances.
IV. Matched Pairs \(t\)-test
The most useful application of the one sample \(t\)-test is the matched pairs design. The matched pairs \(t\)-test (sometimes called a dependent samples \(t\)-test) is most often used to analyze data from a pretest - posttest research design. The matched pairs \(t\)-test reduces the variance between subjects by creating a Gain score that ignores the starting and ending points for each subject and focuses only on the difference between pretest and posttest scores.
Does Stress Increase During Midterms?
The variables Stress1 and Stress2 in Data3350 were identical measures of stress, with Stress1 administered in the second week of the semester, and Stress2 administered during midterms when most students had several tests, projects or papers due. Test for an increase in Stress during midterms at \(0.01\) level of significance.
Hypothesis Test
We will use a matched pairs \(t\)-test which is a one sample \(t\)-test applied the Gain scores. Even though we start with two samples, Pre and Post, we are using a one sample test. The hypothesis is that the average Stress score will be higher during midterms and, specifically, that the average Gain score (\(\mu_g\)) will be greater than zero.
\[\begin{align*}H_0 : \mu_g = 0\\ H_a : \mu_g > 0\end{align*}\] We will run a quick data analysis, but the sample size is adequate that the robustness of \(t\) will ensure accurate \(p\)-values.
favstats(Gain)
On average, students experienced about three-quarters of a point higher Stress during midterms. With \(n = 164\), no further data checks are needed. These data are appropriate for \(t\) procedures. Even though it is not required for verification, most good researchers inspect the histogram and box plot anyway.
histogram(Gain, width = 2)

boxplot(Gain, horizontal = TRUE)

In a large data set like this one, outliers will not decrease the accuracy of the \(t\)-test \(p\)-values. Still, note that there is one outlier to each side balancing each other. The histogram provides quite convincing evidence the data were drawn from a bell-shaped population.
Two Ways to Conduct Matched Pairs using RStudio
We can produce a one sample \(t\)-test on the Gain scores using the following code. The option \(\fbox{alternative = greater}\) specifies the one-tailed test where we expect positive gains.
t.test(Gain, alternative = "greater")
One Sample t-test
data: Gain
t = 3.0839, df = 163, p-value = 0.0012
alternative hypothesis: true mean is greater than 0
95 percent confidence interval:
0.3561614 Inf
sample estimates:
mean of x
0.7682927
We can also use the two sample \(t\)-test format, but include the option \(\fbox{paired = TRUE}\) to let RStudio know to use the matched pairs settings, not the independent samples settings. Here, we enter the variables Pre and Post, but the t.test function will create gain scores before running the test.
t.test(Post , Pre, data = Data3350,
paired = TRUE,
alternative = "greater")
Paired t-test
data: Post and Pre
t = 3.0839, df = 163, p-value = 0.0012
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.3561614 Inf
sample estimates:
mean of the differences
0.7682927
Results
Either way, we find that \(p=0.0012 < 0.01 =\alpha\), and we reject the null. With the \(p\)-value so close to zero, we have met a more stringent level of proof that the null is likely false. That means we can strengthen our research conclusion accordingly. Evidence strongly suggests that Stress increases during midterms.
Level of Significance
Why did we not use the default \(\alpha = 0.05\)? The matched pairs research design has the advantage of being very sensitive to changes in Gain scores. We only measure the differences between the starting points and ending points. A participant who has Pre = 12 and Post = 18 and one who has Pre = 18 and Post = 24 both have Gain scores of 6. Since the variation among individuals is erased when we calculate the Gains, the test becomes much more sensitive.
What if we just ran the comparison like an independent samples (two sample) \(t\)-test? How much difference would it make?
t.test(Post, Pre,
paired = FALSE,
alternative = "greater")
Welch Two Sample t-test
data: Post and Pre
t = 2.1058, df = 324.33, p-value = 0.018
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.1664461 Inf
sample estimates:
mean of x mean of y
13.78659 13.01829
Notice that the \(p\)-value is more than one order of magnitude larger than with the paired approach. We would still reject the null at the \(0.05\) level of significance, but not at the \(0.01\) level. The reason we used a smaller \(\alpha\) was due to this feature of the matched pairs design. Because the matched pairs design ignore the significant human variation at the start, we can reduce \(\alpha\) to create a more sensitive statistical test while retaining adequate power, a concept we will discuss later in the course.
V. Independent Samples \(t\)-Test
The independent samples \(t\)-test compares samples drawn from two different sub-populations directly to each other. For this investigation, let’s consider the differences in the sleep patterns and caffeine consumption between those who are 21 years old or older compared to those who are twenty and younger. We’ll run two hypothesis tests at once.
Do Older College Consume More Caffeine and Get Less Sleep?
The grouping variable G21 has two levels, Y for those answering yes to whether their current age was 21 years old or older, and N for those answering no. We will perform 1-tailed \(t\)-tests on two variables: Sleep, the number of hours of sleep in last 48 including naps (divided by 2, to give an average per night), and Caff, the number of 12 ounce servings of caffeine in last 24 hours. Our hypotheses are that older students will get less sleep and consume more caffeine. Test at the default \(\alpha = 0.05\) level of significance.
Using a grouping variable G21 with two levels, we need the independent samples \(t\)-test. To clarify our hypothesis setup, let “Y” indicate students who are not yet 21 (Younger), and “D” indicate students who are 21 or olDer.
\[\begin{array}{ccccc} \textbf{Caffeine} &&&\textbf{Sleep}\\ H_0 : \mu_Y = \mu_D &&& H_0 : \mu_Y = \mu_D\\ H_0 : \mu_Y < \mu_D &&& H_0 : \mu_Y > \mu_D\end{array}\]
Both null hypotheses are that the samples were drawn from identical distributions. The \(\fbox{tally}\) function works well to show the frequency table comparisons. The tallies for the Caff data:
tally(Caff ~ G21, data = Data3350)
G21
Caff N Y
0 39 11
1 14 12
2 21 13
3 13 7
4 8 6
5 5 2
6 3 3
7 1 0
8 1 3
10 1 2
and the summary statistics. Notice that using a statistical model as the object for the favstats function creates a stats summary for both females and males.
favstats(Caff ~ G21, data = Data3350)
The summary statistics for Sleep:
favstats(Sleep ~ G21, data = Data3350)
Let’s take a quick glance at the histograms and box plots for the two variables.
Graphical Comparison of Caffeine: Younger vs. Older Students
histogram (~ Caff | G21 , data = Data3350, layout = c(1,2))

boxplot( Caff ~ G21 , data = Data3350, horizontal = TRUE, layout = c(1,2))

Graphical Comparison of Sleep: Younger vs. Older Students
histogram (~ Sleep | G21 , data = Data3350, layout = c(1,2))

boxplot( Sleep ~ G21 , data = Data3350, horizontal = TRUE, layout = c(1,2))

Note that none of the graphical analysis or tallying was required for verification. Still, the visualizations show exactly what we would expect: approximately bell-shaped distributions in all subgroups with medians slightly higher for Caff and slightly lower for Sleep in the group who are 21 years old or older.
Due to the robustness of \(t\) and combined sample sizes of far more than 40, no data checks are necessary for the normality assumption. The ratio of the larger group size to smaller is \(106:59\) or \(1.77 : 1\). Since the ratio is less than \(2:1\), we do not have sharply unequal group sizes and, hence, we have no issues with the homogeneity assumption. (A quick scan of the summary statistics suggest the standard deviations are not very different.) These data are very much appropriate for \(t\)-procedures.
Results: Caff Comparison
t.test(Caff ~ G21, data = Data3350,
alternative = "less")
Welch Two Sample t-test
data: Caff by G21
t = -2.0641, df = 100.29, p-value = 0.02079
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf -0.1541073
sample estimates:
mean in group N mean in group Y
1.839623 2.627119
Because \(p = 0.02079 < 0.05 = \alpha\), we reject the null. Evidence suggests that older student consume more caffeine than younger students do \((p=0.02)\).
Results: Sleep Comparison
t.test(Sleep ~ G21, data = Data3350,
alternative = "greater")
Welch Two Sample t-test
data: Sleep by G21
t = 2.1533, df = 126.96, p-value = 0.01659
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
0.1626102 Inf
sample estimates:
mean in group N mean in group Y
6.603774 5.898305
Because \(p = 0.01659 < 0.05 = \alpha\), we reject the null. Evidence suggests that older student get fewer hours of sleep on average per night than younger students do \((p=0.02)\).
VI. Randomization Techniques for Independent Samples \(t\)-tests
How can we empirically test that the means are significantly different using machine-based randomization? Why not shuffle all the Sleep observations? That way, each person will be paired with a randomly permuted observation from the sample, regardless of whether they are younger than 21 (“N” for G21 variable) or 21 or older (“Y” for G21 variable). With randomly permuted observations, the difference between the group means should be approximately equal.
1. Difference in Group Means
mean(Sleep ~ G21, data = Data3350 )
N Y
6.603774 5.898305
We can have RStudio calculate the difference. The brackets reference the specific items from the output. (Don’t worry about learning how to do this - you can just subtract the two values in R or with a calculator.)
mean(Sleep ~ G21, data = Data3350 )[[1]][1]-mean(Sleep ~ G21, data = Data3350 )[[2]][1]
[1] 0.7054685
2. Shuffle Observations of Dependent Variable
We’re using a permutation test on the difference in means by shuffling the observations of Sleep, randomly reassigning them to the younger group or older. Let’s use tally to create a frequency table for one possible permutation. As always, re-execute the code block several times to see what’s going on.
tally(shuffle(Sleep) ~ G21 , data = Data3350)
G21
shuffle(Sleep) N Y
0.5 1 0
1 1 0
2.5 1 3
3 8 4
3.5 3 5
4 4 2
4.5 2 0
5 9 3
5.5 4 5
6 14 5
6.5 9 4
7 13 5
7.5 9 9
8 11 2
8.5 6 6
9 2 2
9.5 4 2
10 3 2
10.5 1 0
11 1 0
The first line creates a data frame with the means from the shuffled data for both the “N” column and the “Y” column (“younger than 21” and “21 or older” groups respectively). The second line adds a third column to the shuf data frame called “diff” to indicate “difference in means.”
shuf = do(1000) * mean(shuffle(Sleep) ~ G21 , data = Data3350)
shuf$diff = shuf$N - shuf$Y
shuf
3. Estimate \(p\)-value
We need to count the number of shuffled mean differences that were greater than .705, because we are testing the hypothesis \[H_0 : \mu_Y = \mu_D\] \[H_a : \mu_Y > \mu_D\]
We can use the sum function to perform counts by sending it a logical expression.
sum(shuf$diff > .705)
[1] 13
Since we had 1,000 shuffled mean differences, and 25 of them were greater than the observed mean difference, we estimate that the \(p\)-value is \[p=\frac{25}{1000}=0.025\]
VII. Quick Hits: Independent Samples \(t\)-tests
There are dozens of possibilities within the Data3350 to run independent samples \(t\)-tests using 2-level grouping variables such as biological sex or the G21 variable. Not all hypothesis tests find a difference between the variables. The data set is large enough that the verifications will all work out. You should try several. I have included a few different examples below.
Do females or males experience different levels of OCD?
t.test(OCD ~ Sex, data = Data3350)
Welch Two Sample t-test
data: OCD by Sex
t = 0.74989, df = 125.11, p-value = 0.4547
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-0.9136994 2.0285250
sample estimates:
mean in group F mean in group M
9.651163 9.093750
We use a two-tailed test here because there is no reason to believe either females might have higher levels, nor would males. A two-tailed test is less sensitive, but has the added flexibility of finding significant differences in more exploratory situations. We fail to reject the null because \(p=.22\), a value far too large to suggest the null is incorrect. There is no evidence to suggest a difference in OCD indicators based upon biological sex.
Are younger students more playful?
t.test(Play ~ G21, data = Data3350,
alternative = "greater")
Welch Two Sample t-test
data: Play by G21
t = 0.55889, df = 116.77, p-value = 0.2887
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
-3.343707 Inf
sample estimates:
mean in group N mean in group Y
136.9681 135.2679
Even using the more sensitive one-tailed hypothesis, we find no evidence that younger students are more playful \((p=0.29)\).
Do males at North Georgia use more coping humor than females?
t.test(CHS ~ Sex, data = Data3350,
alternative = "less")
Welch Two Sample t-test
data: CHS by Sex
t = -3.534, df = 160.6, p-value = 0.0002674
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
-Inf -1.31639
sample estimates:
mean in group F mean in group M
23.86316 26.33824
We find a stark difference in the use of Coping Humor at North Georgia based upon biological sex \((p = 0.0003)\).
VIII. ANOVA
For any grouping variables with three or more levels, we must use ANOVA. The \(t\)-test comparisons, while robust and useful, can only be used for the one-sample and two-sample cases. Ronald Fischer, along with pioneering the use of the null hypothesis, also developed ANOVA which describes a group of methods, not a single test.
ANOVA is our first two-step procedure. If we reject the null in an ANOVA, we must follow it up with a post hoc test to ferrett out the differences between the groups.
Do Levels of Neuroticism Depend upon Primary Humor Style?
Primary Humor Styles are defined based upon results from the Humor Style Questionnaire. The four primary humor styles in our data frame Data 3350 are Affiliative (HSAF), Aggressive (HSAG), Self-Enhancing (HSSE) and Self-Defeating (HSSD). The variable Neuro measures the intensity of neurotic personalities. Test whether the variable Neuro differs based upon Primary Humor Style.
For ANOVA the null hypothesis is that all four samples were drawn from identical distributions, so the group means would be equal. \[\begin{align*}H_0 &: \mu_AF=\mu_AG=\mu_SE=\mu_SD\\ H_a &: \text{At least one is different.}\end{align*}\] The alternative hypothesis is not that all the group means are unequal. The logical opposite of all group means being equal is that at least one is different than the rest. Saying this alternative in words is fine, though some do prefer to use symbols: \[H_a : \mu_i \neq \mu_j \hspace{2mm}\text{for some }1 \leq i,j \leq 4\]
We will create a linear model using the function lm. ANOVA allows the standard statistical modeling notation we have been using: \[\text{Neuro} \sim \text{PHS}\] which indicates that Neuro is the dependent variable we are analyzing using PHS as the grouping variable (read “Neuro by PHS”). We will save the model as mod (short for model) so we can reuse the model output for ANOVA and any post hoc testing needed.
Let’s scan the summary statistics for the groups as we consider verification.
favstats(Neuro ~ PHS, data = Data3350)
The data are appropriate for ANOVA procedures because there are certainly far more than 20 total observations, and the largest to smallest group size ratio is \(43 : 31\) which reduces to \(1.39 : 1\). The standard deviations do appear to pair up into two different ranges, but since we do not have sharply unequal group sizes, we should have no problem with lack of homogeneity of the variances.
Using an \(\alpha = 0.05\) level of significance, we run the ANOVA app.
mod = lm(Neuro ~ PHS , data = Data3350)
anova(mod)
Analysis of Variance Table
Response: Neuro
Df Sum Sq Mean Sq F value Pr(>F)
PHS 3 5145.1 1715.03 10.73 2.158e-06 ***
Residuals 140 22375.9 159.83
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Since \(p = 0.000002158\), we reject the null. We have strong very strong evidence for a difference is in at least some of the group means, but we don’t know for sure where those differences lie.
Tukey Post Hoc Testing
Since we have rejected the null, we need to run a post hoc test. In this class, we will use the most common of several post hoc options, Tukey’s HSD. HSD stands for “honestly significant difference.”
TukeyHSD(mod, conf.level = 0.95)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x)
$PHS
diff lwr upr p adj
AG-AF 4.978245 -2.7668457 12.723335 0.3427512
SD-AF 12.000872 3.9970309 20.004713 0.0008530
SE-AF -4.282502 -12.5045100 3.939505 0.5301145
SD-AG 7.022627 -0.3485287 14.393783 0.0679484
SE-AG -9.260747 -16.8682354 -1.653259 0.0101553
SE-SD -16.283374 -24.1541382 -8.412610 0.0000018
The Tukey post hoc test does all pairwise comparisons of group means and determines which pairs are significantly different. Here we have four choose two comparisons to make: \(\binom{4}{2}=6\).
There are two different ways to tell if the group means differ significantly. We can check the final column and look for \(p\)-values that are less than \(\alpha\). Or we can inspect the confidence intervals which are estimating the difference between group means. If the groups are significantly different, then the confidence interval will not include zero. While we can inspect the Tukey HSD table for confidence intervals whose “lwr” and “upr” endpoints are both the same sign, but an mplot of the TukeyHSD output will produce a graph that shows everything quite clearly.
mplot(TukeyHSD(mod, conf.level = 0.95))

Either way we find the following three significant differences:
\[\begin{array}{ccclcc}
\textbf{Comparison} && \textbf{Significance} && \textbf{Pattern}\\ \hline
\text{HSSD vs. HSAF} && p = 0.0008530 && \text{SD} > \text{AF}\\
\text{HSSE vs. HSAG} && p = 0.0101553 && \text{SE} < \text{AG}\\
\text{HSSE vs. HSSD} && p = 0.0000018 && \text{SE} < \text{SD}
\end{array}\]
Evidence from the confidence intervals suggests that subjects with self-defeating primary humor styles scored significantly higher on the neuroticism measure than those with affiliative. Subjects with self-enhancing primary humor styles scored significantly lower on neuroticism than those with aggressive or self-defeating primary humor styles.
IX. ANOVA Quick Hits
This module describes methods that are at the heart of quantitative inquiry. As with the \(t\)-tests, a group of examples with minimal details are included to provide more breadth of experience with these powerful and important analytic tools.
Does GPA affect Seating Preference in Class?
The null hypothesis is that the average GPA is identical in all three seating preference groups: Front, Middle and Back. The pattern of means seen in the summary stats shows a slightly higher GPA for students preferring Front (3.33) compared to Back (3.25) and Middle (3.20). Yet, the differences are not significantly different at the default \(\alpha = 0.05\) level. The data are appropriate for ANOVA methods, and the sample size and statistical design are sufficiently sensitive. We thus find no evidence seating preference is affected by GPA. Since we fail to reject the null, no post hoc Tukey is needed.
mod2 = lm(GPA ~ SitClass, data = Data3350)
favstats(GPA ~ SitClass, data = Data3350)
anova(mod2)
Analysis of Variance Table
Response: GPA
Df Sum Sq Mean Sq F value Pr(>F)
SitClass 2 1.228 0.61405 2.4348 0.09081 .
Residuals 162 40.856 0.25220
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Do Levels of Optimism Differ Based on Primary Humor Style
Because Self-Enhancing humor, one of the four humor styles, is related to coping humor, we have reason to believe a connection might exist. The data are appropriate for ANOVA, and we reject the null \((p=0.00185)\) indicating a post hoc Tukey HSD procedure is needed.
mod3 = lm(Opt ~ PHS, data = Data3350)
favstats(Opt ~ PHS, data = Data3350)
anova(mod3)
Analysis of Variance Table
Response: Opt
Df Sum Sq Mean Sq F value Pr(>F)
PHS 3 281.37 93.790 5.2439 0.00185 **
Residuals 140 2503.96 17.885
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
TukeyHSD(mod3)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x)
$PHS
diff lwr upr p adj
AG-AF -1.8349587 -4.4258527 0.7559352 0.2584250
SD-AF -2.6608544 -5.3383058 0.0165970 0.0520958
SE-AF 0.8944282 -1.8560045 3.6448608 0.8325577
SD-AG -0.8258957 -3.2917008 1.6399095 0.8198789
SE-AG 2.7293869 0.1845237 5.2742501 0.0303588
SE-SD 3.5552826 0.9223482 6.1882169 0.0033328
mplot(TukeyHSD(mod3))

We find two of the pairwise differences significant: that those with self-enhancing primary humor styles score higher for optimism compared to the those with aggressive or self-defeating primary humor styles.
No Clue what this Means
While the \(p\)-value is just slightly larger than the default \(\alpha\), the near-relationship between these variables is odd. Is there a pattern lurking here? I don’t know, but it would be interesting to see a follow-on study to see if a pattern emerges.
mod4 = lm(TxRel ~ Friends, data = Data3350)
favstats(TxRel ~ Friends, data = Data3350)
anova(mod4)
Analysis of Variance Table
Response: TxRel
Df Sum Sq Mean Sq F value Pr(>F)
Friends 2 135.6 67.788 3.0059 0.05228 .
Residuals 161 3630.8 22.551
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
mplot(TukeyHSD(mod4, conf.level = .9))

Using a very liberal \(\alpha =0.1\), we find that participants that said they made friends most easily with either sex (no difference) scored higher the Toxic Relationship Beliefs scale than did those who said they made friends most easily with those of who were of the same biological sex.
To repeat, there is no reason to use such a high value for the level of significance, so there is no significant pattern in this data, only a vague hint of a pattern that may possibly exist. This is how science works. Could an exploratory study be created to explore the connections between how we make friends and our relationship beliefs? Yes, most certainly. Would it yield results? Yes, because even if we do the study and fail to find any significant connections (fail to reject the null), we then have some confirmation that, perhaps, no connections between these variables are actually there.
Pondering a scientific approach to exploring this question is a perfect mental exercise to explore what it means to do statistics-based inquiry. As Fischer pointed out, we can never prove the null hypothesis, only falsify it. Thus, even two or three validation studies where we failed to reject the null may not provide enough evidence that no relationship exists.
Do Narcissism Levels Vary Based upon Primary Humor Style?
The short answer is “Yes, they do,” \((p=0.008735)\).
mod5 = lm(Narc ~ PHS, data = Data3350)
favstats(Narc ~ PHS, data = Data3350)
anova(mod5)
Analysis of Variance Table
Response: Narc
Df Sum Sq Mean Sq F value Pr(>F)
PHS 3 85.83 28.6109 4.0432 0.008735 **
Residuals 129 912.84 7.0763
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
To find the pairwise differences, a TukeyHSD is required.
TukeyHSD(mod5)
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = x)
$PHS
diff lwr upr p adj
AG-AF 1.7286751 0.02142619 3.4359241 0.0459844
SD-AF -0.2630542 -2.00168438 1.4755760 0.9792027
SE-AF 0.7719689 -1.01676625 2.5607040 0.6758555
SD-AG -1.9917293 -3.61386008 -0.3695986 0.0093827
SE-AG -0.9567063 -2.63242897 0.7190164 0.4488839
SE-SD 1.0350230 -0.67266033 2.7427064 0.3950070
mplot(TukeyHSD(mod5))

The most striking difference is that those with aggressive primary humor styles have significantly higher levels of narcissism than those with self-defeating primary humor styles \((p = 0.009)\) and those with self-defeating primary humor styles \((p=0.046)\)
LS0tDQp0aXRsZTogIkh5cG90aGVzaXMgVGVzdGluZzogTWVhbnMiDQpzdWJ0aXRsZTogVU5HIE1BVEggMzM1MCAob25saW5lKQ0KYXV0aG9yOiBSb2JiIFNpbm4NCmRhdGU6IEp1bHkgMjAyMA0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JLiBEYXRhPC9zcGFuPg0KDQpUaGVyZSBhcmUgdHdvIG1haW4gZGF0YSB0eXBlczogcXVhbGl0YXRpdmUgYW5kIHF1YW50aXRhdGl2ZS4gVGhlIHByZXZpb3VzIG1vZHVsZSBvbiBQcm9wb3J0aW9uIFRlc3RpbmcgZGVhbHQgd2l0aCAqKnF1YWxpdGF0aXZlKiogZGF0YSBzZXRzLiBUaGlzIG1vZHVsZSB3aWxsIGRlYWwgd2l0aCAqKnF1YW50aXRhdGl2ZSBkYXRhKiouDQoNCldlIGhhdmUgdHdvIG1haW4gdG9vbHMgd2hlbiB3b3JraW5nIHdpdGggcXVhbnRpdGF0aXZlIGRhdGE6DQoNCjEuICR0JC1wcm9jZWR1cmVzDQoyLiBBTk9WQQ0KDQpUaGUgJHQkLXRlc3Qgd29ya3Mgd2VsbCBidXQgaXMgbGltaXRlZCB0byBzaW5nbGUgc2FtcGxlIHRlc3RzIGFuZCBzaXR1YXRpb25zIHdoZXJlIHRoZSBncm91cGluZyB2YXJpYWJsZSBoYXMgb25seSB0d28gbGV2ZWxzLCBsaWtlIG1hcml0YWwgc3RhdHVzOiBtYXJyaWVkIHZzLiBub3QgbWFycmllZC4gSWYgd2UgaGF2ZSBhIGdyb3VwaW5nIHZhcmlhYmxlIGxpa2UgY2xhc3MgcmFuayBpbiBjb2xsZWdlIHdoaWNoIGhhcyBmb3VyIGxldmVscywgd2UgbmVlZCB0byB1c2UgQU5PVkEgKEFuYWx5c2lzIG9mIFZhcmlhbmNlKS4NCg0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW5pdGlhbGl6aW5nIFJTdHVkaW88L3NwYW4+DQpUaGUgZGF0YSBzZXQgd2Ugd2lsbCB1c2UgcHJpbWFyaWx5IGlzICoqRGF0YTMzNTAqKiB3aGljaCB3YXMgcHJvZHVjZWQgaW4gMjAxNSBkdXJpbmcgYW4gdW5kZXJncmFkdWF0ZSByZXNlYXJjaCBwcm9qZWN0IGFib3V0IHBlcnNvbmFsaXR5IGFuZCBodW1vci4gVGhlICoqVmFyc0RhdGEzMzUwKiogUERGIGZpbGUgaGFzIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHZhcmlhYmxlIGluIHRoZSBEYXRhMzM1MCBmaWxlLiBCb3RoIGFyZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGluIEQyTC4gQmUgc3VyZSB0byBwdXQgdGhlIERhdGEzMzUwIGluIHlvdXIgUiBmb2xkZXIgaW4gRG9jdW1lbnRzLCBhbmQgbWFrZSBzdXJlIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgaXMgc2V0IHRoZSBzYW1lIHdheSAoU2Vzc2lvbiBtZW51KS4gVGhlIGNvZGUgYmxvY2sgYmVsb3cgdXNlcyB0aGUgKipsaWJyYXJ5KiogZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlICoqTW9zYWljKiogcGFja2FnZSBpcyBsb2FkZWQgYW5kIHdpbGwgaW1wb3J0IHRoZSBkYXRhIGZyYW1lIHVzZWQgaW4gdGhpcyBtb2R1bGU6ICoqRGF0YTMzNTAqKi4NCmBgYHtyfQ0KbGlicmFyeShtb3NhaWMpDQpsaWJyYXJ5KHJlYWR4bCkNCkRhdGEzMzUwID0gcmVhZF9leGNlbCgiRGF0YTMzNTAueGxzeCIpDQpgYGANCjwvZGl2Pg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPklJLiBBc3N1bXB0aW9ucyBmb3IgJHQkLXRlc3RzIGFuZCBBTk9WQTwvc3Bhbj4NCg0KVGhlICR0JC10ZXN0cyBhbmQgQU5BT1ZBIGFyZSBidWlsdCBvbiB0aHJlZSBtYWluIGFzc3VtcHRpb25zIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRhdGE6DQoNCjEuICoqTm9ybWFsaXR5OioqIFRoZSBkYXRhIHBvaW50cyB3ZXJlIGRyYXduIGF0IHJhbmRvbSBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4NCjIuICoqSW5kZXBlbmRlbmNlOioqIFRoZSBzY29yZXMgb2YgZWFjaCBkYXRhIHBvaW50IHdlcmUgaW5kZXBlbmRlbnQgb2YgYWxsIHRoZSBvdGhlciBvYnNlcnZhdGlvbnMuDQozLiAqKkhvbW9nZW5laXR5IG9mIFZhcmlhbmNlczoqKiBTdGFuZGFyZCBkZXZpYXRpb25zIG9mIGFsbCBwb3B1bGF0aW9ucyBhbmQgc3ViLXBvcHVsYXRpb25zIGFyZSBlcXVhbC4NCg0KVG8gY2hlY2sgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uLCB3ZSBjYW4gaW5zcGVjdCBhIGhpc3RvZ3JhbSAoc2hhcGUpIGFuZCBib3ggcGxvdCAoY2hlY2sgZm9yIG91dGxpZXJzKS4gSW5kZXBlbmRlbmNlIGNhbm5vdCBiZSB2ZXJpZmllZCBieSBzdGF0aXN0aWNhbCBhbmFseXNpcyAtLSB0aGUgcmVzZWFyY2hlciB3aG8gY29sbGVjdHMgdGhlIGRhdGEgbXVzdCBkbyB0aGUgam9iIHByb3Blcmx5LiBXZSBjYW4gY2hlY2sgaG9tb2dlbmVpdHkgd2l0aCBzdGF0aXN0aWNhbCBwcm9jZWR1cmVzLiBZZXQsIGluIG1hbnkgY2FzZXMsIHRoZSBwcm9jZWR1cmVzIHdlIHVzZSB0byB2ZXJpZnkgaG9tb2dlbmVpdHkgYXJlIGxlc3MgYWNjdXJhdGUgdGhhbiB0aGUgJHQkLXRlc3RzIGFuZCBBTk9WQSdzIHRoZW1zZWx2ZXMuIFdlIHRyeSB0byBlbnN1cmUgaXNzdWVzIHdpdGggaG9tb2dlbmVpdHkgd2lsbCBub3QgY2F1c2UgcHJvYmxlbXMgYnkgYXZvaWRpbmcgc2hhcnBseSB1bmVxdWFsIGdyb3VwIHNpemVzLg0KDQojIyAxLiBDaGVja2luZyBOb3JtYWxpdHkNCg0KVGhlICR0JC1zdGF0aXN0aWMgaXMgcm9idXN0IHdoaWNoIG1lYW5zIHRoYXQgbWlub3IgdmlvbGF0aW9ucyBvZiBpdHMgYXNzdW1wdGlvbnMgZG9uJ3QgY2F1c2UgaW5hY2N1cmFjaWVzIGluIHRoZSByZXN1bHRpbmcgJHAkLXZhbHVlcy4gVGhlICRGJC1zdGF0aXN0aWMgKGZvciBBTk9WQSkgaXMgZXZlbiBtb3JlIHJvYnVzdCB0aGFuICR0JC4gVGhlIGJvdHRvbSBsaW5lOiBmb3IgbW9kZXJhdGUgc2FtcGxlIHNpemVzLCBubyBkYXRhIGNoZWNrcyBhcmUgbmVlZGVkLiBUaGUgJHQkLSBhbmQgJEYkLXN0YXRpc3RpY3MgaG9sZCB1cCB3ZWxsIHVuZGVyIHN0cmVzcy4gT25seSBmb3Igc21hbGwgc2FtcGxlIHNpemVzIGFyZSBkYXRhIGNoZWNrcyBuZWVkZWQuDQoNCjxkaXYgc3R5bGU9ImZsb2F0OmNlbnRlcjsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDEwcHggMTVweCAxMHB4Ij4NCjxjZW50ZXI+PGZvbnQgc2l6ZSA9IDQ+KipWZXJpZnlpbmcgTm9ybWFsaXR5IEFzc3VtcHRpb246ICR0JC1Qcm9jZWR1cmVzKio8L2ZvbnQ+PC9jZW50ZXI+DQokJFxiZWdpbnthcnJheX17Y2NsfSBcdGV4dGJme1NhbXBsZSBTaXplfSAmJiBcdGV4dGJme0RhdGEgQ2hlY2t9XFwgXGhsaW5lDQogIG4gXGdlcSA0MCAmJiBcdGV4dHtObyBkYXRhIGNoZWNrcyBuZWVkZWQgZHVlIHRvIHJvYnVzdG5lc3Mgb2YgfXRcXA0KICAxNSBcbGVxIG4gPCA0MCAmJiBcdGV4dHtDaGVjayBib3ggcGxvdCwgdmVyaWZ5IG5vIG91dGxpZXJzfVxcDQogIG4gPCAxNSAmJiBcdGV4dHtBbHNvIGNoZWNrIGhpc3RvZ3JhbSAobmVlZCBhcHByb3hpbWF0ZSBub3JtYWxpdHkpfQ0KXGVuZHthcnJheX0kJA0KPC9kaXY+DQoNCkZvciBpbmRlcGVuZGVudCBzYW1wbGVzICR0JC10ZXN0cywgd2UgdXNlIHRoZSBvdmVyYWxsIHNhbXBsZSBzaXplLiBJZiAkbl8xJCBhbmQgJG5fMiQgYXJlIHRoZSBzYW1wbGUgc2l6ZSBvZiBncm91cHMgMSBhbmQgMiByZXNwZWN0aXZlbHksIHRoZW4gZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGUgY2hhcnQgYWJvdmUgJCRuPW5fMStuXzIkJA0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpjZW50ZXI7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAxMHB4IDE1cHggMTBweCI+DQo8Y2VudGVyPjxmb250IHNpemUgPSA0PioqVmVyaWZ5aW5nIE5vcm1hbGl0eSBBc3N1bXB0aW9uOiBBTk9WQSoqPC9mb250PjwvY2VudGVyPg0KJCRcYmVnaW57YXJyYXl9e2NjbH0gXHRleHRiZntTYW1wbGUgU2l6ZX0gJiYgXHRleHRiZntEYXRhIENoZWNrfVxcIFxobGluZQ0KICBuIFxnZXEgMjAgJiYgXHRleHR7Tm8gZGF0YSBjaGVja3MgbmVlZGVkIGR1ZSB0byByb2J1c3RuZXNzIG9mIH1GXFwNCiAgbiA8IDIwICYmIFx0ZXh0e0RvIG5vdCBydW4gYW4gQU5PVkF9DQpcZW5ke2FycmF5fSQkDQo8L2Rpdj4NCg0KQXMgd2l0aCB0aGUgJHQkLXRlc3QsIHRoZSAkbiQgaW4gdGhlIGNoYXJ0IGZvciBBTk9WQSByZWZlcnMgdG8gb3ZlcmFsbCBzYW1wbGUgc2l6ZTogdGhlIHRvdGFsIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgaW5jbHVkaW5nIGFsbCBzYW1wbGVzLiBJbiBlaXRoZXIgY2FzZSwgaWYgdGhlIGRhdGEgY2hlY2tzIGZhaWwsIHRoZSBkYXRhIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZXNlIHByb2NlZHVyZXMsIGFuZCB0aGUgcmVzZWFyY2hlciBzdG9wIGltbWVkaWF0ZWx5LiBTdGF0aXN0aWNhbCBhcHBzIHdpbGwgcHJvZHVjZSAkcCQtdmFsdWVzIHdpdGggZ2FyYmFnZSBkYXRhIGp1c3QgYXMgZWFzaWx5IGFzIHdpdGggZ29vZCBkYXRhLiBUaGUgcmVzZWFyY2hlciBjb25kdWN0aW5nIHRoZSBxdWFudGl0YXRpdmUgYW5hbHlzaXMgaXMgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZSBkYXRhIGZvciBhcHByb3ByaWF0ZW5lc3MuDQoNCiMjIDIuIENoZWNraW5nIEhvbW9nZW5laXR5DQoNClRoZSByb2J1c3RuZXNzIG9mICR0JCBhbmQgJEYkIHdpbGwgZW5zdXJlIHJlYXNvbmFibGUgYWNjdXJhY3kgb2YgdGhlIHJlc3VsdGluZyAkcCQtdmFsdWVzIGV2ZW4gd2hlbiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhcmUgZGlmZmVyZW50IHNvIGxvbmcgYXMgdGhlIGdyb3VwIHNpemVzIGFyZSBub3QgKipzaGFycGx5IHVuZXF1YWwqKi4gV2hhdCBpcyBzaGFycGx5IHVuZXF1YWw/IFdlIHdvdWxkIG5vdCB3aXNoIHRvIHNlZSB0aGUgZm9sbG93aW5nIGRhdGEgc2V0IGZvciBhICR0JC10ZXN0Lg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij5IeXBvdGhlc2lzIFRlc3RpbmcgU3RlcHM8L3NwYW4+DQoxLiBJZGVudGlmeSBjb3JyZWN0IHByb2NlZHVyZQ0KMi4gU2V0dXAgbnVsbCAkKEhfMCkkIGFuZDwvYnI+IGFsdGVybmF0ZSAkKEhfYSkkIGh5cG90aGVzZXMNCjMuIFZlcmlmaWNhdGlvbjogYXJlIGRhdGEgYXBwcm9wcmlhdGU8L2JyPiBmb3IgcHJvY2VkdXJlPw0KNC4gU2V0ICRcYWxwaGEkICgkXGFscGhhID0gLjA1JCBpcyBkZWZhdWx0IHZhbHVlKQ0KNS4gKipSdW4gU3RhdHMgQXBwKiogdG8gZGV0ZXJtaW5lICRwJC12YWx1ZQ0KNi4gU3RhdGlzdGljYWwgQ29uY2x1c2lvbjogIlJlamVjdCAkSF8wJCIgb3I8L2JyPiJGYWlsIHRvIHJlamVjdCAkSF8wJCINCjcuIFJlc2VhcmNoIGNvbmNsdXNpb24NCjwvZGl2Pg0KDQoNCiQkXGJlZ2lue2FycmF5fXtjY2NjY30gJiYmXHRleHRiZntQb2xhciBCZWFyc30gJiYgXHRleHRiZntHcml6emx5IEJlYXJzfVxcIFxobGluZQ0KICBcb3ZlcmxpbmV7eH0gJiYmIDgwMCAmJiA5MDBcXA0KICBzICYmJiAxMjUgJiYgMjc1XFwNCiAgbiAmJiYgOCAmJiAyOA0KXGVuZHthcnJheX0kJA0KDQpXZSByZXF1aXJlIHRoZSByYXRpbyBvZiBsYXJnZXN0LXRvLXNtYWxsZXN0IGdyb3VwIHNpemUgdG8gYmUgbm8gbW9yZSB0aGFuICQyOjEkLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBhbmQgdGhlIGdyb3VwIHNpemUgcmF0aW8gaXMgJDMuNToxJCwgYSBjbGFzc2ljIGV4YW1wbGUgb2Ygc2hhcnBseSB1bmVxdWFsIGdyb3Vwcy4gDQoNClRoZSBzYW1lIHJlY29tbWVuZGF0aW9uIGhvbGRzIHRydWUgZm9yIEFOT1ZBJ3Mgd2hlcmUgd2UgcmVxdWlyZSB0aGF0IHRoZSBsYXJnZXN0IGdyb3VwIGhhdmUgbm8gbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgb2JzZXJ2YXRpb25zIGFzIHRoZSBzbWFsbGVzdCBncm91cC4gV2l0aCBldmVuIHNsaWdodCBkaWZmZXJlbmNlcyBpbiBzdGFuZGFyZCBkZXZpYXRpb25zIGFuZCBzaGFycGx5IHVuZXF1YWwgZ3JvdXAgc2l6ZXMsIHRoZSBkYXRhIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIGVpdGhlciAkdCQtcHJvY2VkdXJlcyBvciBBTk9WQS4gSW4gYSBtb3JlIGFkdmFuY2VkIHN0YXRpc3RpY3MgY2xhc3MsIHdlIGhhdmUgb3B0aW9ucyBmb3IgaW52ZXN0aWdhdGlvbi4gQXQgdGhpcyBsZXZlbCwgaG93ZXZlciwganVzdCBkb24ndCBydW4gdGhlIEFOT1ZBIG9yICR0JC10ZXN0IHVuZGVyIHN1c3BpY2lvdXMgY2lyY3Vtc3RhbmNlcy4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JSUkuIE9uZSBTYW1wbGUgJHQkLVRlc3RzPC9zcGFuPg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpjZW50ZXI7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAxMHB4IDE1cHggMTBweCI+DQojIyMgRG8geW91bmcgZmVtYWxlcyB1c2UgbGVzcyBhZ2dyZXNzaXZlIGh1bWVyPw0KVGhlIDxhIGhyZWYgPSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdW1vcl9zdHlsZXMjVGhlX0h1bW9yX1N0eWxlc19RdWVzdGlvbm5haXJlXy4yOEhTUS4yOT5IdW1vciBTdHlsZXMgUXVlc3Rpb25uYWlyZTwvYT4gKEhTUSkgaGFzIGZvdXIgc3ViLXNjYWxlcywgb25lIG9mIHdoaWNoIGlzIDxhIGhyZWYgPSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdW1vcl9zdHlsZXMjQWdncmVzc2l2ZV9odW1vcj5hZ2dyZXNzaXZlIGh1bW9yPC9hPiAoSFNBRykgd2hpY2ggaXMgY2hhcmFjdGVyaXplZCBieSBzYXJjYXNtIGFuZCBwdXQtZG93bnMuIFRoZSBVTkcgdW5kZXJncmFkdWF0ZSByZXNlYXJjaCBwcm9qZWN0IG9uIHBlcnNvbmFsaXR5IGFuZCBodW1vciB2YXJpYWJsZXMgcmV2ZWFsZWQgdGhhdCBtZW4gdXNlIGFnZ3Jlc3NpdmUgaHVtb3IgbW9yZSBvZnRlbiB0aGFuIHdvbWVuLCBhbmQgeW91bmdlciBwZW9wbGUgdXNlIGFnZ3Jlc3NpdmUgaHVtb3IgbW9yZSBvZnRlbiBvbGRlciBwZW9wbGUuIFdlIHdpbGwgZXh0cmFjdCBhIHN1YnNldCBvZiBwYXJ0aWNpcGFudHMgd2hvIGFyZSB5b3VuZ2VyIHRoYW4gMjAgeWVhcnMgb2xkIGFuZCB3aG8gYXJlIGZlbWFsZS4gV2lsbCB0aGUgYXZlcmFnZSBhZ2dyZXNzaXZlIGh1bW9yIHNjb3JlIChIU0FGKSBiZSBsZXNzIGZvciB0aGlzIGdyb3VwIHRoYW4gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbj8gVGVzdCBhdCAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCjwvZGl2Pg0KDQpXZSBuZWVkIHRvIGtub3cgdGhlIG92ZXJhbGwgYXZlcmFnZSBhZ2dyZXNzaXZlIGh1bW9yIHNjb3JlIGZvciB0aGUgZW50aXJlIGRhdGEgc2V0LiBUaGVuIHdlIGNhbiB1c2UgdGhlICoqc3Vic2V0KiogZnVuY3Rpb24gdG8gZXh0cmFjdCBIU0FHIHNjb3JlcyB0aGF0IGNvcnJlc3BvbmQgdG8geW91bmcgZmVtYWxlcy4NCg0KIyMgT3ZlcmFsbCBQb3B1bGF0aW9uIE1lYW4gKCRcbXVfMCQpDQoNCmBgYHtyfQ0KI2xpYnJhcnkobW9zYWljKQ0KZmF2c3RhdHMofiBIU0FHLCBkYXRhID0gRGF0YTMzNTApDQpgYGANCklmIHdlIGFncmVlIHRoYXQgdGhlICoqRGF0YTMzNTAqKiBpcyBhIHJlcHJlc2VudGF0aXZlIHNhbXBsZSBvZiB0aGUgVU5HIERhaGxvbmVnYSBjYW1wdXMgc3R1ZGVudHMgKGFuZCBpdCdzIGEgcmVhc29uYWJsZSBhc3N1bXB0aW9uIGZvciB0aGUgbW9zdCBwYXJ0KSwgdGhlbiB0aGUgYXZlcmFnZSBIU0FHIHNjb3JlIGlzIGFib3V0IDI5Lg0KDQojIyMgRXh0cmFjdGluZyBhIFNhbXBsZSBvZiBZb3VuZ2VyIFdvbWVuDQoNCioqU3RlcCAxOioqIFN1YnNldCBvZiBGZW1hbGVzIE9ubHkuIFRoZSBjb2RlIGJsb2NrIGJlbG93IGhhcyB0aHJlZSBjb21tYW5kcy4NCg0KMS4gV29yayB3aXRoIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lLg0KMi4gS2VlcCBvbmx5IHJvd3Mgd2hlcmUgdGhlIGRhdGEgcG9pbnQgaW4gdGhlIFNleCBjb2x1bW4gaXMgYW4gIkYiDQozLiBLZWVwIG9ubHkgdGhlIHZhcmlhYmxlcyBBZ2UgYW5kIEhTQUcuDQoNCmBgYHtyfQ0Kc3Vic2V0KERhdGEzMzUwLCBTZXggPT0gIkYiLCBjKEFnZSxIU0FHKSkNCmBgYA0KDQpUaGF0IHdvcmtzIGZpbmUsIGJ1dCB3ZSB3YW50IHRvIG5hbWUgaXQgc29tZXRoaW5nIHNvIHdlIGNhbiBzYXZlIGl0IGFuZCB3b3JrIHdpdGggaXQgYWdhaW4uIExldCdzIGNyZWF0ZSBhIGRhdGEgZnJhbWUgKipmZW0qKiBiZWNhdXNlIGl0J3Mgb25seSBnb2luZyB0byBoYXZlIGZlbWFsZSBzY29yZXMgbGVmdCBpbiBpdC4NCg0KYGBge3J9DQpmZW0gPSBzdWJzZXQoRGF0YTMzNTAsIFNleCA9PSAiRiIsIGMoQWdlLEhTQUcpKQ0KYGBgDQoNCioqU3RlcCAyOioqIFN1YnNldCBvZiBZb3VuZyBGZW1hbGVzIE9ubHkNCg0KV2UgY2FuIHRha2UgYSBzdWJzZXQgb2YgdGhlIG5ldyBkYXRhIGZyYW1lICoqZmVtKiouIFRoZSBnb2FsIGlzIHRvIGNyZWF0ZSBhIGEgc2luZ2xlLXZhcmlhYmxlIGRhdGEgZnJhbWUgY2FsbGVkICoqeUZlbSoqIHdoZXJlIHRoZSBmZW1hbGVzIGFyZSAxOSB5ZWFycyBvbGQgb3IgeW91bmdlci4gVGhlIG9ubHkgdmFyaWFibGUgaW4gdGhlIGRhdGEgZnJhbWUgd2lsbCBiZSBIU0FHLg0KDQpgYGB7cn0NCnlGZW0gPSBzdWJzZXQoZmVtLCBBZ2UgPCAyMCwgSFNBRykNCnlGZW0NCmBgYA0KVGhlIG5ldyBkYXRhIGZyYW1lICoqeUZlbSoqIGhhcyB0aGUgSFNBRyBzY29yZXMgZm9yIDQzIHRlZW5hZ2UgZmVtYWxlcyBmcm9tIFVORyBEYWhsb25lZ2EuIFdlIHBsYW4gdG8gcnVuIGEgKip0LnRlc3QqKiBjb21wYXJpbmcgdGhlbSB0byB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIGF2ZXJhZ2UgZm9yIEFnZ3Jlc3NpdmUgSHVtb3IgKCRcbXVfMCA9IDI5JCkuDQoNCiMjIyBIeXBvdGhlc2lzIFRlc3QNCg0KV2Ugd2lsbCBjb25kdWN0IGEgMS1zYW1wbGUgJHQkLXRlc3Qgd2l0aCB0aGUgaHlwb3RoZXNpczoNCiQkXGJlZ2lue2FsaWduKn1IXzAgJjogXG11ID0gMjlcXEhfYSAmOiBcbXUgPCAyOVxlbmR7YWxpZ24qfSQkDQpUaGUgZGF0YSBwYXNzIHZlcmlmaWNhdGlvbiB3aXRob3V0IGFueSBkYXRhIGNoZWNrcyBiZWNhdXNlICRuPTQzIFxnZXEgNDAkIChyb2J1c3RuZXNzIG9mICR0JCkuIFVzaW5nIHRoZSBkZWZhdWx0IGxldmVsIG9mIHNpZ25pZmljYW5jZSAkXGFscGhhID0gMC4wNSQsIHdlIHJ1biB0aGUgcHJvY2VkdXJlLg0KDQpgYGB7cn0NCnQudGVzdCh+SFNBRywgZGF0YSA9IHlGZW0sIA0KICAgICAgIG11ID0gMjksDQogICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIpDQpgYGANCkJlY2F1c2UgJHA9MC4wMTI3OSA8IDAuMDUgPSBcYWxwaGEkLCB3ZSByZWplY3QgdGhlIG51bGwuIEV2aWRlbmNlIHN1Z2dlc3RzIHRoYXQgeW91bmcgZmVtYWxlcyBhdCBVTkcgRGFobG9uZWdhIHVzZSBzaWduaWZpY2FudGx5IGxlc3MgYWdncmVzc2l2ZSBodW1vciB0aGFuIHRoZSB0eXBpY2FsIChhdmVyYWdlKSBVTkcgRGFobG9uZWdhIHN0dWRlbnQgJChwPS4wMTMpJC4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gSVYuIE1hdGNoZWQgUGFpcnMgJHQkLXRlc3Q8L3NwYW4+DQoNClRoZSBtb3N0IHVzZWZ1bCBhcHBsaWNhdGlvbiBvZiB0aGUgb25lIHNhbXBsZSAkdCQtdGVzdCBpcyB0aGUgbWF0Y2hlZCBwYWlycyBkZXNpZ24uIFRoZSBtYXRjaGVkIHBhaXJzICR0JC10ZXN0IChzb21ldGltZXMgY2FsbGVkIGEgZGVwZW5kZW50IHNhbXBsZXMgJHQkLXRlc3QpIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB0byBhbmFseXplIGRhdGEgZnJvbSBhIHByZXRlc3QgLSBwb3N0dGVzdCByZXNlYXJjaCBkZXNpZ24uIFRoZSBtYXRjaGVkIHBhaXJzICR0JC10ZXN0IHJlZHVjZXMgdGhlIHZhcmlhbmNlIGJldHdlZW4gc3ViamVjdHMgYnkgY3JlYXRpbmcgYSBHYWluIHNjb3JlIHRoYXQgaWdub3JlcyB0aGUgc3RhcnRpbmcgYW5kIGVuZGluZyBwb2ludHMgZm9yIGVhY2ggc3ViamVjdCBhbmQgZm9jdXNlcyBvbmx5IG9uIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJldGVzdCBhbmQgcG9zdHRlc3Qgc2NvcmVzLg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpjZW50ZXI7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAxMHB4IDE1cHggMTBweCI+DQojIyMgRG9lcyBTdHJlc3MgSW5jcmVhc2UgRHVyaW5nIE1pZHRlcm1zPw0KVGhlIHZhcmlhYmxlcyBTdHJlc3MxIGFuZCBTdHJlc3MyIGluIERhdGEzMzUwIHdlcmUgaWRlbnRpY2FsIG1lYXN1cmVzIG9mIHN0cmVzcywgd2l0aCBTdHJlc3MxIGFkbWluaXN0ZXJlZCBpbiB0aGUgc2Vjb25kIHdlZWsgb2YgdGhlIHNlbWVzdGVyLCBhbmQgU3RyZXNzMiBhZG1pbmlzdGVyZWQgZHVyaW5nIG1pZHRlcm1zIHdoZW4gbW9zdCBzdHVkZW50cyBoYWQgc2V2ZXJhbCB0ZXN0cywgcHJvamVjdHMgb3IgcGFwZXJzIGR1ZS4gVGVzdCBmb3IgYW4gaW5jcmVhc2UgaW4gU3RyZXNzIGR1cmluZyBtaWR0ZXJtcyBhdCAkMC4wMSQgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KPC9kaXY+DQoNCiMjIERhdGEgRXh0cmFjdGlvbg0KDQpCZWZvcmUgYmVnaW5uaW5nIHRoZSBoeXBvdGhlc2lzIHRlc3QsIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBwcmV0ZXN0IGFuZCBwb3N0dGVzdCB2YXJpYWJsZS4gV2l0aCBhIGRhdGEgZnJhbWUgbGlrZSBEYXRhMzM1MCwgd2UgdXNlIHRoZSAkXGZib3h7XCR9JCBzeW1ib2wgdG8gaW5kaWNhdGUgYSB2YXJpYWJsZSBuYW1lIHdpbGwgZm9sbG93LiBUaGUgZm9sbG93aW5nIGNvZGUgYmxvY2sgd2lsbCBjcmVhdGUgdGhlIHZhcmlhYmxlcyAqKlByZSoqIGFuZCAqKlBvc3QqKi4NCg0KYGBge3J9DQpQcmUgPSBEYXRhMzM1MCRTdHJlc3MxDQpQb3N0ID0gRGF0YTMzNTAkU3RyZXNzMg0KYGBgDQoNCldlIGRvbid0IHJlYWxseSBjYXJlIGhvdyBtdWNoIHN0cmVzcyBlYWNoIHN1YmplY3Qgd2FzIGV4cGVyaWVuY2luZyBhdCBtaWR0ZXJtcyBvciBldmVuIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlbWVzdGVyLiBXZSBjYXJlIGlmIHRoZXJlIHdhcyBhIGRpZmZlcmVuY2UgaW4gc3RyZXNzIGF0IHRob3NlIHRpbWVzLCBhbmQgaWYgc28sIGhvdyBtdWNoLiBXZSBjYXJlIGFib3V0IHRoZSBHYWluIGluIHN0cmVzcy4kJFx0ZXh0e0dhaW59PVx0ZXh0e1Bvc3R9LVx0ZXh0e1ByZX0kJA0KSW4gc29tZSBleHBlcmltZW50YWwgZGVzaWducywgd2UgcHJlZmVyIHRvIGhhdmUgbmVnYXRpdmUgZ2FpbnMsIGZvciBleGFtcGxlLCBpZiB3ZSdyZSB3b3JraW5nIHdpdGggcGF0aWVudHMgd2hvIGhhdmUgaGlnaCBibG9vZCBwcmVzc3VyZS4gSW4gdGhpcyBjb3Vyc2UsIGEgR2FpbiBzY29yZSB3aWxsIGFsd2F5cyBtZWFuIHRoYXQgdGhlIFByZSBzY29yZSB3YXMgc3VidHJhY3RlZCBmcm9tIFBvc3Qgc2NvcmUsIGFzIGluIHRoZSBjb2RlIGJsb2NrIGJlbG93Lg0KDQpgYGB7cn0NCkdhaW4gPSBQb3N0IC0gUHJlDQpgYGANCg0KIyMgSHlwb3RoZXNpcyBUZXN0DQoNCldlIHdpbGwgdXNlIGEgbWF0Y2hlZCBwYWlycyAkdCQtdGVzdCB3aGljaCBpcyBhIG9uZSBzYW1wbGUgJHQkLXRlc3QgYXBwbGllZCB0aGUgR2FpbiBzY29yZXMuIEV2ZW4gdGhvdWdoIHdlIHN0YXJ0IHdpdGggdHdvIHNhbXBsZXMsIFByZSBhbmQgUG9zdCwgd2UgYXJlIHVzaW5nIGEgb25lIHNhbXBsZSB0ZXN0LiBUaGUgaHlwb3RoZXNpcyBpcyB0aGF0IHRoZSBhdmVyYWdlIFN0cmVzcyBzY29yZSB3aWxsIGJlIGhpZ2hlciBkdXJpbmcgbWlkdGVybXMgYW5kLCBzcGVjaWZpY2FsbHksIHRoYXQgdGhlIGF2ZXJhZ2UgR2FpbiBzY29yZSAoJFxtdV9nJCkgd2lsbCBiZSBncmVhdGVyIHRoYW4gemVyby4NCg0KJCRcYmVnaW57YWxpZ24qfUhfMCA6IFxtdV9nID0gMFxcIEhfYSA6IFxtdV9nID4gMFxlbmR7YWxpZ24qfSQkDQpXZSB3aWxsIHJ1biBhIHF1aWNrIGRhdGEgYW5hbHlzaXMsIGJ1dCB0aGUgc2FtcGxlIHNpemUgaXMgYWRlcXVhdGUgdGhhdCB0aGUgcm9idXN0bmVzcyBvZiAkdCQgd2lsbCBlbnN1cmUgYWNjdXJhdGUgJHAkLXZhbHVlcy4NCg0KYGBge3J9DQpmYXZzdGF0cyhHYWluKQ0KYGBgDQoNCk9uIGF2ZXJhZ2UsIHN0dWRlbnRzIGV4cGVyaWVuY2VkIGFib3V0IHRocmVlLXF1YXJ0ZXJzIG9mIGEgcG9pbnQgaGlnaGVyIFN0cmVzcyBkdXJpbmcgbWlkdGVybXMuIFdpdGggJG4gPSAxNjQkLCBubyBmdXJ0aGVyIGRhdGEgY2hlY2tzIGFyZSBuZWVkZWQuIFRoZXNlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciAkdCQgcHJvY2VkdXJlcy4gRXZlbiB0aG91Z2ggaXQgaXMgbm90IHJlcXVpcmVkIGZvciB2ZXJpZmljYXRpb24sIG1vc3QgZ29vZCByZXNlYXJjaGVycyBpbnNwZWN0IHRoZSBoaXN0b2dyYW0gYW5kIGJveCBwbG90IGFueXdheS4NCg0KYGBge3J9DQpoaXN0b2dyYW0oR2Fpbiwgd2lkdGggPSAyKQ0KYm94cGxvdChHYWluLCBob3Jpem9udGFsID0gVFJVRSkNCmBgYA0KSW4gYSBsYXJnZSBkYXRhIHNldCBsaWtlIHRoaXMgb25lLCBvdXRsaWVycyB3aWxsIG5vdCBkZWNyZWFzZSB0aGUgYWNjdXJhY3kgb2YgdGhlICR0JC10ZXN0ICRwJC12YWx1ZXMuIFN0aWxsLCBub3RlIHRoYXQgdGhlcmUgaXMgb25lIG91dGxpZXIgdG8gZWFjaCBzaWRlIGJhbGFuY2luZyBlYWNoIG90aGVyLiBUaGUgaGlzdG9ncmFtIHByb3ZpZGVzIHF1aXRlIGNvbnZpbmNpbmcgZXZpZGVuY2UgdGhlIGRhdGEgd2VyZSBkcmF3biBmcm9tIGEgYmVsbC1zaGFwZWQgcG9wdWxhdGlvbi4NCg0KIyMgVHdvIFdheXMgdG8gQ29uZHVjdCBNYXRjaGVkIFBhaXJzIHVzaW5nIFJTdHVkaW8NCg0KV2UgY2FuIHByb2R1Y2UgYSBvbmUgc2FtcGxlICR0JC10ZXN0IG9uIHRoZSBHYWluIHNjb3JlcyB1c2luZyB0aGUgZm9sbG93aW5nIGNvZGUuIFRoZSBvcHRpb24gJFxmYm94e2FsdGVybmF0aXZlID0gZ3JlYXRlcn0kIHNwZWNpZmllcyB0aGUgb25lLXRhaWxlZCB0ZXN0IHdoZXJlIHdlIGV4cGVjdCBwb3NpdGl2ZSBnYWlucy4NCg0KYGBge3J9DQp0LnRlc3QoR2FpbiwgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQpgYGANCg0KV2UgY2FuIGFsc28gdXNlIHRoZSB0d28gc2FtcGxlICR0JC10ZXN0IGZvcm1hdCwgYnV0IGluY2x1ZGUgdGhlIG9wdGlvbiAkXGZib3h7cGFpcmVkID0gVFJVRX0kIHRvIGxldCBSU3R1ZGlvIGtub3cgdG8gdXNlIHRoZSBtYXRjaGVkIHBhaXJzIHNldHRpbmdzLCBub3QgdGhlIGluZGVwZW5kZW50IHNhbXBsZXMgc2V0dGluZ3MuIEhlcmUsIHdlIGVudGVyIHRoZSB2YXJpYWJsZXMgUHJlIGFuZCBQb3N0LCBidXQgdGhlICoqdC50ZXN0KiogZnVuY3Rpb24gd2lsbCBjcmVhdGUgZ2FpbiBzY29yZXMgYmVmb3JlIHJ1bm5pbmcgdGhlIHRlc3QuDQoNCmBgYHtyfQ0KdC50ZXN0KFBvc3QgLCBQcmUsIGRhdGEgPSBEYXRhMzM1MCwgDQogICAgICAgcGFpcmVkID0gVFJVRSwNCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIikNCmBgYA0KDQojIyBSZXN1bHRzDQoNCkVpdGhlciB3YXksIHdlIGZpbmQgdGhhdCAkcD0wLjAwMTIgPCAwLjAxID1cYWxwaGEkLCBhbmQgd2UgcmVqZWN0IHRoZSBudWxsLiBXaXRoIHRoZSAkcCQtdmFsdWUgc28gY2xvc2UgdG8gemVybywgd2UgaGF2ZSBtZXQgYSBtb3JlIHN0cmluZ2VudCBsZXZlbCBvZiBwcm9vZiB0aGF0IHRoZSBudWxsIGlzIGxpa2VseSBmYWxzZS4gVGhhdCBtZWFucyB3ZSBjYW4gc3RyZW5ndGhlbiBvdXIgcmVzZWFyY2ggY29uY2x1c2lvbiBhY2NvcmRpbmdseS4gRXZpZGVuY2UgKnN0cm9uZ2x5KiBzdWdnZXN0cyB0aGF0ICoqU3RyZXNzKiogaW5jcmVhc2VzIGR1cmluZyBtaWR0ZXJtcy4NCg0KIyMgTGV2ZWwgb2YgU2lnbmlmaWNhbmNlDQoNCldoeSBkaWQgd2Ugbm90IHVzZSB0aGUgZGVmYXVsdCAkXGFscGhhID0gMC4wNSQ/IFRoZSBtYXRjaGVkIHBhaXJzIHJlc2VhcmNoIGRlc2lnbiBoYXMgdGhlIGFkdmFudGFnZSBvZiBiZWluZyB2ZXJ5IHNlbnNpdGl2ZSB0byBjaGFuZ2VzIGluIEdhaW4gc2NvcmVzLiBXZSBvbmx5IG1lYXN1cmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHN0YXJ0aW5nIHBvaW50cyBhbmQgZW5kaW5nIHBvaW50cy4gQSBwYXJ0aWNpcGFudCB3aG8gaGFzIFByZSA9IDEyIGFuZCBQb3N0ID0gMTggYW5kIG9uZSB3aG8gaGFzIFByZSA9IDE4IGFuZCBQb3N0ID0gMjQgYm90aCBoYXZlIEdhaW4gc2NvcmVzIG9mIDYuIFNpbmNlIHRoZSB2YXJpYXRpb24gYW1vbmcgaW5kaXZpZHVhbHMgaXMgZXJhc2VkIHdoZW4gd2UgY2FsY3VsYXRlIHRoZSBHYWlucywgdGhlIHRlc3QgYmVjb21lcyBtdWNoIG1vcmUgc2Vuc2l0aXZlLiANCg0KV2hhdCBpZiB3ZSBqdXN0IHJhbiB0aGUgY29tcGFyaXNvbiBsaWtlIGFuIGluZGVwZW5kZW50IHNhbXBsZXMgKHR3byBzYW1wbGUpICR0JC10ZXN0PyBIb3cgbXVjaCBkaWZmZXJlbmNlIHdvdWxkIGl0IG1ha2U/DQoNCmBgYHtyfQ0KdC50ZXN0KFBvc3QsIFByZSwgDQogICAgICAgcGFpcmVkID0gRkFMU0UsDQogICAgICAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQpgYGANCk5vdGljZSB0aGF0IHRoZSAkcCQtdmFsdWUgaXMgbW9yZSB0aGFuIG9uZSBvcmRlciBvZiBtYWduaXR1ZGUgbGFyZ2VyIHRoYW4gd2l0aCB0aGUgcGFpcmVkIGFwcHJvYWNoLiBXZSB3b3VsZCBzdGlsbCByZWplY3QgdGhlIG51bGwgYXQgdGhlICQwLjA1JCBsZXZlbCBvZiBzaWduaWZpY2FuY2UsIGJ1dCBub3QgYXQgdGhlICQwLjAxJCBsZXZlbC4gVGhlIHJlYXNvbiB3ZSB1c2VkIGEgc21hbGxlciAkXGFscGhhJCB3YXMgZHVlIHRvIHRoaXMgZmVhdHVyZSBvZiB0aGUgbWF0Y2hlZCBwYWlycyBkZXNpZ24uIEJlY2F1c2UgdGhlIG1hdGNoZWQgcGFpcnMgZGVzaWduIGlnbm9yZSB0aGUgc2lnbmlmaWNhbnQgaHVtYW4gdmFyaWF0aW9uIGF0IHRoZSBzdGFydCwgd2UgY2FuIHJlZHVjZSAkXGFscGhhJCB0byBjcmVhdGUgYSBtb3JlIHNlbnNpdGl2ZSBzdGF0aXN0aWNhbCB0ZXN0IHdoaWxlIHJldGFpbmluZyBhZGVxdWF0ZSBwb3dlciwgYSBjb25jZXB0IHdlIHdpbGwgZGlzY3VzcyBsYXRlciBpbiB0aGUgY291cnNlLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlYuIEluZGVwZW5kZW50IFNhbXBsZXMgJHQkLVRlc3Q8L3NwYW4+DQoNClRoZSBpbmRlcGVuZGVudCBzYW1wbGVzICR0JC10ZXN0IGNvbXBhcmVzIHNhbXBsZXMgZHJhd24gZnJvbSB0d28gZGlmZmVyZW50IHN1Yi1wb3B1bGF0aW9ucyBkaXJlY3RseSB0byBlYWNoIG90aGVyLiBGb3IgdGhpcyBpbnZlc3RpZ2F0aW9uLCBsZXQncyBjb25zaWRlciB0aGUgZGlmZmVyZW5jZXMgaW4gdGhlIHNsZWVwIHBhdHRlcm5zIGFuZCBjYWZmZWluZSBjb25zdW1wdGlvbiBiZXR3ZWVuIHRob3NlIHdobyBhcmUgMjEgeWVhcnMgb2xkIG9yIG9sZGVyIGNvbXBhcmVkIHRvIHRob3NlIHdobyBhcmUgdHdlbnR5IGFuZCB5b3VuZ2VyLiBXZSdsbCBydW4gdHdvIGh5cG90aGVzaXMgdGVzdHMgYXQgb25jZS4NCg0KPGRpdiBzdHlsZT0iZmxvYXQ6Y2VudGVyOyBtYXJnaW46IDhweDsgYm9yZGVyOjJweCBibGFjayBzb2xpZDsgcGFkZGluZzogMTBweCAxNXB4IDEwcHgiPg0KIyMjIERvIE9sZGVyIENvbGxlZ2UgQ29uc3VtZSBNb3JlIENhZmZlaW5lIGFuZCBHZXQgTGVzcyBTbGVlcD8NClRoZSBncm91cGluZyB2YXJpYWJsZSAqKkcyMSoqIGhhcyB0d28gbGV2ZWxzLCBZIGZvciB0aG9zZSBhbnN3ZXJpbmcgeWVzIHRvIHdoZXRoZXIgdGhlaXIgY3VycmVudCBhZ2Ugd2FzIDIxIHllYXJzIG9sZCBvciBvbGRlciwgYW5kIE4gZm9yIHRob3NlIGFuc3dlcmluZyBuby4gV2Ugd2lsbCBwZXJmb3JtIDEtdGFpbGVkICR0JC10ZXN0cyBvbiB0d28gdmFyaWFibGVzOiAqKlNsZWVwKiosIHRoZSBudW1iZXIgb2YgaG91cnMgb2Ygc2xlZXAgaW4gbGFzdCA0OCBpbmNsdWRpbmcgbmFwcyAoZGl2aWRlZCBieSAyLCB0byBnaXZlIGFuIGF2ZXJhZ2UgcGVyIG5pZ2h0KSwgYW5kICoqQ2FmZioqLCB0aGUgbnVtYmVyIG9mIDEyIG91bmNlIHNlcnZpbmdzIG9mIGNhZmZlaW5lIGluIGxhc3QgMjQgaG91cnMuIE91ciBoeXBvdGhlc2VzIGFyZSB0aGF0IG9sZGVyIHN0dWRlbnRzIHdpbGwgZ2V0IGxlc3Mgc2xlZXAgYW5kIGNvbnN1bWUgbW9yZSBjYWZmZWluZS4gVGVzdCBhdCB0aGUgZGVmYXVsdCAkXGFscGhhID0gMC4wNSQgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KPC9kaXY+DQoNClVzaW5nIGEgZ3JvdXBpbmcgdmFyaWFibGUgKipHMjEqKiB3aXRoIHR3byBsZXZlbHMsIHdlIG5lZWQgdGhlIGluZGVwZW5kZW50IHNhbXBsZXMgJHQkLXRlc3QuIFRvIGNsYXJpZnkgb3VyIGh5cG90aGVzaXMgc2V0dXAsIGxldCAiWSIgaW5kaWNhdGUgc3R1ZGVudHMgd2hvIGFyZSBub3QgeWV0IDIxIChZb3VuZ2VyKSwgYW5kICJEIiBpbmRpY2F0ZSBzdHVkZW50cyB3aG8gYXJlIDIxIG9yIG9sRGVyLg0KDQokJFxiZWdpbnthcnJheX17Y2NjY2N9IFx0ZXh0YmZ7Q2FmZmVpbmV9ICYmJlx0ZXh0YmZ7U2xlZXB9XFwgSF8wIDogXG11X1kgPSBcbXVfRCAmJiYgSF8wIDogXG11X1kgPSBcbXVfRFxcIEhfMCA6IFxtdV9ZIDwgXG11X0QgJiYmIEhfMCA6IFxtdV9ZID4gXG11X0RcZW5ke2FycmF5fSQkDQoNCkJvdGggbnVsbCBoeXBvdGhlc2VzIGFyZSB0aGF0IHRoZSBzYW1wbGVzIHdlcmUgZHJhd24gZnJvbSBpZGVudGljYWwgZGlzdHJpYnV0aW9ucy4gVGhlICRcZmJveHt0YWxseX0kIGZ1bmN0aW9uIHdvcmtzIHdlbGwgdG8gc2hvdyB0aGUgZnJlcXVlbmN5IHRhYmxlIGNvbXBhcmlzb25zLiBUaGUgdGFsbGllcyBmb3IgdGhlICoqQ2FmZioqIGRhdGE6DQoNCmBgYHtyfQ0KdGFsbHkoQ2FmZiB+IEcyMSwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQoNCmFuZCB0aGUgc3VtbWFyeSBzdGF0aXN0aWNzLiBOb3RpY2UgdGhhdCB1c2luZyBhIHN0YXRpc3RpY2FsIG1vZGVsIGFzIHRoZSBvYmplY3QgZm9yIHRoZSAqKmZhdnN0YXRzKiogZnVuY3Rpb24gY3JlYXRlcyBhIHN0YXRzIHN1bW1hcnkgZm9yIGJvdGggZmVtYWxlcyBhbmQgbWFsZXMuDQoNCmBgYHtyfQ0KZmF2c3RhdHMoQ2FmZiB+IEcyMSwgZGF0YSA9IERhdGEzMzUwKQ0KYGBgDQoNCg0KVGhlIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgKipTbGVlcCoqOg0KDQpgYGB7cn0NCmZhdnN0YXRzKFNsZWVwIH4gRzIxLCBkYXRhID0gRGF0YTMzNTApDQpgYGANCg0KTGV0J3MgdGFrZSBhIHF1aWNrIGdsYW5jZSBhdCB0aGUgaGlzdG9ncmFtcyBhbmQgYm94IHBsb3RzIGZvciB0aGUgdHdvIHZhcmlhYmxlcy4NCg0KIyMgR3JhcGhpY2FsIENvbXBhcmlzb24gb2YgQ2FmZmVpbmU6IFlvdW5nZXIgdnMuIE9sZGVyIFN0dWRlbnRzDQoNCmBgYHtyfQ0KaGlzdG9ncmFtICh+IENhZmYgfCBHMjEgLCBkYXRhID0gRGF0YTMzNTAsIGxheW91dCA9IGMoMSwyKSkNCmJveHBsb3QoIENhZmYgfiBHMjEgLCBkYXRhID0gRGF0YTMzNTAsIGhvcml6b250YWwgPSBUUlVFLCBsYXlvdXQgPSBjKDEsMikpDQpgYGANCg0KIyMgR3JhcGhpY2FsIENvbXBhcmlzb24gb2YgU2xlZXA6IFlvdW5nZXIgdnMuIE9sZGVyIFN0dWRlbnRzDQoNCmBgYHtyfQ0KaGlzdG9ncmFtICh+IFNsZWVwIHwgRzIxICwgZGF0YSA9IERhdGEzMzUwLCBsYXlvdXQgPSBjKDEsMikpDQpib3hwbG90KCBTbGVlcCB+IEcyMSAsIGRhdGEgPSBEYXRhMzM1MCwgaG9yaXpvbnRhbCA9IFRSVUUsIGxheW91dCA9IGMoMSwyKSkNCmBgYA0KTm90ZSB0aGF0IG5vbmUgb2YgdGhlIGdyYXBoaWNhbCBhbmFseXNpcyBvciB0YWxseWluZyB3YXMgcmVxdWlyZWQgZm9yIHZlcmlmaWNhdGlvbi4gU3RpbGwsIHRoZSB2aXN1YWxpemF0aW9ucyBzaG93IGV4YWN0bHkgd2hhdCB3ZSB3b3VsZCBleHBlY3Q6IGFwcHJveGltYXRlbHkgYmVsbC1zaGFwZWQgZGlzdHJpYnV0aW9ucyBpbiBhbGwgc3ViZ3JvdXBzIHdpdGggbWVkaWFucyBzbGlnaHRseSBoaWdoZXIgZm9yICoqQ2FmZioqIGFuZCBzbGlnaHRseSBsb3dlciBmb3IgKipTbGVlcCoqIGluIHRoZSBncm91cCB3aG8gYXJlIDIxIHllYXJzIG9sZCBvciBvbGRlci4NCg0KRHVlIHRvIHRoZSByb2J1c3RuZXNzIG9mICR0JCBhbmQgY29tYmluZWQgc2FtcGxlIHNpemVzIG9mIGZhciBtb3JlIHRoYW4gNDAsIG5vIGRhdGEgY2hlY2tzIGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbi4gVGhlIHJhdGlvIG9mIHRoZSBsYXJnZXIgZ3JvdXAgc2l6ZSB0byBzbWFsbGVyIGlzICQxMDY6NTkkIG9yICQxLjc3IDogMSQuIFNpbmNlIHRoZSByYXRpbyBpcyBsZXNzIHRoYW4gJDI6MSQsIHdlIGRvIG5vdCBoYXZlIHNoYXJwbHkgdW5lcXVhbCBncm91cCBzaXplcyBhbmQsIGhlbmNlLCB3ZSBoYXZlIG5vIGlzc3VlcyB3aXRoIHRoZSBob21vZ2VuZWl0eSBhc3N1bXB0aW9uLiAoQSBxdWljayBzY2FuIG9mIHRoZSBzdW1tYXJ5IHN0YXRpc3RpY3Mgc3VnZ2VzdCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhcmUgbm90IHZlcnkgZGlmZmVyZW50LikgVGhlc2UgZGF0YSBhcmUgdmVyeSBtdWNoIGFwcHJvcHJpYXRlIGZvciAkdCQtcHJvY2VkdXJlcy4NCg0KIyMgUmVzdWx0czogKipDYWZmKiogQ29tcGFyaXNvbg0KDQpgYGB7cn0NCnQudGVzdChDYWZmIH4gRzIxLCBkYXRhID0gRGF0YTMzNTAsDQogICAgICAgYWx0ZXJuYXRpdmUgPSAibGVzcyIpDQpgYGANCg0KQmVjYXVzZSAkcCA9IDAuMDIwNzkgPCAwLjA1ID0gXGFscGhhJCwgd2UgcmVqZWN0IHRoZSBudWxsLiBFdmlkZW5jZSBzdWdnZXN0cyB0aGF0IG9sZGVyIHN0dWRlbnQgY29uc3VtZSBtb3JlIGNhZmZlaW5lIHRoYW4geW91bmdlciBzdHVkZW50cyBkbyAkKHA9MC4wMikkLg0KDQojIyBSZXN1bHRzOiAqKlNsZWVwKiogQ29tcGFyaXNvbg0KDQpgYGB7cn0NCnQudGVzdChTbGVlcCB+IEcyMSwgZGF0YSA9IERhdGEzMzUwLA0KICAgICAgIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQ0KYGBgDQoNCkJlY2F1c2UgJHAgPSAwLjAxNjU5IDwgMC4wNSA9IFxhbHBoYSQsIHdlIHJlamVjdCB0aGUgbnVsbC4gRXZpZGVuY2Ugc3VnZ2VzdHMgdGhhdCBvbGRlciBzdHVkZW50IGdldCBmZXdlciBob3VycyBvZiBzbGVlcCBvbiBhdmVyYWdlIHBlciBuaWdodCB0aGFuIHlvdW5nZXIgc3R1ZGVudHMgZG8gJChwPTAuMDIpJC4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij4gVkkuIFJhbmRvbWl6YXRpb24gVGVjaG5pcXVlcyBmb3IgSW5kZXBlbmRlbnQgU2FtcGxlcyAkdCQtdGVzdHM8L3NwYW4+DQoNCkhvdyBjYW4gd2UgZW1waXJpY2FsbHkgdGVzdCB0aGF0IHRoZSBtZWFucyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgdXNpbmcgbWFjaGluZS1iYXNlZCByYW5kb21pemF0aW9uPyBXaHkgbm90IHNodWZmbGUgYWxsIHRoZSBTbGVlcCBvYnNlcnZhdGlvbnM/IFRoYXQgd2F5LCBlYWNoIHBlcnNvbiB3aWxsIGJlIHBhaXJlZCB3aXRoIGEgcmFuZG9tbHkgcGVybXV0ZWQgb2JzZXJ2YXRpb24gZnJvbSB0aGUgc2FtcGxlLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgeW91bmdlciB0aGFuIDIxICgiTiIgZm9yICoqRzIxKiogdmFyaWFibGUpIG9yIDIxIG9yIG9sZGVyICgiWSIgZm9yICoqRzIxKiogdmFyaWFibGUpLiBXaXRoIHJhbmRvbWx5IHBlcm11dGVkIG9ic2VydmF0aW9ucywgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ3JvdXAgbWVhbnMgc2hvdWxkIGJlIGFwcHJveGltYXRlbHkgZXF1YWwuDQoNCiMjIyAxLiBEaWZmZXJlbmNlIGluIEdyb3VwIE1lYW5zDQoNCmBgYHtyfQ0KbWVhbihTbGVlcCB+IEcyMSwgZGF0YSA9IERhdGEzMzUwICkNCmBgYA0KDQpXZSBjYW4gaGF2ZSBSU3R1ZGlvIGNhbGN1bGF0ZSB0aGUgZGlmZmVyZW5jZS4gVGhlIGJyYWNrZXRzIHJlZmVyZW5jZSB0aGUgc3BlY2lmaWMgaXRlbXMgZnJvbSB0aGUgb3V0cHV0LiAoRG9uJ3Qgd29ycnkgYWJvdXQgbGVhcm5pbmcgaG93IHRvIGRvIHRoaXMgLSB5b3UgY2FuIGp1c3Qgc3VidHJhY3QgdGhlIHR3byB2YWx1ZXMgaW4gUiBvciB3aXRoIGEgY2FsY3VsYXRvci4pDQoNCmBgYHtyfQ0KbWVhbihTbGVlcCB+IEcyMSwgZGF0YSA9IERhdGEzMzUwIClbWzFdXVsxXS1tZWFuKFNsZWVwIH4gRzIxLCBkYXRhID0gRGF0YTMzNTAgKVtbMl1dWzFdDQpgYGANCiMjIyAyLiBTaHVmZmxlIE9ic2VydmF0aW9ucyBvZiBEZXBlbmRlbnQgVmFyaWFibGUNCg0KV2UncmUgdXNpbmcgYSBwZXJtdXRhdGlvbiB0ZXN0IG9uIHRoZSBkaWZmZXJlbmNlIGluIG1lYW5zIGJ5IHNodWZmbGluZyB0aGUgb2JzZXJ2YXRpb25zIG9mICoqU2xlZXAqKiwgcmFuZG9tbHkgcmVhc3NpZ25pbmcgdGhlbSB0byB0aGUgeW91bmdlciBncm91cCBvciBvbGRlci4gTGV0J3MgdXNlICoqdGFsbHkqKiB0byBjcmVhdGUgYSBmcmVxdWVuY3kgdGFibGUgZm9yIG9uZSBwb3NzaWJsZSBwZXJtdXRhdGlvbi4gQXMgYWx3YXlzLCByZS1leGVjdXRlIHRoZSBjb2RlIGJsb2NrIHNldmVyYWwgdGltZXMgdG8gc2VlIHdoYXQncyBnb2luZyBvbi4NCg0KYGBge3J9DQp0YWxseShzaHVmZmxlKFNsZWVwKSB+IEcyMSAsIGRhdGEgPSBEYXRhMzM1MCkNCmBgYA0KDQpUaGUgZmlyc3QgbGluZSBjcmVhdGVzIGEgZGF0YSBmcmFtZSB3aXRoIHRoZSBtZWFucyBmcm9tIHRoZSBzaHVmZmxlZCBkYXRhIGZvciBib3RoIHRoZSAiTiIgY29sdW1uIGFuZCB0aGUgIlkiIGNvbHVtbiAoInlvdW5nZXIgdGhhbiAyMSIgYW5kICIyMSBvciBvbGRlciIgZ3JvdXBzIHJlc3BlY3RpdmVseSkuIFRoZSBzZWNvbmQgbGluZSBhZGRzIGEgdGhpcmQgY29sdW1uIHRvIHRoZSAqKnNodWYqKiBkYXRhIGZyYW1lIGNhbGxlZCAiZGlmZiIgdG8gaW5kaWNhdGUgImRpZmZlcmVuY2UgaW4gbWVhbnMuIg0KDQpgYGB7cn0NCnNodWYgPSBkbygxMDAwKSAqIG1lYW4oc2h1ZmZsZShTbGVlcCkgfiBHMjEgLCBkYXRhID0gRGF0YTMzNTApDQpzaHVmJGRpZmYgPSBzaHVmJE4gLSBzaHVmJFkNCnNodWYNCmBgYA0KDQojIyMgMy4gRXN0aW1hdGUgJHAkLXZhbHVlDQoNCldlIG5lZWQgdG8gY291bnQgdGhlIG51bWJlciBvZiAqc2h1ZmZsZWQgbWVhbiBkaWZmZXJlbmNlcyogdGhhdCB3ZXJlIGdyZWF0ZXIgdGhhbiAuNzA1LCBiZWNhdXNlIHdlIGFyZSB0ZXN0aW5nIHRoZSBoeXBvdGhlc2lzDQokJEhfMCA6IFxtdV9ZID0gXG11X0QkJA0KJCRIX2EgOiBcbXVfWSA+IFxtdV9EJCQNCg0KV2UgY2FuIHVzZSB0aGUgKipzdW0qKiBmdW5jdGlvbiB0byBwZXJmb3JtIGNvdW50cyBieSBzZW5kaW5nIGl0IGEgbG9naWNhbCBleHByZXNzaW9uLg0KDQpgYGB7cn0NCnN1bShzaHVmJGRpZmYgPiAuNzA1KQ0KYGBgDQoNClNpbmNlIHdlIGhhZCAxLDAwMCBzaHVmZmxlZCBtZWFuIGRpZmZlcmVuY2VzLCBhbmQgMjUgb2YgdGhlbSB3ZXJlIGdyZWF0ZXIgdGhhbiB0aGUgb2JzZXJ2ZWQgbWVhbiBkaWZmZXJlbmNlLCB3ZSBlc3RpbWF0ZSB0aGF0IHRoZSAkcCQtdmFsdWUgaXMgJCRwPVxmcmFjezI1fXsxMDAwfT0wLjAyNSQkDQoNCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiBibHVlOyI+IFZJSS4gUXVpY2sgSGl0czogSW5kZXBlbmRlbnQgU2FtcGxlcyAkdCQtdGVzdHM8L3NwYW4+DQoNClRoZXJlIGFyZSBkb3plbnMgb2YgcG9zc2liaWxpdGllcyB3aXRoaW4gdGhlIERhdGEzMzUwIHRvIHJ1biBpbmRlcGVuZGVudCBzYW1wbGVzICR0JC10ZXN0cyB1c2luZyAyLWxldmVsIGdyb3VwaW5nIHZhcmlhYmxlcyBzdWNoIGFzIGJpb2xvZ2ljYWwgc2V4IG9yIHRoZSAqKkcyMSoqIHZhcmlhYmxlLiBOb3QgYWxsIGh5cG90aGVzaXMgdGVzdHMgZmluZCBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFyaWFibGVzLiBUaGUgZGF0YSBzZXQgaXMgbGFyZ2UgZW5vdWdoIHRoYXQgdGhlIHZlcmlmaWNhdGlvbnMgd2lsbCBhbGwgd29yayBvdXQuIFlvdSBzaG91bGQgdHJ5IHNldmVyYWwuIEkgaGF2ZSBpbmNsdWRlZCBhIGZldyBkaWZmZXJlbnQgZXhhbXBsZXMgYmVsb3cuDQoNCiMjIERvIGZlbWFsZXMgb3IgbWFsZXMgZXhwZXJpZW5jZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIE9DRD8NCg0KYGBge3J9DQp0LnRlc3QoT0NEIH4gU2V4LCBkYXRhID0gRGF0YTMzNTApDQpgYGANCldlIHVzZSBhIHR3by10YWlsZWQgdGVzdCBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgbm8gcmVhc29uIHRvIGJlbGlldmUgZWl0aGVyIGZlbWFsZXMgbWlnaHQgaGF2ZSBoaWdoZXIgbGV2ZWxzLCBub3Igd291bGQgbWFsZXMuIEEgdHdvLXRhaWxlZCB0ZXN0IGlzIGxlc3Mgc2Vuc2l0aXZlLCBidXQgaGFzIHRoZSBhZGRlZCBmbGV4aWJpbGl0eSBvZiBmaW5kaW5nIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGluIG1vcmUgZXhwbG9yYXRvcnkgc2l0dWF0aW9ucy4gV2UgZmFpbCB0byByZWplY3QgdGhlIG51bGwgYmVjYXVzZSAkcD0uMjIkLCBhIHZhbHVlIGZhciB0b28gbGFyZ2UgdG8gc3VnZ2VzdCB0aGUgbnVsbCBpcyBpbmNvcnJlY3QuIFRoZXJlIGlzIG5vIGV2aWRlbmNlIHRvIHN1Z2dlc3QgYSBkaWZmZXJlbmNlIGluIE9DRCBpbmRpY2F0b3JzIGJhc2VkIHVwb24gYmlvbG9naWNhbCBzZXguDQoNCiMjIEFyZSB5b3VuZ2VyIHN0dWRlbnRzIG1vcmUgcGxheWZ1bD8NCg0KYGBge3J9DQp0LnRlc3QoUGxheSB+IEcyMSwgZGF0YSA9IERhdGEzMzUwLA0KICAgICAgIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiKQ0KYGBgDQpFdmVuIHVzaW5nIHRoZSBtb3JlIHNlbnNpdGl2ZSBvbmUtdGFpbGVkIGh5cG90aGVzaXMsIHdlIGZpbmQgbm8gZXZpZGVuY2UgdGhhdCB5b3VuZ2VyIHN0dWRlbnRzIGFyZSBtb3JlIHBsYXlmdWwgJChwPTAuMjkpJC4NCg0KIyMgRG8gbWFsZXMgYXQgTm9ydGggR2VvcmdpYSB1c2UgbW9yZSBjb3BpbmcgaHVtb3IgdGhhbiBmZW1hbGVzPw0KDQpgYGB7cn0NCnQudGVzdChDSFMgfiBTZXgsIGRhdGEgPSBEYXRhMzM1MCwNCiAgICAgICBhbHRlcm5hdGl2ZSA9ICJsZXNzIikNCmBgYA0KV2UgZmluZCBhIHN0YXJrIGRpZmZlcmVuY2UgaW4gdGhlIHVzZSBvZiA8YSBocmVmID0gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVtb3Jfc3R5bGVzI1RoZV9Db3BpbmdfSHVtb3JfU2NhbGU+Q29waW5nIEh1bW9yPC9hPiBhdCBOb3J0aCBHZW9yZ2lhIGJhc2VkIHVwb24gYmlvbG9naWNhbCBzZXggJChwID0gMC4wMDAzKSQuDQoNCiMjIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlZJSUkuICBBTk9WQTwvc3Bhbj4NCg0KRm9yIGFueSBncm91cGluZyB2YXJpYWJsZXMgd2l0aCB0aHJlZSBvciBtb3JlIGxldmVscywgd2UgbXVzdCB1c2UgQU5PVkEuIFRoZSAkdCQtdGVzdCBjb21wYXJpc29ucywgd2hpbGUgcm9idXN0IGFuZCB1c2VmdWwsIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHRoZSBvbmUtc2FtcGxlIGFuZCB0d28tc2FtcGxlIGNhc2VzLiBSb25hbGQgRmlzY2hlciwgYWxvbmcgd2l0aCBwaW9uZWVyaW5nIHRoZSB1c2Ugb2YgdGhlIG51bGwgaHlwb3RoZXNpcywgYWxzbyBkZXZlbG9wZWQgQU5PVkEgd2hpY2ggZGVzY3JpYmVzIGEgZ3JvdXAgb2YgbWV0aG9kcywgbm90IGEgc2luZ2xlIHRlc3QuDQoNCkFOT1ZBIGlzIG91ciBmaXJzdCB0d28tc3RlcCBwcm9jZWR1cmUuIElmIHdlIHJlamVjdCB0aGUgbnVsbCBpbiBhbiBBTk9WQSwgd2UgbXVzdCBmb2xsb3cgaXQgdXAgd2l0aCBhICpwb3N0IGhvYyogdGVzdCB0byBmZXJyZXR0IG91dCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZ3JvdXBzLg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpjZW50ZXI7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAxMHB4IDE1cHggMTBweCI+DQojIyMgRG8gTGV2ZWxzIG9mIE5ldXJvdGljaXNtIERlcGVuZCB1cG9uIFByaW1hcnkgSHVtb3IgU3R5bGU/DQpQcmltYXJ5IEh1bW9yIFN0eWxlcyBhcmUgZGVmaW5lZCBiYXNlZCB1cG9uIHJlc3VsdHMgZnJvbSB0aGUgDQo8YSBocmVmID0gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVtb3Jfc3R5bGVzI1RoZV9IdW1vcl9TdHlsZXNfUXVlc3Rpb25uYWlyZV8oSFNRKT5IdW1vciBTdHlsZSBRdWVzdGlvbm5haXJlPC9hPi4gVGhlIGZvdXIgcHJpbWFyeSBodW1vciBzdHlsZXMgaW4gb3VyIGRhdGEgZnJhbWUgRGF0YSAzMzUwIGFyZSBBZmZpbGlhdGl2ZSAoSFNBRiksIEFnZ3Jlc3NpdmUgKEhTQUcpLCBTZWxmLUVuaGFuY2luZyAoSFNTRSkgYW5kIFNlbGYtRGVmZWF0aW5nIChIU1NEKS4gVGhlIHZhcmlhYmxlIE5ldXJvIG1lYXN1cmVzIHRoZSA8YSBocmVmID0gaHR0cHM6Ly93d3cud2VibWQuY29tL21lbnRhbC1oZWFsdGgvbmV1cm90aWMtYmVoYXZpb3Itb3ZlcnZpZXcjMT5pbnRlbnNpdHkgb2YgbmV1cm90aWMgcGVyc29uYWxpdGllczwvYT4uIFRlc3Qgd2hldGhlciB0aGUgdmFyaWFibGUgKk5ldXJvKiBkaWZmZXJzIGJhc2VkIHVwb24gUHJpbWFyeSBIdW1vciBTdHlsZS4NCjwvZGl2Pg0KRm9yIEFOT1ZBIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdGhhdCBhbGwgZm91ciBzYW1wbGVzIHdlcmUgZHJhd24gZnJvbSBpZGVudGljYWwgZGlzdHJpYnV0aW9ucywgc28gdGhlIGdyb3VwIG1lYW5zIHdvdWxkIGJlIGVxdWFsLg0KJCRcYmVnaW57YWxpZ24qfUhfMCAmOiBcbXVfQUY9XG11X0FHPVxtdV9TRT1cbXVfU0RcXCBIX2EgJjogXHRleHR7QXQgbGVhc3Qgb25lIGlzIGRpZmZlcmVudC59XGVuZHthbGlnbip9JCQNClRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIGlzIG5vdCB0aGF0IGFsbCB0aGUgZ3JvdXAgbWVhbnMgYXJlIHVuZXF1YWwuIFRoZSBsb2dpY2FsIG9wcG9zaXRlIG9mIGFsbCBncm91cCBtZWFucyBiZWluZyBlcXVhbCBpcyB0aGF0IGF0IGxlYXN0IG9uZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcmVzdC4gU2F5aW5nIHRoaXMgYWx0ZXJuYXRpdmUgaW4gd29yZHMgaXMgZmluZSwgdGhvdWdoIHNvbWUgZG8gcHJlZmVyIHRvIHVzZSBzeW1ib2xzOg0KJCRIX2EgOiBcbXVfaSBcbmVxIFxtdV9qIFxoc3BhY2V7Mm1tfVx0ZXh0e2ZvciBzb21lIH0xIFxsZXEgaSxqIFxsZXEgNCQkDQoNCldlIHdpbGwgY3JlYXRlIGEgbGluZWFyIG1vZGVsIHVzaW5nIHRoZSBmdW5jdGlvbiAqKmxtKiouIEFOT1ZBIGFsbG93cyB0aGUgc3RhbmRhcmQgc3RhdGlzdGljYWwgbW9kZWxpbmcgbm90YXRpb24gd2UgaGF2ZSBiZWVuIHVzaW5nOg0KJCRcdGV4dHtOZXVyb30gXHNpbSBcdGV4dHtQSFN9JCQNCndoaWNoIGluZGljYXRlcyB0aGF0ICoqTmV1cm8qKiBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIHdlIGFyZSBhbmFseXppbmcgdXNpbmcgKipQSFMqKiBhcyB0aGUgZ3JvdXBpbmcgdmFyaWFibGUgKHJlYWQgIk5ldXJvIGJ5IFBIUyIpLiBXZSB3aWxsIHNhdmUgdGhlIG1vZGVsIGFzICAqKm1vZCoqIChzaG9ydCBmb3IgbW9kZWwpIHNvIHdlIGNhbiByZXVzZSB0aGUgbW9kZWwgb3V0cHV0IGZvciBBTk9WQSBhbmQgYW55ICpwb3N0IGhvYyogdGVzdGluZyBuZWVkZWQuDQoNCkxldCdzIHNjYW4gdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgdGhlIGdyb3VwcyBhcyB3ZSBjb25zaWRlciB2ZXJpZmljYXRpb24uDQoNCmBgYHtyfQ0KZmF2c3RhdHMoTmV1cm8gfiBQSFMsIGRhdGEgPSBEYXRhMzM1MCkNCmBgYA0KVGhlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciBBTk9WQSBwcm9jZWR1cmVzIGJlY2F1c2UgdGhlcmUgYXJlIGNlcnRhaW5seSBmYXIgbW9yZSB0aGFuIDIwIHRvdGFsIG9ic2VydmF0aW9ucywgYW5kIHRoZSBsYXJnZXN0IHRvIHNtYWxsZXN0IGdyb3VwIHNpemUgcmF0aW8gaXMgJDQzIDogMzEkIHdoaWNoIHJlZHVjZXMgdG8gJDEuMzkgOiAxJC4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgZG8gYXBwZWFyIHRvIHBhaXIgdXAgaW50byB0d28gZGlmZmVyZW50IHJhbmdlcywgYnV0IHNpbmNlIHdlIGRvIG5vdCBoYXZlIHNoYXJwbHkgdW5lcXVhbCBncm91cCBzaXplcywgd2Ugc2hvdWxkIGhhdmUgbm8gcHJvYmxlbSB3aXRoIGxhY2sgb2YgaG9tb2dlbmVpdHkgb2YgdGhlIHZhcmlhbmNlcy4NCg0KVXNpbmcgYW4gJFxhbHBoYSA9IDAuMDUkIGxldmVsIG9mIHNpZ25pZmljYW5jZSwgd2UgcnVuIHRoZSBBTk9WQSBhcHAuDQoNCmBgYHtyfQ0KbW9kID0gbG0oTmV1cm8gfiBQSFMgLCBkYXRhID0gRGF0YTMzNTApDQphbm92YShtb2QpDQpgYGANCg0KU2luY2UgJHAgPSAwLjAwMDAwMjE1OCQsIHdlIHJlamVjdCB0aGUgbnVsbC4gV2UgaGF2ZSBzdHJvbmcgdmVyeSBzdHJvbmcgZXZpZGVuY2UgZm9yIGEgZGlmZmVyZW5jZSBpcyBpbiBhdCBsZWFzdCBzb21lIG9mIHRoZSBncm91cCBtZWFucywgYnV0IHdlIGRvbid0IGtub3cgZm9yIHN1cmUgd2hlcmUgdGhvc2UgZGlmZmVyZW5jZXMgbGllLiANCg0KIyMgVHVrZXkgKlBvc3QgSG9jKiBUZXN0aW5nDQoNClNpbmNlIHdlIGhhdmUgcmVqZWN0ZWQgdGhlIG51bGwsIHdlIG5lZWQgdG8gcnVuIGEgKnBvc3QgaG9jKiB0ZXN0LiBJbiB0aGlzIGNsYXNzLCB3ZSB3aWxsIHVzZSB0aGUgbW9zdCBjb21tb24gb2Ygc2V2ZXJhbCAqcG9zdCBob2MqIG9wdGlvbnMsIFR1a2V5J3MgSFNELiBIU0Qgc3RhbmRzIGZvciAiaG9uZXN0bHkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4iDQoNCmBgYHtyfQ0KVHVrZXlIU0QobW9kLCBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KVGhlIFR1a2V5ICpwb3N0IGhvYyogdGVzdCBkb2VzIGFsbCBwYWlyd2lzZSBjb21wYXJpc29ucyBvZiBncm91cCBtZWFucyBhbmQgZGV0ZXJtaW5lcyB3aGljaCBwYWlycyBhcmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIEhlcmUgd2UgaGF2ZSBmb3VyIGNob29zZSB0d28gY29tcGFyaXNvbnMgdG8gbWFrZTogJFxiaW5vbXs0fXsyfT02JC4NCg0KVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQgd2F5cyB0byB0ZWxsIGlmIHRoZSBncm91cCBtZWFucyBkaWZmZXIgc2lnbmlmaWNhbnRseS4gV2UgY2FuIGNoZWNrIHRoZSBmaW5hbCBjb2x1bW4gYW5kIGxvb2sgZm9yICRwJC12YWx1ZXMgdGhhdCBhcmUgbGVzcyB0aGFuICRcYWxwaGEkLiBPciB3ZSBjYW4gaW5zcGVjdCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2hpY2ggYXJlIGVzdGltYXRpbmcgdGhlICoqZGlmZmVyZW5jZSoqIGJldHdlZW4gZ3JvdXAgbWVhbnMuIElmIHRoZSBncm91cHMgYXJlIHNpZ25pZmljYW50bHkgZGlmZmVyZW50LCB0aGVuIHRoZSBjb25maWRlbmNlIGludGVydmFsIHdpbGwgbm90IGluY2x1ZGUgemVyby4gV2hpbGUgd2UgY2FuIGluc3BlY3QgdGhlIFR1a2V5IEhTRCB0YWJsZSBmb3IgY29uZmlkZW5jZSBpbnRlcnZhbHMgd2hvc2UgImx3ciIgYW5kICJ1cHIiIGVuZHBvaW50cyBhcmUgYm90aCB0aGUgc2FtZSBzaWduLCBidXQgYW4gKiptcGxvdCoqIG9mIHRoZSBUdWtleUhTRCBvdXRwdXQgd2lsbCBwcm9kdWNlIGEgZ3JhcGggdGhhdCBzaG93cyBldmVyeXRoaW5nIHF1aXRlIGNsZWFybHkuDQoNCmBgYHtyfQ0KbXBsb3QoVHVrZXlIU0QobW9kLCBjb25mLmxldmVsID0gMC45NSkpDQpgYGANCg0KDQpFaXRoZXIgd2F5IHdlIGZpbmQgdGhlIGZvbGxvd2luZyB0aHJlZSBzaWduaWZpY2FudCBkaWZmZXJlbmNlczoNCg0KJCRcYmVnaW57YXJyYXl9e2NjY2xjY30NClx0ZXh0YmZ7Q29tcGFyaXNvbn0gJiYgXHRleHRiZntTaWduaWZpY2FuY2V9ICYmIFx0ZXh0YmZ7UGF0dGVybn1cXCBcaGxpbmUNClx0ZXh0e0hTU0QgdnMuIEhTQUZ9ICYmIHAgPSAwLjAwMDg1MzAgJiYgXHRleHR7U0R9ID4gXHRleHR7QUZ9XFwNClx0ZXh0e0hTU0UgdnMuIEhTQUd9ICYmIHAgPSAwLjAxMDE1NTMgJiYgXHRleHR7U0V9IDwgXHRleHR7QUd9XFwNClx0ZXh0e0hTU0UgdnMuIEhTU0R9ICYmIHAgPSAwLjAwMDAwMTggJiYgXHRleHR7U0V9IDwgXHRleHR7U0R9DQpcZW5ke2FycmF5fSQkDQoNCkV2aWRlbmNlIGZyb20gdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHN1Z2dlc3RzIHRoYXQgc3ViamVjdHMgd2l0aCBzZWxmLWRlZmVhdGluZyBwcmltYXJ5IGh1bW9yIHN0eWxlcyBzY29yZWQgc2lnbmlmaWNhbnRseSBoaWdoZXIgb24gdGhlIG5ldXJvdGljaXNtIG1lYXN1cmUgdGhhbiB0aG9zZSB3aXRoIGFmZmlsaWF0aXZlLiBTdWJqZWN0cyB3aXRoIHNlbGYtZW5oYW5jaW5nIHByaW1hcnkgaHVtb3Igc3R5bGVzIHNjb3JlZCBzaWduaWZpY2FudGx5IGxvd2VyIG9uIG5ldXJvdGljaXNtIHRoYW4gdGhvc2Ugd2l0aCBhZ2dyZXNzaXZlIG9yIHNlbGYtZGVmZWF0aW5nIHByaW1hcnkgaHVtb3Igc3R5bGVzLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPiBJWC4gQU5PVkEgUXVpY2sgSGl0czwvc3Bhbj4NCg0KVGhpcyBtb2R1bGUgZGVzY3JpYmVzIG1ldGhvZHMgdGhhdCBhcmUgYXQgdGhlIGhlYXJ0IG9mIHF1YW50aXRhdGl2ZSBpbnF1aXJ5LiBBcyB3aXRoIHRoZSAkdCQtdGVzdHMsIGEgZ3JvdXAgb2YgZXhhbXBsZXMgd2l0aCBtaW5pbWFsIGRldGFpbHMgYXJlIGluY2x1ZGVkIHRvIHByb3ZpZGUgbW9yZSBicmVhZHRoIG9mIGV4cGVyaWVuY2Ugd2l0aCB0aGVzZSBwb3dlcmZ1bCBhbmQgaW1wb3J0YW50IGFuYWx5dGljIHRvb2xzLg0KDQojIyBEb2VzIEdQQSBhZmZlY3QgU2VhdGluZyBQcmVmZXJlbmNlIGluIENsYXNzPw0KDQpUaGUgbnVsbCBoeXBvdGhlc2lzIGlzIHRoYXQgdGhlIGF2ZXJhZ2UgR1BBIGlzIGlkZW50aWNhbCBpbiBhbGwgdGhyZWUgc2VhdGluZyBwcmVmZXJlbmNlIGdyb3VwczogRnJvbnQsIE1pZGRsZSBhbmQgQmFjay4gVGhlIHBhdHRlcm4gb2YgbWVhbnMgc2VlbiBpbiB0aGUgc3VtbWFyeSBzdGF0cyBzaG93cyBhIHNsaWdodGx5IGhpZ2hlciBHUEEgZm9yIHN0dWRlbnRzIHByZWZlcnJpbmcgRnJvbnQgKDMuMzMpIGNvbXBhcmVkIHRvIEJhY2sgKDMuMjUpIGFuZCBNaWRkbGUgKDMuMjApLiBZZXQsIHRoZSBkaWZmZXJlbmNlcyBhcmUgbm90IHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGF0IHRoZSBkZWZhdWx0ICRcYWxwaGEgPSAwLjA1JCBsZXZlbC4gVGhlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciBBTk9WQSBtZXRob2RzLCBhbmQgdGhlIHNhbXBsZSBzaXplIGFuZCBzdGF0aXN0aWNhbCBkZXNpZ24gYXJlIHN1ZmZpY2llbnRseSBzZW5zaXRpdmUuIFdlIHRodXMgZmluZCBubyBldmlkZW5jZSBzZWF0aW5nIHByZWZlcmVuY2UgaXMgYWZmZWN0ZWQgYnkgR1BBLiBTaW5jZSB3ZSBmYWlsIHRvIHJlamVjdCB0aGUgbnVsbCwgbm8gKnBvc3QgaG9jKiBUdWtleSBpcyBuZWVkZWQuDQoNCmBgYHtyfQ0KbW9kMiA9IGxtKEdQQSB+IFNpdENsYXNzLCBkYXRhID0gRGF0YTMzNTApDQpmYXZzdGF0cyhHUEEgfiBTaXRDbGFzcywgZGF0YSA9IERhdGEzMzUwKQ0KYW5vdmEobW9kMikNCmBgYA0KIyMgRG8gTGV2ZWxzIG9mIE9wdGltaXNtIERpZmZlciBCYXNlZCBvbiBQcmltYXJ5IEh1bW9yIFN0eWxlDQoNCkJlY2F1c2UgU2VsZi1FbmhhbmNpbmcgaHVtb3IsIG9uZSBvZiB0aGUgZm91ciBodW1vciBzdHlsZXMsIGlzIHJlbGF0ZWQgdG8gY29waW5nIGh1bW9yLCB3ZSBoYXZlIHJlYXNvbiB0byBiZWxpZXZlIGEgY29ubmVjdGlvbiBtaWdodCBleGlzdC4gVGhlIGRhdGEgYXJlIGFwcHJvcHJpYXRlIGZvciBBTk9WQSwgYW5kIHdlIHJlamVjdCB0aGUgbnVsbCAkKHA9MC4wMDE4NSkkIGluZGljYXRpbmcgYSAqcG9zdCBob2MqIFR1a2V5IEhTRCBwcm9jZWR1cmUgaXMgbmVlZGVkLg0KDQpgYGB7cn0NCm1vZDMgPSBsbShPcHQgfiBQSFMsIGRhdGEgPSBEYXRhMzM1MCkNCmZhdnN0YXRzKE9wdCB+IFBIUywgZGF0YSA9IERhdGEzMzUwKQ0KYW5vdmEobW9kMykNCmBgYA0KDQpgYGB7cn0NClR1a2V5SFNEKG1vZDMpDQptcGxvdChUdWtleUhTRChtb2QzKSkNCmBgYA0KV2UgZmluZCB0d28gb2YgdGhlIHBhaXJ3aXNlIGRpZmZlcmVuY2VzIHNpZ25pZmljYW50OiB0aGF0IHRob3NlIHdpdGggc2VsZi1lbmhhbmNpbmcgcHJpbWFyeSBodW1vciBzdHlsZXMgc2NvcmUgaGlnaGVyIGZvciBvcHRpbWlzbSBjb21wYXJlZCB0byB0aGUgdGhvc2Ugd2l0aCBhZ2dyZXNzaXZlIG9yIHNlbGYtZGVmZWF0aW5nIHByaW1hcnkgaHVtb3Igc3R5bGVzLg0KDQojIyBObyBDbHVlIHdoYXQgdGhpcyBNZWFucw0KDQpXaGlsZSB0aGUgJHAkLXZhbHVlIGlzIGp1c3Qgc2xpZ2h0bHkgbGFyZ2VyIHRoYW4gdGhlIGRlZmF1bHQgJFxhbHBoYSQsIHRoZSBuZWFyLXJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZXNlIHZhcmlhYmxlcyBpcyBvZGQuIElzIHRoZXJlIGEgcGF0dGVybiBsdXJraW5nIGhlcmU/IEkgZG9uJ3Qga25vdywgYnV0IGl0IHdvdWxkIGJlIGludGVyZXN0aW5nIHRvIHNlZSBhIGZvbGxvdy1vbiBzdHVkeSB0byBzZWUgaWYgYSBwYXR0ZXJuIGVtZXJnZXMuDQoNCmBgYHtyfQ0KbW9kNCA9IGxtKFR4UmVsIH4gRnJpZW5kcywgZGF0YSA9IERhdGEzMzUwKQ0KZmF2c3RhdHMoVHhSZWwgfiBGcmllbmRzLCBkYXRhID0gRGF0YTMzNTApDQphbm92YShtb2Q0KQ0KbXBsb3QoVHVrZXlIU0QobW9kNCwgY29uZi5sZXZlbCA9IC45KSkNCmBgYA0KDQpVc2luZyBhIHZlcnkgbGliZXJhbCAkXGFscGhhID0wLjEkLCB3ZSBmaW5kIHRoYXQgcGFydGljaXBhbnRzIHRoYXQgc2FpZCB0aGV5IG1hZGUgZnJpZW5kcyBtb3N0IGVhc2lseSAgd2l0aCBlaXRoZXIgc2V4IChubyBkaWZmZXJlbmNlKSBzY29yZWQgaGlnaGVyIHRoZSBUb3hpYyBSZWxhdGlvbnNoaXAgQmVsaWVmcyBzY2FsZSB0aGFuIGRpZCB0aG9zZSB3aG8gc2FpZCB0aGV5IG1hZGUgZnJpZW5kcyBtb3N0IGVhc2lseSB3aXRoIHRob3NlIG9mIHdobyB3ZXJlIG9mIHRoZSBzYW1lIGJpb2xvZ2ljYWwgc2V4LiANCg0KVG8gcmVwZWF0LCB0aGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHN1Y2ggYSBoaWdoIHZhbHVlIGZvciB0aGUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLCBzbyB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBwYXR0ZXJuIGluIHRoaXMgZGF0YSwgb25seSBhIHZhZ3VlIGhpbnQgb2YgYSBwYXR0ZXJuIHRoYXQgbWF5IHBvc3NpYmx5IGV4aXN0LiBUaGlzIGlzIGhvdyBzY2llbmNlIHdvcmtzLiBDb3VsZCBhbiBleHBsb3JhdG9yeSBzdHVkeSBiZSBjcmVhdGVkIHRvIGV4cGxvcmUgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gaG93IHdlIG1ha2UgZnJpZW5kcyBhbmQgb3VyIHJlbGF0aW9uc2hpcCBiZWxpZWZzPyBZZXMsIG1vc3QgY2VydGFpbmx5LiBXb3VsZCBpdCB5aWVsZCByZXN1bHRzPyBZZXMsIGJlY2F1c2UgZXZlbiBpZiB3ZSBkbyB0aGUgc3R1ZHkgYW5kIGZhaWwgdG8gZmluZCBhbnkgc2lnbmlmaWNhbnQgY29ubmVjdGlvbnMgKGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsKSwgd2UgdGhlbiBoYXZlIHNvbWUgY29uZmlybWF0aW9uIHRoYXQsIHBlcmhhcHMsIG5vIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlc2UgdmFyaWFibGVzIGFyZSBhY3R1YWxseSB0aGVyZS4NCg0KUG9uZGVyaW5nIGEgc2NpZW50aWZpYyBhcHByb2FjaCB0byBleHBsb3JpbmcgdGhpcyBxdWVzdGlvbiBpcyBhIHBlcmZlY3QgbWVudGFsIGV4ZXJjaXNlIHRvIGV4cGxvcmUgd2hhdCBpdCBtZWFucyB0byBkbyBzdGF0aXN0aWNzLWJhc2VkIGlucXVpcnkuIEFzIEZpc2NoZXIgcG9pbnRlZCBvdXQsIHdlIGNhbiBuZXZlciBwcm92ZSB0aGUgbnVsbCBoeXBvdGhlc2lzLCBvbmx5IGZhbHNpZnkgaXQuIFRodXMsIGV2ZW4gdHdvIG9yIHRocmVlIHZhbGlkYXRpb24gc3R1ZGllcyB3aGVyZSB3ZSBmYWlsZWQgdG8gcmVqZWN0IHRoZSBudWxsIG1heSBub3QgcHJvdmlkZSBlbm91Z2ggZXZpZGVuY2UgdGhhdCBubyByZWxhdGlvbnNoaXAgZXhpc3RzLg0KDQojIyBEbyBOYXJjaXNzaXNtIExldmVscyBWYXJ5IEJhc2VkIHVwb24gUHJpbWFyeSBIdW1vciBTdHlsZT8NCg0KVGhlIHNob3J0IGFuc3dlciBpcyAiWWVzLCB0aGV5IGRvLCIgJChwPTAuMDA4NzM1KSQuDQoNCmBgYHtyfQ0KbW9kNSA9IGxtKE5hcmMgfiBQSFMsIGRhdGEgPSBEYXRhMzM1MCkNCmZhdnN0YXRzKE5hcmMgfiBQSFMsIGRhdGEgPSBEYXRhMzM1MCkNCmFub3ZhKG1vZDUpDQpgYGANClRvIGZpbmQgdGhlIHBhaXJ3aXNlIGRpZmZlcmVuY2VzLCBhIFR1a2V5SFNEIGlzIHJlcXVpcmVkLg0KYGBge3J9DQpUdWtleUhTRChtb2Q1KQ0KbXBsb3QoVHVrZXlIU0QobW9kNSkpDQpgYGANCg0KVGhlIG1vc3Qgc3RyaWtpbmcgZGlmZmVyZW5jZSBpcyB0aGF0IHRob3NlIHdpdGggYWdncmVzc2l2ZSBwcmltYXJ5IGh1bW9yIHN0eWxlcyBoYXZlIHNpZ25pZmljYW50bHkgaGlnaGVyIGxldmVscyBvZiBuYXJjaXNzaXNtIHRoYW4gdGhvc2Ugd2l0aCBzZWxmLWRlZmVhdGluZyBwcmltYXJ5IGh1bW9yIHN0eWxlcyAkKHAgPSAwLjAwOSkkIGFuZCB0aG9zZSB3aXRoIHNlbGYtZGVmZWF0aW5nIHByaW1hcnkgaHVtb3Igc3R5bGVzICQocD0wLjA0NikkIA0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlguIEV4ZXJjaXNlczwvc3Bhbj4NCg0KMS4gVXNlIHRoZSB0aHJpbGwtc2Vla2luZyB2YXJpYWJsZSAqKlRocmlsbCoqIGZyb20gdGhlIERhdGEzMzUwIGRhdGEgZnJhbWUgdG8gdGVzdCBmb3IgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4geW91bmdlciBzdHVkZW50cyBhbmQgb2xkZXIgc3R1ZGVudHMgKCpHMjEqIHZhcmlhYmxlLCB3aXRoICJZIiBtZWFuaW5nIHllcywgMjEgb3Igb2xkZXIpLiBUZXN0IHdoZXRoZXIgdGhyaWxsLXNlZWtpbmcgbGV2ZWxzIGFyZSBoaWdoZXIgZm9yIHlvdW5nZXIgc3R1ZGVudHMgYXQgdGhlIDAuMDUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLg0KDQoyLiBVc2UgdGhlIHRveGljIHJlbGF0aW9uc2hpcCBiZWxpZWZzIHZhcmlhYmxlICoqVHhSZWwqKiBmcm9tIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lIHRvIHRlc3QgZm9yIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIGZlbWFsZXMgYW5kIG1hbGVzICgqU2V4KiB2YXJpYWJsZSkuIFVzZSB0aGUgMC4wNSBsZXZlbCBvZiBzaWduaWZpY2FuY2UuDQoNCjMuIFVzZSB0aGUgQW54aWV0eSB2YXJpYWJsZSAqKkFueCoqIGZyb20gdGhlIERhdGEzMzUwIGRhdGEgZnJhbWUgdG8gdGVzdCBmb3IgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZmVtYWxlcyBhbmQgbWFsZXMgKCpTZXgqIHZhcmlhYmxlKS4gVXNlIHRoZSAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCg0KNC4gVXNlIHRoZSBOZXVyb3RpY2lzbSB2YXJpYWJsZSAqKk5ldXJvKiogZnJvbSB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZSB0byB0ZXN0IGZvciBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgYmV0d2VlbiB0aG9zZSBpbnZvbHZlZCBpbiBzb2NpYWwgKipHcmVlayoqIGZyYXRlcm5pdGllcyBhbmQgc29yb3JpdGllcy4gVXNlIHRoZSAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZS4NCg0KNS4gVXNlIHRoZSBOZXVyb3RpY2lzbSB2YXJpYWJsZSAqKk5ldXJvKiogZnJvbSB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZSB0byB0ZXN0IGZvciBhIHNpZ25pZmljYW5jZSBkaWZmZXJlbmNlIGluIGxldmVscyBvZiBOZXVyb3RpY2lzbSAgYmFzZWQgdXBvbiBQcmltYXJ5IEh1bW9yIFN0eWxlICgqKlBIUyoqIHZhcmlhYmxlKS4gVXNlIHRoZSAwLjA1IGxldmVsIG9mIHNpZ25pZmljYW5jZSwgYW5kIGNvbmR1Y3QgYSAqcG9zdCBob2MqIFR1a2V5IEhTRCB0ZXN0IGlmIG5lZWRlZCwgaW5jbHVkaW5nIGFuICoqbXBsb3QqKi4NCg0KNi4gVXNlIHRoZSAqKndlaWdodCoqIHZhcmlhYmxlIGZyb20gdGhlIGJ1aWx0LWluIFIgZGF0YSBmcmFtZSAqKkNoaWNrV2VpZ2h0KiogdG8gdGVzdCBmb3IgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIHRoZSBncm93dGggb2YgYmFieSBjaGlja3MgYmFzZWQgdXBvbiB0aGUgZ3JvdXBpbmcgdmFyaWFibGUgKipEaWV0KiouIFVzZSB0aGUgMC4wMSBsZXZlbCBvZiBzaWduaWZpY2FuY2UsIGFuZCBjb25kdWN0IGEgKnBvc3QgaG9jKiBUdWtleSBIU0QgdGVzdCBpZiBuZWVkZWQsIGluY2x1ZGluZyBhbiAqKm1wbG90KiouDQoNCjcuIFVzZSB0aGUgU2VsZi1Fc3RlZW0gdmFyaWFibGUgKipTRSoqIGZyb20gdGhlIERhdGEzMzUwIGRhdGEgZnJhbWUgdG8gdGVzdCBmb3IgYSBzaWduaWZpY2FuY2UgZGlmZmVyZW5jZSBpbiBsZXZlbHMgb2YgU2VsZi1Fc3RlZW0gIGJhc2VkIHVwb24gUHJpbWFyeSBIdW1vciBTdHlsZSAoKipQSFMqKiB2YXJpYWJsZSkuIFVzZSB0aGUgMC4wNSBsZXZlbCBvZiBzaWduaWZpY2FuY2UsIGFuZCBjb25kdWN0IGEgKnBvc3QgaG9jKiBUdWtleSBIU0QgdGVzdCBpZiBuZWVkZWQsIGluY2x1ZGluZyBhbiAqKm1wbG90KiouDQoNCjguIFVzZSB0aGUgKipjb3VudCoqIHZhcmlhYmxlIGZyb20gdGhlIGJ1aWx0LWluIFIgZGF0YSBmcmFtZSAqKkluc2VjdFNwcmF5cyoqIHRvIHRlc3QgZm9yIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiB0aGUgbnVtYmVyIG9mIGluc2VjdHMgY291bnRlZCBpbiBhIGNlcnRhaW4gYXJlYSBiYXNlZCBvbiB0aGUgdHlwZSBvZiBpbnNlY3RpY2lkZSB1c2VkLiBUaGUgdmFyaWFibGUgKipzcHJheSoqIGlzIHRoZSBncm91cGluZyB2YXJpYWJsZS4gVXNlIHRoZSAwLjAxIGxldmVsIG9mIHNpZ25pZmljYW5jZSwgYW5kIGNvbmR1Y3QgYSAqcG9zdCBob2MqIFR1a2V5IEhTRCB0ZXN0IGlmIG5lZWRlZCwgaW5jbHVkaW5nIGFuICoqbXBsb3QqKi4NCg0KOS4gVXNlIHRoZSBBZHVsdCBQbGF5ZnVsbmVzcyB2YXJpYWJsZSAqKlBsYXkqKiBmcm9tIHRoZSBEYXRhMzM1MCBkYXRhIGZyYW1lIHRvIHRlc3QgZm9yIGEgc2lnbmlmaWNhbmNlIGRpZmZlcmVuY2UgaW4gbGV2ZWxzIG9mIFBsYXlmdWxuZXNzIGJhc2VkIHVwb24gdGhlIEZyaWVuZC1tYWtpbmcgdmFyaWFibGUgKCoqRnJpZW5kcyoqKSB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5kaXZpZHVhbCBpcyBtb3N0IGNvbWZvcnRhYmxlIG1ha2luZyBmcmllbmRzIHdpdGggbWVtYmVycyBvZiB0aGUgc2FtZSBvciBvcHBvc2l0ZSBzZXgsIG9yIGlmIHRoZSBwcmVmZXJlbmNlIGlzIGVxdWFsLiBVc2UgdGhlIDAuMDUgbGV2ZWwgb2Ygc2lnbmlmaWNhbmNlLCBhbmQgY29uZHVjdCBhICpwb3N0IGhvYyogVHVrZXkgSFNEIHRlc3QgaWYgbmVlZGVkLCBpbmNsdWRpbmcgYW4gKiptcGxvdCoqLg0KDQoxMC4gVXNlIHRoZSAqKnN1YnNldCoqIGNvbW1hbmQgYXMgc2hvd24gYWJvdmUgZm9yIHRoZSBmb2xsb3dpbmcgaHlwb3RoZXNpcyB0ZXN0LiBNYWxlcyBhcmUgbW9yZSBsaWtlbHkgdG8gdXNlIEFnZ3Jlc3NpdmUgSHVtb3IsIGFuZCB5b3VuZ2VyIGZvbGtzIGFyZSBtb3JlIGxpa2VseSB0byB1c2UgYWdncmVzc2l2ZSBodW1vciB0aGFuIG9sZGVyIGZvbGtzLiBGaW5kIHRoZSBvdmVyYWxsIGFnZ3Jlc3NpdmUgaHVtb3IgYXZlcmFnZSB1c2luZyB0aGUgKCoqSFNBRyoqIHZhcmlhYmxlKSBpbiB0aGUgRGF0YTMzNTAgZGF0YSBmcmFtZS4gU3Vic2V0IGEgZ3JvdXAgb2YgeW91bmcgbWVuIHdobyBhcmUgbGVzcyB0aGFuIDIwIHllYXJzIG9sZCwgYW5kIHRlc3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGlzIHN1Yi1wb3B1bGF0aW9uIGhhcyBhIGhpZ2hlciBncm91cCBtZWFuIHRoYW4gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBtZWFuLg0KDQo=