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 and prison 95 variable, and examine an initial imputation model.

The variables I consider are:

In this example, I only use data until 2013 based on the PSID file version 2015 (some deaths were updated retrospectively).

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 52131. During that period 6480 people died. The median age of death was 70.

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 23348  3113
     1    53     2

, , male = 1

      death
prison     0     1
     0 21743  3318
     1   507    47
# 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.6074814
# 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.2830249

Just to get an idea of the missing data:

countmis(org)
 dghealth     eduic linc_adjc  nrprison     frace 
    0.381     0.134     0.081     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.

Using only non-response incarceration variable

Without Sampling Weights

Not including the health covariate, although I we should include it.

Model 1: Standard Model

Multiple imputation results:
      MIcombine.default(models)
               results          se      (lower      upper) missInfo
prison      0.50449028 0.325369393 -0.20183178  1.21081233     87 %
male        0.44423135 0.025623745  0.39400187  0.49446083      3 %
agec        0.07324287 0.001016449  0.07121386  0.07527189     39 %
fraceblack  0.33469254 0.029550290  0.27669615  0.39268893     10 %
fraceother -0.45199972 0.073862484 -0.59676759 -0.30723184      0 %
linc_adjc  -0.06484816 0.025370244 -0.11944609 -0.01025024     84 %
eduic      -0.04708562 0.005388101 -0.05799767 -0.03617356     51 %

Model 2: Marginal Structural Model

Multiple imputation results:
      MIcombine.default(modelsMSM)
               results          se      (lower      upper) missInfo
prison      0.44663124 0.435119989 -0.47857893  1.37184141     79 %
male        0.44380861 0.026786933  0.39126728  0.49634994      8 %
agec        0.07288358 0.001150527  0.07060020  0.07516697     32 %
fraceblack  0.32723729 0.033011593  0.26241231  0.39206226     12 %
fraceother -0.44207346 0.069589427 -0.57846678 -0.30568013      1 %
linc_adjc  -0.06345267 0.024096883 -0.11507379 -0.01183154     82 %
eduic      -0.04706311 0.005353996 -0.05789591 -0.03623032     51 %

With Sampling Weights

Model 3: Standard model

Multiple imputation results:
      MIcombine.default(models)
               results          se     (lower      upper) missInfo
prison      0.58334551 0.514293790 -0.5275316  1.69422264     85 %
male        0.44201707 0.033492235  0.3763610  0.50767315      4 %
agec        0.07996609 0.001619344  0.0767617  0.08317048     28 %
fraceblack  0.23120207 0.061401438  0.1107980  0.35160609      6 %
fraceother -0.55904430 0.085004437 -0.7256502 -0.39243836      0 %
linc_adjc  -0.07383975 0.039641821 -0.1605515  0.01287200     90 %
eduic      -0.05267090 0.006137095 -0.0649848 -0.04035701     44 %

Model 4: Marginal structural model

Multiple imputation results:
      MIcombine.default(modelsMSM)
               results          se      (lower      upper) missInfo
prison      0.56651736 0.558569848 -0.63152350  1.76455822     83 %
male        0.44141862 0.034469556  0.37382071  0.50901653      7 %
agec        0.07967245 0.001648832  0.07640722  0.08293769     29 %
fraceblack  0.22037035 0.065652331  0.09148574  0.34925495     11 %
fraceother -0.54363578 0.086378586 -0.71294322 -0.37432835      2 %
linc_adjc  -0.07176570 0.038563308 -0.15588229  0.01235089     89 %
eduic      -0.05256326 0.005950793 -0.06447839 -0.04064814     42 %

Non-response prison + incarceration 1995

In this case, I remove all deaths before 1995!

Model 5: Standard Model

Multiple imputation results:
      MIcombine.default(models)
               results          se      (lower      upper) missInfo
gprison     0.64052978 0.242807819  0.12130790  1.15975166     81 %
male        0.42268377 0.038996205  0.34624892  0.49911863      2 %
agec        0.07529019 0.001633397  0.07205602  0.07852437     29 %
fraceblack  0.39753298 0.043833436  0.31160247  0.48346349      4 %
fraceother  0.02585309 0.106274285 -0.18244399  0.23415017      1 %
linc_adjc  -0.07468578 0.020877355 -0.11699102 -0.03238053     52 %
eduic      -0.03999517 0.008909112 -0.05811509 -0.02187525     55 %

Model 6: Marginal Structural Model

Multiple imputation results:
      MIcombine.default(modelsMSM)
               results          se      (lower      upper) missInfo
gprison     0.56192258 0.306621262 -0.07544905  1.19929422     68 %
male        0.42373299 0.041168154  0.34302278  0.50444320      5 %
agec        0.07415664 0.002341772  0.06951581  0.07879747     30 %
fraceblack  0.37409467 0.050721630  0.27459259  0.47359675      8 %
fraceother  0.07453221 0.104858238 -0.13100468  0.28006910      3 %
linc_adjc  -0.07285328 0.020870104 -0.11488709 -0.03081948     47 %
eduic      -0.03979432 0.008899276 -0.05785903 -0.02172961     53 %

