The Central Limit Theorem basically says that all sampling distributions turn out to be bell-shaped. We saw an example of a sampling distribution the in The Lady Tasting Tea module. We took repeated samples of coin flips where \(n=8\), and after thousands of samples, we plotted the results. Using those empirical results, we estimated the probabilities involved. The estimates get better as sample size increases. That intuitive idea is called the Law of Large Numbers.

Initializing RStudio

The Mosaic package was created by statistics instructors to help students learn the coding in R. Commands are streamlined to be more intuitive. Execute the code block below to load Mosaic (required each session).

library(mosaic)

I. Sampling Distributions

A sampling distribution is created by repeatedly drawing samples of the same size from an underlying distribution. In the examples below, \(n\) is the sample size for each individual draw, and Trials is the number of samples drawn.

Key Idea: the mean of a sampling distribution will be bell-shaped, regardless of the underlying distribution. The next dozen examples show the bell-shape sampling distribution emerging in the histograms as the number of trials increases.

Coin Flips = 20, Trials = 50

coins = do(50) * rflip(20)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

The bell-shape is apparent but falls short of perfection. With larger sample sizes, the bars in the histogram will match up better with the envelope of the superimposed bell curve.

Coin Flips = 20, Trials = 200

coins = do(200) * rflip(20)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

Coin Flips = 20, Trials = 1000

coins = do(1000) * rflip(20)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

With a thousand trials, we observe a near-perfect bell-shape emerging in the histogram.

What about Wilder Underlying Distributions?

Perhaps you don’t find it surprising that the coins flips are bell-shaped. After all, the probability was fifty-fifty, so the symmetry, at least, isn’t surprising. This is an example of the uniform distribution where the bar plot of the probabilities is flat.

Unfair Coin Flips

Let’s change the game by using an underlying distribution that isn’t uniform. What if we still flip coins, but they aren’t fair? What if the probability of heads is 80%? The underlying probability distribution looks very different.

Let’s rerun these simulations and see what happens.

Coin Flips = 20, Trials = 50, \(P(\text{heads})={80\%}\)

coins = do(50) * rflip(20, prob = .8)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

Coin Flips = 20, Trials = 200, \(P(\text{heads})={80\%}\)

coins = do(200) * rflip(20, prob = .8)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

Coin Flips = 20, Trials = 1000, \(P(\text{heads})={80\%}\)

coins = do(1000) * rflip(20, prob = .8)
histogram(~heads, data = coins,
          width = 1,
          fit = "normal")

Notice the left tail of the histogram is slightly longer, but the bell-shape is nearly perfect and centered at 16 which is 80% of 20, as one would anticipate.

Dice Rolls with Values Squared

What about the following distribution: we roll a 6-sided die and take the square of the value showing. Then our underlying distribution will look very non-normal and skewed hard left.

barplot(c(1,4,9,16,25,36),space = 0, col = "red")

This isn’t a proper pdf because the \(y\)-axis is labeled in outcome values, not density, but the point was to show the shape, which it does.

Dice Rolls = 20, Trials = 50

d = do(50) * resample(1:6,20)
D = d^2
sumD = rowSums(D)
histogram(sumD ,
          width = 20,
          center = 300,
          fit = "normal")

Dice Rolls = 20, Trials = 200

d = do(200) * sample(1:6,20, replace = TRUE)
D = d^2
sumD = rowSums(D)
histogram(sumD ,
          width = 20,
          center = 300,
          fit = "normal")

Dice Rolls = 20, Trials = 1000

d = do(1000) * sample(1:6,20, replace = TRUE)
D = d^2
sumD = rowSums(D)
histogram(sumD ,
          width = 20,
          center = 300,
          fit = "normal")

The bell-shape has not yet completely emerged, but we’re getting close. Let’s try one more example with 10,000 trials.

Dice Rolls = 20, Trials = 10,000

d = do(10000) * sample(1:6,20, replace = TRUE)
D = d^2
sumD = rowSums(D)
histogram(sumD ,
          width = 20,
          center = 300,
          fit = "normal")

If we set the number of trials high enough, the bell-shape will eventually emerge in the histograms.

II. Central Limit Theorem

Suppose that we are sampling from a distribution of any shape, and further suppose that we actually know the distribution mean (\(\mu\)) and distribution standard deviation (\(\sigma\)). In other words, we know the probability density function (pdf) for the distribution and can calculate its expected value (mean) and standard deviation. In that case, the Central Limit Theorem applies.

Central Limit Theorem. The means of a sampling distribution from a population with mean \(\mu\) and standard deviation \(\sigma\) will have the normal distribution with mean of \(\mu\) and standard deviation of \(\frac{\sigma}{\sqrt{n}}\), that is the \[N\left(\mu,\frac{\sigma}{\sqrt n}\right)\] distribution. This is true regardless of the shape of the underlying distribution.

As \(n\) grows, the spread or dispersion is shrinking due to the \(\sqrt n\) term in the denominator. So larger values for \(n\) lead to \(\bar x\) being a better and better estimate of \(\mu\). This fact generalizes to the Law of Large Numbers which states that statistics (like \(\bar x\)) become better and better estimators of parameters (like \(\mu\)) as \(n\) grows larger and larger.

III. Normal Distribution

We refer to the Normal distribution with mean \(\mu\) and standard deviation \(\sigma\) with the notation \(N(\mu,\sigma)\). If we integrate the Gaussian function \[f(x) = \frac{1}{\sigma\sqrt{2\pi}} e^{-\left(\frac{x-\mu}{\sigma}\right)^2 }\] across all real numbers, the area under the curve is equal to one. The parameters \(\mu\) and \(\sigma\) will center the bell-curve at \(\mu\) and control the dispersion or spread.

If we need to do any computations, we use the Standard Normal distribution where \(\mu = 0\) and \(\sigma = 1\), e.g. \(N(0,1)\). As you’ll see in the formula above, these values have the effect of making the expression as uncomplicated as possible. If we want to convert values in a normal distribution to their Standard Normal equivalent, we compute a \(z\)-score.

\[z=\frac{x-\mu}{\sigma}\]

Standardized Scores

Standardized tests and standardized scores get their root from the Standard Normal distribution. Each value in a Normal distribution corresponds to an exact percentile.

Example: ACT Scores

ACT Composite Scores have (approximately) the \(N(21,6)\) distribution, though different test years have slightly different values. If Mateo earned a 29 on his ACT, what is his percentile score?

In R, we can calculate exact percentiles using the pnorm function which stands for “p-values from the normal distribution.”

pnorm(29,21,6)
[1] 0.9087888

So Mateo’s score is 90th percentile.

Using Mosaic we have a better option: the function xpnorm calculates the \(z\)-score and indicates it with a vertical line. The upper- and lower-tail probabilities also print out with the results and are displayed in different colors.

xpnorm(29,21,6)


If X ~ N(21, 6), then 

    P(X <= 29) = P(Z <= 1.333) = 0.9088
    P(X >  29) = P(Z >  1.333) = 0.09121
[1] 0.9087888

