Introduction
This report will compare several multiple linear regression models to
determine which best predicts the yield of a strawberry plant based on
several soil and environmental factors.
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

Above are the pairwise scatterplots, correlation coefficients, and
density functions. We can see that the variables are distributed
normally, and the individual correlation coefficients are not very
large. This, alongside previous research, indicates that no particular
variable individually predicts the plant yield. We aim to determine if
any combinations of factors can predict yield to any degree through
multiple linear regression models.
Multiple Linear
Regression
Let \(\{x_1, x_2, \cdots, x_k \}\)
be \(k\) explanatory variables and
\(y\) be the response variables. The
general form of the multiple linear regression model is defined as
\[ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2
+ \cdots + \beta_k x_k + \epsilon. \] This is a very special form
in that y is linear in both parameters and predictors. The actual linear
regression only assumes that \(y\) is
linear only in parameters but not predictors since the value of
predictors will be observed in data.
A multiple linear regression model was first created utilizing all
potential variables. None of the factors are statistically significant.
We will reduce the next model by removing the least significant factors.
The residual plots were analyzed to check the assumptions of the
parametric model, and all were valid. No further transformation would be
justified.
strawberry <- dplyr::select(strawberry, Temperature, Rainfall, pH, Light_Hours, Nitrogen, Phosphorus, Potassium, Yield)
full.model <- lm(Yield ~ ., data = strawberry)
pander(full.model)
Fitting linear model: Yield ~ .
| (Intercept) |
20.46 |
2.435 |
8.402 |
2.48e-16 |
| Temperature |
-0.006367 |
0.01052 |
-0.6051 |
0.5453 |
| Rainfall |
-0.0003384 |
0.0004649 |
-0.728 |
0.4669 |
| pH |
0.1901 |
0.1737 |
1.095 |
0.274 |
| Light_Hours |
-0.07511 |
0.07 |
-1.073 |
0.2836 |
| Nitrogen |
-0.001444 |
0.002753 |
-0.5246 |
0.6001 |
| Phosphorus |
0.001231 |
0.007015 |
0.1755 |
0.8608 |
| Potassium |
-0.0008489 |
0.007013 |
-0.121 |
0.9037 |
resid_panel(full.model)

The next model is reduced from the three least significant factors:
potassium, phosphorus, and nitrogen. Still, no factors are statistically
significant. The residual plots are provided again to check the
parametric assumptions, all of which were valid.
reduced.model1 <- lm(Yield ~ . - Nitrogen - Phosphorus, - Potassium, data = strawberry)
pander(reduced.model1)
Fitting linear model: Yield ~ . - Nitrogen -
Phosphorus
| (Intercept) |
20.53 |
2.263 |
9.073 |
1.257e-18 |
| Temperature |
-0.006573 |
0.01064 |
-0.6179 |
0.5369 |
| Rainfall |
-0.000428 |
0.0004754 |
-0.9003 |
0.3683 |
| pH |
0.1662 |
0.1762 |
0.9435 |
0.3458 |
| Light_Hours |
-0.06902 |
0.07095 |
-0.9728 |
0.331 |
| Potassium |
-0.0009551 |
0.00715 |
-0.1336 |
0.8938 |
resid_panel(reduced.model1)

The model was once again reduced, now only including two factors, pH
and Light Hours. Still, neither factor was significant. The residual
plots are provided again to check the parametric assumptions, all of
which were valid.
reduced.model2 <- lm(Yield ~pH + Light_Hours, data = strawberry)
pander(reduced.model2)
Fitting linear model: Yield ~ pH + Light_Hours
| (Intercept) |
19.79 |
1.39 |
14.24 |
1.418e-40 |
| pH |
0.1833 |
0.1728 |
1.061 |
0.289 |
| Light_Hours |
-0.07247 |
0.0697 |
-1.04 |
0.2988 |
resid_panel(reduced.model2)

