In this exercise I use most of the variables considered by Massoglia et al. (2014), get estimates of the effect of incarceration on mortality, and examine an initial imputation model.

The variables I considered were:

I considered records since 1980 and respondents 18 years old or more, that is, a sample of 12625. During that period 661 people died. The median age of death was 41.

Just to get an idea of the missing data:

countmis(org)
clincome_adj          job      healthw      cdeltot      married      rprison        cpedu        cedui 
       0.214        0.066        0.059        0.058        0.058        0.041        0.037        0.000 

The highest proportion of missing cases is income. I defined imputation multivel models, where I use both time invariant and variant variables, age and year. Just to provide an example, the income imputation model is:

\[income = \alpha + year + age + edu + parents\_edu + prison + married \\ + health + delinquency + job + dropout + death + \delta_r + \epsilon_i \]

Death and dropout are time-invariant variables. One of the most important predictor of income missigness is incarceration! For this exercise, I generated 10 imputations. Final versions of this exercise should use more iterations and imputations (e.g., 30 iterations, 60 imputations). Anyways mixing doesn’t look bad.

I explored differences by gender:

# explore differences by gender
x <- org[, .(male = max(male, na.rm = TRUE), 
              prison = max(rprison, na.rm = TRUE), 
              death = max(died, na.rm = TRUE), age = max(agei, na.rm = TRUE)), id]
# these numbers are different because of age >= 18 and year >= 1980
table(x[, .(prison, death, male)])
, , male = 0

      death
prison    0    1
     0 5936  239
     1   61   17

, , male = 1

      death
prison    0    1
     0 5386  341
     1  581   64
# odds ratio male
a <- table(x[male == 1, .(prison, death)])
(a[2,2]*a[1,1]) / (a[2,1]*a[1,2])
[1] 1.739866
# odd ratios female
b <- table(x[male == 0, .(prison, death)])
(b[2,2]*b[1,1]) / (b[2,1]*b[1,2]) # huge
[1] 6.921737
# time between first incarceration event and death by gender!
x <- org[, .(id ,rprison, died, male, agei, stop)]
a <- x[rprison == 1, .(prison = min(stop), age = min(agei)), .(id, male)]
b <- x[died == 1, .(death = min(stop)), .(id, male)]
#anyDuplicated(b)
#anyDuplicated(a)
setkey(a, id, male)
setkey(b, id, male)
c <- b[a]
# only 81 cases of people who have been incarcerated and died in the sample
length(c[!is.na(death), death - prison])
[1] 81
mean(c[!is.na(death) & male == 1, age]) # men are younger
[1] 26.6875
mean(c[!is.na(death) & male == 0, age]) # women are older
[1] 29.23529
# mean and median of year between first incarceration event and death
# men
mean(c[!is.na(death) & male == 1, death - prison])
[1] 14.15625
median(c[!is.na(death) & male == 1, death - prison])
[1] 13.5
hist(c[!is.na(death) & male == 1, death - prison], main = "Men: Distribution time between incarceration and death")

# women
mean(c[!is.na(death) & male == 0, death - prison])
[1] 13.29412
median(c[!is.na(death) & male == 0, death - prison])
[1] 12
hist(c[!is.na(death) & male == 0, death - prison], main = "Women: Distribution time between incarceration and death")

Let’s explore the imputations:

Then, I examine the distribution of the imputed variables by age and year. Here I show only income and prison, all the rest of imputed variables look right. Gray lines represent imputed datasets, the red line the observed data.

Income imputations are far below the observed values, I guess mainly to the effect of prison on income missingness. Probably, it would be a good idea to use a lag version of income to improve the imputation.

Incarceartion looks fine. After the 2004, NLYS recorded non-response due to incarceration, that is why there are no missing records during those years.

Pooled Models

A simple model removing time-varying adjustments (different from the naive model, but similar to MSM):

Multiple imputation results:
      MIcombine.default(models)
                               results         se      (lower       upper) missInfo
