The notebook is used exclusivelly by the students within the seminars of Econometrics at the University of János Selye. We have kindly used the WHO Life Expactancy Data database.

Below, I introduced all the necessary packages needed for the work.

library(zoo)
library(tseries)
library(lmtest)
library(sandwich)
rm(list=ls())

I set set the Session in the Main menu to Sorce File Location. I can to it also in the interactive way (or include to the script) as

setwd(“/cloud/project/ExternalStudy/final”)

But, organization of the folders and subfolders can change from one project to another, that is, why I do not put it into the Chunk.

The Life expectancy data are organized in the csv file, columns separated by “,” and using the decimal comma. I created in my working folde a subfolder called adot, to divide the data and rest of the project. My frame is also called adot.

Not all the data will be used, that is, why I outfiltered just som of the columns for the later use.

As some data are missing, I imputed them by the median values of the variable in the consideration.

adot <- read.csv("adot/Life_Expectancy_Data.csv",dec=".",sep=",",header = TRUE)
# select just the record from 2015
adot.2015 <- adot[adot$Year==2015,c("Life.expectancy","Adult.Mortality","infant.deaths","Hepatitis.B","percentage.expenditure","Measles","thinness..1.19.years","BMI","Income.composition.of.resources","Polio","Diphtheria","HIV.AIDS","GDP","Schooling")]

# data imputation

# Compute column medians
#column_medians <- sapply(adot.2015, median, na.rm = TRUE)

# Impute missing values with column medians
# Compute column medians
column_medians <- sapply(adot.2015, median, na.rm = TRUE)

# Impute missing values with column medians
adot_imputed <- adot.2015
for (col in names(adot.2015)) {
  adot_imputed[[col]][is.na(adot_imputed[[col]])] <- column_medians[col]
}

adot.2015 <- adot_imputed

Now, we want to see the shape of the data (if there are not some irregularities - 0 values for example)

# Create histograms for each variable in the data frame
for (col in names(adot.2015)) {
  boxplot(adot.2015[[col]], main = col, xlab = "Value")
}

The variables infant.deaths, percentage.expenditure, and Measles are not well distributed. It can be the cosequence of the data error and that is, why we exclude these data.

# Exclude specified columns from the data frame
adot_excluded <- adot.2015[, !names(adot.2015) %in% c("infant.deaths", "percentage.expenditure", "Measles")]
adot.2015 <- adot_excluded

At first, I estimated the overparametrized model having the life expectancy as the dependent variable, and all the others as the independet variables.

model <- lm(Life.expectancy ~ .,data=adot.2015)
summary(model)

Call:
lm(formula = Life.expectancy ~ ., data = adot.2015)

Residuals:
    Min      1Q  Median      3Q     Max 
-11.124  -1.467  -0.146   1.709   8.327 

Coefficients:
                                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)                      5.379e+01  2.116e+00  25.418  < 2e-16 ***
Adult.Mortality                 -2.921e-02  3.484e-03  -8.383 1.78e-14 ***
Hepatitis.B                      3.647e-02  2.525e-02   1.444   0.1506    
thinness..1.19.years            -1.683e-01  6.846e-02  -2.458   0.0149 *  
BMI                              3.161e-03  1.428e-02   0.221   0.8250    
Income.composition.of.resources  2.538e+01  4.705e+00   5.395 2.24e-07 ***
Polio                            1.308e-02  1.332e-02   0.982   0.3274    
Diphtheria                       2.198e-03  2.891e-02   0.076   0.9395    
HIV.AIDS                        -4.656e-01  2.347e-01  -1.984   0.0489 *  
GDP                              2.881e-06  2.502e-05   0.115   0.9085    
Schooling                        1.008e-01  2.116e-01   0.477   0.6343    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.116 on 172 degrees of freedom
Multiple R-squared:  0.8609,    Adjusted R-squared:  0.8528 
F-statistic: 106.5 on 10 and 172 DF,  p-value: < 2.2e-16

The summary of the estimated model provides us with a set of the estimated regression coefficients, the signs of which will be discussed later. If speaking about the properties of the model as a whole, let us check firstly the following Figures. Based on the Q-Q graph, we get the impression about possible problems of the violation of the residuals normality.

plot(model)

At the same time, we run the consequent tests, where we reject the hypothesis of the normal disributed model errors, as well as the presence of the outliers. The violation of the homoskedasticity and improper model specification has been also proved.

# normality tests
residuals <- residuals(model)
jb_test <- jarque.bera.test(residuals)
jb_test

    Jarque Bera Test