Results Analysis
None of the tested multiple linear regression models were able to
predict the variance in plant yield at a statistically significant
level. Reducing the model again would result in a previously analyzed
simple linear regression model, which was not significant either. It can
be reasonably determined that, in our sampled population, none of the
factors would be able to predict the strawberry yield, individually or
combined.
Conclusions
More significant models may be able to be constructed under different
sampling circumstances. For example, a designed experiment that changes
the various factors at different levels may find differences in the
plant yield. More conclusive evidence may be found in such an
experiment.
LS0tDQp0aXRsZTogIlJlZ3Jlc3Npb24gQW5hbHlzaXMgb2YgU29pbCBDb250ZW50cyINCmF1dGhvcjogIk5vYWggQnJlY2hiaWxsIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfd2lkdGg6IDYNCiAgICBmaWdfaGVpZ2h0OiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgdGhlbWU6IGx1bWVuDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQppZiAoIXJlcXVpcmUoInRpZHl2ZXJzZSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICAgbGlicmFyeSh0aWR5dmVyc2UpDQp9DQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQ0KICAgbGlicmFyeShHR2FsbHkpDQp9DQppZiAoIXJlcXVpcmUoImdnUmVzaWRwYW5lbCIpKSB7DQogIGluc3RhbGwucGFja2FnZXMoImdnUmVzaWRwYW5lbCIpDQogIGxpYnJhcnkoZ2dSZXNpZHBhbmVsKQ0KfQ0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICBsaWJyYXJ5KHBhbmRlcikNCn0NCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQpUaGlzIHJlcG9ydCB3aWxsIGNvbXBhcmUgc2V2ZXJhbCBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgdG8gZGV0ZXJtaW5lIHdoaWNoIGJlc3QgcHJlZGljdHMgdGhlIHlpZWxkIG9mIGEgc3RyYXdiZXJyeSBwbGFudCBiYXNlZCBvbiBzZXZlcmFsIHNvaWwgYW5kIGVudmlyb25tZW50YWwgZmFjdG9ycy4NCg0KIyBEYXRhIFNldA0KDQpUaGUgZGF0YSBzZXQgb2YgaW50ZXJlc3QgY29udGFpbnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdmFyaW91cyBlbnZpcm9ubWVudGFsIGFuZCBzb2lsIGZhY3RvcnMgdGhhdCBpbmZsdWVuY2UgcGxhbnQgZ3Jvd3RoLiBJdCBpbmNsdWRlcyBtZWFzdXJlbWVudHMgb2Ygc29pbCBjb250ZW50cywgZW52aXJvbm1lbnRhbCBmYWN0b3JzLCBhbmQgdGhlIHBsYW50IHlpZWxkLiBJbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBmb3IgbWFueSBraW5kcyBvZiBmcnVpdCwgYnV0IGZvciB0aGlzIGFuYWx5c2lzLCBvbmx5IHN0cmF3YmVycnkgZGF0YSB3aWxsIGJlIHVzZWQuIERhdGEgd2FzIHJlY29yZGVkIHRocm91Z2hvdXQgdGhlIHBsYW50IGdyb3d0aCBwZXJpb2QgYW5kIGR1cmluZyBoYXJ2ZXN0Lg0KDQpUaGUgZGF0YSBzZXQgd2FzIGFjcXVpcmVkIGZyb20gS2FnZ2xlIGNvdXJ0ZXN5IG9mIHVzZXIgTWFzaGEgU2FuYWVpLiBUaGUgbGluayBmb3IgdGhlIGRhdGFzZXQgaXMgPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvc25tYWhzYS9zb2lsLW51dHJpZW50cz4uIFRoZSBkYXRhc2V0IHdhcyB1cGxvYWRlZCB0byBhIGdpdGh1YiByZXBvc2l0b3J5IGZvciBhY2Nlc3MgYXMgPGh0dHBzOi8vZ2l0aHViLmNvbS9uY2JyZWNoYmlsbC9TVEEzMjEvYmxvYi9tYWluL1NUQTMyMS9Tb2lsJTIwTnV0cmllbnRzLmNzdj4uDQoNCi0gICBOYW1lOyBjaGFyYWN0ZXI6IFRoZSBwbGFudCBuYW1lLiBUaGlzIGRhdGFzZXQgd2FzIHBydW5lZCBmb3Igb25seSBTdHJhd2JlcnJ5IGRhdGENCi0gICBUZW1wZXJhdHVyZSAoJFhfMSQpOyBudW1lcmljOiBUaGUgYXZlcmFnZSByZWNvcmRlZCBhaXIgdGVtcGVyYXR1cmUgaW4gY2VsY2l1cw0KLSAgIFJhaW5mYWxsKCRYXzIkKTsgbnVtZXJpYzogVGhlIHRvdGFsIHJlY29yZGVkIHJhaW5mYWxsIGluIGNlbnRpbWV0ZXJzDQotICAgcEgoJFhfMyQpOyBudW1lcmljOiBUaGUgYXZlcmFnZSByZWNvZGVkIHNvaWwgcEgNCi0gICBOaXRyb2dlbigkWF80JCk7IG51bWVyaWM6IEF2ZXJhZ2Ugc29pbCBOaXRyb2dlbiBjb250ZW50IGluIHBhcnRzIHBlciBtaWxsaW9uIChwcG0pDQotICAgUGhvc3Bob3J1cygkWF81JCk7IG51bWVyaWM6IEF2ZXJhZ2Ugc29pbCBwaG9zcGhvcnVzIGNvbnRlbnQgaW4gcHBtDQotICAgUG90YXNzaXVtICgkWF82JCk7IG51bWVyaWM6IEF2ZXJhZ2Ugc29pbCBQb3Rhc3NpdW0gY29udGVudCBpbiBwcG0NCi0gICBMaWdodF9Ib3VycyAoJFhfNyQpOyBudW1lcmljOiBBdmVyYWdlIGhvdXJzIG9mIHN1bmxpZ2h0IGNvdmVyaW5nIHRoZSBwbGFudCBlYWNoIGRheQ0KLSAgIFlpZWxkICgkWSQpOyBudW1lcmljOiBUaGUgbWFzcyBvZiBoYXJ2ZXN0ZWQgc3RyYXdiZXJyaWVzIGluIGdyYW1zDQoNClRoaXMgZGF0YSBzZXQgY29udGFpbnMgNzAwIHN0cmF3YmVycnkgcGxhbnQgb2JzZXJ2YXRpb25zLCBhbGwgd2l0aCBjb21wbGV0ZSBkYXRhIGFuZCBubyBtaXNzaW5nIHZhbHVlcy4gVGhpcyBzZXQgaXMgc3VmZmljaWVudGx5IGxhcmdlIHRvIG1ha2UgYWNjdXJhdGUgcHJlZGljdGlvbnMgZm9yIGFueSBudW1iZXIgb2YgdGhlc2UgcHJlZGljdG9ycy4gVGhlcmUgYXJlIGFkZGl0aW9uYWwgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHRoYXQgZ3JvdXAgcmFuZ2VzIG9mIHRoZXNlIHZhcmlhYmxlcyB0b2dldGhlci4gSG93ZXZlciwgdGhlc2Ugd2lsbCBub3QgYmUgdXNlZCB1bmRlciB0aGlzIGFuYWx5c2lzIG1ldGhvZG9sb2d5Lg0KDQojIEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXMNCg0KYGBge3IsIGZpZy5hbGlnbj0nY2VudGVyJywgZWNobz1GQUxTRSwgZXJyb3I9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpzb2lsIDwtIHJlYWQuY3N2KCJ+L1dDVS9TY2hvb2x3b3JrL1NUQTMyMS9EYXRhL1NvaWwgTnV0cmllbnRzLmNzdiIsIGhlYWRlciA9IFRSVUUpDQpzdHJhd2JlcnJ5IDwtIHN1YnNldChzb2lsLCBOYW1lID09ICJTdHJhd2JlcnJ5IikNCnN0cmF3YmVycnkgPC0gZHBseXI6OnNlbGVjdChzdHJhd2JlcnJ5LCBOYW1lLCBUZW1wZXJhdHVyZSwgUmFpbmZhbGwsIHBILCBMaWdodF9Ib3VycywgTml0cm9nZW4sIFBob3NwaG9ydXMsIFBvdGFzc2l1bSwgWWllbGQsICkNCg0KZ2dwYWlycyhzdHJhd2JlcnJ5KQ0KYGBgDQoNCg0KQWJvdmUgYXJlIHRoZSBwYWlyd2lzZSBzY2F0dGVycGxvdHMsIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50cywgYW5kIGRlbnNpdHkgZnVuY3Rpb25zLiBXZSBjYW4gc2VlIHRoYXQgdGhlIHZhcmlhYmxlcyBhcmUgZGlzdHJpYnV0ZWQgbm9ybWFsbHksIGFuZCB0aGUgaW5kaXZpZHVhbCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudHMgYXJlIG5vdCB2ZXJ5IGxhcmdlLiBUaGlzLCBhbG9uZ3NpZGUgcHJldmlvdXMgcmVzZWFyY2gsIGluZGljYXRlcyB0aGF0IG5vIHBhcnRpY3VsYXIgdmFyaWFibGUgaW5kaXZpZHVhbGx5IHByZWRpY3RzIHRoZSBwbGFudCB5aWVsZC4gV2UgYWltIHRvIGRldGVybWluZSBpZiBhbnkgY29tYmluYXRpb25zIG9mIGZhY3RvcnMgY2FuIHByZWRpY3QgeWllbGQgdG8gYW55IGRlZ3JlZSB0aHJvdWdoIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVscy4NCg0KIyBNdWx0aXBsZSBMaW5lYXIgUmVncmVzc2lvbg0KDQpMZXQgJFx7eF8xLCB4XzIsIFxjZG90cywgeF9rIFx9JCBiZSAkayQgZXhwbGFuYXRvcnkgdmFyaWFibGVzIGFuZCAkeSQgYmUgdGhlIHJlc3BvbnNlIHZhcmlhYmxlcy4gVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaXMgZGVmaW5lZCBhcw0KDQokJCB5ID0gXGJldGFfMCArIFxiZXRhXzEgeF8xICsgXGJldGFfMiB4XzIgKyBcY2RvdHMgKyBcYmV0YV9rIHhfayArIFxlcHNpbG9uLiAkJCBUaGlzIGlzIGEgdmVyeSBzcGVjaWFsIGZvcm0gaW4gdGhhdCB5IGlzIGxpbmVhciBpbiBib3RoIHBhcmFtZXRlcnMgYW5kIHByZWRpY3RvcnMuIFRoZSBhY3R1YWwgbGluZWFyIHJlZ3Jlc3Npb24gb25seSBhc3N1bWVzIHRoYXQgJHkkIGlzIGxpbmVhciBvbmx5IGluIHBhcmFtZXRlcnMgYnV0IG5vdCBwcmVkaWN0b3JzIHNpbmNlIHRoZSB2YWx1ZSBvZiBwcmVkaWN0b3JzIHdpbGwgYmUgb2JzZXJ2ZWQgaW4gZGF0YS4NCg0KQSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCB3YXMgZmlyc3QgY3JlYXRlZCB1dGlsaXppbmcgYWxsIHBvdGVudGlhbCB2YXJpYWJsZXMuIE5vbmUgb2YgdGhlIGZhY3RvcnMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFdlIHdpbGwgcmVkdWNlIHRoZSBuZXh0IG1vZGVsIGJ5IHJlbW92aW5nIHRoZSBsZWFzdCBzaWduaWZpY2FudCBmYWN0b3JzLiBUaGUgcmVzaWR1YWwgcGxvdHMgd2VyZSBhbmFseXplZCB0byBjaGVjayB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIHBhcmFtZXRyaWMgbW9kZWwsIGFuZCBhbGwgd2VyZSB2YWxpZC4gTm8gZnVydGhlciB0cmFuc2Zvcm1hdGlvbiB3b3VsZCBiZSBqdXN0aWZpZWQuDQoNCmBgYHtyLCBmaWcuYWxpZ249J2NlbnRlcid9DQpzdHJhd2JlcnJ5IDwtIGRwbHlyOjpzZWxlY3Qoc3RyYXdiZXJyeSwgVGVtcGVyYXR1cmUsIFJhaW5mYWxsLCBwSCwgTGlnaHRfSG91cnMsIE5pdHJvZ2VuLCBQaG9zcGhvcnVzLCBQb3Rhc3NpdW0sIFlpZWxkKQ0KDQpmdWxsLm1vZGVsIDwtIGxtKFlpZWxkIH4gLiwgZGF0YSA9IHN0cmF3YmVycnkpDQpwYW5kZXIoZnVsbC5tb2RlbCkNCnJlc2lkX3BhbmVsKGZ1bGwubW9kZWwpDQpgYGANCg0KVGhlIG5leHQgbW9kZWwgaXMgcmVkdWNlZCBmcm9tIHRoZSB0aHJlZSBsZWFzdCBzaWduaWZpY2FudCBmYWN0b3JzOiBwb3Rhc3NpdW0sIHBob3NwaG9ydXMsIGFuZCBuaXRyb2dlbi4gU3RpbGwsIG5vIGZhY3RvcnMgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSByZXNpZHVhbCBwbG90cyBhcmUgcHJvdmlkZWQgYWdhaW4gdG8gY2hlY2sgdGhlIHBhcmFtZXRyaWMgYXNzdW1wdGlvbnMsIGFsbCBvZiB3aGljaCB3ZXJlIHZhbGlkLg0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcmVkdWNlZC5tb2RlbDEgPC0gbG0oWWllbGQgfiAuIC0gTml0cm9nZW4gLSBQaG9zcGhvcnVzLCAtIFBvdGFzc2l1bSwgZGF0YSA9IHN0cmF3YmVycnkpDQpwYW5kZXIocmVkdWNlZC5tb2RlbDEpDQpyZXNpZF9wYW5lbChyZWR1Y2VkLm1vZGVsMSkNCmBgYA0KDQpUaGUgbW9kZWwgd2FzIG9uY2UgYWdhaW4gcmVkdWNlZCwgbm93IG9ubHkgaW5jbHVkaW5nIHR3byBmYWN0b3JzLCBwSCBhbmQgTGlnaHQgSG91cnMuIFN0aWxsLCBuZWl0aGVyIGZhY3RvciB3YXMgc2lnbmlmaWNhbnQuIFRoZSByZXNpZHVhbCBwbG90cyBhcmUgcHJvdmlkZWQgYWdhaW4gdG8gY2hlY2sgdGhlIHBhcmFtZXRyaWMgYXNzdW1wdGlvbnMsIGFsbCBvZiB3aGljaCB3ZXJlIHZhbGlkLg0KDQpgYGB7ciwgZmlnLmFsaWduPSdjZW50ZXInfQ0KcmVkdWNlZC5tb2RlbDIgPC0gbG0oWWllbGQgfnBIICsgTGlnaHRfSG91cnMsIGRhdGEgPSBzdHJhd2JlcnJ5KQ0KcGFuZGVyKHJlZHVjZWQubW9kZWwyKQ0KcmVzaWRfcGFuZWwocmVkdWNlZC5tb2RlbDIpDQpgYGANCg0KIyBSZXN1bHRzIEFuYWx5c2lzDQoNCk5vbmUgb2YgdGhlIHRlc3RlZCBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbHMgd2VyZSBhYmxlIHRvIHByZWRpY3QgdGhlIHZhcmlhbmNlIGluIHBsYW50IHlpZWxkIGF0IGEgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBsZXZlbC4gUmVkdWNpbmcgdGhlIG1vZGVsIGFnYWluIHdvdWxkIHJlc3VsdCBpbiBhIHByZXZpb3VzbHkgYW5hbHl6ZWQgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLCB3aGljaCB3YXMgbm90IHNpZ25pZmljYW50IGVpdGhlci4gSXQgY2FuIGJlIHJlYXNvbmFibHkgZGV0ZXJtaW5lZCB0aGF0LCBpbiBvdXIgc2FtcGxlZCBwb3B1bGF0aW9uLCBub25lIG9mIHRoZSBmYWN0b3JzIHdvdWxkIGJlIGFibGUgdG8gcHJlZGljdCB0aGUgc3RyYXdiZXJyeSB5aWVsZCwgaW5kaXZpZHVhbGx5IG9yIGNvbWJpbmVkLg0KDQojIENvbmNsdXNpb25zDQoNCk1vcmUgc2lnbmlmaWNhbnQgbW9kZWxzIG1heSBiZSBhYmxlIHRvIGJlIGNvbnN0cnVjdGVkIHVuZGVyIGRpZmZlcmVudCBzYW1wbGluZyBjaXJjdW1zdGFuY2VzLiBGb3IgZXhhbXBsZSwgYSBkZXNpZ25lZCBleHBlcmltZW50IHRoYXQgY2hhbmdlcyB0aGUgdmFyaW91cyBmYWN0b3JzIGF0IGRpZmZlcmVudCBsZXZlbHMgbWF5IGZpbmQgZGlmZmVyZW5jZXMgaW4gdGhlIHBsYW50IHlpZWxkLiBNb3JlIGNvbmNsdXNpdmUgZXZpZGVuY2UgbWF5IGJlIGZvdW5kIGluIHN1Y2ggYW4gZXhwZXJpbWVudC4NCg==