We can calculate Mateo’s standardized score. \[z_M=\frac{29-21}{6}=1.333\] After converting to a standardized score, we can look up the percentile in a \(z\)-table. This is the method we use in traditional by-hand statistics, where the calculus-based computations were avoided by converting to standardized scores and using tables. Now, cell phones can generate \(p\)-values to an exacting level of detail. R does the calculation, too, assuming the standard normal distribution unless a different mean and standard deviation are specified in the function call.

xpnorm(1.333)


If X ~ N(0, 1), then 

    P(X <= 1.333) = P(Z <= 1.333) = 0.9087
    P(X >  1.333) = P(Z >  1.333) = 0.09127
[1] 0.9087341

The slight difference in the two is the rounding error. The shaded area corresponds to a vertical line drawn at \(Z=1.333\) with the area to the left of it equally 90.87% of the total area under the curve.

We can also determine a person’s ACT score if we know their percentile. For example, suppose we knew Joe’s score was 45th percentile. Here, we use the R function xqnorm.

xqnorm(.45,21,6)


If X ~ N(21, 6), then 

    P(X <= 20.24603) = 0.45
    P(X >  20.24603) = 0.55
[1] 20.24603

Note the vertical line has been drawn at the 45th percentile, and the correspond \(z\)-score has been determined and displayed. Above the graph we see the printout showing the exact cutoff would be an ACT score of \(x=20.24603\) but we can round to 20 since only integer scores are possible.

Normal Curve Areas as Probabilities

Georgia ACT Scores

As reported in the AJC, Georgia ACT scores
were about half a point higher in 2018
than the US national average.

Because the bell curves we are using represent the distribution of populations, we can think of percentiles as probabilities. Suppose we draw a senior in high school at random from the state of Georgia, and assume the population has the \(N(21,6)\) distribution just like the nation-wide distribution. If so, what is the probability of the person we draw at random having an ACT score of 30?

xpnorm(30,21,6)


If X ~ N(21, 6), then 

    P(X <= 30) = P(Z <= 1.5) = 0.9332
    P(X >  30) = P(Z >  1.5) = 0.06681
[1] 0.9331928

The probability is approximately 93.32% that a person would be to the left of the vertical line at 30, so we subtract from 100% to get the probability: 6.68%.

IV. A Primitive Statistical Test

We know that resting heart rates (RHR) for healthy adult females have the \(N(75,8)\) distribution. Suppose we have a sample of 9 women whose average RHR is 70. We can use the Central Limit Theorem to tweak the above normal curve calculations into a group \(z\)-score.

Let’s imagine that this sample was drawn from a sub-population of adult women in their 40’s who have completed a half marathon in the least 3 years. Since RHR’s are a course measure of aerobic fitness, this sub-population of women might have average RHR’s that are different from their peers. Let’s call this sub-population of women \(R\), for runners.

We have a sample size of \(n=9\), and we use the null hypothesis that \(\mu_R=75\), e.g. that these women have identical average RHR’s as the overall population of healthy, adult women.

By the Central Limit theorem, the standard deviation will decrease.\[\sigma_R = \frac{\sigma}{\sqrt n}=\frac{8}{\sqrt 9}=\frac{8}{3}\]

We can now evaluate the probability that the null hypothesis is true using the xpnorm function.

xpnorm(70,75,8/3)


If X ~ N(75, 2.667), then 

    P(X <= 70) = P(Z <= -1.875) = 0.0304
    P(X >  70) = P(Z >  -1.875) = 0.9696
[1] 0.03039636

Results

Recall the Lady Tasting Tea example we worked out. Ronald Fischer, the godfather of statistics, suggested creating a null hypothesis: a falsifiable probability model that could be compared to the experimental data by using empirical or theoretical probabilities.

For this experiment, the null hypothesis is that the sample of nine women was drawn from the population and therefore from the \(N(75,8)\) distribution of RHR’s. We used a theoretical probability calculation assuming the sample of 9 women were drawn from this population. Our results indicate only a 3% chance exists of finding a random group drawn from the \(N(75,8)\) distribution with a mean at least this far from population mean \(\mu_0=75\). Since this probability is less than our default level of significance (\(\alpha = .05\)), we have reasonably good evidence the null hypothesis is false.

In modern statistical terms, we reject the null when it is unlikely to be true. What does this mean about our experiment? There appears to be a structural difference between the sub-population and the overall population. It would appear that female runners in their 40’s have a different RHR distribution than typical healthy adult females do. If we were to generalize, which is the goal of quantitative research, we would suggest we had evidence that female runners in their 40’s have lower RHR’s than the overall population of healthy adult women.

V. Exercises

  1. Find the percentile ranking for an IQ score of 120 using the xpnorm function. IQ’s have the \(N(100,15)\) distribution.

  2. Find the approximate IQ score that corresponds to the 25th percentile IQ. Use the xqnorm function. IQ’s have the \(N(100,15)\) distribution.

  3. Find the percentile ranking for an SAT-Math score of 700 using the xpnorm function. SAT components have the \(N(500,100)\) distribution.

  4. Find the approximate SAT-Math score that corresponds to the 60th percentile SAT-Math score. Use the xqnorm function. SAT components have the \(N(500,100)\) distribution.

  5. Find the “middle 90%” of the IQ distribution. The middle 90% will be a symmetric interval that traps exactly 5% of the area below it, 5% above it, and thus 90% within it. Use the xqnorm function. IQ components have the \(N(100,15)\) distribution.