data:  residuals
X-squared = 22.873, df = 2, p-value = 1.079e-05
# outlier test (see p-value for Bonferroni correction)
outlier_test <- outlierTest(model)
outlier_test[3]
$bonf.p
       433 
0.02850533 
# heteroskedasticity tests
bp_test <- bptest(model)
bp_test

    studentized Breusch-Pagan test

data:  model
BP = 27.605, df = 10, p-value = 0.002088
# Ramsey Reset test
reset_test <- resettest(model,power=2, type="fitted") # further modification - see help(resettest)
reset_test

    RESET test

data:  model
RESET = 7.448, df1 = 1, df2 = 171, p-value = 0.007015
# multicollinearity
vif(model)
                Adult.Mortality                     Hepatitis.B            thinness..1.19.years 
                       2.164814                        6.610713                        1.461006 
                            BMI Income.composition.of.resources                           Polio 
                       1.617980                        9.246130                        1.953644 
                     Diphtheria                        HIV.AIDS                             GDP 
                       7.692364                        1.866332                        1.377535 
                      Schooling 
                       6.726593 

Based on the test results, we assume there is problem with the residuals normality as well as with the heteroskedasticity. Ramsey Reset test indicates the problem with the bad specification of the model. VIF also does not indicate some signifficant problem with multicollinearity, Variable Income.composition.of.resources seems to be highly correlated with the others (however not exceeding the tresh value 10). As we have a lot of the other variables, we exclude it.

After exclusion of the Income.composition.of.resources variable, we got the following results:

model2 <- lm(Life.expectancy ~ . - Income.composition.of.resources ,data=adot.2015)
summary(model2)

Call:
lm(formula = Life.expectancy ~ . - Income.composition.of.resources, 
    data = adot.2015)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.8044 -1.8035 -0.0944  2.3544  8.2056 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           5.865e+01  2.065e+00  28.394  < 2e-16 ***
Adult.Mortality      -3.435e-02  3.613e-03  -9.508  < 2e-16 ***
Hepatitis.B           1.855e-02  2.699e-02   0.687  0.49278    
thinness..1.19.years -2.027e-01  7.350e-02  -2.758  0.00643 ** 
BMI                   1.587e-02  1.518e-02   1.045  0.29727    
Polio                 2.357e-02  1.420e-02   1.659  0.09884 .  
Diphtheria            1.895e-02  3.099e-02   0.612  0.54166    
HIV.AIDS             -5.976e-01  2.517e-01  -2.375  0.01867 *  
GDP                   3.613e-05  2.614e-05   1.382  0.16868    
Schooling             1.045e+00  1.283e-01   8.144 7.31e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.36 on 173 degrees of freedom
Multiple R-squared:  0.8374,    Adjusted R-squared:  0.8289 
F-statistic: 98.99 on 9 and 173 DF,  p-value: < 2.2e-16

The signs of the statistically significant coeficients are expected but besides the signe of Polio, which has a positive sign. If checking the following figures, we got impression on the signifficant improving of the model statistical wquality

plot(model2)

Our impressions were corroborated as introduced in the following set of tests. The only remaining problem is the problem of heteroskedasticity.

# normality tests
residuals <- residuals(model2)
jb_test <- jarque.bera.test(residuals)
jb_test

    Jarque Bera Test

data:  residuals
X-squared = 1.609, df = 2, p-value = 0.4473
# outlier test (see p-value for Bonferroni correction)
outlier_test <- outlierTest(model2)
outlier_test[3]
$bonf.p
      401 
0.4061314 
# heteroskedasticity tests
bp_test <- bptest(model2)
bp_test

    studentized Breusch-Pagan test

data:  model2
BP = 29.948, df = 9, p-value = 0.0004478
# Ramsey Reset test
reset_test <- resettest(model2,power=2, type="fitted") # further modification - see help(resettest)
reset_test

    RESET test

data:  model2
RESET = 3.7825, df1 = 1, df2 = 172, p-value = 0.05342
# multicollinearity
vif(model2)
     Adult.Mortality          Hepatitis.B thinness..1.19.years                  BMI                Polio 
            2.002605             6.496412             1.448322             1.573912             1.911980 
          Diphtheria             HIV.AIDS                  GDP            Schooling 
            7.603608             1.846048             1.293914             2.127115 

Diphteria is not statistically signifficant and is highly correlated with other variables (see VIF). Let us exclude it.

model3 <- lm(Life.expectancy ~ . - Income.composition.of.resources - Diphtheria,data=adot.2015)
summary(model3)

Call:
lm(formula = Life.expectancy ~ . - Income.composition.of.resources - 
    Diphtheria, data = adot.2015)

Residuals:
    Min      1Q  Median      3Q     Max 
