This week, we are going to use data from Gavin and Hofmann (2002), a study on organizational climate and attitudes published in Leadership Quarterly. Here, we have individuals soldiers nested within companies. This is the same dataset that Garson uses in Chapter 6, so you can recreate his analysis.

Load Some Packages to Help with the Analysis and Data Management:

library(tidyverse)
library(psych)
library(lme4)
library(haven)

Load and Explore the Data

schoolsmoke <- read_csv("schoolsmoke.csv")
Parsed with column specification:
cols(
  school = col_double(),
  thk = col_double(),
  prethk = col_double(),
  cc = col_double(),
  gprethk = col_double(),
  d = col_double(),
  d2 = col_double(),
  d3 = col_double(),
  d4 = col_double(),
  d5 = col_double()
)
schoolsmoke.clean <- schoolsmoke 

                   glimpse(schoolsmoke)
Rows: 1,600
Columns: 10
$ school  <dbl> 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,...
$ thk     <dbl> 1, 2, 3, 1, 2, 2, 3, 3, 2, 2, 4, 2, 2, 3, 4, 4, 1, 3, 4, 2, 1, 3, 1, 3, 2, 4, 1...
$ prethk  <dbl> 5, 3, 4, 0, 1, 3, 1, 2, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 2, 1, 3, 0, 1, 0, 1, 3, 2...
$ cc      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ gprethk <dbl> 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846,...
$ d       <dbl> 1, 1, 2, 3, 0, 2, 2, 2, 1, 2, 2, 4, 0, 2, 1, 0, 2, 1, 2, 4, 3, 3, 2, 1, 2, 2, 2...
$ d2      <dbl> 2, 4, 1, 2, 3, 1, 2, 1, 1, 2, 3, 3, 2, 2, 2, 2, 4, 1, 1, 1, 2, 2, 1, 2, 1, 3, 2...
$ d3      <dbl> 2, 0, 3, 2, 3, 1, 4, 2, 3, 3, 3, 0, 2, 1, 2, 2, 2, 3, 2, 1, 3, 2, 1, 4, 2, 2, 3...
$ d4      <dbl> 3, 1, 3, 2, 2, 2, 2, 3, 2, 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 0, 1, 1, 4, 1, 2...
$ d5      <dbl> 0, 3, 3, 2, 2, 0, 0, 4, 1, 0, 2, 1, 2, 4, 3, 4, 1, 1, 2, 0, 2, 1, 1, 3, 3, 2, 4...

Remember our old friend describe from the psych package a few weeks ago? This is a great way to get a detailed summary of all the variables in a dataset.

psych::describe(schoolsmoke, 
                fast = TRUE)

Calculing Scale Scores and Cronbach’s Alpha

This week, we are going to get a crash course in how to calculate reliability using Cronbach’s alpha. The alpha function in the psych package is a quick and easy way to calculate alpha:

peer_items <- schoolsmoke %>% 
  select(., d,
         d2,
         d3,
         d4,
         d5)

alpha(peer_items, check.keys=TRUE)
Some items were negatively correlated with total scale and were automatically reversed.
 This is indicated by a negative sign for the variable name.

Reliability analysis   
Call: alpha(x = peer_items, check.keys = TRUE)

 

 lower alpha upper     95% confidence boundaries
-0.01 0.06 0.14 

 Reliability if an item is dropped:

 Item statistics 

Non missing response frequency for each item
      0    1    2    3    4 miss
d  0.10 0.22 0.38 0.20 0.10    0
d2 0.11 0.18 0.43 0.18 0.09    0
d3 0.10 0.23 0.38 0.18 0.10    0
d4 0.10 0.20 0.40 0.20 0.10    0
d5 0.10 0.20 0.40 0.20 0.10    0

Now, we can create a new variable, peer, that is constructed by taking the mean of our 5 peer items.

my.keys.list <- list(peer = c("d","d2","d3", "d4","d5"))
                     
my.scales <- scoreItems(my.keys.list, schoolsmoke, impute = "none")
NaNs produced

Scale reliability estimates, etc. for Likert-type scales

print(my.scales, short = FALSE)
Call: scoreItems(keys = my.keys.list, items = schoolsmoke, impute = "none")