With Sampling Weights

Model 7: Standard model

Multiple imputation results:
      MIcombine.default(models)
               results          se      (lower      upper) missInfo
gprison     0.80701206 0.431891655 -0.10092007  1.71494418     74 %
male        0.42501641 0.050093581  0.32683372  0.52319910      1 %
agec        0.08664328 0.002657066  0.08142206  0.09186451     14 %
fraceblack  0.30190237 0.097293633  0.11119150  0.49261325      3 %
fraceother -0.09813854 0.122422394 -0.33808281  0.14180572      0 %
linc_adjc  -0.07299860 0.028575888 -0.13140397 -0.01459323     58 %
eduic      -0.04981319 0.009807579 -0.06942035 -0.03020602     40 %

Model 8: Marginal structural model

Multiple imputation results:
      MIcombine.default(modelsMSM)
               results          se      (lower      upper) missInfo
gprison     0.76419857 0.481624582 -0.23953745  1.76793458     69 %
male        0.43064874 0.050652181  0.33135827  0.52993921      3 %
agec        0.08553634 0.002835551  0.07994048  0.09113220     23 %
fraceblack  0.28172130 0.103282716  0.07892054  0.48452207     12 %
fraceother -0.03931306 0.122611811 -0.27963703  0.20101092      2 %
linc_adjc  -0.06777670 0.028033970 -0.12487795 -0.01067544     56 %
eduic      -0.04972695 0.009554634 -0.06883532 -0.03061857     40 %
LS0tCnRpdGxlOiAiSW5jYXJjZXJhdGlvbiBFZmZlY3Qgb24gTW9ydGFsaXR5IFBTSUQgKyBJbXB1dGF0aW9uIE1vZGVsICsgV2VpZ2h0cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKU2ltaWxhciBleGVyY2lzZSwgdGhpcyB0aW1lIHVzaW5nIFBTSUQgd2VpZ2h0cy4gVGhpcyBpcyB0aGUgcHJvY2VkdXJlIHRvIGRlZmluZSBpbmRpdmlkdWFsIHdlaWdodHMuIAoKRnJvbSBhcm91bmQgNzAsMDAwIGluZGl2aWR1YWwgcmVjb3JkcywgSSBzYXZlIGxvbmdpdHVkaW5hbCB3ZWlnaHRzLiBJIGRlZmluZSBvdXIgYW5hbHl0aWNhbCBzYW1wbGUgYW5kIGNvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IHdlaWdodCAoaS5lLiwgdGhlIG9uZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHBlcmlvZCBvZiBvYnNlcnZhdGlvbiBmb3IgaW5kaXZpZHVhbCAkaSQpLiBJZiB0aGUgaW5kaXZpZHVhbCAkaSQgZG9lc24ndCBoYXZlIGFueSB3ZWlnaHQsIEkgZ2V0IHdlaWdodHMgZnJvbSBtZW1iZXIgb2YgdGhlIGZhbWlseSB1bml0ICR1JCBhdCB0aW1lICR0JCwgY29tcHV0ZSB0aGUgYXZlcmFnZSBhbmQgdXNlIGl0IGZvciBpbmRpdmlkdWFsICRpJC4gVXNpbmcgdGhpcyBwcm9jZWR1cmUgSSBvbmx5IGxvc3QgNDAwIGluZGl2aWR1YWxzLiAKCkl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBub24tc2FtcGxlIG1lbWJlcnMgKHRoYXQgaXMsIGFsbCBvZiB0aGUgb25lcyBkb24ndCBoYXZlIHNhbXBsaW5nIHdlaWdodHMpIGRvbid0IGhhdmUgcHJvYmFiaWxpdHkgb2Ygc2VsZWN0aW9uLgoKIEkgZ2V0IGVzdGltYXRlcyBvZiB0aGUgZWZmZWN0IG9mIGluY2FyY2VyYXRpb24gb24gbW9ydGFsaXR5LCB3aGVyZSBpbmNhcmNlcmF0aW9uIGlzIGJhc2VkIG9uIHRoZSBub24tcmVzcG9uc2UgYW5kIHByaXNvbiA5NSB2YXJpYWJsZSwgYW5kIGV4YW1pbmUgYW4gaW5pdGlhbCBpbXB1dGF0aW9uIG1vZGVsLiAKClRoZSB2YXJpYWJsZXMgSSBjb25zaWRlciBhcmU6IAoKLSBHZW5kZXIgKEkpCi0gQWdlIChJKQotIFJhY2UgKEkpCi0gSW5jb21lIChWKQotIEVkdWNhdGlvbiAoVikKLSBQb29yIGhlYWx0aCAoVikKLSBJbmNhcmNlcmF0aW9uIC8gbm9uLXJlc3BvbnNlIChWKSAxOTk1IHF1ZXN0aW9uIChJKQoKSW4gdGhpcyBleGFtcGxlLCBJIG9ubHkgdXNlIGRhdGEgdW50aWwgMjAxMyBiYXNlZCBvbiB0aGUgUFNJRCBmaWxlIHZlcnNpb24gMjAxNSAoc29tZSBkZWF0aHMgd2VyZSB1cGRhdGVkIHJldHJvc3BlY3RpdmVseSkuCgpgYGB7ciBzZXR1cH0Ka25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnVXNlcnMvc2RhemEvR29vZ2xlIERyaXZlLzAxUHJvamVjdHMvMDFJbmNhcmNlcmF0aW9uSGVhbHRoLycpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CgpybShsaXN0PWxzKGFsbD1UUlVFKSkKbGlicmFyeShzZGF6YXIpCmxpYnJhcnkobGF0dGljZSkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHN1cnZleSkKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShpcHcpCmxpYnJhcnkodGV4cmVnKQoKbG9hZCgiL1VzZXJzL3NkYXphL0dvb2dsZSBEcml2ZS8wMVByb2plY3RzLzAxSW5jYXJjZXJhdGlvbkhlYWx0aC8wNVJlc2VhcmNoL3NkYXphL291dHB1dC9yZGF0YS9wc2lkL2ltcDMuUmRhdGEiKQoKIyBnZXQgZGF0YQpsb25nIDwtIGRhdGEudGFibGUoY29tcGxldGUoaW1wMywgImxvbmciLCBpbmMgPSBUUlVFKSkKIyBnZXQgbnVtYmVyIG9mIGltcHV0YXRpb25zCm51bWltcCA8LSBtYXgobG9uZ1ssIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKC5pbXApKV0pCmV4aSA8LSBkYXRhLnRhYmxlKGNvbXBsZXRlKGltcDMsIDEpKQpvcmcgPC0gZGF0YS50YWJsZShjb21wbGV0ZShpbXAzLCAwKSkKCnRhYmxlKGxvbmckcHJpc29uOTUsIHVzZU5BID0gImlmYW55IikKdGFibGUobG9uZyR5ZWFyKQpgYGAKCkkgY29uc2lkZXIgcmVjb3JkcyBzaW5jZSAxOTY4IGFuZCByZXNwb25kZW50cyAxOCB5ZWFycyBvbGQgb3IgbW9yZSwgdGhhdCBpcywgYSBzYW1wbGUgb2YgYHIgbGVuZ3RoKHVuaXF1ZShvcmckcGlkKSlgLiBEdXJpbmcgdGhhdCBwZXJpb2QgYHIgc3VtKG9yZ1ssIGRpZWRdKWAgcGVvcGxlIGRpZWQuIFRoZSBtZWRpYW4gYWdlIG9mIGRlYXRoIHdhcyBgciByb3VuZChtZWRpYW4ob3JnW2RpZWQgPT0gMSwgYWdlaV0pLCAyKWAuCgpEaWZmZXJlbmNlcyBieSBnZW5kZXIuIFRoZSBvZGRzIHJhdGlvcyBhcmUgbG93ZXIgdGhhbiAxLCB0aW1pbmcgaXMgaW1wb3J0YW50LCBub3QganVzdCBwcm9wb3J0aW9ucyEgCgpgYGB7ciwgZWNobyA9IFRSVUV9CiMgZXhwbG9yZSBkaWZmZXJlbmNlcyBieSBnZW5kZXIKeCA8LSBvcmdbLCAuKG1hbGUgPSBtYXgobWFsZSwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICBwcmlzb24gPSBtYXgobnJwcmlzb24sIG5hLnJtID0gVFJVRSksIAogICAgICAgICAgICAgZGVhdGggPSBtYXgoZGllZCwgbmEucm0gPSBUUlVFKSwgCiAgICAgICAgICAgICBhZ2UgPSBtYXgoYWdlaSwgbmEucm0gPSBUUlVFKSksIHBpZF0KIyB0aGVzZSBudW1iZXJzIGFyZSBkaWZmZXJlbnQgYmVjYXVzZSBvZiBhZ2UgPj0gMTgKdGFibGUoeFssIC4ocHJpc29uLCBkZWF0aCwgbWFsZSldKSAjIHZlcnkgc21hbGwgc2FtcGxlIHNpemVzIGZvciB3b21lbgoKIyBvZGRzIHJhdGlvIG1hbGUKYSA8LSB0YWJsZSh4W21hbGUgPT0gMSwgLihwcmlzb24sIGRlYXRoKV0pCihhWzIsMl0qYVsxLDFdKSAvIChhWzIsMV0qYVsxLDJdKSAjIGl0J3Mgbm90IGhpZ2hlciB0aGFuIDEsIHRpbWluZyBtaWdodCBiZSBtb3JlIGltcG9ydGFudCByYXRoZXIgdGhhbiBkeWluZyBvciBub3QKCiMgb2RkIHJhdGlvcyBmZW1hbGUKYiA8LSB0YWJsZSh4W21hbGUgPT0gMCwgLihwcmlzb24sIGRlYXRoKV0pIAooYlsyLDJdKmJbMSwxXSkgLyAoYlsyLDFdKmJbMSwyXSkgIyBldmVuIApgYGAKCkp1c3QgdG8gZ2V0IGFuIGlkZWEgb2YgdGhlIG1pc3NpbmcgZGF0YTogCgpgYGB7cn0KY291bnRtaXMob3JnKQpgYGAKClRoZSBoaWdoZXN0IHByb3BvcnRpb24gb2YgbWlzc2luZyBjYXNlcyBpcyBoZWFsdGggYW5kIGVkdWNhdGlvbi4gSSBkZWZpbmVkIGltcHV0YXRpb24gbXVsdGl2ZWwgbW9kZWxzLCB3aGVyZSBJIHVzZSBib3RoIHRpbWUgaW52YXJpYW50IGFuZCB2YXJpYW50IHZhcmlhYmxlcywgYWdlIGFuZCB5ZWFyLiBKdXN0IHRvIHByb3ZpZGUgYW4gZXhhbXBsZSwgdGhlIGluY29tZSBpbXB1dGF0aW9uIG1vZGVsIGlzOiAKCiAgICAgICAgICAgICAgIAokJGluY29tZSA9IFxhbHBoYSArIHllYXIgKyBhZ2UgKyBlZHUgKyBwcmlzb24gIFxcCisgaGVhbHRoICsgZHJvcG91dCArIGRlYXRoICsgXGRlbHRhX3IgKyBcZXBzaWxvbl9pICQkCgpEZWF0aCBhbmQgZHJvcG91dCBhcmUgdGltZS1pbnZhcmlhbnQgdmFyaWFibGVzLiBGb3IgdGhpcyBleGVyY2lzZSwgSSBnZW5lcmF0ZWQgMjAgaW1wdXRhdGlvbnMuIEZpbmFsIHZlcnNpb25zIG9mIHRoaXMgZXhlcmNpc2Ugc2hvdWxkIHVzZSBtb3JlIGl0ZXJhdGlvbnMgYW5kIGltcHV0YXRpb25zIChlLmcuLCAzMCBpdGVyYXRpb25zLCA2MCBpbXB1dGF0aW9ucykuIEFueXdheXMgbWl4aW5nIGRvZXNuJ3QgbG9vayB0aGF0IGJhZC4gSW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIGltcHV0YXRpb25zIGluY3JlYXNlcyBzdGFuZGFyZCBlcnJvcnMuLi4gc28gd2UgaGF2ZSBhIHRyYWRlLW9mZiBoZXJlLiAKCmBgYHtyLCBlY2hvPUZBTFNFfQpwbG90KGltcDMpCmBgYAoKVGhlbiwgSSBleGFtaW5lIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGltcHV0ZWQgdmFyaWFibGVzIGJ5IGFnZSBhbmQgeWVhci4gV2VpcmQgcGF0dGVybiBvZiB0aGUgaW5jYXJjZXJhdGlvbiB2YXJpYWJsZSBieSB5ZWFyLCBzdGlsbCB3YWl0aW5nIHRoZSByZXBseSBvZiB0aGUgUFNJRCBzdGFmZi4gSGVhbHRoIGlzIGFsc28gd2VpcmQsIEkgd291bGRuJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUuIAoKYGBge3IsIGVjaG89RkFMU0V9CiMgaW5jb21lCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGxpbmNfYWRqYywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLihhZ2VpLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwICYgYWdlaSA+PSAxOCAmIGFnZWkgPD0gOTBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPj0xOCAmIGFnZWkgPD0gOTBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiaW5jb21lIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gImxuIGluY29tZSBjZW50ZXJlZFxuIikKCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGxpbmNfYWRqYywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiaW5jb21lIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAibG4gaW5jb21lIGNlbnRlcmVkXG4iKQoKIyBwcmlzb24KdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4obnJwcmlzb24sIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMCAmIGFnZWkgPj0gMTggJiBhZ2VpIDw9IDYwXSwgYWVzKHggPSBhZ2VpLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiBhZ2VpID49IDE4ICYgYWdlaSA8PSA2MF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wb3J0aW9uIGluIHByaXNvbiBcbiIpCgp0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihucnByaXNvbiwgbmEucm0gPSBUUlVFKSksIGJ5ID0gLih5ZWFyLCAuaW1wKV0KZ2dwbG90KHRlbXBbLmltcCAhPSAwIF0sIGFlcyh4ID0geWVhciwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwogIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gInByb3BvcnRpb24gaW4gcHJpc29uIGJ5IHllYXIiLCB4ID0gIlxueWVhciIsIHkgPSAicHJvcG9ydGlvbiBpbiBwcmlzb24gXG4iKQoKIyBoZWFsdGgKdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oZGdoZWFsdGgsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oYWdlaSwgLmltcCldCmdncGxvdCh0ZW1wWy5pbXAgIT0gMCAmIGFnZWkgPD0gOTBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwogZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwogZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMCAmIGFnZWkgPD0gOTBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBpbiBwb29yIGhlYWx0aCBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wb3J0aW9uIGluIHBvb3IgaGVhbHRoIFxuIikKCnRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGRnaGVhbHRoLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKHllYXIsIC5pbXApXQpnZ3Bsb3QodGVtcFsuaW1wICE9IDAgXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDBdLCBhZXMoeCA9IHllYXIsIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBpbiBwb29yIGhlYWx0aCBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gInByb3BvcnRpb24gaW4gcG9vciBoZWFsdGggbiBcbiIpCgojIG9yZ1ssIG1heChhZ2VpKSwgLihpZCwgbWFsZSldWywgbWVhbihWMSksIG1hbGVdCiMgb3JnWywgbWVhbihkZWF0aCksIG1hbGVdCiMgdGFibGUob3JnW21hbGUgPT0gMCwgLihycHJpc29uLCBkaWVkKV0pICMgMjUwCiMgdGFibGUob3JnW21hbGUgPT0gMSwgZGllZF0pICMgNDAwCgojICMgam9iCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oam9iLCBuYS5ybSA9IFRSVUUpKSwgYnkgPSAuKGFnZWksIC5pbXApXQojIGdncGxvdCh0ZW1wWy5pbXAgIT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyLCBncm91cCA9IC5pbXApKSArCiMgIGdlb21fbGluZShjb2xvdXIgPSAiZ3JheSIpICsKIyAgZ2VvbV9saW5lKGRhdGEgPSB0ZW1wWy5pbXAgPT0gMF0sIGFlcyh4ID0gYWdlaSwgeSA9IG15dmFyKSwgY29sb3VyID0gInJlZCIpICsKIyAgIHRoZW1lX2J3KCkgKyBsYWJzKHRpdGxlID0gImpvYiBieSBhZ2UiLCB4ID0gIlxuYWdlIiwgeSA9ICJwcm9wIGpvYlxuIikKIyAKIyB0ZW1wIDwtIGxvbmdbLCBsaXN0KG15dmFyID0gbWVhbihqb2IsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oeWVhciwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwICYgeWVhciAlaW4lIHllYXJzXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAiam9iIGJ5IGFnZSIsIHggPSAiXG55ZWFyIiwgeSA9ICJ5ZWFycyBvZiBlZHVjYXRpb24gY2VudGVyZWRcbiIpCiMgCiMgCiMgdGVtcCA8LSBsb25nWywgbGlzdChteXZhciA9IG1lYW4oaGVhbHRodywgbmEucm0gPSBUUlVFKSksIGJ5ID0gLihhZ2VpLCAuaW1wKV0KIyBnZ3Bsb3QodGVtcFsuaW1wICE9IDBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciwgZ3JvdXAgPSAuaW1wKSkgKwojICBnZW9tX2xpbmUoY29sb3VyID0gImdyYXkiKSArCiMgIGdlb21fbGluZShkYXRhID0gdGVtcFsuaW1wID09IDAgJiBhZ2VpID49MTggJiBhZ2VpIDwgNjBdLCBhZXMoeCA9IGFnZWksIHkgPSBteXZhciksIGNvbG91ciA9ICJyZWQiKSArCiMgICB0aGVtZV9idygpICsgbGFicyh0aXRsZSA9ICJwcm9wb3J0aW9uIHBvb3IgaGVhbHRoIGJ5IGFnZSIsIHggPSAiXG5hZ2UiLCB5ID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggXG4iKQojIAojIHRlbXAgPC0gbG9uZ1ssIGxpc3QobXl2YXIgPSBtZWFuKGhlYWx0aHcsIG5hLnJtID0gVFJVRSkpLCBieSA9IC4oeWVhciwgLmltcCldCiMgZ2dwbG90KHRlbXBbLmltcCAhPSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIsIGdyb3VwID0gLmltcCkpICsKIyAgZ2VvbV9saW5lKGNvbG91ciA9ICJncmF5IikgKwojICBnZW9tX2xpbmUoZGF0YSA9IHRlbXBbLmltcCA9PSAwXSwgYWVzKHggPSB5ZWFyLCB5ID0gbXl2YXIpLCBjb2xvdXIgPSAicmVkIikgKwojICAgdGhlbWVfYncoKSArIGxhYnModGl0bGUgPSAicHJvcG9ydGlvbiBwb29yIGhlYWx0aCBieSB5ZWFyIiwgeCA9ICJcbnllYXIiLCB5ID0gInByb3BvcnRpb24gcG9vciBoZWFsdGggXG4iKQpgYGAKCmBgYHtyLCBlY2hvPUZBTFNFfQojIHJlZGVmaW5lIHNvbWUgdmFyaWFibGVzCmxpbXAgPC0gbG9uZ1suaW1wICE9IDBdCmxlbmd0aCh1bmlxdWUobGltcCRwaWQpKQoKc2V0a2V5KGxpbXAsIC5pbXAsIHBpZCwgc3RhcnQpCgpsaW1wWywgY3ByaXNvbiA6PSBjdW1zdW0obnJwcmlzb24pLCAKICAgICBieSA9IC4oLmltcCwgcGlkKV1bLCBwcmlzb24gOj0gaWZlbHNlKGNwcmlzb24gPiAwLCAxLCAwKV0KCm5hbWVzKGxpbXApCmxpbXBbLCBncHJpc29uIDo9IHBtYXgocHJpc29uLCBwcmlzb245NSldCnRhYmxlKGxpbXAkcHJpc29uKQoKIyBzZWxlY3Qgb25seSBwZW9wbGUgd2hvIGRpZWQgYWZ0ZXIgMTk5NQppZHMgPC0gdW5pcXVlKGxpbXBbZGllZCA9PSAxICYgeWVhciA8IDE5OTUsIHBpZF0pCmxlbmd0aChpZHMpCmxpbXA5NSA8LSBsaW1wWyFwaWQgJWluJSBpZHNdCiNsZW5ndGgodW5pcXVlKGxpbXA5NSRwaWQpKQojIHRhYmxlKGxpbXAkcHJpc29uLCB1c2VOQSA9ICJpZmFueSIpCmBgYAoKIyBVc2luZyBvbmx5IG5vbi1yZXNwb25zZSBpbmNhcmNlcmF0aW9uIHZhcmlhYmxlIAoKIyMgV2l0aG91dCBTYW1wbGluZyBXZWlnaHRzCgpOb3QgaW5jbHVkaW5nIHRoZSBoZWFsdGggY292YXJpYXRlLCBhbHRob3VnaCBJIHdlIHNob3VsZCBpbmNsdWRlIGl0LiAKCiMjIyBNb2RlbCAxOiBTdGFuZGFyZCBNb2RlbAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KbW9kZWxzIDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpudW1pbXApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbgogICAgICAjcHJpbnQocGFzdGUwKCI6Ojo6Ojo6OiBydW5uaW5nIG1vZGVsIGZvciBpbXB1dGF0aW9uICIsIGkpKQogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICBtb2RlbHNbW2ldXSA8LSBjb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBwcmlzb24gKyBtYWxlICsgYWdlYyArIGZyYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluY19hZGpjICsgZWR1aWMsIGRhdGEgPSB0KQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHMpKQpgYGAKCiMjIyBNb2RlbCAyOiBNYXJnaW5hbCBTdHJ1Y3R1cmFsIE1vZGVsCgpgYGB7ciwgZWNobz1GQUxTRX0KbW9kZWxzTVNNIDwtIGxpc3QoKQpmb3IgKGkgaW4gMTpudW1pbXApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbnMKICAgICAgdCA8LSBsaW1wWy5pbXAgPT0gaV0KICAgICAgdzEgPC0gaXB3dG0oZXhwb3N1cmUgPSBkcm9wb3V0LCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gbWFsZSArIGZyYWNlICsgYWdlYywKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gIHByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyBsaW5jX2FkamMgKyBlZHVpYywgCiAgICAgICAgICAgICAgaWQgPSBwaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB3MiA8LSBpcHd0bShleHBvc3VyZSA9IHByaXNvbiwgZmFtaWx5ID0gInN1cnZpdmFsIiwKICAgICAgICAgICAgICBudW1lcmF0b3IgPSB+ICBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLAogICAgICAgICAgICAgIGlkID0gcGlkLAogICAgICAgICAgICAgIHRzdGFydCA9IHN0YXJ0LCB0aW1ldmFyID0gc3RvcCwKICAgICAgICAgICAgICB0eXBlID0gImZpcnN0IiwKICAgICAgICAgICAgICBkYXRhID0gdCkKICAgICAgdFssIHd0IDo9IHcxJGlwdy53ZWlnaHRzICogdzIkaXB3LndlaWdodHNdCiAgICAgIG1vZGVsc01TTVtbaV1dIDwtIGNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IHByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluY19hZGpjICsgZWR1aWMgKyBjbHVzdGVyKHBpZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHMgPSB0JHd0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gdCkKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzTVNNKSkKYGBgCgoKIyMgV2l0aCBTYW1wbGluZyBXZWlnaHRzCgojIyMgTW9kZWwgMzogU3RhbmRhcmQgbW9kZWwKCmBgYHtyLCBlY2hvID0gRkFMU0V9Cm1vZGVscyA8LSBsaXN0KCkKZm9yIChpIGluIDE6bnVtaW1wKSB7ICMgbnVtYmVyIG9mIGltcHV0YXRpb24KICAgICAgI3ByaW50KHBhc3RlMCgiOjo6Ojo6OjogcnVubmluZyBtb2RlbCBmb3IgaW1wdXRhdGlvbiAiLCBpKSkKICAgICAgdCA8LSBsaW1wWy5pbXAgPT0gaV0KICAgICAgZHMgPC0gc3Z5ZGVzaWduKGlkPX5jbHVzdGVyLCB3ZWlnaHRzPX5md3QsIAogICAgICAgICAgICAgICAgICAgICAgc3RyYXRhPX5zdHJhdHVtLCBkYXRhID0gdCwgbmVzdCA9IFRSVUUpCiAgICAgIG1vZGVsc1tbaV1dIDwtIHN2eWNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IHByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5jX2FkamMgKyBlZHVpYywgZGF0YSA9IHQsIGRlc2lnbiA9IGRzKQoKfQoKc3VtbWFyeShtaXRvb2xzOjpNSWNvbWJpbmUobW9kZWxzKSkKYGBgCgojIyMgTW9kZWwgNDogTWFyZ2luYWwgc3RydWN0dXJhbCBtb2RlbAoKYGBge3IsIGVjaG8gPSBGQUxTRX0KCm1vZGVsc01TTSA8LSBsaXN0KCkKCmZvciAoaSBpbiAxOm51bWltcCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXBbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgcHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLCAKICAgICAgICAgICAgICBpZCA9IHBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gcHJpc29uLCBmYW1pbHkgPSAic3Vydml2YWwiLAogICAgICAgICAgICAgIG51bWVyYXRvciA9IH4gIG1hbGUgKyBmcmFjZSArIGFnZWMsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+ICBtYWxlICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsCiAgICAgICAgICAgICAgaWQgPSBwaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB0Wywgbnd0IDo9IGZ3dCAqIHcxJGlwdy53ZWlnaHRzICogdzIkaXB3LndlaWdodHNdCiAgICAgIGRzIDwtIHN2eWRlc2lnbihpZD1+Y2x1c3Rlciwgd2VpZ2h0cz1+bnd0LCBzdHJhdGE9fnN0cmF0dW0sIGRhdGEgPSB0LCBuZXN0ID0gVFJVRSkKICAgICAgbW9kZWxzTVNNW1tpXV0gPC0gc3Z5Y294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gcHJpc29uICsgbWFsZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsIGRlc2lnbiA9IGRzKQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHNNU00pKQpgYGAKCiMgTm9uLXJlc3BvbnNlIHByaXNvbiArIGluY2FyY2VyYXRpb24gMTk5NQoKSW4gdGhpcyBjYXNlLCBJIHJlbW92ZSBhbGwgZGVhdGhzIGJlZm9yZSAxOTk1IQoKIyMjIE1vZGVsIDU6IFN0YW5kYXJkIE1vZGVsCgpgYGB7ciwgZWNobyA9IEZBTFNFfQptb2RlbHMgPC0gbGlzdCgpCmZvciAoaSBpbiAxOm51bWltcCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9uCiAgICAgICNwcmludChwYXN0ZTAoIjo6Ojo6Ojo6IHJ1bm5pbmcgbW9kZWwgZm9yIGltcHV0YXRpb24gIiwgaSkpCiAgICAgIHQgPC0gbGltcDk1Wy5pbXAgPT0gaV0KICAgICAgbW9kZWxzW1tpXV0gPC0gY294cGgoIFN1cnYoc3RhcnQsIHN0b3AsIGRpZWQpIH4gZ3ByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsaW5jX2FkamMgKyBlZHVpYywgZGF0YSA9IHQpCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVscykpCmBgYAoKIyMjIE1vZGVsIDY6IE1hcmdpbmFsIFN0cnVjdHVyYWwgTW9kZWwKCmBgYHtyLCBlY2hvPUZBTFNFfQptb2RlbHNNU00gPC0gbGlzdCgpCmZvciAoaSBpbiAxOm51bWltcCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9ucwogICAgICB0IDwtIGxpbXA5NVsuaW1wID09IGldCiAgICAgIHcxIDwtIGlwd3RtKGV4cG9zdXJlID0gZHJvcG91dCwgZmFtaWx5ID0gInN1cnZpdmFsIiwKICAgICAgICAgICAgICBudW1lcmF0b3IgPSB+IG1hbGUgKyBmcmFjZSArIGFnZWMsCiAgICAgICAgICAgICAgZGVub21pbmF0b3IgPSB+ICBncHJpc29uICsgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLCAKICAgICAgICAgICAgICBpZCA9IHBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHcyIDwtIGlwd3RtKGV4cG9zdXJlID0gZ3ByaXNvbiwgZmFtaWx5ID0gInN1cnZpdmFsIiwKICAgICAgICAgICAgICBudW1lcmF0b3IgPSB+ICBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgbWFsZSArIGFnZWMgKyBmcmFjZSArIGxpbmNfYWRqYyArIGVkdWljLAogICAgICAgICAgICAgIGlkID0gcGlkLAogICAgICAgICAgICAgIHRzdGFydCA9IHN0YXJ0LCB0aW1ldmFyID0gc3RvcCwKICAgICAgICAgICAgICB0eXBlID0gImZpcnN0IiwKICAgICAgICAgICAgICBkYXRhID0gdCkKICAgICAgdFssIHd0IDo9IHcxJGlwdy53ZWlnaHRzICogdzIkaXB3LndlaWdodHNdCiAgICAgIG1vZGVsc01TTVtbaV1dIDwtIGNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IGdwcmlzb24gKyBtYWxlICsgYWdlYyArIGZyYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmNfYWRqYyArIGVkdWljICsgY2x1c3RlcihwaWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzID0gdCR3dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHQpCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVsc01TTSkpCmBgYAoKCiMjIFdpdGggU2FtcGxpbmcgV2VpZ2h0cwoKIyMjIE1vZGVsIDc6IFN0YW5kYXJkIG1vZGVsCgpgYGB7ciwgZWNobyA9IEZBTFNFfQptb2RlbHMgPC0gbGlzdCgpCmZvciAoaSBpbiAxOm51bWltcCkgeyAjIG51bWJlciBvZiBpbXB1dGF0aW9uCiAgICAgICNwcmludChwYXN0ZTAoIjo6Ojo6Ojo6IHJ1bm5pbmcgbW9kZWwgZm9yIGltcHV0YXRpb24gIiwgaSkpCiAgICAgIHQgPC0gbGltcDk1Wy5pbXAgPT0gaV0KICAgICAgZHMgPC0gc3Z5ZGVzaWduKGlkPX5jbHVzdGVyLCB3ZWlnaHRzPX5md3QsIAogICAgICAgICAgICAgICAgICAgICAgc3RyYXRhPX5zdHJhdHVtLCBkYXRhID0gdCwgbmVzdCA9IFRSVUUpCiAgICAgIG1vZGVsc1tbaV1dIDwtIHN2eWNveHBoKCBTdXJ2KHN0YXJ0LCBzdG9wLCBkaWVkKSB+IGdwcmlzb24gKyBtYWxlICsgYWdlYyArIGZyYWNlICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbGluY19hZGpjICsgZWR1aWMsIGRhdGEgPSB0LCBkZXNpZ24gPSBkcykKCn0KCnN1bW1hcnkobWl0b29sczo6TUljb21iaW5lKG1vZGVscykpCmBgYAoKIyMjIE1vZGVsIDg6IE1hcmdpbmFsIHN0cnVjdHVyYWwgbW9kZWwKCmBgYHtyLCBlY2hvID0gRkFMU0V9Cgptb2RlbHNNU00gPC0gbGlzdCgpCgpmb3IgKGkgaW4gMTpudW1pbXApIHsgIyBudW1iZXIgb2YgaW1wdXRhdGlvbnMKICAgICAgdCA8LSBsaW1wOTVbLmltcCA9PSBpXQogICAgICB3MSA8LSBpcHd0bShleHBvc3VyZSA9IGRyb3BvdXQsIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiBtYWxlICsgZnJhY2UgKyBhZ2VjLAogICAgICAgICAgICAgIGRlbm9taW5hdG9yID0gfiAgZ3ByaXNvbiArIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyBsaW5jX2FkamMgKyBlZHVpYywgCiAgICAgICAgICAgICAgaWQgPSBwaWQsCiAgICAgICAgICAgICAgdHN0YXJ0ID0gc3RhcnQsIHRpbWV2YXIgPSBzdG9wLAogICAgICAgICAgICAgIHR5cGUgPSAiZmlyc3QiLAogICAgICAgICAgICAgIGRhdGEgPSB0KQogICAgICB3MiA8LSBpcHd0bShleHBvc3VyZSA9IGdwcmlzb24sIGZhbWlseSA9ICJzdXJ2aXZhbCIsCiAgICAgICAgICAgICAgbnVtZXJhdG9yID0gfiAgbWFsZSArIGZyYWNlICsgYWdlYywKICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IH4gIG1hbGUgKyBhZ2VjICsgZnJhY2UgKyBsaW5jX2FkamMgKyBlZHVpYywKICAgICAgICAgICAgICBpZCA9IHBpZCwKICAgICAgICAgICAgICB0c3RhcnQgPSBzdGFydCwgdGltZXZhciA9IHN0b3AsCiAgICAgICAgICAgICAgdHlwZSA9ICJmaXJzdCIsCiAgICAgICAgICAgICAgZGF0YSA9IHQpCiAgICAgIHRbLCBud3QgOj0gZnd0ICogdzEkaXB3LndlaWdodHMgKiB3MiRpcHcud2VpZ2h0c10KICAgICAgZHMgPC0gc3Z5ZGVzaWduKGlkPX5jbHVzdGVyLCB3ZWlnaHRzPX5ud3QsIHN0cmF0YT1+c3RyYXR1bSwgZGF0YSA9IHQsIG5lc3QgPSBUUlVFKQogICAgICBtb2RlbHNNU01bW2ldXSA8LSBzdnljb3hwaCggU3VydihzdGFydCwgc3RvcCwgZGllZCkgfiBncHJpc29uICsgbWFsZSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWdlYyArIGZyYWNlICsgbGluY19hZGpjICsgZWR1aWMsIGRlc2lnbiA9IGRzKQp9CgpzdW1tYXJ5KG1pdG9vbHM6Ok1JY29tYmluZShtb2RlbHNNU00pKQpgYGAKCgo=