-9.7979 -1.8515 -0.0687  2.3003  8.2266 

Coefficients:
                       Estimate Std. Error t value Pr(>|t|)    
(Intercept)           5.882e+01  2.042e+00  28.805  < 2e-16 ***
Adult.Mortality      -3.444e-02  3.603e-03  -9.559  < 2e-16 ***
Hepatitis.B           3.273e-02  1.378e-02   2.375  0.01863 *  
thinness..1.19.years -2.022e-01  7.336e-02  -2.756  0.00648 ** 
BMI                   1.504e-02  1.509e-02   0.996  0.32052    
Polio                 2.593e-02  1.364e-02   1.901  0.05900 .  
HIV.AIDS             -6.122e-01  2.501e-01  -2.448  0.01536 *  
GDP                   3.814e-05  2.588e-05   1.474  0.14238    
Schooling             1.052e+00  1.274e-01   8.259 3.56e-14 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.354 on 174 degrees of freedom
Multiple R-squared:  0.837, Adjusted R-squared:  0.8295 
F-statistic: 111.7 on 8 and 174 DF,  p-value: < 2.2e-16

The only statistically insignifficant variables remained GDP and BMI. All the statistically signifficant coefficients have expected signs, besides Polio.

To get some imagine about the statistical properties of the model as a whole, let us look at the following figures. All the graphical analysis are rather optimistic if speaking about the statistical quality of the model.

plot(model3)

# normality tests
residuals <- residuals(model3)
jb_test <- jarque.bera.test(residuals)
jb_test

    Jarque Bera Test

data:  residuals
X-squared = 1.7349, df = 2, p-value = 0.42
# outlier test (see p-value for Bonferroni correction)
outlier_test <- outlierTest(model3)
outlier_test[3]
$bonf.p
    401 
0.40155 
# heteroskedasticity tests
bp_test <- bptest(model3)
bp_test

    studentized Breusch-Pagan test

data:  model3
BP = 30.266, df = 8, p-value = 0.0001897
# Ramsey Reset test
reset_test <- resettest(model3,power=2, type="fitted") # further modification - see help(resettest)
reset_test

    RESET test

data:  model3
RESET = 3.7192, df1 = 1, df2 = 173, p-value = 0.05543
# multicollinearity
vif(model3)
     Adult.Mortality          Hepatitis.B thinness..1.19.years                  BMI                Polio 
            1.999196             1.700070             1.448099             1.561153             1.770545 
            HIV.AIDS                  GDP            Schooling 
            1.829413             1.273366             2.106336 

If putting out GDP variable, the results worsened. that is, why the model3 is considered as the best one and we are going to solve the heteroskedasticity problem by the introduction of the t-tests using the White heteroskedasticity consistent matrix as follows

# Load libraries
library("lmtest")
library("sandwich")

# Robust t test
coeftest(model3, vcov = vcovHC(model3, type = "HC0"))

t test of coefficients:

                        Estimate  Std. Error t value  Pr(>|t|)    
(Intercept)           5.8820e+01  2.6650e+00 22.0714 < 2.2e-16 ***
Adult.Mortality      -3.4441e-02  5.8121e-03 -5.9258 1.627e-08 ***
Hepatitis.B           3.2734e-02  1.4013e-02  2.3360   0.02063 *  
thinness..1.19.years -2.0217e-01  7.8692e-02 -2.5691   0.01104 *  
BMI                   1.5036e-02  1.7635e-02  0.8526   0.39504    
Polio                 2.5933e-02  1.5622e-02  1.6600   0.09872 .  
HIV.AIDS             -6.1216e-01  3.4428e-01 -1.7781   0.07714 .  
GDP                   3.8144e-05  1.8118e-05  2.1054   0.03669 *  
Schooling             1.0525e+00  1.5447e-01  6.8135 1.496e-10 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

##Conclusion##

Variables Adult.mortality, thinness and HIV.AIDS shorten the expected length of life. On the other side, Polio and Hepatitis.B seem to extend the length of life, what is the fact, we can not interpret. Probably the prevent has some long term impacts, or some vaccination treatment coming after the period of higher amount of these diseases was helping? Schooling, percentage.expenditure and GDP are the economic factors significantly improving the expected length of life.

