library(readxl)
data <- read_excel("C:/Users/aiman/Documents/LAST DEGREE/SMS/lab report/lab report 1/revision lab report/algeas.xlsx")
data

Q1

variable to choose

# Correlation of each variable with Population

cor_population <- cor(data)[, "Population"]

round(cor_population, 3)
      Light     Nitrate        Iron   Phosphate Temperature          pH         CO2 
      0.006      -0.001       0.001       0.017       0.009       0.008      -0.015 
 Population 
      1.000 

Phosphate has the strongest correlation with Population(Correlation: r = 0.017, which is the strongest among your predictors, although it is still extremely weak). ,therefore we choose Phosphate for our linear regression analysis for exploratory analysis.

Response variable (Y): Population Exploratory variable (X): Phosphate

  1. Scatter Diagram
x <- data$Phosphate
y <- data$Population

plot(x, y,
     main = "Scatter Plot of Phosphate and Algae Population",
     xlab = "Phosphate (mg/L)",
     ylab = "Algae Population",
     pch = 19,
     frame = FALSE)

Interpretation: The scatter plot shows the relationship between Phosphate and algae Population. The points are widely scattered and do not show a clear linear pattern, indicating that the linear relationship between Phosphate and Population is very weak.

  1. Correlation coefficient and coefficient of determination

A. Correlation coefficient

cor_phosphate <- cor(data$Population,data$Phosphate)
cor_phosphate
[1] 0.01699214

Interpretation: The Pearson correlation coefficient between Phosphate and algae Population is r = 0.017. This indicates a very weak positive linear relationship between Phosphate and algae Population.

B. Coefficient of determination, R²

simple_model <- lm(Population ~ Phosphate,data = data)
r_squared <- summary(simple_model)$r.squared
r_squared
[1] 0.0002887329

Interpretation: The coefficient of determination is approximately R² = 0.000289, which means that only approximately 0.0289% of the variation in algae Population is explained by Phosphate. Therefore, Phosphate provides very little explanatory power for predicting algae Population in this dataset.

  1. Describe the Simple Linear Regression Model
model <- lm(Population ~ Phosphate,data = data)
summary(model)

Call:
lm(formula = Population ~ Phosphate, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-3204.5 -1106.1   403.6  1217.5  2124.3 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  3113.98      31.94  97.493   <2e-16 ***
Phosphate     452.38     269.14   1.681   0.0928 .  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1460 on 9782 degrees of freedom
Multiple R-squared:  0.0002887, Adjusted R-squared:  0.0001865 
F-statistic: 2.825 on 1 and 9782 DF,  p-value: 0.09283

Equation: Population = 3113.98 + 452.38(Phosphate) Intercept = 3113.985 The intercept is 3113.985, which represents the predicted algae Population when the Phosphate concentration is zero. Slope = 452.385 The slope is 452.385, indicating that for every one-unit increase in Phosphate concentration, the predicted algae Population increases by approximately 452.385 units, on average.

  1. Hypothesis Testing

H₀: β₁ = 0, indicating that there is no significant linear relationship between Phosphate and algae Population. H₁: β₁ ≠ 0, indicating that there is a significant linear relationship between Phosphate and algae Population. p-value = 0.093 Since p-value(0.093) > (alpha=0.05),we fail to reject H₀ At alpha = 0.05, there is insufficient statistical evidence to conclude that Phosphate has a significant linear relationship with algae Population.

  1. Residual Analysis

A.Linearity

plot(simple_model,
     which = 1,
     main = "Residuals vs Fitted Values")

Linearity: The Residuals vs Fitted plot shows the residuals scattered around the horizontal zero line without a strong systematic curved pattern. Therefore, there is no strong evidence of a violation of the linearity assumption.

B. Independence

plot(residuals(simple_model),
     type = "p",
     pch = 19,
     main = "Residuals vs Observation Order",
     xlab = "Observation Order",
     ylab = "Residuals")

abline(h = 0)

Interpretation: The residuals do not show a clear systematic pattern when plotted against observation order. In addition, the Durbin-Watson statistic is approximately 1.98, which is close to 2, suggesting that the independence assumption is reasonable.

C. Normality

plot(simple_model,which = 2,main = "Normal Q-Q Plot")

Interpretation: The Normal Q-Q plot shows that the residual points do not closely follow the diagonal reference line. Instead, the points form a clear S-shaped pattern, with substantial deviations at both tails. Therefore, the residuals do not appear to be normally distributed, indicating that the normality assumption is not fully satisfied.

D. Equal Variance

plot(simple_model,
     which = 3,
     main = "Scale-Location Plot")

Interpretation: The Scale-Location plot shows that the residuals have a relatively consistent spread across the fitted values. The red trend line is approximately horizontal, and there is no clear funnel-shaped pattern. Therefore, the equal variance assumption appears to be reasonably satisfied.

Q2

Since Phosphate and CO2 have the two largest absolute correlations with Population in Q1 results,so we choose it as exploratory variables,X.

Response variable (Y): Population X₁: Phosphate X₂: CO2

i)Scatter Diagram