(Standardized) Alpha:
       peer
alpha -0.07

Standard errors of unstandardized Alpha:
       peer
ASE   0.041

Standardized Alpha of observed scales:
      peer
[1,] -0.07

Average item correlation:
            peer
average.r -0.013

Median item correlation:
  peer 
-0.011 

 Guttman 6* reliability: 
           peer
Lambda.6 -0.052

Signal/Noise based upon av.r : 
               peer
Signal/Noise -0.065

Scale intercorrelations corrected for attenuation 
 raw correlations below the diagonal, alpha on the diagonal 
 corrected correlations above the diagonal:

Note that these are the correlations of the complete scales based on the correlation matrix,
 not the observed scales based on the raw items.
      peer
peer -0.07

Item by scale correlations:
 corrected for item overlap and scale reliability
   peer
d   NaN
d2  NaN
d3  NaN
d4  NaN
d5  NaN

Non missing response frequency for each item
      0    1    2    3    4 miss
d  0.10 0.22 0.38 0.20 0.10    0
d2 0.11 0.18 0.43 0.18 0.09    0
d3 0.10 0.23 0.38 0.18 0.10    0
d4 0.10 0.20 0.40 0.20 0.10    0
d5 0.10 0.20 0.40 0.20 0.10    0

Save Scored Scales as New Variables

my.scores <- as_tibble(my.scales$scores)

Part 1: Calculating Scale Scores and Checking Reliability

Calculate a composite scale score using the 5 peer pressure items (peer1-peer5). Estimate Cronbach’s alpha for this scale and report and interpret the results. Should we incorporate this measure into our analysis going forward?

The calculated composite scale scores are given above. The estimated Cronbach’s Alpha is -0.07. Since the alpha scores is less than 0.70, then this measure should not be incorporated into our analysis going forward.

Attach New Variable to Old Data Set (schoolsmoke)

schoolsmoke.1 <- bind_cols(schoolsmoke, my.scores)

glimpse(schoolsmoke.1)
Rows: 1,600
Columns: 11
$ school  <dbl> 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193, 193,...
$ thk     <dbl> 1, 2, 3, 1, 2, 2, 3, 3, 2, 2, 4, 2, 2, 3, 4, 4, 1, 3, 4, 2, 1, 3, 1, 3, 2, 4, 1...
$ prethk  <dbl> 5, 3, 4, 0, 1, 3, 1, 2, 3, 2, 2, 2, 3, 3, 2, 3, 3, 3, 2, 1, 3, 0, 1, 0, 1, 3, 2...
$ cc      <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ gprethk <dbl> 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846, 2.153846,...
$ d       <dbl> 1, 1, 2, 3, 0, 2, 2, 2, 1, 2, 2, 4, 0, 2, 1, 0, 2, 1, 2, 4, 3, 3, 2, 1, 2, 2, 2...
$ d2      <dbl> 2, 4, 1, 2, 3, 1, 2, 1, 1, 2, 3, 3, 2, 2, 2, 2, 4, 1, 1, 1, 2, 2, 1, 2, 1, 3, 2...
$ d3      <dbl> 2, 0, 3, 2, 3, 1, 4, 2, 3, 3, 3, 0, 2, 1, 2, 2, 2, 3, 2, 1, 3, 2, 1, 4, 2, 2, 3...
$ d4      <dbl> 3, 1, 3, 2, 2, 2, 2, 3, 2, 4, 3, 1, 2, 2, 2, 2, 2, 2, 2, 1, 4, 0, 1, 1, 4, 1, 2...
$ d5      <dbl> 0, 3, 3, 2, 2, 0, 0, 4, 1, 0, 2, 1, 2, 4, 3, 4, 1, 1, 2, 0, 2, 1, 1, 3, 3, 2, 4...
$ peer    <dbl> 1.6, 1.8, 2.4, 2.2, 2.0, 1.2, 2.0, 2.4, 1.6, 2.2, 2.6, 1.8, 1.6, 2.2, 2.0, 2.0,...

Visualizing the Key Variables

Let’s take a look at some of the key variables for our analysis. We have three variables, all which are scale scores constructed just like we did for the example above.