LS0tDQp0aXRsZTogIkNlbnRyYWwgTGltaXQgVGhlb3JlbSBhbmQgTm9ybWFsIERpc3RyaWJ1dGlvbnMiDQpzdWJ0aXRsZTogVU5HIE1BVEggMzM1MCAob25saW5lKQ0KYXV0aG9yOiBSb2JiIFNpbm4NCmRhdGU6IEp1bHkgMjAyMA0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhlICoqQ2VudHJhbCBMaW1pdCBUaGVvcmVtKiogYmFzaWNhbGx5IHNheXMgdGhhdCBhbGwgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyB0dXJuIG91dCB0byBiZSBiZWxsLXNoYXBlZC4gV2Ugc2F3IGFuIGV4YW1wbGUgb2YgYSBzYW1wbGluZyBkaXN0cmlidXRpb24gdGhlIDxhIGhyZWYgPSBodHRwczovL3JwdWJzLmNvbS9yb2Jic2lubi9zMj4gaW4gVGhlIExhZHkgVGFzdGluZyBUZWE8L2E+IG1vZHVsZS4gV2UgdG9vayByZXBlYXRlZCBzYW1wbGVzIG9mIGNvaW4gZmxpcHMgd2hlcmUgJG49OCQsIGFuZCBhZnRlciB0aG91c2FuZHMgb2Ygc2FtcGxlcywgd2UgcGxvdHRlZCB0aGUgcmVzdWx0cy4gVXNpbmcgdGhvc2UgZW1waXJpY2FsIHJlc3VsdHMsIHdlIGVzdGltYXRlZCB0aGUgcHJvYmFiaWxpdGllcyBpbnZvbHZlZC4gVGhlIGVzdGltYXRlcyBnZXQgYmV0dGVyIGFzIHNhbXBsZSBzaXplIGluY3JlYXNlcy4gVGhhdCBpbnR1aXRpdmUgaWRlYSBpcyBjYWxsZWQgdGhlICoqTGF3IG9mIExhcmdlIE51bWJlcnMqKi4NCg0KPGRpdiBzdHlsZT0iZmxvYXQ6cmlnaHQ7IG1hcmdpbjogOHB4OyBib3JkZXI6MnB4IGJsYWNrIHNvbGlkOyBwYWRkaW5nOiAwcHggMTBweCA1cHgiPg0KIyMjIDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+SW5pdGlhbGl6aW5nIFJTdHVkaW88L3NwYW4+DQpUaGUgKipNb3NhaWMqKiBwYWNrYWdlIHdhcyBjcmVhdGVkIGJ5IHN0YXRpc3RpY3MgaW5zdHJ1Y3RvcnMgdG8gaGVscCBzdHVkZW50cyBsZWFybiB0aGUgY29kaW5nIGluIFIuIENvbW1hbmRzIGFyZSBzdHJlYW1saW5lZCB0byBiZSBtb3JlIGludHVpdGl2ZS4gRXhlY3V0ZSB0aGUgY29kZSBibG9jayBiZWxvdyB0byBsb2FkICoqTW9zYWljKiogKHJlcXVpcmVkIGVhY2ggc2Vzc2lvbikuDQpgYGB7cn0NCmxpYnJhcnkobW9zYWljKQ0KYGBgDQo8L2Rpdj4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JLiBTYW1wbGluZyBEaXN0cmlidXRpb25zPC9zcGFuPg0KDQpBIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBpcyBjcmVhdGVkIGJ5IHJlcGVhdGVkbHkgZHJhd2luZyBzYW1wbGVzIG9mIHRoZSBzYW1lIHNpemUgZnJvbSBhbiB1bmRlcmx5aW5nIGRpc3RyaWJ1dGlvbi4gSW4gdGhlIGV4YW1wbGVzIGJlbG93LCAkbiQgaXMgdGhlIHNhbXBsZSBzaXplIGZvciBlYWNoIGluZGl2aWR1YWwgZHJhdywgYW5kIFRyaWFscyBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgZHJhd24uDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+KipLZXkgSWRlYToqKiB0aGUgbWVhbiBvZiBhIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiB3aWxsIGJlIGJlbGwtc2hhcGVkPC9zcGFuPiwgcmVnYXJkbGVzcyBvZiB0aGUgdW5kZXJseWluZyBkaXN0cmlidXRpb24uIFRoZSBuZXh0IGRvemVuIGV4YW1wbGVzIHNob3cgdGhlIGJlbGwtc2hhcGUgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIGVtZXJnaW5nIGluIHRoZSBoaXN0b2dyYW1zIGFzIHRoZSBudW1iZXIgb2YgdHJpYWxzIGluY3JlYXNlcy4NCg0KIyMgQ29pbiBGbGlwcyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjUwPC9zcGFuPg0KDQpgYGB7cn0NCmNvaW5zID0gZG8oNTApICogcmZsaXAoMjApDQpoaXN0b2dyYW0ofmhlYWRzLCBkYXRhID0gY29pbnMsDQogICAgICAgICAgd2lkdGggPSAxLA0KICAgICAgICAgIGZpdCA9ICJub3JtYWwiKQ0KYGBgDQpUaGUgYmVsbC1zaGFwZSBpcyBhcHBhcmVudCBidXQgZmFsbHMgc2hvcnQgb2YgcGVyZmVjdGlvbi4gV2l0aCBsYXJnZXIgc2FtcGxlIHNpemVzLCB0aGUgYmFycyBpbiB0aGUgaGlzdG9ncmFtIHdpbGwgbWF0Y2ggdXAgYmV0dGVyIHdpdGggdGhlIGVudmVsb3BlIG9mIHRoZSBzdXBlcmltcG9zZWQgYmVsbCBjdXJ2ZS4NCg0KDQojIyBDb2luIEZsaXBzID0gMjAsIFRyaWFscyA9IDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+MjAwPC9zcGFuPg0KDQpgYGB7cn0NCmNvaW5zID0gZG8oMjAwKSAqIHJmbGlwKDIwKQ0KaGlzdG9ncmFtKH5oZWFkcywgZGF0YSA9IGNvaW5zLA0KICAgICAgICAgIHdpZHRoID0gMSwNCiAgICAgICAgICBmaXQgPSAibm9ybWFsIikNCmBgYA0KIyMgQ29pbiBGbGlwcyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjEwMDA8L3NwYW4+DQoNCmBgYHtyfQ0KY29pbnMgPSBkbygxMDAwKSAqIHJmbGlwKDIwKQ0KaGlzdG9ncmFtKH5oZWFkcywgZGF0YSA9IGNvaW5zLA0KICAgICAgICAgIHdpZHRoID0gMSwNCiAgICAgICAgICBmaXQgPSAibm9ybWFsIikNCmBgYA0KV2l0aCBhIHRob3VzYW5kIHRyaWFscywgd2Ugb2JzZXJ2ZSBhIG5lYXItcGVyZmVjdCBiZWxsLXNoYXBlIGVtZXJnaW5nIGluIHRoZSBoaXN0b2dyYW0uDQoNCiMgV2hhdCBhYm91dCBXaWxkZXIgVW5kZXJseWluZyBEaXN0cmlidXRpb25zPw0KDQpQZXJoYXBzIHlvdSBkb24ndCBmaW5kIGl0IHN1cnByaXNpbmcgdGhhdCB0aGUgY29pbnMgZmxpcHMgYXJlIGJlbGwtc2hhcGVkLiBBZnRlciBhbGwsIHRoZSBwcm9iYWJpbGl0eSB3YXMgZmlmdHktZmlmdHksIHNvIHRoZSBzeW1tZXRyeSwgYXQgbGVhc3QsIGlzbid0IHN1cnByaXNpbmcuIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24gd2hlcmUgdGhlIGJhciBwbG90IG9mIHRoZSBwcm9iYWJpbGl0aWVzIGlzIGZsYXQuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpiYXJwbG90KGMoLjUsLjUpLCBzcGFjZSA9IDAsIHlsaW0gPSBjKDAsMSksY29sID0gInJlZCIpDQpgYGANCg0KIyMgVW5mYWlyIENvaW4gRmxpcHMNCg0KTGV0J3MgY2hhbmdlIHRoZSBnYW1lIGJ5IHVzaW5nIGFuIHVuZGVybHlpbmcgZGlzdHJpYnV0aW9uIHRoYXQgaXNuJ3QgdW5pZm9ybS4gV2hhdCBpZiB3ZSBzdGlsbCBmbGlwIGNvaW5zLCBidXQgdGhleSBhcmVuJ3QgZmFpcj8gV2hhdCBpZiB0aGUgcHJvYmFiaWxpdHkgb2YgaGVhZHMgaXMgODAlPyBUaGUgdW5kZXJseWluZyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gbG9va3MgdmVyeSBkaWZmZXJlbnQuDQoNCmBgYHtyIGVjaG89RkFMU0V9DQpiYXJwbG90KGMoLjIsLjgpLCBzcGFjZSA9IDAsIHlsaW0gPSBjKDAsMSksY29sID0gInJlZCIpDQpgYGANCkxldCdzIHJlcnVuIHRoZXNlIHNpbXVsYXRpb25zIGFuZCBzZWUgd2hhdCBoYXBwZW5zLg0KDQojIyBDb2luIEZsaXBzID0gMjAsIFRyaWFscyA9IDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+NTA8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+JFAoXHRleHR7aGVhZHN9KT17ODBcJX0kPC9zcGFuPg0KDQpgYGB7cn0NCmNvaW5zID0gZG8oNTApICogcmZsaXAoMjAsIHByb2IgPSAuOCkNCmhpc3RvZ3JhbSh+aGVhZHMsIGRhdGEgPSBjb2lucywNCiAgICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgICAgZml0ID0gIm5vcm1hbCIpDQpgYGANCg0KIyMgQ29pbiBGbGlwcyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjIwMDwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjogZ3JlZW47Ij4kUChcdGV4dHtoZWFkc30pPXs4MFwlfSQ8L3NwYW4+DQoNCmBgYHtyfQ0KY29pbnMgPSBkbygyMDApICogcmZsaXAoMjAsIHByb2IgPSAuOCkNCmhpc3RvZ3JhbSh+aGVhZHMsIGRhdGEgPSBjb2lucywNCiAgICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgICAgZml0ID0gIm5vcm1hbCIpDQpgYGANCg0KIyMgQ29pbiBGbGlwcyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjEwMDA8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6IGdyZWVuOyI+JFAoXHRleHR7aGVhZHN9KT17ODBcJX0kPC9zcGFuPg0KYGBge3J9DQpjb2lucyA9IGRvKDEwMDApICogcmZsaXAoMjAsIHByb2IgPSAuOCkNCmhpc3RvZ3JhbSh+aGVhZHMsIGRhdGEgPSBjb2lucywNCiAgICAgICAgICB3aWR0aCA9IDEsDQogICAgICAgICAgZml0ID0gIm5vcm1hbCIpDQpgYGANCk5vdGljZSB0aGUgbGVmdCB0YWlsIG9mIHRoZSBoaXN0b2dyYW0gaXMgc2xpZ2h0bHkgbG9uZ2VyLCBidXQgdGhlIGJlbGwtc2hhcGUgaXMgbmVhcmx5IHBlcmZlY3QgYW5kIGNlbnRlcmVkIGF0IDE2IHdoaWNoIGlzIDgwJSBvZiAyMCwgYXMgb25lIHdvdWxkIGFudGljaXBhdGUuDQoNCiMjIERpY2UgUm9sbHMgd2l0aCBWYWx1ZXMgU3F1YXJlZA0KDQpXaGF0IGFib3V0IHRoZSBmb2xsb3dpbmcgZGlzdHJpYnV0aW9uOiB3ZSByb2xsIGEgNi1zaWRlZCBkaWUgYW5kIHRha2UgdGhlIHNxdWFyZSBvZiB0aGUgdmFsdWUgc2hvd2luZy4gVGhlbiBvdXIgdW5kZXJseWluZyBkaXN0cmlidXRpb24gd2lsbCBsb29rIHZlcnkgbm9uLW5vcm1hbCBhbmQgc2tld2VkIGhhcmQgbGVmdC4NCg0KYGBge3J9DQpiYXJwbG90KGMoMSw0LDksMTYsMjUsMzYpLHNwYWNlID0gMCwgY29sID0gInJlZCIpDQpgYGANClRoaXMgaXNuJ3QgYSBwcm9wZXIgcGRmIGJlY2F1c2UgdGhlICR5JC1heGlzIGlzIGxhYmVsZWQgaW4gb3V0Y29tZSB2YWx1ZXMsIG5vdCBkZW5zaXR5LCBidXQgdGhlIHBvaW50IHdhcyB0byBzaG93IHRoZSBzaGFwZSwgd2hpY2ggaXQgZG9lcy4NCg0KIyMgRGljZSBSb2xscyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjUwPC9zcGFuPg0KDQpgYGB7cn0NCmQgPSBkbyg1MCkgKiByZXNhbXBsZSgxOjYsMjApDQpEID0gZF4yDQpzdW1EID0gcm93U3VtcyhEKQ0KaGlzdG9ncmFtKHN1bUQgLA0KICAgICAgICAgIHdpZHRoID0gMjAsDQogICAgICAgICAgY2VudGVyID0gMzAwLA0KICAgICAgICAgIGZpdCA9ICJub3JtYWwiKQ0KYGBgDQoNCiMjIERpY2UgUm9sbHMgPSAyMCwgVHJpYWxzID0gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4yMDA8L3NwYW4+DQoNCmBgYHtyfQ0KZCA9IGRvKDIwMCkgKiBzYW1wbGUoMTo2LDIwLCByZXBsYWNlID0gVFJVRSkNCkQgPSBkXjINCnN1bUQgPSByb3dTdW1zKEQpDQpoaXN0b2dyYW0oc3VtRCAsDQogICAgICAgICAgd2lkdGggPSAyMCwNCiAgICAgICAgICBjZW50ZXIgPSAzMDAsDQogICAgICAgICAgZml0ID0gIm5vcm1hbCIpDQpgYGANCg0KIyMgRGljZSBSb2xscyA9IDIwLCBUcmlhbHMgPSA8c3BhbiBzdHlsZT0iY29sb3I6IHJlZDsiPjEwMDA8L3NwYW4+DQoNCmBgYHtyfQ0KZCA9IGRvKDEwMDApICogc2FtcGxlKDE6NiwyMCwgcmVwbGFjZSA9IFRSVUUpDQpEID0gZF4yDQpzdW1EID0gcm93U3VtcyhEKQ0KaGlzdG9ncmFtKHN1bUQgLA0KICAgICAgICAgIHdpZHRoID0gMjAsDQogICAgICAgICAgY2VudGVyID0gMzAwLA0KICAgICAgICAgIGZpdCA9ICJub3JtYWwiKQ0KYGBgDQpUaGUgYmVsbC1zaGFwZSBoYXMgbm90IHlldCBjb21wbGV0ZWx5IGVtZXJnZWQsIGJ1dCB3ZSdyZSBnZXR0aW5nIGNsb3NlLiBMZXQncyB0cnkgb25lIG1vcmUgZXhhbXBsZSB3aXRoIDEwLDAwMCB0cmlhbHMuDQoNCiMjIERpY2UgUm9sbHMgPSAyMCwgVHJpYWxzID0gPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQ7Ij4xMCwwMDA8L3NwYW4+DQoNCmBgYHtyfQ0KZCA9IGRvKDEwMDAwKSAqIHNhbXBsZSgxOjYsMjAsIHJlcGxhY2UgPSBUUlVFKQ0KRCA9IGReMg0Kc3VtRCA9IHJvd1N1bXMoRCkNCmhpc3RvZ3JhbShzdW1EICwNCiAgICAgICAgICB3aWR0aCA9IDIwLA0KICAgICAgICAgIGNlbnRlciA9IDMwMCwNCiAgICAgICAgICBmaXQgPSAibm9ybWFsIikNCmBgYA0KSWYgd2Ugc2V0IHRoZSBudW1iZXIgb2YgdHJpYWxzIGhpZ2ggZW5vdWdoLCB0aGUgYmVsbC1zaGFwZSB3aWxsIGV2ZW50dWFsbHkgZW1lcmdlIGluIHRoZSBoaXN0b2dyYW1zLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPklJLiBDZW50cmFsIExpbWl0IFRoZW9yZW08L3NwYW4+DQoNClN1cHBvc2UgdGhhdCB3ZSBhcmUgc2FtcGxpbmcgZnJvbSBhIGRpc3RyaWJ1dGlvbiBvZiBhbnkgc2hhcGUsIGFuZCBmdXJ0aGVyIHN1cHBvc2UgdGhhdCB3ZSBhY3R1YWxseSBrbm93IHRoZSAqKmRpc3RyaWJ1dGlvbiBtZWFuKiogKCRcbXUkKSBhbmQgZGlzdHJpYnV0aW9uIHN0YW5kYXJkIGRldmlhdGlvbiAoJFxzaWdtYSQpLiBJbiBvdGhlciB3b3Jkcywgd2Uga25vdyB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiAocGRmKSBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgY2FuIGNhbGN1bGF0ZSBpdHMgZXhwZWN0ZWQgdmFsdWUgKG1lYW4pIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24uIEluIHRoYXQgY2FzZSwgdGhlIENlbnRyYWwgTGltaXQgVGhlb3JlbSBhcHBsaWVzLg0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpsZWZ0OyBtYXJnaW46IDhweDsgYm9yZGVyOjJweCByZWQgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQoqKkNlbnRyYWwgTGltaXQgVGhlb3JlbSoqLiBUaGUgbWVhbnMgb2YgYSBzYW1wbGluZyBkaXN0cmlidXRpb24gZnJvbSBhIHBvcHVsYXRpb24gd2l0aCBtZWFuICRcbXUkIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gJFxzaWdtYSQgd2lsbCBoYXZlIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbWVhbiBvZiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mICRcZnJhY3tcc2lnbWF9e1xzcXJ0e259fSQsIHRoYXQgaXMgdGhlDQokJE5cbGVmdChcbXUsXGZyYWN7XHNpZ21hfXtcc3FydCBufVxyaWdodCkkJCANCmRpc3RyaWJ1dGlvbi4gVGhpcyBpcyB0cnVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHNoYXBlIG9mIHRoZSB1bmRlcmx5aW5nIGRpc3RyaWJ1dGlvbi4NCjwvZGl2Pg0KDQpBcyAkbiQgZ3Jvd3MsIHRoZSBzcHJlYWQgb3IgZGlzcGVyc2lvbiBpcyBzaHJpbmtpbmcgZHVlIHRvIHRoZSAkXHNxcnQgbiQgdGVybSBpbiB0aGUgZGVub21pbmF0b3IuIFNvIGxhcmdlciB2YWx1ZXMgZm9yICRuJCBsZWFkIHRvICRcYmFyIHgkIGJlaW5nIGEgYmV0dGVyIGFuZCBiZXR0ZXIgZXN0aW1hdGUgb2YgJFxtdSQuIFRoaXMgZmFjdCBnZW5lcmFsaXplcyB0byB0aGUgKipMYXcgb2YgTGFyZ2UgTnVtYmVycyoqIHdoaWNoIHN0YXRlcyB0aGF0IHN0YXRpc3RpY3MgKGxpa2UgJFxiYXIgeCQpIGJlY29tZSBiZXR0ZXIgYW5kIGJldHRlciBlc3RpbWF0b3JzIG9mIHBhcmFtZXRlcnMgKGxpa2UgJFxtdSQpIGFzICRuJCBncm93cyBsYXJnZXIgYW5kIGxhcmdlci4NCg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6IGJsdWU7Ij5JSUkuIE5vcm1hbCBEaXN0cmlidXRpb248L3NwYW4+DQoNCldlIHJlZmVyIHRvIHRoZSBOb3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggbWVhbiAkXG11JCBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uICRcc2lnbWEkIHdpdGggdGhlIG5vdGF0aW9uICROKFxtdSxcc2lnbWEpJC4gSWYgd2UgaW50ZWdyYXRlIHRoZSBHYXVzc2lhbiBmdW5jdGlvbg0KJCRmKHgpID0gXGZyYWN7MX17XHNpZ21hXHNxcnR7MlxwaX19IGVeey1cbGVmdChcZnJhY3t4LVxtdX17XHNpZ21hfVxyaWdodCleMiB9JCQNCmFjcm9zcyBhbGwgcmVhbCBudW1iZXJzLCB0aGUgYXJlYSB1bmRlciB0aGUgY3VydmUgaXMgZXF1YWwgdG8gb25lLiBUaGUgcGFyYW1ldGVycyAkXG11JCBhbmQgJFxzaWdtYSQgd2lsbCBjZW50ZXIgdGhlIGJlbGwtY3VydmUgYXQgJFxtdSQgYW5kIGNvbnRyb2wgdGhlIGRpc3BlcnNpb24gb3Igc3ByZWFkLg0KDQpJZiB3ZSBuZWVkIHRvIGRvIGFueSBjb21wdXRhdGlvbnMsIHdlIHVzZSB0aGUgU3RhbmRhcmQgTm9ybWFsIGRpc3RyaWJ1dGlvbiB3aGVyZSAkXG11ID0gMCQgYW5kICRcc2lnbWEgPSAxJCwgZS5nLiAkTigwLDEpJC4gQXMgeW91J2xsIHNlZSBpbiB0aGUgZm9ybXVsYSBhYm92ZSwgdGhlc2UgdmFsdWVzIGhhdmUgdGhlIGVmZmVjdCBvZiBtYWtpbmcgdGhlIGV4cHJlc3Npb24gYXMgdW5jb21wbGljYXRlZCBhcyBwb3NzaWJsZS4gSWYgd2Ugd2FudCB0byBjb252ZXJ0IHZhbHVlcyBpbiBhIG5vcm1hbCBkaXN0cmlidXRpb24gdG8gdGhlaXIgU3RhbmRhcmQgTm9ybWFsIGVxdWl2YWxlbnQsIHdlIGNvbXB1dGUgYSAkeiQtc2NvcmUuDQoNCiQkej1cZnJhY3t4LVxtdX17XHNpZ21hfSQkDQoNCiMjIFN0YW5kYXJkaXplZCBTY29yZXMNCg0KU3RhbmRhcmRpemVkIHRlc3RzIGFuZCBzdGFuZGFyZGl6ZWQgc2NvcmVzIGdldCB0aGVpciByb290IGZyb20gdGhlIFN0YW5kYXJkIE5vcm1hbCBkaXN0cmlidXRpb24uIEVhY2ggdmFsdWUgaW4gYSBOb3JtYWwgZGlzdHJpYnV0aW9uIGNvcnJlc3BvbmRzIHRvIGFuIGV4YWN0IHBlcmNlbnRpbGUuDQoNCg0KIyMjIEV4YW1wbGU6IEFDVCBTY29yZXMNCkFDVCBDb21wb3NpdGUgU2NvcmVzIGhhdmUgKGFwcHJveGltYXRlbHkpIHRoZSAkTigyMSw2KSQgZGlzdHJpYnV0aW9uLCB0aG91Z2ggZGlmZmVyZW50IHRlc3QgeWVhcnMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgdmFsdWVzLiBJZiBNYXRlbyBlYXJuZWQgYSAyOSBvbiBoaXMgQUNULCB3aGF0IGlzIGhpcyBwZXJjZW50aWxlIHNjb3JlPw0KDQpJbiBSLCB3ZSBjYW4gY2FsY3VsYXRlIGV4YWN0IHBlcmNlbnRpbGVzIHVzaW5nIHRoZSAqKnBub3JtKiogZnVuY3Rpb24gd2hpY2ggc3RhbmRzIGZvciAicC12YWx1ZXMgZnJvbSB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi4iDQoNCmBgYHtyfQ0KcG5vcm0oMjksMjEsNikNCmBgYA0KU28gTWF0ZW8ncyBzY29yZSBpcyA5MHRoIHBlcmNlbnRpbGUuIA0KDQpVc2luZyBNb3NhaWMgd2UgaGF2ZSBhIGJldHRlciBvcHRpb246IHRoZSBmdW5jdGlvbiAqKjxzcGFuIHN0eWxlPSJjb2xvcjogcmVkOyI+eDwvc3Bhbj5wbm9ybSoqIGNhbGN1bGF0ZXMgdGhlICR6JC1zY29yZSBhbmQgaW5kaWNhdGVzIGl0IHdpdGggYSB2ZXJ0aWNhbCBsaW5lLiBUaGUgdXBwZXItIGFuZCBsb3dlci10YWlsIHByb2JhYmlsaXRpZXMgYWxzbyBwcmludCBvdXQgd2l0aCB0aGUgcmVzdWx0cyBhbmQgYXJlIGRpc3BsYXllZCBpbiBkaWZmZXJlbnQgY29sb3JzLg0KDQpgYGB7cn0NCnhwbm9ybSgyOSwyMSw2KQ0KYGBgDQoNCldlIGNhbiBjYWxjdWxhdGUgTWF0ZW8ncyBzdGFuZGFyZGl6ZWQgc2NvcmUuICQkel9NPVxmcmFjezI5LTIxfXs2fT1gciBwYXN0ZShyb3VuZCg0LzMsMykpYCQkDQpBZnRlciBjb252ZXJ0aW5nIHRvIGEgc3RhbmRhcmRpemVkIHNjb3JlLCB3ZSBjYW4gbG9vayB1cCB0aGUgcGVyY2VudGlsZSBpbiBhIDxhIGhyZWYgPSBodHRwOi8vYmxvZy51bmcuZWR1L3JzaW5uL2ZpbGVzLzIwMTQvMTEvVGFibGVfWi5wZGY+JHokLXRhYmxlPC9hPi4gVGhpcyBpcyB0aGUgbWV0aG9kIHdlIHVzZSBpbiB0cmFkaXRpb25hbCBieS1oYW5kIHN0YXRpc3RpY3MsIHdoZXJlIHRoZSBjYWxjdWx1cy1iYXNlZCBjb21wdXRhdGlvbnMgd2VyZSBhdm9pZGVkIGJ5IGNvbnZlcnRpbmcgdG8gc3RhbmRhcmRpemVkIHNjb3JlcyBhbmQgdXNpbmcgdGFibGVzLiBOb3csIGNlbGwgcGhvbmVzIGNhbiBnZW5lcmF0ZSAkcCQtdmFsdWVzIHRvIGFuIGV4YWN0aW5nIGxldmVsIG9mIGRldGFpbC4gUiBkb2VzIHRoZSBjYWxjdWxhdGlvbiwgdG9vLCBhc3N1bWluZyB0aGUgc3RhbmRhcmQgbm9ybWFsIGRpc3RyaWJ1dGlvbiB1bmxlc3MgYSBkaWZmZXJlbnQgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZ1bmN0aW9uIGNhbGwuDQoNCmBgYHtyfQ0KeHBub3JtKDEuMzMzKQ0KYGBgDQoNClRoZSBzbGlnaHQgZGlmZmVyZW5jZSBpbiB0aGUgdHdvIGlzIHRoZSByb3VuZGluZyBlcnJvci4gVGhlIHNoYWRlZCBhcmVhIGNvcnJlc3BvbmRzIHRvIGEgdmVydGljYWwgbGluZSBkcmF3biBhdCAkWj0xLjMzMyQgd2l0aCB0aGUgYXJlYSB0byB0aGUgbGVmdCBvZiBpdCBlcXVhbGx5IDkwLjg3JSBvZiB0aGUgdG90YWwgYXJlYSB1bmRlciB0aGUgY3VydmUuDQoNCldlIGNhbiBhbHNvIGRldGVybWluZSBhIHBlcnNvbidzIEFDVCBzY29yZSBpZiB3ZSBrbm93IHRoZWlyIHBlcmNlbnRpbGUuIEZvciBleGFtcGxlLCBzdXBwb3NlIHdlIGtuZXcgSm9lJ3Mgc2NvcmUgd2FzIDQ1dGggcGVyY2VudGlsZS4gSGVyZSwgd2UgdXNlIHRoZSBSIGZ1bmN0aW9uICoqeHFub3JtKiouDQoNCmBgYHtyfQ0KeHFub3JtKC40NSwyMSw2KQ0KYGBgDQpOb3RlIHRoZSB2ZXJ0aWNhbCBsaW5lIGhhcyBiZWVuIGRyYXduIGF0IHRoZSA0NXRoIHBlcmNlbnRpbGUsIGFuZCB0aGUgY29ycmVzcG9uZCAkeiQtc2NvcmUgaGFzIGJlZW4gZGV0ZXJtaW5lZCBhbmQgZGlzcGxheWVkLiBBYm92ZSB0aGUgZ3JhcGggd2Ugc2VlIHRoZSBwcmludG91dCBzaG93aW5nIHRoZSBleGFjdCBjdXRvZmYgd291bGQgYmUgYW4gQUNUIHNjb3JlIG9mICR4PTIwLjI0NjAzJCBidXQgd2UgY2FuIHJvdW5kIHRvIDIwIHNpbmNlIG9ubHkgaW50ZWdlciBzY29yZXMgYXJlIHBvc3NpYmxlLg0KDQojIyBOb3JtYWwgQ3VydmUgQXJlYXMgYXMgUHJvYmFiaWxpdGllcw0KDQo8ZGl2IHN0eWxlPSJmbG9hdDpyaWdodDsgbWFyZ2luOiA4cHg7IGJvcmRlcjoycHggYmxhY2sgc29saWQ7IHBhZGRpbmc6IDBweCAxMHB4IDVweCI+DQojIyMgR2VvcmdpYSBBQ1QgU2NvcmVzDQpBcyA8YSBocmVmID0gaHR0cHM6Ly93d3cuYWpjLmNvbS9uZXdzL2xvY2FsLWVkdWNhdGlvbi9nZW9yZ2lhLWFjdC1zY29yZXMtdG9wLWF2ZXJhZ2UvcFFLY01iNDlmelRUd1NKREs5SDZCTC8+cmVwb3J0ZWQgaW4gdGhlIEFKQzwvYT4sIEdlb3JnaWEgQUNUIHNjb3JlczwvYnI+DQp3ZXJlIGFib3V0IGhhbGYgYSBwb2ludCBoaWdoZXIgaW4gMjAxODwvYnI+DQp0aGFuIHRoZSBVUyBuYXRpb25hbCBhdmVyYWdlLg0KPC9kaXY+DQpCZWNhdXNlIHRoZSBiZWxsIGN1cnZlcyB3ZSBhcmUgdXNpbmcgcmVwcmVzZW50IHRoZSBkaXN0cmlidXRpb24gb2YgcG9wdWxhdGlvbnMsIHdlIGNhbiB0aGluayBvZiBwZXJjZW50aWxlcyBhcyBwcm9iYWJpbGl0aWVzLiBTdXBwb3NlIHdlIGRyYXcgYSBzZW5pb3IgaW4gaGlnaCBzY2hvb2wgYXQgcmFuZG9tIGZyb20gdGhlIHN0YXRlIG9mIEdlb3JnaWEsIGFuZCBhc3N1bWUgdGhlIHBvcHVsYXRpb24gaGFzIHRoZSAkTigyMSw2KSQgZGlzdHJpYnV0aW9uIGp1c3QgbGlrZSB0aGUgbmF0aW9uLXdpZGUgZGlzdHJpYnV0aW9uLiBJZiBzbywgd2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIHBlcnNvbiB3ZSBkcmF3IGF0IHJhbmRvbSBoYXZpbmcgYW4gQUNUIHNjb3JlIG9mIDMwPw0KDQpgYGB7cn0NCnhwbm9ybSgzMCwyMSw2KQ0KYGBgDQoNCg0KVGhlIHByb2JhYmlsaXR5IGlzIGFwcHJveGltYXRlbHkgOTMuMzIlIHRoYXQgYSBwZXJzb24gd291bGQgYmUgdG8gdGhlICpsZWZ0KiBvZiB0aGUgdmVydGljYWwgbGluZSBhdCAzMCwgc28gd2Ugc3VidHJhY3QgZnJvbSAxMDAlIHRvIGdldCB0aGUgcHJvYmFiaWxpdHk6IDYuNjglLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPklWLiBBIFByaW1pdGl2ZSBTdGF0aXN0aWNhbCBUZXN0PC9zcGFuPg0KDQpXZSBrbm93IHRoYXQgcmVzdGluZyBoZWFydCByYXRlcyAoUkhSKSBmb3IgaGVhbHRoeSBhZHVsdCBmZW1hbGVzIGhhdmUgdGhlICROKDc1LDgpJCBkaXN0cmlidXRpb24uIFN1cHBvc2Ugd2UgaGF2ZSBhIHNhbXBsZSBvZiA5IHdvbWVuIHdob3NlIGF2ZXJhZ2UgUkhSIGlzIDcwLiBXZSBjYW4gdXNlIHRoZSBDZW50cmFsIExpbWl0IFRoZW9yZW0gdG8gdHdlYWsgdGhlIGFib3ZlIG5vcm1hbCBjdXJ2ZSBjYWxjdWxhdGlvbnMgaW50byBhIGdyb3VwICR6JC1zY29yZS4NCg0KTGV0J3MgaW1hZ2luZSB0aGF0IHRoaXMgc2FtcGxlIHdhcyBkcmF3biBmcm9tIGEgc3ViLXBvcHVsYXRpb24gb2YgYWR1bHQgd29tZW4gaW4gdGhlaXIgNDAncyB3aG8gaGF2ZSBjb21wbGV0ZWQgYSBoYWxmIG1hcmF0aG9uIGluIHRoZSBsZWFzdCAzIHllYXJzLiBTaW5jZSBSSFIncyBhcmUgYSBjb3Vyc2UgbWVhc3VyZSBvZiBhZXJvYmljIGZpdG5lc3MsIHRoaXMgc3ViLXBvcHVsYXRpb24gb2Ygd29tZW4gbWlnaHQgaGF2ZSBhdmVyYWdlIFJIUidzIHRoYXQgYXJlIGRpZmZlcmVudCBmcm9tIHRoZWlyIHBlZXJzLiBMZXQncyBjYWxsIHRoaXMgc3ViLXBvcHVsYXRpb24gb2Ygd29tZW4gJFIkLCBmb3IgcnVubmVycy4NCg0KV2UgaGF2ZSBhIHNhbXBsZSBzaXplIG9mICRuPTkkLCBhbmQgd2UgdXNlIHRoZSBudWxsIGh5cG90aGVzaXMgdGhhdCAkXG11X1I9NzUkLCBlLmcuIHRoYXQgdGhlc2Ugd29tZW4gaGF2ZSBpZGVudGljYWwgYXZlcmFnZSBSSFIncyBhcyB0aGUgb3ZlcmFsbCBwb3B1bGF0aW9uIG9mIGhlYWx0aHksIGFkdWx0IHdvbWVuLg0KDQpCeSB0aGUgQ2VudHJhbCBMaW1pdCB0aGVvcmVtLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIHdpbGwgZGVjcmVhc2UuJCRcc2lnbWFfUiA9IFxmcmFje1xzaWdtYX17XHNxcnQgbn09XGZyYWN7OH17XHNxcnQgOX09XGZyYWN7OH17M30kJA0KDQpXZSBjYW4gbm93IGV2YWx1YXRlIHRoZSBwcm9iYWJpbGl0eSB0aGF0IHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdHJ1ZSB1c2luZyB0aGUgKip4cG5vcm0qKiBmdW5jdGlvbi4NCg0KYGBge3J9DQp4cG5vcm0oNzAsNzUsOC8zKQ0KYGBgDQoNCg0KIyMgUmVzdWx0cw0KUmVjYWxsIHRoZSA8YSBocmVmID0gaHR0cHM6Ly9ycHVicy5jb20vcm9iYnNpbm4vczI+TGFkeSBUYXN0aW5nIFRlYTwvYT4gZXhhbXBsZSB3ZSB3b3JrZWQgb3V0LiBSb25hbGQgRmlzY2hlciwgdGhlIGdvZGZhdGhlciBvZiBzdGF0aXN0aWNzLCBzdWdnZXN0ZWQgY3JlYXRpbmcgYSBudWxsIGh5cG90aGVzaXM6IGEgZmFsc2lmaWFibGUgcHJvYmFiaWxpdHkgbW9kZWwgdGhhdCBjb3VsZCBiZSBjb21wYXJlZCB0byB0aGUgZXhwZXJpbWVudGFsIGRhdGEgYnkgdXNpbmcgZW1waXJpY2FsIG9yIHRoZW9yZXRpY2FsIHByb2JhYmlsaXRpZXMuDQoNCkZvciB0aGlzIGV4cGVyaW1lbnQsIHRoZSBudWxsIGh5cG90aGVzaXMgaXMgdGhhdCB0aGUgc2FtcGxlIG9mIG5pbmUgd29tZW4gd2FzIGRyYXduIGZyb20gdGhlIHBvcHVsYXRpb24gYW5kIHRoZXJlZm9yZSBmcm9tIHRoZSAkTig3NSw4KSQgZGlzdHJpYnV0aW9uIG9mIFJIUidzLiBXZSB1c2VkIGEgdGhlb3JldGljYWwgcHJvYmFiaWxpdHkgY2FsY3VsYXRpb24gYXNzdW1pbmcgdGhlIHNhbXBsZSBvZiA5IHdvbWVuIHdlcmUgZHJhd24gZnJvbSB0aGlzIHBvcHVsYXRpb24uIE91ciByZXN1bHRzIGluZGljYXRlIG9ubHkgYSAzJSBjaGFuY2UgZXhpc3RzIG9mIGZpbmRpbmcgYSByYW5kb20gZ3JvdXAgZHJhd24gZnJvbSB0aGUgJE4oNzUsOCkkIGRpc3RyaWJ1dGlvbiB3aXRoIGEgbWVhbiBhdCBsZWFzdCB0aGlzIGZhciBmcm9tIHBvcHVsYXRpb24gbWVhbiAkXG11XzA9NzUkLiBTaW5jZSB0aGlzIHByb2JhYmlsaXR5IGlzIGxlc3MgdGhhbiBvdXIgZGVmYXVsdCBsZXZlbCBvZiBzaWduaWZpY2FuY2UgKCRcYWxwaGEgPSAuMDUkKSwgd2UgaGF2ZSByZWFzb25hYmx5IGdvb2QgZXZpZGVuY2UgdGhlIG51bGwgaHlwb3RoZXNpcyBpcyBmYWxzZS4NCg0KSW4gbW9kZXJuIHN0YXRpc3RpY2FsIHRlcm1zLCB3ZSAqKnJlamVjdCB0aGUgbnVsbCoqIHdoZW4gaXQgaXMgdW5saWtlbHkgdG8gYmUgdHJ1ZS4gV2hhdCBkb2VzIHRoaXMgbWVhbiBhYm91dCBvdXIgZXhwZXJpbWVudD8gVGhlcmUgYXBwZWFycyB0byBiZSBhIHN0cnVjdHVyYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzdWItcG9wdWxhdGlvbiBhbmQgdGhlIG92ZXJhbGwgcG9wdWxhdGlvbi4gSXQgd291bGQgYXBwZWFyIHRoYXQgZmVtYWxlIHJ1bm5lcnMgaW4gdGhlaXIgNDAncyBoYXZlIGEgZGlmZmVyZW50IFJIUiBkaXN0cmlidXRpb24gdGhhbiB0eXBpY2FsIGhlYWx0aHkgYWR1bHQgZmVtYWxlcyBkby4gSWYgd2Ugd2VyZSB0byBnZW5lcmFsaXplLCB3aGljaCBpcyB0aGUgZ29hbCBvZiBxdWFudGl0YXRpdmUgcmVzZWFyY2gsIHdlIHdvdWxkIHN1Z2dlc3Qgd2UgaGFkIGV2aWRlbmNlIHRoYXQgZmVtYWxlIHJ1bm5lcnMgaW4gdGhlaXIgNDAncyBoYXZlIGxvd2VyIFJIUidzIHRoYW4gdGhlIG92ZXJhbGwgcG9wdWxhdGlvbiBvZiBoZWFsdGh5IGFkdWx0IHdvbWVuLg0KDQojIDxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPlYuIEV4ZXJjaXNlczwvc3Bhbj4NCg0KMS4gRmluZCB0aGUgcGVyY2VudGlsZSByYW5raW5nIGZvciBhbiBJUSBzY29yZSBvZiAxMjAgdXNpbmcgdGhlICoqeHBub3JtKiogZnVuY3Rpb24uIElRJ3MgaGF2ZSB0aGUgJE4oMTAwLDE1KSQgZGlzdHJpYnV0aW9uLg0KDQoyLiBGaW5kIHRoZSBhcHByb3hpbWF0ZSBJUSBzY29yZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSAyNXRoIHBlcmNlbnRpbGUgSVEuIFVzZSB0aGUgKip4cW5vcm0qKiBmdW5jdGlvbi4gSVEncyBoYXZlIHRoZSAkTigxMDAsMTUpJCBkaXN0cmlidXRpb24uDQoNCjMuIEZpbmQgdGhlIHBlcmNlbnRpbGUgcmFua2luZyBmb3IgYW4gU0FULU1hdGggc2NvcmUgb2YgNzAwIHVzaW5nIHRoZSAqKnhwbm9ybSoqIGZ1bmN0aW9uLiBTQVQgY29tcG9uZW50cyBoYXZlIHRoZSAkTig1MDAsMTAwKSQgZGlzdHJpYnV0aW9uLg0KDQo0LiBGaW5kIHRoZSBhcHByb3hpbWF0ZSBTQVQtTWF0aCBzY29yZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA2MHRoIHBlcmNlbnRpbGUgU0FULU1hdGggc2NvcmUuIFVzZSB0aGUgKip4cW5vcm0qKiBmdW5jdGlvbi4gU0FUIGNvbXBvbmVudHMgaGF2ZSB0aGUgJE4oNTAwLDEwMCkkIGRpc3RyaWJ1dGlvbi4NCg0KNS4gRmluZCB0aGUgIm1pZGRsZSA5MCUiIG9mIHRoZSBJUSBkaXN0cmlidXRpb24uIFRoZSBtaWRkbGUgOTAlIHdpbGwgYmUgYSBzeW1tZXRyaWMgaW50ZXJ2YWwgdGhhdCB0cmFwcyBleGFjdGx5IDUlIG9mIHRoZSBhcmVhIGJlbG93IGl0LCA1JSBhYm92ZSBpdCwgYW5kIHRodXMgOTAlIHdpdGhpbiBpdC4gVXNlIHRoZSAqKnhxbm9ybSoqIGZ1bmN0aW9uLiBJUSBjb21wb25lbnRzIGhhdmUgdGhlICROKDEwMCwxNSkkIGRpc3RyaWJ1dGlvbi4gDQo=