LS0tCnRpdGxlOiAiRWNvbm9tZXRyaWNzIGluIFIiCm91dHB1dDogaHRtbF9ub3RlYm9vawphdXRob3I6IFYuIEdhemRhCi0tLQoKVGhlIG5vdGVib29rIGlzIHVzZWQgZXhjbHVzaXZlbGx5IGJ5IHRoZSBzdHVkZW50cyB3aXRoaW4gdGhlIHNlbWluYXJzIG9mIEVjb25vbWV0cmljcyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBKw6Fub3MgU2VseWUuIFdlIGhhdmUga2luZGx5IHVzZWQgdGhlIFtXSE8gTGlmZSBFeHBhY3RhbmN5IERhdGFdKGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMva3VtYXJhamFyc2hpL2xpZmUtZXhwZWN0YW5jeS13aG8pIGRhdGFiYXNlLgoKQmVsb3csIEkgaW50cm9kdWNlZCBhbGwgdGhlIG5lY2Vzc2FyeSBwYWNrYWdlcyBuZWVkZWQgZm9yIHRoZSB3b3JrLgoKYGBge3J9CmxpYnJhcnkoem9vKQpsaWJyYXJ5KHRzZXJpZXMpCmxpYnJhcnkobG10ZXN0KQpsaWJyYXJ5KHNhbmR3aWNoKQpybShsaXN0PWxzKCkpCmBgYApJIHNldCBzZXQgdGhlICpTZXNzaW9uKiBpbiB0aGUgKk1haW4gbWVudSogdG8gKlNvcmNlIEZpbGUgTG9jYXRpb24qLiBJIGNhbiB0byBpdCBhbHNvIGluIHRoZSBpbnRlcmFjdGl2ZSB3YXkgKG9yIGluY2x1ZGUgdG8gdGhlIHNjcmlwdCkgYXMgCgogKipzZXR3ZCgiL2Nsb3VkL3Byb2plY3QvRXh0ZXJuYWxTdHVkeS9maW5hbCIpKioKCkJ1dCwgb3JnYW5pemF0aW9uIG9mIHRoZSBmb2xkZXJzIGFuZCBzdWJmb2xkZXJzIGNhbiBjaGFuZ2UgZnJvbSBvbmUgcHJvamVjdCB0byBhbm90aGVyLCB0aGF0IGlzLCB3aHkgSSBkbyBub3QgcHV0IGl0IGludG8gdGhlIENodW5rLgoKVGhlIExpZmUgZXhwZWN0YW5jeSBkYXRhIGFyZSBvcmdhbml6ZWQgaW4gdGhlICpjc3YqIGZpbGUsIGNvbHVtbnMgc2VwYXJhdGVkIGJ5ICIsIiBhbmQgdXNpbmcgdGhlIGRlY2ltYWwgY29tbWEuIEkgY3JlYXRlZCBpbiBteSB3b3JraW5nIGZvbGRlIGEgc3ViZm9sZGVyIGNhbGxlZCAqYWRvdCosIHRvIGRpdmlkZSB0aGUgZGF0YSBhbmQgcmVzdCBvZiB0aGUgcHJvamVjdC4gTXkgZnJhbWUgaXMgYWxzbyBjYWxsZWQgKmFkb3QqLiAKCk5vdCBhbGwgdGhlIGRhdGEgd2lsbCBiZSB1c2VkLCB0aGF0IGlzLCB3aHkgSSBvdXRmaWx0ZXJlZCBqdXN0IHNvbSBvZiB0aGUgY29sdW1ucyBmb3IgdGhlIGxhdGVyIHVzZS4KCkFzIHNvbWUgZGF0YSBhcmUgbWlzc2luZywgSSBpbXB1dGVkIHRoZW0gYnkgdGhlIG1lZGlhbiB2YWx1ZXMgb2YgdGhlIHZhcmlhYmxlIGluIHRoZSBjb25zaWRlcmF0aW9uLiAKCmBgYHtyfQphZG90IDwtIHJlYWQuY3N2KCJhZG90L0xpZmVfRXhwZWN0YW5jeV9EYXRhLmNzdiIsZGVjPSIuIixzZXA9IiwiLGhlYWRlciA9IFRSVUUpCiMgc2VsZWN0IGp1c3QgdGhlIHJlY29yZCBmcm9tIDIwMTUKYWRvdC4yMDE1IDwtIGFkb3RbYWRvdCRZZWFyPT0yMDE1LGMoIkxpZmUuZXhwZWN0YW5jeSIsIkFkdWx0Lk1vcnRhbGl0eSIsImluZmFudC5kZWF0aHMiLCJIZXBhdGl0aXMuQiIsInBlcmNlbnRhZ2UuZXhwZW5kaXR1cmUiLCJNZWFzbGVzIiwidGhpbm5lc3MuLjEuMTkueWVhcnMiLCJCTUkiLCJJbmNvbWUuY29tcG9zaXRpb24ub2YucmVzb3VyY2VzIiwiUG9saW8iLCJEaXBodGhlcmlhIiwiSElWLkFJRFMiLCJHRFAiLCJTY2hvb2xpbmciKV0KCiMgZGF0YSBpbXB1dGF0aW9uCgojIENvbXB1dGUgY29sdW1uIG1lZGlhbnMKI2NvbHVtbl9tZWRpYW5zIDwtIHNhcHBseShhZG90LjIwMTUsIG1lZGlhbiwgbmEucm0gPSBUUlVFKQoKIyBJbXB1dGUgbWlzc2luZyB2YWx1ZXMgd2l0aCBjb2x1bW4gbWVkaWFucwojIENvbXB1dGUgY29sdW1uIG1lZGlhbnMKY29sdW1uX21lZGlhbnMgPC0gc2FwcGx5KGFkb3QuMjAxNSwgbWVkaWFuLCBuYS5ybSA9IFRSVUUpCgojIEltcHV0ZSBtaXNzaW5nIHZhbHVlcyB3aXRoIGNvbHVtbiBtZWRpYW5zCmFkb3RfaW1wdXRlZCA8LSBhZG90LjIwMTUKZm9yIChjb2wgaW4gbmFtZXMoYWRvdC4yMDE1KSkgewogIGFkb3RfaW1wdXRlZFtbY29sXV1baXMubmEoYWRvdF9pbXB1dGVkW1tjb2xdXSldIDwtIGNvbHVtbl9tZWRpYW5zW2NvbF0KfQoKYWRvdC4yMDE1IDwtIGFkb3RfaW1wdXRlZAoKYGBgCgpOb3csIHdlIHdhbnQgdG8gc2VlIHRoZSBzaGFwZSBvZiB0aGUgZGF0YSAoaWYgdGhlcmUgYXJlIG5vdCBzb21lIGlycmVndWxhcml0aWVzIC0gMCB2YWx1ZXMgZm9yIGV4YW1wbGUpCgpgYGB7cn0KIyBDcmVhdGUgaGlzdG9ncmFtcyBmb3IgZWFjaCB2YXJpYWJsZSBpbiB0aGUgZGF0YSBmcmFtZQpmb3IgKGNvbCBpbiBuYW1lcyhhZG90LjIwMTUpKSB7CiAgYm94cGxvdChhZG90LjIwMTVbW2NvbF1dLCBtYWluID0gY29sLCB4bGFiID0gIlZhbHVlIikKfQpgYGAKCgpUaGUgdmFyaWFibGVzICppbmZhbnQuZGVhdGhzKiwgKnBlcmNlbnRhZ2UuZXhwZW5kaXR1cmUqLCBhbmQgKk1lYXNsZXMqIGFyZSBub3Qgd2VsbCBkaXN0cmlidXRlZC4gSXQgY2FuIGJlIHRoZSBjb3NlcXVlbmNlIG9mIHRoZSBkYXRhIGVycm9yIGFuZCB0aGF0IGlzLCB3aHkgd2UgZXhjbHVkZSB0aGVzZSBkYXRhLgoKYGBge3J9CiMgRXhjbHVkZSBzcGVjaWZpZWQgY29sdW1ucyBmcm9tIHRoZSBkYXRhIGZyYW1lCmFkb3RfZXhjbHVkZWQgPC0gYWRvdC4yMDE1WywgIW5hbWVzKGFkb3QuMjAxNSkgJWluJSBjKCJpbmZhbnQuZGVhdGhzIiwgInBlcmNlbnRhZ2UuZXhwZW5kaXR1cmUiLCAiTWVhc2xlcyIpXQphZG90LjIwMTUgPC0gYWRvdF9leGNsdWRlZApgYGAKCgoKCgpBdCBmaXJzdCwgSSBlc3RpbWF0ZWQgdGhlIG92ZXJwYXJhbWV0cml6ZWQgbW9kZWwgaGF2aW5nIHRoZSBsaWZlIGV4cGVjdGFuY3kgYXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSwgYW5kIGFsbCB0aGUgb3RoZXJzIGFzIHRoZSBpbmRlcGVuZGV0IHZhcmlhYmxlcy4KCmBgYHtyfQptb2RlbCA8LSBsbShMaWZlLmV4cGVjdGFuY3kgfiAuLGRhdGE9YWRvdC4yMDE1KQpzdW1tYXJ5KG1vZGVsKQpgYGAKVGhlIHN1bW1hcnkgb2YgdGhlIGVzdGltYXRlZCBtb2RlbCBwcm92aWRlcyB1cyB3aXRoIGEgc2V0IG9mIHRoZSBlc3RpbWF0ZWQgcmVncmVzc2lvbiBjb2VmZmljaWVudHMsIHRoZSBzaWducyBvZiB3aGljaCB3aWxsIGJlIGRpc2N1c3NlZCBsYXRlci4gSWYgc3BlYWtpbmcgYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIG1vZGVsIGFzIGEgd2hvbGUsIGxldCB1cyBjaGVjayBmaXJzdGx5IHRoZSBmb2xsb3dpbmcgRmlndXJlcy4gQmFzZWQgb24gdGhlIFEtUSBncmFwaCwgd2UgZ2V0IHRoZSBpbXByZXNzaW9uIGFib3V0IHBvc3NpYmxlIHByb2JsZW1zIG9mIHRoZSB2aW9sYXRpb24gb2YgdGhlIHJlc2lkdWFscyBub3JtYWxpdHkuIAoKYGBge3J9CnBsb3QobW9kZWwpCmBgYApBdCB0aGUgc2FtZSB0aW1lLCB3ZSBydW4gdGhlIGNvbnNlcXVlbnQgdGVzdHMsIHdoZXJlIHdlIHJlamVjdCB0aGUgaHlwb3RoZXNpcyBvZiB0aGUgbm9ybWFsIGRpc3JpYnV0ZWQgbW9kZWwgZXJyb3JzLCBhcyB3ZWxsIGFzIHRoZSBwcmVzZW5jZSBvZiB0aGUgb3V0bGllcnMuIFRoZSB2aW9sYXRpb24gb2YgdGhlIGhvbW9za2VkYXN0aWNpdHkgYW5kIGltcHJvcGVyIG1vZGVsIHNwZWNpZmljYXRpb24gaGFzIGJlZW4gYWxzbyBwcm92ZWQuCgpgYGB7cn0KIyBub3JtYWxpdHkgdGVzdHMKcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhtb2RlbCkKamJfdGVzdCA8LSBqYXJxdWUuYmVyYS50ZXN0KHJlc2lkdWFscykKamJfdGVzdAojIG91dGxpZXIgdGVzdCAoc2VlIHAtdmFsdWUgZm9yIEJvbmZlcnJvbmkgY29ycmVjdGlvbikKb3V0bGllcl90ZXN0IDwtIG91dGxpZXJUZXN0KG1vZGVsKQpvdXRsaWVyX3Rlc3RbM10KIyBoZXRlcm9za2VkYXN0aWNpdHkgdGVzdHMKYnBfdGVzdCA8LSBicHRlc3QobW9kZWwpCmJwX3Rlc3QKIyBSYW1zZXkgUmVzZXQgdGVzdApyZXNldF90ZXN0IDwtIHJlc2V0dGVzdChtb2RlbCxwb3dlcj0yLCB0eXBlPSJmaXR0ZWQiKSAjIGZ1cnRoZXIgbW9kaWZpY2F0aW9uIC0gc2VlIGhlbHAocmVzZXR0ZXN0KQpyZXNldF90ZXN0CiMgbXVsdGljb2xsaW5lYXJpdHkKdmlmKG1vZGVsKQpgYGAKCkJhc2VkIG9uIHRoZSB0ZXN0IHJlc3VsdHMsIHdlIGFzc3VtZSB0aGVyZSBpcyBwcm9ibGVtIHdpdGggdGhlIHJlc2lkdWFscyBub3JtYWxpdHkgYXMgd2VsbCBhcyB3aXRoIHRoZSBoZXRlcm9za2VkYXN0aWNpdHkuIFJhbXNleSBSZXNldCB0ZXN0IGluZGljYXRlcyB0aGUgcHJvYmxlbSB3aXRoIHRoZSBiYWQgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbW9kZWwuIFZJRiBhbHNvIGRvZXMgbm90IGluZGljYXRlIHNvbWUgc2lnbmlmZmljYW50IHByb2JsZW0gd2l0aCBtdWx0aWNvbGxpbmVhcml0eSwgVmFyaWFibGUgKkluY29tZS5jb21wb3NpdGlvbi5vZi5yZXNvdXJjZXMqIHNlZW1zIHRvIGJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggdGhlIG90aGVycyAoaG93ZXZlciBub3QgZXhjZWVkaW5nIHRoZSB0cmVzaCB2YWx1ZSAxMCkuIEFzIHdlIGhhdmUgYSBsb3Qgb2YgdGhlIG90aGVyIHZhcmlhYmxlcywgd2UgZXhjbHVkZSBpdC4gCgoKCgoKCkFmdGVyIGV4Y2x1c2lvbiBvZiB0aGUgSW5jb21lLmNvbXBvc2l0aW9uLm9mLnJlc291cmNlcyB2YXJpYWJsZSwgd2UgZ290IHRoZSBmb2xsb3dpbmcgcmVzdWx0czoKCgpgYGB7cn0KbW9kZWwyIDwtIGxtKExpZmUuZXhwZWN0YW5jeSB+IC4gLSBJbmNvbWUuY29tcG9zaXRpb24ub2YucmVzb3VyY2VzICxkYXRhPWFkb3QuMjAxNSkKc3VtbWFyeShtb2RlbDIpCmBgYApUaGUgc2lnbnMgb2YgdGhlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgY29lZmljaWVudHMgYXJlIGV4cGVjdGVkIGJ1dCBiZXNpZGVzIHRoZSBzaWduZSBvZiBQb2xpbywgd2hpY2ggaGFzIGEgcG9zaXRpdmUgc2lnbi4gSWYgY2hlY2tpbmcgdGhlIGZvbGxvd2luZyBmaWd1cmVzLCB3ZSBnb3QgaW1wcmVzc2lvbiBvbiB0aGUgc2lnbmlmZmljYW50IGltcHJvdmluZyBvZiB0aGUgbW9kZWwgc3RhdGlzdGljYWwgd3F1YWxpdHkKCmBgYHtyfQpwbG90KG1vZGVsMikKYGBgCgpPdXIgaW1wcmVzc2lvbnMgd2VyZSBjb3Jyb2JvcmF0ZWQgYXMgaW50cm9kdWNlZCBpbiB0aGUgZm9sbG93aW5nIHNldCBvZiB0ZXN0cy4gVGhlIG9ubHkgcmVtYWluaW5nIHByb2JsZW0gaXMgdGhlIHByb2JsZW0gb2YgaGV0ZXJvc2tlZGFzdGljaXR5LgoKYGBge3J9CiMgbm9ybWFsaXR5IHRlc3RzCnJlc2lkdWFscyA8LSByZXNpZHVhbHMobW9kZWwyKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpqYl90ZXN0CiMgb3V0bGllciB0ZXN0IChzZWUgcC12YWx1ZSBmb3IgQm9uZmVycm9uaSBjb3JyZWN0aW9uKQpvdXRsaWVyX3Rlc3QgPC0gb3V0bGllclRlc3QobW9kZWwyKQpvdXRsaWVyX3Rlc3RbM10KIyBoZXRlcm9za2VkYXN0aWNpdHkgdGVzdHMKYnBfdGVzdCA8LSBicHRlc3QobW9kZWwyKQpicF90ZXN0CiMgUmFtc2V5IFJlc2V0IHRlc3QKcmVzZXRfdGVzdCA8LSByZXNldHRlc3QobW9kZWwyLHBvd2VyPTIsIHR5cGU9ImZpdHRlZCIpICMgZnVydGhlciBtb2RpZmljYXRpb24gLSBzZWUgaGVscChyZXNldHRlc3QpCnJlc2V0X3Rlc3QKIyBtdWx0aWNvbGxpbmVhcml0eQp2aWYobW9kZWwyKQpgYGAKCkRpcGh0ZXJpYSBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZmaWNhbnQgYW5kIGlzIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggb3RoZXIgdmFyaWFibGVzIChzZWUgVklGKS4gTGV0IHVzIGV4Y2x1ZGUgaXQuCgpgYGB7cn0KbW9kZWwzIDwtIGxtKExpZmUuZXhwZWN0YW5jeSB+IC4gLSBJbmNvbWUuY29tcG9zaXRpb24ub2YucmVzb3VyY2VzIC0gRGlwaHRoZXJpYSxkYXRhPWFkb3QuMjAxNSkKc3VtbWFyeShtb2RlbDMpCmBgYApUaGUgb25seSBzdGF0aXN0aWNhbGx5IGluc2lnbmlmZmljYW50IHZhcmlhYmxlcyByZW1haW5lZCBHRFAgYW5kIEJNSS4gQWxsIHRoZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmZpY2FudCBjb2VmZmljaWVudHMgaGF2ZSBleHBlY3RlZCBzaWducywgYmVzaWRlcyBQb2xpby4KClRvIGdldCBzb21lIGltYWdpbmUgYWJvdXQgdGhlIHN0YXRpc3RpY2FsIHByb3BlcnRpZXMgb2YgdGhlIG1vZGVsIGFzIGEgd2hvbGUsIGxldCB1cyBsb29rIGF0IHRoZSBmb2xsb3dpbmcgZmlndXJlcy4gQWxsIHRoZSBncmFwaGljYWwgYW5hbHlzaXMgYXJlIHJhdGhlciBvcHRpbWlzdGljIGlmIHNwZWFraW5nIGFib3V0IHRoZSBzdGF0aXN0aWNhbCBxdWFsaXR5IG9mIHRoZSBtb2RlbC4gCgpgYGB7cn0KcGxvdChtb2RlbDMpCmBgYAoKYGBge3J9CiMgbm9ybWFsaXR5IHRlc3RzCnJlc2lkdWFscyA8LSByZXNpZHVhbHMobW9kZWwzKQpqYl90ZXN0IDwtIGphcnF1ZS5iZXJhLnRlc3QocmVzaWR1YWxzKQpqYl90ZXN0CiMgb3V0bGllciB0ZXN0IChzZWUgcC12YWx1ZSBmb3IgQm9uZmVycm9uaSBjb3JyZWN0aW9uKQpvdXRsaWVyX3Rlc3QgPC0gb3V0bGllclRlc3QobW9kZWwzKQpvdXRsaWVyX3Rlc3RbM10KIyBoZXRlcm9za2VkYXN0aWNpdHkgdGVzdHMKYnBfdGVzdCA8LSBicHRlc3QobW9kZWwzKQpicF90ZXN0CiMgUmFtc2V5IFJlc2V0IHRlc3QKcmVzZXRfdGVzdCA8LSByZXNldHRlc3QobW9kZWwzLHBvd2VyPTIsIHR5cGU9ImZpdHRlZCIpICMgZnVydGhlciBtb2RpZmljYXRpb24gLSBzZWUgaGVscChyZXNldHRlc3QpCnJlc2V0X3Rlc3QKIyBtdWx0aWNvbGxpbmVhcml0eQp2aWYobW9kZWwzKQpgYGAKCgpJZiBwdXR0aW5nIG91dCBHRFAgdmFyaWFibGUsIHRoZSByZXN1bHRzIHdvcnNlbmVkLiB0aGF0IGlzLCB3aHkgdGhlIG1vZGVsMyBpcyBjb25zaWRlcmVkIGFzIHRoZSBiZXN0IG9uZSBhbmQgd2UgYXJlIGdvaW5nIHRvIHNvbHZlIHRoZSBoZXRlcm9za2VkYXN0aWNpdHkgcHJvYmxlbSBieSB0aGUgaW50cm9kdWN0aW9uIG9mIHRoZSB0LXRlc3RzIHVzaW5nIHRoZSBXaGl0ZSBoZXRlcm9za2VkYXN0aWNpdHkgY29uc2lzdGVudCBtYXRyaXggYXMgZm9sbG93cwoKYGBge3J9CiMgTG9hZCBsaWJyYXJpZXMKbGlicmFyeSgibG10ZXN0IikKbGlicmFyeSgic2FuZHdpY2giKQoKIyBSb2J1c3QgdCB0ZXN0CmNvZWZ0ZXN0KG1vZGVsMywgdmNvdiA9IHZjb3ZIQyhtb2RlbDMsIHR5cGUgPSAiSEMwIikpCmBgYAoKIyNDb25jbHVzaW9uIyMKClZhcmlhYmxlcyAqQWR1bHQubW9ydGFsaXR5KiwgKnRoaW5uZXNzKiBhbmQgKkhJVi5BSURTKiBzaG9ydGVuIHRoZSBleHBlY3RlZCBsZW5ndGggb2YgbGlmZS4gT24gdGhlIG90aGVyIHNpZGUsICAqUG9saW8qIGFuZCAqSGVwYXRpdGlzLkIqIHNlZW0gdG8gZXh0ZW5kIHRoZSBsZW5ndGggb2YgbGlmZSwgd2hhdCBpcyB0aGUgZmFjdCwgd2UgY2FuIG5vdCBpbnRlcnByZXQuIFByb2JhYmx5IHRoZSBwcmV2ZW50IGhhcyBzb21lIGxvbmcgdGVybSBpbXBhY3RzLCBvciBzb21lIHZhY2NpbmF0aW9uIHRyZWF0bWVudCBjb21pbmcgYWZ0ZXIgdGhlIHBlcmlvZCBvZiBoaWdoZXIgYW1vdW50IG9mIHRoZXNlIGRpc2Vhc2VzIHdhcyBoZWxwaW5nPwoqU2Nob29saW5nKiwgKnBlcmNlbnRhZ2UuZXhwZW5kaXR1cmUqIGFuZCAqR0RQKiBhcmUgdGhlIGVjb25vbWljIGZhY3RvcnMgc2lnbmlmaWNhbnRseSBpbXByb3ZpbmcgdGhlIGV4cGVjdGVkIGxlbmd0aCBvZiBsaWZlLgoKCiAK