Introduction
This research will investigate the differences between a standard and
bootstrap simple linear regression approaches. We will aim to determine
which method is most ideal for future research.
Data Set
The data set of interest contains detailed information on various
environmental and soil factors that influence plant growth. It includes
measurements of soil contents, environmental factors, and the plant
yield. Information is provided for many kinds of fruit, but for this
analysis, only strawberry data will be used. Data was recorded
throughout the plant growth period and during harvest.
The data set was acquired from Kaggle courtesy of user Masha Sanaei.
The link for the dataset is https://www.kaggle.com/datasets/snmahsa/soil-nutrients.
The dataset was uploaded to a github repository for access as https://github.com/ncbrechbill/STA321/blob/main/STA321/Soil%20Nutrients.csv.
- Name; character: The plant name. This dataset was pruned for only
Strawberry data
- Temperature (\(X_1\)); numeric: The
average recorded air temperature in celcius
- Rainfall(\(X_2\)); numeric: The
total recorded rainfall in centimeters
- pH(\(X_3\)); numeric: The average
recoded soil pH
- Nitrogen(\(X_4\)); numeric: Average
soil Nitrogen content in parts per million (ppm)
- Phosphorus(\(X_5\)); numeric:
Average soil phosphorus content in ppm
- Potassium (\(X_6\)); numeric:
Average soil Potassium content in ppm
- Light_Hours (\(X_7\)); numeric:
Average hours of sunlight covering the plant each day
- Yield (\(Y\)); numeric: The mass of
harvested strawberries in grams
This data set contains 700 strawberry plant observations, all with
complete data and no missing values. This set is sufficiently large to
make accurate predictions for any number of these predictors. There are
additional categorical variables that group ranges of these variables
together. However, these will not be used under this analysis
methodology.
Exploratory Data
Analysis
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

The pairwise scatter plots and correlation coefficients indicate no
strong linear relationships between the response variable and the
factors. Transforming the relationship would not yield a greater
relationship. The analysis variables are all normally distributed, thus
a box-cox transformation is not required.
Standard Simple Linear
Regression
A simple linear regression model was fitted to the factor pH.
Determining a relationship between soil pH and strawberry yield will
help us answer our research question of what treatments or environments
could be worth utilizing to increase strawberry yield.
The simple linear regression equation is given by the following:
\[
y = \beta_0 + \beta_1 x + \epsilon
\]
Where \(Y\) is the strawberry yield,
\(\beta_0\) is the intercept
coefficient, \(\beta_1\) is the
coefficient factor for pH (thus \(x\)
is defined as the factor pH), and \(\epsilon\) is an error term. This is a
parametric model, hence we proceed under the assumption \(\epsilon \sim N(0, \sigma^2)\), and
equivalently, \(y \sim N(\beta_0 + \beta_1
x)\).
The t statistic was 1.007 on 1 and 698 degrees of freedom. The P
value was 0.3159, indicating no statistical significance.
The residuals appear to be distributed normally and with equal
variance. There are no outlier residuals with high leverage, and the
leverage trend is reasonably even.




