Here I used the PSID variables we used in the paper. I get estimates of the effect of incarceration on mortality, where incarceration is based on the non-response variable, and examine an initial imputation model.
The variables I considered were:
- Gender (I)
- Age (I)
- Race (I)
- Income (V)
- Education (V)
- Poor health (V)
- Incarceration / non-response (V)
knitr::opts_knit$set(root.dir = 'Users/sdaza/Google Drive/01Projects/01IncarcerationHealth/')
I consider records since 1968 and respondents 18 years old or more, that is, a sample of 52791. During that period 6218 people died. The median age of death was 71.
Differences by gender. The odds ratios are lower than 1, timing is important, not just proportions!
# explore differences by gender
x <- org[, .(male = max(male, na.rm = TRUE),
prison = max(nrprison, na.rm = TRUE),
death = max(died, na.rm = TRUE),
age = max(agei, na.rm = TRUE)), pid]
# these numbers are different because of age >= 18
table(x[, .(prison, death, male)]) # very small sample sizes for women
, , male = 0
death
prison 0 1
0 23860 2974
1 53 2
, , male = 1
death
prison 0 1
0 22149 3196
1 511 46
# odds ratio male
a <- table(x[male == 1, .(prison, death)])
(a[2,2]*a[1,1]) / (a[2,1]*a[1,2]) # it's not higher than 1, timing might be more important rather than dying or not
[1] 0.6238559
# odd ratios female
b <- table(x[male == 0, .(prison, death)])
(b[2,2]*b[1,1]) / (b[2,1]*b[1,2]) # even
[1] 0.3027496
Just to get an idea of the missing data:
countmis(org)
dghealth eduic linc_adjc nrprison frace
0.377 0.133 0.079 0.070 0.001
The highest proportion of missing cases is health and education. 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 + prison \\
+ health + dropout + death + \delta_r + \epsilon_i \]
Death and dropout are time-invariant variables. 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 that bad. Increasing the number of imputations increases standard errors… so we have a trade-off here.


Then, I examine the distribution of the imputed variables by age and year. Weird pattern of the incarceration variable by year, still waiting the reply of the PSID staff. Health is also weird, I wouldn’t know what to do here.






Pooled Models (only non-response incarceration models)
A simple model without health:
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.71889240 0.1923165882 0.32813481 1.10964999 54 %
male 0.45622024 0.0264458509 0.40436694 0.50807355 5 %
agec 0.07514924 0.0009010345 0.07337851 0.07691997 14 %
fraceblack 0.35121080 0.0291765885 0.29401353 0.40840808 4 %
fraceother -0.41997053 0.0752877157 -0.56753381 -0.27240726 1 %
linc_adjc -0.06148175 0.0243441412 -0.11349792 -0.00946558 81 %
eduic -0.04811699 0.0057679552 -0.05986338 -0.03637059 56 %
Now, adding health:
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.71935329 0.191141343 0.33129507 1.107411516 53 %
male 0.46159223 0.027112318 0.40838162 0.514802831 10 %
agec 0.07175711 0.002223414 0.06693337 0.076580853 87 %
fraceblack 0.32504446 0.031778732 0.26246118 0.387627739 19 %
fraceother -0.42156553 0.080625909 -0.57998917 -0.263141900 14 %
linc_adjc -0.04623545 0.023440393 -0.09595447 0.003483568 78 %
eduic -0.03898820 0.008989499 -0.05827634 -0.019700054 83 %
dghealth 0.47175029 0.142983131 0.15191206 0.791588508 97 %
Effect is positive but rather noisy. Because of time-varying confounding I used the MSM adjustment, the effect is smaller. The gender interaction using this sample doesn’t make sense (too small sample sizes).
Multiple imputation results:
MIcombine.default(modelsMSM)
results se (lower upper) missInfo
prison 0.65600143 0.232651456 0.18347797 1.128524882 54 %
male 0.46189978 0.027769376 0.40737692 0.516422642 12 %
agec 0.07155314 0.002226179 0.06679834 0.076307949 81 %
fraceblack 0.32105243 0.033988985 0.25426872 0.387836139 14 %
fraceother -0.42195532 0.073522175 -0.56619277 -0.277717860 9 %
linc_adjc -0.04391700 0.024404307 -0.09577239 0.007938395 79 %
eduic -0.03945674 0.008840792 -0.05840131 -0.020512160 82 %
dghealth 0.45750937 0.143537325 0.13692348 0.778095264 96 %
LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBFZmZlY3Qgb24gTW9ydGFsaXR5LCBQU0lEICsgSW1wdXRhdGlvbiBNb2RlbCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKSGVyZSBJIHVzZWQgdGhlIFBTSUQgdmFyaWFibGVzIHdlIHVzZWQgaW4gdGhlIHBhcGVyLiBJIGdldCBlc3RpbWF0ZXMgb2YgdGhlIGVmZmVjdCBvZiBpbmNhcmNlcmF0aW9uIG9uIG1vcnRhbGl0eSwgd2hlcmUgaW5jYXJjZXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbm9uLXJlc3BvbnNlIHZhcmlhYmxlLCBhbmQgZXhhbWluZSBhbiBpbml0aWFsIGltcHV0YXRpb24gbW9kZWwuIAoKVGhlIHZhcmlhYmxlcyBJIGNvbnNpZGVyZWQgd2VyZTogCgotIEdlbmRlciAoSSkKLSBBZ2UgKEkpCi0gUmFjZSAoSSkKLSBJbmNvbWUgKFYpCi0gRWR1Y2F0aW9uIChWKQotIFBvb3IgaGVhbHRoIChWKQotIEluY2FyY2VyYXRpb24gLyBub24tcmVzcG9uc2UgKFYpCgoKYGBge3Igc2V0dXB9CmtuaXRyOjpvcHRzX2tuaXQkc2V0KHJvb3QuZGlyID0gJ1VzZXJzL3NkYXphL0dvb2dsZSBEcml2ZS8wMVByb2plY3RzLzAxSW5jYXJjZXJhdGlvbkhlYWx0aC8nKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQoKcm0obGlzdD1scyhhbGw9VFJVRSkpCmxpYnJhcnkoc2RhemFyKQpsaWJyYXJ5KGxhdHRpY2UpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShpcHcpCmxpYnJhcnkodGV4cmVnKQoKbG9hZCgiL1VzZXJzL3NkYXphL0dvb2dsZSBEcml2ZS8wMVByb2plY3RzLzAxSW5jYXJjZXJhdGlvbkhlYWx0aC8wNVJlc2VhcmNoL3NkYXphL291dHB1dC9yZGF0YS9wc2lkL2ltcDEuUmRhdGEiKQoKIyBnZXQgZGF0YQpsb25nIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgImxvbmciLCBpbmMgPSBUUlVFKSkKZXhpIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMSwgMSkpCm9yZyA8LSBkYXRhLnRhYmxlKGNvbXBsZXRlKGltcDEsIDApKQoKYGBgCgpJIGNvbnNpZGVyIHJlY29yZHMgc2luY2UgMTk2OCBhbmQgcmVzcG9uZGVudHMgMTggeWVhcnMgb2xkIG9yIG1vcmUsIHRoYXQgaXMsIGEgc2FtcGxlIG9mIGByIGxlbmd0aCh1bmlxdWUob3JnJHBpZCkpYC4gRHVyaW5nIHRoYXQgcGVyaW9kIGByIHN1bShvcmdbLCBkaWVkXSlgIHBlb3BsZSBkaWVkLiBUaGUgbWVkaWFuIGFnZSBvZiBkZWF0aCB3YXMgYHIgcm91bmQobWVkaWFuKG9yZ1tkaWVkID09IDEsIGFnZWldKSwgMilgLgoKRGlmZmVyZW5jZXMgYnkgZ2VuZGVyLiBUaGUgb2RkcyByYXRpb3MgYXJlIGxvd2VyIHRoYW4gMSwgdGltaW5nIGlzIGltcG9ydGFudCwgbm90IGp1c3QgcHJvcG9ydGlvbnMhIAoKYGBge3IsIGVjaG8gPSBUUlVFfQojIGV4cGxvcmUgZGlmZmVyZW5jZXMgYnkgZ2VuZGVyCnggPC0gb3JnWywgLihtYWxlID0gbWF4KG1hbGUsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgcHJpc29uID0gbWF4KG5ycHJpc29uLCBuYS5ybSA9IFRSVUUpLCAKICAgICAgICAgICAgIGRlYXRoID0gbWF4KGRpZWQsIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgYWdlID0gbWF4KGFnZWksIG5hLnJtID0gVFJVRSkpLCBwaWRdCgojIHRoZXNlIG51bWJlcnMgYXJlIGRpZmZlcmVudCBiZWNhdXNlIG9mIGFnZSA+PSAxOAp0YWJsZSh4WywgLihwcmlzb24sIGRlYXRoLCBtYWxlKV0pICMgdmVyeSBzbWFsbCBzYW1wbGUgc2l6ZXMgZm9yIHdvbWVuCgojIG9kZHMgcmF0aW8gbWFsZQphIDwtIHRhYmxlKHhbbWFsZSA9PSAxLCAuKHByaXNvbiwgZGVhdGgpXSkKKGFbMiwyXSphWzEsMV0pIC8gKGFbMiwxXSphWzEsMl0pICMgaXQncyBub3QgaGlnaGVyIHRoYW4gMSwgdGltaW5nIG1pZ2h0IGJlIG1vcmUgaW1wb3J0YW50IHJhdGhlciB0aGFuIGR5aW5nIG9yIG5vdAoKIyBvZGQgcmF0aW9zIGZlbWFsZQpiIDwtIHRhYmxlKHhbbWFsZSA9PSAwLCAuKHByaXNvbiwgZGVhdGgpXSkgCihiWzIsMl0qYlsxLDFdKSAvIChiWzIsMV0qYlsxLDJdKSAjIGV2ZW4gCmBgYAoKSnVzdCB0byBnZXQgYW4gaWRlYSBvZiB0aGUgbWlzc2luZyBkYXRhOiAKCmBgYHtyfQpjb3VudG1pcyhvcmcpCmBgYAoKVGhlIGhpZ2hlc3QgcHJvcG9ydGlvbiBvZiBtaXNzaW5nIGNhc2VzIGlzIGhlYWx0aCBhbmQgZWR1Y2F0aW9uLiBJIGRlZmluZWQgaW1wdXRhdGlvbiBtdWx0aXZlbCBtb2RlbHMsIHdoZXJlIEkgdXNlIGJvdGggdGltZSBpbnZhcmlhbnQgYW5kIHZhcmlhbnQgdmFyaWFibGVzLCBhZ2UgYW5kIHllYXIuIEp1c3QgdG8gcHJvdmlkZSBhbiBleGFtcGxlLCB0aGUgaW5jb21lIGltcHV0YXRpb24gbW9kZWwgaXM6IAoKICAgICAgICAgICAgICAgCiQkaW5jb21lID0gXGFscGhhICsgeWVhciArIGFnZSArIGVkdSArIHByaXNvbiAgXFwKKyBoZWFsdGggKyBkcm9wb3V0ICsgZGVhdGggKyBcZGVsdGFfciArIFxlcHNpbG9uX2kgJCQKCkRlYXRoIGFuZCBkcm9wb3V0IGFyZSB0aW1lLWludmFyaWFudCB2YXJpYWJsZXMuIEZvciB0aGlzIGV4ZXJjaXNlLCBJIGdlbmVyYXRlZCAxMCBpbXB1dGF0aW9ucy4gRmluYWwgdmVyc2lvbnMgb2YgdGhpcyBleGVyY2lzZSBzaG91bGQgdXNlIG1vcmUgaXRlcmF0aW9ucyBhbmQgaW1wdXRhdGlvbnMgKGUuZy4sIDMwIGl0ZXJhdGlvbnMsIDYwIGltcHV0YXRpb25zKS4gQW55d2F5cyBtaXhpbmcgZG9lc24ndCBsb29rIHRoYXQgYmFkLiBJbmNyZWFzaW5nIHRoZSBudW1iZXIgb2YgaW1wdXRhdGlvbnMgaW5jcmVhc2VzIHN0YW5kYXJkIGVycm9ycy4uLiBzbyB3ZSBoYXZlIGEgdHJhZGUtb2ZmIGhlcmUuIAoKYGBge3IsIGVjaG89RkFMU0V9CnBsb3QoaW1wMSkKYGBgCgpUaGVuLCBJIGV4YW1pbmUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgaW1wdXRlZCB2YXJpYWJsZXMgYnkgYWdlIGFuZCB5ZWFyLiBXZWlyZCBwYXR0ZXJuIG9mIHRoZSBpbmNhcmNlcmF0aW9uIHZhcmlhYmxlIGJ5IHllYXIsIHN0aWxsIHdhaXRpbmcgdGhlIHJlcGx5IG9mIHRoZSBQU0lEIHN0YWZmLiBIZWFsdGggaXMgYWxzbyB3ZWlyZCwgSSB3b3VsZG4ndCBrbm93IHdoYXQgdG8gZG8gaGVyZS4gCgpgYGB7ciwgZWNobz1GQUxTRX0KIyBpbmNvbWUKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4obGluY19hZGpjLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDAgJiBhZ2VpID49IDE4ICYgYWdlaSA8PSA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwICYgYWdlaSA+PTE4ICYgYWdlaSA8PSA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAibG4gaW5jb21lIGNlbnRlcmVkXG4iKQoKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4obGluY19hZGpjLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJpbmNvbWUgYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJsbiBpbmNvbWUgY2VudGVyZWRcbiIpCgojIHByaXNvbgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihucnByaXNvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLihhZ2VpLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwICYgYWdlaSA+PSAxOCAmIGFnZWkgPD0gNjBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0gMTggJiBhZ2VpIDw9IDYwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gaW4gcHJpc29uIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3BvcnRpb24gaW4gcHJpc29uIFxuIikKCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKG5ycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDAgXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBpbiBwcmlzb24gYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBcbiIpCgojIGhlYWx0aAp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihkZ2hlYWx0aCwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLihhZ2VpLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwICYgYWdlaSA8PSA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwICYgYWdlaSA8PSA5MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHBvb3IgaGVhbHRoIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3BvcnRpb24gaW4gcG9vciBoZWFsdGggXG4iKQoKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oZGdoZWFsdGgsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oeWVhciwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMCBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHBvb3IgaGVhbHRoIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAicHJvcG9ydGlvbiBpbiBwb29yIGhlYWx0aCBuIFxuIikKCiMgb3JnWywgbWF4KGFnZWkpLCAuKGlkLCBtYWxlKV1bLCBtZWFuKFYxKSwgbWFsZV0KIyBvcmdbLCBtZWFuKGRlYXRoKSwgbWFsZV0KIyB0YWJsZShvcmdbbWFsZSA9PSAwLCAuKHJwcmlzb24sIGRpZWQpXSkgIyAyNTAKIyB0YWJsZShvcmdbbWFsZSA9PSAxLCBkaWVkXSkgIyA0MDAKCiMgIyBqb2IKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihqb2IsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiam9iIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3Agam9iXG4iKQojIAojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGpvYiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiB5ZWFyICVpbiUgeWVhcnNdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJqb2IgYnkgYWdlIiwgeCA9ICJcbnllYXIiLCB5ID0gInllYXJzIG9mIGVkdWNhdGlvbiBjZW50ZXJlZFxuIikKIyAKIyAKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihoZWFsdGh3LCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPCA2MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCiMgCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oaGVhbHRodywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBcbiIpCmBgYAoKIyMgUG9vbGVkIE1vZGVscyAob25seSBub24tcmVzcG9uc2UgaW5jYXJjZXJhdGlvbiBtb2RlbHMpCgpBIHNpbXBsZSBtb2RlbCB3aXRob3V0IGhlYWx0aDogCgpgYGB7ciwgZWNobz1GQUxTRX0KIysgY3JlYXRlIG1vZGVscyBwZXIgaW1wdXRhdGlvbgoKIyByZWRlZmluZSBzb21lIHZhcmlhYmxlcwpsaW1wIDwtIGxvbmdbLmltcCAhPSAwXQpzZXRrZXkobGltcCwgLmltcCwgcGlkLCBzdGFydCkKCmxpbXBbLCBjcHJpc29uIDo9IGN1bXN1bShucnByaXNvbiksIGJ5ID0gLiguaW1wLCBwaWQpXVssIHByaXNvbiA6PSBpZmVsc2UoY3ByaXNvbiA+IDAsIDEsIDApXQojdGFibGUobGltcCRwcmlzb24sIHVzZU5BID0gImlmYW55IikKCiNuYW1lcyhsaW1wKQptb2RlbHMgPC0gbGlzdCgpCmZvciAoaSBpbiAxOjEwKSB7ICMgbnVtYmVyIG9mIGltcHV0YXRpb24KICAgICAgI3ByaW50KHBhc3RlMCgiOjo6Ojo6OjogcnVubmluZyBtb2RlbCBmb3IgaW1wdXRhdGlvbiAiLCBpKSkKICAgICAgdCA8LSBsaW1wWy5pbXAgPT0gaV0KICAgICAgbW9kZWxzW1tpXV0gPC0gY294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICArIGxpbmNfYWRqYyArIGVkdWljLCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgpOb3csIGFkZGluZyBoZWFsdGg6IAoKYGBge3IsIGVjaG89RkFMU0V9CiMrIGNyZWF0ZSBtb2RlbHMgcGVyIGltcHV0YXRpb24KbW9kZWxzIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9uCiAgICAgICNwcmludChwYXN0ZTAoIjo6Ojo6Ojo6IHJ1bm5pbmcgbW9kZWwgZm9yIGltcHV0YXRpb24gIiwgaSkpCiAgICAgIHQgPC0gbGltcFsuaW1wID09IGldCiAgICAgIG1vZGVsc1tbaV1dIDwtIGNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IHByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5jX2FkamMgKyBlZHVpYyArIGRnaGVhbHRoLCBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgpFZmZlY3QgaXMgcG9zaXRpdmUgYnV0IHJhdGhlciBub2lzeS4gQmVjYXVzZSBvZiB0aW1lLXZhcnlpbmcgY29uZm91bmRpbmcgSSB1c2VkIHRoZSBNU00gYWRqdXN0bWVudCwgdGhlIGVmZmVjdCBpcyBzbWFsbGVyLiBUaGUgZ2VuZGVyIGludGVyYWN0aW9uIHVzaW5nIHRoaXMgc2FtcGxlIGRvZXNuJ3QgbWFrZSBzZW5zZSAodG9vIHNtYWxsIHNhbXBsZSBzaXplcykuICAKCgpgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWxzTVNNIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljICsgZGdoZWFsdGgsIAogICAgICAgICAgICAgIGlkID0gcGlkLAogICAgICAgICAgICAgIHRzdGFydCA9IHN0YXJ0LCB0aW1ldmFyID0gc3RvcCwKICAgICAgICAgICAgICB0eXBlID0gImZpcnN0IiwKICAgICAgICAgICAgICBkYXRhID0gdCkKICAgICAgdzIgPC0gaXB3dG0oZXhwb3N1cmUgPSBwcmlzb24sIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiAgbWFsZSArIGZyYWNlICsgYWdlYywKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyBsaW5jX2FkamMgKyBlZHVpYyArIGRnaGVhbHRoLAogICAgICAgICAgICAgIGlkID0gcGlkLAogICAgICAgICAgICAgIHRzdGFydCA9IHN0YXJ0LCB0aW1ldmFyID0gc3RvcCwKICAgICAgICAgICAgICB0eXBlID0gImZpcnN0IiwKICAgICAgICAgICAgICBkYXRhID0gdCkKICAgICAgdFssIHd0IDo9IHcxJGlwdy53ZWlnaHRzICogdzIkaXB3LndlaWdodHNdCiAgICAgIG1vZGVsc01TTVtbaV1dIDwtIGNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IHByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluY19hZGpjICsgZWR1aWMgKyBkZ2hlYWx0aCArIGNsdXN0ZXIocGlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IHQkd3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0KQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHNNU00pKQpgYGAKCg==