hist(schoolsmoke.1$peer, 
     main = "Distribution of Peer Scores",
     sub = "N = 1600 Observations.",
     xlab = "Scaled Peer Score")

Running the Multilevel Models

Step One: The Null Model

models <- list()
model.0 <- lmer(thk ~ (1|school), REML = FALSE, data = schoolsmoke.1)
summary(model.0)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: thk ~ (1 | school)
   Data: schoolsmoke.1

     AIC      BIC   logLik deviance df.resid 
  4833.0   4849.1  -2413.5   4827.0     1597 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9039 -0.7734  0.0693  0.9240  1.7430 

Random effects:
 Groups   Name        Variance Std.Dev.
 school   (Intercept) 0.09438  0.3072  
 Residual             1.16219  1.0780  
Number of obs: 1600, groups:  school, 28

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)  2.60750    0.06538 25.83292   39.88   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Post-Estimation Task: Calculate ICC

Here’s a quick and easy way to get our friend the ICC!


null.ICC <- 0.09438/(0.09438 + 1.16219)
null.ICC
[1] 0.07510923

Using lmerTest to Evaluate Random Effects:

lmerTest::rand(model.0)
ANOVA-like table for random-effects: Single term deletions

Model:
thk ~ (1 | school)
             npar  logLik    AIC   LRT Df Pr(>Chisq)    
<none>          3 -2413.5 4833.0                        
(1 | school)    2 -2445.6 4895.2 64.16  1  1.147e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  1. Treating “thk” as the DV, and “school” as the level-2 clustering variable (we will ignore classroom clustering for now- stay tuned!), estimate a null model. Compute, report, and interpret the ICC, as well as the likelihood ratio test at the bottom of the output. Is it worth conducting MLM on these data?

The ICC = 0.07510923. This ICC greater than 0.05, so we should move forward with MLM. The likelihood ratio test shows that it is important that we included the intercept into our model. It is worth conducting MLM on these data.

  1. Interpret the estimated fixed effect of the intercept in the null model. What is this number measuring - what does it mean?

The estimated fixed effect of the intercept in the null model is 2.60750. This number is the average of the peer score. The significant test shows that it is significant.

Step Two: Adding a Level One Predictor, prethk

model.1 <- lmer(thk ~ prethk + (1|school), REML = FALSE, data = schoolsmoke.1)
summary(model.1)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: thk ~ prethk + (1 | school)
   Data: schoolsmoke.1

     AIC      BIC   logLik deviance df.resid 
  4733.5   4755.0  -2362.7   4725.5     1596 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.12273 -0.82727  0.03082  0.83756  2.15165 

Random effects:
 Groups   Name        Variance Std.Dev.
 school   (Intercept) 0.07519  0.2742  
 Residual             1.09321  1.0456  
Number of obs: 1600, groups:  school, 28

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept) 2.152e+00  7.414e-02 6.142e+01   29.02   <2e-16 ***
prethk      2.175e-01  2.122e-02 1.599e+03   10.25   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr)
prethk -0.598
  1. Now, add “prethk” as a level one covariate. Interpret the coefficient estimate. Report what happens to the level-1 and level-2 variances of our random terms. Do they go up or down, and by how much? What does this mean?

The coefficient estimate for prethk is 0.2175. The variances of our random terms decrease from 0.09438 to 0.07519 for school. The residual decreased from 1.16219 to 1.09321. This implies that some of the variation is explained by prethk, which is shown to be signficant. The AIC and BIC both decreased.

Step Three: Adding an Additional Level One Predictor, cc

model.2 <- lmer(thk ~ prethk + cc + (1|school), REML = FALSE, data = schoolsmoke.1)
summary(model.2)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: thk ~ prethk + cc + (1 | school)
   Data: schoolsmoke.1

     AIC      BIC   logLik deviance df.resid 
  4721.3   4748.2  -2355.6   4711.3     1595 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.20705 -0.80300  0.04029  0.80179  2.15135 

Random effects:
 Groups   Name        Variance Std.Dev.
 school   (Intercept) 0.03333  0.1826  
 Residual             1.09412  1.0460  