prison                      0.20705581 0.13817298 -0.06376533  0.477876963      1 %
male                        0.38692541 0.08416393  0.22196705  0.551883776      0 %
magef19                    -0.15800652 0.12487920 -0.40276526  0.086752223      0 %
magef20                     0.17021554 0.12056974 -0.06609681  0.406527898      0 %
magef21                     0.06794871 0.13167489 -0.19012934  0.326026767      0 %
magef22                     0.40046214 0.11793874  0.16930644  0.631617850      0 %
magef23                     0.52363598 0.21263395  0.10688108  0.940390883      0 %
raceblack                   0.41827848 0.12071222  0.18168590  0.654871061      1 %
racenon-hispanic/non-black  0.20973827 0.12495792 -0.03518295  0.454659488      2 %
cedui                      -0.07346525 0.01896565 -0.11064084 -0.036289667      3 %
cpedu                      -0.02032035 0.01438131 -0.04853588  0.007895176      9 %
clincome_adj               -0.10112303 0.01398543 -0.12855172 -0.073694337      7 %
cdeltot                     0.13429863 0.06417320  0.00845311  0.260144156      6 %

Adding time-varying covariates.

Multiple imputation results:
      MIcombine.default(models)
                               results         se      (lower       upper) missInfo
prison                      0.05844335 0.13637113 -0.20884505  0.325731758      1 %
male                        0.52322639 0.08484666  0.35692992  0.689522855      0 %
magef19                    -0.18304748 0.12497753 -0.42799893  0.061903976      0 %
magef20                     0.14054481 0.12068848 -0.09600026  0.377089885      0 %
magef21                     0.06108670 0.13177843 -0.19719429  0.319367686      0 %
magef22                     0.39196654 0.11812839  0.16043914  0.623493938      0 %
magef23                     0.52082845 0.21309940  0.10316129  0.938495610      0 %
raceblack                   0.25216301 0.12067392  0.01564484  0.488681169      1 %
racenon-hispanic/non-black  0.25761083 0.12464618  0.01330041  0.501921249      2 %
cedui                      -0.03627544 0.01919190 -0.07389332  0.001342446      2 %
cpedu                      -0.02003647 0.01432104 -0.04813576  0.008062817      9 %
clincome_adj               -0.01975688 0.01642951 -0.05199882  0.012485049     10 %
healthw                     0.83907566 0.10570916  0.63188895  1.046262377      0 %
job                        -0.76537225 0.10104180 -0.96342877 -0.567315725      3 %
married                    -0.83233637 0.09413722 -1.01684304 -0.647829702      1 %
cdeltot                     0.08505121 0.06561958 -0.04366846  0.213770884      8 %

No effect of prison on mortality.

Because of time-varying confounding I used the MSM adjustment. This seems to correct the adjustment of mediators. The effects are higher but less precise and non-statistically significant. Similarly to Massoglia et al, the interaction between prison and gender suggests a huge positive effect for women. The imputations I am using are not completly suitable, the imputation model should include the interaction by gender. The coefficient for women is too big to be credible (hazard ratio of about 5, kind of similar to the odds ratios computed above).

Multiple imputation results:
      MIcombine.default(modelsMSM)
                                results         se      (lower       upper) missInfo
