Supplemental methods

Text S1: Linear mixed models

We compared the results of the paired mean difference analysis approach discussed in the main text with a linear mixed modeling framework. For the first set of models we set \(\Delta\)14C-CO2 observed in the second enclosure period as the response variable, and used sample ID as a random intercept term to account for the imbalance in the number of laboratory replicates analyzed for control versus treatment incubations. For fixed effects, we assessed the interaction of ecosystem type with treatment, as well as the three-way interaction of treament, ecosystem type, and experiment for the combine dataset of Experiment 1 and Experiment 2 samples (Eq. S1). We evaluated the significance of the treatment effect by looking at the contrasts between control and treatment samples across experiments but within ecosystem types. These models were also run for \(\delta\)13C-CO2.

We also used the linear mixed modeling framework to assess changes in \(\Delta\)14C-CO2 and \(\delta\)13C-CO2 between enclosure periods. For these models we extended our initial model by adding enclosure period as an additional dependent variable. These models were restricted to the experiments and treatments where we measured the response variable in both enclosure periods (Experiment 1 treatment samples, and all Experiment 2 samples). We looked at the overall significance of the paremeter estimates as well as the contrasts from this model by each experiment, treatment, and ecosystem type.

We tested the effect of storage duration on observed \(\Delta\)14C-CO2 using a combined dataset of Experiments 1 and Experiment 3 samples. We used \(\Delta\)14C-CO2 observed in the second enclosure period for all samples except the Experiment 3 treatment samples for which only a single enclosure period was observed. We constructed a linear mixed model with storage duration, treatment, and the interaction of these two variables as fixed effects. As with the previous models we allowed for a random intercept term for each sample. We did not include ecosystem type in this model as all of the grassland samples were collected at the same point in time. We also excluded the effect of experiment, since this could lead to a spurious relationship due to the change in \(\Delta\)14C of atmospheric CO2 over time and the fact that samples were collected and analyszed at different times. This model was run first with and then without the Oak Ridge samples, as we considered these samples to be a separate population as they contain 14C from a labelling experiment in addition to atmospheric 14C.

All statistical analyses were performed in R (R Core Team 2019). We used the package lme4 (Bates et al. 2015) to perform the mixed modeling, and for contrast analysis we used the package emmeans (Lenth 2021). When performing statistical tests we employed Tukey’s honestly significant difference test to account for multiple comparisons and the Kenward-Roger method for estimating degrees of freedom, which has shown to perform well for small sample sizes (Kenward and Roger 1997).

Linear Mixed Model (LMM) results

Table S1: LMM marginal means for enclosure period \(\Delta\)14C-CO2

Table S2: LMM marginal means for control and treatment \(\Delta\)14C-CO2 (2nd enclosure period only)

Table S3: Summary of storage duration LMM with Oak Ridge samples

Table S4: Summary of storage duration LMM without Oak Ridge samples

Text S2: Comparing differences in \(\Delta\)14C-CO2 across control and treatment samples for the Hainich-Dün time series

Contrast analysis of the LMM output shows that control-treatment differences are not significant for the forest samples, but are significant for the grassland samples in both Experiment 1 and Experiment 2 (first two columns of Fig. S1). While the results are similar to the paired difference approach used in the main text, the paired difference approach found both forest and grassland differences to be significant.

Comparing the differences observed over time when samples were treated the same at both timepoints (columns “∆/t Ctl” and “∆/t Trt”, Fig. S1), we see significant differences for both the samples that were never air-dried (“∆/t Ctl”) and the samples that were air-dried and rewet (“∆/t Trt”). Both differences are positive, i.e. \(\Delta\)14C-CO2 declined for both control and treatment samples over the period 2011 to 2019. However, we see that the difference over time appear smaller for the forest samples when comparing the difference between the treatment samples (26‰) to the difference between the control samples (49‰), although the confidence intervals overlap substantially. We believe this provides support for reliability of the archived technique when looking at changes in \(\Delta\)14C-CO2 over time across samples that have been air-dried and rewetted.

Finally, when comparing treatment samples that have never been air-dried (final two columns of figure), the estimated differences are skewed higher or are no longer significant. Specifically, we fail to detect a significant change in the grassland \(\Delta\)14C-CO2 over time when comparing control samples from 2011 to air-dried and rewet samples from 2019 (penultimate column, “∆/t Ex1 Ctl - Ex2 Trt”). Looked at the other way, i.e. treatment \(\Delta\)14C-CO2 from the 2011 grassland samples compared to control grassland samples in 2019, the difference is substantially exaggerated (last column): 58‰ vs. 27‰ (ctl-ctl) or 38‰ (trt-trt). The difference is also greater for forest samples for both of these cross-treatment comparisons. These differences imply it is important to treat the soils from all time points the same in regards to air-drying and rewetting when constructing a time series using \(\Delta\)14C-CO2 measured on archived soils in order to minimize bias.

Figure S1: 95% confidence intervals for LMM contrasts of Hainich-Dün forest time series data

Caption: Contrasts shown compare treatment and control samples within Experiments 1 and 2 (first two columns, respectively), control samples between 2011 and 2019 (third column), treatment samples between 2011 and 2019 (fourth column), control samples from Experiment 1 (2011) to treatment samples from Experiment 2 (2019) (fifth column), and treatment samples from Experiment 1 (2011) to control samples from Experiment 2 (2019) (sixth column).

Figure S2: 95% confidence intervals for LMM contrasts of Hainich-Dün forest time series

Caption: Alternate version of Fig. 5 in main text. Instead of pooled standard deviations, the error bars here show the 95% confidence intervals estimated from the linear mixed model.

Supplemental respiration rate results

Figure S3: Respiration rates for Experiment 1 and Experiment 2 (rewetting pulse respiration rates shown as a cumulative average for all samples)

Caption: CO2 concentrations for Experiment 1 control samples were only measured once during the pre-incubation period, in contrast to daily measurements for all other samples. Pre-incubation respiration rates are shown here calculated as cumulative averages for the whole pre-incubation period for ease of comparison across all treatments in both Experiment 1 and Experiment 2.

Figure S4: Respiration rates for Experiment 3

Caption: Experiment 3 storage duration treatment samples were only incubated for a single enclosure period, as the results of Experiment 1 and Experiment 2 showed no significant difference in \(\Delta\)14C-CO2 between the rewetting pulse CO2 released during the pre-incubation period and the CO2 respired during the second enclosure period. The grassland storage duration treatment samples (blue dotted line) respired an equivalent amount of CO2 in just 3 d as the corresponding control-3 samples respired during the rewetting pulse period and the second enclosure period combined. Consequently those incubations were stopped after the first CO2 measurement point.

Treatment effects on \(\delta\)13C-CO2

Fig. S5 \(\delta\)13C-CO2 of rewetting pulse and 2nd enclosure period

Caption: Points are means; error bars show the minimum and maximum of laboratory duplicates.

Fig. S6 Time series of control and treatment \(\delta\)13C-CO2 (Experiments 1 and 2)

Caption: Points are means; error bars show pooled standard deviations.

Additional factors influencing treatment effects on \(\Delta\)14C-CO2

Fig. S7 Change in \(\Delta\)14C-CO2 in relation to cumulative soil carbon respired

Caption: Error bars show minimum and maximum values measured for laboratory duplicates, while points show the mean. Lines connect mean pre-incubation and second enclosure period observations for a single sample. Lines parallel to the x-axis indicate a lack of trend in \(\Delta\)14C-CO2 with the amount of carbon respired, while differences between open and filled symbols show the impact of treatments on both the amount of carbon respired and \(\Delta\)14C-CO2. Note that pre-incubation \(\Delta\)14C-CO2 was not measured for the control-1 samples in 2011. Plot limits exclude outlier point (HEW22 control-2, pre-incubation) for improved legibility.

Text S3: Change in second enclosure period \(\Delta\)14C-CO2 as a function of field-moisture content

Differences in field moisture content of samples could be related to the magnitude of the shift in \(\Delta\)14C-CO2 observed between control and treatment sample, as control sample field moisture content varied. All treatment samples were air-dried in the laboratory prior to rewetting: a change in moisture content of zero percent water holding capacity (%WHC) to 60 %WHC. In contrast, moisture adjustment of control samples was made from field moisture, thus, for example, control samples with lower field moisture contents received a correspondingly greater water addition than wetter control samples.

In order to control for the variance in field moisture content of control samples, we looked at the relationship of the difference in the second enclosure period \(\Delta\)14C-CO2 observed between control and treatment samples and the change in moisture content of the control samples. If the shift in \(\Delta\)14C-CO2 observed in response to the air-drying and rewetting treatment were a linear function of the change in moisture content, the differences between control and treatment \(\Delta\)14C-CO2 should be smaller for samples with lower field moisture. However, we did not observe any consistent relationship between the difference in \(\Delta\)14C-CO2 and field moisture (Fig. S8).

We observed the strongest trend in the Experiment 2 grassland samples, but the trend was opposite to what we expected: differences in \(\Delta\)14C-CO2 between treatment samples and control samples were greater for drier samples than wetter samples (Fig. S8). Experiment 2 forest samples showed the expected trend, but it did not appear to be linear (Fig. S8). Given the relatively low sample number when considered within treatment and ecosystem groups (Experiment 1 n = 6, Experiment 2 n = 3), we do not consider these trends to be significant, but the data from Experiment 2 suggest that the relationship between the change in \(\Delta\)14C-CO2 and the magnitude of rewetting warrents further study.

Fig. S8 Change in \(\Delta\)14C-CO2 relative to the change in moisture content (control - treatment)

Caption: Differences in \(\Delta\)14C-CO2 are shown as means; error bars show pooled standard deviations. All samples were rewetted to 60% of water holding capacity (WHC) prior to incubation, but control samples were rewetted from field moisture whereas treatment samples were rewetted after air-drying. Data from Experiment 3 are not shown as field moisture content was unknown for the majority of samples (Table S5).

Site data, soil properties, and supporting references for all samples (Experiments 1, 2, and 3)

Table S5

References

Bates, Douglas, Martin Mächler, Ben Bolker, and Steve Walker. 2015. “Fitting Linear Mixed-Effects Models Using lme4.” Journal of Statistical Software 67 (1): 1–48. https://doi.org/10.18637/jss.v067.i01.

Kenward, Michael G., and James H. Roger. 1997. “Small Sample Inference for Fixed Effects from Restricted Maximum Likelihood.” Biometrics 53 (3). [Wiley, International Biometric Society]: 983–97. http://www.jstor.org/stable/2533558.

Lenth, Russell V. 2021. Emmeans: Estimated Marginal Means, Aka Least-Squares Means. https://CRAN.R-project.org/package=emmeans.