Number of obs: 1600, groups:  school, 28

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept) 1.945e+00  7.699e-02 4.993e+01  25.265  < 2e-16 ***
prethk      2.226e-01  2.113e-02 1.598e+03  10.535  < 2e-16 ***
cc          3.921e-01  8.944e-02 2.346e+01   4.385 0.000208 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
       (Intr) prethk
prethk -0.585       
cc     -0.580  0.023

Adding a Level Two Predictor

model.3 <- lmer(thk ~ prethk + gprethk + cc + (1|school), REML = FALSE, data = schoolsmoke.1)
summary(model.3)
Linear mixed model fit by maximum likelihood . t-tests use Satterthwaite's method [lmerModLmerTest]
Formula: thk ~ prethk + gprethk + cc + (1 | school)
   Data: schoolsmoke.1

     AIC      BIC   logLik deviance df.resid 
  4712.6   4744.9  -2350.3   4700.6     1594 

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.23332 -0.79567  0.02374  0.79254  2.16704 

Random effects:
 Groups   Name        Variance Std.Dev.
 school   (Intercept) 0.01734  0.1317  
 Residual             1.09334  1.0456  
Number of obs: 1600, groups:  school, 28

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept) 1.076e+00  2.548e-01 3.024e+01   4.224 0.000203 ***
prethk      2.126e-01  2.138e-02 1.571e+03   9.944  < 2e-16 ***
gprethk     4.183e-01  1.193e-01 3.387e+01   3.507 0.001301 ** 
cc          4.308e-01  7.554e-02 2.330e+01   5.702 7.94e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
        (Intr) prethk gprthk
prethk   0.000              
gprethk -0.963 -0.179       
cc      -0.288  0.000  0.148
  1. Finally, add “cc” and “gprethk” as level-2 predictors to your model. Interpret the results. Explain how the estimates for prethk and gprethk are related to one another, and also explain what this suggests about the impact of school context on an individual student’s knowledge. Report what happens to the level-1 and level-2 variances of our random terms. Do they go up or down, and by how much?

gprethk is considering the group level; whereas prethk is the individual level. The gprethk is significant, which implies an impact of school context on an individual student’s knowledge. The level 1 and level 2 variances go down slightly, which implies that the variation is being explained by the additional predictors.

