Gauss-Markov Assumptions
In the last lesson, we introduced a set of assumptions that we will commonly make regarding the error term in our hypothetical model \(Y = \beta_0 + \beta_1 X + \varepsilon\). These assumptions are as follows:
The relationship between \(X\) and \(Y\) is determined by a linear model of the form \(Y = \beta_0 + \beta_1 X + \varepsilon\).
Seperate observations of \(\varepsilon\) are independent from one another.
The error term \(\varepsilon\) is normally distributed with a mean of 0 and standard deviation \(\sigma\). That is, \(\varepsilon \sim N(0,\sigma^2)\).
The error term \(\varepsilon\) is independent from \(X\). In particular, the variance \(\sigma^2\) does not depend on \(X\).
Note that these assumptions are not required in order to find or even apply the OLS regression line. They are, however, necessary if we wish to use the model for inferential purposes.
Residual Standard Error
If we are only interested in using a simple linear regression model for the purposes of making point predictions, then we need only to find estimates for the parameters \(\beta_0\) and \(\beta_1\). However, if we wish to quantify the uncertainty in these predictions, or if we would like to conduct any sort of statistical inference using our model, then we also need an estimate for \(\mathrm{Var}\left[\varepsilon \right] = \sigma^2\). Such an estimate is provided by the quantity \(s^2\) defined below:
\[s^2 = \frac{SSE}{n-2}\] If the Gauss-Markov assumptions hold, then \(s^2\) is an unbiased estimator of \(\sigma^2\).
The square root of \(s^2\) is referred to as the residual standard error. It is typically denoted by either \(s\) or \(RSE\).
Distribution of Parameter Estimates
Assume that we fix several \(X\) values, \(x_1, ..., x_n\) and that we use these \(X\) values to generate \(Y\) values \(y_1, ..., y_n\) according to a hypothetical model \(Y = \beta_0 + \beta_1 X + \varepsilon\). Suppose we then calculate parameter estimates \(\hat\beta_0\) and \(\hat\beta_1\).
If we repeat this process, we will get different values of \(y_1, ..., y_n\) each time, since the error terms \(\varepsilon_i\) are assumed to be random. Since our \(Y\) values will vary each time, so too will our parameter estimates \(\hat\beta_0\) and \(\hat\beta_1\). In this way, our parameter estimates are random variables whose distribution depends on that of \(\varepsilon\).
It can be shown that if the Gauss-Markov assumptions hold, then the distibutions of \(\hat\beta_0\) and \(\hat\beta_1\) are as follows:
Unfortunately, we don’t typically know \(\mathrm{Var}[\varepsilon] = \sigma^2\). If we do not know \(\sigma^2\), then we will need to approximate it using \(s^2 = \frac{SSE}{n-2}\). Replacing \(\sigma^2\) with \(s^2\) in the variance formulas above, and then taking square roots results in the appoximations for \(\mathrm{SD}[\hat\beta_0]\) and \(\mathrm{SD}[\hat\beta_1]\) shown below. These approximations are called the standard errors of the parameter estimates.
Hypothesis Tests for Parameters
It is often useful to be able to test the hypothesis that a particular parameter is equal to a specific number. In other words, we want to be able to conduct hypothesis tests of the following form:
\(\hspace{30pt} H_0: \beta_i = k\)
\(\hspace{30pt} H_A: \beta_i \neq k\)
We can perform such a test using the following test statistic:
\(\large\hspace{30pt} t = \frac{\hat\beta_{i} - k}{\mathrm{SE}[\hat\beta_i]}\)
This test statistic will follow a t distribution with \(n-2\) degrees of freedom.
Although we can test either regression parameter for any value of \(k\), the test that we will be most interested in is the following:
\(\hspace{30pt} H_0: \beta_1 = 0\)
\(\hspace{30pt} H_A: \beta_1 \neq 0\)
If we are unable to reject the null hypothesis in this test, then we can not be confident that the parameter \(\beta_1\) is non-zero. If \(\beta_1 = 0\), then our hypothetical model reduces to \(Y = \beta_0 + e\), and there is no relationship between \(X\) and \(Y\).
Hypothesis Tests in R
Fortunately, R will test for the regression parameters being zero when you call the lm()
function. The results of these tests are displayed in the summary output for the model. To demonstrate this, we will consider the following simulated data.
set.seed(45)
n = 100
x <- runif(n, 0, 10)
y <- 8 + 1.3 * x + rnorm(n, 0, 15)
m <- lm(y ~ x)
summary(m)
Call:
lm(formula = y ~ x)
Residuals:
Min 1Q Median 3Q Max
-31.210 -11.303 2.015 10.053 54.098
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 9.4861 3.2981 2.876 0.00494 **
x 0.9987 0.5707 1.750 0.08326 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 15.61 on 98 degrees of freedom
Multiple R-squared: 0.0303, Adjusted R-squared: 0.02041
F-statistic: 3.062 on 1 and 98 DF, p-value: 0.08326
The summary above tells use the the p-value for the following test is equal to \(p = 0.00494\).
\(\hspace{30pt} H_0: \beta_0 = 0\)
\(\hspace{30pt} H_A: \beta_0 \neq 0\)
The summary also tells use the the p-value for the test below is equal to \(p = 0.08326\).
\(\hspace{30pt} H_0: \beta_1 = 0\)
\(\hspace{30pt} H_A: \beta_1 \neq 0\)
If we had decided in advance to use a significance level of \(\alpha = 0.05\), then we would be able to reject the hypothesis that the intercept was non-zero, but we would not have enough evidence to reject the hypothesis that the slope was non-zero.
The figure below displays a plot of the data set, along with the population and fitted models.
plot(y ~ x, pch=21, bg="cyan", col="black", cex=1)
abline(m$coefficients, col="darkred", lwd=2)
abline(7, 1.3, col="darkblue", lwd=2, lty=2)