LS0tCnRpdGxlOiB8CiAgIVtdKGFndUxvZ28ucG5nKXt3aWR0aD0zLjVpbixoZWlnaHQ9MC42N2lufQpzdWJ0aXRsZTogfAogIHwgKkpHUiBCaW9nZW9zY2llbmNlcyoKICB8IAogIHwgU3VwcG9ydGluZyBJbmZvcm1hdGlvbiBmb3I6CiAgfCAKICB8ICoqSW1wYWN0cyBvZiBEcnlpbmcgYW5kIFJld2V0dGluZyBvbiB0aGUgUmFkaW9jYXJib24gU2lnbmF0dXJlIG9mIFJlc3BpcmVkIENPfjJ+IGFuZCBJbXBsaWNhdGlvbnMgZm9yIEluY3ViYXRpbmcgQXJjaGl2ZWQgU29pbHMqKgphdXRob3I6IAogIC0gSmVmZnJleSBCZWVtLU1pbGxlcl4xXgogIC0gTWFyaW9uIFNjaHJ1bXBmXjFeCiAgLSBBbGlzb24gSG95dF4xLDJeCiAgLSBHZW9yZyBHdWdnZW5iZXJnZXJeM14KICAtIFN1c2FuIFRydW1ib3JlXjEsNF4KZGF0ZTogJF4xJE1heCBQbGFuY2sgSW5zdGl0dXRlIGZvciBCaW9nZW9jaGVtaXN0cnksIEplbmEsIEdlcm1hbnkgXG5ld2xpbmUKICAgICAgJF4yJExhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYm9yYXRvcnksIEJlcmtlbGV5LCBDQSwgVVNBIFxuZXdsaW5lCiAgICAgICReMyRJbnN0aXR1dGUgb2YgU29pbCBTY2llbmNlLCBMZWlibml6IFVuaXZlcnNpdMOkdCBIYW5ub3ZlciwgSGFubm92ZXIsIEdlcm1hbnkgXG5ld2xpbmUKICAgICAgJF40JERlcGFydG1lbnQgb2YgRWFydGggU3lzdGVtIFNjaWVuY2VzLCBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIElydmluZSwgQ0EsIFVTQSBcbmV3bGluZQogICAgXG5ld2xpbmUgICAgCiAgICBcbmV3bGluZQogICAgXHRleHRpdHtcdG9kYXl9Cm91dHB1dDoKICBwZGZfZG9jdW1lbnQ6CiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDMKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAnMicKICBodG1sX25vdGVib29rOgogICAgY3NzOiAiY3VzdG9tLmNzcyIKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDIKYmlibGlvZ3JhcGh5OiBzaVJlZi5iaWIKaGVhZGVyX2luY2x1ZGVzOgotIFx1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQotIFx1c2VwYWNrYWdle2Zsb2F0fQotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9IGMoJ2NhaXJvX3BkZicsICdwbmcnKSwgZmlnLndpZHRoID0gNi41KQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShTb2lsUikKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShJU1JhRCkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoZ3QpCmBgYAojIyBTdXBwbGVtZW50YWwgbWV0aG9kcwoKIyMjIFRleHQgUzE6IExpbmVhciBtaXhlZCBtb2RlbHMKV2UgY29tcGFyZWQgdGhlIHJlc3VsdHMgb2YgdGhlIHBhaXJlZCBtZWFuIGRpZmZlcmVuY2UgYW5hbHlzaXMgYXBwcm9hY2ggZGlzY3Vzc2VkIGluIHRoZSBtYWluIHRleHQgd2l0aCBhIGxpbmVhciBtaXhlZCBtb2RlbGluZyBmcmFtZXdvcmsuIEZvciB0aGUgZmlyc3Qgc2V0IG9mIG1vZGVscyB3ZSBzZXQgJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBpbiB0aGUgc2Vjb25kIGVuY2xvc3VyZSBwZXJpb2QgYXMgdGhlIHJlc3BvbnNlIHZhcmlhYmxlLCBhbmQgdXNlZCBzYW1wbGUgSUQgYXMgYSByYW5kb20gaW50ZXJjZXB0IHRlcm0gdG8gYWNjb3VudCBmb3IgdGhlIGltYmFsYW5jZSBpbiB0aGUgbnVtYmVyIG9mIGxhYm9yYXRvcnkgcmVwbGljYXRlcyBhbmFseXplZCBmb3IgY29udHJvbCB2ZXJzdXMgdHJlYXRtZW50IGluY3ViYXRpb25zLiBGb3IgZml4ZWQgZWZmZWN0cywgd2UgYXNzZXNzZWQgdGhlIGludGVyYWN0aW9uIG9mIGVjb3N5c3RlbSB0eXBlIHdpdGggdHJlYXRtZW50LCBhcyB3ZWxsIGFzIHRoZSB0aHJlZS13YXkgaW50ZXJhY3Rpb24gb2YgdHJlYW1lbnQsIGVjb3N5c3RlbSB0eXBlLCBhbmQgZXhwZXJpbWVudCBmb3IgdGhlIGNvbWJpbmUgZGF0YXNldCBvZiBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzYW1wbGVzIChFcS4gUzEpLiBXZSBldmFsdWF0ZWQgdGhlIHNpZ25pZmljYW5jZSBvZiB0aGUgdHJlYXRtZW50IGVmZmVjdCBieSBsb29raW5nIGF0IHRoZSBjb250cmFzdHMgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBhY3Jvc3MgZXhwZXJpbWVudHMgYnV0IHdpdGhpbiBlY29zeXN0ZW0gdHlwZXMuIFRoZXNlIG1vZGVscyB3ZXJlIGFsc28gcnVuIGZvciAkXGRlbHRhJF4xM15DLUNPfjJ+LgoKV2UgYWxzbyB1c2VkIHRoZSBsaW5lYXIgbWl4ZWQgbW9kZWxpbmcgZnJhbWV3b3JrIHRvIGFzc2VzcyBjaGFuZ2VzIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYW5kICRcZGVsdGEkXjEzXkMtQ09+Mn4gYmV0d2VlbiBlbmNsb3N1cmUgcGVyaW9kcy4gRm9yIHRoZXNlIG1vZGVscyB3ZSBleHRlbmRlZCBvdXIgaW5pdGlhbCBtb2RlbCBieSBhZGRpbmcgZW5jbG9zdXJlIHBlcmlvZCBhcyBhbiBhZGRpdGlvbmFsIGRlcGVuZGVudCB2YXJpYWJsZS4gVGhlc2UgbW9kZWxzIHdlcmUgcmVzdHJpY3RlZCB0byB0aGUgZXhwZXJpbWVudHMgYW5kIHRyZWF0bWVudHMgd2hlcmUgd2UgbWVhc3VyZWQgdGhlIHJlc3BvbnNlIHZhcmlhYmxlIGluIGJvdGggZW5jbG9zdXJlIHBlcmlvZHMgKEV4cGVyaW1lbnQgMSB0cmVhdG1lbnQgc2FtcGxlcywgYW5kIGFsbCBFeHBlcmltZW50IDIgc2FtcGxlcykuIFdlIGxvb2tlZCBhdCB0aGUgb3ZlcmFsbCBzaWduaWZpY2FuY2Ugb2YgdGhlIHBhcmVtZXRlciBlc3RpbWF0ZXMgYXMgd2VsbCBhcyB0aGUgY29udHJhc3RzIGZyb20gdGhpcyBtb2RlbCBieSBlYWNoIGV4cGVyaW1lbnQsIHRyZWF0bWVudCwgYW5kIGVjb3N5c3RlbSB0eXBlLiAKCldlIHRlc3RlZCB0aGUgZWZmZWN0IG9mIHN0b3JhZ2UgZHVyYXRpb24gb24gb2JzZXJ2ZWQgJFxEZWx0YSReMTReQy1DT34yfiB1c2luZyBhIGNvbWJpbmVkIGRhdGFzZXQgb2YgRXhwZXJpbWVudHMgMSBhbmQgRXhwZXJpbWVudCAzIHNhbXBsZXMuIFdlIHVzZWQgJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBpbiB0aGUgc2Vjb25kIGVuY2xvc3VyZSBwZXJpb2QgZm9yIGFsbCBzYW1wbGVzIGV4Y2VwdCB0aGUgRXhwZXJpbWVudCAzIHRyZWF0bWVudCBzYW1wbGVzIGZvciB3aGljaCBvbmx5IGEgc2luZ2xlIGVuY2xvc3VyZSBwZXJpb2Qgd2FzIG9ic2VydmVkLiBXZSBjb25zdHJ1Y3RlZCBhIGxpbmVhciBtaXhlZCBtb2RlbCB3aXRoIHN0b3JhZ2UgZHVyYXRpb24sIHRyZWF0bWVudCwgYW5kIHRoZSBpbnRlcmFjdGlvbiBvZiB0aGVzZSB0d28gdmFyaWFibGVzIGFzIGZpeGVkIGVmZmVjdHMuIEFzIHdpdGggdGhlIHByZXZpb3VzIG1vZGVscyB3ZSBhbGxvd2VkIGZvciBhIHJhbmRvbSBpbnRlcmNlcHQgdGVybSBmb3IgZWFjaCBzYW1wbGUuIFdlIGRpZCBub3QgaW5jbHVkZSBlY29zeXN0ZW0gdHlwZSBpbiB0aGlzIG1vZGVsIGFzIGFsbCBvZiB0aGUgZ3Jhc3NsYW5kIHNhbXBsZXMgd2VyZSBjb2xsZWN0ZWQgYXQgdGhlIHNhbWUgcG9pbnQgaW4gdGltZS4gV2UgYWxzbyBleGNsdWRlZCB0aGUgZWZmZWN0IG9mIGV4cGVyaW1lbnQsIHNpbmNlIHRoaXMgY291bGQgbGVhZCB0byBhIHNwdXJpb3VzIHJlbGF0aW9uc2hpcCBkdWUgdG8gdGhlIGNoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG9mIGF0bW9zcGhlcmljIENPfjJ+IG92ZXIgdGltZSBhbmQgdGhlIGZhY3QgdGhhdCBzYW1wbGVzIHdlcmUgY29sbGVjdGVkIGFuZCBhbmFseXN6ZWQgYXQgZGlmZmVyZW50IHRpbWVzLiBUaGlzIG1vZGVsIHdhcyBydW4gZmlyc3Qgd2l0aCBhbmQgdGhlbiB3aXRob3V0IHRoZSBPYWsgUmlkZ2Ugc2FtcGxlcywgYXMgd2UgY29uc2lkZXJlZCB0aGVzZSBzYW1wbGVzIHRvIGJlIGEgc2VwYXJhdGUgcG9wdWxhdGlvbiBhcyB0aGV5IGNvbnRhaW4gMTRDIGZyb20gYSBsYWJlbGxpbmcgZXhwZXJpbWVudCBpbiBhZGRpdGlvbiB0byBhdG1vc3BoZXJpYyBeMTReQy4gIAoKQWxsIHN0YXRpc3RpY2FsIGFuYWx5c2VzIHdlcmUgcGVyZm9ybWVkIGluIFIgKFIgQ29yZSBUZWFtIDIwMTkpLiBXZSB1c2VkIHRoZSBwYWNrYWdlIGxtZTQgW0BCYXRlc10gdG8gcGVyZm9ybSB0aGUgbWl4ZWQgbW9kZWxpbmcsIGFuZCBmb3IgY29udHJhc3QgYW5hbHlzaXMgd2UgdXNlZCB0aGUgcGFja2FnZSBlbW1lYW5zIFtATGVudGhdLiBXaGVuIHBlcmZvcm1pbmcgc3RhdGlzdGljYWwgdGVzdHMgd2UgZW1wbG95ZWQgVHVrZXnigJlzIGhvbmVzdGx5IHNpZ25pZmljYW50IGRpZmZlcmVuY2UgdGVzdCB0byBhY2NvdW50IGZvciBtdWx0aXBsZSBjb21wYXJpc29ucyBhbmQgdGhlIEtlbndhcmQtUm9nZXIgbWV0aG9kIGZvciBlc3RpbWF0aW5nIGRlZ3JlZXMgb2YgZnJlZWRvbSwgd2hpY2ggaGFzIHNob3duIHRvIHBlcmZvcm0gd2VsbCBmb3Igc21hbGwgc2FtcGxlIHNpemVzIFtAS2Vud2FyZFJvZ2VyXS4KCmBgYHtyIG1peGVkLW1vZGVsc30KIyBsb2FkIGRhdGEKbG9hZCgiYXJjLnJld2V0LjE0Yy5SRGF0YSIpICMgYXJjIGFuZCByZXdldCBkYXRhCmxvYWQoImFsbC4xNGMubHMuUkRhdGEiKSAjIGFsbCBkYXRhCmxvYWQoInRtZS5taXNjLlJEYXRhIikgIyBuYW1lcyBmb3IgRXhwLjMgc2FtcGxlcyBwZXJmb3JtZWQgb3V0c2lkZSBNUEktQkdDCgojIGxpbmVhciBtaXhlZCBtb2RlbCB3LyByZXBsaWNhdGVzCmFyYy5yZXdldC4xNGMucmVwcyA8LSB1bnNwbGl0KAogIGxhcHBseShzcGxpdChhcmMucmV3ZXQuMTRjLCBhcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQpLCBmdW5jdGlvbihleHApIHsKICAgIHVuc3BsaXQobGFwcGx5KHNwbGl0KGV4cCwgZXhwJHRyZWF0LmJpKSwgZnVuY3Rpb24odHJ0KSB7CiAgICAgIHVuc3BsaXQobGFwcGx5KHNwbGl0KHRydCwgdHJ0JElEKSwgZnVuY3Rpb24oZGYpIHsKICAgICAgICBkZiRyZXAgPC0gc2VxKDEsIG5yb3coZGYpKQogICAgICAgIHJldHVybihkZikKICAgICAgfSksIHRydCRJRCkgCiAgICB9KSwgZXhwJHRyZWF0LmJpKQogIH0pLCBhcmMucmV3ZXQuMTRjJEV4cGVyaW1lbnQpCmFyYy5yZXdldC4xNGMucmVwcyRyZXAgPC0gZmFjdG9yKGFyYy5yZXdldC4xNGMucmVwcyRyZXApCgojIGxtZXIgZm9yIHByZS9pbmMKYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmMgPC0gcmJpbmQoCiAgYXJjLnJld2V0LjE0Yy5yZXBzWywgYygiSUQiLCAiVHlwZSIsICJFeHBlcmltZW50IiwgInRyZWF0LmJpIiwgImQxNGNfY29ycl9wcmUiKV0gJT4lCiAgICByZW5hbWUoZDE0Y19jb3JyID0gZDE0Y19jb3JyX3ByZSkgJT4lCiAgICBtdXRhdGUoUGVyaW9kID0gInByZSIpLAogIGFyYy5yZXdldC4xNGMucmVwc1sgLCBjKCJJRCIsICJUeXBlIiwgIkV4cGVyaW1lbnQiLCAidHJlYXQuYmkiLCAiZDE0Y19jb3JyX2luYyIpXSAlPiUKICAgIHJlbmFtZShkMTRjX2NvcnIgPSBkMTRjX2NvcnJfaW5jKSAlPiUKICAgIG11dGF0ZShQZXJpb2QgPSAiaW5jIikpCmxtZXIucHJlLmluYyA8LSBsbWVyKGQxNGNfY29yciB+IFBlcmlvZCAqIEV4cGVyaW1lbnQgKiB0cmVhdC5iaSAqIFR5cGUgKyAoMXxJRCksCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhcmMucmV3ZXQuMTRjLnJlcHMucHJlLmluYykKbG1lci5wcmUuaW5jMiA8LSBsbWVyKGQxNGNfY29yciB+IFBlcmlvZCAqIEV4cGVyaW1lbnQgKiB0cmVhdC5iaSAqIFR5cGUgKyAoMXxJRCksCiAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBhcmMucmV3ZXQuMTRjLnJlcHMucHJlLmluY1std2hpY2goYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmMkSUQgPT0gIkhFVzIyIiAmYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmMkRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgYXJjLnJld2V0LjE0Yy5yZXBzLnByZS5pbmMkdHJlYXQuYmkgPT0gImNvbnRyb2wiKSwgXSkKbG1lci5wcmUuaW5jLmVtIDwtIGVtbWVhbnMobG1lci5wcmUuaW5jLCB+IFBlcmlvZCAqIHRyZWF0LmJpICogRXhwZXJpbWVudCAqIFR5cGUpCgojIyBTdG9yYWdlIGR1cmF0aW9uCmFyYy50bWUuMTRjIDwtIGJpbmRfcm93cyhsYXBwbHkoYWxsLjE0Yy5scywgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkZlt3aGljaChkZiRQZXJpb2QgPT0gImluYyIgJiBkZiRFeHBlcmltZW50ICE9ICJyZXdldCIgJiBkZiRIb3Jpem9uID09ICJBIiksIF0KICBkZiR0cmVhdC5iaSA8LSBpZmVsc2UoZGYkVHJlYXRtZW50ID09ICJjb250cm9sIiwgImNvbnRyb2wiLCAidHJlYXRtZW50IikKICByZXR1cm4oZGYpCiAgfSkpCmFyYy50bWUuMTRjJFllYXJNZWFzdXJlZCA8LSAyMDE4CmFyYy50bWUuMTRjW3doaWNoKGFyYy50bWUuMTRjJElEICVpbiUgdG1lLm1pc2MkSUQpLCAiWWVhck1lYXN1cmVkIl0gPC0gMjAwOQphcmMudG1lLjE0Y1t3aGljaChhcmMudG1lLjE0YyRTaXRlID09ICJNdXNpY2siIHwgYXJjLnRtZS4xNGMkU2l0ZSA9PSAiU2hhdmVyIiksICJZZWFyU2FtcGxlZCJdIDwtIDIwMDkKYXJjLnRtZS4xNGMkZHVyIDwtIGFyYy50bWUuMTRjJFllYXJNZWFzdXJlZCAtIGFyYy50bWUuMTRjJFllYXJTYW1wbGVkCmFyYy50bWUuMTRjIDwtIGFyYy50bWUuMTRjWy13aGljaChhcmMudG1lLjE0YyRJRCA9PSAiRHUxMjMiKSwgXQphcmMudG1lLjE0YyA8LSBhcmMudG1lLjE0Y1sgLCBjKCJJRCIsICJ0cmVhdC5iaSIsICJFeHBlcmltZW50IiwgImQxNGNfY29yciIsICJkdXIiLCAiU2l0ZSIpXQoKIyBzdG9yYWdlIGR1cmF0aW9uIG1vZGVsCmxtZXIuYXJjLnRtZS4xNGMgPC0gbG1lcigKICBkMTRjX2NvcnIgfiB0cmVhdC5iaSAqIGR1ciArICgxIHwgSUQpLAogIGRhdGEgPSBhcmMudG1lLjE0YykKbG1lci5hcmMudG1lLjE0Yy5ldCA8LSBlbXRyZW5kcyhsbWVyLmFyYy50bWUuMTRjLCBwYWlyd2lzZSB+IHRyZWF0LmJpLCB2YXIgPSAiZHVyIikKIyAjIHBsb3Qgc2xvcGVzCiMgZW1taXAobG1lci5hcmMudG1lLjE0YywgdHJlYXQuYmkgfiBkdXIsIGNvdi5yZWR1Y2UgPSByYW5nZSkKCiMgdy9vIE9hayBSaWRnZQpsbWVyLmFyYy50bWUuMTRjMiA8LSBsbWVyKAogIGQxNGNfY29yciB+IHRyZWF0LmJpICogZHVyICsgKDEgfCBJRCksCiAgZGF0YSA9IGFyYy50bWUuMTRjWy13aGljaChhcmMudG1lLjE0YyRTaXRlID09ICJUZW5uZXNzZWUgVmFsbGV5IiB8IGFyYy50bWUuMTRjJFNpdGUgPT0gIldhbGtlciBCcmFuY2giKSwgXSkKbG1lci5hcmMudG1lLjE0YzIuZXQgPC0gZW10cmVuZHMobG1lci5hcmMudG1lLjE0YzIsIHBhaXJ3aXNlIH4gdHJlYXQuYmksIHZhciA9ICJkdXIiKQojICMgcGxvdCBzbG9wZXMKIyBlbW1pcChsbWVyLmFyYy50bWUuMTRjMiwgdHJlYXQuYmkgfiBkdXIsIGNvdi5yZWR1Y2UgPSByYW5nZSkKCiMgRnVsbCBtb2RlbCAoRXhwIDErMikKIyBtb2RlbApsbWVyLmFyY1Jld2V0LjE0YyA8LSBsbWVyKAogIGQxNGNfY29ycl9pbmMgfiB0cmVhdC5iaSAqIEV4cGVyaW1lbnQgKiBUeXBlICsgKDF8SUQpLAogIGRhdGEgPSBhcmMucmV3ZXQuMTRjLnJlcHMpCmxtZXIuYXJjUmV3ZXQuMTRjLmRmIDwtIGRhdGEuZnJhbWUoCiAgZW1tZWFucyhsbWVyLmFyY1Jld2V0LjE0YywgfiB0cmVhdC5iaSAqIEV4cGVyaW1lbnQgKiBUeXBlKSkKbG1lci5oYWkuMTRjIDwtIGxtZXIoCiAgZDE0Y19jb3JyX2luYyB+IHRyZWF0LmJpICogRXhwZXJpbWVudCAqIFR5cGUgKyAoMXxJRCksCiAgZGF0YSA9IGFyYy5yZXdldC4xNGMucmVwc1thcmMucmV3ZXQuMTRjLnJlcHMkU2l0ZSA9PSAiSGFpbmljaCIsIF0pCmxtZXIuaGFpLjE0Yy5kZiA8LSBkYXRhLmZyYW1lKAogIGVtbWVhbnMobG1lci5oYWkuMTRjLCB+IHRyZWF0LmJpICogRXhwZXJpbWVudCAqIFR5cGUpKQoKIyBjb250cmFzdHMsIGUuZy4KIyB3aXRoaW4gVHlwZSwgdHJ0IEYgMjAxMSAtIHRydCBGIDIwMTksIGN0bCBGIDIwMTEgLSBjdGwgRiAyMDE5Li4uZXRjLgpsbWVyLmFyY1Jld2V0LjE0Yy5jdCA8LSBjb250cmFzdChyZWZfZ3JpZChsbWVyLmFyY1Jld2V0LjE0YyksICJwYWlyd2lzZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSBjKCJ0cmVhdC5iaSIsICJFeHBlcmltZW50IikpCiMgSGFpbmljaApsbWVyLmhhaS4xNGMuY3QgPC0gY29udHJhc3QocmVmX2dyaWQobG1lci5oYWkuMTRjKSwgInBhaXJ3aXNlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGUgPSBjKCJ0cmVhdC5iaSIsICJFeHBlcmltZW50IikpCmNvbnRyYXN0LmtleSA8LSBjKCJjb250cm9sIGFyYyAtIHRyZWF0bWVudCBhcmMiID0gIlRydCAtIEN0bCAoRXhwZXJpbWVudCAxKSIsCiAgICAgICAgICAgICAgICAgICJjb250cm9sIGFyYyAtIGNvbnRyb2wgcmV3ZXQiID0gIuKIhi90IEN0bCIsCiAgICAgICAgICAgICAgICAgICJjb250cm9sIGFyYyAtIHRyZWF0bWVudCByZXdldCIgPSAi4oiGL3QgRXgxIEN0bCAtIEV4MiBUcnQiLAogICAgICAgICAgICAgICAgICAidHJlYXRtZW50IGFyYyAtIGNvbnRyb2wgcmV3ZXQiID0gIuKIhi90IEV4MSBUcnQgLSBFeDIgQ3RsIiwKICAgICAgICAgICAgICAgICAgInRyZWF0bWVudCBhcmMgLSB0cmVhdG1lbnQgcmV3ZXQiID0gIuKIhi90IFRydCIsCiAgICAgICAgICAgICAgICAgICJjb250cm9sIHJld2V0IC0gdHJlYXRtZW50IHJld2V0IiA9ICJUcnQgLSBDdGwgKEV4cGVyaW1lbnQgMikiKQoKIyAjIHByZS9pbmMgY29udHJhc3RzIHdpdGggYW5kIHdpdGhvdXQgb3V0bGllcgojIGNvbnRyYXN0KHJlZl9ncmlkKGxtZXIucHJlLmluYyksICJwYWlyd2lzZSIsIHNpbXBsZSA9IGMoIlBlcmlvZCIpKQojIGNvbnRyYXN0KHJlZl9ncmlkKGxtZXIucHJlLmluYzIpLCAicGFpcndpc2UiLCBzaW1wbGUgPSBjKCJQZXJpb2QiKSkKYGBgClxuZXdwYWdlCiMjIExpbmVhciBNaXhlZCBNb2RlbCAoTE1NKSByZXN1bHRzCgojIyMgVGFibGUgUzE6IExNTSBtYXJnaW5hbCBtZWFucyBmb3IgZW5jbG9zdXJlIHBlcmlvZCAkXERlbHRhJF4xNF5DLUNPfjJ+CmBgYHtyIGVtbWVhbnMtdGFibGVzLXByZUluYzE0Y30KIyBwcmUgdnMuIGluYwpsbWVyLnByZS5pbmMuZW0gJT4lIAogIGRhdGEuZnJhbWUoLikgJT4lIAogIGZpbHRlcighaXMubmEoZW1tZWFuKSkgJT4lCiAgcmVuYW1lKFRyZWF0bWVudCA9IHRyZWF0LmJpLAogICAgICAgICBtZWFuID0gZW1tZWFuKSAlPiUKICBtdXRhdGUoUGVyaW9kID0gaWZlbHNlKFBlcmlvZCA9PSAiaW5jIiwgIjJuZCIsICIxc3QiKSwKICAgICAgICAgRXhwZXJpbWVudCA9IGZhY3RvcihpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgMSwgMikpLAogICAgICAgICBUeXBlID0gaWZlbHNlKFR5cGUgPT0gIkYiLCAiZm9yZXN0IiwgImdyYXNzbGFuZCIpKSAlPiUKICBndCgpICU+JQogIGZtdF9udW1iZXIoCiAgICBjb2x1bW5zID0gNTo5LAogICAgZGVjaW1hbHMgPSAxKSAlPiUKICB0YWJfaGVhZGVyKAogICAgICB0aXRsZSA9ICJFbmNsb3N1cmUgcGVyaW9kIOKIhjE0QyIsCiAgICAgIHN1YnRpdGxlID0gIk1peGVkIG1vZGVsIG1lYW5zIGFuZCA5NSUgQ0lzIgogICAgICApCmBgYAojIyMgVGFibGUgUzI6IExNTSBtYXJnaW5hbCBtZWFucyBmb3IgY29udHJvbCBhbmQgdHJlYXRtZW50ICRcRGVsdGEkXjE0XkMtQ09+Mn4gKDJebmReIGVuY2xvc3VyZSBwZXJpb2Qgb25seSkKYGBge3IgZW1tZWFucy10YWJsZXMtY3RsVHJ0MTRjfQojIGN0bCB2cy4gdHJ0CmxtZXIuYXJjUmV3ZXQuMTRjLmRmICU+JSAKICBmaWx0ZXIoIWlzLm5hKGVtbWVhbikpICU+JQogIHJlbmFtZShUcmVhdG1lbnQgPSB0cmVhdC5iaSwKICAgICAgICAgbWVhbiA9IGVtbWVhbikgJT4lCiAgbXV0YXRlKEV4cGVyaW1lbnQgPSBmYWN0b3IoaWZlbHNlKEV4cGVyaW1lbnQgPT0gImFyYyIsIDEsIDIpKSwKICAgICAgICAgVHlwZSA9IGlmZWxzZShUeXBlID09ICJGIiwgImZvcmVzdCIsICJncmFzc2xhbmQiKSkgJT4lCiAgZ3QoKSAlPiUKICBmbXRfbnVtYmVyKAogICAgY29sdW1ucyA9IDQ6OCwKICAgIGRlY2ltYWxzID0gMSkgJT4lCiAgdGFiX2hlYWRlcigKICAgICAgdGl0bGUgPSAi4oiGMTRDIG9mIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGVzIChFeHBlcmltZW50cyAxICYgMikiLAogICAgICBzdWJ0aXRsZSA9ICJNaXhlZCBtb2RlbCBtZWFucyBhbmQgOTUlIENJcyIKICAgICAgKQpgYGAKXG5ld3BhZ2UKIyMjIFRhYmxlIFMzOiBTdW1tYXJ5IG9mIHN0b3JhZ2UgZHVyYXRpb24gTE1NIHdpdGggT2FrIFJpZGdlIHNhbXBsZXMKYGBge3Igc3VtbWFyeS1sbWVyLXN0b3JEdXItT1J9CmxtZXIuYXJjLnRtZS4xNGMuZXQKYGBgCiMjIyBUYWJsZSBTNDogU3VtbWFyeSBvZiBzdG9yYWdlIGR1cmF0aW9uIExNTSB3aXRob3V0IE9hayBSaWRnZSBzYW1wbGVzCmBgYHtyIHN1bW1hcnktbG1lci1zdG9yRHVyLW5vT1J9CmxtZXIuYXJjLnRtZS4xNGMyLmV0CmBgYApcbmV3cGFnZQojIyMgVGV4dCBTMjogQ29tcGFyaW5nIGRpZmZlcmVuY2VzIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYWNyb3NzIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGVzIGZvciB0aGUgSGFpbmljaC1Ew7xuIHRpbWUgc2VyaWVzCgpDb250cmFzdCBhbmFseXNpcyBvZiB0aGUgTE1NIG91dHB1dCBzaG93cyB0aGF0IGNvbnRyb2wtdHJlYXRtZW50IGRpZmZlcmVuY2VzIGFyZSBub3Qgc2lnbmlmaWNhbnQgZm9yIHRoZSBmb3Jlc3Qgc2FtcGxlcywgYnV0IGFyZSBzaWduaWZpY2FudCBmb3IgdGhlIGdyYXNzbGFuZCBzYW1wbGVzIGluIGJvdGggRXhwZXJpbWVudCAxIGFuZCBFeHBlcmltZW50IDIgKGZpcnN0IHR3byBjb2x1bW5zIG9mICoqRmlnLiBTMSoqKS4gV2hpbGUgdGhlIHJlc3VsdHMgYXJlIHNpbWlsYXIgdG8gdGhlIHBhaXJlZCBkaWZmZXJlbmNlIGFwcHJvYWNoIHVzZWQgaW4gdGhlIG1haW4gdGV4dCwgdGhlIHBhaXJlZCBkaWZmZXJlbmNlIGFwcHJvYWNoIGZvdW5kIGJvdGggZm9yZXN0IGFuZCBncmFzc2xhbmQgZGlmZmVyZW5jZXMgdG8gYmUgc2lnbmlmaWNhbnQuCgpDb21wYXJpbmcgdGhlIGRpZmZlcmVuY2VzIG9ic2VydmVkIG92ZXIgdGltZSB3aGVuIHNhbXBsZXMgd2VyZSB0cmVhdGVkIHRoZSBzYW1lIGF0IGJvdGggdGltZXBvaW50cyAoY29sdW1ucyAi4oiGL3QgQ3RsIiBhbmQgIuKIhi90IFRydCIsICoqRmlnLiBTMSoqKSwgd2Ugc2VlIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGZvciBib3RoIHRoZSBzYW1wbGVzIHRoYXQgd2VyZSBuZXZlciBhaXItZHJpZWQgKCLiiIYvdCBDdGwiKSBhbmQgdGhlIHNhbXBsZXMgdGhhdCB3ZXJlIGFpci1kcmllZCBhbmQgcmV3ZXQgKCLiiIYvdCBUcnQiKS4gQm90aCBkaWZmZXJlbmNlcyBhcmUgcG9zaXRpdmUsIGkuZS4gJFxEZWx0YSReMTReQy1DT34yfiBkZWNsaW5lZCBmb3IgYm90aCBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBvdmVyIHRoZSBwZXJpb2QgMjAxMSB0byAyMDE5LiBIb3dldmVyLCB3ZSBzZWUgdGhhdCB0aGUgZGlmZmVyZW5jZSBvdmVyIHRpbWUgYXBwZWFyIHNtYWxsZXIgZm9yIHRoZSBmb3Jlc3Qgc2FtcGxlcyB3aGVuIGNvbXBhcmluZyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0cmVhdG1lbnQgc2FtcGxlcyAoMjbigLApIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGNvbnRyb2wgc2FtcGxlcyAoNDnigLApLCBhbHRob3VnaCB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgb3ZlcmxhcCBzdWJzdGFudGlhbGx5LiBXZSBiZWxpZXZlIHRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcmVsaWFiaWxpdHkgb2YgdGhlIGFyY2hpdmVkIHRlY2huaXF1ZSB3aGVuIGxvb2tpbmcgYXQgY2hhbmdlcyBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSBhY3Jvc3Mgc2FtcGxlcyB0aGF0IGhhdmUgYmVlbiBhaXItZHJpZWQgYW5kIHJld2V0dGVkLgoKRmluYWxseSwgd2hlbiBjb21wYXJpbmcgdHJlYXRtZW50IHNhbXBsZXMgdGhhdCBoYXZlIG5ldmVyIGJlZW4gYWlyLWRyaWVkIChmaW5hbCB0d28gY29sdW1ucyBvZiBmaWd1cmUpLCB0aGUgZXN0aW1hdGVkIGRpZmZlcmVuY2VzIGFyZSBza2V3ZWQgaGlnaGVyIG9yIGFyZSBubyBsb25nZXIgc2lnbmlmaWNhbnQuIFNwZWNpZmljYWxseSwgd2UgZmFpbCB0byBkZXRlY3QgYSBzaWduaWZpY2FudCBjaGFuZ2UgaW4gdGhlIGdyYXNzbGFuZCAkXERlbHRhJF4xNF5DLUNPfjJ+IG92ZXIgdGltZSB3aGVuIGNvbXBhcmluZyBjb250cm9sIHNhbXBsZXMgZnJvbSAyMDExIHRvIGFpci1kcmllZCBhbmQgcmV3ZXQgc2FtcGxlcyBmcm9tIDIwMTkgKHBlbnVsdGltYXRlIGNvbHVtbiwgIuKIhi90IEV4MSBDdGwgLSBFeDIgVHJ0IikuIExvb2tlZCBhdCB0aGUgb3RoZXIgd2F5LCBpLmUuIHRyZWF0bWVudCAkXERlbHRhJF4xNF5DLUNPfjJ+IGZyb20gdGhlIDIwMTEgZ3Jhc3NsYW5kIHNhbXBsZXMgY29tcGFyZWQgdG8gY29udHJvbCBncmFzc2xhbmQgc2FtcGxlcyBpbiAyMDE5LCB0aGUgZGlmZmVyZW5jZSBpcyBzdWJzdGFudGlhbGx5IGV4YWdnZXJhdGVkIChsYXN0IGNvbHVtbik6IDU44oCwIHZzLiAyN+KAsCAoY3RsLWN0bCkgb3IgMzjigLAgKHRydC10cnQpLiBUaGUgZGlmZmVyZW5jZSBpcyBhbHNvIGdyZWF0ZXIgZm9yIGZvcmVzdCBzYW1wbGVzIGZvciBib3RoIG9mIHRoZXNlIGNyb3NzLXRyZWF0bWVudCBjb21wYXJpc29ucy4gVGhlc2UgZGlmZmVyZW5jZXMgaW1wbHkgaXQgaXMgaW1wb3J0YW50IHRvIHRyZWF0IHRoZSBzb2lscyBmcm9tIGFsbCB0aW1lIHBvaW50cyB0aGUgc2FtZSBpbiByZWdhcmRzIHRvIGFpci1kcnlpbmcgYW5kIHJld2V0dGluZyB3aGVuIGNvbnN0cnVjdGluZyBhIHRpbWUgc2VyaWVzIHVzaW5nICRcRGVsdGEkXjE0XkMtQ09+Mn4gbWVhc3VyZWQgb24gYXJjaGl2ZWQgc29pbHMgaW4gb3JkZXIgdG8gbWluaW1pemUgYmlhcy4gCgojIyMgRmlndXJlIFMxOiA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIExNTSBjb250cmFzdHMgb2YgSGFpbmljaC1Ew7xuIGZvcmVzdCB0aW1lIHNlcmllcyBkYXRhCmBgYHtyIHBsb3QtbG1lci1jb25maW50LWN0bC10cnR9CmNvbmZpbnQobG1lci5oYWkuMTRjLmN0KSAlPiUKICBkYXRhLmZyYW1lKC4pICU+JQogIG11dGF0ZShDb250cmFzdCA9IGZhY3RvcihyZWNvZGUoY29udHJhc3QsICEhIWNvbnRyYXN0LmtleSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlRydCAtIEN0bCAoRXhwZXJpbWVudCAxKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRydCAtIEN0bCAoRXhwZXJpbWVudCAyKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIuKIhi90IEN0bCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIuKIhi90IFRydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIuKIhi90IEV4MSBDdGwgLSBFeDIgVHJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi4oiGL3QgRXgxIFRydCAtIEV4MiBDdGwiKSkpICU+JQogIGdncGxvdCguLCBhZXMoQ29udHJhc3QsIGVzdGltYXRlLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNSwgcHJlc2VydmUgPSAidG90YWwiKSkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwgd2lkdGggPSAuNSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuNSwgcHJlc2VydmUgPSAidG90YWwiKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdmb3Jlc3QnLCdncmFzc2xhbmQnKSkgKwogIHlsYWIoZXhwcmVzc2lvbignTWVhbiBkaWZmZXJlbmNlIGluICcqRGVsdGFeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KkNhcHRpb246KiBDb250cmFzdHMgc2hvd24gY29tcGFyZSB0cmVhdG1lbnQgYW5kIGNvbnRyb2wgc2FtcGxlcyB3aXRoaW4gRXhwZXJpbWVudHMgMSBhbmQgMiAoZmlyc3QgdHdvIGNvbHVtbnMsIHJlc3BlY3RpdmVseSksIGNvbnRyb2wgc2FtcGxlcyBiZXR3ZWVuIDIwMTEgYW5kIDIwMTkgKHRoaXJkIGNvbHVtbiksIHRyZWF0bWVudCBzYW1wbGVzIGJldHdlZW4gMjAxMSBhbmQgMjAxOSAoZm91cnRoIGNvbHVtbiksIGNvbnRyb2wgc2FtcGxlcyBmcm9tIEV4cGVyaW1lbnQgMSAoMjAxMSkgdG8gdHJlYXRtZW50IHNhbXBsZXMgZnJvbSBFeHBlcmltZW50IDIgKDIwMTkpIChmaWZ0aCBjb2x1bW4pLCBhbmQgdHJlYXRtZW50IHNhbXBsZXMgZnJvbSBFeHBlcmltZW50IDEgKDIwMTEpIHRvIGNvbnRyb2wgc2FtcGxlcyBmcm9tIEV4cGVyaW1lbnQgMiAoMjAxOSkgKHNpeHRoIGNvbHVtbikuIAoKXG5ld3BhZ2UKIyMjIEZpZ3VyZSBTMjogOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBMTU0gY29udHJhc3RzIG9mIEhhaW5pY2gtRMO8biBmb3Jlc3QgdGltZSBzZXJpZXMKYGBge3IgYXJjLXJld2V0LXRzLWxtZXJDSXMtcGxvdH0KbG9hZCgiRGF0bS5SRGF0YSIpCiMgcGxvdApsbWVyLmFyY1Jld2V0LjE0Yy5kZiAlPiUKICBtdXRhdGUoeXMgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSksCiAgICAgICAgIFRyZWF0bWVudCA9IGlmZWxzZShFeHBlcmltZW50ID09ICJhcmMiICYgdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIsICJjb250cm9sIikpKSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UodHJlYXQuYmkgPT0gInRyZWF0bWVudCIsIHlzICsgLjYsIHlzKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhZZWFyU2FtcGxlZCwgZW1tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wYXRoKGRhdGEgPSBEYXRtLCBhZXMoRGF0ZSwgTkhjMTQpLCBjb2xvciA9ICJibGFjayIpICsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IFRyZWF0bWVudCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGxvd2VyLkNMLCB5bWF4ID0gdXBwZXIuQ0wpLCB3aWR0aCA9IC41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAwKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuY29udHJvbC0yICgyMDE5KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIgPSAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE1LCAxMTApKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhUeXBlKSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoVHlwZSA9IGMoIkYiID0gIkZvcmVzdCIsICJHIiA9ICJHcmFzc2xhbmQiKSkpICsKICB5bGFiKGV4cHJlc3Npb24oRGVsdGFeMTQqJ0MtQ08nWzJdKicgKOKAsCknKSkgKwogIHhsYWIoIlllYXIgU2FtcGxlZCIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPipDYXB0aW9uOiogQWx0ZXJuYXRlIHZlcnNpb24gb2YgRmlnLiA1IGluIG1haW4gdGV4dC4gSW5zdGVhZCBvZiBwb29sZWQgc3RhbmRhcmQgZGV2aWF0aW9ucywgdGhlIGVycm9yIGJhcnMgaGVyZSBzaG93IHRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMgZXN0aW1hdGVkIGZyb20gdGhlIGxpbmVhciBtaXhlZCBtb2RlbC4gCgpcbmV3cGFnZQojIyBTdXBwbGVtZW50YWwgcmVzcGlyYXRpb24gcmF0ZSByZXN1bHRzCiMjIyBGaWd1cmUgUzM6IFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiAocmV3ZXR0aW5nIHB1bHNlIHJlc3BpcmF0aW9uIHJhdGVzIHNob3duIGFzIGEgY3VtdWxhdGl2ZSBhdmVyYWdlIGZvciBhbGwgc2FtcGxlcykKYGBge3IgQ08yLWZsdXgtcGxvdHMtU0ktMX0KIyBsb2FkIGRhdGEKbG9hZCgidHMuYXZnMi5SZGF0YSIpCiMgTm90ZTogdGhpcyBjb2RlIHBsb3RzIGRhdGEgd2l0aCBwcmUtaW5jdWJhdGlvbiBvYnNlcnZhdGlvbnMgYXZlcmFnZWQKIyBQbG90IHJlc3AgcmF0ZXMgb3ZlciB0aW1lCnRzLmF2ZzIgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIGdncGxvdCguLCBhZXModGltZV9kX2NtdHZfbWVhbiwgbWdDTzIuQ19nQ19kX21lYW4pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNCwgY29sb3I9ImdyYXkiKSArCiAgZ2VvbV9yaWJib24oYWVzKHltaW4gPSBzZV9zbG9wZV9sLCB5bWF4ID0gc2Vfc2xvcGVfdSwgZmlsbCA9IFR5cGUsIGxpbmV0eXBlID0gVHJlYXRtZW50LCBhbHBoYSA9IFRyZWF0bWVudCksIHNob3cubGVnZW5kID0gRkFMU0UpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fbGluZShhZXMoY29sb3IgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKEV4cGVyaW1lbnQpLAogICAgICAgICAgICAgbGFiZWxsZXIgPSBsYWJlbGxlcihFeHBlcmltZW50ID0gYygiYXJjIiA9ICJFeHBlcmltZW50IDEiLCAicmV3ZXQiID0gIkV4cGVyaW1lbnQgMiIpKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsMTgpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAnRWNvc3lzdGVtJywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID1jKCdGJz0nI2EzNTUxMycsJ0cnPScjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICdTdGQuIEVyci4nLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ0ZvcmVzdCcsJ0dyYXNzbGFuZCcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gLjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0gLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gLjIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Rhc2hlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnRyb2wiID0nc29saWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhaXItZHJ5IiA9ICJkb3R0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Fpci1kcnkvcmV3ZXQgKyBzdG9yYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiYWlyLWRyeSArIHN0b3JhZ2UiID0gJ2Fpci1kcnkvcmV3ZXQgKyBzdG9yYWdlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSdjb250cm9sLTEgKDIwMTEpXG5jb250cm9sLTIgKDIwMTkpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIpKSArCiAgeWxhYihleHByZXNzaW9uKCdSZXNwaXJhdGlvbiBSYXRlIChtZ0NPJ1syXSonLUMgZ0MnXi0xKidkJ14tMSonKScpKSArCiAgeGxhYigiVGltZSAoZGF5cykiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qQ2FwdGlvbjoqIENPfjJ+IGNvbmNlbnRyYXRpb25zIGZvciBFeHBlcmltZW50IDEgY29udHJvbCBzYW1wbGVzIHdlcmUgb25seSBtZWFzdXJlZCBvbmNlIGR1cmluZyB0aGUgcHJlLWluY3ViYXRpb24gcGVyaW9kLCBpbiBjb250cmFzdCB0byBkYWlseSBtZWFzdXJlbWVudHMgZm9yIGFsbCBvdGhlciBzYW1wbGVzLiBQcmUtaW5jdWJhdGlvbiByZXNwaXJhdGlvbiByYXRlcyBhcmUgc2hvd24gaGVyZSBjYWxjdWxhdGVkIGFzIGN1bXVsYXRpdmUgYXZlcmFnZXMgZm9yIHRoZSB3aG9sZSBwcmUtaW5jdWJhdGlvbiBwZXJpb2QgZm9yIGVhc2Ugb2YgY29tcGFyaXNvbiBhY3Jvc3MgYWxsIHRyZWF0bWVudHMgaW4gYm90aCBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMi4KClxuZXdwYWdlCiMjIyBGaWd1cmUgUzQ6IFJlc3BpcmF0aW9uIHJhdGVzIGZvciBFeHBlcmltZW50IDMKYGBge3IgZXhwMy1yZXNwLXRzLXBsb3R9CiMgbG9hZCBkYXRhCmxvYWQoInRzLmF2Zy5SRGF0YSIpCgojIHBsb3QKdHMuYXZnICU+JQogIGZpbHRlcihFeHBlcmltZW50ID09ICJ0bWUiKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHRpbWVfZF9jbXR2X21lYW4sIG1nQ08yLkNfZ0NfZF9tZWFuKSkgKwogIGdlb21fcmliYm9uKGFlcyh5bWluID0gc2Vfc2xvcGVfbCwgeW1heCA9IHNlX3Nsb3BlX3UsIGZpbGwgPSBUeXBlLCBsaW5ldHlwZSA9IFRyZWF0bWVudCwgYWxwaGEgPSBUcmVhdG1lbnQpLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBUeXBlLCBzaGFwZSA9IFRyZWF0bWVudCkpICsKICBnZW9tX2xpbmUoYWVzKGNvbG9yID0gVHlwZSwgbGluZXR5cGUgPSBUcmVhdG1lbnQpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwxOCkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywnRycgPSAnIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdmb3Jlc3QnLCAnZ3Jhc3NsYW5kJykpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCdGJyA9ICcjYTM1NTEzJywnRycgPSAnIzEzNjFhMycpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoImNvbnRyb2wiID0gLjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0b3JhZ2UgZHVyYXRpb24iID0gLjIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAic29saWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdG9yYWdlIGR1cmF0aW9uIiA9ICJkb3R0ZWQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBkdXJhdGlvbiIgPSAic3RvcmFnZSBkdXJhdGlvbiIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiY29udHJvbCIgPSAxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBkdXJhdGlvbiIgPSAxKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCIgPSAiY29udHJvbC0zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RvcmFnZSBkdXJhdGlvbiIgPSAic3RvcmFnZSBkdXJhdGlvbiIpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhFeHBlcmltZW50KSkgKwogIHlsYWIoZXhwcmVzc2lvbignUmVzcGlyYXRpb24gUmF0ZSAobWdDTydbMl0qJy1DIGdDJ14tMSonZCdeLTEqJyknKSkgKwogIHhsYWIoIlRpbWUgKGRheXMpIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KkNhcHRpb246KiBFeHBlcmltZW50IDMgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcyB3ZXJlIG9ubHkgaW5jdWJhdGVkIGZvciBhIHNpbmdsZSBlbmNsb3N1cmUgcGVyaW9kLCBhcyB0aGUgcmVzdWx0cyBvZiBFeHBlcmltZW50IDEgYW5kIEV4cGVyaW1lbnQgMiBzaG93ZWQgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGJldHdlZW4gdGhlIHJld2V0dGluZyBwdWxzZSBDT34yfiByZWxlYXNlZCBkdXJpbmcgdGhlIHByZS1pbmN1YmF0aW9uIHBlcmlvZCBhbmQgdGhlIENPfjJ+IHJlc3BpcmVkIGR1cmluZyB0aGUgc2Vjb25kIGVuY2xvc3VyZSBwZXJpb2QuIFRoZSBncmFzc2xhbmQgc3RvcmFnZSBkdXJhdGlvbiB0cmVhdG1lbnQgc2FtcGxlcyAoYmx1ZSBkb3R0ZWQgbGluZSkgcmVzcGlyZWQgYW4gZXF1aXZhbGVudCBhbW91bnQgb2YgQ09+Mn4gaW4ganVzdCAzIGQgYXMgdGhlIGNvcnJlc3BvbmRpbmcgY29udHJvbC0zIHNhbXBsZXMgcmVzcGlyZWQgZHVyaW5nIHRoZSByZXdldHRpbmcgcHVsc2UgcGVyaW9kIGFuZCB0aGUgc2Vjb25kIGVuY2xvc3VyZSBwZXJpb2QgY29tYmluZWQuIENvbnNlcXVlbnRseSB0aG9zZSBpbmN1YmF0aW9ucyB3ZXJlIHN0b3BwZWQgYWZ0ZXIgdGhlIGZpcnN0IENPfjJ+IG1lYXN1cmVtZW50IHBvaW50LgoKXG5ld3BhZ2UKIyMgVHJlYXRtZW50IGVmZmVjdHMgb24gJFxkZWx0YSReMTNeQy1DT34yfgojIyMgRmlnLiBTNSAkXGRlbHRhJF4xM15DLUNPfjJ+IG9mIHJld2V0dGluZyBwdWxzZSBhbmQgMl5uZF4gZW5jbG9zdXJlIHBlcmlvZApgYGB7ciBwcmUtaW5jLTEzYy1wbG90fQojIGxvYWQgZGF0YQpsb2FkKCJpc28uMTIucHJlLmluYy5SRGF0YSIpCgojIHBsb3QKaXNvLjEyLnByZS5pbmMgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTNjX21lYW5fcHJlLCBkMTNjX21lYW5faW5jLCBjb2xvciA9IFR5cGUsIHNoYXBlID0gVHJlYXRtZW50KSkgKwogIGdlb21fYWJsaW5lKHNsb3BlID0gMSwgaW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltaW4gPSBkMTNjX2xfaW5jLCAKICAgICAgICB5bWF4ID0gZDEzY191X2luYywgCiAgICAgICAgY29sb3IgPSBUeXBlKSwgCiAgICB3aWR0aCA9IC4yNSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTNjX2xfcHJlLCAKICAgICAgICB4bWF4ID0gZDEzY191X3ByZSwKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIGhlaWdodCA9IC4yNSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9YygnRic9JyNhMzU1MTMnLCdHJz0nIzEzNjFhMycpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCdmb3Jlc3QnLCdncmFzc2xhbmQnKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gJ1RyZWF0bWVudCcsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImNvbnRyb2wiID0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSArIHN0b3JhZ2UiID0gMCksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImNvbnRyb2wiID0gImNvbnRyb2wtMVxuY29udHJvbC0yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeSIgPSAiYWlyLWRyeS9yZXdldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFpci1kcnkgKyBzdG9yYWdlIiA9ICJhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTI5LjEsIC0yMi4yNSkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtMjkuMSwgLTIyLjI1KSkgKwogIHhsYWIoZXhwcmVzc2lvbignUmV3ZXR0aW5nIHB1bHNlICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignMidebmQqJyBlbmNsb3N1cmUgcGVyaW9kICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgbGVnZW5kLmtleS5oZWlnaHQ9dW5pdCguOCwgImNtIiksCiAgICAgICAgYXNwZWN0LnJhdGlvID0gMSkKYGBgCj4qQ2FwdGlvbjoqIFBvaW50cyBhcmUgbWVhbnM7IGVycm9yIGJhcnMgc2hvdyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBvZiBsYWJvcmF0b3J5IGR1cGxpY2F0ZXMuIAoKXG5ld3BhZ2UKIyMjIEZpZy4gUzYgVGltZSBzZXJpZXMgb2YgY29udHJvbCBhbmQgdHJlYXRtZW50ICRcZGVsdGEkXjEzXkMtQ09+Mn4gKEV4cGVyaW1lbnRzIDEgYW5kIDIpCmBgYHtyIGN0bC10cnQtZGlmcy0xM2N9CiMgbG9hZCBwb29sZWQgZGF0YQpsb2FkKCJhcmMucmV3ZXQuMTNjLnBvb2xlZC5SRGF0YSIpCgojIFBsb3Qgc2lkZS1ieS1zaWRlIHcvIHNkcwphcmMucmV3ZXQuMTNjLnBvb2xlZCAlPiUKICBmaWx0ZXIoUGVyaW9kID09ICJpbmMiKSAlPiUKICBtdXRhdGUoWWVhclNhbXBsZWQgPSBpZmVsc2UoRXhwZXJpbWVudCA9PSAiYXJjIiwgMjAxMSwgMjAxOSksCiAgICAgICAgIEVjbyA9IGlmZWxzZShUeXBlID09ICJGIiwgIkZvcmVzdCIsICJHcmFzc2xhbmQiKSwKICAgICAgICAgVHJlYXRtZW50ID0gaWZlbHNlKAogICAgICAgICAgIEV4cGVyaW1lbnQgPT0gImFyYyIgJiB0cmVhdC5iaSA9PSAidHJlYXRtZW50IiwgImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwKICAgICAgICAgICBpZmVsc2UoRXhwZXJpbWVudCA9PSAicmV3ZXQiICYgdHJlYXQuYmkgPT0gInRyZWF0bWVudCIsICJhaXItZHJ5L3Jld2V0IiwgdHJlYXQuYmkpKSkgJT4lCiAgbXV0YXRlKFllYXJTYW1wbGVkID0gaWZlbHNlKHRyZWF0LmJpID09ICJ0cmVhdG1lbnQiLCBZZWFyU2FtcGxlZCArIC41LCBZZWFyU2FtcGxlZCkpICU+JQogIGdncGxvdCguLCBhZXMoWWVhclNhbXBsZWQsIHNhbXBsZS5tZWFuLCBjb2xvciA9IFR5cGUpKSArCiAgZ2VvbV9wb2ludChhZXMoc2hhcGUgPSBUcmVhdG1lbnQpLCBzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IHNhbXBsZS5tZWFuIC0gc2FtcGxlLnNkLCAKICAgICAgICB5bWF4ID0gc2FtcGxlLm1lYW4gKyBzYW1wbGUuc2QsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gJ0Vjb3N5c3RlbScsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoJ0YnID0gJyNhMzU1MTMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHJyA9ICcjMTM2MWEzJyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2ZvcmVzdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyYXNzbGFuZCcpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAnVHJlYXRtZW50JywKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYWlyLWRyeS9yZXdldCIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAxNiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFpci1kcnkvcmV3ZXQiID0gImFpci1kcnkvcmV3ZXQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWlyLWRyeS9yZXdldCArIHN0b3JhZ2UiID0gImFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udHJvbCIgPSAiY29udHJvbC0xICgyMDExKVxuIGNvbnRyb2wtMiAoMjAxOSkiKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDIwMTAsIDIwMjApLCBicmVha3MgPSBjKDIwMTEsIDIwMTkpKSArCiAgeWxhYihleHByZXNzaW9uKCdtZWFuICcqZGVsdGEqJydeMTMqJ0MgKOKAsCknKSkgKwogIGZhY2V0X2dyaWQoY29scyA9IHZhcnMoRWNvKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPipDYXB0aW9uOiogUG9pbnRzIGFyZSBtZWFuczsgZXJyb3IgYmFycyBzaG93IHBvb2xlZCBzdGFuZGFyZCBkZXZpYXRpb25zLiAKClxuZXdwYWdlCiMjIEFkZGl0aW9uYWwgZmFjdG9ycyBpbmZsdWVuY2luZyB0cmVhdG1lbnQgZWZmZWN0cyBvbiAkXERlbHRhJF4xNF5DLUNPfjJ+CiMjIyBGaWcuIFM3IENoYW5nZSBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IGluIHJlbGF0aW9uIHRvIGN1bXVsYXRpdmUgc29pbCBjYXJib24gcmVzcGlyZWQKYGBge3IgcGxvdC0xNGMtYnktYy1yZXNwfQojIGxvYWQgZGF0YQpsb2FkKCJhbGwuMTRjLnN1bS5kZi5SRGF0YSIpCiMgMTAuIFBsb3QgJFxEZWx0YSReMTReQyBhZ2FpbnN0IHByb3BvcnRpb24gb2Ygc29pbCBDIHJlc3BpcmVkIGJ5IGV4cGVyaW1lbnQsIGxhbmQgY292ZXIsIGFuZCBzYW1wbGluZyBwZXJpb2QuCiMgSEVXMjIgY29udHJvbCBwcmUgcG9pbnQgZXhjbHVkZWQgdG8gbWFrZSBmaWd1cmUgbW9yZSByZWFkYWJsZSAKYWxsLjE0Yy5zdW0uZGYgJT4lCiAgZmlsdGVyKEV4cGVyaW1lbnQgIT0gInRtZSIpICU+JQogIG11dGF0ZShJRC50cmVhdCA9IHBhc3RlKElELCBUcmVhdG1lbnQpKSAlPiUKICBtdXRhdGUoSUQudHJlYXQuUGVyaW9kID0gcGFzdGUoSUQudHJlYXQsIFBlcmlvZCkpICU+JQogIGZpbHRlcihJRC50cmVhdC5QZXJpb2QgIT0gIkhFVzIyIGNvbnRyb2wgcHJlIikgJT4lCiAgbXV0YXRlKHRyZWF0LlBlcmlvZCA9IHBhc3RlKHRyZWF0LmJpLCBQZXJpb2QpLAogICAgICAgICBFY28gPSBpZmVsc2UoVHlwZSA9PSAiRiIsICJGb3Jlc3QiLCAiR3Jhc3NsYW5kIikpICU+JQogIGdncGxvdCguLCBhZXMobWdDTzIuQ19nQ19tZWFuLCBkMTRjX2NvcnJfbWVhbiwgY29sb3IgPSBUeXBlLCBzaGFwZSA9IHRyZWF0LlBlcmlvZCkpICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhncm91cCA9IElELnRyZWF0KSkgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1pbiA9IGQxNGNfY29ycl9taW4sIAogICAgICAgIHltYXggPSBkMTRjX2NvcnJfbWF4LCAKICAgICAgICBjb2xvciA9IFR5cGUpLCAKICAgIHdpZHRoID0gLjI1KSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IG1nQ08yLkNfZ0NfbWluLCAKICAgICAgICB4bWF4ID0gbWdDTzIuQ19nQ19tYXgsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgaGVpZ2h0ID0gLjkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnZm9yZXN0JywnZ3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICdTYW1wbGluZyBwZXJpb2QgKHRyZWF0bWVudCknLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoMTYsIDE3LCAxLCAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiY29udHJvbCBwcmUiID0gJ3Jld2V0dGluZyBwdWxzZVxuKGNvbnRyb2wtMSwgMjAxMTsgY29udHJvbC0yLCAyMDE5KScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb250cm9sIGluYyIgPSAnc2Vjb25kIGVuY2xvc3VyZSBwZXJpb2Rcbihjb250cm9sLTEsIDIwMTE7IGNvbnRyb2wtMiwgMjAxOSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgcHJlIiA9ICdyZXdldHRpbmcgcHVsc2VcbihhaXItZHJ5L3Jld2V0ICsgc3RvcmFnZSknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmVhdG1lbnQgaW5jIiA9ICdzZWNvbmQgZW5jbG9zdXJlIHBlcmlvZFxuKGFpci1kcnkvcmV3ZXQgKyBzdG9yYWdlKScpKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhFY28pLCByb3dzID0gdmFycyhZZWFyU2FtcGxlZCkpICsKICB4bGFiKGV4cHJlc3Npb24oJ1Jlc3BpcmVkIEMgKG1nIENPJ1syXSonLUMnKicgZyBzb2lsIEMnXi0xKicpJykpICsKICB5bGFiKGV4cHJlc3Npb24oJ21lYW4gJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBsZWdlbmQua2V5LmhlaWdodD11bml0KC44LCAiY20iKSkKYGBgCj4qQ2FwdGlvbjoqIEVycm9yIGJhcnMgc2hvdyBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBtZWFzdXJlZCBmb3IgbGFib3JhdG9yeSBkdXBsaWNhdGVzLCB3aGlsZSBwb2ludHMgc2hvdyB0aGUgbWVhbi4gTGluZXMgY29ubmVjdCBtZWFuIHByZS1pbmN1YmF0aW9uIGFuZCBzZWNvbmQgZW5jbG9zdXJlIHBlcmlvZCBvYnNlcnZhdGlvbnMgZm9yIGEgc2luZ2xlIHNhbXBsZS4gTGluZXMgcGFyYWxsZWwgdG8gdGhlIHgtYXhpcyBpbmRpY2F0ZSBhIGxhY2sgb2YgdHJlbmQgaW4gJFxEZWx0YSReMTReQy1DT34yfiB3aXRoIHRoZSBhbW91bnQgb2YgY2FyYm9uIHJlc3BpcmVkLCB3aGlsZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIG9wZW4gYW5kIGZpbGxlZCBzeW1ib2xzIHNob3cgdGhlIGltcGFjdCBvZiB0cmVhdG1lbnRzIG9uIGJvdGggdGhlIGFtb3VudCBvZiBjYXJib24gcmVzcGlyZWQgYW5kICRcRGVsdGEkXjE0XkMtQ09+Mn4uIE5vdGUgdGhhdCBwcmUtaW5jdWJhdGlvbiAkXERlbHRhJF4xNF5DLUNPfjJ+IHdhcyBub3QgbWVhc3VyZWQgZm9yIHRoZSBjb250cm9sLTEgc2FtcGxlcyBpbiAyMDExLiBQbG90IGxpbWl0cyBleGNsdWRlIG91dGxpZXIgcG9pbnQgKEhFVzIyIGNvbnRyb2wtMiwgcHJlLWluY3ViYXRpb24pIGZvciBpbXByb3ZlZCBsZWdpYmlsaXR5LgoKXG5ld3BhZ2UKIyMjIFRleHQgUzM6IENoYW5nZSBpbiBzZWNvbmQgZW5jbG9zdXJlIHBlcmlvZCAkXERlbHRhJF4xNF5DLUNPfjJ+IGFzIGEgZnVuY3Rpb24gb2YgZmllbGQtbW9pc3R1cmUgY29udGVudAoKRGlmZmVyZW5jZXMgaW4gZmllbGQgbW9pc3R1cmUgY29udGVudCBvZiBzYW1wbGVzIGNvdWxkIGJlIHJlbGF0ZWQgdG8gdGhlIG1hZ25pdHVkZSBvZiB0aGUgc2hpZnQgaW4gJFxEZWx0YSReMTReQy1DT34yfiBvYnNlcnZlZCBiZXR3ZWVuIGNvbnRyb2wgYW5kIHRyZWF0bWVudCBzYW1wbGUsIGFzIGNvbnRyb2wgc2FtcGxlIGZpZWxkIG1vaXN0dXJlIGNvbnRlbnQgdmFyaWVkLiBBbGwgdHJlYXRtZW50IHNhbXBsZXMgd2VyZSBhaXItZHJpZWQgaW4gdGhlIGxhYm9yYXRvcnkgcHJpb3IgdG8gcmV3ZXR0aW5nOiBhIGNoYW5nZSBpbiBtb2lzdHVyZSBjb250ZW50IG9mIHplcm8gcGVyY2VudCB3YXRlciBob2xkaW5nIGNhcGFjaXR5ICglV0hDKSB0byA2MCAlV0hDLiBJbiBjb250cmFzdCwgbW9pc3R1cmUgYWRqdXN0bWVudCBvZiBjb250cm9sIHNhbXBsZXMgd2FzIG1hZGUgZnJvbSBmaWVsZCBtb2lzdHVyZSwgdGh1cywgZm9yIGV4YW1wbGUsIGNvbnRyb2wgc2FtcGxlcyB3aXRoIGxvd2VyIGZpZWxkIG1vaXN0dXJlIGNvbnRlbnRzIHJlY2VpdmVkIGEgY29ycmVzcG9uZGluZ2x5IGdyZWF0ZXIgd2F0ZXIgYWRkaXRpb24gdGhhbiB3ZXR0ZXIgY29udHJvbCBzYW1wbGVzLiAKCkluIG9yZGVyIHRvIGNvbnRyb2wgZm9yIHRoZSB2YXJpYW5jZSBpbiBmaWVsZCBtb2lzdHVyZSBjb250ZW50IG9mIGNvbnRyb2wgc2FtcGxlcywgd2UgbG9va2VkIGF0IHRoZSByZWxhdGlvbnNoaXAgb2YgdGhlIGRpZmZlcmVuY2UgaW4gdGhlIHNlY29uZCBlbmNsb3N1cmUgcGVyaW9kICRcRGVsdGEkXjE0XkMtQ09+Mn4gb2JzZXJ2ZWQgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgc2FtcGxlcyBhbmQgdGhlIGNoYW5nZSBpbiBtb2lzdHVyZSBjb250ZW50IG9mIHRoZSBjb250cm9sIHNhbXBsZXMuIElmIHRoZSBzaGlmdCBpbiAkXERlbHRhJF4xNF5DLUNPfjJ+IG9ic2VydmVkIGluIHJlc3BvbnNlIHRvIHRoZSBhaXItZHJ5aW5nIGFuZCByZXdldHRpbmcgdHJlYXRtZW50IHdlcmUgYSBsaW5lYXIgZnVuY3Rpb24gb2YgdGhlIGNoYW5nZSBpbiBtb2lzdHVyZSBjb250ZW50LCB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb250cm9sIGFuZCB0cmVhdG1lbnQgJFxEZWx0YSReMTReQy1DT34yfiBzaG91bGQgYmUgc21hbGxlciBmb3Igc2FtcGxlcyB3aXRoIGxvd2VyIGZpZWxkIG1vaXN0dXJlLiBIb3dldmVyLCB3ZSBkaWQgbm90IG9ic2VydmUgYW55IGNvbnNpc3RlbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIGRpZmZlcmVuY2UgaW4gJFxEZWx0YSReMTReQy1DT34yfiBhbmQgZmllbGQgbW9pc3R1cmUgKCoqRmlnLiBTOCoqKS4gCgpXZSBvYnNlcnZlZCB0aGUgc3Ryb25nZXN0IHRyZW5kIGluIHRoZSBFeHBlcmltZW50IDIgZ3Jhc3NsYW5kIHNhbXBsZXMsIGJ1dCB0aGUgdHJlbmQgd2FzIG9wcG9zaXRlIHRvIHdoYXQgd2UgZXhwZWN0ZWQ6IGRpZmZlcmVuY2VzIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYmV0d2VlbiB0cmVhdG1lbnQgc2FtcGxlcyBhbmQgY29udHJvbCBzYW1wbGVzIHdlcmUgZ3JlYXRlciBmb3IgZHJpZXIgc2FtcGxlcyB0aGFuIHdldHRlciBzYW1wbGVzICgqKkZpZy4gUzgqKikuIEV4cGVyaW1lbnQgMiBmb3Jlc3Qgc2FtcGxlcyBzaG93ZWQgdGhlIGV4cGVjdGVkIHRyZW5kLCBidXQgaXQgZGlkIG5vdCBhcHBlYXIgdG8gYmUgbGluZWFyICgqKkZpZy4gUzgqKikuIEdpdmVuIHRoZSByZWxhdGl2ZWx5IGxvdyBzYW1wbGUgbnVtYmVyIHdoZW4gY29uc2lkZXJlZCB3aXRoaW4gdHJlYXRtZW50IGFuZCBlY29zeXN0ZW0gZ3JvdXBzIChFeHBlcmltZW50IDEgKm4qID0gNiwgRXhwZXJpbWVudCAyICpuKiA9IDMpLCB3ZSBkbyBub3QgY29uc2lkZXIgdGhlc2UgdHJlbmRzIHRvIGJlIHNpZ25pZmljYW50LCBidXQgdGhlIGRhdGEgZnJvbSBFeHBlcmltZW50IDIgc3VnZ2VzdCB0aGF0IHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgY2hhbmdlIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYW5kIHRoZSBtYWduaXR1ZGUgb2YgcmV3ZXR0aW5nIHdhcnJlbnRzIGZ1cnRoZXIgc3R1ZHkuCgpcbmV3cGFnZQojIyMgRmlnLiBTOCBDaGFuZ2UgaW4gJFxEZWx0YSReMTReQy1DT34yfiByZWxhdGl2ZSB0byB0aGUgY2hhbmdlIGluIG1vaXN0dXJlIGNvbnRlbnQgKGNvbnRyb2wgLSB0cmVhdG1lbnQpCmBgYHtyIGRlbHRhLW1vaXN0dXJlLWNhbGN9CiMgbG9hZCBkYXRhCmxvYWQoIndoYy5jdGwudHJ0LlJkYXRhIikKbG9hZCgiYXJjLnJld2V0LjE0Yy5zdGF0cy5pbmMubHMuUkRhdGEiKQoKIyBjb2xsYXBzZSBzYW1wbGUgZGVjb21wIGRhdGEKYXJjLnJld2V0LjE0Yy5wb29sZWQgPC0gYmluZF9yb3dzKGxhcHBseShhcmMucmV3ZXQuMTRjLnN0YXRzLmluYy5scywgZnVuY3Rpb24oZXhwKQogIGJpbmRfcm93cyhleHAsIC5pZCA9ICJUeXBlIikpLCAuaWQgPSAiRXhwZXJpbWVudCIpCmFyYy5yZXdldC4xNGMucG9vbGVkIDwtIGFyYy5yZXdldC4xNGMucG9vbGVkWy13aGljaChncmVwbCgicG9vbGVkIiwgcm93bmFtZXMoYXJjLnJld2V0LjE0Yy5wb29sZWQpKSksIF0KCiMgYWRkIFdIQyBkYXRhIHRvIHNhbXBsZSBkZWNvbXAgZGF0YQp3aGMuY3RsLnRydC5wb29sZWQgPC0gbWVyZ2Uod2hjLmN0bC50cnQsIGFyYy5yZXdldC4xNGMucG9vbGVkWyAsIGMoIkV4cGVyaW1lbnQiLCAiSUQiLCAic2FtcGxlLnNkIildLCBieSA9IGMoIkV4cGVyaW1lbnQiLCAiSUQiKSkKCiMgcGxvdAp3aGMuY3RsLnRydC5wb29sZWQgJT4lCiAgbXV0YXRlKHdoY0ZyZXNoID0gcm91bmQod2hjRnJlc2gqMTAwLDApLAogICAgICAgICBkMTRjX2RpZl91ID0gZDE0Y19kaWYgKyBzYW1wbGUuc2QsCiAgICAgICAgIGQxNGNfZGlmX2wgPSBkMTRjX2RpZiAtIHNhbXBsZS5zZCkgJT4lCiAgZ2dwbG90KC4sIGFlcyh3aGNGcmVzaCwgZDE0Y19kaWYsIGNvbG9yID0gVHlwZSwgc2hhcGUgPSBFeHBlcmltZW50KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsKICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWluID0gZDE0Y19kaWZfbCwgCiAgICAgICAgeW1heCA9IGQxNGNfZGlmX3UsIAogICAgICAgIGNvbG9yID0gVHlwZSksIAogICAgd2lkdGggPSAuMjUpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICdFY29zeXN0ZW0nLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPWMoJ0YnPScjYTM1NTEzJywnRyc9JyMxMzYxYTMnKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygnRm9yZXN0JywnR3Jhc3NsYW5kJykpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFeHBlcmltZW50IiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYXJjIiA9IDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXdldCIgPSAxNyksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoImFyYyIgPSAiMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJld2V0IiA9ICIyIikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKFR5cGUpLCByb3dzID0gdmFycyhFeHBlcmltZW50KSwKICAgICAgICAgICAgIGxhYmVsbGVyID0gbGFiZWxsZXIoRXhwZXJpbWVudCA9IGMoImFyYyIgPSAiRXhwZXJpbWVudCAxIiwgInJld2V0IiA9ICJFeHBlcmltZW50IDIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9IGMoIkYiID0gIkZvcmVzdCIsICJHIiA9ICJHcmFzc2xhbmQiKSkpICsKICB4bGFiKCJGaWVsZCBtb2lzdHVyZSBjb250ZW50ICglV0hDKSIpICsKICB5bGFiKGV4cHJlc3Npb24oJ0NvbnRyb2wgLSB0cmVhdG1lbnQgJypEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qQ2FwdGlvbjoqIERpZmZlcmVuY2VzIGluICRcRGVsdGEkXjE0XkMtQ09+Mn4gYXJlIHNob3duIGFzIG1lYW5zOyBlcnJvciBiYXJzIHNob3cgcG9vbGVkIHN0YW5kYXJkIGRldmlhdGlvbnMuIEFsbCBzYW1wbGVzIHdlcmUgcmV3ZXR0ZWQgdG8gNjAlIG9mIHdhdGVyIGhvbGRpbmcgY2FwYWNpdHkgKFdIQykgcHJpb3IgdG8gaW5jdWJhdGlvbiwgYnV0IGNvbnRyb2wgc2FtcGxlcyB3ZXJlIHJld2V0dGVkIGZyb20gZmllbGQgbW9pc3R1cmUgd2hlcmVhcyB0cmVhdG1lbnQgc2FtcGxlcyB3ZXJlIHJld2V0dGVkIGFmdGVyIGFpci1kcnlpbmcuIERhdGEgZnJvbSBFeHBlcmltZW50IDMgYXJlIG5vdCBzaG93biBhcyBmaWVsZCBtb2lzdHVyZSBjb250ZW50IHdhcyB1bmtub3duIGZvciB0aGUgbWFqb3JpdHkgb2Ygc2FtcGxlcyAoVGFibGUgUzUpLiAKClxuZXdwYWdlCiMjIFNpdGUgZGF0YSwgc29pbCBwcm9wZXJ0aWVzLCBhbmQgc3VwcG9ydGluZyByZWZlcmVuY2VzIGZvciBhbGwgc2FtcGxlcyAoRXhwZXJpbWVudHMgMSwgMiwgYW5kIDMpCiMjIyBUYWJsZSBTNQoKXG5ld3BhZ2UKCiMjIFJlZmVyZW5jZXM=