prison                      0.281064758 0.19620595 -0.10471927  0.666848785     16 %
magef19                    -0.194962483 0.13907104 -0.46766175  0.077736781      6 %
magef20                    -0.031991808 0.15602230 -0.33789005  0.273906438      5 %
magef21                     0.070066585 0.14210109 -0.20847563  0.348608804      3 %
magef22                     0.365676881 0.12695691  0.11683424  0.614519521      2 %
magef23                     0.493597994 0.22522961  0.05213245  0.935063539      2 %
male                        0.469803620 0.09460129  0.28436504  0.655242200      3 %
raceblack                   0.236583066 0.13763483 -0.03329556  0.506461692      6 %
racenon-hispanic/non-black  0.304874084 0.13600363  0.03825046  0.571497703      4 %
cedui                      -0.004109759 0.02197381 -0.04718881  0.038969294      4 %
cpedu                      -0.028272743 0.01627431 -0.06020967  0.003664184     10 %
clincome_adj               -0.014768386 0.01983132 -0.05377729  0.024240514     17 %
healthw                     0.791785692 0.10899082  0.57813693  1.005434451      3 %
job                        -0.727400945 0.10834780 -0.93979810 -0.515003792      4 %
married                    -0.856636235 0.10068798 -1.05398434 -0.659288128      1 %
cdeltot                     0.082107232 0.09021496 -0.09655979  0.260774252     29 %
Multiple imputation results:
      MIcombine.default(modelsMSM)
                                results         se      (lower       upper) missInfo