LS0tDQp0aXRsZTogJ01vZHVsZTogQ29uZGl0aW9uYWwgUmFuZG9tIEludGVyY2VwdCBNb2RlbHMnDQphdXRob3I6ICJKYWtlIFJleW5vbGRzIC0gU2VwdGVtYmVyIDIxLCAyMDIwIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KVGhpcyB3ZWVrLCB3ZSBhcmUgZ29pbmcgdG8gdXNlIGRhdGEgZnJvbSBHYXZpbiBhbmQgSG9mbWFubiAoMjAwMiksIGEgc3R1ZHkgb24gb3JnYW5pemF0aW9uYWwgY2xpbWF0ZSBhbmQgYXR0aXR1ZGVzIHB1Ymxpc2hlZCBpbiBMZWFkZXJzaGlwIFF1YXJ0ZXJseS4gSGVyZSwgd2UgaGF2ZSBpbmRpdmlkdWFscyBzb2xkaWVycyBuZXN0ZWQgd2l0aGluIGNvbXBhbmllcy4gVGhpcyBpcyB0aGUgc2FtZSBkYXRhc2V0IHRoYXQgR2Fyc29uIHVzZXMgaW4gQ2hhcHRlciA2LCBzbyB5b3UgY2FuIHJlY3JlYXRlIGhpcyBhbmFseXNpcy4NCg0KIyBMb2FkIFNvbWUgUGFja2FnZXMgdG8gSGVscCB3aXRoIHRoZSBBbmFseXNpcyBhbmQgRGF0YSBNYW5hZ2VtZW50Og0KYGBge3IsIHByaW50PUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBzeWNoKQ0KbGlicmFyeShsbWU0KQ0KbGlicmFyeShoYXZlbikNCg0KYGBgDQoNCiMgTG9hZCBhbmQgRXhwbG9yZSB0aGUgRGF0YQ0KYGBge3J9DQpzY2hvb2xzbW9rZSA8LSByZWFkX2Nzdigic2Nob29sc21va2UuY3N2IikNCg0Kc2Nob29sc21va2UuY2xlYW4gPC0gc2Nob29sc21va2UgDQoNCiAgICAgICAgICAgICAgICAgICBnbGltcHNlKHNjaG9vbHNtb2tlKQ0KDQpgYGANCg0KUmVtZW1iZXIgb3VyIG9sZCBmcmllbmQgYGRlc2NyaWJlYCBmcm9tIHRoZSBgcHN5Y2hgIHBhY2thZ2UgYSBmZXcgd2Vla3MgYWdvPyBUaGlzIGlzIGEgZ3JlYXQgd2F5IHRvIGdldCBhIGRldGFpbGVkIHN1bW1hcnkgb2YgYWxsIHRoZSB2YXJpYWJsZXMgaW4gYSBkYXRhc2V0Lg0KDQpgYGB7cn0NCnBzeWNoOjpkZXNjcmliZShzY2hvb2xzbW9rZSwgDQogICAgICAgICAgICAgICAgZmFzdCA9IFRSVUUpDQpgYGANCg0KIyBDYWxjdWxpbmcgU2NhbGUgU2NvcmVzIGFuZCBDcm9uYmFjaCdzIEFscGhhDQoNClRoaXMgd2Vlaywgd2UgYXJlIGdvaW5nIHRvIGdldCBhIGNyYXNoIGNvdXJzZSBpbiBob3cgdG8gY2FsY3VsYXRlIHJlbGlhYmlsaXR5IHVzaW5nIENyb25iYWNoJ3MgYWxwaGEuIFRoZSBgYWxwaGFgIGZ1bmN0aW9uIGluIHRoZSBgcHN5Y2hgIHBhY2thZ2UgIGlzIGEgcXVpY2sgYW5kIGVhc3kgd2F5IHRvIGNhbGN1bGF0ZSBhbHBoYToNCg0KYGBge3J9DQpwZWVyX2l0ZW1zIDwtIHNjaG9vbHNtb2tlICU+JSANCiAgc2VsZWN0KC4sIGQsDQogICAgICAgICBkMiwNCiAgICAgICAgIGQzLA0KICAgICAgICAgZDQsDQogICAgICAgICBkNSkNCg0KYWxwaGEocGVlcl9pdGVtcywgY2hlY2sua2V5cz1UUlVFKQ0KYGBgDQoNCk5vdywgd2UgY2FuIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSwgYHBlZXJgLCB0aGF0IGlzIGNvbnN0cnVjdGVkIGJ5IHRha2luZyB0aGUgbWVhbiBvZiBvdXIgNSBgcGVlcmAgaXRlbXMuIA0KDQpgYGB7cn0NCm15LmtleXMubGlzdCA8LSBsaXN0KHBlZXIgPSBjKCJkIiwiZDIiLCJkMyIsICJkNCIsImQ1IikpDQogICAgICAgICAgICAgICAgICAgICANCm15LnNjYWxlcyA8LSBzY29yZUl0ZW1zKG15LmtleXMubGlzdCwgc2Nob29sc21va2UsIGltcHV0ZSA9ICJub25lIikNCmBgYA0KDQojIFNjYWxlIHJlbGlhYmlsaXR5IGVzdGltYXRlcywgZXRjLiBmb3IgTGlrZXJ0LXR5cGUgc2NhbGVzDQpgYGB7cn0NCnByaW50KG15LnNjYWxlcywgc2hvcnQgPSBGQUxTRSkNCmBgYA0KDQojIFNhdmUgU2NvcmVkIFNjYWxlcyBhcyBOZXcgVmFyaWFibGVzDQpgYGB7cn0NCm15LnNjb3JlcyA8LSBhc190aWJibGUobXkuc2NhbGVzJHNjb3JlcykNCmBgYA0KDQoNClBhcnQgMTogQ2FsY3VsYXRpbmcgU2NhbGUgU2NvcmVzIGFuZCBDaGVja2luZyBSZWxpYWJpbGl0eQ0KDQpDYWxjdWxhdGUgYSBjb21wb3NpdGUgc2NhbGUgc2NvcmUgdXNpbmcgdGhlIDUgcGVlciBwcmVzc3VyZSBpdGVtcyAocGVlcjEtcGVlcjUpLiBFc3RpbWF0ZSBDcm9uYmFjaOKAmXMgYWxwaGEgZm9yIHRoaXMgc2NhbGUgYW5kIHJlcG9ydCBhbmQgaW50ZXJwcmV0IHRoZSByZXN1bHRzLiBTaG91bGQgd2UgaW5jb3Jwb3JhdGUgdGhpcyBtZWFzdXJlIGludG8gb3VyIGFuYWx5c2lzIGdvaW5nIGZvcndhcmQ/DQoNCg0KVGhlIGNhbGN1bGF0ZWQgY29tcG9zaXRlIHNjYWxlIHNjb3JlcyBhcmUgZ2l2ZW4gYWJvdmUuIFRoZSBlc3RpbWF0ZWQgQ3JvbmJhY2gncyBBbHBoYSBpcyAtMC4wNy4gU2luY2UgdGhlIGFscGhhIHNjb3JlcyBpcyBsZXNzIHRoYW4gMC43MCwgdGhlbiB0aGlzIG1lYXN1cmUgc2hvdWxkIG5vdCBiZSBpbmNvcnBvcmF0ZWQgaW50byBvdXIgYW5hbHlzaXMgZ29pbmcgZm9yd2FyZC4gDQoNCg0KDQojIEF0dGFjaCBOZXcgVmFyaWFibGUgdG8gT2xkIERhdGEgU2V0IChzY2hvb2xzbW9rZSkNCmBgYHtyfQ0Kc2Nob29sc21va2UuMSA8LSBiaW5kX2NvbHMoc2Nob29sc21va2UsIG15LnNjb3JlcykNCg0KZ2xpbXBzZShzY2hvb2xzbW9rZS4xKQ0KYGBgDQoNCiMgVmlzdWFsaXppbmcgdGhlIEtleSBWYXJpYWJsZXMNCkxldCdzIHRha2UgYSBsb29rIGF0IHNvbWUgb2YgdGhlIGtleSB2YXJpYWJsZXMgZm9yIG91ciBhbmFseXNpcy4gV2UgaGF2ZSB0aHJlZSB2YXJpYWJsZXMsIGFsbCB3aGljaCBhcmUgc2NhbGUgc2NvcmVzIGNvbnN0cnVjdGVkIGp1c3QgbGlrZSB3ZSBkaWQgZm9yIHRoZSBleGFtcGxlIGFib3ZlLg0KDQpgYGB7cn0NCmhpc3Qoc2Nob29sc21va2UuMSRwZWVyLCANCiAgICAgbWFpbiA9ICJEaXN0cmlidXRpb24gb2YgUGVlciBTY29yZXMiLA0KICAgICBzdWIgPSAiTiA9IDE2MDAgT2JzZXJ2YXRpb25zLiIsDQogICAgIHhsYWIgPSAiU2NhbGVkIFBlZXIgU2NvcmUiKQ0KYGBgDQoNCiMgUnVubmluZyB0aGUgTXVsdGlsZXZlbCBNb2RlbHMNCg0KIyMgU3RlcCBPbmU6IFRoZSBOdWxsIE1vZGVsDQoNCmBgYHtyfQ0KbW9kZWxzIDwtIGxpc3QoKQ0KbW9kZWwuMCA8LSBsbWVyKHRoayB+ICgxfHNjaG9vbCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHNjaG9vbHNtb2tlLjEpDQpzdW1tYXJ5KG1vZGVsLjApDQpgYGANCg0KIyMjIFBvc3QtRXN0aW1hdGlvbiBUYXNrOiBDYWxjdWxhdGUgSUNDDQoNCkhlcmUncyBhIHF1aWNrIGFuZCBlYXN5IHdheSB0byBnZXQgb3VyIGZyaWVuZCB0aGUgSUNDIQ0KYGBge3J9DQoNCm51bGwuSUNDIDwtIDAuMDk0MzgvKDAuMDk0MzggKyAxLjE2MjE5KQ0KbnVsbC5JQ0MNCg0KYGBgDQoNCiMjIyBVc2luZyBgbG1lclRlc3RgIHRvIEV2YWx1YXRlIFJhbmRvbSBFZmZlY3RzOg0KYGBge3J9DQpsbWVyVGVzdDo6cmFuZChtb2RlbC4wKQ0KYGBgDQoNCjIuIFRyZWF0aW5nIOKAnHRoa+KAnSBhcyB0aGUgRFYsIGFuZCDigJxzY2hvb2zigJ0gYXMgdGhlIGxldmVsLTIgY2x1c3RlcmluZyB2YXJpYWJsZSAod2Ugd2lsbCBpZ25vcmUgY2xhc3Nyb29tIGNsdXN0ZXJpbmcgZm9yIG5vdy0gc3RheSB0dW5lZCEpLCBlc3RpbWF0ZSBhIG51bGwgbW9kZWwuIENvbXB1dGUsIHJlcG9ydCwgYW5kIGludGVycHJldCB0aGUgSUNDLCBhcyB3ZWxsIGFzIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgYXQgdGhlIGJvdHRvbSBvZiB0aGUgb3V0cHV0LiAgSXMgaXQgd29ydGggY29uZHVjdGluZyBNTE0gb24gdGhlc2UgZGF0YT8NCg0KVGhlIElDQyA9IDAuMDc1MTA5MjMuIFRoaXMgSUNDIGdyZWF0ZXIgdGhhbiAwLjA1LCBzbyB3ZSBzaG91bGQgbW92ZSBmb3J3YXJkIHdpdGggTUxNLiBUaGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IHNob3dzIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRoYXQgd2UgaW5jbHVkZWQgdGhlIGludGVyY2VwdCBpbnRvIG91ciBtb2RlbC4gSXQgaXMgd29ydGggY29uZHVjdGluZyBNTE0gb24gdGhlc2UgZGF0YS4gDQoNCg0KDQozLiBJbnRlcnByZXQgdGhlIGVzdGltYXRlZCBmaXhlZCBlZmZlY3Qgb2YgdGhlIGludGVyY2VwdCBpbiB0aGUgbnVsbCBtb2RlbC4gV2hhdCBpcyB0aGlzIG51bWJlciBtZWFzdXJpbmcgLSB3aGF0IGRvZXMgaXQgbWVhbj8gDQoNClRoZSBlc3RpbWF0ZWQgZml4ZWQgZWZmZWN0IG9mIHRoZSBpbnRlcmNlcHQgaW4gdGhlIG51bGwgbW9kZWwgaXMgMi42MDc1MC4gVGhpcyBudW1iZXIgaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIHBlZXIgc2NvcmUuIFRoZSBzaWduaWZpY2FudCB0ZXN0IHNob3dzIHRoYXQgaXQgaXMgc2lnbmlmaWNhbnQuIA0KDQoNCg0KIyMgU3RlcCBUd286IEFkZGluZyBhIExldmVsIE9uZSBQcmVkaWN0b3IsIGBwcmV0aGtgDQoNCmBgYHtyfQ0KbW9kZWwuMSA8LSBsbWVyKHRoayB+IHByZXRoayArICgxfHNjaG9vbCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHNjaG9vbHNtb2tlLjEpDQpzdW1tYXJ5KG1vZGVsLjEpDQpgYGANCjQuICBOb3csIGFkZCDigJxwcmV0aGvigJ0gYXMgYSBsZXZlbCBvbmUgY292YXJpYXRlLiBJbnRlcnByZXQgdGhlIGNvZWZmaWNpZW50IGVzdGltYXRlLiBSZXBvcnQgd2hhdCBoYXBwZW5zIHRvIHRoZSBsZXZlbC0xIGFuZCBsZXZlbC0yIHZhcmlhbmNlcyBvZiBvdXIgcmFuZG9tIHRlcm1zLiBEbyB0aGV5IGdvIHVwIG9yIGRvd24sIGFuZCBieSBob3cgbXVjaD8gV2hhdCBkb2VzIHRoaXMgbWVhbj8NCiANCiBUaGUgY29lZmZpY2llbnQgZXN0aW1hdGUgZm9yIHByZXRoayBpcyAwLjIxNzUuIFRoZSB2YXJpYW5jZXMgb2Ygb3VyIHJhbmRvbSB0ZXJtcyBkZWNyZWFzZSBmcm9tIDAuMDk0MzggdG8gMC4wNzUxOSBmb3Igc2Nob29sLiBUaGUgcmVzaWR1YWwgZGVjcmVhc2VkIGZyb20gMS4xNjIxOSB0byAxLjA5MzIxLiBUaGlzIGltcGxpZXMgdGhhdCBzb21lIG9mIHRoZSB2YXJpYXRpb24gaXMgZXhwbGFpbmVkIGJ5IHByZXRoaywgd2hpY2ggaXMgc2hvd24gdG8gYmUgc2lnbmZpY2FudC4gVGhlIEFJQyBhbmQgQklDIGJvdGggZGVjcmVhc2VkLiANCg0KDQojIyBTdGVwIFRocmVlOiBBZGRpbmcgYW4gQWRkaXRpb25hbCBMZXZlbCBPbmUgUHJlZGljdG9yLCBgY2NgDQpgYGB7cn0NCm1vZGVsLjIgPC0gbG1lcih0aGsgfiBwcmV0aGsgKyBjYyArICgxfHNjaG9vbCksIFJFTUwgPSBGQUxTRSwgZGF0YSA9IHNjaG9vbHNtb2tlLjEpDQpzdW1tYXJ5KG1vZGVsLjIpDQpgYGANCg0KIyMgQWRkaW5nIGEgTGV2ZWwgVHdvIFByZWRpY3Rvcg0KYGBge3J9DQptb2RlbC4zIDwtIGxtZXIodGhrIH4gcHJldGhrICsgZ3ByZXRoayArIGNjICsgKDF8c2Nob29sKSwgUkVNTCA9IEZBTFNFLCBkYXRhID0gc2Nob29sc21va2UuMSkNCnN1bW1hcnkobW9kZWwuMykNCmBgYA0KDQoNCjUuIEZpbmFsbHksIGFkZCDigJxjY+KAnSBhbmQg4oCcZ3ByZXRoa+KAnSBhcyBsZXZlbC0yIHByZWRpY3RvcnMgdG8geW91ciBtb2RlbC4gSW50ZXJwcmV0IHRoZSByZXN1bHRzLiBFeHBsYWluIGhvdyB0aGUgZXN0aW1hdGVzIGZvciBwcmV0aGsgYW5kIGdwcmV0aGsgYXJlIHJlbGF0ZWQgdG8gb25lIGFub3RoZXIsIGFuZCBhbHNvIGV4cGxhaW4gd2hhdCB0aGlzIHN1Z2dlc3RzIGFib3V0IHRoZSBpbXBhY3Qgb2Ygc2Nob29sIGNvbnRleHQgb24gYW4gaW5kaXZpZHVhbCBzdHVkZW504oCZcyBrbm93bGVkZ2UuIFJlcG9ydCB3aGF0IGhhcHBlbnMgdG8gdGhlIGxldmVsLTEgYW5kIGxldmVsLTIgdmFyaWFuY2VzIG9mIG91ciByYW5kb20gdGVybXMuIERvIHRoZXkgZ28gdXAgb3IgZG93biwgYW5kIGJ5IGhvdyBtdWNoPyANCg0KZ3ByZXRoayBpcyBjb25zaWRlcmluZyB0aGUgZ3JvdXAgbGV2ZWw7IHdoZXJlYXMgcHJldGhrIGlzIHRoZSBpbmRpdmlkdWFsIGxldmVsLiBUaGUgZ3ByZXRoayBpcyBzaWduaWZpY2FudCwgd2hpY2ggaW1wbGllcyBhbiBpbXBhY3Qgb2Ygc2Nob29sIGNvbnRleHQgb24gYW4gaW5kaXZpZHVhbCBzdHVkZW50J3Mga25vd2xlZGdlLiBUaGUgbGV2ZWwgMSBhbmQgbGV2ZWwgMiB2YXJpYW5jZXMgZ28gZG93biBzbGlnaHRseSwgd2hpY2ggaW1wbGllcyB0aGF0IHRoZSB2YXJpYXRpb24gaXMgYmVpbmcgZXhwbGFpbmVkIGJ5IHRoZSBhZGRpdGlvbmFsIHByZWRpY3RvcnMuIA0KDQoNCg==