Confidence and Prediction Intervals
Assume that we have a fitted simple linear regression model \(\hat Y = \beta_0 + \beta_1 X\). Given a predictor value \(X = x_0\), we can use the the model to generate a point prediction \(y_0\) for the response variable \(Y\). It is often useful to be able to quantify the amount of uncertainty there is a prediction of this sort. We will provide two ways of describing this uncertainty: confidence intervals and prediction intervals.
Confidence Intervals
A confidence interval can be thought of as a vertical interval through which we are reasonably confident the line representing our population model passes.
More precisely, a \(100\beta\%\) confidence interval given \(X = x_0\) is a range of \(Y\) values that we are \(100\beta\%\) confident will contain \(\mathrm{E}[Y | X=x_0] = \beta_0 + \beta_1 x_0\).
Such an interval accounts for the possible errors in the approximations of \(\hat\beta_0\) and \(\hat\beta_1\), but does not account for the uncertainty resulting from the noise term \(\varepsilon\).
The \(100\beta\%\) confidence interval for \(\mathrm{E}[Y | X=x_0] = \beta_0 + \beta_1 x_0\) is given by:
\[\hat y_0 \pm t_{(n-2, \alpha / 2)} \cdot s \sqrt{\frac{1}{n} + \frac{(x_0 - \bar x)^2}{(n-1)s_X^2}} \] The \(\alpha\) in the formula above is given by \(\alpha = 1 - \beta\).
Prediction Intervals
A prediction interval can be thought of as a vertical interval that we are reasonably confident will contain the \(y\) coordinate of an observation with a given \(x\) coordinate.
More precisely, a \(100\beta\%\) prediction interval given \(X = x_0\) is a range of \(Y\) values that we are \(100\beta\%\) confident will contain \(y_0 = \beta_0 + \beta_1 x_0 + \varepsilon_0\).
Such an interval accounts for the possible errors in the approximations of \(\hat\beta_0\) and \(\hat\beta_1\), as well as the uncertainty resulting from the noise term \(\varepsilon\).
Prediction intervals are ALWAYS wider than confidence intervals.
The \(100\beta\%\) confidence interval for \(y_0 = \beta_0 + \beta_1 x_0 + \varepsilon_0\) is given by:
\[\hat y_0 \pm t_{(n-2, \alpha / 2)} \cdot s \sqrt{1 + \frac{1}{n} + \frac{(x_0 - \bar x)^2}{(n-1)s_X^2}} \] The \(\alpha\) in the formula above is given by \(\alpha = 1 - \beta\).
Simulated Example
set.seed(1)
n = 10
x <- 8 + 1:n / 5
y <- 2*x + 3 + rnorm(n,0,0.8)
model <- lm(y~x)
plot(y ~ x, xlim=c(8,10.1), ylim=c(17,26), col="black", bg="red", pch=21, cex=1)
abline(model$coefficients, col="blue", lwd="2")

Let find the 95% confidence and prediction intervals for \(X=9\).
n = 10
x_ = 9
yhat = model$coefficients[1] + model$coefficients[2] * x_
s2 = sum((model$residuals)^2) / (n - 2)
s = sqrt(s2)
ci_sqrt = sqrt(1/n + (x_ - mean(x))^2 / ((n-1) * var(x)) )
pi_sqrt = sqrt(1 + 1/n + (x_ - mean(x))^2 / ((n-1) * var(x)) )
t = qt(0.975, n-2)
ci = c(yhat - t * s * ci_sqrt, yhat + t * s * ci_sqrt)
pi = c(yhat - t * s * pi_sqrt, yhat + t * s * pi_sqrt)
names(ci) = c('lower', 'upper')
names(pi) = c('lower', 'upper')
rbind(ci, pi)
lower upper
ci 20.60478 21.56296
pi 19.51630 22.65144
Let’s check our answer using the predict()
function.
nd <- data.frame(x=9)
conf <- predict(model, interval="confidence", level=0.95, newdata=nd)
pred <- predict(model, interval="prediction", level=0.95, newdata=nd)
rbind(conf, pred)
fit lwr upr
1 21.08387 20.60478 21.56296
1 21.08387 19.51630 22.65144

LS0tDQp0aXRsZTogIkxlc3NvbiAzLjMgLSBJbmZlcmVuY2UgaW4gU0xSIg0KYXV0aG9yOiAiUm9iYmllIEJlYW5lIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiBmbGF0bHkNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDQNCi0tLQ0KDQojIyMgKipHYXVzcy1NYXJrb3YgQXNzdW1wdGlvbnMqKg0KDQpJbiB0aGUgbGFzdCBsZXNzb24sIHdlIGludHJvZHVjZWQgYSBzZXQgb2YgYXNzdW1wdGlvbnMgdGhhdCB3ZSB3aWxsIGNvbW1vbmx5IG1ha2UgcmVnYXJkaW5nIHRoZSBlcnJvciB0ZXJtIGluIG91ciBoeXBvdGhldGljYWwgbW9kZWwgJFkgPSBcYmV0YV8wICsgXGJldGFfMSBYICsgXHZhcmVwc2lsb24kLiBUaGVzZSBhc3N1bXB0aW9ucyBhcmUgYXMgZm9sbG93czoNCg0KMS4gVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuICRYJCBhbmQgJFkkIGlzIGRldGVybWluZWQgYnkgYSBsaW5lYXIgbW9kZWwgb2YgdGhlIGZvcm0gJFkgPSBcYmV0YV8wICsgXGJldGFfMSBYICsgXHZhcmVwc2lsb24kLiANCg0KMi4gU2VwZXJhdGUgb2JzZXJ2YXRpb25zIG9mICRcdmFyZXBzaWxvbiQgYXJlIGluZGVwZW5kZW50IGZyb20gb25lIGFub3RoZXIuIA0KDQozLiBUaGUgZXJyb3IgdGVybSAkXHZhcmVwc2lsb24kIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIHdpdGggYSBtZWFuIG9mIDAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAkXHNpZ21hJC4gVGhhdCBpcywgJFx2YXJlcHNpbG9uIFxzaW0gTigwLFxzaWdtYV4yKSQuIA0KDQo0LiBUaGUgZXJyb3IgdGVybSAkXHZhcmVwc2lsb24kIGlzIGluZGVwZW5kZW50IGZyb20gJFgkLiBJbiBwYXJ0aWN1bGFyLCB0aGUgdmFyaWFuY2UgJFxzaWdtYV4yJCBkb2VzIG5vdCBkZXBlbmQgb24gJFgkLg0KDQpOb3RlIHRoYXQgdGhlc2UgYXNzdW1wdGlvbnMgYXJlIG5vdCByZXF1aXJlZCBpbiBvcmRlciB0byBmaW5kIG9yIGV2ZW4gYXBwbHkgdGhlIE9MUyByZWdyZXNzaW9uIGxpbmUuIFRoZXkgYXJlLCBob3dldmVyLCBuZWNlc3NhcnkgaWYgd2Ugd2lzaCB0byB1c2UgdGhlIG1vZGVsIGZvciBpbmZlcmVudGlhbCBwdXJwb3Nlcy4gICANCg0KDQojIyMgKipSZXNpZHVhbCBTdGFuZGFyZCBFcnJvcioqDQoNCklmIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdXNpbmcgYSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgZm9yIHRoZSBwdXJwb3NlcyBvZiBtYWtpbmcgcG9pbnQgcHJlZGljdGlvbnMsIHRoZW4gd2UgbmVlZCBvbmx5IHRvIGZpbmQgZXN0aW1hdGVzIGZvciB0aGUgcGFyYW1ldGVycyAkXGJldGFfMCQgYW5kICRcYmV0YV8xJC4gSG93ZXZlciwgaWYgd2Ugd2lzaCB0byBxdWFudGlmeSB0aGUgdW5jZXJ0YWludHkgaW4gdGhlc2UgcHJlZGljdGlvbnMsIG9yIGlmIHdlIHdvdWxkIGxpa2UgdG8gY29uZHVjdCBhbnkgc29ydCBvZiBzdGF0aXN0aWNhbCBpbmZlcmVuY2UgdXNpbmcgb3VyIG1vZGVsLCB0aGVuIHdlIGFsc28gbmVlZCBhbiBlc3RpbWF0ZSBmb3IgJFxtYXRocm17VmFyfVxsZWZ0W1x2YXJlcHNpbG9uIFxyaWdodF0gPSBcc2lnbWFeMiQuIFN1Y2ggYW4gZXN0aW1hdGUgaXMgcHJvdmlkZWQgYnkgdGhlIHF1YW50aXR5ICRzXjIkIGRlZmluZWQgYmVsb3c6DQoNCiQkc14yID0gXGZyYWN7U1NFfXtuLTJ9JCQNCklmIHRoZSBHYXVzcy1NYXJrb3YgYXNzdW1wdGlvbnMgaG9sZCwgdGhlbiAkc14yJCBpcyBhbiB1bmJpYXNlZCBlc3RpbWF0b3Igb2YgJFxzaWdtYV4yJC4gDQoNClRoZSBzcXVhcmUgcm9vdCBvZiAkc14yJCBpcyByZWZlcnJlZCB0byBhcyB0aGUgKipyZXNpZHVhbCBzdGFuZGFyZCBlcnJvcioqLiBJdCBpcyB0eXBpY2FsbHkgZGVub3RlZCBieSBlaXRoZXIgJHMkIG9yICRSU0UkLiANCg0KDQojIyMgKipEaXN0cmlidXRpb24gb2YgUGFyYW1ldGVyIEVzdGltYXRlcyoqDQoNCkFzc3VtZSB0aGF0IHdlIGZpeCBzZXZlcmFsICRYJCB2YWx1ZXMsICR4XzEsIC4uLiwgeF9uJCBhbmQgdGhhdCB3ZSB1c2UgdGhlc2UgJFgkIHZhbHVlcyB0byBnZW5lcmF0ZSAkWSQgdmFsdWVzICR5XzEsIC4uLiwgeV9uJCBhY2NvcmRpbmcgdG8gYSBoeXBvdGhldGljYWwgbW9kZWwgJFkgPSBcYmV0YV8wICsgXGJldGFfMSBYICsgXHZhcmVwc2lsb24kLiBTdXBwb3NlIHdlIHRoZW4gY2FsY3VsYXRlIHBhcmFtZXRlciBlc3RpbWF0ZXMgJFxoYXRcYmV0YV8wJCBhbmQgJFxoYXRcYmV0YV8xJC4NCg0KSWYgd2UgcmVwZWF0IHRoaXMgcHJvY2Vzcywgd2Ugd2lsbCBnZXQgZGlmZmVyZW50IHZhbHVlcyBvZiAkeV8xLCAuLi4sIHlfbiQgZWFjaCB0aW1lLCBzaW5jZSB0aGUgZXJyb3IgdGVybXMgJFx2YXJlcHNpbG9uX2kkIGFyZSBhc3N1bWVkIHRvIGJlIHJhbmRvbS4gU2luY2Ugb3VyICRZJCB2YWx1ZXMgd2lsbCB2YXJ5IGVhY2ggdGltZSwgc28gdG9vIHdpbGwgb3VyIHBhcmFtZXRlciBlc3RpbWF0ZXMgJFxoYXRcYmV0YV8wJCBhbmQgJFxoYXRcYmV0YV8xJC4gSW4gdGhpcyB3YXksIG91ciBwYXJhbWV0ZXIgZXN0aW1hdGVzIGFyZSByYW5kb20gdmFyaWFibGVzIHdob3NlIGRpc3RyaWJ1dGlvbiBkZXBlbmRzIG9uIHRoYXQgb2YgJFx2YXJlcHNpbG9uJC4gDQoNCkl0IGNhbiBiZSBzaG93biB0aGF0IGlmIHRoZSBHYXVzcy1NYXJrb3YgYXNzdW1wdGlvbnMgaG9sZCwgdGhlbiB0aGUgZGlzdGlidXRpb25zIG9mICRcaGF0XGJldGFfMCQgYW5kICRcaGF0XGJldGFfMSQgYXJlIGFzIGZvbGxvd3M6DQoNCiogJFxoYXRcYmV0YV8wJCBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoOg0KDQogICAgKiAkXG11X3tcaGF0XGJldGFfMH0gPSBcbWF0aHJte0V9W1xoYXRcYmV0YV8wXSA9IFxiZXRhXzAkDQogICAgDQogICAgKiAkXHNpZ21hX3tcaGF0XGJldGFfMH1eMiA9IFxtYXRocm17VmFyfVtcaGF0XGJldGFfMF0gPSBcc2lnbWFeMiBcbGVmdFtcZnJhY3sxfXtufSArIFxmcmFje1xiYXIgeF4yfXtTX3tYWH19IFxyaWdodF0kDQoNCiogJFxoYXRcYmV0YV8xJCBmb2xsb3dzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoOg0KDQogICAgKiAkXG11X3tcaGF0XGJldGFfMX0gPSBcbWF0aHJte0V9W1xoYXRcYmV0YV8xXSA9IFxiZXRhXzEkDQogICAgDQogICAgKiAkXHNpZ21hX3tcaGF0XGJldGFfMX1eMiA9IFxtYXRocm17VmFyfVtcaGF0XGJldGFfMV0gPSBcZnJhY3tcc2lnbWFeMn17U197WFh9fSQNCg0KDQpVbmZvcnR1bmF0ZWx5LCB3ZSBkb24ndCB0eXBpY2FsbHkga25vdyAkXG1hdGhybXtWYXJ9W1x2YXJlcHNpbG9uXSA9IFxzaWdtYV4yJC4gSWYgd2UgZG8gbm90IGtub3cgJFxzaWdtYV4yJCwgdGhlbiB3ZSB3aWxsIG5lZWQgdG8gYXBwcm94aW1hdGUgaXQgdXNpbmcgJHNeMiA9IFxmcmFje1NTRX17bi0yfSQuIFJlcGxhY2luZyAkXHNpZ21hXjIkIHdpdGggJHNeMiQgaW4gdGhlIHZhcmlhbmNlIGZvcm11bGFzIGFib3ZlLCBhbmQgdGhlbiB0YWtpbmcgc3F1YXJlIHJvb3RzIHJlc3VsdHMgaW4gdGhlIGFwcG94aW1hdGlvbnMgZm9yICRcbWF0aHJte1NEfVtcaGF0XGJldGFfMF0kIGFuZCAkXG1hdGhybXtTRH1bXGhhdFxiZXRhXzFdJCBzaG93biBiZWxvdy4gVGhlc2UgYXBwcm94aW1hdGlvbnMgYXJlIGNhbGxlZCB0aGUgKipzdGFuZGFyZCBlcnJvcnMqKiBvZiB0aGUgcGFyYW1ldGVyIGVzdGltYXRlcy4NCg0KICAgIA0KICAqICRcbWF0aHJte1NEfVtcaGF0XGJldGFfMF0gXGFwcHJveCBcbWF0aHJte1NFfVtcaGF0XGJldGFfMF0gPSBzIFxzcXJ0e1xmcmFjezF9e259ICsgXGZyYWN7XGJhciB4XjJ9e1Nfe1hYfX0gfSQNCiAgDQogICogJFxtYXRocm17U0R9W1xoYXRcYmV0YV8xXSBcYXBwcm94IFxtYXRocm17U0V9W1xoYXRcYmV0YV8xXSA9IFxmcmFje3N9e1xzcXJ0e1Nfe1hYfX19JA0KDQoNCiMjIyAqKkh5cG90aGVzaXMgVGVzdHMgZm9yIFBhcmFtZXRlcnMqKg0KDQpJdCBpcyBvZnRlbiB1c2VmdWwgdG8gYmUgYWJsZSB0byB0ZXN0IHRoZSBoeXBvdGhlc2lzIHRoYXQgYSBwYXJ0aWN1bGFyIHBhcmFtZXRlciBpcyBlcXVhbCB0byBhIHNwZWNpZmljIG51bWJlci4gSW4gb3RoZXIgd29yZHMsIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBjb25kdWN0IGh5cG90aGVzaXMgdGVzdHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtOg0KDQoNCiRcaHNwYWNlezMwcHR9IEhfMDogXGJldGFfaSA9IGskDQoNCiRcaHNwYWNlezMwcHR9IEhfQTogXGJldGFfaSBcbmVxIGskDQoNCldlIGNhbiBwZXJmb3JtIHN1Y2ggYSB0ZXN0IHVzaW5nIHRoZSBmb2xsb3dpbmcgdGVzdCBzdGF0aXN0aWM6DQoNCiRcbGFyZ2VcaHNwYWNlezMwcHR9IHQgPSBcZnJhY3tcaGF0XGJldGFfe2l9IC0ga317XG1hdGhybXtTRX1bXGhhdFxiZXRhX2ldfSQNCg0KVGhpcyB0ZXN0IHN0YXRpc3RpYyB3aWxsIGZvbGxvdyBhIHQgZGlzdHJpYnV0aW9uIHdpdGggJG4tMiQgZGVncmVlcyBvZiBmcmVlZG9tLiANCg0KDQpBbHRob3VnaCB3ZSBjYW4gdGVzdCBlaXRoZXIgcmVncmVzc2lvbiBwYXJhbWV0ZXIgZm9yIGFueSB2YWx1ZSBvZiAkayQsIHRoZSB0ZXN0IHRoYXQgd2Ugd2lsbCBiZSBtb3N0IGludGVyZXN0ZWQgaW4gaXMgdGhlIGZvbGxvd2luZzoNCg0KJFxoc3BhY2V7MzBwdH0gSF8wOiBcYmV0YV8xID0gMCQNCg0KJFxoc3BhY2V7MzBwdH0gSF9BOiBcYmV0YV8xIFxuZXEgMCQNCg0KSWYgd2UgYXJlIHVuYWJsZSB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcyBpbiB0aGlzIHRlc3QsIHRoZW4gd2UgY2FuIG5vdCBiZSBjb25maWRlbnQgdGhhdCB0aGUgcGFyYW1ldGVyICRcYmV0YV8xJCBpcyBub24temVyby4gSWYgJFxiZXRhXzEgPSAwJCwgdGhlbiBvdXIgaHlwb3RoZXRpY2FsIG1vZGVsIHJlZHVjZXMgdG8gJFkgPSBcYmV0YV8wICsgZSQsIGFuZCB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiAkWCQgYW5kICRZJC4gDQoNCg0KIyMjIyAqKkh5cG90aGVzaXMgVGVzdHMgaW4gUioqDQoNCkZvcnR1bmF0ZWx5LCBSIHdpbGwgdGVzdCBmb3IgdGhlIHJlZ3Jlc3Npb24gcGFyYW1ldGVycyBiZWluZyB6ZXJvIHdoZW4geW91IGNhbGwgdGhlIGBsbSgpYCBmdW5jdGlvbi4gVGhlIHJlc3VsdHMgb2YgdGhlc2UgdGVzdHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgc3VtbWFyeSBvdXRwdXQgZm9yIHRoZSBtb2RlbC4gVG8gZGVtb25zdHJhdGUgdGhpcywgd2Ugd2lsbCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHNpbXVsYXRlZCBkYXRhLiANCg0KYGBge3J9DQpzZXQuc2VlZCg0NSkNCg0KbiA9IDEwMA0KeCA8LSBydW5pZihuLCAwLCAxMCkNCnkgPC0gOCArIDEuMyAqIHggKyBybm9ybShuLCAwLCAxNSkNCg0KbSA8LSBsbSh5IH4geCkNCg0Kc3VtbWFyeShtKQ0KYGBgDQoNClRoZSBzdW1tYXJ5IGFib3ZlIHRlbGxzIHVzZSB0aGUgdGhlIHAtdmFsdWUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyBlcXVhbCB0byAkcCA9IDAuMDA0OTQkLiANCg0KJFxoc3BhY2V7MzBwdH0gSF8wOiBcYmV0YV8wID0gMCQNCg0KJFxoc3BhY2V7MzBwdH0gSF9BOiBcYmV0YV8wIFxuZXEgMCQNCg0KDQpUaGUgc3VtbWFyeSBhbHNvIHRlbGxzIHVzZSB0aGUgdGhlIHAtdmFsdWUgZm9yIHRoZSB0ZXN0IGJlbG93IGlzIGVxdWFsIHRvICRwID0gMC4wODMyNiQuIA0KDQokXGhzcGFjZXszMHB0fSBIXzA6IFxiZXRhXzEgPSAwJA0KDQokXGhzcGFjZXszMHB0fSBIX0E6IFxiZXRhXzEgXG5lcSAwJA0KDQpJZiB3ZSBoYWQgZGVjaWRlZCBpbiBhZHZhbmNlIHRvIHVzZSBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAkXGFscGhhID0gMC4wNSQsIHRoZW4gd2Ugd291bGQgYmUgYWJsZSB0byByZWplY3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGUgaW50ZXJjZXB0IHdhcyBub24temVybywgYnV0IHdlIHdvdWxkIG5vdCBoYXZlIGVub3VnaCBldmlkZW5jZSB0byByZWplY3QgdGhlIGh5cG90aGVzaXMgdGhhdCB0aGUgc2xvcGUgd2FzIG5vbi16ZXJvLiANCg0KVGhlIGZpZ3VyZSBiZWxvdyBkaXNwbGF5cyBhIHBsb3Qgb2YgdGhlIGRhdGEgc2V0LCBhbG9uZyB3aXRoIHRoZSBwb3B1bGF0aW9uIGFuZCBmaXR0ZWQgbW9kZWxzLiANCg0KDQoNCmBgYHtyfQ0KDQpwbG90KHkgfiB4LCBwY2g9MjEsIGJnPSJjeWFuIiwgY29sPSJibGFjayIsIGNleD0xKQ0KYWJsaW5lKG0kY29lZmZpY2llbnRzLCBjb2w9ImRhcmtyZWQiLCBsd2Q9MikNCmFibGluZSg3LCAxLjMsIGNvbD0iZGFya2JsdWUiLCBsd2Q9MiwgbHR5PTIpDQoNCmBgYA0KDQojIyMgKipDb25maWRlbmNlIGFuZCBQcmVkaWN0aW9uIEludGVydmFscyoqDQoNCkFzc3VtZSB0aGF0IHdlIGhhdmUgYSBmaXR0ZWQgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsICRcaGF0IFkgPSBcYmV0YV8wICsgXGJldGFfMSBYJC4gR2l2ZW4gYSBwcmVkaWN0b3IgdmFsdWUgJFggPSB4XzAkLCB3ZSBjYW4gdXNlIHRoZSB0aGUgbW9kZWwgdG8gZ2VuZXJhdGUgYSBwb2ludCBwcmVkaWN0aW9uICR5XzAkIGZvciB0aGUgcmVzcG9uc2UgdmFyaWFibGUgJFkkLiBJdCBpcyBvZnRlbiB1c2VmdWwgdG8gYmUgYWJsZSB0byBxdWFudGlmeSB0aGUgYW1vdW50IG9mIHVuY2VydGFpbnR5IHRoZXJlIGlzIGEgcHJlZGljdGlvbiBvZiB0aGlzIHNvcnQuIFdlIHdpbGwgcHJvdmlkZSB0d28gd2F5cyBvZiBkZXNjcmliaW5nIHRoaXMgdW5jZXJ0YWludHk6ICoqY29uZmlkZW5jZSBpbnRlcnZhbHMqKiBhbmQgKipwcmVkaWN0aW9uIGludGVydmFscyoqLiANCg0KDQojIyMjICoqQ29uZmlkZW5jZSBJbnRlcnZhbHMqKg0KDQpBICoqY29uZmlkZW5jZSBpbnRlcnZhbCoqIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgdmVydGljYWwgaW50ZXJ2YWwgdGhyb3VnaCB3aGljaCB3ZSBhcmUgcmVhc29uYWJseSBjb25maWRlbnQgdGhlIGxpbmUgcmVwcmVzZW50aW5nIG91ciBwb3B1bGF0aW9uIG1vZGVsIHBhc3Nlcy4gDQoNCk1vcmUgcHJlY2lzZWx5LCBhICQxMDBcYmV0YVwlJCBjb25maWRlbmNlIGludGVydmFsIGdpdmVuICRYID0geF8wJCBpcyBhIHJhbmdlIG9mICRZJCB2YWx1ZXMgdGhhdCB3ZSBhcmUgJDEwMFxiZXRhXCUkIGNvbmZpZGVudCB3aWxsIGNvbnRhaW4gJFxtYXRocm17RX1bWSB8IFg9eF8wXSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfMCQuIA0KDQpTdWNoIGFuIGludGVydmFsIGFjY291bnRzIGZvciB0aGUgcG9zc2libGUgZXJyb3JzIGluIHRoZSBhcHByb3hpbWF0aW9ucyBvZiAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkLCBidXQgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIHVuY2VydGFpbnR5IHJlc3VsdGluZyBmcm9tIHRoZSBub2lzZSB0ZXJtICRcdmFyZXBzaWxvbiQuIA0KDQpUaGUgJDEwMFxiZXRhXCUkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICRcbWF0aHJte0V9W1kgfCBYPXhfMF0gPSBcYmV0YV8wICsgXGJldGFfMSB4XzAkIGlzIGdpdmVuIGJ5Og0KDQokJFxoYXQgeV8wIFxwbSB0X3sobi0yLCBcYWxwaGEgLyAyKX0gXGNkb3QgcyBcc3FydHtcZnJhY3sxfXtufSArIFxmcmFjeyh4XzAgLSBcYmFyIHgpXjJ9eyhuLTEpc19YXjJ9fSAkJA0KVGhlICRcYWxwaGEkIGluIHRoZSBmb3JtdWxhIGFib3ZlIGlzIGdpdmVuIGJ5ICRcYWxwaGEgPSAxIC0gXGJldGEkLiANCg0KIyMjIyAqKlByZWRpY3Rpb24gSW50ZXJ2YWxzKioNCg0KQSAqKnByZWRpY3Rpb24gaW50ZXJ2YWwqKiBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHZlcnRpY2FsIGludGVydmFsIHRoYXQgd2UgYXJlIHJlYXNvbmFibHkgY29uZmlkZW50IHdpbGwgY29udGFpbiB0aGUgJHkkIGNvb3JkaW5hdGUgb2YgYW4gb2JzZXJ2YXRpb24gd2l0aCBhIGdpdmVuICR4JCBjb29yZGluYXRlLiANCg0KTW9yZSBwcmVjaXNlbHksIGEgJDEwMFxiZXRhXCUkIHByZWRpY3Rpb24gaW50ZXJ2YWwgZ2l2ZW4gJFggPSB4XzAkIGlzIGEgcmFuZ2Ugb2YgJFkkIHZhbHVlcyB0aGF0IHdlIGFyZSAkMTAwXGJldGFcJSQgY29uZmlkZW50IHdpbGwgY29udGFpbiAkeV8wID0gXGJldGFfMCArIFxiZXRhXzEgeF8wICsgXHZhcmVwc2lsb25fMCQuIA0KDQpTdWNoIGFuIGludGVydmFsIGFjY291bnRzIGZvciB0aGUgcG9zc2libGUgZXJyb3JzIGluIHRoZSBhcHByb3hpbWF0aW9ucyBvZiAkXGhhdFxiZXRhXzAkIGFuZCAkXGhhdFxiZXRhXzEkLCBhcyB3ZWxsIGFzIHRoZSB1bmNlcnRhaW50eSByZXN1bHRpbmcgZnJvbSB0aGUgbm9pc2UgdGVybSAkXHZhcmVwc2lsb24kLiANCg0KUHJlZGljdGlvbiBpbnRlcnZhbHMgYXJlIEFMV0FZUyB3aWRlciB0aGFuIGNvbmZpZGVuY2UgaW50ZXJ2YWxzLiANCg0KVGhlICQxMDBcYmV0YVwlJCBjb25maWRlbmNlIGludGVydmFsIGZvciAkeV8wID0gXGJldGFfMCArIFxiZXRhXzEgeF8wICsgXHZhcmVwc2lsb25fMCQgaXMgZ2l2ZW4gYnk6DQoNCiQkXGhhdCB5XzAgXHBtIHRfeyhuLTIsIFxhbHBoYSAvIDIpfSBcY2RvdCBzIFxzcXJ0ezEgKyBcZnJhY3sxfXtufSArIFxmcmFjeyh4XzAgLSBcYmFyIHgpXjJ9eyhuLTEpc19YXjJ9fSAkJA0KVGhlICRcYWxwaGEkIGluIHRoZSBmb3JtdWxhIGFib3ZlIGlzIGdpdmVuIGJ5ICRcYWxwaGEgPSAxIC0gXGJldGEkLiANCg0KDQojIyMjICoqU3VtbWFyeSBvZiBGb3JtdWxhcyoqDQoNClRoZSAkMTAwXGJldGFcJSQgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJFxtYXRocm17RX1bWSB8IFg9eF8wXSA9IFxiZXRhXzAgKyBcYmV0YV8xIHhfMCQgaXMgZ2l2ZW4gYnk6DQoNCiQkXGhhdCB5XzAgXHBtIHRfeyhuLTIsIFxhbHBoYSAvIDIpfSBcY2RvdCBzIFxzcXJ0e1xmcmFjezF9e259ICsgXGZyYWN7KHhfMCAtIFxiYXIgeCleMn17KG4tMSlzX1heMn19ICQkDQpUaGUgJDEwMFxiZXRhXCUkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yICR5XzAgPSBcYmV0YV8wICsgXGJldGFfMSB4XzAgKyBcdmFyZXBzaWxvbl8wJCBpcyBnaXZlbiBieToNCg0KJCRcaGF0IHkgXHBtIHRfeyhuLTIsIFxhbHBoYSAvIDIpfSBcY2RvdCBzIFxzcXJ0ezEgKyBcZnJhY3sxfXtufSArIFxmcmFjeyh4IC0gXGJhciB4KV4yfXsobi0xKXNfWF4yfX0gJCQNCkluIGVhY2ggZm9ybXVsYSwgd2UgaGF2ZSB0aGF0ICRcYWxwaGEgPSAxIC0gXGJldGEkLiANCg0KDQoNCiMjIyMgKipTaW11bGF0ZWQgRXhhbXBsZSoqDQoNCg0KYGBge3J9DQpzZXQuc2VlZCgxKQ0KbiA9IDEwDQp4IDwtIDggKyAxOm4gLyA1DQp5IDwtIDIqeCArIDMgKyBybm9ybShuLDAsMC44KQ0KDQptb2RlbCA8LSBsbSh5fngpDQogICAgICAgICAgDQpwbG90KHkgfiB4LCB4bGltPWMoOCwxMC4xKSwgeWxpbT1jKDE3LDI2KSwgY29sPSJibGFjayIsIGJnPSJyZWQiLCBwY2g9MjEsIGNleD0xKQ0KYWJsaW5lKG1vZGVsJGNvZWZmaWNpZW50cywgY29sPSJibHVlIiwgbHdkPSIyIikNCg0KYGBgDQoNCkxldCBmaW5kIHRoZSA5NSUgY29uZmlkZW5jZSBhbmQgcHJlZGljdGlvbiBpbnRlcnZhbHMgZm9yICRYPTkkLiANCg0KYGBge3J9DQpuID0gMTANCnhfID0gOQ0KDQp5aGF0ID0gbW9kZWwkY29lZmZpY2llbnRzWzFdICsgbW9kZWwkY29lZmZpY2llbnRzWzJdICogeF8NCg0KczIgPSBzdW0oKG1vZGVsJHJlc2lkdWFscyleMikgLyAobiAtIDIpDQpzID0gc3FydChzMikNCg0KY2lfc3FydCA9IHNxcnQoMS9uICsgKHhfIC0gbWVhbih4KSleMiAvICgobi0xKSAqIHZhcih4KSkgKQ0KcGlfc3FydCA9IHNxcnQoMSArIDEvbiArICh4XyAtIG1lYW4oeCkpXjIgLyAoKG4tMSkgKiB2YXIoeCkpICkNCg0KdCA9IHF0KDAuOTc1LCBuLTIpDQoNCmNpID0gYyh5aGF0IC0gdCAqIHMgKiBjaV9zcXJ0LCB5aGF0ICsgdCAqIHMgKiBjaV9zcXJ0KQ0KcGkgPSBjKHloYXQgLSB0ICogcyAqIHBpX3NxcnQsIHloYXQgKyB0ICogcyAqIHBpX3NxcnQpDQoNCm5hbWVzKGNpKSA9IGMoJ2xvd2VyJywgJ3VwcGVyJykNCm5hbWVzKHBpKSA9IGMoJ2xvd2VyJywgJ3VwcGVyJykNCg0KcmJpbmQoY2ksIHBpKQ0KYGBgDQoNCkxldCdzIGNoZWNrIG91ciBhbnN3ZXIgdXNpbmcgdGhlIGBwcmVkaWN0KClgIGZ1bmN0aW9uLg0KDQpgYGB7cn0NCm5kIDwtIGRhdGEuZnJhbWUoeD05KQ0KY29uZiA8LSBwcmVkaWN0KG1vZGVsLCBpbnRlcnZhbD0iY29uZmlkZW5jZSIsIGxldmVsPTAuOTUsIG5ld2RhdGE9bmQpDQpwcmVkIDwtIHByZWRpY3QobW9kZWwsIGludGVydmFsPSJwcmVkaWN0aW9uIiwgbGV2ZWw9MC45NSwgbmV3ZGF0YT1uZCkNCg0KcmJpbmQoY29uZiwgcHJlZCkNCmBgYA0KDQoNCmBgYHtyLCBlY2hvPUZBTFNFfQ0KDQpzZXQuc2VlZCgxKQ0KeCA8LSA4ICsgMToxMCAvIDUNCnkgPC0gMip4ICsgMyArIHJub3JtKDEwLDAsMC44KQ0KDQptb2RlbCA8LSBsbSh5fngpDQogICAgICAgICAgDQpuZCA8LSBkYXRhLmZyYW1lKHg9c2VxKDgsMTIsbGVuZ3RoPTUxKSkNCnBfY29uZiA8LSBwcmVkaWN0KG1vZGVsLCBpbnRlcnZhbD0iY29uZmlkZW5jZSIsIGxldmVsPTAuOTUsIG5ld2RhdGE9bmQpDQpwX3ByZWQgPC0gcHJlZGljdChtb2RlbCwgaW50ZXJ2YWw9InByZWRpY3Rpb24iLCBsZXZlbD0wLjk1LCBuZXdkYXRhPW5kKQ0KICAgICAgICAgIA0KcGxvdCh5IH4geCwgeGxpbT1jKDgsMTAuMSksIHlsaW09YygxNywyNiksIGNvbD0iYmxhY2siLCBiZz0icmVkIiwgcGNoPTIxLCBjZXg9MSkNCiAgICAgICAgICANCiMgVGhlb3JldGljYWwgbW9kZWwNCiNhYmxpbmUoMywyLCBjb2w9Im9yYW5nZXJlZCIsIGx0eT01LCBsd2Q9MikNCg0KIyBGaXR0ZWQgbW9kZWwNCmFibGluZShtb2RlbCRjb2VmZmljaWVudHMsIGNvbD0iZG9kZ2VyYmx1ZSIsIGx3ZD0iMiIpDQogDQojIENvbmZpZGVuY2UgQmFuZA0KbWF0bGluZXMobmQkeCxwX2NvbmZbLGMoImx3ciIsInVwciIpXSxjb2w9InNlYWdyZWVuIiwgbHR5PTEsIGx3ZD0yLCB0eXBlPSJsIixwY2g9Ii4iKQ0KDQojIFByZWRpY3Rpb24gQmFuZA0KbWF0bGluZXMobmQkeCxwX3ByZWRbLGMoImx3ciIsInVwciIpXSxjb2w9ImdvbGRlbnJvZCIsIGx0eT0xLCBsd2Q9MiwgdHlwZT0ibCIscGNoPSIuIikNCmBgYA0KDQoNCg0K