reg.table <- coef(summary(slr))
pander(reg.table, caption = "Standard Linear Regression 95% CI")
Standard Linear Regression 95% CI
(Intercept) |
18.92 |
1.106 |
17.1 |
4.927e-55 |
pH |
0.1731 |
0.1725 |
1.004 |
0.3159 |
Bootstrap Simple Linear
Regression
The linear regression method under the bootstrap method remains the
same. The first few bootstrap beta coefficients are shown. Below, we can
see that the bootstrap coefficient distributions are normal. Since zero
is included in the 95% confidence interval, we cannot make any
conclusions that the population mean in not equal to zero at that
confidence level, a similar conclusion we reached under the standard
regression model.
set.seed(123) # for reproducibility
n <- nrow(strawberry) # should be 700
B <- 1000 # number of bootstrap replications
# Matrix to store coefficients: Intercept and pH slope
beta_mat <- matrix(NA, nrow = B, ncol = 2)
for (b in 1:B) {
# Sample row indices with replacement
idx <- sample(1:n, size = n, replace = TRUE)
# Fit linear model on bootstrap sample
fit <- lm(Yield ~ pH, data = strawberry[idx, ])
# Store coefficients
beta_mat[b, ] <- coef(fit)
}
# Convert to data frame for easier handling
beta_df <- as.data.frame(beta_mat)
names(beta_df) <- c("Intercept", "Slope")
# Quick look at results
head(beta_df)
## Intercept Slope
## 1 20.85783 -0.12725981
## 2 19.28336 0.11662004
## 3 20.21753 -0.03029722
## 4 19.95392 0.01711187
## 5 19.25598 0.12264456
## 6 21.06940 -0.16711248
boot.beta0.ci <- quantile(beta_df$Intercept, c(0.025, 0.975))
boot.beta1.ci <- quantile(beta_df$Slope, c(0.025, 0.975))
boot.coef <- data.frame(rbind(boot.beta0.ci, boot.beta1.ci))
names(boot.coef) <- c("2.5%", "97.5%")
pander(boot.coef, caption="Bootstrap confidence intervals of regression coefficients.")
Bootstrap confidence intervals of regression
coefficients.
boot.beta0.ci |
16.69 |
21.04 |
boot.beta1.ci |
-0.1575 |
0.5172 |
Method Comparison
The two methods yielded similar results, that is that there is no
significant impact on the observed level of soil pH. This indicates
that, in general, strawberry plants are robust and would not be affected
by any number of factors that impact soil pH (such as sulfur treatment
or other natural compounds that raise or lower pH). This data was
collected without any experimental design factors being tested, so
future research that properly tests a hypothesis at different pH levels
may conclude different results.
In the scope of this research, the normal distribution of the data
and the number of samples indicate that bootstrapping is not necessary
to conclusive analysis. As expected in bootstrap analysis, a sample of
this size yields similar results as the standard simple linear
regression. For computational ease, the standard approach may be
desirable.
LS0tDQp0aXRsZTogIlJlZ3Jlc3Npb24gQW5hbHlzaXMgb2YgU29pbCBDb250ZW50cyINCmF1dGhvcjogIk5vYWggQnJlY2hiaWxsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQotLS0NCg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyMHB4Ow0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDEgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMiB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE1cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KPC9zdHlsZT4NCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoR0dhbGx5KQ0KbGlicmFyeShwYW5kZXIpDQpgYGANCg0KIyBJbnRyb2R1Y3Rpb24NClRoaXMgcmVzZWFyY2ggd2lsbCBpbnZlc3RpZ2F0ZSB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhIHN0YW5kYXJkIGFuZCBib290c3RyYXAgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIGFwcHJvYWNoZXMuIFdlIHdpbGwgYWltIHRvIGRldGVybWluZSB3aGljaCBtZXRob2QgaXMgbW9zdCBpZGVhbCBmb3IgZnV0dXJlIHJlc2VhcmNoLg0KDQojIERhdGEgU2V0DQoNClRoZSBkYXRhIHNldCBvZiBpbnRlcmVzdCBjb250YWlucyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB2YXJpb3VzIGVudmlyb25tZW50YWwgYW5kIHNvaWwgZmFjdG9ycyB0aGF0IGluZmx1ZW5jZSBwbGFudCBncm93dGguIEl0IGluY2x1ZGVzIG1lYXN1cmVtZW50cyBvZiBzb2lsIGNvbnRlbnRzLCBlbnZpcm9ubWVudGFsIGZhY3RvcnMsIGFuZCB0aGUgcGxhbnQgeWllbGQuIEluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIGZvciBtYW55IGtpbmRzIG9mIGZydWl0LCBidXQgZm9yIHRoaXMgYW5hbHlzaXMsIG9ubHkgc3RyYXdiZXJyeSBkYXRhIHdpbGwgYmUgdXNlZC4gRGF0YSB3YXMgcmVjb3JkZWQgdGhyb3VnaG91dCB0aGUgcGxhbnQgZ3Jvd3RoIHBlcmlvZCBhbmQgZHVyaW5nIGhhcnZlc3QuDQoNClRoZSBkYXRhIHNldCB3YXMgYWNxdWlyZWQgZnJvbSBLYWdnbGUgY291cnRlc3kgb2YgdXNlciBNYXNoYSBTYW5hZWkuIFRoZSBsaW5rIGZvciB0aGUgZGF0YXNldCBpcyA8aHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9zbm1haHNhL3NvaWwtbnV0cmllbnRzPi4gVGhlIGRhdGFzZXQgd2FzIHVwbG9hZGVkIHRvIGEgZ2l0aHViIHJlcG9zaXRvcnkgZm9yIGFjY2VzcyBhcyA8aHR0cHM6Ly9naXRodWIuY29tL25jYnJlY2hiaWxsL1NUQTMyMS9ibG9iL21haW4vU1RBMzIxL1NvaWwlMjBOdXRyaWVudHMuY3N2Pi4NCg0KLSAgIE5hbWU7IGNoYXJhY3RlcjogVGhlIHBsYW50IG5hbWUuIFRoaXMgZGF0YXNldCB3YXMgcHJ1bmVkIGZvciBvbmx5IFN0cmF3YmVycnkgZGF0YQ0KLSAgIFRlbXBlcmF0dXJlICgkWF8xJCk7IG51bWVyaWM6IFRoZSBhdmVyYWdlIHJlY29yZGVkIGFpciB0ZW1wZXJhdHVyZSBpbiBjZWxjaXVzDQotICAgUmFpbmZhbGwoJFhfMiQpOyBudW1lcmljOiBUaGUgdG90YWwgcmVjb3JkZWQgcmFpbmZhbGwgaW4gY2VudGltZXRlcnMNCi0gICBwSCgkWF8zJCk7IG51bWVyaWM6IFRoZSBhdmVyYWdlIHJlY29kZWQgc29pbCBwSA0KLSAgIE5pdHJvZ2VuKCRYXzQkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIE5pdHJvZ2VuIGNvbnRlbnQgaW4gcGFydHMgcGVyIG1pbGxpb24gKHBwbSkNCi0gICBQaG9zcGhvcnVzKCRYXzUkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIHBob3NwaG9ydXMgY29udGVudCBpbiBwcG0NCi0gICBQb3Rhc3NpdW0gKCRYXzYkKTsgbnVtZXJpYzogQXZlcmFnZSBzb2lsIFBvdGFzc2l1bSBjb250ZW50IGluIHBwbQ0KLSAgIExpZ2h0X0hvdXJzICgkWF83JCk7IG51bWVyaWM6IEF2ZXJhZ2UgaG91cnMgb2Ygc3VubGlnaHQgY292ZXJpbmcgdGhlIHBsYW50IGVhY2ggZGF5DQotICAgWWllbGQgKCRZJCk7IG51bWVyaWM6IFRoZSBtYXNzIG9mIGhhcnZlc3RlZCBzdHJhd2JlcnJpZXMgaW4gZ3JhbXMNCg0KVGhpcyBkYXRhIHNldCBjb250YWlucyA3MDAgc3RyYXdiZXJyeSBwbGFudCBvYnNlcnZhdGlvbnMsIGFsbCB3aXRoIGNvbXBsZXRlIGRhdGEgYW5kIG5vIG1pc3NpbmcgdmFsdWVzLiBUaGlzIHNldCBpcyBzdWZmaWNpZW50bHkgbGFyZ2UgdG8gbWFrZSBhY2N1cmF0ZSBwcmVkaWN0aW9ucyBmb3IgYW55IG51bWJlciBvZiB0aGVzZSBwcmVkaWN0b3JzLiBUaGVyZSBhcmUgYWRkaXRpb25hbCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdGhhdCBncm91cCByYW5nZXMgb2YgdGhlc2UgdmFyaWFibGVzIHRvZ2V0aGVyLiBIb3dldmVyLCB0aGVzZSB3aWxsIG5vdCBiZSB1c2VkIHVuZGVyIHRoaXMgYW5hbHlzaXMgbWV0aG9kb2xvZ3kuDQoNCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInLCBlY2hvPUZBTFNFLCBlcnJvcj1GQUxTRX0NCnNvaWwgPC0gcmVhZC5jc3YoIn4vV0NVL1NjaG9vbHdvcmsvU1RBMzIxL0RhdGEvU29pbCBOdXRyaWVudHMuY3N2IiwgaGVhZGVyID0gVFJVRSkNCnN0cmF3YmVycnkgPC0gc3Vic2V0KHNvaWwsIE5hbWUgPT0gIlN0cmF3YmVycnkiKQ0Kc3RyYXdiZXJyeSA8LSBzZWxlY3Qoc3RyYXdiZXJyeSwgTmFtZSwgVGVtcGVyYXR1cmUsIFJhaW5mYWxsLCBwSCwgTGlnaHRfSG91cnMsIE5pdHJvZ2VuLCBQaG9zcGhvcnVzLCBQb3Rhc3NpdW0sIFlpZWxkKQ0KDQpnZ3BhaXJzKHN0cmF3YmVycnkpDQpgYGANCg0KVGhlIHBhaXJ3aXNlIHNjYXR0ZXIgcGxvdHMgYW5kIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cyBpbmRpY2F0ZSBubyBzdHJvbmcgbGluZWFyIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiB0aGUgcmVzcG9uc2UgdmFyaWFibGUgYW5kIHRoZSBmYWN0b3JzLiBUcmFuc2Zvcm1pbmcgdGhlIHJlbGF0aW9uc2hpcCB3b3VsZCBub3QgeWllbGQgYSBncmVhdGVyIHJlbGF0aW9uc2hpcC4gVGhlIGFuYWx5c2lzIHZhcmlhYmxlcyBhcmUgYWxsIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCB0aHVzIGEgYm94LWNveCB0cmFuc2Zvcm1hdGlvbiBpcyBub3QgcmVxdWlyZWQuDQoNCiMgU3RhbmRhcmQgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uDQoNCkEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdhcyBmaXR0ZWQgdG8gdGhlIGZhY3RvciBwSC4gRGV0ZXJtaW5pbmcgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzb2lsIHBIIGFuZCBzdHJhd2JlcnJ5IHlpZWxkIHdpbGwgaGVscCB1cyBhbnN3ZXIgb3VyIHJlc2VhcmNoIHF1ZXN0aW9uIG9mIHdoYXQgdHJlYXRtZW50cyBvciBlbnZpcm9ubWVudHMgY291bGQgYmUgd29ydGggdXRpbGl6aW5nIHRvIGluY3JlYXNlIHN0cmF3YmVycnkgeWllbGQuDQoNClRoZSBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24gZXF1YXRpb24gaXMgZ2l2ZW4gYnkgdGhlIGZvbGxvd2luZzoNCg0KJCQNCnkgPSBcYmV0YV8wICsgXGJldGFfMSB4ICsgXGVwc2lsb24NCiQkDQoNCldoZXJlICRZJCBpcyB0aGUgc3RyYXdiZXJyeSB5aWVsZCwgJFxiZXRhXzAkIGlzIHRoZSBpbnRlcmNlcHQgY29lZmZpY2llbnQsICRcYmV0YV8xJCBpcyB0aGUgY29lZmZpY2llbnQgZmFjdG9yIGZvciBwSCAodGh1cyAkeCQgaXMgZGVmaW5lZCBhcyB0aGUgZmFjdG9yIHBIKSwgYW5kICRcZXBzaWxvbiQgaXMgYW4gZXJyb3IgdGVybS4gVGhpcyBpcyBhIHBhcmFtZXRyaWMgbW9kZWwsIGhlbmNlIHdlIHByb2NlZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gJFxlcHNpbG9uIFxzaW0gTigwLCBcc2lnbWFeMikkLCBhbmQgZXF1aXZhbGVudGx5LCAkeSBcc2ltIE4oXGJldGFfMCArIFxiZXRhXzEgeCkkLg0KDQpUaGUgdCBzdGF0aXN0aWMgd2FzIDEuMDA3IG9uIDEgYW5kIDY5OCBkZWdyZWVzIG9mIGZyZWVkb20uIFRoZSBQIHZhbHVlIHdhcyAwLjMxNTksIGluZGljYXRpbmcgbm8gc3RhdGlzdGljYWwgc2lnbmlmaWNhbmNlLg0KDQpUaGUgcmVzaWR1YWxzIGFwcGVhciB0byBiZSBkaXN0cmlidXRlZCBub3JtYWxseSBhbmQgd2l0aCBlcXVhbCB2YXJpYW5jZS4gVGhlcmUgYXJlIG5vIG91dGxpZXIgcmVzaWR1YWxzIHdpdGggaGlnaCBsZXZlcmFnZSwgYW5kIHRoZSBsZXZlcmFnZSB0cmVuZCBpcyByZWFzb25hYmx5IGV2ZW4uDQoNCmBgYHtyLCBmaWcuYWxpZ249J2NlbnRlcicsIGVjaG89RkFMU0V9DQpzbHIgPC0gbG0oWWllbGQgfiBwSCwNCiAgICAgICAgICBkYXRhID0gc3RyYXdiZXJyeSkNCnBsb3Qoc2xyKQ0KYGBgDQpgYGB7cn0NCnJlZy50YWJsZSA8LSBjb2VmKHN1bW1hcnkoc2xyKSkNCnBhbmRlcihyZWcudGFibGUsIGNhcHRpb24gPSAiU3RhbmRhcmQgTGluZWFyIFJlZ3Jlc3Npb24gOTUlIENJIikNCmBgYA0KDQojIEJvb3RzdHJhcCBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24NCg0KVGhlIGxpbmVhciByZWdyZXNzaW9uIG1ldGhvZCB1bmRlciB0aGUgYm9vdHN0cmFwIG1ldGhvZCByZW1haW5zIHRoZSBzYW1lLiBUaGUgZmlyc3QgZmV3IGJvb3RzdHJhcCBiZXRhIGNvZWZmaWNpZW50cyBhcmUgc2hvd24uIEJlbG93LCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGJvb3RzdHJhcCBjb2VmZmljaWVudCBkaXN0cmlidXRpb25zIGFyZSBub3JtYWwuIFNpbmNlIHplcm8gaXMgaW5jbHVkZWQgaW4gdGhlIDk1JSBjb25maWRlbmNlIGludGVydmFsLCB3ZSBjYW5ub3QgbWFrZSBhbnkgY29uY2x1c2lvbnMgdGhhdCB0aGUgcG9wdWxhdGlvbiBtZWFuIGluIG5vdCBlcXVhbCB0byB6ZXJvIGF0IHRoYXQgY29uZmlkZW5jZSBsZXZlbCwgYSBzaW1pbGFyIGNvbmNsdXNpb24gd2UgcmVhY2hlZCB1bmRlciB0aGUgc3RhbmRhcmQgcmVncmVzc2lvbiBtb2RlbC4NCg0KYGBge3J9DQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCg0KbiA8LSBucm93KHN0cmF3YmVycnkpICAgIyBzaG91bGQgYmUgNzAwDQpCIDwtIDEwMDAgICAgICAgICAgICAgICAjIG51bWJlciBvZiBib290c3RyYXAgcmVwbGljYXRpb25zDQoNCiMgTWF0cml4IHRvIHN0b3JlIGNvZWZmaWNpZW50czogSW50ZXJjZXB0IGFuZCBwSCBzbG9wZQ0KYmV0YV9tYXQgPC0gbWF0cml4KE5BLCBucm93ID0gQiwgbmNvbCA9IDIpDQoNCmZvciAoYiBpbiAxOkIpIHsNCiAgIyBTYW1wbGUgcm93IGluZGljZXMgd2l0aCByZXBsYWNlbWVudA0KICBpZHggPC0gc2FtcGxlKDE6biwgc2l6ZSA9IG4sIHJlcGxhY2UgPSBUUlVFKQ0KICANCiAgIyBGaXQgbGluZWFyIG1vZGVsIG9uIGJvb3RzdHJhcCBzYW1wbGUNCiAgZml0IDwtIGxtKFlpZWxkIH4gcEgsIGRhdGEgPSBzdHJhd2JlcnJ5W2lkeCwgXSkNCiAgDQogICMgU3RvcmUgY29lZmZpY2llbnRzDQogIGJldGFfbWF0W2IsIF0gPC0gY29lZihmaXQpDQp9DQoNCiMgQ29udmVydCB0byBkYXRhIGZyYW1lIGZvciBlYXNpZXIgaGFuZGxpbmcNCmJldGFfZGYgPC0gYXMuZGF0YS5mcmFtZShiZXRhX21hdCkNCm5hbWVzKGJldGFfZGYpIDwtIGMoIkludGVyY2VwdCIsICJTbG9wZSIpDQoNCiMgUXVpY2sgbG9vayBhdCByZXN1bHRzDQpoZWFkKGJldGFfZGYpDQoNCmJvb3QuYmV0YTAuY2kgPC0gcXVhbnRpbGUoYmV0YV9kZiRJbnRlcmNlcHQsIGMoMC4wMjUsIDAuOTc1KSkNCmJvb3QuYmV0YTEuY2kgPC0gcXVhbnRpbGUoYmV0YV9kZiRTbG9wZSwgYygwLjAyNSwgMC45NzUpKQ0KYm9vdC5jb2VmIDwtIGRhdGEuZnJhbWUocmJpbmQoYm9vdC5iZXRhMC5jaSwgYm9vdC5iZXRhMS5jaSkpIA0KbmFtZXMoYm9vdC5jb2VmKSA8LSBjKCIyLjUlIiwgIjk3LjUlIikNCnBhbmRlcihib290LmNvZWYsIGNhcHRpb249IkJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBvZiByZWdyZXNzaW9uIGNvZWZmaWNpZW50cy4iKQ0KYGBgDQoNCiMgTWV0aG9kIENvbXBhcmlzb24NCg0KVGhlIHR3byBtZXRob2RzIHlpZWxkZWQgc2ltaWxhciByZXN1bHRzLCB0aGF0IGlzIHRoYXQgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBvYnNlcnZlZCBsZXZlbCBvZiBzb2lsIHBILiBUaGlzIGluZGljYXRlcyB0aGF0LCBpbiBnZW5lcmFsLCBzdHJhd2JlcnJ5IHBsYW50cyBhcmUgcm9idXN0IGFuZCB3b3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgYW55IG51bWJlciBvZiBmYWN0b3JzIHRoYXQgaW1wYWN0IHNvaWwgcEggKHN1Y2ggYXMgc3VsZnVyIHRyZWF0bWVudCBvciBvdGhlciBuYXR1cmFsIGNvbXBvdW5kcyB0aGF0IHJhaXNlIG9yIGxvd2VyIHBIKS4gVGhpcyBkYXRhIHdhcyBjb2xsZWN0ZWQgd2l0aG91dCBhbnkgZXhwZXJpbWVudGFsIGRlc2lnbiBmYWN0b3JzIGJlaW5nIHRlc3RlZCwgc28gZnV0dXJlIHJlc2VhcmNoIHRoYXQgcHJvcGVybHkgdGVzdHMgYSBoeXBvdGhlc2lzIGF0IGRpZmZlcmVudCBwSCBsZXZlbHMgbWF5IGNvbmNsdWRlIGRpZmZlcmVudCByZXN1bHRzLg0KDQpJbiB0aGUgc2NvcGUgb2YgdGhpcyByZXNlYXJjaCwgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdGhlIGRhdGEgYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbmRpY2F0ZSB0aGF0IGJvb3RzdHJhcHBpbmcgaXMgbm90IG5lY2Vzc2FyeSB0byBjb25jbHVzaXZlIGFuYWx5c2lzLiBBcyBleHBlY3RlZCBpbiBib290c3RyYXAgYW5hbHlzaXMsIGEgc2FtcGxlIG9mIHRoaXMgc2l6ZSB5aWVsZHMgc2ltaWxhciByZXN1bHRzIGFzIHRoZSBzdGFuZGFyZCBzaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24uIEZvciBjb21wdXRhdGlvbmFsIGVhc2UsIHRoZSBzdGFuZGFyZCBhcHByb2FjaCBtYXkgYmUgZGVzaXJhYmxlLg0K