prison                      1.634382867 0.29486277  1.05591949  2.212846246      8 %
male                        0.542145740 0.09349000  0.35887475  0.725416725      4 %
magef19                    -0.216069895 0.13893477 -0.48852445  0.056384660      6 %
magef20                    -0.050113070 0.15652347 -0.35697616  0.256750023      5 %
magef21                     0.065940045 0.14231506 -0.21302992  0.344910010      3 %
magef22                     0.363537763 0.12661104  0.11537048  0.611705043      2 %
magef23                     0.502423222 0.22282963  0.06566337  0.939183076      2 %
raceblack                   0.253268805 0.13667027 -0.01474066  0.521278274      6 %
racenon-hispanic/non-black  0.311047923 0.13601157  0.04439313  0.577702713      5 %
cedui                      -0.003172991 0.02201871 -0.04634187  0.039995890      5 %
cpedu                      -0.028772638 0.01615455 -0.06047258  0.002927308     10 %
clincome_adj               -0.016393007 0.01983752 -0.05542020  0.022634183     17 %
healthw                     0.785154809 0.10936140  0.57077585  0.999533771      3 %
job                        -0.729676066 0.10866812 -0.94269926 -0.516652871      4 %
married                    -0.855741824 0.10053569 -1.05279202 -0.658691624      1 %
cdeltot                     0.087528616 0.08868364 -0.08810911  0.263166342     29 %
prison:male                -1.553770291 0.36463179 -2.27040549 -0.837135093     15 %
LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBFZmZlY3Qgb24gTW9ydGFsaXR5LCBOTFlTICsgSW1wdXRhdGlvbiBNb2RlbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSW4gdGhpcyBleGVyY2lzZSBJIHVzZSBtb3N0IG9mIHRoZSB2YXJpYWJsZXMgY29uc2lkZXJlZCBieSBNYXNzb2dsaWEgZXQgYWwuICgyMDE0KSwgZ2V0IGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGluY2FyY2VyYXRpb24gb24gbW9ydGFsaXR5LCBhbmQgZXhhbWluZSBhbiBpbml0aWFsIGltcHV0YXRpb24gbW9kZWwuIAoKVGhlIHZhcmlhYmxlcyBJIGNvbnNpZGVyZWQgd2VyZTogCgotIEdlbmRlciAoSSkKLSBBZ2UgKEkpCi0gUmFjZSAoSSkKLSBJbmNvbWUgKFYpCi0gRWR1Y2F0aW9uIChWKQotIFBhcmVudHMnIGVkdWNhdGlvbiAoSSkKLSBEZWxpbnF1ZW5jeSAoMTk4MCkgKEkpCi0gV29ya2luZyAoVikKLSBIZWFsdGggaXNzdWVzIChyZWxhdGVkIHRvIHdvcmspIChWKQotIEluY2FyY2VyYXRpb24gKFYpCi0gTWFycmllZCAoVikKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0Kcm0obGlzdD1scyhhbGw9VFJVRSkpCgpsaWJyYXJ5KHNkYXphcikKbGlicmFyeShsYXR0aWNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc3Vydml2YWwpCmxpYnJhcnkoaXB3KQpsaWJyYXJ5KHRleHJlZykKCnNldHdkKCIvVXNlcnMvc2RhemEvR29vZ2xlIERyaXZlLzAxUHJvamVjdHMvMDFJbmNhcmNlcmF0aW9uSGVhbHRoLyIpCmxvYWQoIjA1UmVzZWFyY2gvc2RhemEvb3V0cHV0L3JkYXRhL25sc3kvaW1wMS5SZGF0YSIpCgoKIyBnZXQgZGF0YQpsb25nIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgImxvbmciLCBpbmMgPSBUUlVFKSkKZXhpIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgMSkpCm9yZyA8LSBkYXRhLnRhYmxlKGNvbXBsZXRlKGltcDEsIDApKQoKIyB2YXJpYWJsZXMgcHJlZGljdGluZyBtaXNzaW5nbmVzcwojIG9yZ1ssIGluY29tZV9taXNzaW5nIDo9IGlmZWxzZShpcy5uYShjbGluY29tZV9hZGopLCAxLCAwKV0Kb3JnWywgbWFnZSA6PSBtaW4oYWdlaSksIGlkXQojIHNjcmVlbnJlZyhnbG0oaW5jb21lX21pc3NpbmcgfiBtYWxlICsgbWFnZSArIHJhY2UgKyBycHJpc29uICsgam9iICsKICAjIG1hcnJpZWQgKyBjcGVkdSArIGFkcm9wb3V0ICsgY2RlbHRvdCArIHllYXIsIGRhdCA9IG9yZykpCmBgYAoKCkkgY29uc2lkZXJlZCByZWNvcmRzIHNpbmNlIDE5ODAgYW5kIHJlc3BvbmRlbnRzIDE4IHllYXJzIG9sZCBvciBtb3JlLCB0aGF0IGlzLCBhIHNhbXBsZSBvZiBgciBsZW5ndGgodW5pcXVlKG9yZyRpZCkpYC4gRHVyaW5nIHRoYXQgcGVyaW9kIGByIHN1bShvcmdbLCBkaWVkXSlgIHBlb3BsZSBkaWVkLiBUaGUgbWVkaWFuIGFnZSBvZiBkZWF0aCB3YXMgYHIgcm91bmQobWVkaWFuKG9yZ1tkaWVkID09IDEsIGFnZWldKSwgMilgLgoKSnVzdCB0byBnZXQgYW4gaWRlYSBvZiB0aGUgbWlzc2luZyBkYXRhOiAKCmBgYHtyfQpjb3VudG1pcyhvcmcpCmBgYAoKVGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBtaXNzaW5nIGNhc2VzIGlzIGluY29tZS4gSSBkZWZpbmVkIGltcHV0YXRpb24gbXVsdGl2ZWwgbW9kZWxzLCB3aGVyZSBJIHVzZSBib3RoIHRpbWUgaW52YXJpYW50IGFuZCB2YXJpYW50IHZhcmlhYmxlcywgYWdlIGFuZCB5ZWFyLiBKdXN0IHRvIHByb3ZpZGUgYW4gZXhhbXBsZSwgdGhlIGluY29tZSBpbXB1dGF0aW9uIG1vZGVsIGlzOiAKCiAgICAgICAgICAgICAgIAokJGluY29tZSA9IFxhbHBoYSArIHllYXIgKyBhZ2UgKyBlZHUgICsgcGFyZW50c1xfZWR1ICsgcHJpc29uICsgbWFycmllZCBcXAorIGhlYWx0aCArIGRlbGlucXVlbmN5ICsgam9iICsgZHJvcG91dCArIGRlYXRoICsgXGRlbHRhX3IgKyBcZXBzaWxvbl9pICQkCgpEZWF0aCBhbmQgZHJvcG91dCBhcmUgdGltZS1pbnZhcmlhbnQgdmFyaWFibGVzLiBPbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHByZWRpY3RvciBvZiBpbmNvbWUgbWlzc2lnbmVzcyBpcyBpbmNhcmNlcmF0aW9uISBGb3IgdGhpcyBleGVyY2lzZSwgSSBnZW5lcmF0ZWQgMTAgaW1wdXRhdGlvbnMuIEZpbmFsIHZlcnNpb25zIG9mIHRoaXMgZXhlcmNpc2Ugc2hvdWxkIHVzZSBtb3JlIGl0ZXJhdGlvbnMgYW5kIGltcHV0YXRpb25zIChlLmcuLCAzMCBpdGVyYXRpb25zLCA2MCBpbXB1dGF0aW9ucykuIEFueXdheXMgbWl4aW5nIGRvZXNuJ3QgbG9vayBiYWQuIAoKSSBleHBsb3JlZCBkaWZmZXJlbmNlcyBieSBnZW5kZXI6IAoKYGBge3IsIGVjaG8gPSBUUlVFfQojIGV4cGxvcmUgZGlmZmVyZW5jZXMgYnkgZ2VuZGVyCnggPC0gb3JnWywgLihtYWxlID0gbWF4KG1hbGUsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgIHByaXNvbiA9IG1heChycHJpc29uLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgICBkZWF0aCA9IG1heChkaWVkLCBuYS5ybSA9IFRSVUUpLCBhZ2UgPSBtYXgoYWdlaSwgbmEucm0gPSBUUlVFKSksIGlkXQoKIyB0aGVzZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiBhZ2UgPj0gMTggYW5kIHllYXIgPj0gMTk4MAp0YWJsZSh4WywgLihwcmlzb24sIGRlYXRoLCBtYWxlKV0pCgojIG9kZHMgcmF0aW8gbWFsZQphIDwtIHRhYmxlKHhbbWFsZSA9PSAxLCAuKHByaXNvbiwgZGVhdGgpXSkKKGFbMiwyXSphWzEsMV0pIC8gKGFbMiwxXSphWzEsMl0pCgojIG9kZCByYXRpb3MgZmVtYWxlCmIgPC0gdGFibGUoeFttYWxlID09IDAsIC4ocHJpc29uLCBkZWF0aCldKQooYlsyLDJdKmJbMSwxXSkgLyAoYlsyLDFdKmJbMSwyXSkgIyBodWdlCgoKIyB0aW1lIGJldHdlZW4gZmlyc3QgaW5jYXJjZXJhdGlvbiBldmVudCBhbmQgZGVhdGggYnkgZ2VuZGVyIQp4IDwtIG9yZ1ssIC4oaWQgLHJwcmlzb24sIGRpZWQsIG1hbGUsIGFnZWksIHN0b3ApXQphIDwtIHhbcnByaXNvbiA9PSAxLCAuKHByaXNvbiA9IG1pbihzdG9wKSwgYWdlID0gbWluKGFnZWkpKSwgLihpZCwgbWFsZSldCmIgPC0geFtkaWVkID09IDEsIC4oZGVhdGggPSBtaW4oc3RvcCkpLCAuKGlkLCBtYWxlKV0KCiNhbnlEdXBsaWNhdGVkKGIpCiNhbnlEdXBsaWNhdGVkKGEpCnNldGtleShhLCBpZCwgbWFsZSkKc2V0a2V5KGIsIGlkLCBtYWxlKQpjIDwtIGJbYV0KCiMgb25seSA4MSBjYXNlcyBvZiBwZW9wbGUgd2hvIGhhdmUgYmVlbiBpbmNhcmNlcmF0ZWQgYW5kIGRpZWQgaW4gdGhlIHNhbXBsZQpsZW5ndGgoY1shaXMubmEoZGVhdGgpLCBkZWF0aCAtIHByaXNvbl0pCm1lYW4oY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBhZ2VdKSAjIG1lbiBhcmUgeW91bmdlcgptZWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgYWdlXSkgIyB3b21lbiBhcmUgb2xkZXIKCiMgbWVhbiBhbmQgbWVkaWFuIG9mIHllYXIgYmV0d2VlbiBmaXJzdCBpbmNhcmNlcmF0aW9uIGV2ZW50IGFuZCBkZWF0aAojIG1lbgptZWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMSwgZGVhdGggLSBwcmlzb25dKQptZWRpYW4oY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBkZWF0aCAtIHByaXNvbl0pCmhpc3QoY1shaXMubmEoZGVhdGgpICYgbWFsZSA9PSAxLCBkZWF0aCAtIHByaXNvbl0sIG1haW4gPSAiTWVuOiBEaXN0cmlidXRpb24gdGltZSBiZXR3ZWVuIGluY2FyY2VyYXRpb24gYW5kIGRlYXRoIikKCiMgd29tZW4KbWVhbihjWyFpcy5uYShkZWF0aCkgJiBtYWxlID09IDAsIGRlYXRoIC0gcHJpc29uXSkKbWVkaWFuKGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgZGVhdGggLSBwcmlzb25dKQpoaXN0KGNbIWlzLm5hKGRlYXRoKSAmIG1hbGUgPT0gMCwgZGVhdGggLSBwcmlzb25dLCBtYWluID0gIldvbWVuOiBEaXN0cmlidXRpb24gdGltZSBiZXR3ZWVuIGluY2FyY2VyYXRpb24gYW5kIGRlYXRoIikKCmBgYAoKTGV0J3MgZXhwbG9yZSB0aGUgaW1wdXRhdGlvbnM6IAoKYGBge3IsIGVjaG89RkFMU0V9CnBsb3QoaW1wMSkKYGBgCgpUaGVuLCBJIGV4YW1pbmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgaW1wdXRlZCB2YXJpYWJsZXMgYnkgYWdlIGFuZCB5ZWFyLiBIZXJlIEkgc2hvdyBvbmx5IGluY29tZSBhbmQgcHJpc29uLCBhbGwgdGhlIHJlc3Qgb2YgaW1wdXRlZCB2YXJpYWJsZXMgbG9vayByaWdodC4gR3JheSBsaW5lcyByZXByZXNlbnQgaW1wdXRlZCBkYXRhc2V0cywgdGhlIHJlZCBsaW5lIHRoZSBvYnNlcnZlZCBkYXRhLiAKCkluY29tZSBpbXB1dGF0aW9ucyBhcmUgZmFyIGJlbG93IHRoZSBvYnNlcnZlZCB2YWx1ZXMsIEkgZ3Vlc3MgbWFpbmx5IHRvIHRoZSBlZmZlY3Qgb2YgcHJpc29uIG9uIGluY29tZSBtaXNzaW5nbmVzcy4gUHJvYmFibHksIGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIHVzZSBhIGxhZyB2ZXJzaW9uIG9mIGluY29tZSB0byBpbXByb3ZlIHRoZSBpbXB1dGF0aW9uLiAKCkluY2FyY2VhcnRpb24gbG9va3MgZmluZS4gQWZ0ZXIgdGhlIDIwMDQsIE5MWVMgcmVjb3JkZWQgbm9uLXJlc3BvbnNlIGR1ZSB0byBpbmNhcmNlcmF0aW9uLCB0aGF0IGlzIHdoeSB0aGVyZSBhcmUgbm8gbWlzc2luZyByZWNvcmRzIGR1cmluZyB0aG9zZSB5ZWFycy4gCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBpbmNvbWUKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oY2xpbmNvbWVfYWRqLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPCA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAibG4gaW5jb21lIGNlbnRlcmVkXG4iKQoKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oY2xpbmNvbWVfYWRqLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJsbiBpbmNvbWUgY2VudGVyZWRcbiIpCgojIHByaXNvbgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBcbiIpCgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gInByb3BvcnRpb24gaW4gcHJpc29uIFxuIikKCiMgb3JnWywgbWF4KGFnZWkpLCAuKGlkLCBtYWxlKV1bLCBtZWFuKFYxKSwgbWFsZV0KIyBvcmdbLCBtZWFuKGRlYXRoKSwgbWFsZV0KIyB0YWJsZShvcmdbbWFsZSA9PSAwLCAuKHJwcmlzb24sIGRpZWQpXSkgIyAyNTAKIyB0YWJsZShvcmdbbWFsZSA9PSAxLCBkaWVkXSkgIyA0MDAKCiMgIyBqb2IKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihqb2IsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiam9iIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3Agam9iXG4iKQojIAojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGpvYiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiB5ZWFyICVpbiUgeWVhcnNdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJqb2IgYnkgYWdlIiwgeCA9ICJcbnllYXIiLCB5ID0gInllYXJzIG9mIGVkdWNhdGlvbiBjZW50ZXJlZFxuIikKIyAKIyAKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihoZWFsdGh3LCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPCA2MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCiMgCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oaGVhbHRodywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCmBgYAoKIyMgUG9vbGVkIE1vZGVscwoKQSBzaW1wbGUgbW9kZWwgcmVtb3ZpbmcgdGltZS12YXJ5aW5nIGFkanVzdG1lbnRzIChkaWZmZXJlbnQgZnJvbSB0aGUgbmFpdmUgbW9kZWwsIGJ1dCBzaW1pbGFyIHRvIE1TTSk6IAoKYGBge3IsIGVjaG89RkFMU0V9CiMrIGNyZWF0ZSBtb2RlbHMgcGVyIGltcHV0YXRpb24KCiMgcmVkZWZpbmUgc29tZSB2YXJpYWJsZXMKbGltcCA8LSBsb25nWy5pbXAgIT0gMF0Kc2V0a2V5KGxpbXAsIC5pbXAsIGlkLCBzdGFydCkKCmxpbXBbLCBjcHJpc29uIDo9IGN1bXN1bShycHJpc29uKSwgYnkgPSAuKC5pbXAsIGlkKV1bLCBwcmlzb24gOj0gaWZlbHNlKGNwcmlzb24gPiAwLCAxLCAwKV0KI3RhYmxlKGxpbXAkcHJpc29uLCB1c2VOQSA9ICJpZmFueSIpCmxpbXBbLCBjaGVhbHRoIDo9IGN1bXN1bShoZWFsdGh3KSwgYnkgPS4oaWQsIC5pbXApXVssIHBvb3JoZWFsdGggOj0gaWZlbHNlKGNoZWFsdGggPiAwLCAxLCAwKV0KI3RhYmxlKGxpbXAkcG9vcmhlYWx0aCwgdXNlTkEgPSAiaWZhbnkiKQpsaW1wWywgbWFnZSA6PSBtaW4oYWdlaSksIC4oaWQsIC5pbXApXQpsaW1wWywgbWFnZWYgOj0gZmFjdG9yKG1hZ2UpXQoKCm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBjZGVsdG90LCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgoKQWRkaW5nIHRpbWUtdmFyeWluZyBjb3ZhcmlhdGVzLgoKYGBge3IsIGVjaG89RkFMU0V9Cm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQgKyBjZGVsdG90LCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgpObyBlZmZlY3Qgb2YgcHJpc29uIG9uIG1vcnRhbGl0eS4gCgpCZWNhdXNlIG9mIHRpbWUtdmFyeWluZyBjb25mb3VuZGluZyBJIHVzZWQgdGhlIE1TTSBhZGp1c3RtZW50LiBUaGlzIHNlZW1zIHRvIGNvcnJlY3QgdGhlIGFkanVzdG1lbnQgb2YgbWVkaWF0b3JzLiBUaGUgZWZmZWN0cyBhcmUgaGlnaGVyIGJ1dCBsZXNzIHByZWNpc2UgYW5kIG5vbi1zdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBTaW1pbGFybHkgdG8gTWFzc29nbGlhIGV0IGFsLCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBwcmlzb24gYW5kIGdlbmRlciBzdWdnZXN0cyBhIGh1Z2UgcG9zaXRpdmUgZWZmZWN0IGZvciB3b21lbi4gVGhlIGltcHV0YXRpb25zIEkgYW0gdXNpbmcgYXJlIG5vdCBjb21wbGV0bHkgc3VpdGFibGUsIHRoZSBpbXB1dGF0aW9uIG1vZGVsIHNob3VsZCBpbmNsdWRlIHRoZSBpbnRlcmFjdGlvbiBieSBnZW5kZXIuIFRoZSBjb2VmZmljaWVudCBmb3Igd29tZW4gaXMgdG9vIGJpZyB0byBiZSBjcmVkaWJsZSAoaGF6YXJkIHJhdGlvIG9mIGFib3V0IDUsIGtpbmQgb2Ygc2ltaWxhciB0byB0aGUgb2RkcyByYXRpb3MgY29tcHV0ZWQgYWJvdmUpLiAgCgoKYGBge3IsIGVjaG89RkFMU0V9Cm1vZGVsc01TTSA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbnMKICAgICAgdCA8LSBsaW1wWy5pbXAgPT0gaV0KICAgICAgdzEgPC0gaXB3dG0oZXhwb3N1cmUgPSBkcm9wb3V0LCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSwKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpc29uICsgY2VkdWkgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQsIAogICAgICAgICAgICAgIGlkID0gaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB3MiA8LSBpcHd0bShleHBvc3VyZSA9IHByaXNvbiwgZmFtaWx5ID0gInN1cnZpdmFsIiwKICAgICAgICAgICAgICBudW1lcmF0b3IgPSB+IG1hbGUgKyBtYWdlZiArIHJhY2UgKyBjZGVsdG90ICsgY3BlZHUsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+IG1hbGUgKyBtYWdlZiArIHJhY2UgKyBjZGVsdG90ICsgY3BlZHUgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VkdWkgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQsIGlkID0gaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB0Wywgd3QgOj0gdzEkaXB3LndlaWdodHMgKiB3MiRpcHcud2VpZ2h0c10KICAgICAgbW9kZWxzTVNNW1tpXV0gPC0gY294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFnZWYgKyBtYWxlICsgcmFjZSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjZWR1aSArIGNwZWR1ICsgY2xpbmNvbWVfYWRqICsgaGVhbHRodyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBqb2IgKyBtYXJyaWVkICsgY2RlbHRvdCArIGNsdXN0ZXIoaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gdCR3dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHQpCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVsc01TTSkpCmBgYApgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWxzTVNNIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgbWFnZWYgKyByYWNlICsgY2RlbHRvdCArIGNwZWR1LAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiBtYWxlICsgbWFnZWYgKyByYWNlICsgY2RlbHRvdCArIGNwZWR1ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlzb24gKyBjZWR1aSArIGNsaW5jb21lX2FkaiArIGhlYWx0aHcgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iICsgbWFycmllZCwgCiAgICAgICAgICAgICAgaWQgPSBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gcHJpc29uLCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSwKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gbWFsZSArIG1hZ2VmICsgcmFjZSArIGNkZWx0b3QgKyBjcGVkdSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWR1aSArIGNsaW5jb21lX2FkaiArIGhlYWx0aHcgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iICsgbWFycmllZCwgaWQgPSBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHRbLCB3dCA6PSB3MSRpcHcud2VpZ2h0cyAqIHcyJGlwdy53ZWlnaHRzXQogICAgICBtb2RlbHNNU01bW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKiBtYWxlICsgbWFnZWYgKyByYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlZHVpICsgY3BlZHUgKyBjbGluY29tZV9hZGogKyBoZWFsdGh3ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYiArIG1hcnJpZWQgKyBjZGVsdG90ICsgY2x1c3RlcihpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB0JHd0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzTVNNKSkKYGBgCg==