Similar exercise, this time using PSID weights. This is the procedure to define individual weights.
From around 70,000 individual records, I save longitudinal weights. I define our analytical sample and consider only the first weight (i.e., the one at the start of the period of observation for individual \(i\)). If the individual \(i\) doesn’t have any weight, I get weights from member of the family unit \(u\) at time \(t\), compute the average and use it for individual \(i\). Using this procedure I only lost 400 individuals.
It’s important to note that non-sample members (that is, all of the ones don’t have sampling weights) don’t have probability of selection.
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 consider are:
- 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 53764. During that period 6584 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 24130 3157
1 62 2
, , male = 1
death
prison 0 1
0 22443 3375
1 545 50
# 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.6100714
# 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.2465591
Just to get an idea of the missing data:
countmis(org)
dghealth eduic linc_adjc nrprison frace
0.369 0.131 0.080 0.072 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 20 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.






Without Sampling Weights
Not including the health covariate.
Model 1: Standard Model
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.60915266 0.3145192800 -0.07236020 1.29066552 86 %
male 0.45427243 0.0257177752 0.40384519 0.50469968 6 %
agec 0.07523002 0.0009869461 0.07326874 0.07719130 33 %
fraceblack 0.34387285 0.0292159606 0.28653990 0.40120579 10 %
fraceother -0.42188168 0.0717197482 -0.56244995 -0.28131340 0 %
linc_adjc -0.06616004 0.0241303745 -0.11791655 -0.01440353 83 %
eduic -0.04884552 0.0043554316 -0.05744057 -0.04025047 23 %
Model 2: Marginal Structural Model
Multiple imputation results:
MIcombine.default(modelsMSM)
results se (lower upper) missInfo
prison 0.57493475 0.398537745 -0.27904705 1.42891656 82 %
male 0.45366990 0.026405398 0.40190149 0.50543831 5 %
agec 0.07490819 0.001186132 0.07255196 0.07726443 33 %
fraceblack 0.33735188 0.033154171 0.27223666 0.40246709 13 %
fraceother -0.41658902 0.069003829 -0.55183745 -0.28134060 1 %
linc_adjc -0.06349345 0.023671520 -0.11415777 -0.01282914 82 %
eduic -0.04900787 0.004506372 -0.05791635 -0.04009940 26 %
With Sampling Weights
Model 3: Standard model
Multiple imputation results:
MIcombine.default(models)
results se (lower upper) missInfo
prison 0.76868946 0.459993636 -0.22370545 1.761084377 85 %
male 0.45815774 0.032000960 0.39541498 0.520900504 5 %
agec 0.08265764 0.001593325 0.07951515 0.085800130 22 %
fraceblack 0.24856883 0.062828651 0.12537803 0.371759637 5 %
fraceother -0.51449164 0.088080277 -0.68712815 -0.341855122 1 %
linc_adjc -0.07659407 0.036744885 -0.15676665 0.003578505 89 %
eduic -0.05462636 0.005489502 -0.06546461 -0.043788116 24 %
Model 4: Marginal structural model
Multiple imputation results:
MIcombine.default(modelsMSM)
results se (lower upper) missInfo
prison 0.74966358 0.529419122 -0.39304630 1.892373454 85 %
male 0.45729601 0.032235699 0.39409689 0.520495134 5 %
agec 0.08237502 0.001646513 0.07912000 0.085630040 26 %
fraceblack 0.23917647 0.064957423 0.11169873 0.366654215 10 %
fraceother -0.50479494 0.089058295 -0.67936840 -0.330221470 3 %
linc_adjc -0.07317306 0.036410015 -0.15250006 0.006153939 88 %
eduic -0.05479641 0.005566744 -0.06580398 -0.043788840 27 %
LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBFZmZlY3Qgb24gTW9ydGFsaXR5LCBQU0lEIDIwMTUgKyBJbXB1dGF0aW9uIE1vZGVsICsgV2VpZ2h0cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU2ltaWxhciBleGVyY2lzZSwgdGhpcyB0aW1lIHVzaW5nIFBTSUQgd2VpZ2h0cy4gVGhpcyBpcyB0aGUgcHJvY2VkdXJlIHRvIGRlZmluZSBpbmRpdmlkdWFsIHdlaWdodHMuIAoKRnJvbSBhcm91bmQgNzAsMDAwIGluZGl2aWR1YWwgcmVjb3JkcywgSSBzYXZlIGxvbmdpdHVkaW5hbCB3ZWlnaHRzLiBJIGRlZmluZSBvdXIgYW5hbHl0aWNhbCBzYW1wbGUgYW5kIGNvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IHdlaWdodCAoaS5lLiwgdGhlIG9uZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHBlcmlvZCBvZiBvYnNlcnZhdGlvbiBmb3IgaW5kaXZpZHVhbCAkaSQpLiBJZiB0aGUgaW5kaXZpZHVhbCAkaSQgZG9lc24ndCBoYXZlIGFueSB3ZWlnaHQsIEkgZ2V0IHdlaWdodHMgZnJvbSBtZW1iZXIgb2YgdGhlIGZhbWlseSB1bml0ICR1JCBhdCB0aW1lICR0JCwgY29tcHV0ZSB0aGUgYXZlcmFnZSBhbmQgdXNlIGl0IGZvciBpbmRpdmlkdWFsICRpJC4gVXNpbmcgdGhpcyBwcm9jZWR1cmUgSSBvbmx5IGxvc3QgNDAwIGluZGl2aWR1YWxzLiAKCkl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBub24tc2FtcGxlIG1lbWJlcnMgKHRoYXQgaXMsIGFsbCBvZiB0aGUgb25lcyBkb24ndCBoYXZlIHNhbXBsaW5nIHdlaWdodHMpIGRvbid0IGhhdmUgcHJvYmFiaWxpdHkgb2Ygc2VsZWN0aW9uLgoKIEkgZ2V0IGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGluY2FyY2VyYXRpb24gb24gbW9ydGFsaXR5LCB3aGVyZSBpbmNhcmNlcmF0aW9uIGlzIGJhc2VkIG9uIHRoZSBub24tcmVzcG9uc2UgdmFyaWFibGUsIGFuZCBleGFtaW5lIGFuIGluaXRpYWwgaW1wdXRhdGlvbiBtb2RlbC4gCgpUaGUgdmFyaWFibGVzIEkgY29uc2lkZXIgYXJlOiAKCi0gR2VuZGVyIChJKQotIEFnZSAoSSkKLSBSYWNlIChJKQotIEluY29tZSAoVikKLSBFZHVjYXRpb24gKFYpCi0gUG9vciBoZWFsdGggKFYpCi0gSW5jYXJjZXJhdGlvbiAvIG5vbi1yZXNwb25zZSAoVikKCgpgYGB7ciBzZXR1cH0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnVXNlcnMvc2RhemEvR29vZ2xlIERyaXZlLzAxUHJvamVjdHMvMDFJbmNhcmNlcmF0aW9uSGVhbHRoLycpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgpybShsaXN0PWxzKGFsbD1UUlVFKSkKbGlicmFyeShzZGF6YXIpCmxpYnJhcnkobGF0dGljZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN1cnZleSkKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShpcHcpCmxpYnJhcnkodGV4cmVnKQoKbG9hZCgiL1VzZXJzL3NkYXphL0dvb2dsZSBEcml2ZS8wMVByb2plY3RzLzAxSW5jYXJjZXJhdGlvbkhlYWx0aC8wNVJlc2VhcmNoL3NkYXphL291dHB1dC9yZGF0YS9wc2lkL2ltcDIuUmRhdGEiKQoKIyBnZXQgZGF0YQpsb25nIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMiwgImxvbmciLCBpbmMgPSBUUlVFKSkKZXhpIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMiwgMSkpCm9yZyA8LSBkYXRhLnRhYmxlKGNvbXBsZXRlKGltcDIsIDApKQpgYGAKCkkgY29uc2lkZXIgcmVjb3JkcyBzaW5jZSAxOTY4IGFuZCByZXNwb25kZW50cyAxOCB5ZWFycyBvbGQgb3IgbW9yZSwgdGhhdCBpcywgYSBzYW1wbGUgb2YgYHIgbGVuZ3RoKHVuaXF1ZShvcmckcGlkKSlgLiBEdXJpbmcgdGhhdCBwZXJpb2QgYHIgc3VtKG9yZ1ssIGRpZWRdKWAgcGVvcGxlIGRpZWQuIFRoZSBtZWRpYW4gYWdlIG9mIGRlYXRoIHdhcyBgciByb3VuZChtZWRpYW4ob3JnW2RpZWQgPT0gMSwgYWdlaV0pLCAyKWAuCgpEaWZmZXJlbmNlcyBieSBnZW5kZXIuIFRoZSBvZGRzIHJhdGlvcyBhcmUgbG93ZXIgdGhhbiAxLCB0aW1pbmcgaXMgaW1wb3J0YW50LCBub3QganVzdCBwcm9wb3J0aW9ucyEgCgpgYGB7ciwgZWNobyA9IFRSVUV9CiMgZXhwbG9yZSBkaWZmZXJlbmNlcyBieSBnZW5kZXIKeCA8LSBvcmdbLCAuKG1hbGUgPSBtYXgobWFsZSwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICBwcmlzb24gPSBtYXgobnJwcmlzb24sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgZGVhdGggPSBtYXgoZGllZCwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICBhZ2UgPSBtYXgoYWdlaSwgbmEucm0gPSBUUlVFKSksIHBpZF0KCiMgdGhlc2UgbnVtYmVycyBhcmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgYWdlID49IDE4CnRhYmxlKHhbLCAuKHByaXNvbiwgZGVhdGgsIG1hbGUpXSkgIyB2ZXJ5IHNtYWxsIHNhbXBsZSBzaXplcyBmb3Igd29tZW4KCiMgb2RkcyByYXRpbyBtYWxlCmEgPC0gdGFibGUoeFttYWxlID09IDEsIC4ocHJpc29uLCBkZWF0aCldKQooYVsyLDJdKmFbMSwxXSkgLyAoYVsyLDFdKmFbMSwyXSkgIyBpdCdzIG5vdCBoaWdoZXIgdGhhbiAxLCB0aW1pbmcgbWlnaHQgYmUgbW9yZSBpbXBvcnRhbnQgcmF0aGVyIHRoYW4gZHlpbmcgb3Igbm90CgojIG9kZCByYXRpb3MgZmVtYWxlCmIgPC0gdGFibGUoeFttYWxlID09IDAsIC4ocHJpc29uLCBkZWF0aCldKSAKKGJbMiwyXSpiWzEsMV0pIC8gKGJbMiwxXSpiWzEsMl0pICMgZXZlbiAKYGBgCgpKdXN0IHRvIGdldCBhbiBpZGVhIG9mIHRoZSBtaXNzaW5nIGRhdGE6IAoKYGBge3J9CmNvdW50bWlzKG9yZykKYGBgCgpUaGUgaGlnaGVzdCBwcm9wb3J0aW9uIG9mIG1pc3NpbmcgY2FzZXMgaXMgaGVhbHRoIGFuZCBlZHVjYXRpb24uIEkgZGVmaW5lZCBpbXB1dGF0aW9uIG11bHRpdmVsIG1vZGVscywgd2hlcmUgSSB1c2UgYm90aCB0aW1lIGludmFyaWFudCBhbmQgdmFyaWFudCB2YXJpYWJsZXMsIGFnZSBhbmQgeWVhci4gSnVzdCB0byBwcm92aWRlIGFuIGV4YW1wbGUsIHRoZSBpbmNvbWUgaW1wdXRhdGlvbiBtb2RlbCBpczogCgogICAgICAgICAgICAgICAKJCRpbmNvbWUgPSBcYWxwaGEgKyB5ZWFyICsgYWdlICsgZWR1ICsgcHJpc29uICBcXAorIGhlYWx0aCArIGRyb3BvdXQgKyBkZWF0aCArIFxkZWx0YV9yICsgXGVwc2lsb25faSAkJAoKRGVhdGggYW5kIGRyb3BvdXQgYXJlIHRpbWUtaW52YXJpYW50IHZhcmlhYmxlcy4gRm9yIHRoaXMgZXhlcmNpc2UsIEkgZ2VuZXJhdGVkIDIwIGltcHV0YXRpb25zLiBGaW5hbCB2ZXJzaW9ucyBvZiB0aGlzIGV4ZXJjaXNlIHNob3VsZCB1c2UgbW9yZSBpdGVyYXRpb25zIGFuZCBpbXB1dGF0aW9ucyAoZS5nLiwgMzAgaXRlcmF0aW9ucywgNjAgaW1wdXRhdGlvbnMpLiBBbnl3YXlzIG1peGluZyBkb2Vzbid0IGxvb2sgdGhhdCBiYWQuIEluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBpbXB1dGF0aW9ucyBpbmNyZWFzZXMgc3RhbmRhcmQgZXJyb3JzLi4uIHNvIHdlIGhhdmUgYSB0cmFkZS1vZmYgaGVyZS4gCgpgYGB7ciwgZWNobz1GQUxTRX0KcGxvdChpbXAyKQpgYGAKClRoZW4sIEkgZXhhbWluZSB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSBpbXB1dGVkIHZhcmlhYmxlcyBieSBhZ2UgYW5kIHllYXIuIFdlaXJkIHBhdHRlcm4gb2YgdGhlIGluY2FyY2VyYXRpb24gdmFyaWFibGUgYnkgeWVhciwgc3RpbGwgd2FpdGluZyB0aGUgcmVwbHkgb2YgdGhlIFBTSUQgc3RhZmYuIEhlYWx0aCBpcyBhbHNvIHdlaXJkLCBJIHdvdWxkbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLiAKCmBgYHtyLCBlY2hvPUZBTFNFfQojIGluY29tZQp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihsaW5jX2FkamMsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMCAmIGFnZWkgPj0gMTggJiBhZ2VpIDw9IDkwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiBhZ2VpID49MTggJiBhZ2VpIDw9IDkwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gImluY29tZSBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJsbiBpbmNvbWUgY2VudGVyZWRcbiIpCgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihsaW5jX2FkamMsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oeWVhciwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gImluY29tZSBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gImxuIGluY29tZSBjZW50ZXJlZFxuIikKCiMgcHJpc29uCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKG5ycHJpc29uLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDAgJiBhZ2VpID49IDE4ICYgYWdlaSA8PSA2MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwICYgYWdlaSA+PSAxOCAmIGFnZWkgPD0gNjBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBpbiBwcmlzb24gYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcG9ydGlvbiBpbiBwcmlzb24gXG4iKQoKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4obnJwcmlzb24sIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oeWVhciwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMCBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gInByb3BvcnRpb24gaW4gcHJpc29uIFxuIikKCiMgaGVhbHRoCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGRnaGVhbHRoLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDAgJiBhZ2VpIDw9IDkwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiBhZ2VpIDw9IDkwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gaW4gcG9vciBoZWFsdGggYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcG9ydGlvbiBpbiBwb29yIGhlYWx0aCBcbiIpCgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihkZ2hlYWx0aCwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwIF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gaW4gcG9vciBoZWFsdGggYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJwcm9wb3J0aW9uIGluIHBvb3IgaGVhbHRoIG4gXG4iKQoKIyBvcmdbLCBtYXgoYWdlaSksIC4oaWQsIG1hbGUpXVssIG1lYW4oVjEpLCBtYWxlXQojIG9yZ1ssIG1lYW4oZGVhdGgpLCBtYWxlXQojIHRhYmxlKG9yZ1ttYWxlID09IDAsIC4ocnByaXNvbiwgZGllZCldKSAjIDI1MAojIHRhYmxlKG9yZ1ttYWxlID09IDEsIGRpZWRdKSAjIDQwMAoKIyAjIGpvYgojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGpvYiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLihhZ2VpLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJqb2IgYnkgYWdlIiwgeCA9ICJcbmFnZSIsIHkgPSAicHJvcCBqb2JcbiIpCiMgCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oam9iLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIHllYXIgJWluJSB5ZWFyc10sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gImpvYiBieSBhZ2UiLCB4ID0gIlxueWVhciIsIHkgPSAieWVhcnMgb2YgZWR1Y2F0aW9uIGNlbnRlcmVkXG4iKQojIAojIAojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGhlYWx0aHcsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwICYgYWdlaSA+PTE4ICYgYWdlaSA8IDYwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIFxuIikKIyAKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihoZWFsdGh3LCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggYnkgeWVhciIsIHggPSAiXG55ZWFyIiwgeSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIFxuIikKYGBgCgpgYGB7ciwgZWNobz1GQUxTRX0KIyByZWRlZmluZSBzb21lIHZhcmlhYmxlcwpsaW1wIDwtIGxvbmdbLmltcCAhPSAwXQpzZXRrZXkobGltcCwgLmltcCwgcGlkLCBzdGFydCkKCmxpbXBbLCBjcHJpc29uIDo9IGN1bXN1bShucnByaXNvbiksIAogICAgIGJ5ID0gLiguaW1wLCBwaWQpXVssIHByaXNvbiA6PSBpZmVsc2UoY3ByaXNvbiA+IDAsIDEsIDApXQoKIyB0YWJsZShsaW1wJHByaXNvbiwgdXNlTkEgPSAiaWZhbnkiKQpgYGAKCiMjIFdpdGhvdXQgU2FtcGxpbmcgV2VpZ2h0cwoKTm90IGluY2x1ZGluZyB0aGUgaGVhbHRoIGNvdmFyaWF0ZS4gCgojIyMgTW9kZWwgMTogU3RhbmRhcmQgTW9kZWwKCmBgYHtyLCBlY2hvID0gRkFMU0V9Cm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6MTApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgYWdlYyArIGZyYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluY19hZGpjICsgZWR1aWMsIGRhdGEgPSB0KQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHMpKQpgYGAKCiMjIyBNb2RlbCAyOiBNYXJnaW5hbCBTdHJ1Y3R1cmFsIE1vZGVsCgpgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWxzTVNNIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLCAKICAgICAgICAgICAgICBpZCA9IHBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gcHJpc29uLCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gIG1hbGUgKyBmcmFjZSArIGFnZWMsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+ICBtYWxlICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsCiAgICAgICAgICAgICAgaWQgPSBwaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB0Wywgd3QgOj0gdzEkaXB3LndlaWdodHMgKiB3MiRpcHcud2VpZ2h0c10KICAgICAgbW9kZWxzTVNNW1tpXV0gPC0gY294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5jX2FkamMgKyBlZHVpYyArIGNsdXN0ZXIocGlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyA9IHQkd3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSB0KQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHNNU00pKQpgYGAKCgojIyBXaXRoIFNhbXBsaW5nIFdlaWdodHMKCiMjIyBNb2RlbCAzOiBTdGFuZGFyZCBtb2RlbAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KbW9kZWxzIDwtIGxpc3QoKQpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9uCiAgICAgICNwcmludChwYXN0ZTAoIjo6Ojo6Ojo6IHJ1bm5pbmcgbW9kZWwgZm9yIGltcHV0YXRpb24gIiwgaSkpCiAgICAgIHQgPC0gbGltcFsuaW1wID09IGldCiAgICAgIGRzIDwtIHN2eWRlc2lnbihpZD1+Y2x1c3Rlciwgd2VpZ2h0cz1+Znd0LCAKICAgICAgICAgICAgICAgICAgICAgIHN0cmF0YT1+c3RyYXR1bSwgZGF0YSA9IHQsIG5lc3QgPSBUUlVFKQogICAgICBtb2RlbHNbW2ldXSA8LSBzdnljb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgYWdlYyArIGZyYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluY19hZGpjICsgZWR1aWMsIGRhdGEgPSB0LCBkZXNpZ24gPSBkcykKCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVscykpCmBgYAoKIyMjIE1vZGVsIDQ6IE1hcmdpbmFsIHN0cnVjdHVyYWwgbW9kZWwKCmBgYHtyLCBlY2hvID0gRkFMU0V9Cgptb2RlbHNNU00gPC0gbGlzdCgpCgpmb3IgKGkgaW4gMToxMCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLCAKICAgICAgICAgICAgICBpZCA9IHBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gcHJpc29uLCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gIG1hbGUgKyBmcmFjZSArIGFnZWMsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+ICBtYWxlICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsCiAgICAgICAgICAgICAgaWQgPSBwaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB0Wywgbnd0IDo9IGZ3dCAqIHcxJGlwdy53ZWlnaHRzICogdzIkaXB3LndlaWdodHNdCiAgICAgIGRzIDwtIHN2eWRlc2lnbihpZD1+Y2x1c3Rlciwgd2VpZ2h0cz1+bnd0LCBzdHJhdGE9fnN0cmF0dW0sIGRhdGEgPSB0LCBuZXN0ID0gVFJVRSkKICAgICAgbW9kZWxzTVNNW1tpXV0gPC0gc3Z5Y294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFsZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsIGRlc2lnbiA9IGRzKQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHNNU00pKQpgYGAKCgoK