pairs(data[, c("Population", "Phosphate", "CO2")],
      pch = 19)

Interpretation: The scatter plot matrix shows the relationships between Population, Phosphate and CO₂. The plots show no clear strong linear pattern between Population and either Phosphate or CO₂.

  1. Correlation coefficient and coefficient of determination

A. Correlation coefficient

corr <- round(cor(data[, c("Population","Phosphate","CO2")]), 4)
corr
           Population Phosphate     CO2
Population     1.0000    0.0170 -0.0149
Phosphate      0.0170    1.0000 -0.0116
CO2           -0.0149   -0.0116  1.0000

Interpretation: For Phosphate, The correlation coefficient of 0.0170 indicates a very weak positive linear relationship between Phosphate and algae Population.For CO2,The correlation coefficient of −0.0149 indicates a very weak negative linear relationship between CO₂ and algae Population.

B. Coefficient of determination, R²

multiple_model <- lm(Population ~ Phosphate + CO2,data = data)
summary(multiple_model)

Call:
lm(formula = Population ~ Phosphate + CO2, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-3231.8 -1104.9   404.7  1216.2  2154.5 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3170.440     50.334  62.988   <2e-16 ***
Phosphate    447.862    269.146   1.664   0.0961 .  
CO2           -9.316      6.420  -1.451   0.1468    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1460 on 9781 degrees of freedom
Multiple R-squared:  0.0005039, Adjusted R-squared:  0.0002996 
F-statistic: 2.466 on 2 and 9781 DF,  p-value: 0.085

Interpretation: The Multiple R-squared value of 0.0005039 indicates that approximately 0.05% of the variation in algae Population is explained jointly by Phosphate and CO₂.

  1. Describe the Multiple Linear Regression Model
summary(multiple_model)

Call:
lm(formula = Population ~ Phosphate + CO2, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-3231.8 -1104.9   404.7  1216.2  2154.5 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3170.440     50.334  62.988   <2e-16 ***
Phosphate    447.862    269.146   1.664   0.0961 .  
CO2           -9.316      6.420  -1.451   0.1468    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1460 on 9781 degrees of freedom
Multiple R-squared:  0.0005039, Adjusted R-squared:  0.0002996 
F-statistic: 2.466 on 2 and 9781 DF,  p-value: 0.085
# Display coefficients
coef(multiple_model)
(Intercept)   Phosphate         CO2 
3170.440271  447.862281   -9.316069 

Eqution: Population = 3170.440 + 447.862(Phospate) - 9.316(CO2) Intercept = 3170.440 The intercept of 3170.440 represents the predicted algae Population when both Phosphate and CO₂ are zero. Phosphate coefficient = 447.862 Holding CO₂ constant, a one-unit increase in Phosphate is associated with an estimated 447.862 unit increase in algae Population. CO₂ coefficient = −9.316 Holding Phosphate constant, a one-unit increase in CO₂ is associated with an estimated 9.316 unit decrease in algae Population.

  1. Hypothesis Testing
summary(multiple_model)

Call:
lm(formula = Population ~ Phosphate + CO2, data = data)

Residuals:
    Min      1Q  Median      3Q     Max 
-3231.8 -1104.9   404.7  1216.2  2154.5 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 3170.440     50.334  62.988   <2e-16 ***
Phosphate    447.862    269.146   1.664   0.0961 .  
CO2           -9.316      6.420  -1.451   0.1468    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1460 on 9781 degrees of freedom
Multiple R-squared:  0.0005039, Adjusted R-squared:  0.0002996 
F-statistic: 2.466 on 2 and 9781 DF,  p-value: 0.085

H₀: β₁ = β₂ = 0 H₁: At least one of β₁, β₂ ≠ 0 p-value = 0.085 Since p-value(0.085) > (alpha=0.05),we fail to reject H₀ At alpha = 0.05 ,there is insufficient evidence to conclude that Phosphate and CO₂ jointly have a significant linear relationship with algae Population.

  1. Residual Analysis

A.Linearity

plot(multiple_model,
     which = 1,
     main = "Multiple Regression: Residuals vs Fitted")

Interpretation: The residuals are randomly scattered around the zero line without a clear curved pattern. Therefore, the linearity assumption is reasonably satisfied for the multiple linear regression model.

B. Independence

plot(residuals(multiple_model),
     type = "p",
     pch = 19,
     main = "Multiple Regression: Residuals vs Observation Order",
     xlab = "Observation Order",
     ylab = "Residuals")

abline(h = 0)

Interpretation: The residuals appear to be randomly scattered around zero across the observation order without a clear systematic pattern. Therefore, the independence assumption is reasonably satisfied.

C. Normality

plot(multiple_model,
     which = 2,
     main = "Multiple Regression: Normal Q-Q Plot")

Interpretation: The points in the normal Q-Q plot deviate substantially from the diagonal reference line, particularly at the lower and upper tails. This indicates that the residuals are not normally distributed. Therefore, the normality assumption is not satisfied for the multiple linear regression model.

D. Equal Variance

plot(multiple_model,
     which = 3,
     main = "Multiple Regression: Scale-Location Plot")

Interpretation: The residuals show a relatively consistent spread across the fitted values, and the smooth red line remains approximately horizontal. There is no clear funnel-shaped pattern. Therefore, the equal variance (homoscedasticity) assumption is reasonably satisfied.

LS0tDQp0aXRsZTogIlJFVklTSU9OIExBQiBSRVBPUlQgMSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkYXRhIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL2FpbWFuL0RvY3VtZW50cy9MQVNUIERFR1JFRS9TTVMvbGFiIHJlcG9ydC9sYWIgcmVwb3J0IDEvcmV2aXNpb24gbGFiIHJlcG9ydC9hbGdlYXMueGxzeCIpDQpkYXRhDQpgYGANCg0KUTENCg0KdmFyaWFibGUgdG8gY2hvb3NlDQoNCmBgYHtyfQ0KIyBDb3JyZWxhdGlvbiBvZiBlYWNoIHZhcmlhYmxlIHdpdGggUG9wdWxhdGlvbg0KDQpjb3JfcG9wdWxhdGlvbiA8LSBjb3IoZGF0YSlbLCAiUG9wdWxhdGlvbiJdDQpyb3VuZChjb3JfcG9wdWxhdGlvbiwgMykNCmBgYA0KUGhvc3BoYXRlIGhhcyB0aGUgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIHdpdGggUG9wdWxhdGlvbihDb3JyZWxhdGlvbjogciA9IDAuMDE3LCB3aGljaCBpcyB0aGUgc3Ryb25nZXN0IGFtb25nIHlvdXIgcHJlZGljdG9ycywgYWx0aG91Z2ggaXQgaXMgc3RpbGwgZXh0cmVtZWx5IHdlYWspLiAsdGhlcmVmb3JlIHdlIGNob29zZSBQaG9zcGhhdGUgZm9yIG91ciBsaW5lYXIgcmVncmVzc2lvbiBhbmFseXNpcyBmb3IgZXhwbG9yYXRvcnkgYW5hbHlzaXMuDQoNClJlc3BvbnNlIHZhcmlhYmxlIChZKTogUG9wdWxhdGlvbg0KRXhwbG9yYXRvcnkgdmFyaWFibGUgKFgpOiBQaG9zcGhhdGUNCg0KKGkpIFNjYXR0ZXIgRGlhZ3JhbQ0KYGBge3J9DQp4IDwtIGRhdGEkUGhvc3BoYXRlDQp5IDwtIGRhdGEkUG9wdWxhdGlvbg0KDQpwbG90KHgsIHksDQogICAgIG1haW4gPSAiU2NhdHRlciBQbG90IG9mIFBob3NwaGF0ZSBhbmQgQWxnYWUgUG9wdWxhdGlvbiIsDQogICAgIHhsYWIgPSAiUGhvc3BoYXRlIChtZy9MKSIsDQogICAgIHlsYWIgPSAiQWxnYWUgUG9wdWxhdGlvbiIsDQogICAgIHBjaCA9IDE5LA0KICAgICBmcmFtZSA9IEZBTFNFKQ0KYGBgDQpJbnRlcnByZXRhdGlvbjogVGhlIHNjYXR0ZXIgcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gUGhvc3BoYXRlIGFuZCBhbGdhZSBQb3B1bGF0aW9uLiBUaGUgcG9pbnRzIGFyZSB3aWRlbHkgc2NhdHRlcmVkIGFuZCBkbyBub3Qgc2hvdyBhIGNsZWFyIGxpbmVhciBwYXR0ZXJuLCBpbmRpY2F0aW5nIHRoYXQgdGhlIGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBQaG9zcGhhdGUgYW5kIFBvcHVsYXRpb24gaXMgdmVyeSB3ZWFrLg0KDQooaWkpIENvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGFuZCBjb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uDQoNCkEuIENvcnJlbGF0aW9uIGNvZWZmaWNpZW50DQpgYGB7cn0NCmNvcl9waG9zcGhhdGUgPC0gY29yKGRhdGEkUG9wdWxhdGlvbixkYXRhJFBob3NwaGF0ZSkNCmNvcl9waG9zcGhhdGUNCmBgYA0KSW50ZXJwcmV0YXRpb246IFRoZSBQZWFyc29uIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IGJldHdlZW4gUGhvc3BoYXRlIGFuZCBhbGdhZSBQb3B1bGF0aW9uIGlzIHIgPSAwLjAxNy4gVGhpcyBpbmRpY2F0ZXMgYSB2ZXJ5IHdlYWsgcG9zaXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBob3NwaGF0ZSBhbmQgYWxnYWUgUG9wdWxhdGlvbi4NCg0KQi4gQ29lZmZpY2llbnQgb2YgZGV0ZXJtaW5hdGlvbiwgUsKyDQpgYGB7cn0NCnNpbXBsZV9tb2RlbCA8LSBsbShQb3B1bGF0aW9uIH4gUGhvc3BoYXRlLGRhdGEgPSBkYXRhKQ0Kcl9zcXVhcmVkIDwtIHN1bW1hcnkoc2ltcGxlX21vZGVsKSRyLnNxdWFyZWQNCnJfc3F1YXJlZA0KYGBgDQpJbnRlcnByZXRhdGlvbjogVGhlIGNvZWZmaWNpZW50IG9mIGRldGVybWluYXRpb24gaXMgYXBwcm94aW1hdGVseSBSwrIgPSAwLjAwMDI4OSwgd2hpY2ggbWVhbnMgdGhhdCBvbmx5IGFwcHJveGltYXRlbHkgMC4wMjg5JSBvZiB0aGUgdmFyaWF0aW9uIGluIGFsZ2FlIFBvcHVsYXRpb24gaXMgZXhwbGFpbmVkIGJ5IFBob3NwaGF0ZS4gVGhlcmVmb3JlLCBQaG9zcGhhdGUgcHJvdmlkZXMgdmVyeSBsaXR0bGUgZXhwbGFuYXRvcnkgcG93ZXIgZm9yIHByZWRpY3RpbmcgYWxnYWUgUG9wdWxhdGlvbiBpbiB0aGlzIGRhdGFzZXQuDQoNCihpaWkpIERlc2NyaWJlIHRoZSBTaW1wbGUgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCmBgYHtyfQ0KbW9kZWwgPC0gbG0oUG9wdWxhdGlvbiB+IFBob3NwaGF0ZSxkYXRhID0gZGF0YSkNCnN1bW1hcnkobW9kZWwpDQpgYGANCkVxdWF0aW9uOiBQb3B1bGF0aW9uID0gMzExMy45OCArIDQ1Mi4zOChQaG9zcGhhdGUpDQpJbnRlcmNlcHQgPSAzMTEzLjk4NQ0KVGhlIGludGVyY2VwdCBpcyAzMTEzLjk4NSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgcHJlZGljdGVkIGFsZ2FlIFBvcHVsYXRpb24gd2hlbiB0aGUgUGhvc3BoYXRlIGNvbmNlbnRyYXRpb24gaXMgemVyby4NClNsb3BlID0gNDUyLjM4NQ0KVGhlIHNsb3BlIGlzIDQ1Mi4zODUsIGluZGljYXRpbmcgdGhhdCBmb3IgZXZlcnkgb25lLXVuaXQgaW5jcmVhc2UgaW4gUGhvc3BoYXRlIGNvbmNlbnRyYXRpb24sIHRoZSBwcmVkaWN0ZWQgYWxnYWUgUG9wdWxhdGlvbiBpbmNyZWFzZXMgYnkgYXBwcm94aW1hdGVseSA0NTIuMzg1IHVuaXRzLCBvbiBhdmVyYWdlLg0KDQoNCihpdikgSHlwb3RoZXNpcyBUZXN0aW5nDQoNCkjigoA6IM6y4oKBID0gMCwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IGxpbmVhciByZWxhdGlvbnNoaXAgYmV0d2VlbiBQaG9zcGhhdGUgYW5kIGFsZ2FlIFBvcHVsYXRpb24uDQpI4oKBOiDOsuKCgSDiiaAgMCwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIFBob3NwaGF0ZSBhbmQgYWxnYWUgUG9wdWxhdGlvbi4NCnAtdmFsdWUgPSAwLjA5Mw0KU2luY2UgcC12YWx1ZSgwLjA5MykgPiAoYWxwaGE9MC4wNSksd2UgZmFpbCB0byByZWplY3QgSOKCgA0KQXQgYWxwaGEgPSAwLjA1LCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RhdGlzdGljYWwgZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCBQaG9zcGhhdGUgaGFzIGEgc2lnbmlmaWNhbnQgbGluZWFyIHJlbGF0aW9uc2hpcCB3aXRoIGFsZ2FlIFBvcHVsYXRpb24uDQoNCih2KSBSZXNpZHVhbCBBbmFseXNpcw0KDQpBLkxpbmVhcml0eQ0KYGBge3J9DQpwbG90KHNpbXBsZV9tb2RlbCwNCiAgICAgd2hpY2ggPSAxLA0KICAgICBtYWluID0gIlJlc2lkdWFscyB2cyBGaXR0ZWQgVmFsdWVzIikNCmBgYA0KTGluZWFyaXR5OiBUaGUgUmVzaWR1YWxzIHZzIEZpdHRlZCBwbG90IHNob3dzIHRoZSByZXNpZHVhbHMgc2NhdHRlcmVkIGFyb3VuZCB0aGUgaG9yaXpvbnRhbCB6ZXJvIGxpbmUgd2l0aG91dCBhIHN0cm9uZyBzeXN0ZW1hdGljIGN1cnZlZCBwYXR0ZXJuLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHN0cm9uZyBldmlkZW5jZSBvZiBhIHZpb2xhdGlvbiBvZiB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24uDQoNCkIuIEluZGVwZW5kZW5jZQ0KYGBge3J9DQpwbG90KHJlc2lkdWFscyhzaW1wbGVfbW9kZWwpLA0KICAgICB0eXBlID0gInAiLA0KICAgICBwY2ggPSAxOSwNCiAgICAgbWFpbiA9ICJSZXNpZHVhbHMgdnMgT2JzZXJ2YXRpb24gT3JkZXIiLA0KICAgICB4bGFiID0gIk9ic2VydmF0aW9uIE9yZGVyIiwNCiAgICAgeWxhYiA9ICJSZXNpZHVhbHMiKQ0KDQphYmxpbmUoaCA9IDApDQpgYGANCg0KSW50ZXJwcmV0YXRpb246IFRoZSByZXNpZHVhbHMgZG8gbm90IHNob3cgYSBjbGVhciBzeXN0ZW1hdGljIHBhdHRlcm4gd2hlbiBwbG90dGVkIGFnYWluc3Qgb2JzZXJ2YXRpb24gb3JkZXIuIEluIGFkZGl0aW9uLCB0aGUgRHVyYmluLVdhdHNvbiBzdGF0aXN0aWMgaXMgYXBwcm94aW1hdGVseSAxLjk4LCB3aGljaCBpcyBjbG9zZSB0byAyLCBzdWdnZXN0aW5nIHRoYXQgdGhlIGluZGVwZW5kZW5jZSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibGUuDQoNCkMuIE5vcm1hbGl0eQ0KYGBge3J9DQpwbG90KHNpbXBsZV9tb2RlbCx3aGljaCA9IDIsbWFpbiA9ICJOb3JtYWwgUS1RIFBsb3QiKQ0KYGBgDQpJbnRlcnByZXRhdGlvbjogVGhlIE5vcm1hbCBRLVEgcGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbCBwb2ludHMgZG8gbm90IGNsb3NlbHkgZm9sbG93IHRoZSBkaWFnb25hbCByZWZlcmVuY2UgbGluZS4gSW5zdGVhZCwgdGhlIHBvaW50cyBmb3JtIGEgY2xlYXIgUy1zaGFwZWQgcGF0dGVybiwgd2l0aCBzdWJzdGFudGlhbCBkZXZpYXRpb25zIGF0IGJvdGggdGFpbHMuIFRoZXJlZm9yZSwgdGhlIHJlc2lkdWFscyBkbyBub3QgYXBwZWFyIHRvIGJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLCBpbmRpY2F0aW5nIHRoYXQgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGlzIG5vdCBmdWxseSBzYXRpc2ZpZWQuDQoNCkQuIEVxdWFsIFZhcmlhbmNlDQpgYGB7cn0NCnBsb3Qoc2ltcGxlX21vZGVsLA0KICAgICB3aGljaCA9IDMsDQogICAgIG1haW4gPSAiU2NhbGUtTG9jYXRpb24gUGxvdCIpDQpgYGANCkludGVycHJldGF0aW9uOiBUaGUgU2NhbGUtTG9jYXRpb24gcGxvdCBzaG93cyB0aGF0IHRoZSByZXNpZHVhbHMgaGF2ZSBhIHJlbGF0aXZlbHkgY29uc2lzdGVudCBzcHJlYWQgYWNyb3NzIHRoZSBmaXR0ZWQgdmFsdWVzLiBUaGUgcmVkIHRyZW5kIGxpbmUgaXMgYXBwcm94aW1hdGVseSBob3Jpem9udGFsLCBhbmQgdGhlcmUgaXMgbm8gY2xlYXIgZnVubmVsLXNoYXBlZCBwYXR0ZXJuLiBUaGVyZWZvcmUsIHRoZSBlcXVhbCB2YXJpYW5jZSBhc3N1bXB0aW9uIGFwcGVhcnMgdG8gYmUgcmVhc29uYWJseSBzYXRpc2ZpZWQuDQoNCg0KUTINCg0KU2luY2UgUGhvc3BoYXRlIGFuZCBDTzIgaGF2ZSB0aGUgdHdvIGxhcmdlc3QgYWJzb2x1dGUgY29ycmVsYXRpb25zIHdpdGggUG9wdWxhdGlvbiBpbiBRMSByZXN1bHRzLHNvIHdlIGNob29zZSBpdCBhcyBleHBsb3JhdG9yeSB2YXJpYWJsZXMsWC4NCg0KUmVzcG9uc2UgdmFyaWFibGUgKFkpOiBQb3B1bGF0aW9uDQpY4oKBOiBQaG9zcGhhdGUNCljigoI6IENPMg0KDQppKVNjYXR0ZXIgRGlhZ3JhbQ0KYGBge3J9DQpwYWlycyhkYXRhWywgYygiUG9wdWxhdGlvbiIsICJQaG9zcGhhdGUiLCAiQ08yIildLA0KICAgICAgcGNoID0gMTkpDQpgYGANCkludGVycHJldGF0aW9uOiBUaGUgc2NhdHRlciBwbG90IG1hdHJpeCBzaG93cyB0aGUgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIFBvcHVsYXRpb24sIFBob3NwaGF0ZSBhbmQgQ0/igoIuIFRoZSBwbG90cyBzaG93IG5vIGNsZWFyIHN0cm9uZyBsaW5lYXIgcGF0dGVybiBiZXR3ZWVuIFBvcHVsYXRpb24gYW5kIGVpdGhlciBQaG9zcGhhdGUgb3IgQ0/igoIuDQoNCg0KKGlpKSBDb3JyZWxhdGlvbiBjb2VmZmljaWVudCBhbmQgY29lZmZpY2llbnQgb2YgZGV0ZXJtaW5hdGlvbg0KDQpBLiBDb3JyZWxhdGlvbiBjb2VmZmljaWVudA0KYGBge3J9DQpjb3JyIDwtIHJvdW5kKGNvcihkYXRhWywgYygiUG9wdWxhdGlvbiIsIlBob3NwaGF0ZSIsIkNPMiIpXSksIDQpDQpjb3JyDQpgYGANCkludGVycHJldGF0aW9uOiBGb3IgUGhvc3BoYXRlLCBUaGUgY29ycmVsYXRpb24gY29lZmZpY2llbnQgb2YgMC4wMTcwIGluZGljYXRlcyBhIHZlcnkgd2VhayBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gUGhvc3BoYXRlIGFuZCBhbGdhZSBQb3B1bGF0aW9uLkZvciBDTzIsVGhlIGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IG9mIOKIkjAuMDE0OSBpbmRpY2F0ZXMgYSB2ZXJ5IHdlYWsgbmVnYXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIENP4oKCIGFuZCBhbGdhZSBQb3B1bGF0aW9uLg0KDQpCLiBDb2VmZmljaWVudCBvZiBkZXRlcm1pbmF0aW9uLCBSwrINCmBgYHtyfQ0KbXVsdGlwbGVfbW9kZWwgPC0gbG0oUG9wdWxhdGlvbiB+IFBob3NwaGF0ZSArIENPMixkYXRhID0gZGF0YSkNCnN1bW1hcnkobXVsdGlwbGVfbW9kZWwpDQpgYGANCkludGVycHJldGF0aW9uOiBUaGUgTXVsdGlwbGUgUi1zcXVhcmVkIHZhbHVlIG9mIDAuMDAwNTAzOSBpbmRpY2F0ZXMgdGhhdCBhcHByb3hpbWF0ZWx5IDAuMDUlIG9mIHRoZSB2YXJpYXRpb24gaW4gYWxnYWUgUG9wdWxhdGlvbiBpcyBleHBsYWluZWQgam9pbnRseSBieSBQaG9zcGhhdGUgYW5kIENP4oKCLg0KDQooaWlpKSBEZXNjcmliZSB0aGUgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gTW9kZWwNCmBgYHtyfQ0Kc3VtbWFyeShtdWx0aXBsZV9tb2RlbCkNCg0KIyBEaXNwbGF5IGNvZWZmaWNpZW50cw0KY29lZihtdWx0aXBsZV9tb2RlbCkNCmBgYA0KDQpFcXV0aW9uOiBQb3B1bGF0aW9uID0gMzE3MC40NDAgKyA0NDcuODYyKFBob3NwYXRlKSAtIDkuMzE2KENPMikNCkludGVyY2VwdCA9IDMxNzAuNDQwDQpUaGUgaW50ZXJjZXB0IG9mIDMxNzAuNDQwIHJlcHJlc2VudHMgdGhlIHByZWRpY3RlZCBhbGdhZSBQb3B1bGF0aW9uIHdoZW4gYm90aCBQaG9zcGhhdGUgYW5kIENP4oKCIGFyZSB6ZXJvLg0KUGhvc3BoYXRlIGNvZWZmaWNpZW50ID0gNDQ3Ljg2Mg0KSG9sZGluZyBDT+KCgiBjb25zdGFudCwgYSBvbmUtdW5pdCBpbmNyZWFzZSBpbiBQaG9zcGhhdGUgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGVzdGltYXRlZCA0NDcuODYyIHVuaXQgaW5jcmVhc2UgaW4gYWxnYWUgUG9wdWxhdGlvbi4NCkNP4oKCIGNvZWZmaWNpZW50ID0g4oiSOS4zMTYNCkhvbGRpbmcgUGhvc3BoYXRlIGNvbnN0YW50LCBhIG9uZS11bml0IGluY3JlYXNlIGluIENP4oKCIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBlc3RpbWF0ZWQgOS4zMTYgdW5pdCBkZWNyZWFzZSBpbiBhbGdhZSBQb3B1bGF0aW9uLg0KDQooaXYpIEh5cG90aGVzaXMgVGVzdGluZw0KYGBge3J9DQpzdW1tYXJ5KG11bHRpcGxlX21vZGVsKQ0KYGBgDQpI4oKAOiDOsuKCgSA9IM6y4oKCID0gMA0KSOKCgTogQXQgbGVhc3Qgb25lIG9mIM6y4oKBLCDOsuKCgiDiiaAgMA0KcC12YWx1ZSA9IDAuMDg1DQpTaW5jZSBwLXZhbHVlKDAuMDg1KSA+IChhbHBoYT0wLjA1KSx3ZSBmYWlsIHRvIHJlamVjdCBI4oKADQpBdCBhbHBoYSA9IDAuMDUgLHRoZXJlIGlzIGluc3VmZmljaWVudCBldmlkZW5jZSB0byBjb25jbHVkZSB0aGF0IFBob3NwaGF0ZSBhbmQgQ0/igoIgam9pbnRseSBoYXZlIGEgc2lnbmlmaWNhbnQgbGluZWFyIHJlbGF0aW9uc2hpcCB3aXRoIGFsZ2FlIFBvcHVsYXRpb24uDQoNCg0KKHYpIFJlc2lkdWFsIEFuYWx5c2lzDQoNCkEuTGluZWFyaXR5DQpgYGB7cn0NCnBsb3QobXVsdGlwbGVfbW9kZWwsDQogICAgIHdoaWNoID0gMSwNCiAgICAgbWFpbiA9ICJNdWx0aXBsZSBSZWdyZXNzaW9uOiBSZXNpZHVhbHMgdnMgRml0dGVkIikNCmBgYA0KSW50ZXJwcmV0YXRpb246IFRoZSByZXNpZHVhbHMgYXJlIHJhbmRvbWx5IHNjYXR0ZXJlZCBhcm91bmQgdGhlIHplcm8gbGluZSB3aXRob3V0IGEgY2xlYXIgY3VydmVkIHBhdHRlcm4uIFRoZXJlZm9yZSwgdGhlIGxpbmVhcml0eSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibHkgc2F0aXNmaWVkIGZvciB0aGUgbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwuDQoNCkIuIEluZGVwZW5kZW5jZQ0KYGBge3J9DQpwbG90KHJlc2lkdWFscyhtdWx0aXBsZV9tb2RlbCksDQogICAgIHR5cGUgPSAicCIsDQogICAgIHBjaCA9IDE5LA0KICAgICBtYWluID0gIk11bHRpcGxlIFJlZ3Jlc3Npb246IFJlc2lkdWFscyB2cyBPYnNlcnZhdGlvbiBPcmRlciIsDQogICAgIHhsYWIgPSAiT2JzZXJ2YXRpb24gT3JkZXIiLA0KICAgICB5bGFiID0gIlJlc2lkdWFscyIpDQoNCmFibGluZShoID0gMCkNCmBgYA0KSW50ZXJwcmV0YXRpb246IFRoZSByZXNpZHVhbHMgYXBwZWFyIHRvIGJlIHJhbmRvbWx5IHNjYXR0ZXJlZCBhcm91bmQgemVybyBhY3Jvc3MgdGhlIG9ic2VydmF0aW9uIG9yZGVyIHdpdGhvdXQgYSBjbGVhciBzeXN0ZW1hdGljIHBhdHRlcm4uIFRoZXJlZm9yZSwgdGhlIGluZGVwZW5kZW5jZSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibHkgc2F0aXNmaWVkLg0KDQpDLiBOb3JtYWxpdHkNCmBgYHtyfQ0KcGxvdChtdWx0aXBsZV9tb2RlbCwNCiAgICAgd2hpY2ggPSAyLA0KICAgICBtYWluID0gIk11bHRpcGxlIFJlZ3Jlc3Npb246IE5vcm1hbCBRLVEgUGxvdCIpDQpgYGANCkludGVycHJldGF0aW9uOiBUaGUgcG9pbnRzIGluIHRoZSBub3JtYWwgUS1RIHBsb3QgZGV2aWF0ZSBzdWJzdGFudGlhbGx5IGZyb20gdGhlIGRpYWdvbmFsIHJlZmVyZW5jZSBsaW5lLCBwYXJ0aWN1bGFybHkgYXQgdGhlIGxvd2VyIGFuZCB1cHBlciB0YWlscy4gVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzaWR1YWxzIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFRoZXJlZm9yZSwgdGhlIG5vcm1hbGl0eSBhc3N1bXB0aW9uIGlzIG5vdCBzYXRpc2ZpZWQgZm9yIHRoZSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4NCg0KRC4gRXF1YWwgVmFyaWFuY2UNCmBgYHtyfQ0KcGxvdChtdWx0aXBsZV9tb2RlbCwNCiAgICAgd2hpY2ggPSAzLA0KICAgICBtYWluID0gIk11bHRpcGxlIFJlZ3Jlc3Npb246IFNjYWxlLUxvY2F0aW9uIFBsb3QiKQ0KYGBgDQpJbnRlcnByZXRhdGlvbjogVGhlIHJlc2lkdWFscyBzaG93IGEgcmVsYXRpdmVseSBjb25zaXN0ZW50IHNwcmVhZCBhY3Jvc3MgdGhlIGZpdHRlZCB2YWx1ZXMsIGFuZCB0aGUgc21vb3RoIHJlZCBsaW5lIHJlbWFpbnMgYXBwcm94aW1hdGVseSBob3Jpem9udGFsLiBUaGVyZSBpcyBubyBjbGVhciBmdW5uZWwtc2hhcGVkIHBhdHRlcm4uIFRoZXJlZm9yZSwgdGhlIGVxdWFsIHZhcmlhbmNlIChob21vc2NlZGFzdGljaXR5KSBhc3N1bXB0aW9uIGlzIHJlYXNvbmFibHkgc2F0aXNmaWVkLg0K