Background
In this document, the results of model fitting, checking, and inferences are provided along with the code and workflow. The objectives of the modeling effort were to (1) estimate the effects of the experimental factors (i.e., matrix, day, and tune) on the accuracy and precision of using different internal standards (i.e., in-sample, alt.isotope, etc.) to predict the shifts in the M2+/M1+ factor. The accuracy of these predictions for \(^{75}As\) (\(^{150}Nd^{2+}\) and \(^{150}Sm^{2+}\)) and Se (\(^{156}Gd^{2+}\)) were determined using ICP-QQQ and HR-ICP-MS (i.e., “True Value” or, henceforth, “TV”) ; and (2) to predict out-of-sample observations in order to quantify expectations about the future performance of these internal standard methods.
This document begins with a section describing the preparation of the experimental data for use in the subsequent modeling. Then there is a section explaining the model’s structure. That section is followed by one describing the priors used for each parameter in the model and the implied prior predictive distribution. The next sections then describe model fits, checks, and inferences.
Import and mung data
The data is imported from the local directory and stored as an object in R. All code is not shown in the html notebook, but is available in the R markdown document (i.e., .rmd file).
Print dataframes for both As and Se.
For each of As and Se, there were 352 observations of the difference between the IS (internal standards) corrected estimate and the “True Value” (“diff_std”) for each of the 10 IS methods over 8 days, 20 matrices, and 2 tune settings. For clarification, the “day_expt” column is a concatenation of month and day corresponding to each of the 8 days of the experiment. The “tune” variable describes the tune setting (high helium = HHe or low helium = LHe) used for each observation. The “matrix” column is self-explanatory. The last 10 columns contain the results for each of the IS methods.
Visualize data
Below is a plot of observed bias (relative to “TV”) by tune setting for each IS method for Arsenic.

The above plot suggests slight under-corrections, on average, for all of the +2 internal standard methods. Most of the +1 methods look to have over-corrected or resulted in minimal bias, on average. Within method, there are no clear differences in this figure due to tune setting for any method.
Next, the same plot for the selenium observations.

For selenium, the +2 methods look to be unbiased to slightly over-corrected, on average. The +1 methods all tended to over-correct fairly clearly. Within method, there looks to be clearer indication of differences due to tune setting for some of the +1 methods: \(Y\) and \(Sc\) in particular. Otherwise, tune effects are not clear.
Next, a plot of observations by method and day of the experiment for arsenic.

The bias looks to have varied by day, most clearly for the +1 methods. In particular, the day of the cone change (3/30) sticks out with having greater tendency for over-corrections for those methods. The cone change looks to have been less important for the +2 methods; though it isn’t clear that day to day variability was entirely negligible for those methods.
And the same plot for selenium.

The pattern is similar as with arsenic above. However, the day to day variability for the +2 methods looks more pronounced.
Next, a similar plot, but dividing the panels by matrix within method for arsenic.

Matrix to matrix variation in bias looks a little less severe compared to variation by day above. Inferences concerning differences are noisier here due to only 16 observations per box. However, looking at \(Sc\), for example, reduced precision and larger over-corrections in the \(Na\), \(Mg\), \(K\), and \(Ca\) matrices relative to other matrices stands out. Similarly, the \(SO_4\) matrix in the +2 methods stands out as potentially inducing larger under-corrections relative to all other matrices for those methods.
And the same plot for selenium.

In terms of overall variability due to matrix, this one is very similar to the one for arsenic preceding. Interestingly, the \(SO_4\) matrix doesn’t stick out for the +2 methods here, though the pattern for \(Sc\) and the 250ppm matrices is similar to the arsenic plot above.
Next is another plot of the observed bias by day (e.g., 516 = 5/16) for arsenic measured for each IS method, but also divided according to tune (red = LHe; blue = HHe).

The general patterns by day are still apparent here. There are some distinctions within days, however, indicating that the effect of tune may depend on the day (e.g., alt.isotope on 3/21 and 5/11; \(Co\) on 3/30 and 5/15; etc.).
And the same plot for selenium.

This one is similar to the arsenic plot above, though there look to be more cases where the tune effect differs by day.
Next, a similar plot, but dividing the panels by matrix and tune within method for arsenic.

These inferences, again, would be noisy as there are only 8 observations per box. Nevertheless, matrix to matrix variability in bias again appears smaller compared to day to day above; and the patterns in the 250ppm matrices for the +2 methods are apparent. Within matrix, there are a few potential differences here and there indicated due to tune.
And finally the same plot for selenium.

Again, the overall patterns are similar to the plot above, but within matrix differences due to tune setting are more pronounced.
Model structure
Because all 10 IS were included in each physical sample run from a given matrix on a given day, the data were treated as a multivariate response (i.e., 352 observations on 10 IS methods), allowing for observation-level correlation between the IS methods. A multilevel Bayesian approach to modeling was taken, with each model conditioned in some manner on all of the experimental design factors (matrix, day, and tune). However, not all potential interactions among the experimental factors were able to be estimated because the number of observations available to estimate them was limited. For example, there was no replication of observations within a matrix and day of the experiment using the same tune setting for any IS method. For each IS in a specific matrix and specific day, only a single measurement was taken at each tune setting (i.e., n=1 for estimating a method x matrix x day x tune effect). Likewise, matrix x day effects were not estimated due to limited information (n = 2 per IS method, corresponding to 2 tune settings).
The models to follow assumed that the observed bias (difference to the nearest 0.001 ppb between the “True Value” and IS estimated correction value) was generated from a multivariate normal (MVN) distribution, where: \[Y \sim MVN(\mu, \Sigma)\] where \(Y\) is a multivariate response matrix of size \(J=10\) columns and \(N=352\) rows; \(\mu\) is the location parameter of the multivariate normal data generating process; and \(\Sigma\) is the covariance matrix containing the scale parameters for each of the \(J=10\) methods on the diagonal, and the between-method correlation parameters on the off-diagonals.
Linear model for \(\mu\)
For the first model fit below, the location parameter was parameterized such that: \[\mu_j = \alpha_j + \beta_j*X_{tune_j} + \gamma_{K_j} + \gamma_{L_j}\] \[\gamma_{K_j} \sim N(0, \sigma_{K_j})\] \[\gamma_{L_j} \sim N(0, \sigma_{L_j})\]
where \(\alpha_j\) references a fixed global intercept for each IS method, \(j \in 1,..,J=10\). This intercept parameter represents the global mean of the low helium tune (LHe) observations for each method, \(j\). The individual observations are not indexed in the notation above, but each of \(i \in i=1,..,N=352\) observations per method is fit to the same \(alpha_j\). The \(\beta_j\) parameter captures the additive effect of the HHe tune on the global mean for each IS method. \(X_{tune_j}\) represents a vector holding the tune setting indicator (0 or 1) for each observation, entered as data. The \(\gamma_{K_j}\) term references varying effects, or intercepts, for each of \(k \in 1,...,K=22\) matrix conditions for each method; and \(\gamma_{L_j}\) references varying effects for each of the \(l \in 1,...,L=8\) days of the experiment. These varying effects are centered on zero and can vary around the global intercept parameter, the degree to which is determined by a hierarchical scale parameters, \(\sigma_{K_j}\) and \(\sigma_{L_j}\), estimated from the data.
In the formula syntax of the \(\textbf{R}\) package \(\textbf{lme4}\) commonly used to fit mixed effects models, the formula for the linear predictor for \(\mu\) above, would be:
\[~ 1 + tune + (1|matrix) + (1|day)\] This is the equivalent syntax employed in the \(\textbf{brms}\) package (Bürkner 2017), which is used to fit the models below.
Fitting a model for arsenic
The \(\textbf{brms}\) package (Bürkner 2017) makes it convenient to fit and compare multilevel generalized linear models in a fully Bayesian framework. Below, the model described above is fit to the observational data. For each parameter described above, priors were provided as indicated in the code below. Specifically, \(N(0,1)\) priors were placed over all intercept parameters for each response. This prior is considered weakly informative on the the scale of the observations. This \(N(0,1)\) prior was also placed on the scale parameters of the varying effects, which was also considered weakly informative. Covariances in \(\textbf{Stan}\) (Stan Development Team 2018c, 2018a, 2018b) are parameterized efficiently by placing priors separately on the standard deviations and the correlation matrix. The covariance term for the multivariate model is parameterized such that: \[\Sigma = diag(\tau) \Omega diag(\tau)\] so priors are placed separately on \(\tau\), the vector of standard deviations for each IS method, and \(\Omega\) the correlation matrix. For each standard deviation in the model below, the \(N(0,1)\) prior was again applied and assumed weakly informative. For the correlation matrix, an \(LKJ(\eta =1)\) prior was used, which is uniform over permissible correlation matrices. For more information on prior choice recommendations, see: https://github.com/stan-dev/stan/wiki/Prior-Choice-Recommendations
load("full-analysis-files/df_mv_as.rda")
bf_Std <- bf(Std ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Alt <- bf(Alt ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho2 <- bf(Ho2 ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_In <- bf(In ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Sc <- bf(Sc ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Y <- bf(Y ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Be <- bf(Be ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Co <- bf(Co ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Th <- bf(Th ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho1 <- bf(Ho1 ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
mod1 <- brm(bf_Std +
bf_Alt +
bf_Ho2 +
bf_In +
bf_Sc +
bf_Y +
bf_Be +
bf_Co +
bf_Th +
bf_Ho1 +
set_rescor(TRUE),
data = df_mv_as,
prior = c(prior(normal(0, 1), class = "Intercept", resp = "Std"),
prior(normal(0, 1), class = "Intercept", resp = "Alt"),
prior(normal(0, 1), class = "Intercept", resp = "Ho2"),
prior(normal(0, 1), class = "Intercept", resp = "In"),
prior(normal(0, 1), class = "Intercept", resp = "Sc"),
prior(normal(0, 1), class = "Intercept", resp = "Y"),
prior(normal(0, 1), class = "Intercept", resp = "Be"),
prior(normal(0, 1), class = "Intercept", resp = "Co"),
prior(normal(0, 1), class = "Intercept", resp = "Th"),
prior(normal(0, 1), class = "Intercept", resp = "Ho1"),
prior(normal(0, 1), class = "b", resp = "Std"),
prior(normal(0, 1), class = "b", resp = "Alt"),
prior(normal(0, 1), class = "b", resp = "Ho2"),
prior(normal(0, 1), class = "b", resp = "In"),
prior(normal(0, 1), class = "b", resp = "Sc"),
prior(normal(0, 1), class = "b", resp = "Y"),
prior(normal(0, 1), class = "b", resp = "Be"),
prior(normal(0, 1), class = "b", resp = "Co"),
prior(normal(0, 1), class = "b", resp = "Th"),
prior(normal(0, 1), class = "b", resp = "Ho1"),
prior(normal(0, 1), class = "sd", resp = "Std"),
prior(normal(0, 1), class = "sd", resp = "Alt"),
prior(normal(0, 1), class = "sd", resp = "Ho2"),
prior(normal(0, 1), class = "sd", resp = "In"),
prior(normal(0, 1), class = "sd", resp = "Sc"),
prior(normal(0, 1), class = "sd", resp = "Y"),
prior(normal(0, 1), class = "sd", resp = "Be"),
prior(normal(0, 1), class = "sd", resp = "Co"),
prior(normal(0, 1), class = "sd", resp = "Th"),
prior(normal(0, 1), class = "sd", resp = "Ho1"),
prior(normal(0, 1), class = "sigma", resp = "Std"),
prior(normal(0, 1), class = "sigma", resp = "Alt"),
prior(normal(0, 1), class = "sigma", resp = "Ho2"),
prior(normal(0, 1), class = "sigma", resp = "In"),
prior(normal(0, 1), class = "sigma", resp = "Sc"),
prior(normal(0, 1), class = "sigma", resp = "Y"),
prior(normal(0, 1), class = "sigma", resp = "Be"),
prior(normal(0, 1), class = "sigma", resp = "Co"),
prior(normal(0, 1), class = "sigma", resp = "Th"),
prior(normal(0, 1), class = "sigma", resp = "Ho1"),
prior(lkj(1), class = "rescor")
),
control = list(adapt_delta = 0.90, max_treedepth = 12),
init_r = 0.05,
save_pars = save_pars(all = TRUE),
seed = 6518,
chains=4,
iter=2000,
cores=4 )
save(mod1, file = "full-analysis-files/mod1_As_mv.rda")
Tabular parameter estimates
Next, a summary of the posterior estimates.
Family: MV(gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian)
Links: mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
mu = identity; sigma = identity
Formula: Std ~ tune + (1 | matrix) + (1 | day_expt)
Alt ~ tune + (1 | matrix) + (1 | day_expt)
Ho2 ~ tune + (1 | matrix) + (1 | day_expt)
In ~ tune + (1 | matrix) + (1 | day_expt)
Sc ~ tune + (1 | matrix) + (1 | day_expt)
Y ~ tune + (1 | matrix) + (1 | day_expt)
Be ~ tune + (1 | matrix) + (1 | day_expt)
Co ~ tune + (1 | matrix) + (1 | day_expt)
Th ~ tune + (1 | matrix) + (1 | day_expt)
Ho1 ~ tune + (1 | matrix) + (1 | day_expt)
Data: df_mv_as (Number of observations: 352)
Samples: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
total post-warmup samples = 4000
Priors:
b_Alt ~ normal(0, 1)
b_Be ~ normal(0, 1)
b_Co ~ normal(0, 1)
b_Ho1 ~ normal(0, 1)
b_Ho2 ~ normal(0, 1)
b_In ~ normal(0, 1)
b_Sc ~ normal(0, 1)
b_Std ~ normal(0, 1)
b_Th ~ normal(0, 1)
b_Y ~ normal(0, 1)
Intercept_Alt ~ normal(0, 1)
Intercept_Be ~ normal(0, 1)
Intercept_Co ~ normal(0, 1)
Intercept_Ho1 ~ normal(0, 1)
Intercept_Ho2 ~ normal(0, 1)
Intercept_In ~ normal(0, 1)
Intercept_Sc ~ normal(0, 1)
Intercept_Std ~ normal(0, 1)
Intercept_Th ~ normal(0, 1)
Intercept_Y ~ normal(0, 1)
Lrescor ~ lkj_corr_cholesky(1)
sd_Alt ~ normal(0, 1)
sd_Be ~ normal(0, 1)
sd_Co ~ normal(0, 1)
sd_Ho1 ~ normal(0, 1)
sd_Ho2 ~ normal(0, 1)
sd_In ~ normal(0, 1)
sd_Sc ~ normal(0, 1)
sd_Std ~ normal(0, 1)
sd_Th ~ normal(0, 1)
sd_Y ~ normal(0, 1)
sigma_Alt ~ normal(0, 1)
sigma_Be ~ normal(0, 1)
sigma_Co ~ normal(0, 1)
sigma_Ho1 ~ normal(0, 1)
sigma_Ho2 ~ normal(0, 1)
sigma_In ~ normal(0, 1)
sigma_Sc ~ normal(0, 1)
sigma_Std ~ normal(0, 1)
sigma_Th ~ normal(0, 1)
sigma_Y ~ normal(0, 1)
Group-Level Effects:
~day_expt (Number of levels: 8)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.04 0.02 0.02 0.09 1.00 3086 3089
sd(Alt_Intercept) 0.10 0.04 0.05 0.19 1.00 2751 2747
sd(Ho2_Intercept) 0.02 0.01 0.00 0.05 1.00 1993 2426
sd(In_Intercept) 0.28 0.09 0.16 0.52 1.00 4724 2584
sd(Sc_Intercept) 0.18 0.07 0.10 0.34 1.00 3073 2982
sd(Y_Intercept) 0.27 0.09 0.15 0.50 1.00 4818 2657
sd(Be_Intercept) 0.31 0.10 0.18 0.57 1.00 3370 2977
sd(Co_Intercept) 0.29 0.10 0.17 0.54 1.00 3524 2850
sd(Th_Intercept) 0.57 0.17 0.34 0.99 1.00 4400 2902
sd(Ho1_Intercept) 0.56 0.18 0.32 0.99 1.00 5019 2729
~matrix (Number of levels: 22)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.06 0.01 0.04 0.08 1.00 1649 2770
sd(Alt_Intercept) 0.05 0.01 0.03 0.08 1.00 1504 2775
sd(Ho2_Intercept) 0.06 0.01 0.04 0.09 1.00 1606 2287
sd(In_Intercept) 0.10 0.02 0.07 0.14 1.00 2511 3094
sd(Sc_Intercept) 0.17 0.03 0.12 0.24 1.00 2571 3079
sd(Y_Intercept) 0.08 0.02 0.06 0.12 1.00 2852 2997
sd(Be_Intercept) 0.13 0.03 0.09 0.20 1.00 2680 2724
sd(Co_Intercept) 0.05 0.01 0.03 0.08 1.00 2171 2897
sd(Th_Intercept) 0.38 0.07 0.28 0.53 1.00 2083 2767
sd(Ho1_Intercept) 0.26 0.05 0.19 0.38 1.00 2009 2523
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Std_Intercept 0.12 0.02 0.08 0.16 1.00 2900 2697
Alt_Intercept 0.16 0.04 0.09 0.23 1.00 2720 2988
Ho2_Intercept 0.12 0.02 0.09 0.16 1.00 3598 3242
In_Intercept -0.04 0.11 -0.25 0.19 1.00 2188 2595
Sc_Intercept -0.00 0.08 -0.16 0.15 1.00 2226 2478
Y_Intercept -0.06 0.10 -0.25 0.14 1.00 2199 2616
Be_Intercept 0.02 0.12 -0.21 0.26 1.00 2030 2895
Co_Intercept 0.01 0.10 -0.19 0.22 1.00 2135 2797
Th_Intercept -0.23 0.22 -0.66 0.20 1.00 2177 2582
Ho1_Intercept -0.19 0.21 -0.62 0.23 1.00 2022 2482
Std_tuneHHe 0.02 0.01 -0.01 0.04 1.00 4290 3272
Alt_tuneHHe -0.00 0.01 -0.03 0.02 1.00 4111 3542
Ho2_tuneHHe 0.02 0.01 -0.00 0.05 1.00 3977 3479
In_tuneHHe -0.03 0.02 -0.06 0.00 1.00 3283 3249
Sc_tuneHHe -0.17 0.02 -0.21 -0.13 1.00 4331 3119
Y_tuneHHe -0.10 0.02 -0.13 -0.07 1.00 3388 3090
Be_tuneHHe -0.14 0.03 -0.19 -0.08 1.00 4509 3154
Co_tuneHHe -0.09 0.02 -0.12 -0.06 1.00 3242 3296
Th_tuneHHe 0.00 0.03 -0.06 0.06 1.00 5400 3520
Ho1_tuneHHe -0.06 0.02 -0.10 -0.01 1.00 5038 3492
Family Specific Parameters:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sigma_Std 0.10 0.00 0.09 0.11 1.00 3015 3433
sigma_Alt 0.12 0.00 0.11 0.13 1.00 3053 3453
sigma_Ho2 0.12 0.00 0.11 0.13 1.00 2920 3491
sigma_In 0.14 0.01 0.13 0.15 1.00 3044 3377
sigma_Sc 0.21 0.01 0.19 0.23 1.00 4066 3239
sigma_Y 0.15 0.01 0.14 0.16 1.00 3035 3078
sigma_Be 0.26 0.01 0.24 0.28 1.00 4450 3559
sigma_Co 0.15 0.01 0.14 0.16 1.00 3022 3219
sigma_Th 0.28 0.01 0.26 0.31 1.00 3681 3135
sigma_Ho1 0.22 0.01 0.20 0.24 1.00 4005 3139
Residual Correlations:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
rescor(Std,Alt) 0.67 0.03 0.60 0.73 1.00 3403 3434
rescor(Std,Ho2) 0.59 0.04 0.52 0.66 1.00 3041 3441
rescor(Alt,Ho2) 0.55 0.04 0.47 0.63 1.00 3628 3353
rescor(Std,In) 0.52 0.04 0.43 0.59 1.00 3069 2760
rescor(Alt,In) 0.49 0.04 0.40 0.57 1.00 3160 3190
rescor(Ho2,In) 0.59 0.04 0.51 0.66 1.00 3583 3074
rescor(Std,Sc) 0.42 0.05 0.33 0.51 1.00 3372 3310
rescor(Alt,Sc) 0.40 0.05 0.31 0.49 1.00 3808 3337
rescor(Ho2,Sc) 0.54 0.04 0.46 0.61 1.00 4235 2825
rescor(In,Sc) 0.67 0.03 0.60 0.73 1.00 4341 3011
rescor(Std,Y) 0.51 0.04 0.43 0.59 1.00 2940 3126
rescor(Alt,Y) 0.48 0.04 0.40 0.56 1.00 3034 3171
rescor(Ho2,Y) 0.62 0.03 0.55 0.68 1.00 3768 2785
rescor(In,Y) 0.93 0.01 0.92 0.95 1.00 4336 3322
rescor(Sc,Y) 0.84 0.02 0.81 0.87 1.00 4377 3372
rescor(Std,Be) 0.32 0.05 0.22 0.41 1.00 4025 3056
rescor(Alt,Be) 0.28 0.05 0.17 0.38 1.00 4557 3750
rescor(Ho2,Be) 0.36 0.05 0.26 0.45 1.00 4698 3860
rescor(In,Be) 0.33 0.05 0.23 0.42 1.00 4050 3618
rescor(Sc,Be) 0.27 0.05 0.17 0.37 1.00 4310 2970
rescor(Y,Be) 0.34 0.05 0.25 0.43 1.00 4238 3382
rescor(Std,Co) 0.50 0.04 0.42 0.58 1.00 2808 2975
rescor(Alt,Co) 0.46 0.04 0.36 0.54 1.00 3320 3110
rescor(Ho2,Co) 0.59 0.04 0.51 0.65 1.00 3392 3288
rescor(In,Co) 0.69 0.03 0.63 0.74 1.00 3581 3131
rescor(Sc,Co) 0.62 0.03 0.55 0.68 1.00 3482 3081
rescor(Y,Co) 0.74 0.02 0.69 0.79 1.00 3760 3252
rescor(Be,Co) 0.79 0.02 0.74 0.82 1.00 4696 3876
rescor(Std,Th) 0.21 0.05 0.10 0.31 1.00 4516 3243
rescor(Alt,Th) 0.20 0.05 0.10 0.31 1.00 4930 3321
rescor(Ho2,Th) 0.14 0.05 0.03 0.25 1.00 4283 2953
rescor(In,Th) 0.55 0.04 0.48 0.63 1.00 4489 3072
rescor(Sc,Th) -0.04 0.05 -0.15 0.06 1.00 4119 3400
rescor(Y,Th) 0.36 0.05 0.26 0.45 1.00 4374 3285
rescor(Be,Th) 0.54 0.04 0.46 0.62 1.00 4570 3697
rescor(Co,Th) 0.56 0.04 0.48 0.63 1.00 4717 3438
rescor(Std,Ho1) 0.29 0.05 0.19 0.39 1.00 4620 3225
rescor(Alt,Ho1) 0.31 0.05 0.21 0.41 1.00 4996 3293
rescor(Ho2,Ho1) 0.12 0.05 0.01 0.22 1.00 4211 3302
rescor(In,Ho1) 0.57 0.04 0.49 0.64 1.00 4492 3418
rescor(Sc,Ho1) -0.02 0.05 -0.13 0.08 1.00 4119 3242
rescor(Y,Ho1) 0.39 0.05 0.30 0.48 1.00 4425 3598
rescor(Be,Ho1) 0.47 0.04 0.39 0.55 1.00 4246 3540
rescor(Co,Ho1) 0.54 0.04 0.46 0.61 1.00 4322 3164
rescor(Th,Ho1) 0.95 0.01 0.94 0.96 1.00 4613 3586
Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
This tabular result is particularly helpful for looking at HMC convergence diagnostics (Rhat, ESS). There were no apparent issues with the HMC estimation procedure. The parameter summaries are also helpful, but it is more efficient to explore their implications graphically, as will be done for the final models to follow.
Model checks
Posterior predictive checks are useful for visualizing the extent to which the fitted model generates replicate data that resembles the observed data.
Density overlay
In the first check, 50 individual draws from the posterior predictive distribution of the fitted model were summarized using a density plot. The individual draws can be thought of as simulations of potential datasets from a data generating process the model is representing. The density plots of these hypothetical datasets (blue lines) are compared to the density plot for the observed data (black line) to gauge whether the observed data could have reasonably been drawn from the same data generating process.










There are several indications that the fitted model should be improved upon. It is fairly clear that the simulated datasets don’t match well to the observed data for most of the methods, except for perhaps the alternative isotope, \(In\), and \(Y\). In most cases, it appears that the model predictions are underdispersed relative to the data, indicating that additional structure may be helpful.
No further checks on this model are necessary at this point because it is clear that improvement is needed. However, cross-validation is performed below in order to quantify potential improvements from this initial model moving forward.
Leave-one-out CV
Next, a Bayesian leave-one-out cross validation (‘LOO-CV’) assessment is conducted using the \(\textbf{loo}\) package in \(\textbf{R}\), which implements fast and stable computations for approximate LOO-CV (and WAIC) (Vehtari, Gelman, and Gabry 2017). These computations estimate pointwise, out-of-sample prediction accuracy from a fitted model by using the log-likelihood evaluated at the posterior simulations of the parameters. The \(\textbf{brms}\) package automatically calculates the log-likelihood for all relevant models, making it simple to use in conjunction with the \(\textbf{loo}\) package. For additional information on \(\textbf{loo}\) and LOO-CV in general, see: http://mc-stan.org/loo/.
Pareto-smoothed importance sampling is the method used in \(\textbf{loo}\) for approximating the true leave-one-out posterior. The model is fit once, the log-likelihood for each data point is saved, and loo()
utilizes that calculation to re-weight and approximate the leave-one-out posterior. This is convenient because it enables model evaluations via leave-one-out estimates without the need to fit the model \(N\) times. However, the approximation can fail, and the \(\textbf{loo}\) package provides some diagnostics that indicate when failure is more likely. In particular, each data point is assigned an importance ratio, \(k\), which indicates how “influential” it may be. As such, too many data points with high (pareto-k > 0.7) or very high (pareto-k > 1) influence may indicate problems with the approximation. When there are too many such points, it is generally recommended to re-fit the model with a more traditional leave-k-out method, such as k-fold. Note that observations with high \(k\) are only problematic in the sense of trying to approximate the leave-one-out posterior, and there isn’t necessarily anything inherently wrong with them. However, observations with high \(\hat{k}\) may suggest an outsized influence on the posterior (Gabry et al. 2019).
Computed from 4000 by 352 log-likelihood matrix
------
Monte Carlo SE of elpd_loo is NA.
Pareto k diagnostic values:
Count Pct. Min. n_eff
(-Inf, 0.5] (good) 300 85.2% 460
(0.5, 0.7] (ok) 44 12.5% 87
(0.7, 1] (bad) 7 2.0% 15
(1, Inf) (very bad) 1 0.3% 28
See help('pareto-k-diagnostic') for details.
The \(\textbf{loo}\) calculation resulted in 8 potentially “problematic” observations (i.e., Pareto k > 0.7). The next step is to refit the model 8 times in order to compute the exact cross validation for each of the 8 problematic observations (“reloo”). If the “reloo” pareto-k are all less than 0.7, then those 8 calculations can be substituted for computing the pointwise contributions to total \(elpd_{loo}\). Otherwise, a k-fold or similar method should be used to compute a true leave-k-out posterior density.
With regard to the other outputs from the summary(loo)
call, reference: https://mc-stan.org/loo/reference/loo-glossary.html. In short, the \(elpd_{loo}\) is a way to compare models. For each observation, a calculation of how “surprised” the model is to see the left-out data point is made based on the predictive density at the observed value. The \(elpd_{loo}\) is a sum of these individual contributions. The \(p_loo\), by comparison, is the difference between the \(elpd_{loo}\) and the non-CV log posterior predictive density, and may be interpreted as the effective number of parameters. The \(looic\), finally, is just \(-2^{elpd_{loo}}\) to provide output on the conventional scale of “deviance” or AIC.
The pareto-k can be plotted to get an indication of which specific observations are problematic and may have outsized influence.

load("full-analysis-files/loo_1.rda")
load("full-analysis-files/df_mv_as.rda")
df_mv_as[which(loo_1$diagnostics$pareto_k > 0.7), ] %>% print()
All of the potentially problematic observations look to be associated with the 250ppm matrices and half of them on from 3/30, the date of the cone change.
In any case, a re-loo for these 8 observations is needed calculate the \(elpd_{loo}\).
Computed from 4000 by 352 log-likelihood matrix
------
Monte Carlo SE of elpd_loo is 0.7.
Pareto k diagnostic values:
Count Pct. Min. n_eff
(-Inf, 0.5] (good) 308 87.5% 15
(0.5, 0.7] (ok) 44 12.5% 87
(0.7, 1] (bad) 0 0.0% <NA>
(1, Inf) (very bad) 0 0.0% <NA>
All Pareto k estimates are ok (k < 0.7).
See help('pareto-k-diagnostic') for details.
The reloo eliminated concerns with the potentially problematic observations with regard to the \(elpd_{loo}\). This information can be used to compare this model with others to follow.
A more flexible arsenic model
For the next model, the \(\sigma\) term is also assigned a linear predictor. This is often referred to as a distributional model or a model with heterogeneous variances. From the exploratory plots above, this seemed like a reasonable next approximation, given apparent heterogeneity of variances for some methods across matrices, tunes, and days. In this model, \(\sigma\) is allowed to vary in the same manner as \(\mu\). That is, \(\sigma\) is modeled as a linear function of a fixed tune effect and varying effects for matrix and day of the experiment. For more information on fitting distributional models in \(\textbf{brms}\) see (Bürkner 2017) and: https://cran.r-project.org/web/packages/brms/vignettes/brms_distreg.html
load("full-analysis-files/df_mv_as.rda")
bf_Std <- bf(Std ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Alt <- bf(Alt ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho2 <- bf(Ho2 ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_In <- bf(In ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Sc <- bf(Sc ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Y <- bf(Y ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Be <- bf(Be ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Co <- bf(Co ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Th <- bf(Th ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho1 <- bf(Ho1 ~ tune + (1 | matrix) + (1 | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
mod2 <- brm(bf_Std +
bf_Alt +
bf_Ho2 +
bf_In +
bf_Sc +
bf_Y +
bf_Be +
bf_Co +
bf_Th +
bf_Ho1 +
set_rescor(TRUE),
data = df_mv_as,
prior = c(prior(normal(0, 1), class = "Intercept", resp = "Std"),
prior(normal(0, 1), class = "Intercept", resp = "Alt"),
prior(normal(0, 1), class = "Intercept", resp = "Ho2"),
prior(normal(0, 1), class = "Intercept", resp = "In"),
prior(normal(0, 1), class = "Intercept", resp = "Sc"),
prior(normal(0, 1), class = "Intercept", resp = "Y"),
prior(normal(0, 1), class = "Intercept", resp = "Be"),
prior(normal(0, 1), class = "Intercept", resp = "Co"),
prior(normal(0, 1), class = "Intercept", resp = "Th"),
prior(normal(0, 1), class = "Intercept", resp = "Ho1"),
prior(normal(0, 1), class = "b", resp = "Std"),
prior(normal(0, 1), class = "b", resp = "Alt"),
prior(normal(0, 1), class = "b", resp = "Ho2"),
prior(normal(0, 1), class = "b", resp = "In"),
prior(normal(0, 1), class = "b", resp = "Sc"),
prior(normal(0, 1), class = "b", resp = "Y"),
prior(normal(0, 1), class = "b", resp = "Be"),
prior(normal(0, 1), class = "b", resp = "Co"),
prior(normal(0, 1), class = "b", resp = "Th"),
prior(normal(0, 1), class = "b", resp = "Ho1"),
prior(normal(0, 1), class = "sd", resp = "Std"),
prior(normal(0, 1), class = "sd", resp = "Alt"),
prior(normal(0, 1), class = "sd", resp = "Ho2"),
prior(normal(0, 1), class = "sd", resp = "In"),
prior(normal(0, 1), class = "sd", resp = "Sc"),
prior(normal(0, 1), class = "sd", resp = "Y"),
prior(normal(0, 1), class = "sd", resp = "Be"),
prior(normal(0, 1), class = "sd", resp = "Co"),
prior(normal(0, 1), class = "sd", resp = "Th"),
prior(normal(0, 1), class = "sd", resp = "Ho1"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Std"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Alt"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Ho2"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "In"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Sc"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Y"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Be"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Co"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Th"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Std"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Alt"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "In"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Sc"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Y"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Be"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Co"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Th"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Std"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Alt"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "In"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Sc"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Y"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Be"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Co"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Th"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Ho1")#,
prior(lkj(1), class = "rescor")
),
control = list(adapt_delta = 0.95, max_treedepth = 14),
init_r = 0.05,
save_pars = save_pars(all = TRUE),
seed = 65112,
chains=4,
iter=3000,
cores=4 )
save(mod2, file = "full-analysis-files/mod2_As_mv.rda")
Tabular parameter estimates
Again, a summary of the posterior estimates.
Family: MV(gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian)
Links: mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
Formula: Std ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Alt ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho2 ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
In ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Sc ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Y ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Be ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Co ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Th ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho1 ~ tune + (1 | matrix) + (1 | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Data: df_mv_as (Number of observations: 352)
Samples: 4 chains, each with iter = 3000; warmup = 1500; thin = 1;
total post-warmup samples = 6000
Priors:
b_Alt ~ normal(0, 1)
b_Alt_sigma ~ normal(0, 1)
b_Be ~ normal(0, 1)
b_Be_sigma ~ normal(0, 1)
b_Co ~ normal(0, 1)
b_Co_sigma ~ normal(0, 1)
b_Ho1 ~ normal(0, 1)
b_Ho1_sigma ~ normal(0, 1)
b_Ho2 ~ normal(0, 1)
b_Ho2_sigma ~ normal(0, 1)
b_In ~ normal(0, 1)
b_In_sigma ~ normal(0, 1)
b_Sc ~ normal(0, 1)
b_Sc_sigma ~ normal(0, 1)
b_Std ~ normal(0, 1)
b_Std_sigma ~ normal(0, 1)
b_Th ~ normal(0, 1)
b_Th_sigma ~ normal(0, 1)
b_Y ~ normal(0, 1)
b_Y_sigma ~ normal(0, 1)
Intercept_Alt ~ normal(0, 1)
Intercept_Alt_sigma ~ normal(-1, 2)
Intercept_Be ~ normal(0, 1)
Intercept_Be_sigma ~ normal(-1, 2)
Intercept_Co ~ normal(0, 1)
Intercept_Co_sigma ~ normal(-1, 2)
Intercept_Ho1 ~ normal(0, 1)
Intercept_Ho1_sigma ~ normal(-1, 2)
Intercept_Ho2 ~ normal(0, 1)
Intercept_Ho2_sigma ~ normal(-1, 2)
Intercept_In ~ normal(0, 1)
Intercept_In_sigma ~ normal(-1, 2)
Intercept_Sc ~ normal(0, 1)
Intercept_Sc_sigma ~ normal(-1, 2)
Intercept_Std ~ normal(0, 1)
Intercept_Std_sigma ~ normal(-1, 2)
Intercept_Th ~ normal(0, 1)
Intercept_Th_sigma ~ normal(-1, 2)
Intercept_Y ~ normal(0, 1)
Intercept_Y_sigma ~ normal(-1, 2)
Lrescor ~ lkj_corr_cholesky(1)
sd_Alt ~ normal(0, 1)
sd_Alt_sigma ~ normal(0, 1)
sd_Be ~ normal(0, 1)
sd_Be_sigma ~ normal(0, 1)
sd_Co ~ normal(0, 1)
sd_Co_sigma ~ normal(0, 1)
sd_Ho1 ~ normal(0, 1)
sd_Ho1_sigma ~ normal(0, 1)
sd_Ho2 ~ normal(0, 1)
sd_Ho2_sigma ~ normal(0, 1)
sd_In ~ normal(0, 1)
sd_In_sigma ~ normal(0, 1)
sd_Sc ~ normal(0, 1)
sd_Sc_sigma ~ normal(0, 1)
sd_Std ~ normal(0, 1)
sd_Std_sigma ~ normal(0, 1)
sd_Th ~ normal(0, 1)
sd_Th_sigma ~ normal(0, 1)
sd_Y ~ normal(0, 1)
sd_Y_sigma ~ normal(0, 1)
Group-Level Effects:
~day_expt (Number of levels: 8)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.06 0.02 0.03 0.11 1.00 3615 4466
sd(sigma_Std_Intercept) 0.27 0.11 0.13 0.53 1.00 2765 4412
sd(Alt_Intercept) 0.11 0.04 0.06 0.21 1.00 3503 3864
sd(sigma_Alt_Intercept) 0.30 0.11 0.15 0.57 1.00 3511 4680
sd(Ho2_Intercept) 0.04 0.02 0.02 0.08 1.00 2503 3415
sd(sigma_Ho2_Intercept) 0.37 0.14 0.20 0.72 1.00 3580 4494
sd(In_Intercept) 0.28 0.10 0.16 0.54 1.00 4809 4057
sd(sigma_In_Intercept) 0.35 0.12 0.19 0.64 1.00 5012 4390
sd(Sc_Intercept) 0.17 0.06 0.09 0.34 1.00 4209 3799
sd(sigma_Sc_Intercept) 0.36 0.13 0.19 0.69 1.00 3751 3806
sd(Y_Intercept) 0.26 0.09 0.14 0.48 1.00 5100 4706
sd(sigma_Y_Intercept) 0.38 0.13 0.21 0.72 1.00 5462 3757
sd(Be_Intercept) 0.27 0.09 0.15 0.51 1.00 5045 4557
sd(sigma_Be_Intercept) 0.43 0.15 0.23 0.80 1.00 4139 4482
sd(Co_Intercept) 0.24 0.09 0.13 0.45 1.00 3982 4211
sd(sigma_Co_Intercept) 0.47 0.16 0.27 0.89 1.00 5742 4732
sd(Th_Intercept) 0.55 0.17 0.32 0.97 1.00 5601 4141
sd(sigma_Th_Intercept) 0.54 0.18 0.31 1.00 1.00 5674 4427
sd(Ho1_Intercept) 0.53 0.17 0.31 0.96 1.00 5674 4022
sd(sigma_Ho1_Intercept) 0.55 0.18 0.31 0.98 1.00 4744 3706
~matrix (Number of levels: 22)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.05 0.01 0.04 0.08 1.00 1813 2752
sd(sigma_Std_Intercept) 0.10 0.05 0.01 0.19 1.00 2181 2191
sd(Alt_Intercept) 0.05 0.01 0.04 0.08 1.01 1921 3385
sd(sigma_Alt_Intercept) 0.07 0.04 0.00 0.16 1.00 2551 2997
sd(Ho2_Intercept) 0.07 0.01 0.05 0.09 1.00 2861 3404
sd(sigma_Ho2_Intercept) 0.07 0.04 0.00 0.17 1.00 2286 3157
sd(In_Intercept) 0.10 0.02 0.07 0.14 1.00 3518 4200
sd(sigma_In_Intercept) 0.06 0.03 0.01 0.12 1.01 894 1448
sd(Sc_Intercept) 0.09 0.02 0.06 0.13 1.00 3309 3995
sd(sigma_Sc_Intercept) 0.19 0.05 0.12 0.30 1.01 1162 3376
sd(Y_Intercept) 0.07 0.01 0.05 0.09 1.00 3371 3575
sd(sigma_Y_Intercept) 0.06 0.03 0.01 0.13 1.02 505 1730
sd(Be_Intercept) 0.09 0.02 0.06 0.12 1.00 3481 4420
sd(sigma_Be_Intercept) 0.12 0.05 0.03 0.21 1.00 1284 1874
sd(Co_Intercept) 0.04 0.01 0.03 0.06 1.00 2664 4029
sd(sigma_Co_Intercept) 0.08 0.03 0.02 0.15 1.00 694 1106
sd(Th_Intercept) 0.28 0.05 0.21 0.40 1.00 3082 4260
sd(sigma_Th_Intercept) 0.04 0.02 0.00 0.09 1.00 1204 2592
sd(Ho1_Intercept) 0.20 0.03 0.15 0.28 1.00 2981 3655
sd(sigma_Ho1_Intercept) 0.03 0.02 0.00 0.06 1.00 2258 3281
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Std_Intercept 0.11 0.03 0.06 0.17 1.00 3033 3538
sigma_Std_Intercept -2.54 0.11 -2.77 -2.32 1.00 4051 3879
Alt_Intercept 0.15 0.04 0.06 0.23 1.00 3174 3724
sigma_Alt_Intercept -2.35 0.13 -2.59 -2.09 1.00 4087 4131
Ho2_Intercept 0.11 0.02 0.07 0.16 1.00 3036 3628
sigma_Ho2_Intercept -2.53 0.15 -2.83 -2.23 1.00 3809 4110
In_Intercept -0.04 0.11 -0.26 0.16 1.00 2489 3302
sigma_In_Intercept -2.36 0.14 -2.64 -2.08 1.00 3332 4004
Sc_Intercept -0.01 0.07 -0.15 0.13 1.00 2618 3312
sigma_Sc_Intercept -2.23 0.15 -2.52 -1.93 1.00 3660 4013
Y_Intercept -0.06 0.09 -0.25 0.13 1.00 2566 3332
sigma_Y_Intercept -2.38 0.15 -2.67 -2.07 1.00 2858 2805
Be_Intercept 0.00 0.10 -0.20 0.20 1.00 2913 3808
sigma_Be_Intercept -1.96 0.17 -2.30 -1.62 1.00 3292 3494
Co_Intercept 0.01 0.09 -0.18 0.19 1.00 2588 3070
sigma_Co_Intercept -2.30 0.18 -2.66 -1.92 1.00 2991 3307
Th_Intercept -0.22 0.20 -0.62 0.21 1.00 2863 3481
sigma_Th_Intercept -1.81 0.21 -2.25 -1.38 1.00 2904 3629
Ho1_Intercept -0.20 0.19 -0.59 0.20 1.00 2243 2965
sigma_Ho1_Intercept -2.04 0.21 -2.46 -1.61 1.00 3056 3598
Std_tuneHHe 0.06 0.01 0.03 0.08 1.01 907 1508
sigma_Std_tuneHHe 0.33 0.07 0.19 0.46 1.00 8229 5182
Alt_tuneHHe 0.05 0.02 0.01 0.08 1.01 886 1479
sigma_Alt_tuneHHe 0.33 0.08 0.18 0.49 1.00 7622 4970
Ho2_tuneHHe 0.08 0.01 0.05 0.11 1.01 890 1595
sigma_Ho2_tuneHHe 0.62 0.07 0.47 0.76 1.00 5943 4605
In_tuneHHe 0.07 0.03 0.01 0.11 1.01 647 971
sigma_In_tuneHHe 0.79 0.05 0.70 0.89 1.00 4889 5044
Sc_tuneHHe -0.02 0.03 -0.08 0.03 1.01 725 1601
sigma_Sc_tuneHHe 0.92 0.06 0.80 1.03 1.00 6327 5232
Y_tuneHHe 0.01 0.03 -0.05 0.06 1.01 617 1013
sigma_Y_tuneHHe 0.90 0.05 0.81 0.99 1.00 5097 4938
Be_tuneHHe 0.08 0.04 -0.02 0.15 1.01 787 1208
sigma_Be_tuneHHe 1.02 0.06 0.90 1.14 1.00 6619 4862
Co_tuneHHe 0.05 0.03 -0.01 0.10 1.01 614 935
sigma_Co_tuneHHe 0.86 0.04 0.77 0.95 1.00 5688 4523
Th_tuneHHe 0.12 0.05 0.01 0.21 1.01 774 1181
sigma_Th_tuneHHe 0.87 0.06 0.74 0.98 1.00 5701 5192
Ho1_tuneHHe 0.09 0.04 -0.01 0.15 1.01 715 1003
sigma_Ho1_tuneHHe 0.90 0.05 0.80 1.01 1.00 5444 4524
Residual Correlations:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
rescor(Std,Alt) 0.69 0.03 0.63 0.75 1.00 4172 4478
rescor(Std,Ho2) 0.65 0.03 0.58 0.71 1.00 4106 5092
rescor(Alt,Ho2) 0.62 0.04 0.54 0.69 1.00 4736 5105
rescor(Std,In) 0.61 0.04 0.53 0.68 1.00 3053 4368
rescor(Alt,In) 0.60 0.04 0.52 0.67 1.00 3181 3792
rescor(Ho2,In) 0.65 0.04 0.58 0.72 1.00 3412 4163
rescor(Std,Sc) 0.61 0.04 0.52 0.68 1.00 2450 3786
rescor(Alt,Sc) 0.59 0.04 0.50 0.67 1.00 1962 3439
rescor(Ho2,Sc) 0.69 0.03 0.62 0.76 1.01 1796 4334
rescor(In,Sc) 0.73 0.03 0.67 0.79 1.00 1711 3960
rescor(Std,Y) 0.65 0.04 0.57 0.71 1.00 2817 4495
rescor(Alt,Y) 0.63 0.04 0.55 0.70 1.00 2537 3823
rescor(Ho2,Y) 0.72 0.03 0.65 0.77 1.01 2398 4278
rescor(In,Y) 0.95 0.01 0.93 0.96 1.01 1193 3500
rescor(Sc,Y) 0.87 0.02 0.84 0.90 1.00 3300 4691
rescor(Std,Be) 0.49 0.05 0.39 0.58 1.00 3064 4036
rescor(Alt,Be) 0.48 0.05 0.38 0.57 1.00 2924 4175
rescor(Ho2,Be) 0.55 0.04 0.46 0.63 1.00 3026 4296
rescor(In,Be) 0.64 0.04 0.55 0.71 1.00 1711 3442
rescor(Sc,Be) 0.61 0.04 0.52 0.69 1.00 2191 4027
rescor(Y,Be) 0.65 0.04 0.57 0.72 1.00 1902 3844
rescor(Std,Co) 0.64 0.04 0.57 0.71 1.00 2855 4082
rescor(Alt,Co) 0.62 0.04 0.54 0.69 1.00 2762 3805
rescor(Ho2,Co) 0.73 0.03 0.67 0.79 1.00 2977 3654
rescor(In,Co) 0.86 0.02 0.82 0.89 1.00 1542 3425
rescor(Sc,Co) 0.83 0.02 0.78 0.87 1.01 1721 3908
rescor(Y,Co) 0.91 0.01 0.88 0.93 1.01 1586 3370
rescor(Be,Co) 0.87 0.02 0.83 0.90 1.00 2660 4560
rescor(Std,Th) 0.34 0.05 0.23 0.44 1.00 3292 4497
rescor(Alt,Th) 0.36 0.05 0.26 0.46 1.00 4112 4714
rescor(Ho2,Th) 0.30 0.06 0.18 0.41 1.00 2509 3711
rescor(In,Th) 0.75 0.03 0.69 0.80 1.00 2015 3855
rescor(Sc,Th) 0.24 0.06 0.11 0.36 1.01 1191 2758
rescor(Y,Th) 0.57 0.05 0.48 0.66 1.01 1358 3212
rescor(Be,Th) 0.63 0.04 0.54 0.70 1.00 2374 4444
rescor(Co,Th) 0.63 0.04 0.54 0.70 1.00 1725 3357
rescor(Std,Ho1) 0.44 0.05 0.34 0.53 1.00 3077 4364
rescor(Alt,Ho1) 0.48 0.05 0.38 0.56 1.00 3916 4466
rescor(Ho2,Ho1) 0.35 0.06 0.23 0.46 1.00 2211 3481
rescor(In,Ho1) 0.81 0.02 0.76 0.85 1.01 1511 2675
rescor(Sc,Ho1) 0.31 0.06 0.19 0.43 1.01 1139 2518
rescor(Y,Ho1) 0.65 0.04 0.56 0.72 1.01 1192 2499
rescor(Be,Ho1) 0.60 0.04 0.52 0.67 1.00 2155 3825
rescor(Co,Ho1) 0.66 0.04 0.57 0.72 1.01 1554 3213
rescor(Th,Ho1) 0.97 0.00 0.96 0.98 1.00 2470 4121
Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Again, no glaring issues with the HMC sampling.
Model checks
Posterior predictive checks are useful for visualizing the extent to which the fitted model generates replicate data that resembles the observed data.
Density overlay
Another posterior predictive check using the density overlay.










Though a clear improvement on the first model, there are still indications that the model predictions are under-dispersed relative to the observed data for many of the methods. Adding more structure could be helpful.
Leave-one-out CV
The \(\textbf{loo}\) procedure is performed again, for comparison with the previous and later models.
load("full-analysis-files/mod2_As_mv.rda")
loo_2 <- loo(x = mod2,
pointwise = TRUE,
moment_match = TRUE,
save_psis = TRUE,
cores = 10)
save(loo_2, file = "full-analysis-files/loo_2.rda")
Computed from 6000 by 352 log-likelihood matrix
------
Monte Carlo SE of elpd_loo is NA.
Pareto k diagnostic values:
Count Pct. Min. n_eff
(-Inf, 0.5] (good) 247 70.2% 473
(0.5, 0.7] (ok) 75 21.3% 149
(0.7, 1] (bad) 27 7.7% 17
(1, Inf) (very bad) 3 0.9% 9
See help('pareto-k-diagnostic') for details.
The \(\textbf{loo}\) calculation resulted in a large (30) number of potentially “problematic” observations.
Most of these, again, look to be observations in the 250ppm matrices. However, it is not all, so there may be other issues to consider. With so many k > 0.7, it is important to check that the model isn’t just terribly mis-specified. Comparing the number of model parameters (\(p = 745\)) to \(p_{loo}\) can be helpful in this regard. In this case, \(p_{loo} << p\), suggesting that the model may be mispecified, which would agree with the posterior predictive checks above (see: https://mc-stan.org/loo/reference/loo-glossary.html). However, another reasonable explanation would be that, with so many latent parameters over the different groupings (i.e, varying effects) with relatively few observations per group, leaving out any observations from any particular group can make for a noisy CV process. A solution, in that case, may be to add stronger priors over the standard deviations for the varying effects, but the current priors should already be reasonably informative to stabilize estimates. Therefore, the approach taken below will be to just add more structure to the model, particularly since the posterior predictive checks also hinted at some potential for mis-specification.
With regard to just calculating the CV criteria for this model, given the high number of potentially problematic observations it would be too computationally expensive to reloo, so a k-fold CV is in order. A k-fold CV is also needed for model 1 because it isn’t recommended to compare loo-CV and k-fold CV metrics.
K-fold CV
K-fold CV can be performed using the \(\textbf{brms}\) or \(\textbf{loo}\) package, and involves refitting the model K times, each time leaving out one-Kth of the original data (http://paul-buerkner.github.io/brms/reference/kfold.html).
First, the k-fold for model 1, where k = 10.
load("full-analysis-files/mod1_As_mv.rda")
library(future)
plan(multisession(workers = 10), gc = TRUE)
kfold_1 <- kfold(x = mod1, save_fits = TRUE, K = 10, chains = 4)
save(kfold_1, file = "full-analysis-files/kfold_1.rda")
plan(sequential)
Then, for model 2.
load("full-analysis-files/mod2_As_mv.rda")
library(future)
plan(multisession(workers = 10), gc = TRUE)
kfold_2 <- kfold(x = mod2, save_fits = TRUE, K = 10, chains = 4)
save(kfold_2, file = "full-analysis-files/kfold_2.rda")
plan(sequential)
The results for model 1.
Based on 10-fold cross-validation
And for model 2.
Based on 10-fold cross-validation
The direct comparison.
elpd_diff se_diff
mod2 0.0 0.0
mod1 -748.8 58.7
Clearly, model 2 is preferred by this metric. It has a much larger \(elpd_{kfold}\) and the difference from mod1 is much larger than standard error of the difference. It would be expected to perform better out-of-sample. However, the potential mis-specification remains, so another model is constructed below with additional structure.
A final model for arsenic
For the final model, additional structure is added to the \(\mu\) term. In this model, the tune effect is also allowed to vary by matrix and day of the experiment. That is, the difference between between the HHe tune and LHe tune is allowed to vary according to matrix and/or day of the experiment.
load("full-analysis-files/df_mv_as.rda")
bf_Std <- bf(Std ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Alt <- bf(Alt ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho2 <- bf(Ho2 ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_In <- bf(In ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Sc <- bf(Sc ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Y <- bf(Y ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Be <- bf(Be ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Co <- bf(Co ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Th <- bf(Th ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho1 <- bf(Ho1 ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
mod3 <- brm(bf_Std +
bf_Alt +
bf_Ho2 +
bf_In +
bf_Sc +
bf_Y +
bf_Be +
bf_Co +
bf_Th +
bf_Ho1 +
set_rescor(TRUE),
data = df_mv_as,
prior = c(prior(normal(0, 1), class = "Intercept", resp = "Std"),
prior(normal(0, 1), class = "Intercept", resp = "Alt"),
prior(normal(0, 1), class = "Intercept", resp = "Ho2"),
prior(normal(0, 1), class = "Intercept", resp = "In"),
prior(normal(0, 1), class = "Intercept", resp = "Sc"),
prior(normal(0, 1), class = "Intercept", resp = "Y"),
prior(normal(0, 1), class = "Intercept", resp = "Be"),
prior(normal(0, 1), class = "Intercept", resp = "Co"),
prior(normal(0, 1), class = "Intercept", resp = "Th"),
prior(normal(0, 1), class = "Intercept", resp = "Ho1"),
prior(normal(0, 1), class = "b", resp = "Std"),
prior(normal(0, 1), class = "b", resp = "Alt"),
prior(normal(0, 1), class = "b", resp = "Ho2"),
prior(normal(0, 1), class = "b", resp = "In"),
prior(normal(0, 1), class = "b", resp = "Sc"),
prior(normal(0, 1), class = "b", resp = "Y"),
prior(normal(0, 1), class = "b", resp = "Be"),
prior(normal(0, 1), class = "b", resp = "Co"),
prior(normal(0, 1), class = "b", resp = "Th"),
prior(normal(0, 1), class = "b", resp = "Ho1"),
prior(normal(0, 1), class = "sd", resp = "Std"),
prior(normal(0, 1), class = "sd", resp = "Alt"),
prior(normal(0, 1), class = "sd", resp = "Ho2"),
prior(normal(0, 1), class = "sd", resp = "In"),
prior(normal(0, 1), class = "sd", resp = "Sc"),
prior(normal(0, 1), class = "sd", resp = "Y"),
prior(normal(0, 1), class = "sd", resp = "Be"),
prior(normal(0, 1), class = "sd", resp = "Co"),
prior(normal(0, 1), class = "sd", resp = "Th"),
prior(normal(0, 1), class = "sd", resp = "Ho1"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Std"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Alt"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Ho2"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "In"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Sc"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Y"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Be"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Co"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Th"),
prior(normal(-1, 2), class = "Intercept", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Std"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Alt"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "In"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Sc"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Y"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Be"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Co"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Th"),
prior(normal(0, 1), class = "b", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Std"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Alt"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "In"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Sc"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Y"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Be"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Co"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Th"),
prior(normal(0, 1), class = "sd", dpar = "sigma", resp = "Ho1"),
prior(lkj(1), class = "rescor")
),
control = list(adapt_delta = 0.95, max_treedepth = 14),
init_r = 0.05,
save_pars = save_pars(all = TRUE),
seed = 5214,
chains=4,
iter=3000,
cores=4 )
save(mod3, file = "full-analysis-files/mod3_As_mv.rda")
Tabular parameter estimates
Again, a summary of the posterior estimates.
Family: MV(gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian)
Links: mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
Formula: Std ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Alt ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho2 ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
In ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Sc ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Y ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Be ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Co ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Th ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho1 ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Data: df_mv_as (Number of observations: 352)
Samples: 4 chains, each with iter = 3000; warmup = 1500; thin = 1;
total post-warmup samples = 6000
Priors:
b_Alt ~ normal(0, 1)
b_Alt_sigma ~ normal(0, 1)
b_Be ~ normal(0, 1)
b_Be_sigma ~ normal(0, 1)
b_Co ~ normal(0, 1)
b_Co_sigma ~ normal(0, 1)
b_Ho1 ~ normal(0, 1)
b_Ho1_sigma ~ normal(0, 1)
b_Ho2 ~ normal(0, 1)
b_Ho2_sigma ~ normal(0, 1)
b_In ~ normal(0, 1)
b_In_sigma ~ normal(0, 1)
b_Sc ~ normal(0, 1)
b_Sc_sigma ~ normal(0, 1)
b_Std ~ normal(0, 1)
b_Std_sigma ~ normal(0, 1)
b_Th ~ normal(0, 1)
b_Th_sigma ~ normal(0, 1)
b_Y ~ normal(0, 1)
b_Y_sigma ~ normal(0, 1)
Intercept_Alt ~ normal(0, 1)
Intercept_Alt_sigma ~ normal(-1, 2)
Intercept_Be ~ normal(0, 1)
Intercept_Be_sigma ~ normal(-1, 2)
Intercept_Co ~ normal(0, 1)
Intercept_Co_sigma ~ normal(-1, 2)
Intercept_Ho1 ~ normal(0, 1)
Intercept_Ho1_sigma ~ normal(-1, 2)
Intercept_Ho2 ~ normal(0, 1)
Intercept_Ho2_sigma ~ normal(-1, 2)
Intercept_In ~ normal(0, 1)
Intercept_In_sigma ~ normal(-1, 2)
Intercept_Sc ~ normal(0, 1)
Intercept_Sc_sigma ~ normal(-1, 2)
Intercept_Std ~ normal(0, 1)
Intercept_Std_sigma ~ normal(-1, 2)
Intercept_Th ~ normal(0, 1)
Intercept_Th_sigma ~ normal(-1, 2)
Intercept_Y ~ normal(0, 1)
Intercept_Y_sigma ~ normal(-1, 2)
L ~ lkj_corr_cholesky(1)
Lrescor ~ lkj_corr_cholesky(1)
sd_Alt ~ normal(0, 1)
sd_Alt_sigma ~ normal(0, 1)
sd_Be ~ normal(0, 1)
sd_Be_sigma ~ normal(0, 1)
sd_Co ~ normal(0, 1)
sd_Co_sigma ~ normal(0, 1)
sd_Ho1 ~ normal(0, 1)
sd_Ho1_sigma ~ normal(0, 1)
sd_Ho2 ~ normal(0, 1)
sd_Ho2_sigma ~ normal(0, 1)
sd_In ~ normal(0, 1)
sd_In_sigma ~ normal(0, 1)
sd_Sc ~ normal(0, 1)
sd_Sc_sigma ~ normal(0, 1)
sd_Std ~ normal(0, 1)
sd_Std_sigma ~ normal(0, 1)
sd_Th ~ normal(0, 1)
sd_Th_sigma ~ normal(0, 1)
sd_Y ~ normal(0, 1)
sd_Y_sigma ~ normal(0, 1)
Group-Level Effects:
~day_expt (Number of levels: 8)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.05 0.02 0.03 0.10 1.00 3817 3909
sd(Std_tuneHHe) 0.01 0.01 0.00 0.04 1.00 4030 3866
sd(sigma_Std_Intercept) 0.25 0.10 0.12 0.51 1.00 3389 4321
sd(Alt_Intercept) 0.13 0.05 0.07 0.26 1.00 4062 4051
sd(Alt_tuneHHe) 0.12 0.05 0.07 0.24 1.00 4136 3984
sd(sigma_Alt_Intercept) 0.22 0.09 0.10 0.45 1.00 3274 4162
sd(Ho2_Intercept) 0.05 0.02 0.03 0.10 1.00 3943 3977
sd(Ho2_tuneHHe) 0.09 0.03 0.05 0.18 1.00 4615 4436
sd(sigma_Ho2_Intercept) 0.35 0.13 0.18 0.66 1.00 4093 4383
sd(In_Intercept) 0.26 0.09 0.15 0.48 1.00 5454 4250
sd(In_tuneHHe) 0.05 0.03 0.01 0.11 1.00 3180 3483
sd(sigma_In_Intercept) 0.35 0.12 0.19 0.65 1.00 5854 4609
sd(Sc_Intercept) 0.17 0.06 0.09 0.33 1.00 5863 4477
sd(Sc_tuneHHe) 0.08 0.04 0.03 0.17 1.00 3410 3764
sd(sigma_Sc_Intercept) 0.34 0.13 0.18 0.66 1.00 4974 4432
sd(Y_Intercept) 0.26 0.10 0.14 0.51 1.00 5049 3333
sd(Y_tuneHHe) 0.05 0.02 0.02 0.11 1.00 3770 2611
sd(sigma_Y_Intercept) 0.37 0.13 0.21 0.71 1.00 6371 4577
sd(Be_Intercept) 0.26 0.10 0.14 0.53 1.00 5130 4426
sd(Be_tuneHHe) 0.22 0.09 0.11 0.45 1.00 4361 4423
sd(sigma_Be_Intercept) 0.38 0.14 0.20 0.72 1.00 4589 4465
sd(Co_Intercept) 0.23 0.08 0.13 0.43 1.00 4964 4367
sd(Co_tuneHHe) 0.11 0.04 0.05 0.22 1.00 3935 3936
sd(sigma_Co_Intercept) 0.41 0.14 0.23 0.78 1.00 5707 4972
sd(Th_Intercept) 0.55 0.18 0.31 1.00 1.00 6236 4958
sd(Th_tuneHHe) 0.12 0.05 0.05 0.24 1.00 6282 4695
sd(sigma_Th_Intercept) 0.52 0.18 0.30 0.97 1.00 6429 4403
sd(Ho1_Intercept) 0.53 0.18 0.30 0.97 1.00 6134 4400
sd(Ho1_tuneHHe) 0.12 0.05 0.06 0.24 1.00 5059 3954
sd(sigma_Ho1_Intercept) 0.47 0.16 0.27 0.86 1.00 6571 4685
cor(Std_Intercept,Std_tuneHHe) 0.12 0.56 -0.91 0.96 1.00 8554 4471
cor(Alt_Intercept,Alt_tuneHHe) -0.51 0.29 -0.90 0.22 1.00 4996 4178
cor(Ho2_Intercept,Ho2_tuneHHe) -0.65 0.26 -0.95 0.04 1.00 5014 4847
cor(In_Intercept,In_tuneHHe) -0.78 0.26 -1.00 -0.03 1.00 4758 4405
cor(Sc_Intercept,Sc_tuneHHe) -0.31 0.40 -0.91 0.54 1.00 4639 4175
cor(Y_Intercept,Y_tuneHHe) -0.31 0.43 -0.93 0.62 1.00 4026 3430
cor(Be_Intercept,Be_tuneHHe) 0.04 0.37 -0.67 0.73 1.00 6243 4211
cor(Co_Intercept,Co_tuneHHe) 0.49 0.33 -0.32 0.92 1.00 4675 4137
cor(Th_Intercept,Th_tuneHHe) -0.09 0.43 -0.80 0.73 1.00 6661 4624
cor(Ho1_Intercept,Ho1_tuneHHe) 0.07 0.40 -0.70 0.77 1.00 6493 4306
~matrix (Number of levels: 22)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.06 0.01 0.04 0.09 1.00 2525 3411
sd(Std_tuneHHe) 0.01 0.01 0.00 0.03 1.00 2621 4229
sd(sigma_Std_Intercept) 0.09 0.05 0.01 0.19 1.00 2024 3018
sd(Alt_Intercept) 0.06 0.01 0.04 0.09 1.00 2942 3942
sd(Alt_tuneHHe) 0.02 0.01 0.00 0.04 1.00 1655 3050
sd(sigma_Alt_Intercept) 0.11 0.05 0.02 0.21 1.00 1992 3199
sd(Ho2_Intercept) 0.07 0.01 0.05 0.11 1.00 3103 4201
sd(Ho2_tuneHHe) 0.01 0.01 0.00 0.03 1.00 2551 3633
sd(sigma_Ho2_Intercept) 0.06 0.04 0.00 0.15 1.00 2630 4061
sd(In_Intercept) 0.07 0.01 0.05 0.11 1.00 2829 4125
sd(In_tuneHHe) 0.05 0.01 0.03 0.08 1.00 3090 4009
sd(sigma_In_Intercept) 0.14 0.03 0.08 0.21 1.00 2221 3939
sd(Sc_Intercept) 0.09 0.02 0.07 0.13 1.00 2363 4159
sd(Sc_tuneHHe) 0.10 0.02 0.07 0.15 1.00 2714 4193
sd(sigma_Sc_Intercept) 0.28 0.06 0.19 0.41 1.00 2556 3449
sd(Y_Intercept) 0.06 0.01 0.04 0.08 1.00 3564 4392
sd(Y_tuneHHe) 0.05 0.01 0.03 0.07 1.00 3874 4651
sd(sigma_Y_Intercept) 0.16 0.04 0.09 0.24 1.00 1892 3595
sd(Be_Intercept) 0.08 0.01 0.05 0.11 1.00 4304 4698
sd(Be_tuneHHe) 0.07 0.02 0.04 0.12 1.00 5211 4921
sd(sigma_Be_Intercept) 0.16 0.05 0.07 0.27 1.00 1810 2540
sd(Co_Intercept) 0.04 0.01 0.02 0.06 1.00 2989 4109
sd(Co_tuneHHe) 0.03 0.01 0.02 0.05 1.00 4302 4755
sd(sigma_Co_Intercept) 0.09 0.04 0.02 0.17 1.00 1172 1263
sd(Th_Intercept) 0.25 0.04 0.18 0.35 1.01 2100 3407
sd(Th_tuneHHe) 0.20 0.04 0.14 0.28 1.00 2256 3325
sd(sigma_Th_Intercept) 0.05 0.03 0.01 0.11 1.00 1448 1746
sd(Ho1_Intercept) 0.18 0.03 0.13 0.24 1.00 2512 3304
sd(Ho1_tuneHHe) 0.13 0.02 0.09 0.18 1.00 3007 4360
sd(sigma_Ho1_Intercept) 0.04 0.02 0.00 0.10 1.00 1779 3218
cor(Std_Intercept,Std_tuneHHe) -0.20 0.49 -0.94 0.85 1.00 8798 4347
cor(Alt_Intercept,Alt_tuneHHe) -0.13 0.44 -0.88 0.81 1.00 7412 3495
cor(Ho2_Intercept,Ho2_tuneHHe) -0.17 0.50 -0.95 0.86 1.00 8523 4384
cor(In_Intercept,In_tuneHHe) 0.97 0.04 0.86 1.00 1.00 2374 2826
cor(Sc_Intercept,Sc_tuneHHe) 0.97 0.03 0.88 1.00 1.00 3099 4159
cor(Y_Intercept,Y_tuneHHe) 0.96 0.06 0.79 1.00 1.00 1537 2037
cor(Be_Intercept,Be_tuneHHe) 0.87 0.13 0.53 1.00 1.00 3663 3619
cor(Co_Intercept,Co_tuneHHe) 0.81 0.15 0.44 0.99 1.00 2921 3824
cor(Th_Intercept,Th_tuneHHe) 0.97 0.02 0.92 0.99 1.00 2990 4270
cor(Ho1_Intercept,Ho1_tuneHHe) 0.99 0.01 0.96 1.00 1.00 2732 4045
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Std_Intercept 0.12 0.03 0.07 0.17 1.00 3285 3706
sigma_Std_Intercept -2.57 0.11 -2.79 -2.35 1.00 4872 4364
Alt_Intercept 0.15 0.05 0.04 0.25 1.00 3219 3919
sigma_Alt_Intercept -2.44 0.10 -2.64 -2.25 1.00 5594 4840
Ho2_Intercept 0.12 0.03 0.07 0.17 1.00 2833 3621
sigma_Ho2_Intercept -2.54 0.14 -2.82 -2.26 1.00 4248 3717
In_Intercept -0.04 0.10 -0.23 0.16 1.00 2583 2795
sigma_In_Intercept -2.31 0.14 -2.59 -2.03 1.00 2841 3490
Sc_Intercept -0.01 0.07 -0.14 0.13 1.00 2668 3506
sigma_Sc_Intercept -2.26 0.15 -2.56 -1.96 1.00 3696 3941
Y_Intercept -0.06 0.10 -0.26 0.14 1.00 2304 2154
sigma_Y_Intercept -2.36 0.15 -2.64 -2.06 1.00 3126 3638
Be_Intercept 0.02 0.10 -0.17 0.22 1.00 2722 3328
sigma_Be_Intercept -2.01 0.16 -2.32 -1.69 1.00 3918 4227
Co_Intercept 0.02 0.09 -0.16 0.20 1.00 2173 2584
sigma_Co_Intercept -2.32 0.16 -2.65 -2.00 1.00 2989 3515
Th_Intercept -0.20 0.21 -0.60 0.22 1.00 2352 3034
sigma_Th_Intercept -1.82 0.20 -2.23 -1.42 1.00 3038 3534
Ho1_Intercept -0.18 0.20 -0.58 0.22 1.00 2620 3357
sigma_Ho1_Intercept -2.02 0.18 -2.38 -1.66 1.00 2908 3574
Std_tuneHHe 0.03 0.01 0.01 0.05 1.00 6905 4670
sigma_Std_tuneHHe 0.33 0.07 0.20 0.46 1.00 10184 4753
Alt_tuneHHe 0.01 0.05 -0.08 0.11 1.00 3987 4333
sigma_Alt_tuneHHe 0.27 0.06 0.15 0.40 1.00 7970 4962
Ho2_tuneHHe 0.04 0.04 -0.03 0.12 1.00 4772 4382
sigma_Ho2_tuneHHe 0.55 0.07 0.42 0.68 1.00 9311 4910
In_tuneHHe 0.01 0.03 -0.04 0.07 1.00 3152 3648
sigma_In_tuneHHe 0.61 0.05 0.51 0.71 1.00 4639 5286
Sc_tuneHHe -0.11 0.04 -0.19 -0.03 1.00 2867 3970
sigma_Sc_tuneHHe 0.67 0.06 0.56 0.78 1.00 7132 5445
Y_tuneHHe -0.06 0.03 -0.11 -0.00 1.00 2982 3899
sigma_Y_tuneHHe 0.62 0.05 0.53 0.71 1.00 5023 4959
Be_tuneHHe -0.09 0.09 -0.27 0.08 1.00 3899 3722
sigma_Be_tuneHHe 0.78 0.06 0.66 0.90 1.00 8887 5410
Co_tuneHHe -0.05 0.05 -0.14 0.04 1.00 2804 3595
sigma_Co_tuneHHe 0.63 0.04 0.55 0.72 1.00 6926 5328
Th_tuneHHe 0.02 0.07 -0.11 0.16 1.00 2117 3480
sigma_Th_tuneHHe 0.57 0.05 0.46 0.67 1.00 6026 5020
Ho1_tuneHHe -0.03 0.06 -0.14 0.08 1.00 2913 3660
sigma_Ho1_tuneHHe 0.53 0.05 0.42 0.63 1.00 5264 4724
Residual Correlations:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
rescor(Std,Alt) 0.73 0.03 0.67 0.78 1.00 5852 5287
rescor(Std,Ho2) 0.67 0.03 0.60 0.73 1.00 5053 5524
rescor(Alt,Ho2) 0.69 0.03 0.63 0.75 1.00 5397 5187
rescor(Std,In) 0.62 0.04 0.55 0.69 1.00 3679 4260
rescor(Alt,In) 0.63 0.04 0.55 0.69 1.00 3682 4338
rescor(Ho2,In) 0.70 0.03 0.63 0.76 1.00 4367 4654
rescor(Std,Sc) 0.59 0.04 0.51 0.66 1.00 4492 4685
rescor(Alt,Sc) 0.60 0.04 0.51 0.67 1.00 4471 4696
rescor(Ho2,Sc) 0.73 0.03 0.67 0.79 1.00 5067 4779
rescor(In,Sc) 0.75 0.03 0.69 0.80 1.00 6573 5213
rescor(Std,Y) 0.65 0.03 0.58 0.71 1.00 3723 4511
rescor(Alt,Y) 0.66 0.04 0.59 0.72 1.00 3507 4384
rescor(Ho2,Y) 0.76 0.03 0.70 0.81 1.00 4398 4777
rescor(In,Y) 0.96 0.00 0.95 0.97 1.00 6389 5136
rescor(Sc,Y) 0.86 0.02 0.82 0.89 1.00 6515 5237
rescor(Std,Be) 0.47 0.05 0.38 0.56 1.00 4345 4661
rescor(Alt,Be) 0.47 0.05 0.37 0.56 1.00 4766 5164
rescor(Ho2,Be) 0.56 0.04 0.47 0.63 1.00 4735 4790
rescor(In,Be) 0.64 0.04 0.56 0.71 1.00 5659 5329
rescor(Sc,Be) 0.62 0.04 0.53 0.70 1.00 4081 4769
rescor(Y,Be) 0.65 0.04 0.58 0.72 1.00 4899 4905
rescor(Std,Co) 0.62 0.04 0.55 0.69 1.00 3772 4196
rescor(Alt,Co) 0.64 0.04 0.56 0.70 1.00 3720 4298
rescor(Ho2,Co) 0.75 0.03 0.70 0.80 1.00 4099 4419
rescor(In,Co) 0.87 0.02 0.84 0.90 1.00 5772 4653
rescor(Sc,Co) 0.82 0.02 0.78 0.87 1.00 3817 4688
rescor(Y,Co) 0.90 0.01 0.88 0.92 1.00 4565 4533
rescor(Be,Co) 0.86 0.02 0.83 0.89 1.00 6113 5223
rescor(Std,Th) 0.39 0.05 0.29 0.48 1.00 4018 5015
rescor(Alt,Th) 0.40 0.05 0.29 0.49 1.00 4455 4342
rescor(Ho2,Th) 0.39 0.05 0.29 0.49 1.00 4592 4468
rescor(In,Th) 0.81 0.02 0.77 0.85 1.00 5821 4889
rescor(Sc,Th) 0.36 0.05 0.25 0.46 1.00 4966 4828
rescor(Y,Th) 0.69 0.03 0.63 0.75 1.00 5480 4857
rescor(Be,Th) 0.64 0.03 0.57 0.71 1.00 8037 5227
rescor(Co,Th) 0.71 0.03 0.65 0.77 1.00 7804 5329
rescor(Std,Ho1) 0.47 0.05 0.37 0.56 1.00 3925 5261
rescor(Alt,Ho1) 0.48 0.05 0.38 0.56 1.00 4601 5181
rescor(Ho2,Ho1) 0.41 0.05 0.31 0.51 1.00 4882 4391
rescor(In,Ho1) 0.82 0.02 0.77 0.86 1.00 5553 4986
rescor(Sc,Ho1) 0.35 0.05 0.24 0.45 1.00 4987 5042
rescor(Y,Ho1) 0.70 0.03 0.63 0.76 1.00 5457 5043
rescor(Be,Ho1) 0.60 0.04 0.52 0.67 1.00 8189 5253
rescor(Co,Ho1) 0.69 0.03 0.63 0.75 1.00 7822 5297
rescor(Th,Ho1) 0.97 0.00 0.97 0.98 1.00 6505 5365
Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Again, the HMC sampling looks to have gone well.
Model checks
Next, the density checks.
Density overlay










Seemingly, an improvement on the previous models. The check looks reasonable across most of the methods, though clearly the in-sample observations again proved difficult to replicate. It can be helpful, to look at some additional checks (below) to get a better handle on which aspects of the observed data are reasonably approximated by the model and which may not be.
Min
Next is a check comparing replicated mins to the observed mins.










The model is consistently “over-shooting” the min for the in-sample method. This would also agree with the density plot above, where the left tails of the replicated datasets consistently are left of the observed density, if only slightly. On the other hand, the model may be somewhat under-estimating the left tails for \(Th\) and \(Ho^{1+}\).
Max
Next is a check comparing replicated maxs to the observed maxs.










Clearly, the model is underestimating the observed max for all of the +2 methods. There appears to be some important aspect of the true data generating process that isn’t captured by the model. One potential place to look for explanations for this discrepancy may be the 250ppm matrices, which resulted in fairly extreme under-corrections for all three of the +2 methods, relative to other matrices (see data visualization section above).
K-fold CV
Finally, the k-fold for model 3, with k = 10.
load("full-analysis-files/mod3_As_mv.rda")
library(future)
plan(multisession)
kfold_3 <- kfold(mod3, K = 10, save_fits = TRUE)
save(kfold_3, file = "full-analysis-files/kfold_3.rda")
plan(sequential)
The result.
Based on 10-fold cross-validation
The comparison.
loo_compare(kfold_1, kfold_2, kfold_3)
elpd_diff se_diff
mod3 0.0 0.0
mod2 -390.5 37.0
mod1 -1139.3 54.3
The more flexible model 3 is clearly favored.
Posterior inferences
With the potential limitations to the model suggested by the predictive checks loo-CV diagnostics, the focus moves next to posterior inferences given this most highly-parameterized model.
Conditional means
Below are plots of the fitted values of the linear predictors for both \(\mu\) and \(\sigma\) across the different experimental groupings. These estimates pertain to expected population averages, conditional on the model, data, and priors, and include uncertainty in the estimation of each of the parameters comprising the linear predictors.
\(\mu\)
First, the estimated conditional means for the \(\mu\) component of the model.
Tune
Estimate means conditional on method and tune while marginalizing over matrix and day.
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_method_tune <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = NA,
cores = 1)
save(fitted_method_tune, file = "full-analysis-files/fitted_method_tune.rda")

Day
Estimate means conditional on method and day while marginalizing over matrix.
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_method_day <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = ~ (1 | day_expt),
cores = 1)
save(fitted_method_day, file = "full-analysis-files/fitted_method_day.rda")

This figure illustrates the large over-correction (i.e, negative bias) expected on 3/30 for all of the \(+1\) methods. By comparison, the means for the \(+2\) methods are relatively consistent across the days of the experiment. Also note the consistent under-corrections (i.e., positive bias) estimated across most days for the \(+2\) methods. Within days, there were no clear differences in means due to tune setting.
Matrix
Estimate means conditional on method and matrix while marginalizing over day.
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_method_matrix <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = ~ (1 | matrix),
cores = 1)
save(fitted_method_matrix, file = "full-analysis-files/fitted_method_matrix.rda")

The estimated means for the +2 methods are again largely in the direction of slight under-correction, whereas most of the +1 methods vary around zero bias, with the exception of \(Th\) and \(Ho^{+1}\), which tend more towards over-correction, though the inferences are uncertain (credible intervals overlaps zero for most part). Matrix to matrix variability for all of the methods is expected to be relatively less substantial compared to day to day variation above. The tune effect also doesn’t appear to be particularly large, if important at all, for most methods; though the \(Sc\) estimates may indicate some relatively small, if uncertain, within matrix differences due to tune.
\(\sigma\)
Next, the conditional means for the \(\sigma\) component of the model.
Tune
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_sigma_tune <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = NA,
cores = 1)
save(fitted_sigma_tune, file = "full-analysis-files/fitted_sigma_tune.rda")
The expected standard deviations by tune after marginalizing over matrix are below.

Day
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_sigma_day <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = sigma ~ (1 | day_expt),
cores = 1)
save(fitted_sigma_day, file = "full-analysis-files/fitted_sigma_day.rda")
The expected standard deviations by day after marginalizing over matrix are below.

This figure suggests some differences in standard deviation due to tune setting, particularly for the +1 methods. The standard deviation was also estimated to vary fairly substantially day to day, no matter the tune setting, for most of the +1 methods. The lowest standard deviation is estimated for 3/30 (cone change day) for all of those methods. standard deviation may vary slightly day to day for the +2 methods, but the large effect on 3/30 is not apparent. Differences due to tune setting also aren’t as clear for the +2 methods.
Matrix
load("full-analysis-files/df_mv_as.rda")
load("full-analysis-files/mod3_As_mv.rda")
fitted_sigma_matrix <- df_mv_as %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = sigma ~ (1 | matrix),
cores = 1)
save(fitted_sigma_matrix, file = "full-analysis-files/fitted_sigma_matrix.rda")
Finally, the expected standard deviations after marginalizing over day.

Overall, excepting perhaps the \(Sc\) method, matrix to matrix variability in standard deviation was estimated to be very low to negligible.
Residual Correlations
Next, the estimated residual correlations among IS methods. Note that not all pairs are shown under each method, since many are redundant, but all non-redundant pairs are shown.

The residual correlations are fairly large (e.g., > 0.8) in many cases, particularly between the +1 methods. These correlations suggest where sources of unexplained variability may be common between methods.
Predictions
Next, the model was used to make out-of-sample predictions to a “new” matrix, or day, or both. Here, “new” refers to an out-of-sample matrix and/or day from the hypothetical broader population of matrices or days. When considering predictions to a new matrix, for example, the prediction is for an average matrix estimated from the observed matrices, and includes the uncertainty estimated from the observed matrix to matrix variation. In contrast to the conditional means above, the predictions below incorporate both the \(\mu\) (expectation) and \(\sigma\) (standard deviation) components of the fitted model. That is, the predictions, \(y_{new}\), are drawn from \[y_{new} \sim N(\hat{\mu}, \hat{\sigma})\] so they include both parameter and sampling uncertainty.
Hypothetical data
Hypothetical data are created below to hold the conditions that the model will predict to. The first condition is for a “new” day, but with the same matrix and tune conditions as observed. The new day can be considered as any day that might belong to the same population as the observed days. An average day, assuming the days of this experiment were drawn from a larger population of days; a future or past day, for example.
load("full-analysis-files/df_mv_as.rda")
new_day_dat <- expand_grid(matrix = factor(levels(df_mv_as$matrix)),
day_expt = "new_day",
tune = factor(c("LHe", "HHe"))) %>%
mutate(tune = relevel(tune, ref = "LHe"))
save(new_day_dat, file = "full-analysis-files/new_day_dat.rda")
Next, a hypothetical new matrix for the observed days and tune settings.
load("full-analysis-files/df_mv_as.rda")
new_matrix_dat <- expand_grid(matrix = factor("new_matrix"),
day_expt = factor(levels(df_mv_as$day_expt)),
tune = factor(c("LHe", "HHe"))) %>%
mutate(tune = relevel(tune, ref = "LHe"))
save(new_matrix_dat, file = "full-analysis-files/new_matrix_dat.rda")
Finally, a new day and matrix for the observed tune settings.
load("full-analysis-files/df_mv_as.rda")
# Include replicate observations for estimating uncertainty in probability to over-correct
new_matrix_day_dat <- expand_grid(matrix = factor("new_matrix"),
day_expt = factor("new_day"),
tune = factor( c("LHe", "HHe"))) %>%
mutate(tune = relevel(tune, ref = "LHe"))
save(new_matrix_day_dat, file = "full-analysis-files/new_matrix_day_dat.rda")
Day
The predictions for the observed days for a new matrix are below.

As expected from examining the conditional means for \(\mu\), the model predicts a high probability of relatively extreme over-corrections on 3/30 for all of the +1 methods. Conversely, none of the +2 method’s predictions included this possibility. The predictions for the +1 methods also suggest much more day to day variability in general.
As suggested in the conditional means for \(\sigma\), the standard deviation of the +1 and +2 methods are generally predicted to be lower for the LHe tune, though the difference is more extreme for the +1 methods. The standard deviation was generally lower on 3/30 for the +2 methods as well, compared to other days within method.
Matrix
The predictions to the observed matrices for a new day is below.

Matrix to matrix variability is predicted to be lower than day to day, in general across all methods. With regard to any particular matrix, the predictions for some of the 250ppm matrices consistently suggest positive bias for \(Th\), \(Ho^{+1}\), and \(In\) relative to the other matrices in those methods. For the +2 methods, the 250ppm \(SO_4\) matrix is consistently predicted with somewhat higher probability to under-correct relative to other matrices. Overall differences in standard deviation by method are again clear in this figure, with \(Th\) and \(Ho^{+1}\) being the least precise predictions. Within method, differences due to tune are again apparent, with the HHe tune generally resulting in less precise predictions.
New day and matrix
The predictions for a new day and new matrix for the observed tune settings are below.
The proportion of posterior prediction samples with over-corrections for each case.

In this last set of predictions, the most clear takeaways are (1) the variation in precision of the predictions across the different internal standard methods and tunes; and (2) the variations in the proportion of over- vs. under-corrected draws from the posterior predictive distribution. The predictions for the +2 methods are clearly more precise and their tendency to under-correct, on average, is also clear. The predictions for the +1 methods, by comparison, are much less precise and the bias is typically either minimal to more in the direction of over-correction. Overall, the HHe tune setting is consistently predicted with less precision across all of the methods.
A final model for selenium
The final model for arsenic is also applied to the selenium observations in the following analyses. In this model, the priors on fixed interceps and the standard deviations for the varying intercepts were adjusted upward by a factor of 10 to account for the difference in scale.
load("full-analysis-files/df_mv_se.rda")
bf_Std <- bf(Std ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Alt <- bf(Alt ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho2 <- bf(Ho2 ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_In <- bf(In ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Sc <- bf(Sc ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Y <- bf(Y ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Be <- bf(Be ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Co <- bf(Co ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Th <- bf(Th ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
bf_Ho1 <- bf(Ho1 ~ tune + (tune | matrix) + (tune | day_expt),
sigma ~ tune + (1 | matrix) + (1 | day_expt),
family = gaussian())
mod3 <- brm(bf_Std +
bf_Alt +
bf_Ho2 +
bf_In +
bf_Sc +
bf_Y +
bf_Be +
bf_Co +
bf_Th +
bf_Ho1 +
set_rescor(TRUE),
data = df_mv_se,
prior = c(prior(normal(0, 10), class = "Intercept", resp = "Std"),
prior(normal(0, 10), class = "Intercept", resp = "Alt"),
prior(normal(0, 10), class = "Intercept", resp = "Ho2"),
prior(normal(0, 10), class = "Intercept", resp = "In"),
prior(normal(0, 10), class = "Intercept", resp = "Sc"),
prior(normal(0, 10), class = "Intercept", resp = "Y"),
prior(normal(0, 10), class = "Intercept", resp = "Be"),
prior(normal(0, 10), class = "Intercept", resp = "Co"),
prior(normal(0, 10), class = "Intercept", resp = "Th"),
prior(normal(0, 10), class = "Intercept", resp = "Ho1"),
prior(normal(0, 10), class = "b", resp = "Std"),
prior(normal(0, 10), class = "b", resp = "Alt"),
prior(normal(0, 10), class = "b", resp = "Ho2"),
prior(normal(0, 10), class = "b", resp = "In"),
prior(normal(0, 10), class = "b", resp = "Sc"),
prior(normal(0, 10), class = "b", resp = "Y"),
prior(normal(0, 10), class = "b", resp = "Be"),
prior(normal(0, 10), class = "b", resp = "Co"),
prior(normal(0, 10), class = "b", resp = "Th"),
prior(normal(0, 10), class = "b", resp = "Ho1"),
prior(normal(0, 10), class = "sd", resp = "Std"),
prior(normal(0, 10), class = "sd", resp = "Alt"),
prior(normal(0, 10), class = "sd", resp = "Ho2"),
prior(normal(0, 10), class = "sd", resp = "In"),
prior(normal(0, 10), class = "sd", resp = "Sc"),
prior(normal(0, 10), class = "sd", resp = "Y"),
prior(normal(0, 10), class = "sd", resp = "Be"),
prior(normal(0, 10), class = "sd", resp = "Co"),
prior(normal(0, 10), class = "sd", resp = "Th"),
prior(normal(0, 10), class = "sd", resp = "Ho1"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Std"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Alt"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Ho2"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "In"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Sc"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Y"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Be"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Co"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Th"),
prior(normal(2, 1), class = "Intercept", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Std"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Alt"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "In"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Sc"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Y"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Be"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Co"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Th"),
prior(normal(0, 10), class = "b", dpar = "sigma", resp = "Ho1"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Std"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Alt"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Ho2"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "In"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Sc"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Y"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Be"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Co"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Th"),
prior(normal(0, 10), class = "sd", dpar = "sigma", resp = "Ho1"),
prior(lkj(1), class = "rescor")
),
control = list(adapt_delta = 0.95, max_treedepth = 14),
init_r = 0.05,
save_pars = save_pars(all = TRUE),
seed = 5214,
chains=4,
iter=3000,
cores=4 )
save(mod3, file = "full-analysis-files/mod3_Se_mv.rda")
Tabular parameter estimates
Again, a summary of the posterior estimates.
Family: MV(gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian, gaussian)
Links: mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
mu = identity; sigma = log
Formula: Std ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Alt ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho2 ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
In ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Sc ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Y ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Be ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Co ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Th ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Ho1 ~ tune + (tune | matrix) + (tune | day_expt)
sigma ~ tune + (1 | matrix) + (1 | day_expt)
Data: df_mv_se (Number of observations: 352)
Samples: 4 chains, each with iter = 3000; warmup = 1500; thin = 1;
total post-warmup samples = 6000
Priors:
b_Alt ~ normal(0, 10)
b_Alt_sigma ~ normal(0, 10)
b_Be ~ normal(0, 10)
b_Be_sigma ~ normal(0, 10)
b_Co ~ normal(0, 10)
b_Co_sigma ~ normal(0, 10)
b_Ho1 ~ normal(0, 10)
b_Ho1_sigma ~ normal(0, 10)
b_Ho2 ~ normal(0, 10)
b_Ho2_sigma ~ normal(0, 10)
b_In ~ normal(0, 10)
b_In_sigma ~ normal(0, 10)
b_Sc ~ normal(0, 10)
b_Sc_sigma ~ normal(0, 10)
b_Std ~ normal(0, 10)
b_Std_sigma ~ normal(0, 10)
b_Th ~ normal(0, 10)
b_Th_sigma ~ normal(0, 10)
b_Y ~ normal(0, 10)
b_Y_sigma ~ normal(0, 10)
Intercept_Alt ~ normal(0, 10)
Intercept_Alt_sigma ~ normal(2, 1)
Intercept_Be ~ normal(0, 10)
Intercept_Be_sigma ~ normal(2, 1)
Intercept_Co ~ normal(0, 10)
Intercept_Co_sigma ~ normal(2, 1)
Intercept_Ho1 ~ normal(0, 10)
Intercept_Ho1_sigma ~ normal(2, 1)
Intercept_Ho2 ~ normal(0, 10)
Intercept_Ho2_sigma ~ normal(2, 1)
Intercept_In ~ normal(0, 10)
Intercept_In_sigma ~ normal(2, 1)
Intercept_Sc ~ normal(0, 10)
Intercept_Sc_sigma ~ normal(2, 1)
Intercept_Std ~ normal(0, 10)
Intercept_Std_sigma ~ normal(2, 1)
Intercept_Th ~ normal(0, 10)
Intercept_Th_sigma ~ normal(2, 1)
Intercept_Y ~ normal(0, 10)
Intercept_Y_sigma ~ normal(2, 1)
L ~ lkj_corr_cholesky(1)
Lrescor ~ lkj_corr_cholesky(1)
sd_Alt ~ normal(0, 10)
sd_Alt_sigma ~ normal(0, 10)
sd_Be ~ normal(0, 10)
sd_Be_sigma ~ normal(0, 10)
sd_Co ~ normal(0, 10)
sd_Co_sigma ~ normal(0, 10)
sd_Ho1 ~ normal(0, 10)
sd_Ho1_sigma ~ normal(0, 10)
sd_Ho2 ~ normal(0, 10)
sd_Ho2_sigma ~ normal(0, 10)
sd_In ~ normal(0, 10)
sd_In_sigma ~ normal(0, 10)
sd_Sc ~ normal(0, 10)
sd_Sc_sigma ~ normal(0, 10)
sd_Std ~ normal(0, 10)
sd_Std_sigma ~ normal(0, 10)
sd_Th ~ normal(0, 10)
sd_Th_sigma ~ normal(0, 10)
sd_Y ~ normal(0, 10)
sd_Y_sigma ~ normal(0, 10)
Group-Level Effects:
~day_expt (Number of levels: 8)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.20 0.15 0.01 0.56 1.00 2022 2491
sd(Std_tuneHHe) 0.73 0.43 0.09 1.78 1.00 1895 2130
sd(sigma_Std_Intercept) 0.26 0.11 0.12 0.55 1.00 2161 2976
sd(Alt_Intercept) 1.99 0.76 1.07 3.98 1.00 2048 2663
sd(Alt_tuneHHe) 3.06 1.11 1.64 5.94 1.00 2585 3202
sd(sigma_Alt_Intercept) 0.29 0.12 0.13 0.59 1.00 1963 3133
sd(Ho2_Intercept) 1.50 0.57 0.80 2.98 1.00 1975 2886
sd(Ho2_tuneHHe) 3.08 1.13 1.64 5.86 1.00 2561 3374
sd(sigma_Ho2_Intercept) 0.41 0.16 0.21 0.80 1.00 1736 2943
sd(In_Intercept) 3.59 1.22 2.00 6.76 1.00 3047 3031
sd(In_tuneHHe) 2.14 0.83 0.96 4.18 1.00 2311 3087
sd(sigma_In_Intercept) 0.24 0.09 0.13 0.48 1.00 1872 2293
sd(Sc_Intercept) 2.56 0.88 1.43 4.83 1.00 2428 3474
sd(Sc_tuneHHe) 4.03 1.33 2.21 7.45 1.00 2705 3566
sd(sigma_Sc_Intercept) 0.31 0.13 0.15 0.62 1.00 1788 3289
sd(Y_Intercept) 3.37 1.10 1.93 6.08 1.00 2631 3656
sd(Y_tuneHHe) 3.19 1.13 1.71 5.95 1.00 2602 2807
sd(sigma_Y_Intercept) 0.26 0.10 0.14 0.52 1.00 2572 3179
sd(Be_Intercept) 3.41 1.15 1.87 6.33 1.00 2538 2813
sd(Be_tuneHHe) 5.49 1.83 3.04 10.20 1.00 2913 3291
sd(sigma_Be_Intercept) 0.40 0.14 0.22 0.74 1.00 2361 3635
sd(Co_Intercept) 3.11 0.99 1.75 5.64 1.00 2150 2914
sd(Co_tuneHHe) 4.06 1.35 2.24 7.41 1.00 2139 2661
sd(sigma_Co_Intercept) 0.38 0.14 0.21 0.75 1.00 2448 2828
sd(Th_Intercept) 6.61 2.14 3.61 11.83 1.00 3005 4080
sd(Th_tuneHHe) 2.20 1.36 0.17 5.41 1.00 1376 1433
sd(sigma_Th_Intercept) 0.34 0.13 0.18 0.65 1.00 2676 2993
sd(Ho1_Intercept) 6.12 1.95 3.40 11.04 1.00 3029 3498
sd(Ho1_tuneHHe) 2.73 1.28 0.92 5.89 1.00 1797 1566
sd(sigma_Ho1_Intercept) 0.31 0.11 0.17 0.60 1.00 2820 3178
cor(Std_Intercept,Std_tuneHHe) -0.14 0.54 -0.95 0.90 1.00 1616 2705
cor(Alt_Intercept,Alt_tuneHHe) -0.03 0.36 -0.69 0.65 1.00 2285 2654
cor(Ho2_Intercept,Ho2_tuneHHe) 0.05 0.35 -0.61 0.68 1.00 2641 3307
cor(In_Intercept,In_tuneHHe) 0.55 0.31 -0.21 0.95 1.00 2178 2552
cor(Sc_Intercept,Sc_tuneHHe) 0.64 0.24 0.02 0.94 1.00 2475 3196
cor(Y_Intercept,Y_tuneHHe) 0.61 0.26 -0.05 0.94 1.00 2170 2806
cor(Be_Intercept,Be_tuneHHe) 0.54 0.29 -0.16 0.92 1.00 2634 2910
cor(Co_Intercept,Co_tuneHHe) 0.81 0.17 0.32 0.98 1.00 2504 3642
cor(Th_Intercept,Th_tuneHHe) 0.34 0.51 -0.75 0.98 1.00 2311 3105
cor(Ho1_Intercept,Ho1_tuneHHe) 0.60 0.33 -0.24 0.97 1.00 2140 2577
~matrix (Number of levels: 22)
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Std_Intercept) 0.09 0.07 0.00 0.26 1.00 3307 2993
sd(Std_tuneHHe) 0.29 0.20 0.01 0.75 1.00 1919 2078
sd(sigma_Std_Intercept) 0.05 0.04 0.00 0.13 1.00 3789 3349
sd(Alt_Intercept) 0.17 0.10 0.01 0.39 1.00 1623 2427
sd(Alt_tuneHHe) 0.33 0.21 0.01 0.80 1.00 2135 2694
sd(sigma_Alt_Intercept) 0.09 0.06 0.00 0.22 1.00 1878 2328
sd(Ho2_Intercept) 0.44 0.10 0.25 0.68 1.00 1495 2113
sd(Ho2_tuneHHe) 0.82 0.25 0.32 1.33 1.00 1398 1712
sd(sigma_Ho2_Intercept) 0.04 0.03 0.00 0.12 1.00 2848 2750
sd(In_Intercept) 0.08 0.05 0.00 0.19 1.00 933 2282
sd(In_tuneHHe) 0.32 0.14 0.04 0.62 1.01 965 1218
sd(sigma_In_Intercept) 0.03 0.02 0.00 0.06 1.00 970 1189
sd(Sc_Intercept) 0.76 0.14 0.53 1.07 1.00 1544 2460
sd(Sc_tuneHHe) 1.63 0.36 1.05 2.45 1.00 1514 2851
sd(sigma_Sc_Intercept) 0.14 0.04 0.07 0.22 1.00 2140 2887
sd(Y_Intercept) 0.48 0.09 0.34 0.69 1.00 1213 1979
sd(Y_tuneHHe) 1.00 0.21 0.67 1.49 1.00 944 2347
sd(sigma_Y_Intercept) 0.04 0.02 0.00 0.08 1.00 1194 1901
sd(Be_Intercept) 0.88 0.18 0.60 1.29 1.00 2024 2490
sd(Be_tuneHHe) 1.83 0.42 1.12 2.77 1.00 2448 3547
sd(sigma_Be_Intercept) 0.11 0.04 0.03 0.19 1.00 1394 826
sd(Co_Intercept) 0.50 0.10 0.34 0.73 1.00 1627 3535
sd(Co_tuneHHe) 0.67 0.16 0.40 1.04 1.00 1928 3857
sd(sigma_Co_Intercept) 0.02 0.02 0.00 0.06 1.00 2209 3193
sd(Th_Intercept) 0.22 0.07 0.09 0.38 1.00 1762 2230
sd(Th_tuneHHe) 0.92 0.23 0.54 1.46 1.00 2108 3338
sd(sigma_Th_Intercept) 0.01 0.01 0.00 0.04 1.00 1639 1765
sd(Ho1_Intercept) 0.05 0.04 0.00 0.15 1.00 2237 3005
sd(Ho1_tuneHHe) 0.20 0.16 0.01 0.58 1.00 1923 3223
sd(sigma_Ho1_Intercept) 0.01 0.01 0.00 0.03 1.00 2962 3266
cor(Std_Intercept,Std_tuneHHe) -0.05 0.57 -0.96 0.94 1.00 3293 3908
cor(Alt_Intercept,Alt_tuneHHe) -0.05 0.55 -0.95 0.93 1.00 2995 3500
cor(Ho2_Intercept,Ho2_tuneHHe) -0.49 0.25 -0.90 0.09 1.00 2689 2734
cor(In_Intercept,In_tuneHHe) 0.38 0.50 -0.78 0.98 1.01 856 1623
cor(Sc_Intercept,Sc_tuneHHe) 0.79 0.13 0.47 0.97 1.00 1361 2027
cor(Y_Intercept,Y_tuneHHe) 0.98 0.03 0.91 1.00 1.00 2208 2840
cor(Be_Intercept,Be_tuneHHe) 0.86 0.12 0.55 0.99 1.00 1969 2476
cor(Co_Intercept,Co_tuneHHe) 0.91 0.09 0.66 1.00 1.00 2184 3588
cor(Th_Intercept,Th_tuneHHe) 0.68 0.24 0.09 0.98 1.00 1070 2002
cor(Ho1_Intercept,Ho1_tuneHHe) 0.11 0.58 -0.94 0.97 1.00 2504 3963
Population-Level Effects:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Std_Intercept -0.43 0.12 -0.68 -0.18 1.00 4630 4148
sigma_Std_Intercept 0.04 0.11 -0.18 0.27 1.00 2279 2943
Alt_Intercept -0.84 0.74 -2.33 0.55 1.00 1278 2176
sigma_Alt_Intercept -0.00 0.12 -0.24 0.25 1.00 2177 2536
Ho2_Intercept -1.45 0.59 -2.64 -0.30 1.00 1405 2406
sigma_Ho2_Intercept 0.10 0.17 -0.20 0.47 1.00 1721 1755
In_Intercept -3.53 1.28 -6.03 -0.93 1.00 1297 2100
sigma_In_Intercept 0.87 0.10 0.67 1.08 1.00 1572 2649
Sc_Intercept -2.99 0.96 -4.83 -1.03 1.00 1271 1997
sigma_Sc_Intercept 0.26 0.13 0.00 0.53 1.00 1680 2802
Y_Intercept -3.72 1.24 -6.13 -1.17 1.00 1107 1810
sigma_Y_Intercept 0.55 0.11 0.35 0.77 1.00 1511 2666
Be_Intercept -2.70 1.25 -5.23 -0.13 1.00 1148 1915
sigma_Be_Intercept 0.78 0.16 0.47 1.10 1.00 1558 2316
Co_Intercept -2.71 1.13 -4.93 -0.49 1.00 982 1556
sigma_Co_Intercept 0.50 0.15 0.20 0.80 1.00 1361 2244
Th_Intercept -5.65 2.40 -10.44 -0.81 1.00 1175 2167
sigma_Th_Intercept 1.61 0.13 1.35 1.88 1.00 1642 2409
Ho1_Intercept -5.19 2.22 -9.40 -0.61 1.01 1217 2025
sigma_Ho1_Intercept 1.38 0.12 1.13 1.63 1.00 1243 2307
Std_tuneHHe -0.20 0.37 -0.95 0.55 1.00 2613 2555
sigma_Std_tuneHHe 0.72 0.07 0.57 0.86 1.00 7540 4530
Alt_tuneHHe 0.33 1.14 -1.95 2.66 1.00 1693 2236
sigma_Alt_tuneHHe 0.75 0.08 0.59 0.91 1.00 7861 4342
Ho2_tuneHHe 0.40 1.21 -1.98 2.85 1.00 1758 2286
sigma_Ho2_tuneHHe 1.09 0.07 0.95 1.22 1.00 4108 4355
In_tuneHHe -1.36 0.91 -3.13 0.46 1.00 2036 2492
sigma_In_tuneHHe 0.85 0.04 0.77 0.94 1.00 2085 3435
Sc_tuneHHe -3.87 1.56 -7.00 -0.75 1.00 1483 2442
sigma_Sc_tuneHHe 1.04 0.05 0.93 1.14 1.00 3681 4271
Y_tuneHHe -2.93 1.23 -5.39 -0.40 1.00 1374 2370
sigma_Y_tuneHHe 0.90 0.04 0.82 0.98 1.00 2302 3511
Be_tuneHHe -2.70 2.06 -6.80 1.27 1.00 1474 2113
sigma_Be_tuneHHe 1.29 0.05 1.19 1.40 1.00 3879 3928
Co_tuneHHe -1.99 1.52 -4.95 1.06 1.00 1094 1785
sigma_Co_tuneHHe 1.13 0.04 1.05 1.20 1.00 2706 3871
Th_tuneHHe -1.35 1.34 -3.97 1.27 1.00 3117 3413
sigma_Th_tuneHHe 0.96 0.04 0.88 1.05 1.00 2097 3126
Ho1_tuneHHe -2.39 1.31 -4.99 0.18 1.00 1912 2479
sigma_Ho1_tuneHHe 0.97 0.04 0.89 1.06 1.00 2112 3310
Residual Correlations:
Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
rescor(Std,Alt) 0.33 0.05 0.24 0.43 1.00 7985 5239
rescor(Std,Ho2) 0.33 0.05 0.24 0.43 1.00 1765 3392
rescor(Alt,Ho2) 0.33 0.05 0.23 0.43 1.00 2125 3028
rescor(Std,In) 0.13 0.05 0.03 0.24 1.00 1308 2325
rescor(Alt,In) 0.14 0.06 0.03 0.26 1.00 1445 1731
rescor(Ho2,In) 0.70 0.04 0.62 0.77 1.00 1002 2253
rescor(Std,Sc) 0.33 0.05 0.23 0.42 1.00 4229 4413
rescor(Alt,Sc) 0.32 0.05 0.22 0.42 1.00 4443 3852
rescor(Ho2,Sc) 0.55 0.05 0.44 0.64 1.00 2424 4012
rescor(In,Sc) 0.34 0.07 0.21 0.48 1.00 1916 2593
rescor(Std,Y) 0.21 0.05 0.11 0.31 1.00 1299 2000
rescor(Alt,Y) 0.22 0.06 0.11 0.33 1.00 1467 1755
rescor(Ho2,Y) 0.77 0.03 0.70 0.82 1.00 984 2149
rescor(In,Y) 0.97 0.01 0.96 0.98 1.00 2194 3996
rescor(Sc,Y) 0.53 0.06 0.42 0.64 1.00 2396 2850
rescor(Std,Be) 0.20 0.05 0.09 0.30 1.00 1426 2485
rescor(Alt,Be) 0.15 0.06 0.04 0.26 1.00 1688 2093
rescor(Ho2,Be) 0.73 0.03 0.66 0.79 1.00 1391 2515
rescor(In,Be) 0.78 0.03 0.72 0.83 1.00 2816 4456
rescor(Sc,Be) 0.56 0.06 0.45 0.66 1.00 2119 3098
rescor(Y,Be) 0.82 0.02 0.78 0.86 1.00 2971 4579
rescor(Std,Co) 0.24 0.05 0.14 0.34 1.00 1302 2211
rescor(Alt,Co) 0.21 0.06 0.10 0.32 1.00 1476 1741
rescor(Ho2,Co) 0.82 0.03 0.76 0.86 1.00 1065 2150
rescor(In,Co) 0.90 0.01 0.88 0.93 1.00 2640 4016
rescor(Sc,Co) 0.60 0.05 0.49 0.70 1.00 2272 3110
rescor(Y,Co) 0.95 0.01 0.93 0.96 1.00 2928 4582
rescor(Be,Co) 0.93 0.01 0.91 0.95 1.00 3524 4767
rescor(Std,Th) 0.04 0.05 -0.07 0.14 1.00 1384 2181
rescor(Alt,Th) 0.04 0.06 -0.07 0.17 1.00 1489 1849
rescor(Ho2,Th) 0.60 0.05 0.51 0.69 1.00 1098 2326
rescor(In,Th) 0.96 0.00 0.95 0.97 1.00 3448 4487
rescor(Sc,Th) 0.14 0.08 -0.01 0.29 1.00 1707 2289
rescor(Y,Th) 0.88 0.02 0.85 0.91 1.00 2103 3407
rescor(Be,Th) 0.74 0.03 0.67 0.80 1.00 2779 4175
rescor(Co,Th) 0.83 0.02 0.79 0.87 1.00 2907 3799
rescor(Std,Ho1) 0.06 0.05 -0.05 0.16 1.00 1397 2271
rescor(Alt,Ho1) 0.06 0.06 -0.06 0.18 1.00 1507 1740
rescor(Ho2,Ho1) 0.60 0.05 0.50 0.68 1.00 1125 2342
rescor(In,Ho1) 0.96 0.00 0.95 0.97 1.00 3376 4708
rescor(Sc,Ho1) 0.12 0.08 -0.03 0.27 1.00 1721 2412
rescor(Y,Ho1) 0.88 0.02 0.85 0.91 1.00 2134 3432
rescor(Be,Ho1) 0.73 0.03 0.65 0.79 1.00 2775 4333
rescor(Co,Ho1) 0.82 0.02 0.78 0.86 1.00 2966 3909
rescor(Th,Ho1) 1.00 0.00 1.00 1.00 1.00 6444 5604
Samples were drawn using sampling(NUTS). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).
Again, the HMC sampling looks to have gone well.
Model checks
Next, the checks for the selenium model.
Density overlay










In this check, compared to the same one for arsenic, and with the exception of perhaps \(Th\) and \(Ho^{+1}\), the same model structure appears to be doing a better job of replicating the observed data.
Min
Next is a check comparing replicated mins to the observed mins.










This check look good for most of the methods, but the checks for \(In\), \(Y\), \(Th\), and \(Ho^{+1}\) each suggest that the model is consistently generating a lighter left tail compared to the observed data.
Max
Next is a check comparing replicated maxs to the observed maxs.










This check looks pretty reasonable with regard to the model’s ability to replicate the max for all methods.
Posterior inferences
Next, the posterior inferences from the selenium model.
Conditional means
The conditional means estimated for the selenium portion of the experiment are below.
\(\mu\)
First, the estimated conditional means for the \(\mu\) component of the model.
Tune
Estimate means conditional on method and tune while marginalizing over matrix and day.
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_method_tune_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = NA,
cores = 1)
save(fitted_method_tune_se, file = "full-analysis-files/fitted_method_tune_se.rda")

Day
Estimate means conditional on method and day after marginalizing over matrix.
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_method_day_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = ~ (1 | day_expt),
cores = 1)
save(fitted_method_day_se, file = "full-analysis-files/fitted_method_day_se.rda")

This figure illustrates the consistent over-corrections (i.e, negative bias) expected for all of the \(+1\) methods across all days for both tune settings, with some exceptions here and there (e.g., \(Sc\), HHe, 3/20). For those methods, 3/30 also stands out with an even more extreme over-corrections. By comparison, the means for the \(+2\) methods are relatively consistent across the days of the experiment, particularly for the in-sample method. Also note that, relative to the arsenic estimates, the +2 methods tend to have fewer estimated under-corrections (i.e., positive bias) estimated across days, and the alternative isotope and \(Ho^{+2}\) methods actually are estimated to have more over-corrections. Again, the in-sample method is generally estimated to be unbiased across days, with almost negligible variation.
The tune effects, overall, look negligible within days for all of the +2 methods. There may be some differences due to tune setting, within days, for the +1 methods, but those differences would be fairly hard to ascertain with high certainty.
Matrix
Estimate means conditional on method and matrix after marginalizing over day.
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_method_matrix_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = FALSE,
re_formula = ~ (1 | matrix),
cores = 1)
save(fitted_method_matrix_se, file = "full-analysis-files/fitted_method_matrix_se.rda")

The estimates vary very little by matrix for all of the methods. Again, the general pattern of over-correction for the +1 methods and minimal bias for the +2 methods is clear. Again, the tune effects look to be uncertain to minimal.
\(\sigma\)
Next, the conditional means for the \(\sigma\) component of the model.
Tune
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_sigma_tune_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = NA,
cores = 1)
save(fitted_sigma_tune_se, file = "full-analysis-files/fitted_sigma_tune_se.rda")
The expected standard deviations by day after marginalizing over matrix are below.

Day
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_sigma_day_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = sigma ~ (1 | day_expt),
cores = 1)
save(fitted_sigma_day_se, file = "full-analysis-files/fitted_sigma_day_se.rda")
The expected standard deviations by day after marginalizing over matrix are below.

Standard deviation is estimated to vary considerably from day to day for some of the +1 methods. Much of that variability, however, is attributed to the large deviation on 3/30. Interestingly, and in contrast to the arsenic data, that 3/30 effect isn’t indicated for \(In\), \(Sc\) and \(Y\). Standard deviation didn’t clearly vary by day for the +2 methods, though there was some indication of that in the \(Ho^{2+}\) estimates. In any case, the large effect on 3/30 is again not indicated for the +2 methods. This figure suggests some clear differences in standard deviation due to tune setting, particularly for the +1 methods; and possibly for the \(Ho^{2+}\) method.
Matrix
load("full-analysis-files/df_mv_se.rda")
load("full-analysis-files/mod3_Se_mv.rda")
fitted_sigma_matrix_se <- df_mv_se %>%
add_fitted_draws(mod3,
dpar = "sigma",
re_formula = sigma ~ (1 | matrix),
cores = 1)
save(fitted_sigma_matrix_se, file = "full-analysis-files/fitted_sigma_matrix_se.rda")
The expected standard deviations by matrix while marginalizing over day.

Overall, excepting perhaps the \(Sc\) and \(Be\) methods, matrix to matrix variability in standard deviation was estimated to be negligible. The tune effects on standard deviation are clearer in this figure, however, the extent to which depended on the method.
Residual Correlations
Next, the estimated residual correlations among IS methods for the selenium model.

The patterns in the residual correlations are very similar to the patterns with arsenic above. The correlations are generally stronger between the +1 methods. However, it is notable that the correlations between the in-sample and alt.isotope methods and the others are considerably smaller for the selenium model compared to the one for arsenic, although the models are the same structurally.
Predictions
Finally, the predictions for the selenium model.
Day
Predictions to the observed days for a new matrix.

Clearly the in-sample method is predicted to have the least bias, on average, the least variation across and within days. There is no indication of important day to day variability for that method. The alt.isotope method also is predicted to be reasonably unbiased and precise, but day to day variation in expected bias is clear. A similar conclusion would describe the predictions for the \(Ho^{+2}\) method. Across all of the +2 methods, bias was predicted with far greater certainty for LHe tune compared to the HHe tune, indicating the estimated differences in standard deviations due to tune.
Matrix
The predictions to the observed matrices while marginalizing the day effects are below.

Matrix to matrix variability is predicted to largely negligible for most methods. This is a bit of a contrast to the arsenic predictions, which showed a bit more variation, particularly in the 250ppm matrices vs. others.
New day and matrix
Finally, the predictions to a new matrix and new day from the selenium model.
The probability of over-correction for each case can be calculated from the posterior predictive distribution.

This figure again emphasizes differences in precision between the predictions for the +2 and +1 methods as well as the two tune settings. Compared to the model for arsenic, this one for selenium allocates more probability towards over-corrections for the +2 internal standard methods; whereas for the arsenic model, all +2 methods were predicted with most of the probability in the region of under-correction. Likewise, the predictions for the +1 methods are largely in the direction of over-correction.
Overall, the in-sample method predictions compare favorably compared to most other methods and tune settings. The expected bias is nearer zero and the uncertainty in the predictions are considerably smaller, even for the HHe tune setting.
References
Bürkner, Paul-Christian. 2017.
“Brms: An r Package for Bayesian Multilevel Models Using Stan.” Journal Article.
2017 80 (1): 28.
https://doi.org/10.18637/jss.v080.i01.
Gabry, Jonah, Daniel Simpson, Aki Vehtari, Michael Betancourt, and Andrew Gelman. 2019.
“Visualization in Bayesian Workflow.” Journal Article.
Journal of the Royal Statistical Society: Series A (Statistics in Society) 182 (2): 389–402.
https://doi.org/10.1111/rssa.12378.
Stan Development Team. 2018a.
“RStan: The r Interface to Stan.” Journal Article.
http://mc-stan.org.
———. 2018b.
“Stan Modeling Language Users Guide and Reference Manual, Version 2.18.0.” Journal Article.
http://mc-stan.org.
———. 2018c.
“The Stan Core Library, Version 2.18.0.” Journal Article.
http://mc-stan.org.
Vehtari, Aki, Andrew Gelman, and Jonah Gabry. 2017.
“Practical Bayesian Model Evaluation Using Leave-One-Out Cross-Validation and WAIC.” Journal Article.
Statistics and Computing 27 (5): 1413–32.
https://doi.org/10.1007/s11222-016-9696-4.
Session Info
sessionInfo()
R version 4.0.5 (2021-03-31)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C
[5] LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] brms_2.15.2 Rcpp_1.0.6 ggrepel_0.9.1 ggdist_2.4.0 tidybayes_2.3.1
[6] bayesplot_1.8.0 loo_2.4.1 rstan_2.21.2 StanHeaders_2.21.0-7 forcats_0.5.1
[11] stringr_1.4.0 dplyr_1.0.5 purrr_0.3.4 readr_1.4.0 tidyr_1.1.3
[16] tibble_3.1.1 tidyverse_1.3.1 readxl_1.3.1 gridExtra_2.3 ggExtra_0.9
[21] ggplot2_3.3.3
loaded via a namespace (and not attached):
[1] minqa_1.2.4 colorspace_2.0-0 ellipsis_0.3.1 ggridges_0.5.3 rsconnect_0.8.17
[6] markdown_1.1 base64enc_0.1-3 fs_1.5.0 rstudioapi_0.13 farver_2.1.0
[11] DT_0.18 svUnit_1.0.6 fansi_0.4.2 mvtnorm_1.1-1 lubridate_1.7.10
[16] xml2_1.3.2 bridgesampling_1.1-2 codetools_0.2-18 splines_4.0.5 knitr_1.33
[21] shinythemes_1.2.0 projpred_2.0.2 jsonlite_1.7.2 nloptr_1.2.2.2 broom_0.7.6
[26] dbplyr_2.1.1 shiny_1.6.0 compiler_4.0.5 httr_1.4.2 backports_1.2.1
[31] assertthat_0.2.1 Matrix_1.3-2 fastmap_1.1.0 cli_2.5.0 later_1.1.0.1
[36] htmltools_0.5.1.1 prettyunits_1.1.1 tools_4.0.5 igraph_1.2.6 coda_0.19-4
[41] gtable_0.3.0 glue_1.4.2 reshape2_1.4.4 tinytex_0.31 V8_3.4.1
[46] jquerylib_0.1.4 cellranger_1.1.0 vctrs_0.3.7 nlme_3.1-152 crosstalk_1.1.1
[51] xfun_0.22 ps_1.6.0 lme4_1.1-26 rvest_1.0.0 mime_0.10
[56] miniUI_0.1.1.1 lifecycle_1.0.0 gtools_3.8.2 statmod_1.4.35 zoo_1.8-9
[61] MASS_7.3-53.1 scales_1.1.1 colourpicker_1.1.0 hms_1.0.0 promises_1.2.0.1
[66] Brobdingnag_1.2-6 parallel_4.0.5 inline_0.3.17 shinystan_2.5.0 gamm4_0.2-6
[71] yaml_2.2.1 curl_4.3 sass_0.3.1 stringi_1.5.3 dygraphs_1.1.1.6
[76] checkmate_2.0.0 boot_1.3-27 pkgbuild_1.2.0 rlang_0.4.10 pkgconfig_2.0.3
[81] matrixStats_0.58.0 distributional_0.2.2 evaluate_0.14 lattice_0.20-41 htmlwidgets_1.5.3
[86] rstantools_2.1.1 processx_3.5.1 tidyselect_1.1.1 plyr_1.8.6 magrittr_2.0.1
[91] R6_2.5.0 generics_0.1.0 DBI_1.1.1 mgcv_1.8-35 pillar_1.6.0
[96] haven_2.4.0 withr_2.4.2 xts_0.12.1 abind_1.4-5 modelr_0.1.8
[101] crayon_1.4.1 arrayhelpers_1.1-0 utf8_1.2.1 rmarkdown_2.7 grid_4.0.5
[106] callr_3.7.0 threejs_0.3.3 reprex_2.0.0 digest_0.6.27 xtable_1.8-4
[111] httpuv_1.5.5 RcppParallel_5.1.2 stats4_4.0.5 munsell_0.5.0 bslib_0.2.4
[116] shinyjs_2.0.0
LS0tDQp0aXRsZTogIk1vZGVsaW5nIHdvcmtmbG93IHN1cHBsZW1lbnQ6IEFuIGV2YWx1YXRpb24gb2YgTTIrIGludGVyZmVyZW5jZSBjb3JyZWN0aW9uIGFwcHJvYWNoZXMgYXNzb2NpYXRlZCB3aXRoIEFzIGFuZCBTZSBpbiBJQ1AtTVMgdXNpbmcgYSBtdWx0aS1kYXkgZGF0YXNldCBhbG9uZyB3aXRoIElDUC1RUVEgLyBIUi1JQ1AtTVMgYmFzZWQgYW5hbHlzaXMgYW5kIGhpZXJhcmNoaWNhbCBtb2RlbGluZyBhcyBhIG1lYW5zIG9mIGFzc2Vzc2luZyBiaWFzIGluIGZvcnRpZmllZCBkcmlua2luZyB3YXRlcnMgYW5kIHNpbmdsZSBjb21wb25lbnQgbWF0cmljZXMiDQpkYXRlOiAiYHIgZm9ybWF0KCBTeXMudGltZSgpLCAnJUIgJWQsICVZJyApYCINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgZm9udF9zaXplOiAxNA0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgdGhlbWU6IHNpbXBsZXgNCmJpYmxpb2dyYXBoeTogUmVmZXJlbmNlcy5iaWINCi0tLQ0KDQpgYGB7ciBwYWNrYWdlcy13ZC1vcHRpb25zLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KI3NldCBkaXJlY3RvcmllcyBhbmQgUiBwYWNrYWdlIGxpYnJhcnkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2dFeHRyYSkNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocnN0YW4pDQpsaWJyYXJ5KGxvbykNCmxpYnJhcnkoYmF5ZXNwbG90KQ0KbGlicmFyeSh0aWR5YmF5ZXMpDQpsaWJyYXJ5KGdnZGlzdCkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYnJtcykNCg0Kb3B0aW9ucyhtYy5jb3JlcyA9IDE2KQ0KcnN0YW5fb3B0aW9ucyhhdXRvX3dyaXRlID0gVFJVRSkNCnJzdGFuX29wdGlvbnMoamF2YXNjcmlwdCA9IEZBTFNFKQ0KDQpvcHRpb25zKG1heC5wcmludCA9IDk5OTkpDQpgYGANCg0KIyBCYWNrZ3JvdW5kDQpJbiB0aGlzIGRvY3VtZW50LCB0aGUgcmVzdWx0cyBvZiBtb2RlbCBmaXR0aW5nLCBjaGVja2luZywgYW5kIGluZmVyZW5jZXMgYXJlIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIGNvZGUgYW5kIHdvcmtmbG93LiBUaGUgb2JqZWN0aXZlcyBvZiB0aGUgbW9kZWxpbmcgZWZmb3J0IHdlcmUgdG8gKDEpIGVzdGltYXRlIHRoZSBlZmZlY3RzIG9mIHRoZSBleHBlcmltZW50YWwgZmFjdG9ycyAoaS5lLiwgbWF0cml4LCBkYXksIGFuZCB0dW5lKSBvbiB0aGUgYWNjdXJhY3kgYW5kIHByZWNpc2lvbiBvZiB1c2luZyBkaWZmZXJlbnQgaW50ZXJuYWwgc3RhbmRhcmRzIChpLmUuLCBpbi1zYW1wbGUsIGFsdC5pc290b3BlLCBldGMuKSB0byBwcmVkaWN0IHRoZSBzaGlmdHMgaW4gdGhlIE0yKy9NMSsgZmFjdG9yLiBUaGUgYWNjdXJhY3kgb2YgIHRoZXNlIHByZWRpY3Rpb25zIGZvciAkXns3NX1BcyQgICgkXnsxNTB9TmReezIrfSQgYW5kICReezE1MH1TbV57Mit9JCkgYW5kIFNlICgkXnsxNTZ9R2ReezIrfSQpIHdlcmUgZGV0ZXJtaW5lZCB1c2luZyBJQ1AtUVFRIGFuZCBIUi1JQ1AtTVMgKGkuZS4sIOKAnFRydWUgVmFsdWXigJ0gb3IsIGhlbmNlZm9ydGgsIOKAnFRW4oCdKSA7IGFuZCAoMikgdG8gcHJlZGljdCBvdXQtb2Ytc2FtcGxlIG9ic2VydmF0aW9ucyBpbiBvcmRlciB0byBxdWFudGlmeSBleHBlY3RhdGlvbnMgYWJvdXQgdGhlIGZ1dHVyZSBwZXJmb3JtYW5jZSBvZiB0aGVzZSBpbnRlcm5hbCBzdGFuZGFyZCBtZXRob2RzLg0KDQpUaGlzIGRvY3VtZW50IGJlZ2lucyB3aXRoIGEgc2VjdGlvbiBkZXNjcmliaW5nIHRoZSBwcmVwYXJhdGlvbiBvZiB0aGUgZXhwZXJpbWVudGFsIGRhdGEgZm9yIHVzZSBpbiB0aGUgc3Vic2VxdWVudCBtb2RlbGluZy4gVGhlbiB0aGVyZSBpcyBhIHNlY3Rpb24gZXhwbGFpbmluZyB0aGUgbW9kZWwncyBzdHJ1Y3R1cmUuIFRoYXQgc2VjdGlvbiBpcyBmb2xsb3dlZCBieSBvbmUgZGVzY3JpYmluZyB0aGUgcHJpb3JzIHVzZWQgZm9yIGVhY2ggcGFyYW1ldGVyIGluIHRoZSBtb2RlbCBhbmQgdGhlIGltcGxpZWQgcHJpb3IgcHJlZGljdGl2ZSBkaXN0cmlidXRpb24uIFRoZSBuZXh0IHNlY3Rpb25zIHRoZW4gZGVzY3JpYmUgbW9kZWwgZml0cywgY2hlY2tzLCBhbmQgaW5mZXJlbmNlcy4NCg0KDQojIEltcG9ydCBhbmQgbXVuZyBkYXRhDQpUaGUgZGF0YSBpcyBpbXBvcnRlZCBmcm9tIHRoZSBsb2NhbCBkaXJlY3RvcnkgYW5kIHN0b3JlZCBhcyBhbiBvYmplY3QgaW4gUi4gQWxsIGNvZGUgaXMgbm90IHNob3duIGluIHRoZSBodG1sIG5vdGVib29rLCBidXQgaXMgYXZhaWxhYmxlIGluIHRoZSBSIG1hcmtkb3duIGRvY3VtZW50IChpLmUuLCAucm1kIGZpbGUpLg0KDQpgYGB7ciBpbXBvcnRfZGF0YSwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCiMgSW1wb3J0IGRhdGEgZnJvbSBleGNlbCBmb3IgRGVmbGVjdCAyMCBTZQ0KZGF0X2ltcG9ydF9TZV8yMCA8LSBhc190aWJibGUocmVhZF94bHN4KCJTZSBkYXRhIGFsbCA4IGRheXMgd2l0aCBhbGwgSVMgdXNlZCBmb3IgUm95IDItMjMtMjEueGxzeCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldD0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAiQTc6WTEwMyIpKSAlPiUNCiAgbXV0YXRlKERhdGUgPSBsdWJyaWRhdGU6OnltZChEYXRlKSkgDQoNCnNhdmUoZGF0X2ltcG9ydF9TZV8yMCwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2RhdF9pbXBvcnRfU2VfMjAucmRhIikgIyBzYXZlIGltcG9ydGVkIGRlZmxlY3QgMjAgZGF0YSBhcyByZGEgZmlsZQ0KDQojIEltcG9ydCBkYXRhIGZyb20gZXhjZWwgZm9yIERlZmxlY3QgNSBTZQ0KZGF0X2ltcG9ydF9TZV81IDwtIGFzX3RpYmJsZShyZWFkX3hsc3goIlNlIGRhdGEgYWxsIDggZGF5cyB3aXRoIGFsbCBJUyB1c2VkIGZvciBSb3kgMi0yMy0yMS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PTIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9ICJBNzpZMTAzIikpICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGx1YnJpZGF0ZTo6eW1kKERhdGUpKQ0KDQpzYXZlKGRhdF9pbXBvcnRfU2VfNSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2RhdF9pbXBvcnRfU2VfNS5yZGEiKSAjIHNhdmUgaW1wb3J0ZWQgZGVmbGVjdCA1IGRhdGEgYXMgcmRhIGZpbGUNCg0KIyBJbXBvcnQgZGF0YSBmcm9tIGV4Y2VsIGZvciBEZWZsZWN0IDIwIEFzDQpkYXRfaW1wb3J0X0FzXzIwIDwtIGFzX3RpYmJsZShyZWFkX3hsc3goIkFzIGRhdGEgYWxsIDggZGF5cyB3aXRoIGFsbCBJUyB1c2VkIGZvciBSb3kgNS0yOC0yMC54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0PTEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9ICJBNzpZMTAzIikpICU+JQ0KICBtdXRhdGUoRGF0ZSA9IGx1YnJpZGF0ZTo6eW1kKERhdGUpKSANCg0Kc2F2ZShkYXRfaW1wb3J0X0FzXzIwLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGF0X2ltcG9ydF9Bc18yMC5yZGEiKSAjIHNhdmUgaW1wb3J0ZWQgZGVmbGVjdCAyMCBkYXRhIGFzIHJkYSBmaWxlDQoNCiMgSW1wb3J0IGRhdGEgZnJvbSBleGNlbCBmb3IgRGVmbGVjdCA1IEFzDQpkYXRfaW1wb3J0X0FzXzUgPC0gYXNfdGliYmxlKHJlYWRfeGxzeCgiQXMgZGF0YSBhbGwgOCBkYXlzIHdpdGggYWxsIElTIHVzZWQgZm9yIFJveSA1LTI4LTIwLnhsc3giLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQ9MiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gIkE3OlkxMDMiKSkgJT4lDQogIG11dGF0ZShEYXRlID0gbHVicmlkYXRlOjp5bWQoRGF0ZSkpDQoNCnNhdmUoZGF0X2ltcG9ydF9Bc181LCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGF0X2ltcG9ydF9Bc181LnJkYSIpICMgc2F2ZSBpbXBvcnRlZCBkZWZsZWN0IDUgZGF0YSBhcyByZGEgZmlsZQ0KYGBgDQoNCmBgYHtyIGNvbWJpbmVfZGF0YXNldHMsIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQojIENvbWJpbmUgZGF0YXNldHMgZnJvbSBib3RoIERlZmxlY3Qgc2V0dGluZ3MNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGF0X2ltcG9ydF9TZV8yMC5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kYXRfaW1wb3J0X1NlXzUucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGF0X2ltcG9ydF9Bc18yMC5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kYXRfaW1wb3J0X0FzXzUucmRhIikNCg0KZGZfMjAwXzggPC0gYmluZF9yb3dzKGRhdF9pbXBvcnRfQXNfMjAsIGRhdF9pbXBvcnRfQXNfNSwgZGF0X2ltcG9ydF9TZV8yMCwgZGF0X2ltcG9ydF9TZV81KQ0KDQojIHJlbW92ZSB0aGUgbm93IHVubmVjZXNzYXJ5IGluZGl2aWR1YWwgZGF0YSB0aWJibGVzDQpybShkYXRfaW1wb3J0X0FzXzIwLCBkYXRfaW1wb3J0X0FzXzUsIGRhdF9pbXBvcnRfU2VfMjAsIGRhdF9pbXBvcnRfU2VfNSkNCg0KIyBjaGFuZ2UgdG8gY29tcGF0aWJsZSBjb2x1bW4gbmFtZXMNCmNvbG5hbWVzKGRmXzIwMF84KSA8LSBjKCJkYXRlIiwgImRlZmxlY3QiLCAibWV0aG9kIiwgIndhdGVyXzEiLCAid2F0ZXJfMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAid2F0ZXJfNCIsICJuZWF0XzEiLCAid2F0ZXJfNSIsICJ3YXRlcl82IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAid2F0ZXJfNyIsICJ3YXRlcl84IiwgIndhdGVyXzkiLCAibmVhdF8yIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAid2F0ZXJfMTAiLCAid2F0ZXJfMTEiLCAid2F0ZXJfMTIiLCAibmVhdF8zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJOYSIsICJNZyIsICJLIiwgIkNhIiwgIlNPNCIsICJIQ2wiLCAiUE80IiwgIm5lYXRfNCIpDQoNCiMgQ29sdW1uIGluZGljYXRpbmcgQXMgb3IgU2UNCmRmXzIwMF84IDwtIGRmXzIwMF84ICU+JQ0KICBtdXRhdGUoYW5hbHl0ZSA9IGMocmVwKCJBcyIsIDE5MiksIHJlcCgiU2UiLCAxOTIpKSkNCg0KIyBDaGFuZ2UgY29ycmVjdGlvbiBmYWN0b3IgbGFiZWxzIHRvIG1vcmUgY29kZSBmcmllbmRseSBkZXNjcmlwdGlvbnMNCmRmXzIwMF84IDwtIGRmXzIwMF84ICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlcGxhY2UobWV0aG9kLCBmYWN0b3IobWV0aG9kKSA9PSAiNzcuNSIsICJBbHQiKSkgJT4lDQogIG11dGF0ZShtZXRob2QgPSByZXBsYWNlKG1ldGhvZCwgZmFjdG9yKG1ldGhvZCkgPT0gIjcyLjUgJiA3NC41IiwgIkFsdCIpKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IHJlcGxhY2UobWV0aG9kLCBmYWN0b3IobWV0aG9kKSA9PSAiSG8yKyIsICJIbzIiKSkgJT4lDQogIG11dGF0ZShtZXRob2QgPSByZXBsYWNlKG1ldGhvZCwgZmFjdG9yKG1ldGhvZCkgPT0gIkluIFNhbXBsZSIsICJTdGQiKSkgJT4lDQogIG11dGF0ZShtZXRob2QgPSByZXBsYWNlKG1ldGhvZCwgZmFjdG9yKG1ldGhvZCkgPT0gImluIHNhbXBsZSIsICJTdGQiKSkgJT4lDQogIG11dGF0ZShtZXRob2QgPSByZXBsYWNlKG1ldGhvZCwgZmFjdG9yKG1ldGhvZCkgPT0gInVuY29ycmVjdGVkIiwgInVjIikpICU+JQ0KICBtdXRhdGUobWV0aG9kID0gcmVwbGFjZShtZXRob2QsIGZhY3RvcihtZXRob2QpID09ICJIbzErIiwgIkhvMSIpKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IHJlcGxhY2UobWV0aG9kLCBmYWN0b3IobWV0aG9kKSA9PSAiSG8rMSIsICJIbzEiKSkNCg0KIyByZW1vdmUgdW5jb3JyZWN0ZWQgYW5kIG5lYXQgIm1ldGhvZHMiDQpkZl8yMDBfOCA8LSBkZl8yMDBfOCAlPiUNCiAgZmlsdGVyKG1ldGhvZCAhPSAidWMiLA0KICAgICAgICAgbWV0aG9kICE9ICJuZWF0IikNCg0KIyBQdXQgZGF0YSBpbiBsb25nIGZvcm1hdA0KZGZfMjAwXzggPC0gZGZfMjAwXzggJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gNDoyNSwgbmFtZXNfdG8gPSAibWF0cml4IiwgdmFsdWVzX3RvID0gImRpZmZfc3RkIikgJT4lDQogIG11dGF0ZShkaWZmX3N0ZCA9IHJvdW5kKGRpZmZfc3RkLCA0KSkgJT4lICNyb3VuZCB0byArLy0gMC4xIHBwdA0KICBtdXRhdGUobWV0aG9kID0gZmFjdG9yKG1ldGhvZCkpICU+JQ0KICBtdXRhdGUobWF0cml4ID0gZmFjdG9yKG1hdHJpeCkpICU+JQ0KICBtdXRhdGUobW9udGggPSBmYWN0b3IobHVicmlkYXRlOjptb250aChkYXRlKSkpICU+JQ0KICBtdXRhdGUoZGF5ID0gZmFjdG9yKGx1YnJpZGF0ZTo6ZGF5KGRhdGUpKSkgJT4lDQogIG11dGF0ZShkYXlfZXhwdCA9IGZhY3RvcihwYXN0ZTAobW9udGgsIGRheSkpKSAlPiUNCiAgbXV0YXRlKGRheSA9IGFzLmludGVnZXIoZGF5X2V4cHQpKSAlPiUNCiAgbXV0YXRlKHR1bmUgPSBmYWN0b3IoZGVmbGVjdCkpICU+JQ0KICBtdXRhdGUodHVuZSA9IHJlbGV2ZWwoZmFjdG9yKGlmZWxzZSh0dW5lID09IDIwLCAiTEhlIiwgIkhIZSIpKSwgcmVmID0gIkxIZSIpKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzEiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJBbHQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RkIiwgIkhvMiIpKSkgJT4lDQogIHNlbGVjdCgtZGF0ZSwgLW1vbnRoLCAtZGF5KSAlPiUgI3JlbW92ZSBkYXRlLCBtb250aCwgZGF5IChrZWVwIGRheV9leHB0KQ0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gYW5hbHl0ZSwgdmFsdWVzX2Zyb20gPSBkaWZmX3N0ZCkNCg0Kc2F2ZShkZl8yMDBfOCwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmXzIwMF84X0FzU2UucmRhIikgIyBzYXZlIGNvbWJpbmVkIGRhdGEgKGJvdGggZGVmbGVjdCBzZXR0aW5ncykgYXMgcmRhIGZpbGUNCmBgYA0KDQpgYGB7ciBkYXRhX2Zvcl9tb2RlbCwgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9VFJVRX0NCiMgZnVydGhlciBkaXN0aWxsIGRhdGEgZG93biB0byB0aGUgdmFyaWFibGVzIG9mIGludGVyZXN0IGFuZCByZW5hbWUvcmVjb2RlIGZvciBjb252ZW5pZW5jZQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl8yMDBfOF9Bc1NlLnJkYSIpDQpkZl9tb2RlbCA8LSBkZl8yMDBfOA0KDQpzYXZlKGRmX21vZGVsLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbW9kZWxfQXNTZS5yZGEiKQ0KYGBgDQoNClByaW50IGRhdGFmcmFtZXMgZm9yIGJvdGggQXMgYW5kIFNlLiANCmBgYHtyIGRmX212LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tb2RlbF9Bc1NlLnJkYSIpDQpkZl9tdl9hcyA8LSBkZl9tb2RlbCAlPiUgDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKGlkZXIgPSBwYXN0ZTAobWF0cml4LCBkYXlfZXhwdCwgdHVuZSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMoaWRlciwgbWF0cml4LCBkYXlfZXhwdCwgdHVuZSksDQogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBtZXRob2QsIA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IEFzKQ0KDQpkZl9tdl9zZSA8LSBkZl9tb2RlbCAlPiUgDQogIHVuZ3JvdXAoKSAlPiUNCiAgbXV0YXRlKGlkZXIgPSBwYXN0ZTAobWF0cml4LCBkYXlfZXhwdCwgdHVuZSkpICU+JSANCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMoaWRlciwgbWF0cml4LCBkYXlfZXhwdCwgdHVuZSksDQogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBtZXRob2QsIA0KICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IFNlKQ0KDQpzYXZlKGRmX212X2FzLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfYXMucmRhIikNCnNhdmUoZGZfbXZfc2UsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KDQpwcmludChkZl9tdl9hcykNCnByaW50KGRmX212X3NlKQ0KYGBgDQoNCkZvciBlYWNoIG9mIEFzIGFuZCBTZSwgdGhlcmUgd2VyZSAzNTIgb2JzZXJ2YXRpb25zIG9mIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIElTIChpbnRlcm5hbCBzdGFuZGFyZHMpIGNvcnJlY3RlZCBlc3RpbWF0ZSBhbmQgdGhlICJUcnVlIFZhbHVlIiAoImRpZmZfc3RkIikgZm9yIGVhY2ggb2YgdGhlIDEwIElTIG1ldGhvZHMgb3ZlciA4IGRheXMsIDIwIG1hdHJpY2VzLCBhbmQgMiB0dW5lIHNldHRpbmdzLiBGb3IgY2xhcmlmaWNhdGlvbiwgdGhlICJkYXlfZXhwdCIgY29sdW1uIGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBtb250aCBhbmQgZGF5IGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBvZiB0aGUgOCBkYXlzIG9mIHRoZSBleHBlcmltZW50LiBUaGUgInR1bmUiIHZhcmlhYmxlIGRlc2NyaWJlcyB0aGUgdHVuZSBzZXR0aW5nIChoaWdoIGhlbGl1bSA9IEhIZSBvciBsb3cgaGVsaXVtID0gTEhlKSB1c2VkIGZvciBlYWNoIG9ic2VydmF0aW9uLiBUaGUgIm1hdHJpeCIgY29sdW1uIGlzIHNlbGYtZXhwbGFuYXRvcnkuIFRoZSBsYXN0IDEwIGNvbHVtbnMgY29udGFpbiB0aGUgcmVzdWx0cyBmb3IgZWFjaCBvZiB0aGUgSVMgbWV0aG9kcy4gDQoNCiMgVmlzdWFsaXplIGRhdGENCkJlbG93IGlzIGEgcGxvdCBvZiBvYnNlcnZlZCBiaWFzIChyZWxhdGl2ZSB0byAiVFYiKSBieSB0dW5lIHNldHRpbmcgZm9yIGVhY2ggSVMgbWV0aG9kIGZvciBBcnNlbmljLiANCmBgYHtyIHN1bW1hcml6ZV90dW5lX21ldGhvZF9BcywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKCB3aWR0aCA9IDAuMSApDQoNCmRmX21vZGVsICU+JQ0KICBtdXRhdGUobWV0aG9kID0gcmVjb2RlX2ZhY3RvcihtZXRob2QsICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90ICU+JQ0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChkYXlfZXhwdCwgbWV0aG9kLCB0dW5lLCBBcykgJT4lDQogIGdncGxvdChhZXMoIHg9IHR1bmUsIHkgPSBBcywgZ3JvdXAgPSB0dW5lICwgY29sb3IgPSB0dW5lKSkgKyANCiAgZ2VvbV9wb2ludCggcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBzaG93LmxlZ2VuZCA9IEYgKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodGJsdWUiLCAicGluayIpKSArDQogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiAsYWxwaGEgPSAwLjcpICsNCiAgZ2VvbV9obGluZSggeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIHlsYWIoIkJpYXMgb2JzZXJ2ZWQiKSArDQogIGZhY2V0X3dyYXAofiBtZXRob2QgLCBuY29sID0gNSwgc2NhbGVzID0gImZyZWVfeCIpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKw0KICB0aGVtZV9idygpDQpgYGANClRoZSBhYm92ZSBwbG90IHN1Z2dlc3RzIHNsaWdodCB1bmRlci1jb3JyZWN0aW9ucywgb24gYXZlcmFnZSwgZm9yIGFsbCBvZiB0aGUgKzIgaW50ZXJuYWwgc3RhbmRhcmQgbWV0aG9kcy4gTW9zdCBvZiB0aGUgKzEgbWV0aG9kcyBsb29rIHRvIGhhdmUgb3Zlci1jb3JyZWN0ZWQgb3IgcmVzdWx0ZWQgaW4gbWluaW1hbCBiaWFzLCBvbiBhdmVyYWdlLiBXaXRoaW4gbWV0aG9kLCB0aGVyZSBhcmUgbm8gY2xlYXIgZGlmZmVyZW5jZXMgaW4gdGhpcyBmaWd1cmUgZHVlIHRvIHR1bmUgc2V0dGluZyBmb3IgYW55IG1ldGhvZC4gDQoNCk5leHQsIHRoZSBzYW1lIHBsb3QgZm9yIHRoZSBzZWxlbml1bSBvYnNlcnZhdGlvbnMuDQpgYGB7ciBzdW1tYXJpemVfdHVuZV9tZXRob2RfU2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSggd2lkdGggPSAwLjEgKQ0KDQpkZl9tb2RlbCAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IobWV0aG9kLCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdCAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBzZWxlY3QoZGF5X2V4cHQsIG1ldGhvZCwgdHVuZSwgU2UpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9IHR1bmUsIHkgPSBTZSwgZ3JvdXAgPSB0dW5lICwgY29sb3IgPSB0dW5lKSkgKyANCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCksIHNob3cubGVnZW5kID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRibHVlIiwgInBpbmsiKSkgKw0KICBnZW9tX2JveHBsb3Qob3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9ICJibGFjayIgLGFscGhhID0gMC43KSArDQogIGdlb21faGxpbmUoIHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICBjb29yZF9mbGlwKCkgKw0KICB5bGFiKCJCaWFzIG9ic2VydmVkIikgKw0KICBmYWNldF93cmFwKH4gbWV0aG9kICwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlX3giKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQpGb3Igc2VsZW5pdW0sIHRoZSArMiBtZXRob2RzIGxvb2sgdG8gYmUgdW5iaWFzZWQgdG8gc2xpZ2h0bHkgb3Zlci1jb3JyZWN0ZWQsIG9uIGF2ZXJhZ2UuIFRoZSArMSBtZXRob2RzIGFsbCB0ZW5kZWQgdG8gb3Zlci1jb3JyZWN0IGZhaXJseSBjbGVhcmx5LiBXaXRoaW4gbWV0aG9kLCB0aGVyZSBsb29rcyB0byBiZSBjbGVhcmVyIGluZGljYXRpb24gb2YgZGlmZmVyZW5jZXMgZHVlIHRvIHR1bmUgc2V0dGluZyBmb3Igc29tZSBvZiB0aGUgKzEgbWV0aG9kczogJFkkIGFuZCAkU2MkIGluIHBhcnRpY3VsYXIuIE90aGVyd2lzZSwgdHVuZSBlZmZlY3RzIGFyZSBub3QgY2xlYXIuDQoNCk5leHQsIGEgcGxvdCBvZiBvYnNlcnZhdGlvbnMgYnkgbWV0aG9kIGFuZCBkYXkgb2YgdGhlIGV4cGVyaW1lbnQgZm9yIGFyc2VuaWMuDQpgYGB7ciBzdW1tYXJpemVfZGF5X21ldGhvZF9BcywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSggd2lkdGggPSAwLjUgKQ0KDQpkZl9tb2RlbCAlPiUgDQogIG11dGF0ZShtZXRob2QgPSByZWNvZGVfZmFjdG9yKG1ldGhvZCwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGluIHBsb3QgJT4lDQogIG11dGF0ZShtZXRob2QgPSBmY3RfcmVsZXZlbChtZXRob2QsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgc2VsZWN0KGRheV9leHB0LCBtZXRob2QsIHR1bmUsIEFzKSAlPiUNCiAgZ2dwbG90KCBhZXMoIHg9IGRheV9leHB0LCB5ID0gQXMpICkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZ3JheSIsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKCksIHNob3cubGVnZW5kID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRibHVlIiwgInBpbmsiKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKCB4PSBkYXlfZXhwdCwgeSA9IEFzLCBncm91cCA9IGRheV9leHB0KSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9ICJibGFjayIgLGFscGhhID0gMC41KSArDQogIGdlb21faGxpbmUoIHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkFyc2VuaWMgYmlhczogTWV0aG9kIHggZGF5IikgKw0KICB5bGFiKCJCaWFzIG9ic2VydmVkIikgKw0KICBmYWNldF93cmFwKH4gbWV0aG9kICwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlX3giKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQpUaGUgYmlhcyBsb29rcyB0byBoYXZlIHZhcmllZCBieSBkYXksIG1vc3QgY2xlYXJseSBmb3IgdGhlICsxIG1ldGhvZHMuIEluIHBhcnRpY3VsYXIsIHRoZSBkYXkgb2YgdGhlIGNvbmUgY2hhbmdlICgzLzMwKSBzdGlja3Mgb3V0IHdpdGggaGF2aW5nIGdyZWF0ZXIgdGVuZGVuY3kgZm9yIG92ZXItY29ycmVjdGlvbnMgZm9yIHRob3NlIG1ldGhvZHMuIFRoZSBjb25lIGNoYW5nZSBsb29rcyB0byBoYXZlIGJlZW4gbGVzcyBpbXBvcnRhbnQgZm9yIHRoZSArMiBtZXRob2RzOyB0aG91Z2ggaXQgaXNuJ3QgY2xlYXIgdGhhdCBkYXkgdG8gZGF5IHZhcmlhYmlsaXR5IHdhcyBlbnRpcmVseSBuZWdsaWdpYmxlIGZvciB0aG9zZSBtZXRob2RzLg0KDQpBbmQgdGhlIHNhbWUgcGxvdCBmb3Igc2VsZW5pdW0uDQpgYGB7ciBzdW1tYXJpemVfZGF5X21ldGhvZF9TZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSggd2lkdGggPSAwLjUgKQ0KDQpkZl9tb2RlbCAlPiUgDQogIG11dGF0ZShtZXRob2QgPSByZWNvZGVfZmFjdG9yKG1ldGhvZCwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGluIHBsb3QgJT4lDQogIG11dGF0ZShtZXRob2QgPSBmY3RfcmVsZXZlbChtZXRob2QsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgc2VsZWN0KGRheV9leHB0LCBtZXRob2QsIHR1bmUsIFNlKSAlPiUNCiAgZ2dwbG90KCBhZXMoIHg9IGRheV9leHB0LCB5ID0gU2UpICkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMSwgY29sb3IgPSAiZ3JheSIsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKCksIHNob3cubGVnZW5kID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRibHVlIiwgInBpbmsiKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKCB4PSBkYXlfZXhwdCwgeSA9IFNlLCBncm91cCA9IGRheV9leHB0KSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9ICJibGFjayIgLGFscGhhID0gMC41KSArDQogIGdlb21faGxpbmUoIHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIlNlbGVuaXVtIGJpYXM6IE1ldGhvZCB4IGRheSIpICsNCiAgeWxhYigiQmlhcyBvYnNlcnZlZCIpICsNCiAgZmFjZXRfd3JhcCh+IG1ldGhvZCAsIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZV94IikgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KVGhlIHBhdHRlcm4gaXMgc2ltaWxhciBhcyB3aXRoIGFyc2VuaWMgYWJvdmUuIEhvd2V2ZXIsIHRoZSBkYXkgdG8gZGF5IHZhcmlhYmlsaXR5IGZvciB0aGUgKzIgbWV0aG9kcyBsb29rcyBtb3JlIHByb25vdW5jZWQuIA0KDQpOZXh0LCBhIHNpbWlsYXIgcGxvdCwgYnV0IGRpdmlkaW5nIHRoZSBwYW5lbHMgYnkgbWF0cml4IHdpdGhpbiBtZXRob2QgZm9yIGFyc2VuaWMuIA0KYGBge3Igc3VtbWFyaXplX21hdHJpeF9tZXRob2RfQXMsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2UoIHdpZHRoID0gMC41ICkNCg0KZGZfbW9kZWwgJT4lIA0KICBtdXRhdGUobWV0aG9kID0gcmVjb2RlX2ZhY3RvcihtZXRob2QsICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90ICU+JQ0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChtYXRyaXgsIG1ldGhvZCwgdHVuZSwgQXMpICU+JQ0KICBnZ3Bsb3QoYWVzKCB4PSBtYXRyaXgsIHkgPSBBcykpICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGNvbG9yID0gImdyYXkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcigpLCBzaG93LmxlZ2VuZCA9IEYpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyggeD0gbWF0cml4LCB5ID0gQXMsIGdyb3VwID0gbWF0cml4KSwgb3V0bGllci5zaGFwZSA9IE5BLCBjb2xvciA9ICJibGFjayIgLGFscGhhID0gMC43KSArDQogIGdlb21faGxpbmUoIHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkFyc2VuaWMgYmlhczogTWV0aG9kIHggbWF0cml4IikgKw0KICB5bGFiKCJCaWFzIG9ic2VydmVkIikgKw0KICBmYWNldF93cmFwKH4gbWV0aG9kICwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlX3giKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQpNYXRyaXggdG8gbWF0cml4IHZhcmlhdGlvbiBpbiBiaWFzIGxvb2tzIGEgbGl0dGxlIGxlc3Mgc2V2ZXJlIGNvbXBhcmVkIHRvIHZhcmlhdGlvbiBieSBkYXkgYWJvdmUuIEluZmVyZW5jZXMgY29uY2VybmluZyBkaWZmZXJlbmNlcyBhcmUgbm9pc2llciBoZXJlIGR1ZSB0byBvbmx5IDE2IG9ic2VydmF0aW9ucyBwZXIgYm94LiBIb3dldmVyLCBsb29raW5nIGF0ICRTYyQsIGZvciBleGFtcGxlLCByZWR1Y2VkIHByZWNpc2lvbiBhbmQgbGFyZ2VyIG92ZXItY29ycmVjdGlvbnMgaW4gdGhlICROYSQsICRNZyQsICRLJCwgYW5kICRDYSQgbWF0cmljZXMgcmVsYXRpdmUgdG8gb3RoZXIgbWF0cmljZXMgc3RhbmRzIG91dC4gU2ltaWxhcmx5LCB0aGUgJFNPXzQkIG1hdHJpeCBpbiB0aGUgKzIgbWV0aG9kcyBzdGFuZHMgb3V0IGFzIHBvdGVudGlhbGx5IGluZHVjaW5nIGxhcmdlciB1bmRlci1jb3JyZWN0aW9ucyByZWxhdGl2ZSB0byBhbGwgb3RoZXIgbWF0cmljZXMgZm9yIHRob3NlIG1ldGhvZHMuDQoNCkFuZCB0aGUgc2FtZSBwbG90IGZvciBzZWxlbml1bS4NCmBgYHtyIHN1bW1hcml6ZV9tYXRyaXhfbWV0aG9kX1NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKCB3aWR0aCA9IDAuNSApDQoNCmRmX21vZGVsICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IobWV0aG9kLCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdCAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBzZWxlY3QobWF0cml4LCBtZXRob2QsIHR1bmUsIFNlKSAlPiUNCiAgZ2dwbG90KGFlcyggeD0gbWF0cml4LCB5ID0gU2UpKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAxLCBjb2xvciA9ICJncmF5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXIoKSwgc2hvdy5sZWdlbmQgPSBGKSArDQogIGdlb21fYm94cGxvdChhZXMoIHg9IG1hdHJpeCwgeSA9IFNlLCBncm91cCA9IG1hdHJpeCksIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAiYmxhY2siICxhbHBoYSA9IDAuNykgKw0KICBnZW9tX2hsaW5lKCB5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJyApICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJTZWxlbml1bSBiaWFzOiBNZXRob2QgeCBtYXRyaXgiKSArDQogIHlsYWIoIkJpYXMgb2JzZXJ2ZWQiKSArDQogIGZhY2V0X3dyYXAofiBtZXRob2QgLCBuY29sID0gNSwgc2NhbGVzID0gImZyZWVfeCIpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKw0KICB0aGVtZV9idygpDQpgYGANCkluIHRlcm1zIG9mIG92ZXJhbGwgdmFyaWFiaWxpdHkgZHVlIHRvIG1hdHJpeCwgdGhpcyBvbmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBvbmUgZm9yIGFyc2VuaWMgcHJlY2VkaW5nLiBJbnRlcmVzdGluZ2x5LCB0aGUgJFNPXzQkIG1hdHJpeCBkb2Vzbid0IHN0aWNrIG91dCBmb3IgdGhlICsyIG1ldGhvZHMgaGVyZSwgdGhvdWdoIHRoZSBwYXR0ZXJuIGZvciAkU2MkIGFuZCB0aGUgMjUwcHBtIG1hdHJpY2VzIGlzIHNpbWlsYXIgdG8gdGhlIGFyc2VuaWMgcGxvdCBhYm92ZS4NCg0KTmV4dCBpcyBhbm90aGVyIHBsb3Qgb2YgdGhlIG9ic2VydmVkIGJpYXMgYnkgZGF5IChlLmcuLCA1MTYgPSA1LzE2KSBmb3IgYXJzZW5pYyBtZWFzdXJlZCBmb3IgZWFjaCBJUyBtZXRob2QsIGJ1dCBhbHNvIGRpdmlkZWQgYWNjb3JkaW5nIHRvIHR1bmUgKHJlZCA9IExIZTsgYmx1ZSA9IEhIZSkuDQpgYGB7ciBzdW1tYXJpemVfZGF5X21ldGhvZF90dW5lX0FzLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmRvZGdlIDwtIHBvc2l0aW9uX2RvZGdlKCB3aWR0aCA9IDAuNSApDQoNCmRmX21vZGVsICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IobWV0aG9kLCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdCAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBzZWxlY3QoZGF5X2V4cHQsIG1ldGhvZCwgdHVuZSwgQXMpICU+JQ0KICBnZ3Bsb3QoIGFlcyggeD0gZGF5X2V4cHQsIHkgPSBBcywgZ3JvdXAgPSB0dW5lICwgY29sb3IgPSB0dW5lICkgKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCksIHNob3cubGVnZW5kID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRibHVlIiwgInBpbmsiKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKCB4PSBkYXlfZXhwdCwgeSA9IEFzLCBncm91cCA9IGRheV9leHB0OnR1bmUpLCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiAsYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9obGluZSggeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiQXJzZW5pYyBiaWFzOiBNZXRob2QgeCBkYXkgeCB0dW5lIiwNCiAgICAgICAgc3VidGl0bGUgPSAiW0JsdWVdID0gTEhlLCBcbltSZWRdID0gSEhlIikgKw0KICB5bGFiKCJCaWFzIG9ic2VydmVkIikgKw0KICBmYWNldF93cmFwKH4gbWV0aG9kICwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlX3giKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQpUaGUgZ2VuZXJhbCBwYXR0ZXJucyBieSBkYXkgYXJlIHN0aWxsIGFwcGFyZW50IGhlcmUuIFRoZXJlIGFyZSBzb21lIGRpc3RpbmN0aW9ucyB3aXRoaW4gZGF5cywgaG93ZXZlciwgaW5kaWNhdGluZyB0aGF0IHRoZSBlZmZlY3Qgb2YgdHVuZSBtYXkgZGVwZW5kIG9uIHRoZSBkYXkgKGUuZy4sIGFsdC5pc290b3BlIG9uIDMvMjEgYW5kIDUvMTE7ICRDbyQgb24gMy8zMCBhbmQgNS8xNTsgZXRjLikuDQoNCkFuZCB0aGUgc2FtZSBwbG90IGZvciBzZWxlbml1bS4NCmBgYHtyIHN1bW1hcml6ZV9kYXlfbWV0aG9kX3R1bmVfU2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2UoIHdpZHRoID0gMC41ICkNCg0KZGZfbW9kZWwgJT4lIA0KICBtdXRhdGUobWV0aG9kID0gcmVjb2RlX2ZhY3RvcihtZXRob2QsICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90ICU+JQ0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChkYXlfZXhwdCwgbWV0aG9kLCB0dW5lLCBTZSkgJT4lDQogIGdncGxvdCggYWVzKCB4PSBkYXlfZXhwdCwgeSA9IFNlLCBncm91cCA9IHR1bmUgLCBjb2xvciA9IHR1bmUgKSApICsgDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyZG9kZ2UoKSwgc2hvdy5sZWdlbmQgPSBGKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJsaWdodGJsdWUiLCAicGluayIpKSArDQogIGdlb21fYm94cGxvdChhZXMoIHg9IGRheV9leHB0LCB5ID0gU2UsIGdyb3VwID0gZGF5X2V4cHQ6dHVuZSksIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAiYmxhY2siICxhbHBoYSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKCB5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJyApICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJTZWxlbml1bSBiaWFzOiBNZXRob2QgeCBkYXkgeCB0dW5lIiwNCiAgICAgICAgc3VidGl0bGUgPSAiW0JsdWVdID0gTEhlLCBcbltSZWRdID0gSEhlIikgKw0KICB5bGFiKCJCaWFzIG9ic2VydmVkIikgKw0KICBmYWNldF93cmFwKH4gbWV0aG9kICwgbmNvbCA9IDUsIHNjYWxlcyA9ICJmcmVlX3giKSArDQogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsNCiAgdGhlbWVfYncoKQ0KYGBgDQpUaGlzIG9uZSBpcyBzaW1pbGFyIHRvIHRoZSBhcnNlbmljIHBsb3QgYWJvdmUsIHRob3VnaCB0aGVyZSBsb29rIHRvIGJlIG1vcmUgY2FzZXMgd2hlcmUgdGhlIHR1bmUgZWZmZWN0IGRpZmZlcnMgYnkgZGF5Lg0KDQpOZXh0LCBhIHNpbWlsYXIgcGxvdCwgYnV0IGRpdmlkaW5nIHRoZSBwYW5lbHMgYnkgbWF0cml4IGFuZCB0dW5lIHdpdGhpbiBtZXRob2QgZm9yIGFyc2VuaWMuIA0KYGBge3Igc3VtbWFyaXplX21hdHJpeF9tZXRob2RfdHVuZV9BcywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTE0LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpkb2RnZSA8LSBwb3NpdGlvbl9kb2RnZSggd2lkdGggPSAwLjUgKQ0KDQpkZl9tb2RlbCAlPiUgDQogIG11dGF0ZShtZXRob2QgPSByZWNvZGVfZmFjdG9yKG1ldGhvZCwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGluIHBsb3QgJT4lDQogIG11dGF0ZShtZXRob2QgPSBmY3RfcmVsZXZlbChtZXRob2QsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgc2VsZWN0KG1hdHJpeCwgbWV0aG9kLCB0dW5lLCBBcykgJT4lDQogIGdncGxvdCggYWVzKCB4PSBtYXRyaXgsIHkgPSBBcywgZ3JvdXAgPSB0dW5lICwgY29sb3IgPSB0dW5lICkgKSArIA0KICBnZW9tX3BvaW50KHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcmRvZGdlKCksIHNob3cubGVnZW5kID0gRikgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygibGlnaHRibHVlIiwgInBpbmsiKSkgKw0KICBnZW9tX2JveHBsb3QoYWVzKCB4PSBtYXRyaXgsIHkgPSBBcywgZ3JvdXAgPSBtYXRyaXg6dHVuZSksIG91dGxpZXIuc2hhcGUgPSBOQSwgY29sb3IgPSAiYmxhY2siICxhbHBoYSA9IDAuNSkgKw0KICBnZW9tX2hsaW5lKCB5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJyApICsNCiAgY29vcmRfZmxpcCgpICsNCiAgbGFicyh0aXRsZSA9ICJBcnNlbmljIGJpYXM6IE1ldGhvZCB4IG1hdHJpeCB4IHR1bmUiLA0KICAgICAgICBzdWJ0aXRsZSA9ICJbQmx1ZV0gPSBMSGUsIFxuW1JlZF0gPSBISGUiKSArDQogIHlsYWIoIkJpYXMgb2JzZXJ2ZWQiKSArDQogIGZhY2V0X3dyYXAofiBtZXRob2QgLCBuY29sID0gNSwgc2NhbGVzID0gImZyZWVfeCIpICsNCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKw0KICB0aGVtZV9idygpDQpgYGANClRoZXNlIGluZmVyZW5jZXMsIGFnYWluLCB3b3VsZCBiZSBub2lzeSBhcyB0aGVyZSBhcmUgb25seSA4IG9ic2VydmF0aW9ucyBwZXIgYm94LiBOZXZlcnRoZWxlc3MsIG1hdHJpeCB0byBtYXRyaXggdmFyaWFiaWxpdHkgaW4gYmlhcyBhZ2FpbiBhcHBlYXJzIHNtYWxsZXIgY29tcGFyZWQgdG8gZGF5IHRvIGRheSBhYm92ZTsgYW5kIHRoZSBwYXR0ZXJucyBpbiB0aGUgMjUwcHBtIG1hdHJpY2VzIGZvciB0aGUgKzIgbWV0aG9kcyBhcmUgYXBwYXJlbnQuIFdpdGhpbiBtYXRyaXgsIHRoZXJlIGFyZSBhIGZldyBwb3RlbnRpYWwgZGlmZmVyZW5jZXMgaGVyZSBhbmQgdGhlcmUgaW5kaWNhdGVkIGR1ZSB0byB0dW5lLg0KDQpBbmQgZmluYWxseSB0aGUgc2FtZSBwbG90IGZvciBzZWxlbml1bS4NCmBgYHtyIHN1bW1hcml6ZV9tYXRyaXhfbWV0aG9kX3R1bmVfU2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xNCwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZG9kZ2UgPC0gcG9zaXRpb25fZG9kZ2UoIHdpZHRoID0gMC41ICkNCg0KZGZfbW9kZWwgJT4lIA0KICBtdXRhdGUobWV0aG9kID0gcmVjb2RlX2ZhY3RvcihtZXRob2QsICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90ICU+JQ0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChtYXRyaXgsIG1ldGhvZCwgdHVuZSwgU2UpICU+JQ0KICBnZ3Bsb3QoIGFlcyggeD0gbWF0cml4LCB5ID0gU2UsIGdyb3VwID0gdHVuZSAsIGNvbG9yID0gdHVuZSApICkgKyANCiAgZ2VvbV9wb2ludChzaXplID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9qaXR0ZXJkb2RnZSgpLCBzaG93LmxlZ2VuZCA9IEYpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImxpZ2h0Ymx1ZSIsICJwaW5rIikpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyggeD0gbWF0cml4LCB5ID0gU2UsIGdyb3VwID0gbWF0cml4OnR1bmUpLCBvdXRsaWVyLnNoYXBlID0gTkEsIGNvbG9yID0gImJsYWNrIiAsYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV9obGluZSggeWludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIGNvb3JkX2ZsaXAoKSArDQogIGxhYnModGl0bGUgPSAiU2VsZW5pdW0gYmlhczogTWV0aG9kIHggbWF0cml4IHggdHVuZSIsDQogICAgICAgIHN1YnRpdGxlID0gIltCbHVlXSA9IExIZSwgXG5bUmVkXSA9IEhIZSIpICsNCiAgeWxhYigiQmlhcyBvYnNlcnZlZCIpICsNCiAgZmFjZXRfd3JhcCh+IG1ldGhvZCAsIG5jb2wgPSA1LCBzY2FsZXMgPSAiZnJlZV94IikgKw0KICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTIpKSArDQogIHRoZW1lX2J3KCkNCmBgYA0KQWdhaW4sIHRoZSBvdmVyYWxsIHBhdHRlcm5zIGFyZSBzaW1pbGFyIHRvIHRoZSBwbG90IGFib3ZlLCBidXQgd2l0aGluIG1hdHJpeCBkaWZmZXJlbmNlcyBkdWUgdG8gdHVuZSBzZXR0aW5nIGFyZSBtb3JlIHByb25vdW5jZWQuDQoNCiMgTW9kZWwgc3RydWN0dXJlDQpCZWNhdXNlIGFsbCAxMCBJUyB3ZXJlIGluY2x1ZGVkIGluIGVhY2ggcGh5c2ljYWwgc2FtcGxlIHJ1biBmcm9tIGEgZ2l2ZW4gbWF0cml4IG9uIGEgZ2l2ZW4gZGF5LCB0aGUgZGF0YSB3ZXJlIHRyZWF0ZWQgYXMgYSBtdWx0aXZhcmlhdGUgcmVzcG9uc2UgKGkuZS4sIDM1MiBvYnNlcnZhdGlvbnMgb24gMTAgSVMgbWV0aG9kcyksIGFsbG93aW5nIGZvciBvYnNlcnZhdGlvbi1sZXZlbCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSBJUyBtZXRob2RzLiBBIG11bHRpbGV2ZWwgQmF5ZXNpYW4gYXBwcm9hY2ggdG8gbW9kZWxpbmcgd2FzIHRha2VuLCB3aXRoIGVhY2ggbW9kZWwgY29uZGl0aW9uZWQgaW4gc29tZSBtYW5uZXIgb24gYWxsIG9mIHRoZSBleHBlcmltZW50YWwgZGVzaWduIGZhY3RvcnMgKG1hdHJpeCwgZGF5LCBhbmQgdHVuZSkuIEhvd2V2ZXIsIG5vdCBhbGwgcG90ZW50aWFsIGludGVyYWN0aW9ucyBhbW9uZyB0aGUgZXhwZXJpbWVudGFsIGZhY3RvcnMgd2VyZSBhYmxlIHRvIGJlIGVzdGltYXRlZCBiZWNhdXNlIHRoZSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGF2YWlsYWJsZSB0byBlc3RpbWF0ZSB0aGVtIHdhcyBsaW1pdGVkLiBGb3IgZXhhbXBsZSwgdGhlcmUgd2FzIG5vIHJlcGxpY2F0aW9uIG9mIG9ic2VydmF0aW9ucyB3aXRoaW4gYSBtYXRyaXggYW5kIGRheSBvZiB0aGUgZXhwZXJpbWVudCB1c2luZyB0aGUgc2FtZSB0dW5lIHNldHRpbmcgZm9yIGFueSBJUyBtZXRob2QuIEZvciBlYWNoIElTIGluIGEgc3BlY2lmaWMgbWF0cml4IGFuZCBzcGVjaWZpYyBkYXksIG9ubHkgYSBzaW5nbGUgbWVhc3VyZW1lbnQgd2FzIHRha2VuIGF0IGVhY2ggdHVuZSBzZXR0aW5nIChpLmUuLCBuPTEgZm9yIGVzdGltYXRpbmcgYSBtZXRob2QgeCBtYXRyaXggeCBkYXkgeCB0dW5lIGVmZmVjdCkuIExpa2V3aXNlLCBtYXRyaXggeCBkYXkgZWZmZWN0cyB3ZXJlIG5vdCBlc3RpbWF0ZWQgZHVlIHRvIGxpbWl0ZWQgaW5mb3JtYXRpb24gKG4gPSAyIHBlciBJUyBtZXRob2QsIGNvcnJlc3BvbmRpbmcgdG8gMiB0dW5lIHNldHRpbmdzKS4NCg0KVGhlIG1vZGVscyB0byBmb2xsb3cgYXNzdW1lZCB0aGF0IHRoZSBvYnNlcnZlZCBiaWFzIChkaWZmZXJlbmNlIHRvIHRoZSBuZWFyZXN0IDAuMDAxIHBwYiBiZXR3ZWVuIHRoZSAiVHJ1ZSBWYWx1ZSIgYW5kIElTIGVzdGltYXRlZCBjb3JyZWN0aW9uIHZhbHVlKSB3YXMgZ2VuZXJhdGVkIGZyb20gYSBtdWx0aXZhcmlhdGUgbm9ybWFsIChNVk4pIGRpc3RyaWJ1dGlvbiwgd2hlcmU6DQokJFkgXHNpbSBNVk4oXG11LCBcU2lnbWEpJCQNCndoZXJlICRZJCBpcyBhIG11bHRpdmFyaWF0ZSByZXNwb25zZSBtYXRyaXggb2Ygc2l6ZSAkSj0xMCQgY29sdW1ucyBhbmQgJE49MzUyJCByb3dzOyAkXG11JCBpcyB0aGUgbG9jYXRpb24gcGFyYW1ldGVyIG9mIHRoZSBtdWx0aXZhcmlhdGUgbm9ybWFsIGRhdGEgZ2VuZXJhdGluZyBwcm9jZXNzOyBhbmQgJFxTaWdtYSQgaXMgdGhlIGNvdmFyaWFuY2UgbWF0cml4IGNvbnRhaW5pbmcgdGhlIHNjYWxlIHBhcmFtZXRlcnMgZm9yIGVhY2ggb2YgdGhlICRKPTEwJCBtZXRob2RzIG9uIHRoZSBkaWFnb25hbCwgYW5kIHRoZSBiZXR3ZWVuLW1ldGhvZCBjb3JyZWxhdGlvbiBwYXJhbWV0ZXJzIG9uIHRoZSBvZmYtZGlhZ29uYWxzLiANCg0KIyMgTGluZWFyIG1vZGVsIGZvciAkXG11JA0KRm9yIHRoZSBmaXJzdCBtb2RlbCBmaXQgYmVsb3csIHRoZSBsb2NhdGlvbiBwYXJhbWV0ZXIgd2FzIHBhcmFtZXRlcml6ZWQgc3VjaCB0aGF0Og0KJCRcbXVfaiA9IFxhbHBoYV9qICsgXGJldGFfaipYX3t0dW5lX2p9ICsgXGdhbW1hX3tLX2p9ICsgXGdhbW1hX3tMX2p9JCQNCiQkXGdhbW1hX3tLX2p9IFxzaW0gTigwLCBcc2lnbWFfe0tfan0pJCQNCiQkXGdhbW1hX3tMX2p9IFxzaW0gTigwLCBcc2lnbWFfe0xfan0pJCQNCg0Kd2hlcmUgJFxhbHBoYV9qJCByZWZlcmVuY2VzIGEgZml4ZWQgZ2xvYmFsIGludGVyY2VwdCBmb3IgZWFjaCBJUyBtZXRob2QsICRqIFxpbiAxLC4uLEo9MTAkLiBUaGlzIGludGVyY2VwdCBwYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGUgZ2xvYmFsIG1lYW4gb2YgdGhlIGxvdyBoZWxpdW0gdHVuZSAoTEhlKSBvYnNlcnZhdGlvbnMgZm9yIGVhY2ggbWV0aG9kLCAkaiQuIFRoZSBpbmRpdmlkdWFsIG9ic2VydmF0aW9ucyBhcmUgbm90IGluZGV4ZWQgaW4gdGhlIG5vdGF0aW9uIGFib3ZlLCBidXQgZWFjaCBvZiAkaSBcaW4gaT0xLC4uLE49MzUyJCBvYnNlcnZhdGlvbnMgcGVyIG1ldGhvZCBpcyBmaXQgdG8gdGhlIHNhbWUgJGFscGhhX2okLiBUaGUgJFxiZXRhX2okIHBhcmFtZXRlciBjYXB0dXJlcyB0aGUgYWRkaXRpdmUgZWZmZWN0IG9mIHRoZSBISGUgdHVuZSBvbiB0aGUgZ2xvYmFsIG1lYW4gZm9yIGVhY2ggSVMgbWV0aG9kLiAkWF97dHVuZV9qfSQgcmVwcmVzZW50cyBhIHZlY3RvciBob2xkaW5nIHRoZSB0dW5lIHNldHRpbmcgaW5kaWNhdG9yICgwIG9yIDEpIGZvciBlYWNoIG9ic2VydmF0aW9uLCBlbnRlcmVkIGFzIGRhdGEuIFRoZSAkXGdhbW1hX3tLX2p9JCB0ZXJtIHJlZmVyZW5jZXMgdmFyeWluZyBlZmZlY3RzLCBvciBpbnRlcmNlcHRzLCBmb3IgZWFjaCBvZiAkayBcaW4gMSwuLi4sSz0yMiQgbWF0cml4IGNvbmRpdGlvbnMgZm9yIGVhY2ggbWV0aG9kOyBhbmQgJFxnYW1tYV97TF9qfSQgcmVmZXJlbmNlcyB2YXJ5aW5nIGVmZmVjdHMgZm9yIGVhY2ggb2YgdGhlICRsIFxpbiAxLC4uLixMPTgkIGRheXMgb2YgdGhlIGV4cGVyaW1lbnQuIFRoZXNlIHZhcnlpbmcgZWZmZWN0cyBhcmUgY2VudGVyZWQgb24gemVybyBhbmQgY2FuIHZhcnkgYXJvdW5kIHRoZSBnbG9iYWwgaW50ZXJjZXB0IHBhcmFtZXRlciwgdGhlIGRlZ3JlZSB0byB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IGEgaGllcmFyY2hpY2FsIHNjYWxlIHBhcmFtZXRlcnMsICRcc2lnbWFfe0tfan0kIGFuZCAkXHNpZ21hX3tMX2p9JCwgZXN0aW1hdGVkIGZyb20gdGhlIGRhdGEuDQoNCkluIHRoZSBmb3JtdWxhIHN5bnRheCBvZiB0aGUgJFx0ZXh0YmZ7Un0kIHBhY2thZ2UgJFx0ZXh0YmZ7bG1lNH0kIGNvbW1vbmx5IHVzZWQgdG8gZml0IG1peGVkIGVmZmVjdHMgbW9kZWxzLCB0aGUgZm9ybXVsYSBmb3IgdGhlIGxpbmVhciBwcmVkaWN0b3IgZm9yICRcbXUkIGFib3ZlLCB3b3VsZCBiZToNCg0KJCR+IDEgKyB0dW5lICsgKDF8bWF0cml4KSArICgxfGRheSkkJA0KVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBzeW50YXggZW1wbG95ZWQgaW4gdGhlICRcdGV4dGJme2JybXN9JCBwYWNrYWdlIFtAQnVya25lcl8yMDE3XSwgd2hpY2ggaXMgdXNlZCB0byBmaXQgdGhlIG1vZGVscyBiZWxvdy4gDQoNCiMgRml0dGluZyBhIG1vZGVsIGZvciBhcnNlbmljDQpUaGUgJFx0ZXh0YmZ7YnJtc30kIHBhY2thZ2UgW0BCdXJrbmVyXzIwMTddIG1ha2VzIGl0IGNvbnZlbmllbnQgdG8gZml0IGFuZCBjb21wYXJlIG11bHRpbGV2ZWwgZ2VuZXJhbGl6ZWQgbGluZWFyIG1vZGVscyBpbiBhIGZ1bGx5IEJheWVzaWFuIGZyYW1ld29yay4gQmVsb3csIHRoZSBtb2RlbCBkZXNjcmliZWQgYWJvdmUgaXMgZml0IHRvIHRoZSBvYnNlcnZhdGlvbmFsIGRhdGEuIEZvciBlYWNoIHBhcmFtZXRlciBkZXNjcmliZWQgYWJvdmUsIHByaW9ycyB3ZXJlIHByb3ZpZGVkIGFzIGluZGljYXRlZCBpbiB0aGUgY29kZSBiZWxvdy4gU3BlY2lmaWNhbGx5LCAkTigwLDEpJCBwcmlvcnMgd2VyZSBwbGFjZWQgb3ZlciBhbGwgaW50ZXJjZXB0IHBhcmFtZXRlcnMgZm9yIGVhY2ggcmVzcG9uc2UuIFRoaXMgcHJpb3IgaXMgY29uc2lkZXJlZCB3ZWFrbHkgaW5mb3JtYXRpdmUgb24gdGhlIHRoZSBzY2FsZSBvZiB0aGUgb2JzZXJ2YXRpb25zLiBUaGlzICROKDAsMSkkIHByaW9yIHdhcyBhbHNvIHBsYWNlZCBvbiB0aGUgc2NhbGUgcGFyYW1ldGVycyBvZiB0aGUgdmFyeWluZyBlZmZlY3RzLCB3aGljaCB3YXMgYWxzbyBjb25zaWRlcmVkIHdlYWtseSBpbmZvcm1hdGl2ZS4gQ292YXJpYW5jZXMgaW4gJFx0ZXh0YmZ7U3Rhbn0kIFtAU3Rhbl9EZXZlbG9wbWVudF9UZWFtXzIwMThfYjtAU3Rhbl9EZXZlbG9wbWVudF9UZWFtXzIwMThfYztAU3Rhbl9EZXZlbG9wbWVudF9UZWFtXzIwMThfYV0gYXJlIHBhcmFtZXRlcml6ZWQgZWZmaWNpZW50bHkgYnkgcGxhY2luZyBwcmlvcnMgc2VwYXJhdGVseSBvbiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBhbmQgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeC4gVGhlIGNvdmFyaWFuY2UgdGVybSBmb3IgdGhlIG11bHRpdmFyaWF0ZSBtb2RlbCBpcyBwYXJhbWV0ZXJpemVkIHN1Y2ggdGhhdDoNCiQkXFNpZ21hID0gZGlhZyhcdGF1KSBcT21lZ2EgZGlhZyhcdGF1KSQkDQpzbyBwcmlvcnMgYXJlIHBsYWNlZCBzZXBhcmF0ZWx5IG9uICRcdGF1JCwgdGhlIHZlY3RvciBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciBlYWNoIElTIG1ldGhvZCwgYW5kICRcT21lZ2EkIHRoZSBjb3JyZWxhdGlvbiBtYXRyaXguIEZvciBlYWNoIHN0YW5kYXJkIGRldmlhdGlvbiBpbiB0aGUgbW9kZWwgYmVsb3csIHRoZSAkTigwLDEpJCBwcmlvciB3YXMgYWdhaW4gYXBwbGllZCBhbmQgYXNzdW1lZCB3ZWFrbHkgaW5mb3JtYXRpdmUuIEZvciB0aGUgY29ycmVsYXRpb24gbWF0cml4LCBhbiAkTEtKKFxldGEgPTEpJCBwcmlvciB3YXMgdXNlZCwgd2hpY2ggaXMgdW5pZm9ybSBvdmVyIHBlcm1pc3NpYmxlIGNvcnJlbGF0aW9uIG1hdHJpY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBwcmlvciBjaG9pY2UgcmVjb21tZW5kYXRpb25zLCBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFuLWRldi9zdGFuL3dpa2kvUHJpb3ItQ2hvaWNlLVJlY29tbWVuZGF0aW9ucw0KYGBge3IgZml0X21vZCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KDQpiZl9TdGQgPC0gYmYoU3RkIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0FsdCA8LSBiZihBbHQgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfSG8yIDwtIGJmKEhvMiB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9JbiA8LSBiZihJbiB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9TYyA8LSBiZihTYyB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9ZIDwtIGJmKFkgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfQmUgPC0gYmYoQmUgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfQ28gPC0gYmYoQ28gfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfVGggPC0gYmYoVGggfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfSG8xIDwtIGJmKEhvMSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQptb2QxIDwtIGJybShiZl9TdGQgKyANCiAgICAgICAgICAgICAgYmZfQWx0ICsgDQogICAgICAgICAgICAgIGJmX0hvMiArIA0KICAgICAgICAgICAgICBiZl9JbiArIA0KICAgICAgICAgICAgICBiZl9TYyArIA0KICAgICAgICAgICAgICBiZl9ZICsgDQogICAgICAgICAgICAgIGJmX0JlICsgDQogICAgICAgICAgICAgIGJmX0NvICsgDQogICAgICAgICAgICAgIGJmX1RoICsgDQogICAgICAgICAgICAgIGJmX0hvMSArIA0KICAgICAgICAgICAgICBzZXRfcmVzY29yKFRSVUUpLA0KICBkYXRhID0gZGZfbXZfYXMsIA0KICBwcmlvciA9IGMocHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkFsdCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiU2MiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJDbyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIkFsdCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiU2MiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJDbyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzaWdtYSIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2lnbWEiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzaWdtYSIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNpZ21hIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNpZ21hIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2lnbWEiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNpZ21hIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKGxraigxKSwgY2xhc3MgPSAicmVzY29yIikNCiAgICAgICAgICAgICksDQogIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45MCwgbWF4X3RyZWVkZXB0aCA9IDEyKSwNCiAgaW5pdF9yID0gMC4wNSwNCiAgc2F2ZV9wYXJzID0gc2F2ZV9wYXJzKGFsbCA9IFRSVUUpLA0KICBzZWVkID0gNjUxOCwNCiAgY2hhaW5zPTQsDQogIGl0ZXI9MjAwMCwNCiAgY29yZXM9NCApDQoNCnNhdmUobW9kMSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDFfQXNfbXYucmRhIikNCmBgYA0KDQojIyBUYWJ1bGFyIHBhcmFtZXRlciBlc3RpbWF0ZXMNCk5leHQsIGEgc3VtbWFyeSBvZiB0aGUgcG9zdGVyaW9yIGVzdGltYXRlcy4NCmBgYHtyIHByaW50X21vZCwgZWNobz1GQUxTRX0NCmxvYWQoICJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDFfQXNfbXYucmRhIiApDQpwcmludCggbW9kMSwgcHJpb3IgPSBUUlVFICkNCmBgYA0KDQpUaGlzIHRhYnVsYXIgcmVzdWx0IGlzIHBhcnRpY3VsYXJseSBoZWxwZnVsIGZvciBsb29raW5nIGF0IEhNQyBjb252ZXJnZW5jZSBkaWFnbm9zdGljcyAoUmhhdCwgRVNTKS4gVGhlcmUgd2VyZSBubyBhcHBhcmVudCBpc3N1ZXMgd2l0aCB0aGUgSE1DIGVzdGltYXRpb24gcHJvY2VkdXJlLiBUaGUgcGFyYW1ldGVyIHN1bW1hcmllcyBhcmUgYWxzbyBoZWxwZnVsLCBidXQgaXQgaXMgbW9yZSBlZmZpY2llbnQgdG8gZXhwbG9yZSB0aGVpciBpbXBsaWNhdGlvbnMgZ3JhcGhpY2FsbHksIGFzIHdpbGwgYmUgZG9uZSBmb3IgdGhlIGZpbmFsIG1vZGVscyB0byBmb2xsb3cuDQoNCiMjIE1vZGVsIGNoZWNrcw0KUG9zdGVyaW9yIHByZWRpY3RpdmUgY2hlY2tzIGFyZSB1c2VmdWwgZm9yIHZpc3VhbGl6aW5nIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGZpdHRlZCBtb2RlbCBnZW5lcmF0ZXMgcmVwbGljYXRlIGRhdGEgdGhhdCByZXNlbWJsZXMgdGhlIG9ic2VydmVkIGRhdGEuIA0KDQojIyMgRGVuc2l0eSBvdmVybGF5DQpJbiB0aGUgZmlyc3QgY2hlY2ssIDUwIGluZGl2aWR1YWwgZHJhd3MgZnJvbSB0aGUgcG9zdGVyaW9yIHByZWRpY3RpdmUgZGlzdHJpYnV0aW9uIG9mIHRoZSBmaXR0ZWQgbW9kZWwgd2VyZSBzdW1tYXJpemVkIHVzaW5nIGEgZGVuc2l0eSBwbG90LiBUaGUgaW5kaXZpZHVhbCBkcmF3cyBjYW4gYmUgdGhvdWdodCBvZiBhcyBzaW11bGF0aW9ucyBvZiBwb3RlbnRpYWwgZGF0YXNldHMgZnJvbSBhIGRhdGEgZ2VuZXJhdGluZyBwcm9jZXNzIHRoZSBtb2RlbCBpcyByZXByZXNlbnRpbmcuIFRoZSBkZW5zaXR5IHBsb3RzIG9mIHRoZXNlIGh5cG90aGV0aWNhbCBkYXRhc2V0cyAoYmx1ZSBsaW5lcykgYXJlIGNvbXBhcmVkIHRvIHRoZSBkZW5zaXR5IHBsb3QgZm9yIHRoZSBvYnNlcnZlZCBkYXRhIChibGFjayBsaW5lKSB0byBnYXVnZSB3aGV0aGVyIHRoZSBvYnNlcnZlZCBkYXRhIGNvdWxkIGhhdmUgcmVhc29uYWJseSBiZWVuIGRyYXduIGZyb20gdGhlIHNhbWUgZGF0YSBnZW5lcmF0aW5nIHByb2Nlc3MuIA0KYGBge3IgcHBjX2RlbnNfb3ZlcmxheSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QxX0FzX212LnJkYSIpDQpwcF9jaGVjayhtb2QxLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiU3RkIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiaW4tc2FtcGxlIikNCnBwX2NoZWNrKG1vZDEsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJBbHQiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJhbHQuaXNvdG9wZSIpIA0KcHBfY2hlY2sobW9kMSwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkhvMiIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkgDQpwcF9jaGVjayhtb2QxLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSW4iLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJJbiIpIA0KcHBfY2hlY2sobW9kMSwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIlNjIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiU2MiKSANCnBwX2NoZWNrKG1vZDEsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJZIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiWSIpIA0KcHBfY2hlY2sobW9kMSwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkJlIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQmUiKSANCnBwX2NoZWNrKG1vZDEsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJDbyIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkNvIikgDQpwcF9jaGVjayhtb2QxLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiVGgiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJUaCIpIA0KcHBfY2hlY2sobW9kMSwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkhvMSIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMSsiKSkgDQpgYGANClRoZXJlIGFyZSBzZXZlcmFsIGluZGljYXRpb25zIHRoYXQgdGhlIGZpdHRlZCBtb2RlbCBzaG91bGQgYmUgaW1wcm92ZWQgdXBvbi4gSXQgaXMgZmFpcmx5IGNsZWFyIHRoYXQgdGhlIHNpbXVsYXRlZCBkYXRhc2V0cyBkb24ndCBtYXRjaCB3ZWxsIHRvIHRoZSBvYnNlcnZlZCBkYXRhIGZvciBtb3N0IG9mIHRoZSBtZXRob2RzLCBleGNlcHQgZm9yIHBlcmhhcHMgdGhlIGFsdGVybmF0aXZlIGlzb3RvcGUsICRJbiQsIGFuZCAkWSQuIEluIG1vc3QgY2FzZXMsIGl0IGFwcGVhcnMgdGhhdCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgYXJlIHVuZGVyZGlzcGVyc2VkIHJlbGF0aXZlIHRvIHRoZSBkYXRhLCBpbmRpY2F0aW5nIHRoYXQgYWRkaXRpb25hbCBzdHJ1Y3R1cmUgbWF5IGJlIGhlbHBmdWwuDQoNCk5vIGZ1cnRoZXIgY2hlY2tzIG9uIHRoaXMgbW9kZWwgYXJlIG5lY2Vzc2FyeSBhdCB0aGlzIHBvaW50IGJlY2F1c2UgaXQgaXMgY2xlYXIgdGhhdCBpbXByb3ZlbWVudCBpcyBuZWVkZWQuIEhvd2V2ZXIsIGNyb3NzLXZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGJlbG93IGluIG9yZGVyIHRvIHF1YW50aWZ5IHBvdGVudGlhbCBpbXByb3ZlbWVudHMgZnJvbSB0aGlzIGluaXRpYWwgbW9kZWwgbW92aW5nIGZvcndhcmQuDQoNCiMjIExlYXZlLW9uZS1vdXQgQ1YNCk5leHQsIGEgQmF5ZXNpYW4gbGVhdmUtb25lLW91dCBjcm9zcyB2YWxpZGF0aW9uICgnTE9PLUNWJykgYXNzZXNzbWVudCBpcyBjb25kdWN0ZWQgdXNpbmcgdGhlICRcdGV4dGJme2xvb30kIHBhY2thZ2UgaW4gJFx0ZXh0YmZ7Un0kLCB3aGljaCBpbXBsZW1lbnRzIGZhc3QgYW5kIHN0YWJsZSBjb21wdXRhdGlvbnMgZm9yIGFwcHJveGltYXRlIExPTy1DViAoYW5kIFdBSUMpIFtAVmVodGFyaV9ldGFsXzIwMTddLiBUaGVzZSBjb21wdXRhdGlvbnMgZXN0aW1hdGUgcG9pbnR3aXNlLCBvdXQtb2Ytc2FtcGxlIHByZWRpY3Rpb24gYWNjdXJhY3kgZnJvbSBhIGZpdHRlZCBtb2RlbCBieSB1c2luZyB0aGUgbG9nLWxpa2VsaWhvb2QgZXZhbHVhdGVkIGF0IHRoZSBwb3N0ZXJpb3Igc2ltdWxhdGlvbnMgb2YgdGhlIHBhcmFtZXRlcnMuIFRoZSAkXHRleHRiZnticm1zfSQgcGFja2FnZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZXMgdGhlIGxvZy1saWtlbGlob29kIGZvciBhbGwgcmVsZXZhbnQgbW9kZWxzLCBtYWtpbmcgaXQgc2ltcGxlIHRvIHVzZSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSAkXHRleHRiZntsb299JCBwYWNrYWdlLiBGb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiAkXHRleHRiZntsb299JCBhbmQgTE9PLUNWIGluIGdlbmVyYWwsIHNlZTogaHR0cDovL21jLXN0YW4ub3JnL2xvby8uDQoNClBhcmV0by1zbW9vdGhlZCBpbXBvcnRhbmNlIHNhbXBsaW5nIGlzIHRoZSBtZXRob2QgdXNlZCBpbiAkXHRleHRiZntsb299JCBmb3IgYXBwcm94aW1hdGluZyB0aGUgdHJ1ZSBsZWF2ZS1vbmUtb3V0IHBvc3Rlcmlvci4gVGhlIG1vZGVsIGlzIGZpdCBvbmNlLCB0aGUgbG9nLWxpa2VsaWhvb2QgZm9yIGVhY2ggZGF0YSBwb2ludCBpcyBzYXZlZCwgYW5kIGBsb28oKWAgdXRpbGl6ZXMgdGhhdCBjYWxjdWxhdGlvbiB0byByZS13ZWlnaHQgYW5kIGFwcHJveGltYXRlIHRoZSBsZWF2ZS1vbmUtb3V0IHBvc3Rlcmlvci4gVGhpcyBpcyBjb252ZW5pZW50IGJlY2F1c2UgaXQgZW5hYmxlcyBtb2RlbCBldmFsdWF0aW9ucyB2aWEgbGVhdmUtb25lLW91dCBlc3RpbWF0ZXMgd2l0aG91dCB0aGUgbmVlZCB0byBmaXQgdGhlIG1vZGVsICROJCB0aW1lcy4gSG93ZXZlciwgdGhlIGFwcHJveGltYXRpb24gY2FuIGZhaWwsIGFuZCB0aGUgJFx0ZXh0YmZ7bG9vfSQgcGFja2FnZSBwcm92aWRlcyBzb21lIGRpYWdub3N0aWNzIHRoYXQgaW5kaWNhdGUgd2hlbiBmYWlsdXJlIGlzIG1vcmUgbGlrZWx5LiBJbiBwYXJ0aWN1bGFyLCBlYWNoIGRhdGEgcG9pbnQgaXMgYXNzaWduZWQgYW4gaW1wb3J0YW5jZSByYXRpbywgJGskLCB3aGljaCBpbmRpY2F0ZXMgaG93ICJpbmZsdWVudGlhbCIgaXQgbWF5IGJlLiBBcyBzdWNoLCB0b28gbWFueSBkYXRhIHBvaW50cyB3aXRoIGhpZ2ggKHBhcmV0by1rID4gMC43KSBvciB2ZXJ5IGhpZ2ggKHBhcmV0by1rID4gMSkgaW5mbHVlbmNlIG1heSBpbmRpY2F0ZSBwcm9ibGVtcyB3aXRoIHRoZSBhcHByb3hpbWF0aW9uLiBXaGVuIHRoZXJlIGFyZSB0b28gbWFueSBzdWNoIHBvaW50cywgaXQgaXMgZ2VuZXJhbGx5IHJlY29tbWVuZGVkIHRvIHJlLWZpdCB0aGUgbW9kZWwgd2l0aCBhIG1vcmUgdHJhZGl0aW9uYWwgbGVhdmUtay1vdXQgbWV0aG9kLCBzdWNoIGFzIGstZm9sZC4gTm90ZSB0aGF0IG9ic2VydmF0aW9ucyB3aXRoIGhpZ2ggJGskIGFyZSBvbmx5IHByb2JsZW1hdGljIGluIHRoZSBzZW5zZSBvZiB0cnlpbmcgdG8gYXBwcm94aW1hdGUgdGhlIGxlYXZlLW9uZS1vdXQgcG9zdGVyaW9yLCBhbmQgdGhlcmUgaXNuJ3QgX25lY2Vzc2FyaWx5XyBhbnl0aGluZyBpbmhlcmVudGx5IHdyb25nIHdpdGggdGhlbS4gSG93ZXZlciwgb2JzZXJ2YXRpb25zIHdpdGggaGlnaCAkXGhhdHtrfSQgbWF5IHN1Z2dlc3QgYW4gb3V0c2l6ZWQgaW5mbHVlbmNlIG9uIHRoZSBwb3N0ZXJpb3IgW0BHYWJyeV9ldGFsXzIwMTldLiANCg0KYGBge3IgbG9vLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QxX0FzX212LnJkYSIpDQoNCmxvb18xIDwtIGxvbyh4ID0gbW9kMSwgDQogICAgICAgICAgICAgcG9pbnR3aXNlID0gVFJVRSwNCiAgICAgICAgICAgICBtb21lbnRfbWF0Y2ggPSBUUlVFLCANCiAgICAgICAgICAgICBzYXZlX3BzaXMgPSBUUlVFLCANCiAgICAgICAgICAgICBjb3JlcyA9IDEwKQ0Kc2F2ZShsb29fMSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2xvb18xLnJkYSIpDQpgYGANCg0KYGBge3IgbG9vX3ByaW50LCBlY2hvPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9sb29fMS5yZGEiKQ0KDQpwcmludChsb29fMSkNCmBgYA0KVGhlICRcdGV4dGJme2xvb30kIGNhbGN1bGF0aW9uIHJlc3VsdGVkIGluIDggcG90ZW50aWFsbHkgInByb2JsZW1hdGljIiBvYnNlcnZhdGlvbnMgKGkuZS4sIFBhcmV0byBrID4gMC43KS4gVGhlIG5leHQgc3RlcCBpcyB0byByZWZpdCB0aGUgbW9kZWwgOCB0aW1lcyBpbiBvcmRlciB0byBjb21wdXRlIHRoZSBleGFjdCBjcm9zcyB2YWxpZGF0aW9uIGZvciBlYWNoIG9mIHRoZSA4IHByb2JsZW1hdGljIG9ic2VydmF0aW9ucyAoInJlbG9vIikuIElmIHRoZSAicmVsb28iIHBhcmV0by1rIGFyZSBhbGwgbGVzcyB0aGFuIDAuNywgdGhlbiB0aG9zZSA4IGNhbGN1bGF0aW9ucyBjYW4gYmUgc3Vic3RpdHV0ZWQgZm9yIGNvbXB1dGluZyB0aGUgcG9pbnR3aXNlIGNvbnRyaWJ1dGlvbnMgdG8gdG90YWwgJGVscGRfe2xvb30kLiBPdGhlcndpc2UsIGEgay1mb2xkIG9yIHNpbWlsYXIgbWV0aG9kIHNob3VsZCBiZSB1c2VkIHRvIGNvbXB1dGUgYSB0cnVlIGxlYXZlLWstb3V0IHBvc3RlcmlvciBkZW5zaXR5Lg0KDQpXaXRoIHJlZ2FyZCB0byB0aGUgb3RoZXIgb3V0cHV0cyBmcm9tIHRoZSBgc3VtbWFyeShsb28pYCBjYWxsLCByZWZlcmVuY2U6IGh0dHBzOi8vbWMtc3Rhbi5vcmcvbG9vL3JlZmVyZW5jZS9sb28tZ2xvc3NhcnkuaHRtbC4gSW4gc2hvcnQsIHRoZSAkZWxwZF97bG9vfSQgaXMgYSB3YXkgdG8gY29tcGFyZSBtb2RlbHMuIEZvciBlYWNoIG9ic2VydmF0aW9uLCBhIGNhbGN1bGF0aW9uIG9mIGhvdyAic3VycHJpc2VkIiB0aGUgbW9kZWwgaXMgdG8gc2VlIHRoZSBsZWZ0LW91dCBkYXRhIHBvaW50IGlzIG1hZGUgYmFzZWQgb24gdGhlIHByZWRpY3RpdmUgZGVuc2l0eSBhdCB0aGUgb2JzZXJ2ZWQgdmFsdWUuIFRoZSAkZWxwZF97bG9vfSQgaXMgYSBzdW0gb2YgdGhlc2UgaW5kaXZpZHVhbCBjb250cmlidXRpb25zLiBUaGUgJHBfbG9vJCwgYnkgY29tcGFyaXNvbiwgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgJGVscGRfe2xvb30kIGFuZCB0aGUgbm9uLUNWIGxvZyBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBkZW5zaXR5LCBhbmQgbWF5IGJlIGludGVycHJldGVkIGFzIHRoZSBlZmZlY3RpdmUgbnVtYmVyIG9mIHBhcmFtZXRlcnMuIFRoZSAkbG9vaWMkLCBmaW5hbGx5LCBpcyBqdXN0ICQtMl57ZWxwZF97bG9vfX0kIHRvIHByb3ZpZGUgb3V0cHV0IG9uIHRoZSBjb252ZW50aW9uYWwgc2NhbGUgb2YgImRldmlhbmNlIiBvciBBSUMuDQoNClRoZSBwYXJldG8tayBjYW4gYmUgcGxvdHRlZCB0byBnZXQgYW4gaW5kaWNhdGlvbiBvZiB3aGljaCBzcGVjaWZpYyBvYnNlcnZhdGlvbnMgYXJlIHByb2JsZW1hdGljIGFuZCBtYXkgaGF2ZSBvdXRzaXplZCBpbmZsdWVuY2UuDQpgYGB7ciBsb29fcGxvdCwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9sb29fMS5yZGEiKQ0KDQpwbG90KGxvb18xLCBsYWJlbF9wb2ludHMgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyIGhpZ2hfa19vYnNfMX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbG9vXzEucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfYXMucmRhIikNCmRmX212X2FzW3doaWNoKGxvb18xJGRpYWdub3N0aWNzJHBhcmV0b19rID4gMC43KSwgXSAlPiUgcHJpbnQoKQ0KYGBgDQpBbGwgb2YgdGhlIHBvdGVudGlhbGx5IHByb2JsZW1hdGljIG9ic2VydmF0aW9ucyBsb29rIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgMjUwcHBtIG1hdHJpY2VzIGFuZCBoYWxmIG9mIHRoZW0gb24gZnJvbSAzLzMwLCB0aGUgZGF0ZSBvZiB0aGUgY29uZSBjaGFuZ2UuDQoNCkluIGFueSBjYXNlLCBhIHJlLWxvbyBmb3IgdGhlc2UgOCBvYnNlcnZhdGlvbnMgaXMgbmVlZGVkIGNhbGN1bGF0ZSB0aGUgJGVscGRfe2xvb30kLg0KYGBge3IgcmVsb28sIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDFfQXNfbXZfMS5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9sb29fMS5yZGEiKQ0KDQpsaWJyYXJ5KGZ1dHVyZSkNCnBsYW4obXVsdGlzZXNzaW9uKHdvcmtlcnMgPSA4KSwgZ2MgPSBUUlVFKQ0KcmVsb29fMSA8LSBsb28obW9kMSwNCiAgICAgICAgICAgICAgIG1vbWVudF9tYXRjaCA9IFRSVUUsDQogICAgICAgICAgICAgICByZWxvbyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgc2F2ZV9wc2lzID0gVFJVRSwNCiAgICAgICAgICAgICAgIGNoYWlucyA9IDgpDQpzYXZlKHJlbG9vXzEsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9yZWxvb18xLnJkYSIpDQpwbGFuKHNlcXVlbnRpYWwpDQpgYGANCg0KYGBge3IgcmVsb29fcHJpbnQsIGVjaG89RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL3JlbG9vXzEucmRhIikNCg0KcHJpbnQocmVsb29fMSkNCmBgYA0KVGhlIHJlbG9vIGVsaW1pbmF0ZWQgY29uY2VybnMgd2l0aCB0aGUgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgb2JzZXJ2YXRpb25zIHdpdGggcmVnYXJkIHRvIHRoZSAkZWxwZF97bG9vfSQuIFRoaXMgaW5mb3JtYXRpb24gY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0aGlzIG1vZGVsIHdpdGggb3RoZXJzIHRvIGZvbGxvdy4NCg0KIyBBIG1vcmUgZmxleGlibGUgYXJzZW5pYyBtb2RlbA0KRm9yIHRoZSBuZXh0IG1vZGVsLCB0aGUgJFxzaWdtYSQgdGVybSBpcyBhbHNvIGFzc2lnbmVkIGEgbGluZWFyIHByZWRpY3Rvci4gVGhpcyBpcyBvZnRlbiByZWZlcnJlZCB0byBhcyBhIGRpc3RyaWJ1dGlvbmFsIG1vZGVsIG9yIGEgbW9kZWwgd2l0aCBoZXRlcm9nZW5lb3VzIHZhcmlhbmNlcy4gRnJvbSB0aGUgZXhwbG9yYXRvcnkgcGxvdHMgYWJvdmUsIHRoaXMgc2VlbWVkIGxpa2UgYSByZWFzb25hYmxlIG5leHQgYXBwcm94aW1hdGlvbiwgZ2l2ZW4gYXBwYXJlbnQgaGV0ZXJvZ2VuZWl0eSBvZiB2YXJpYW5jZXMgZm9yIHNvbWUgbWV0aG9kcyBhY3Jvc3MgbWF0cmljZXMsIHR1bmVzLCBhbmQgZGF5cy4gSW4gdGhpcyBtb2RlbCwgJFxzaWdtYSQgaXMgYWxsb3dlZCB0byB2YXJ5IGluIHRoZSBzYW1lIG1hbm5lciBhcyAkXG11JC4gVGhhdCBpcywgJFxzaWdtYSQgaXMgbW9kZWxlZCBhcyBhIGxpbmVhciBmdW5jdGlvbiBvZiBhIGZpeGVkIHR1bmUgZWZmZWN0IGFuZCB2YXJ5aW5nIGVmZmVjdHMgZm9yIG1hdHJpeCBhbmQgZGF5IG9mIHRoZSBleHBlcmltZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBmaXR0aW5nIGRpc3RyaWJ1dGlvbmFsIG1vZGVscyBpbiAkXHRleHRiZnticm1zfSQgc2VlIFtAQnVya25lcl8yMDE3XSBhbmQ6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9icm1zL3ZpZ25ldHRlcy9icm1zX2Rpc3RyZWcuaHRtbA0KYGBge3IgZml0X21vZDIsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfYXMucmRhIikNCg0KYmZfU3RkIDwtIGJmKFN0ZCB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9BbHQgPC0gYmYoQWx0IH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0hvMiA8LSBiZihIbzIgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfSW4gPC0gYmYoSW4gfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfU2MgPC0gYmYoU2MgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfWSA8LSBiZihZIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0JlIDwtIGJmKEJlIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0NvIDwtIGJmKENvIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX1RoIDwtIGJmKFRoIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0hvMSA8LSBiZihIbzEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KbW9kMiA8LSBicm0oYmZfU3RkICsgDQogICAgICAgICAgICAgIGJmX0FsdCArIA0KICAgICAgICAgICAgICBiZl9IbzIgKyANCiAgICAgICAgICAgICAgYmZfSW4gKyANCiAgICAgICAgICAgICAgYmZfU2MgKyANCiAgICAgICAgICAgICAgYmZfWSArIA0KICAgICAgICAgICAgICBiZl9CZSArIA0KICAgICAgICAgICAgICBiZl9DbyArIA0KICAgICAgICAgICAgICBiZl9UaCArIA0KICAgICAgICAgICAgICBiZl9IbzEgKyANCiAgICAgICAgICAgICAgc2V0X3Jlc2NvcihUUlVFKSwNCiAgZGF0YSA9IGRmX212X2FzLCANCiAgcHJpb3IgPSBjKHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJTdGQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJJbiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkJlIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkhvMSIpLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiSG8yIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIlkiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiVGgiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiQWx0IiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJTYyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkNvIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQWx0IiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJTYyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkNvIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQWx0IiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJTYyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkNvIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJTdGQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJJbiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkJlIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkhvMSIpIywNCiAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKGxraigxKSwgY2xhc3MgPSAicmVzY29yIikNCiAgICAgICAgICAgICksDQogIGNvbnRyb2wgPSBsaXN0KGFkYXB0X2RlbHRhID0gMC45NSwgbWF4X3RyZWVkZXB0aCA9IDE0KSwNCiAgaW5pdF9yID0gMC4wNSwNCiAgc2F2ZV9wYXJzID0gc2F2ZV9wYXJzKGFsbCA9IFRSVUUpLA0KICBzZWVkID0gNjUxMTIsDQogIGNoYWlucz00LA0KICBpdGVyPTMwMDAsDQogIGNvcmVzPTQgKQ0KDQpzYXZlKG1vZDIsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QyX0FzX212LnJkYSIpDQpgYGANCg0KIyMgVGFidWxhciBwYXJhbWV0ZXIgZXN0aW1hdGVzDQpBZ2FpbiwgYSBzdW1tYXJ5IG9mIHRoZSBwb3N0ZXJpb3IgZXN0aW1hdGVzLg0KYGBge3IgcHJpbnRfbW9kXzIsIGVjaG89RkFMU0V9DQpsb2FkKCAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QyX0FzX212LnJkYSIgKQ0KcHJpbnQoIG1vZDIsIHByaW9yID0gVFJVRSApDQpgYGANCkFnYWluLCBubyBnbGFyaW5nIGlzc3VlcyB3aXRoIHRoZSBITUMgc2FtcGxpbmcuDQoNCiMjIE1vZGVsIGNoZWNrcw0KUG9zdGVyaW9yIHByZWRpY3RpdmUgY2hlY2tzIGFyZSB1c2VmdWwgZm9yIHZpc3VhbGl6aW5nIHRoZSBleHRlbnQgdG8gd2hpY2ggdGhlIGZpdHRlZCBtb2RlbCBnZW5lcmF0ZXMgcmVwbGljYXRlIGRhdGEgdGhhdCByZXNlbWJsZXMgdGhlIG9ic2VydmVkIGRhdGEuIA0KDQojIyMgRGVuc2l0eSBvdmVybGF5DQpBbm90aGVyIHBvc3RlcmlvciBwcmVkaWN0aXZlIGNoZWNrIHVzaW5nIHRoZSBkZW5zaXR5IG92ZXJsYXkuIA0KYGBge3IgcHBjX2RlbnNfb3ZlcmxheV8yLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDJfQXNfbXYucmRhIikNCnBwX2NoZWNrKG1vZDIsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJTdGQiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KcHBfY2hlY2sobW9kMiwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkFsdCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImFsdC5pc290b3BlIikgDQpwcF9jaGVjayhtb2QyLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8yIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKSANCnBwX2NoZWNrKG1vZDIsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJJbiIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkluIikgDQpwcF9jaGVjayhtb2QyLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiU2MiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJTYyIpIA0KcHBfY2hlY2sobW9kMiwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIlkiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJZIikgDQpwcF9jaGVjayhtb2QyLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiQmUiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJCZSIpIA0KcHBfY2hlY2sobW9kMiwgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkNvIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQ28iKSANCnBwX2NoZWNrKG1vZDIsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJUaCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlRoIikgDQpwcF9jaGVjayhtb2QyLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8xIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIxKyIpKSANCmBgYA0KVGhvdWdoIGEgY2xlYXIgaW1wcm92ZW1lbnQgb24gdGhlIGZpcnN0IG1vZGVsLCB0aGVyZSBhcmUgc3RpbGwgaW5kaWNhdGlvbnMgdGhhdCB0aGUgbW9kZWwgcHJlZGljdGlvbnMgYXJlIHVuZGVyLWRpc3BlcnNlZCByZWxhdGl2ZSB0byB0aGUgb2JzZXJ2ZWQgZGF0YSBmb3IgbWFueSBvZiB0aGUgbWV0aG9kcy4gQWRkaW5nIG1vcmUgc3RydWN0dXJlIGNvdWxkIGJlIGhlbHBmdWwuIA0KDQojIyBMZWF2ZS1vbmUtb3V0IENWDQpUaGUgJFx0ZXh0YmZ7bG9vfSQgcHJvY2VkdXJlIGlzIHBlcmZvcm1lZCBhZ2FpbiwgZm9yIGNvbXBhcmlzb24gd2l0aCB0aGUgcHJldmlvdXMgYW5kIGxhdGVyIG1vZGVscy4NCmBgYHtyIGxvb18yLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDJfQXNfbXYucmRhIikNCg0KbG9vXzIgPC0gbG9vKHggPSBtb2QyLCANCiAgICAgICAgICAgICBwb2ludHdpc2UgPSBUUlVFLA0KICAgICAgICAgICAgIG1vbWVudF9tYXRjaCA9IFRSVUUsIA0KICAgICAgICAgICAgIHNhdmVfcHNpcyA9IFRSVUUsIA0KICAgICAgICAgICAgIGNvcmVzID0gMTApDQpzYXZlKGxvb18yLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvbG9vXzIucmRhIikNCmBgYA0KDQpgYGB7ciBsb29fMl9wcmludCwgZWNobz1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbG9vXzIucmRhIikNCg0KcHJpbnQobG9vXzIpDQpgYGANClRoZSAkXHRleHRiZntsb299JCBjYWxjdWxhdGlvbiByZXN1bHRlZCBpbiBhIGxhcmdlICgzMCkgbnVtYmVyIG9mIHBvdGVudGlhbGx5ICJwcm9ibGVtYXRpYyIgb2JzZXJ2YXRpb25zLiANCg0KYGBge3IgaGlnaF9rX29ic18yLCBlY2hvPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9sb29fMi5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KZGZfbXZfYXNbd2hpY2gobG9vXzIkZGlhZ25vc3RpY3MkcGFyZXRvX2sgPiAwLjcpLCBdICU+JSBwcmludCgpDQpgYGANCk1vc3Qgb2YgdGhlc2UsIGFnYWluLCBsb29rIHRvIGJlIG9ic2VydmF0aW9ucyBpbiB0aGUgMjUwcHBtIG1hdHJpY2VzLiBIb3dldmVyLCBpdCBpcyBub3QgYWxsLCBzbyB0aGVyZSBtYXkgYmUgb3RoZXIgaXNzdWVzIHRvIGNvbnNpZGVyLiBXaXRoIHNvIG1hbnkgayA+IDAuNywgaXQgaXMgaW1wb3J0YW50IHRvIGNoZWNrIHRoYXQgdGhlIG1vZGVsIGlzbid0IGp1c3QgdGVycmlibHkgbWlzLXNwZWNpZmllZC4gQ29tcGFyaW5nIHRoZSBudW1iZXIgb2YgbW9kZWwgcGFyYW1ldGVycyAoJHAgPSA3NDUkKSB0byAkcF97bG9vfSQgY2FuIGJlIGhlbHBmdWwgaW4gdGhpcyByZWdhcmQuIEluIHRoaXMgY2FzZSwgJHBfe2xvb30gPDwgcCQsIHN1Z2dlc3RpbmcgdGhhdCB0aGUgbW9kZWwgbWF5IGJlIG1pc3BlY2lmaWVkLCB3aGljaCB3b3VsZCBhZ3JlZSB3aXRoIHRoZSBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBjaGVja3MgYWJvdmUgKHNlZTogaHR0cHM6Ly9tYy1zdGFuLm9yZy9sb28vcmVmZXJlbmNlL2xvby1nbG9zc2FyeS5odG1sKS4gSG93ZXZlciwgYW5vdGhlciByZWFzb25hYmxlIGV4cGxhbmF0aW9uIHdvdWxkIGJlIHRoYXQsIHdpdGggc28gbWFueSBsYXRlbnQgcGFyYW1ldGVycyBvdmVyIHRoZSBkaWZmZXJlbnQgZ3JvdXBpbmdzIChpLmUsIHZhcnlpbmcgZWZmZWN0cykgd2l0aCByZWxhdGl2ZWx5IGZldyBvYnNlcnZhdGlvbnMgcGVyIGdyb3VwLCBsZWF2aW5nIG91dCBhbnkgb2JzZXJ2YXRpb25zIGZyb20gYW55IHBhcnRpY3VsYXIgZ3JvdXAgY2FuIG1ha2UgZm9yIGEgbm9pc3kgQ1YgcHJvY2Vzcy4gQSBzb2x1dGlvbiwgaW4gdGhhdCBjYXNlLCBtYXkgYmUgdG8gYWRkIHN0cm9uZ2VyIHByaW9ycyBvdmVyIHRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIGZvciB0aGUgdmFyeWluZyBlZmZlY3RzLCBidXQgdGhlIGN1cnJlbnQgcHJpb3JzIHNob3VsZCBhbHJlYWR5IGJlIHJlYXNvbmFibHkgaW5mb3JtYXRpdmUgdG8gc3RhYmlsaXplIGVzdGltYXRlcy4gVGhlcmVmb3JlLCB0aGUgYXBwcm9hY2ggdGFrZW4gYmVsb3cgd2lsbCBiZSB0byBqdXN0IGFkZCBtb3JlIHN0cnVjdHVyZSB0byB0aGUgbW9kZWwsIHBhcnRpY3VsYXJseSBzaW5jZSB0aGUgcG9zdGVyaW9yIHByZWRpY3RpdmUgY2hlY2tzIGFsc28gaGludGVkIGF0IHNvbWUgcG90ZW50aWFsIGZvciBtaXMtc3BlY2lmaWNhdGlvbi4gDQoNCldpdGggcmVnYXJkIHRvIGp1c3QgY2FsY3VsYXRpbmcgdGhlIENWIGNyaXRlcmlhIGZvciB0aGlzIG1vZGVsLCBnaXZlbiB0aGUgaGlnaCBudW1iZXIgb2YgcG90ZW50aWFsbHkgcHJvYmxlbWF0aWMgb2JzZXJ2YXRpb25zIGl0IHdvdWxkIGJlIHRvbyBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIHRvIHJlbG9vLCBzbyBhIGstZm9sZCBDViBpcyBpbiBvcmRlci4gQSBrLWZvbGQgQ1YgaXMgYWxzbyBuZWVkZWQgZm9yIG1vZGVsIDEgYmVjYXVzZSBpdCBpc24ndCByZWNvbW1lbmRlZCB0byBjb21wYXJlIGxvby1DViBhbmQgay1mb2xkIENWIG1ldHJpY3MuIA0KDQojIyBLLWZvbGQgQ1YNCkstZm9sZCBDViBjYW4gYmUgcGVyZm9ybWVkIHVzaW5nIHRoZSAkXHRleHRiZnticm1zfSQgb3IgJFx0ZXh0YmZ7bG9vfSQgcGFja2FnZSwgYW5kIGludm9sdmVzIHJlZml0dGluZyB0aGUgbW9kZWwgSyB0aW1lcywgZWFjaCB0aW1lIGxlYXZpbmcgb3V0IG9uZS1LdGggb2YgdGhlIG9yaWdpbmFsIGRhdGEgKGh0dHA6Ly9wYXVsLWJ1ZXJrbmVyLmdpdGh1Yi5pby9icm1zL3JlZmVyZW5jZS9rZm9sZC5odG1sKS4gDQoNCkZpcnN0LCB0aGUgay1mb2xkIGZvciBtb2RlbCAxLCB3aGVyZSBrID0gMTAuDQpgYGB7ciBrZm9sZF8xLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDFfQXNfbXYucmRhIikNCg0KbGlicmFyeShmdXR1cmUpDQpwbGFuKG11bHRpc2Vzc2lvbih3b3JrZXJzID0gMTApLCBnYyA9IFRSVUUpDQprZm9sZF8xIDwtIGtmb2xkKHggPSBtb2QxLCBzYXZlX2ZpdHMgPSBUUlVFLCBLID0gMTAsIGNoYWlucyA9IDQpDQpzYXZlKGtmb2xkXzEsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9rZm9sZF8xLnJkYSIpDQpwbGFuKHNlcXVlbnRpYWwpDQpgYGANCg0KVGhlbiwgZm9yIG1vZGVsIDIuDQpgYGB7ciBrZm9sZF8yLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDJfQXNfbXYucmRhIikNCg0KbGlicmFyeShmdXR1cmUpDQpwbGFuKG11bHRpc2Vzc2lvbih3b3JrZXJzID0gMTApLCBnYyA9IFRSVUUpDQprZm9sZF8yIDwtIGtmb2xkKHggPSBtb2QyLCBzYXZlX2ZpdHMgPSBUUlVFLCBLID0gMTAsIGNoYWlucyA9IDQpDQpzYXZlKGtmb2xkXzIsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9rZm9sZF8yLnJkYSIpDQpwbGFuKHNlcXVlbnRpYWwpDQpgYGANCg0KVGhlIHJlc3VsdHMgZm9yIG1vZGVsIDEuDQpgYGB7ciBrZm9sZF9wcmludF8xLCBlY2hvPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9rZm9sZF8xLnJkYSIpDQpwcmludChrZm9sZF8xKQ0KYGBgDQoNCkFuZCBmb3IgbW9kZWwgMi4NCmBgYHtyIGtmb2xkX3ByaW50XzIsIGVjaG89RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2tmb2xkXzIucmRhIikNCnByaW50KGtmb2xkXzIpDQpgYGANCg0KVGhlIGRpcmVjdCBjb21wYXJpc29uLg0KYGBge3Iga2ZvbGRfY29tcGFyZV8xdjIsIGVjaG89RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2tmb2xkXzEucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMva2ZvbGRfMi5yZGEiKQ0KbG9vX2NvbXBhcmUoa2ZvbGRfMSwga2ZvbGRfMikNCmBgYA0KDQpDbGVhcmx5LCBtb2RlbCAyIGlzIHByZWZlcnJlZCBieSB0aGlzIG1ldHJpYy4gSXQgaGFzIGEgbXVjaCBsYXJnZXIgJGVscGRfe2tmb2xkfSQgYW5kIHRoZSBkaWZmZXJlbmNlIGZyb20gbW9kMSBpcyBtdWNoIGxhcmdlciB0aGFuIHN0YW5kYXJkIGVycm9yIG9mIHRoZSBkaWZmZXJlbmNlLiBJdCB3b3VsZCBiZSBleHBlY3RlZCB0byBwZXJmb3JtIGJldHRlciBvdXQtb2Ytc2FtcGxlLiBIb3dldmVyLCB0aGUgcG90ZW50aWFsIG1pcy1zcGVjaWZpY2F0aW9uIHJlbWFpbnMsIHNvIGFub3RoZXIgbW9kZWwgaXMgY29uc3RydWN0ZWQgYmVsb3cgd2l0aCBhZGRpdGlvbmFsIHN0cnVjdHVyZS4gDQoNCiMgQSBmaW5hbCBtb2RlbCBmb3IgYXJzZW5pYw0KRm9yIHRoZSBmaW5hbCBtb2RlbCwgYWRkaXRpb25hbCBzdHJ1Y3R1cmUgaXMgYWRkZWQgdG8gdGhlICRcbXUkIHRlcm0uIEluIHRoaXMgbW9kZWwsIHRoZSB0dW5lIGVmZmVjdCBpcyBhbHNvIGFsbG93ZWQgdG8gdmFyeSBieSBtYXRyaXggYW5kIGRheSBvZiB0aGUgZXhwZXJpbWVudC4gVGhhdCBpcywgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBiZXR3ZWVuIHRoZSBISGUgdHVuZSBhbmQgTEhlIHR1bmUgaXMgYWxsb3dlZCB0byB2YXJ5IGFjY29yZGluZyB0byBtYXRyaXggYW5kL29yIGRheSBvZiB0aGUgZXhwZXJpbWVudC4gDQpgYGB7ciBmaXRfbW9kMywgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KDQpiZl9TdGQgPC0gYmYoU3RkIH4gdHVuZSArICh0dW5lIHwgbWF0cml4KSArICh0dW5lIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0FsdCA8LSBiZihBbHQgfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfSG8yIDwtIGJmKEhvMiB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9JbiA8LSBiZihJbiB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9TYyA8LSBiZihTYyB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9ZIDwtIGJmKFkgfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfQmUgPC0gYmYoQmUgfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfQ28gPC0gYmYoQ28gfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfVGggPC0gYmYoVGggfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfSG8xIDwtIGJmKEhvMSB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQptb2QzIDwtIGJybShiZl9TdGQgKyANCiAgICAgICAgICAgICAgYmZfQWx0ICsgDQogICAgICAgICAgICAgIGJmX0hvMiArIA0KICAgICAgICAgICAgICBiZl9JbiArIA0KICAgICAgICAgICAgICBiZl9TYyArIA0KICAgICAgICAgICAgICBiZl9ZICsgDQogICAgICAgICAgICAgIGJmX0JlICsgDQogICAgICAgICAgICAgIGJmX0NvICsgDQogICAgICAgICAgICAgIGJmX1RoICsgDQogICAgICAgICAgICAgIGJmX0hvMSArIA0KICAgICAgICAgICAgICBzZXRfcmVzY29yKFRSVUUpLA0KICBkYXRhID0gZGZfbXZfYXMsIA0KICBwcmlvciA9IGMocHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkFsdCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiU2MiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJDbyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCByZXNwID0gIkFsdCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiU2MiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJDbyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKC0xLCAyKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgtMSwgMiksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoLTEsIDIpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiU3RkIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSW4iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJCZSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzEiKSwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkFsdCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkhvMiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiU2MiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJZIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJDbyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEpLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlRoIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMSksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgDQogICAgICAgICAgICBwcmlvcihsa2ooMSksIGNsYXNzID0gInJlc2NvciIpDQogICAgICAgICAgICApLA0KICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTUsIG1heF90cmVlZGVwdGggPSAxNCksDQogIGluaXRfciA9IDAuMDUsDQogIHNhdmVfcGFycyA9IHNhdmVfcGFycyhhbGwgPSBUUlVFKSwNCiAgc2VlZCA9IDUyMTQsDQogIGNoYWlucz00LA0KICBpdGVyPTMwMDAsDQogIGNvcmVzPTQgKQ0KDQpzYXZlKG1vZDMsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQpgYGANCg0KIyMgVGFidWxhciBwYXJhbWV0ZXIgZXN0aW1hdGVzDQpBZ2FpbiwgYSBzdW1tYXJ5IG9mIHRoZSBwb3N0ZXJpb3IgZXN0aW1hdGVzLg0KYGBge3IgcHJpbnRfbW9kXzMsIGVjaG89RkFMU0V9DQpsb2FkKCAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIgKQ0KcHJpbnQobW9kMywgcHJpb3IgPSBUUlVFKQ0KYGBgDQpBZ2FpbiwgdGhlIEhNQyBzYW1wbGluZyBsb29rcyB0byBoYXZlIGdvbmUgd2VsbC4NCg0KIyMgTW9kZWwgY2hlY2tzDQpOZXh0LCB0aGUgZGVuc2l0eSBjaGVja3MuDQoNCiMjIyBEZW5zaXR5IG92ZXJsYXkNCmBgYHtyIHBwY19kZW5zX292ZXJsYXlfMywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJTdGQiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkFsdCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImFsdC5pc290b3BlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8yIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJJbiIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkluIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiU2MiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJTYyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIlkiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJZIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiQmUiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJCZSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkNvIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQ28iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJUaCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlRoIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8xIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIxKyIpKSANCmBgYA0KU2VlbWluZ2x5LCBhbiBpbXByb3ZlbWVudCBvbiB0aGUgcHJldmlvdXMgbW9kZWxzLiBUaGUgY2hlY2sgbG9va3MgcmVhc29uYWJsZSBhY3Jvc3MgbW9zdCBvZiB0aGUgbWV0aG9kcywgdGhvdWdoIGNsZWFybHkgdGhlIGluLXNhbXBsZSBvYnNlcnZhdGlvbnMgYWdhaW4gcHJvdmVkIGRpZmZpY3VsdCB0byByZXBsaWNhdGUuIEl0IGNhbiBiZSBoZWxwZnVsLCB0byBsb29rIGF0IHNvbWUgYWRkaXRpb25hbCBjaGVja3MgKGJlbG93KSB0byBnZXQgYSBiZXR0ZXIgaGFuZGxlIG9uIHdoaWNoIGFzcGVjdHMgb2YgdGhlIG9ic2VydmVkIGRhdGEgYXJlIHJlYXNvbmFibHkgYXBwcm94aW1hdGVkIGJ5IHRoZSBtb2RlbCBhbmQgd2hpY2ggbWF5IG5vdCBiZS4NCg0KIyMjIE1lZGlhbg0KTmV4dCBpcyBhIGNoZWNrIGNvbXBhcmluZyByZXBsaWNhdGVkIG1lZGlhbnMgdG8gdGhlIG9ic2VydmVkIG1lZGlhbnMuIA0KYGBge3IgcHBjX21lZGlhbl8zLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCg0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIlN0ZCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImluLXNhbXBsZSIpDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiQWx0IiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiYWx0Lmlzb3RvcGUiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJIbzIiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIkluIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiSW4iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJTYyIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlNjIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiWSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlkiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJCZSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkJlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiQ28iLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJDbyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIlRoIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiVGgiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJIbzEiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjErIikpIA0KYGBgDQpJbiB0aGUgYWJvdmUgY2hlY2ssIHRoZSBvYnNlcnZlZCBtZWRpYW4gKGJsYWNrIHZlcnRpY2FsIGxpbmUpIHNob3VsZCBmYWxsIGluIHRoZSBidWxrIG9mIHRoZSByZXBsaWNhdGVkIG1lZGlhbnMgKGJsdWUgaGlzdG9ncmFtKS4gVGhlIHBsb3QgZm9yIHRoZSBpbi1zYW1wbGUgY2xlYXJseSBzdWdnZXN0cyB0aGF0IHRoZSBtb2RlbCBtYXkgYmUgY29uc2lzdGVudGx5IG92ZXJlc3RpbWF0aW5nIHRoZSBvYnNlcnZlZCBtZWRpYW4gZm9yIHRoYXQgbWV0aG9kLiBUaGlzIHdvdWxkIGFncmVlIHdpdGggdGhlIGRlbnNpdHkgcGxvdCBmb3IgdGhlIGluLXNhbXBsZSBtZXRob2QgYWJvdmUuIE5ldmVydGhlbGVzcywgdGhlIHNjYWxlIG9mIHRoZSBiaWFzIGlzIG9uIHRoZSBvcmRlciBvZiBhcm91bmQgMTAwIHBwdCwgd2hpY2ggbWF5IGJlIGxlc3MgbWVhbmluZ2Z1bCBpbiB0aGUgcHJhY3RpY2FsIHNlbnNlLiANCg0KIyMjIE1pbg0KTmV4dCBpcyBhIGNoZWNrIGNvbXBhcmluZyByZXBsaWNhdGVkIG1pbnMgdG8gdGhlIG9ic2VydmVkIG1pbnMuIA0KYGBge3IgcHBjX21pbl8zLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCg0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIlN0ZCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImluLXNhbXBsZSIpDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiQWx0IiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiYWx0Lmlzb3RvcGUiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJIbzIiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIkluIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiSW4iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJTYyIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlNjIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiWSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlkiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJCZSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkJlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiQ28iLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJDbyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIlRoIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiVGgiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJIbzEiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjErIikpIA0KYGBgDQpUaGUgbW9kZWwgaXMgY29uc2lzdGVudGx5ICJvdmVyLXNob290aW5nIiB0aGUgbWluIGZvciB0aGUgaW4tc2FtcGxlIG1ldGhvZC4gVGhpcyB3b3VsZCBhbHNvIGFncmVlIHdpdGggdGhlIGRlbnNpdHkgcGxvdCBhYm92ZSwgd2hlcmUgdGhlIGxlZnQgdGFpbHMgb2YgdGhlIHJlcGxpY2F0ZWQgZGF0YXNldHMgY29uc2lzdGVudGx5IGFyZSBsZWZ0IG9mIHRoZSBvYnNlcnZlZCBkZW5zaXR5LCBpZiBvbmx5IHNsaWdodGx5LiBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIG1vZGVsIG1heSBiZSBzb21ld2hhdCB1bmRlci1lc3RpbWF0aW5nIHRoZSBsZWZ0IHRhaWxzIGZvciAkVGgkIGFuZCAkSG9eezErfSQuDQoNCiMjIyBNYXgNCk5leHQgaXMgYSBjaGVjayBjb21wYXJpbmcgcmVwbGljYXRlZCBtYXhzIHRvIHRoZSBvYnNlcnZlZCBtYXhzLiANCmBgYHtyIHBwY19tYXhfMywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJTdGQiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIkFsdCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImFsdC5pc290b3BlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiSG8yIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJJbiIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkluIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiU2MiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJTYyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIlkiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJZIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiQmUiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJCZSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIkNvIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQ28iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJUaCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlRoIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiSG8xIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIxKyIpKSANCmBgYA0KQ2xlYXJseSwgdGhlIG1vZGVsIGlzIHVuZGVyZXN0aW1hdGluZyB0aGUgb2JzZXJ2ZWQgbWF4IGZvciBhbGwgb2YgdGhlICsyIG1ldGhvZHMuIFRoZXJlIGFwcGVhcnMgdG8gYmUgc29tZSBpbXBvcnRhbnQgYXNwZWN0IG9mIHRoZSB0cnVlIGRhdGEgZ2VuZXJhdGluZyBwcm9jZXNzIHRoYXQgaXNuJ3QgY2FwdHVyZWQgYnkgdGhlIG1vZGVsLiBPbmUgcG90ZW50aWFsIHBsYWNlIHRvIGxvb2sgZm9yIGV4cGxhbmF0aW9ucyBmb3IgdGhpcyBkaXNjcmVwYW5jeSBtYXkgYmUgdGhlIDI1MHBwbSBtYXRyaWNlcywgd2hpY2ggcmVzdWx0ZWQgaW4gZmFpcmx5IGV4dHJlbWUgdW5kZXItY29ycmVjdGlvbnMgZm9yIGFsbCB0aHJlZSBvZiB0aGUgKzIgbWV0aG9kcywgcmVsYXRpdmUgdG8gb3RoZXIgbWF0cmljZXMgKHNlZSBkYXRhIHZpc3VhbGl6YXRpb24gc2VjdGlvbiBhYm92ZSkuDQoNCiMjIEstZm9sZCBDVg0KRmluYWxseSwgdGhlIGstZm9sZCBmb3IgbW9kZWwgMywgd2l0aCBrID0gMTAuDQpgYGB7ciBrZm9sZF8zLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCg0KbGlicmFyeShmdXR1cmUpDQpwbGFuKG11bHRpc2Vzc2lvbikNCmtmb2xkXzMgPC0ga2ZvbGQobW9kMywgSyA9IDEwLCBzYXZlX2ZpdHMgPSBUUlVFKQ0Kc2F2ZShrZm9sZF8zLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMva2ZvbGRfMy5yZGEiKQ0KcGxhbihzZXF1ZW50aWFsKQ0KYGBgDQoNClRoZSByZXN1bHQuDQpgYGB7ciBrZm9sZF9wcmludF8zLCBlY2hvPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9rZm9sZF8zLnJkYSIpDQpwcmludChrZm9sZF8zKQ0KYGBgDQoNClRoZSBjb21wYXJpc29uLg0KYGBge3Iga2ZvbGRfY29tcGFyZV8xdjJ2M30NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMva2ZvbGRfMS5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9rZm9sZF8yLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2tmb2xkXzMucmRhIikNCmxvb19jb21wYXJlKGtmb2xkXzEsIGtmb2xkXzIsIGtmb2xkXzMpDQpgYGANCg0KVGhlIG1vcmUgZmxleGlibGUgbW9kZWwgMyBpcyBjbGVhcmx5IGZhdm9yZWQuDQoNCiMjIFBvc3RlcmlvciBpbmZlcmVuY2VzDQpXaXRoIHRoZSBwb3RlbnRpYWwgbGltaXRhdGlvbnMgdG8gdGhlIG1vZGVsIHN1Z2dlc3RlZCBieSB0aGUgcHJlZGljdGl2ZSBjaGVja3MgbG9vLUNWIGRpYWdub3N0aWNzLCB0aGUgZm9jdXMgbW92ZXMgbmV4dCB0byBwb3N0ZXJpb3IgaW5mZXJlbmNlcyBnaXZlbiB0aGlzIG1vc3QgaGlnaGx5LXBhcmFtZXRlcml6ZWQgbW9kZWwuIA0KDQojIyMgQ29uZGl0aW9uYWwgbWVhbnMNCkJlbG93IGFyZSBwbG90cyBvZiB0aGUgZml0dGVkIHZhbHVlcyBvZiB0aGUgbGluZWFyIHByZWRpY3RvcnMgZm9yIGJvdGggJFxtdSQgYW5kICRcc2lnbWEkIGFjcm9zcyB0aGUgZGlmZmVyZW50IGV4cGVyaW1lbnRhbCBncm91cGluZ3MuIFRoZXNlIGVzdGltYXRlcyBwZXJ0YWluIHRvIGV4cGVjdGVkIHBvcHVsYXRpb24gYXZlcmFnZXMsIGNvbmRpdGlvbmFsIG9uIHRoZSBtb2RlbCwgZGF0YSwgYW5kIHByaW9ycywgYW5kIGluY2x1ZGUgdW5jZXJ0YWludHkgaW4gdGhlIGVzdGltYXRpb24gb2YgZWFjaCBvZiB0aGUgcGFyYW1ldGVycyBjb21wcmlzaW5nIHRoZSBsaW5lYXIgcHJlZGljdG9ycy4gDQoNCiMjIyMgJFxtdSQNCkZpcnN0LCB0aGUgZXN0aW1hdGVkIGNvbmRpdGlvbmFsIG1lYW5zIGZvciB0aGUgJFxtdSQgY29tcG9uZW50IG9mIHRoZSBtb2RlbC4NCg0KIyMjIyMgVHVuZQ0KRXN0aW1hdGUgbWVhbnMgY29uZGl0aW9uYWwgb24gbWV0aG9kIGFuZCB0dW5lIHdoaWxlIG1hcmdpbmFsaXppbmcgb3ZlciBtYXRyaXggYW5kIGRheS4NCmBgYHtyIGNvbmRpdGlvbmFsX21lYW5zX21ldGhvZF90dW5lLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCmZpdHRlZF9tZXRob2RfdHVuZSA8LSBkZl9tdl9hcyAlPiUNCiAgYWRkX2ZpdHRlZF9kcmF3cyhtb2QzLCANCiAgICAgICAgICAgICAgICAgICBkcGFyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSwNCiAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEpDQpzYXZlKGZpdHRlZF9tZXRob2RfdHVuZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9tZXRob2RfdHVuZS5yZGEiKQ0KYGBgDQoNCmBgYHtyIHBvc3Rlcmlvcl9wbG90X21ldGhvZF90dW5lX0FzLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfbWV0aG9kX3R1bmUucmRhIikNCg0KbXVfU3RkIDwtIGZpdHRlZF9tZXRob2RfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlN0ZCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQptdV9BbHQgPC0gZml0dGVkX21ldGhvZF90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQWx0IikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0KbXVfSG8yIDwtIGZpdHRlZF9tZXRob2RfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCm11X0luIDwtIGZpdHRlZF9tZXRob2RfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkluIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0KbXVfU2MgPC0gZml0dGVkX21ldGhvZF90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiU2MiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQptdV9ZIDwtIGZpdHRlZF9tZXRob2RfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCm11X0JlIDwtIGZpdHRlZF9tZXRob2RfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkJlIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQptdV9DbyA8LSBmaXR0ZWRfbWV0aG9kX3R1bmUgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJDbyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0KbXVfVGggPC0gZml0dGVkX21ldGhvZF90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiVGgiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCm11X0hvMSA8LSBmaXR0ZWRfbWV0aG9kX3R1bmUgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzEiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG11X1N0ZCwgbXVfQWx0LCBtdV9IbzIsIG11X0luLCBtdV9TYywgbXVfWSwgbXVfQmUsIG11X0NvLCBtdV9UaCwgbXVfSG8xLCBuY29sID0gNSkNCmBgYA0KDQojIyMjIyBEYXkNCkVzdGltYXRlIG1lYW5zIGNvbmRpdGlvbmFsIG9uIG1ldGhvZCBhbmQgZGF5IHdoaWxlIG1hcmdpbmFsaXppbmcgb3ZlciBtYXRyaXguDQpgYGB7ciBjb25kaXRpb25hbF9tZWFuc19tZXRob2RfZGF5LCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCmZpdHRlZF9tZXRob2RfZGF5IDwtIGRmX212X2FzICU+JQ0KICBhZGRfZml0dGVkX2RyYXdzKG1vZDMsIA0KICAgICAgICAgICAgICAgICAgIGRwYXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgcmVfZm9ybXVsYSA9IH4gKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgICAgICAgY29yZXMgPSAxKQ0Kc2F2ZShmaXR0ZWRfbWV0aG9kX2RheSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9tZXRob2RfZGF5LnJkYSIpDQpgYGANCg0KYGBge3IgcG9zdGVyaW9yX3Bsb3RfbWV0aG9kX2RheV9BcywgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD0xMH0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX21ldGhvZF9kYXkucmRhIikNCg0KbXVfU3RkIDwtIGZpdHRlZF9tZXRob2RfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiU3RkIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQptdV9BbHQgPC0gZml0dGVkX21ldGhvZF9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0KbXVfSG8yIDwtIGZpdHRlZF9tZXRob2RfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8yIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCm11X0luIDwtIGZpdHRlZF9tZXRob2RfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSW4iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0KbXVfU2MgPC0gZml0dGVkX21ldGhvZF9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQptdV9ZIDwtIGZpdHRlZF9tZXRob2RfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiWSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCm11X0JlIDwtIGZpdHRlZF9tZXRob2RfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQmUiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQptdV9DbyA8LSBmaXR0ZWRfbWV0aG9kX2RheSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0KbXVfVGggPC0gZml0dGVkX21ldGhvZF9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJUaCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCm11X0hvMSA8LSBmaXR0ZWRfbWV0aG9kX2RheSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG11X1N0ZCwgbXVfQWx0LCBtdV9IbzIsIG11X0luLCBtdV9TYywgbXVfWSwgbXVfQmUsIG11X0NvLCBtdV9UaCwgbXVfSG8xLCBuY29sID0gNSkNCmBgYA0KVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgdGhlIGxhcmdlIG92ZXItY29ycmVjdGlvbiAoaS5lLCBuZWdhdGl2ZSBiaWFzKSBleHBlY3RlZCBvbiAzLzMwIGZvciBhbGwgb2YgdGhlICQrMSQgbWV0aG9kcy4gQnkgY29tcGFyaXNvbiwgdGhlIG1lYW5zIGZvciB0aGUgJCsyJCBtZXRob2RzIGFyZSByZWxhdGl2ZWx5IGNvbnNpc3RlbnQgYWNyb3NzIHRoZSBkYXlzIG9mIHRoZSBleHBlcmltZW50LiBBbHNvIG5vdGUgdGhlIGNvbnNpc3RlbnQgdW5kZXItY29ycmVjdGlvbnMgKGkuZS4sIHBvc2l0aXZlIGJpYXMpIGVzdGltYXRlZCBhY3Jvc3MgbW9zdCBkYXlzIGZvciB0aGUgJCsyJCBtZXRob2RzLiBXaXRoaW4gZGF5cywgdGhlcmUgd2VyZSBubyBjbGVhciBkaWZmZXJlbmNlcyBpbiBtZWFucyBkdWUgdG8gdHVuZSBzZXR0aW5nLiANCg0KIyMjIyMgTWF0cml4DQpFc3RpbWF0ZSBtZWFucyBjb25kaXRpb25hbCBvbiBtZXRob2QgYW5kIG1hdHJpeCB3aGlsZSBtYXJnaW5hbGl6aW5nIG92ZXIgZGF5Lg0KYGBge3IgY29uZGl0aW9uYWxfbWVhbnNfbWV0aG9kX21hdHJpeCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCmZpdHRlZF9tZXRob2RfbWF0cml4IDwtIGRmX212X2FzICU+JQ0KICBhZGRfZml0dGVkX2RyYXdzKG1vZDMsIA0KICAgICAgICAgICAgICAgICAgIGRwYXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgcmVfZm9ybXVsYSA9IH4gKDEgfCBtYXRyaXgpLA0KICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSkNCnNhdmUoZml0dGVkX21ldGhvZF9tYXRyaXgsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfbWV0aG9kX21hdHJpeC5yZGEiKQ0KYGBgDQoNCmBgYHtyIHBvc3Rlcmlvcl9wbG90X21ldGhvZF9tYXRyaXhfQXMsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTEwfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfbWV0aG9kX21hdHJpeC5yZGEiKQ0KDQptdV9TdGQgPC0gZml0dGVkX21ldGhvZF9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTdGQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQptdV9BbHQgPC0gZml0dGVkX21ldGhvZF9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJhbHQuaXNvdG9wZSIpDQoNCm11X0hvMiA8LSBmaXR0ZWRfbWV0aG9kX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkNCg0KbXVfSW4gPC0gZml0dGVkX21ldGhvZF9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJJbiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0KbXVfU2MgPC0gZml0dGVkX21ldGhvZF9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIlNjIikNCg0KbXVfWSA8LSBmaXR0ZWRfbWV0aG9kX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJZIikNCg0KbXVfQmUgPC0gZml0dGVkX21ldGhvZF9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJCZSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMiwgMikgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQptdV9DbyA8LSBmaXR0ZWRfbWV0aG9kX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJDbyIpDQoNCm11X1RoIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiVGgiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTIsIDIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIlRoIikNCg0KbXVfSG8xIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8xIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0yLCAyKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG11X1N0ZCwgbXVfQWx0LCBtdV9IbzIsIG11X0luLCBtdV9TYywgbXVfWSwgbXVfQmUsIG11X0NvLCBtdV9UaCwgbXVfSG8xLCBuY29sID0gNSkNCmBgYA0KVGhlIGVzdGltYXRlZCBtZWFucyBmb3IgdGhlICsyIG1ldGhvZHMgYXJlIGFnYWluIGxhcmdlbHkgaW4gdGhlIGRpcmVjdGlvbiBvZiBzbGlnaHQgdW5kZXItY29ycmVjdGlvbiwgd2hlcmVhcyBtb3N0IG9mIHRoZSArMSBtZXRob2RzIHZhcnkgYXJvdW5kIHplcm8gYmlhcywgd2l0aCB0aGUgZXhjZXB0aW9uIG9mICRUaCQgYW5kICRIb157KzF9JCwgd2hpY2ggdGVuZCBtb3JlIHRvd2FyZHMgb3Zlci1jb3JyZWN0aW9uLCB0aG91Z2ggdGhlIGluZmVyZW5jZXMgYXJlIHVuY2VydGFpbiAoY3JlZGlibGUgaW50ZXJ2YWxzIG92ZXJsYXBzIHplcm8gZm9yIG1vc3QgcGFydCkuIE1hdHJpeCB0byBtYXRyaXggdmFyaWFiaWxpdHkgZm9yIGFsbCBvZiB0aGUgbWV0aG9kcyBpcyBleHBlY3RlZCB0byBiZSByZWxhdGl2ZWx5IGxlc3Mgc3Vic3RhbnRpYWwgY29tcGFyZWQgdG8gZGF5IHRvIGRheSB2YXJpYXRpb24gYWJvdmUuIFRoZSB0dW5lIGVmZmVjdCBhbHNvIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHBhcnRpY3VsYXJseSBsYXJnZSwgaWYgaW1wb3J0YW50IGF0IGFsbCwgZm9yIG1vc3QgbWV0aG9kczsgdGhvdWdoIHRoZSAkU2MkIGVzdGltYXRlcyBtYXkgaW5kaWNhdGUgc29tZSByZWxhdGl2ZWx5IHNtYWxsLCBpZiB1bmNlcnRhaW4sIHdpdGhpbiBtYXRyaXggZGlmZmVyZW5jZXMgZHVlIHRvIHR1bmUuIA0KDQojIyMjICRcc2lnbWEkDQpOZXh0LCB0aGUgY29uZGl0aW9uYWwgbWVhbnMgZm9yIHRoZSAkXHNpZ21hJCBjb21wb25lbnQgb2YgdGhlIG1vZGVsLg0KDQojIyMjIyBUdW5lDQpgYGB7ciBjb25kaXRpb25hbF9zaWdtYV90dW5lLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfQXNfbXYucmRhIikNCg0KZml0dGVkX3NpZ21hX3R1bmUgPC0gZGZfbXZfYXMgJT4lDQogIGFkZF9maXR0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgZHBhciA9ICJzaWdtYSIsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSwNCiAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEpDQpzYXZlKGZpdHRlZF9zaWdtYV90dW5lLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX3NpZ21hX3R1bmUucmRhIikNCmBgYA0KDQpUaGUgZXhwZWN0ZWQgc3RhbmRhcmQgZGV2aWF0aW9ucyBieSB0dW5lIGFmdGVyIG1hcmdpbmFsaXppbmcgb3ZlciBtYXRyaXggYXJlIGJlbG93Lg0KYGBge3IgcG9zdGVyaW9yX3Bsb3Rfc2lnbWFfdHVuZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMH0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfYXMucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX3NpZ21hX3R1bmUucmRhIikNCg0Kc2lnbWFfU3RkIDwtIGZpdHRlZF9zaWdtYV90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiU3RkIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQpzaWdtYV9BbHQgPC0gZml0dGVkX3NpZ21hX3R1bmUgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0Kc2lnbWFfSG8yIDwtIGZpdHRlZF9zaWdtYV90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8yIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCnNpZ21hX0luIDwtIGZpdHRlZF9zaWdtYV90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSW4iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0Kc2lnbWFfU2MgPC0gZml0dGVkX3NpZ21hX3R1bmUgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQpzaWdtYV9ZIDwtIGZpdHRlZF9zaWdtYV90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiWSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCnNpZ21hX0JlIDwtIGZpdHRlZF9zaWdtYV90dW5lICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQmUiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQpzaWdtYV9DbyA8LSBmaXR0ZWRfc2lnbWFfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0Kc2lnbWFfVGggPC0gZml0dGVkX3NpZ21hX3R1bmUgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJUaCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCnNpZ21hX0hvMSA8LSBmaXR0ZWRfc2lnbWFfdHVuZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKHNpZ21hX1N0ZCwgc2lnbWFfQWx0LCBzaWdtYV9IbzIsIHNpZ21hX0luLCBzaWdtYV9TYywgc2lnbWFfWSwgc2lnbWFfQmUsIHNpZ21hX0NvLCBzaWdtYV9UaCwgc2lnbWFfSG8xLCBuY29sID0gNSkNCmBgYA0KDQojIyMjIyBEYXkNCmBgYHtyIGNvbmRpdGlvbmFsX3NpZ21hX2RheSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCmZpdHRlZF9zaWdtYV9kYXkgPC0gZGZfbXZfYXMgJT4lDQogIGFkZF9maXR0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgZHBhciA9ICJzaWdtYSIsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBzaWdtYSB+ICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSkNCnNhdmUoZml0dGVkX3NpZ21hX2RheSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9zaWdtYV9kYXkucmRhIikNCmBgYA0KDQpUaGUgZXhwZWN0ZWQgc3RhbmRhcmQgZGV2aWF0aW9ucyBieSBkYXkgYWZ0ZXIgbWFyZ2luYWxpemluZyBvdmVyIG1hdHJpeCBhcmUgYmVsb3cuDQpgYGB7ciBwb3N0ZXJpb3JfcGxvdF9zaWdtYV9kYXksIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9zaWdtYV9kYXkucmRhIikNCg0Kc2lnbWFfU3RkIDwtIGZpdHRlZF9zaWdtYV9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTdGQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQpzaWdtYV9BbHQgPC0gZml0dGVkX3NpZ21hX2RheSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkFsdCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0Kc2lnbWFfSG8yIDwtIGZpdHRlZF9zaWdtYV9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzIiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCnNpZ21hX0luIDwtIGZpdHRlZF9zaWdtYV9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJJbiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0Kc2lnbWFfU2MgPC0gZml0dGVkX3NpZ21hX2RheSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlNjIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQpzaWdtYV9ZIDwtIGZpdHRlZF9zaWdtYV9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJZIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCnNpZ21hX0JlIDwtIGZpdHRlZF9zaWdtYV9kYXkgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJCZSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMSkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQpzaWdtYV9DbyA8LSBmaXR0ZWRfc2lnbWFfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQ28iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0Kc2lnbWFfVGggPC0gZml0dGVkX3NpZ21hX2RheSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlRoIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCnNpZ21hX0hvMSA8LSBmaXR0ZWRfc2lnbWFfZGF5ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8xIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKHNpZ21hX1N0ZCwgc2lnbWFfQWx0LCBzaWdtYV9IbzIsIHNpZ21hX0luLCBzaWdtYV9TYywgc2lnbWFfWSwgc2lnbWFfQmUsIHNpZ21hX0NvLCBzaWdtYV9UaCwgc2lnbWFfSG8xLCBuY29sID0gNSkNCmBgYA0KVGhpcyBmaWd1cmUgc3VnZ2VzdHMgc29tZSBkaWZmZXJlbmNlcyBpbiBzdGFuZGFyZCBkZXZpYXRpb24gZHVlIHRvIHR1bmUgc2V0dGluZywgcGFydGljdWxhcmx5IGZvciB0aGUgKzEgbWV0aG9kcy4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiB3YXMgYWxzbyBlc3RpbWF0ZWQgdG8gdmFyeSBmYWlybHkgc3Vic3RhbnRpYWxseSBkYXkgdG8gZGF5LCBubyBtYXR0ZXIgdGhlIHR1bmUgc2V0dGluZywgZm9yIG1vc3Qgb2YgdGhlICsxIG1ldGhvZHMuIFRoZSBsb3dlc3Qgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGVzdGltYXRlZCBmb3IgMy8zMCAoY29uZSBjaGFuZ2UgZGF5KSBmb3IgYWxsIG9mIHRob3NlIG1ldGhvZHMuIHN0YW5kYXJkIGRldmlhdGlvbiBtYXkgdmFyeSBzbGlnaHRseSBkYXkgdG8gZGF5IGZvciB0aGUgKzIgbWV0aG9kcywgYnV0IHRoZSBsYXJnZSBlZmZlY3Qgb24gMy8zMCBpcyBub3QgYXBwYXJlbnQuIERpZmZlcmVuY2VzIGR1ZSB0byB0dW5lIHNldHRpbmcgYWxzbyBhcmVuJ3QgYXMgY2xlYXIgZm9yIHRoZSArMiBtZXRob2RzLg0KDQojIyMjIyBNYXRyaXgNCmBgYHtyIGNvbmRpdGlvbmFsX3NpZ21hX21hdHJpeCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCmZpdHRlZF9zaWdtYV9tYXRyaXggPC0gZGZfbXZfYXMgJT4lDQogIGFkZF9maXR0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgZHBhciA9ICJzaWdtYSIsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBzaWdtYSB+ICgxIHwgbWF0cml4KSwNCiAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEpDQpzYXZlKGZpdHRlZF9zaWdtYV9tYXRyaXgsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfc2lnbWFfbWF0cml4LnJkYSIpDQpgYGANCg0KRmluYWxseSwgdGhlIGV4cGVjdGVkIHN0YW5kYXJkIGRldmlhdGlvbnMgYWZ0ZXIgbWFyZ2luYWxpemluZyBvdmVyIGRheS4NCmBgYHtyIHBvc3Rlcmlvcl9wbG90X3NpZ21hX21hdHJpeCwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9MTB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9zaWdtYV9tYXRyaXgucmRhIikNCg0Kc2lnbWFfU3RkIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTdGQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxLjUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQpzaWdtYV9BbHQgPC0gZml0dGVkX3NpZ21hX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkFsdCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEuNSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0Kc2lnbWFfSG8yIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzIiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxLjUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCnNpZ21hX0luIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJJbiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEuNSkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0Kc2lnbWFfU2MgPC0gZml0dGVkX3NpZ21hX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlNjIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMS41KSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQpzaWdtYV9ZIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJZIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMS41KSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCnNpZ21hX0JlIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXggJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJCZSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDEuNSkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQpzaWdtYV9DbyA8LSBmaXR0ZWRfc2lnbWFfbWF0cml4ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQ28iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAxLjUpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0Kc2lnbWFfVGggPC0gZml0dGVkX3NpZ21hX21hdHJpeCAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlRoIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMS41KSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCnNpZ21hX0hvMSA8LSBmaXR0ZWRfc2lnbWFfbWF0cml4ICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8xIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMS41KSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKHNpZ21hX1N0ZCwgc2lnbWFfQWx0LCBzaWdtYV9IbzIsIHNpZ21hX0luLCBzaWdtYV9TYywgc2lnbWFfWSwgc2lnbWFfQmUsIHNpZ21hX0NvLCBzaWdtYV9UaCwgc2lnbWFfSG8xLCBuY29sID0gNSkNCmBgYA0KT3ZlcmFsbCwgZXhjZXB0aW5nIHBlcmhhcHMgdGhlICRTYyQgbWV0aG9kLCBtYXRyaXggdG8gbWF0cml4IHZhcmlhYmlsaXR5IGluIHN0YW5kYXJkIGRldmlhdGlvbiB3YXMgZXN0aW1hdGVkIHRvIGJlIHZlcnkgbG93IHRvIG5lZ2xpZ2libGUuDQoNCiMjIyBSZXNpZHVhbCBDb3JyZWxhdGlvbnMNCk5leHQsIHRoZSBlc3RpbWF0ZWQgcmVzaWR1YWwgY29ycmVsYXRpb25zIGFtb25nIElTIG1ldGhvZHMuIE5vdGUgdGhhdCBub3QgYWxsIHBhaXJzIGFyZSBzaG93biB1bmRlciBlYWNoIG1ldGhvZCwgc2luY2UgbWFueSBhcmUgcmVkdW5kYW50LCBidXQgYWxsIG5vbi1yZWR1bmRhbnQgcGFpcnMgYXJlIHNob3duLg0KYGBge3IgcmVzaWR1YWxfY29ycmVsYXRpb25zLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9hcy5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX0FzX212LnJkYSIpDQoNCm1vZDMgJT4lDQogIGdhdGhlcl9kcmF3cyhyZXNjb3JfX1N0ZF9fQWx0LA0KICAgICAgICAgICAgICAgcmVzY29yX19TdGRfX0hvMiwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19JbiwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19TYywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19ZLA0KICAgICAgICAgICAgICAgcmVzY29yX19TdGRfX0JlLA0KICAgICAgICAgICAgICAgcmVzY29yX19TdGRfX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19TdGRfX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19TdGRfX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19BbHRfX0hvMiwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19JbiwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19TYywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19ZLA0KICAgICAgICAgICAgICAgcmVzY29yX19BbHRfX0JlLA0KICAgICAgICAgICAgICAgcmVzY29yX19BbHRfX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19BbHRfX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19BbHRfX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX0luLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX1NjLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX1ksDQogICAgICAgICAgICAgICByZXNjb3JfX0hvMl9fQmUsDQogICAgICAgICAgICAgICByZXNjb3JfX0hvMl9fQ28sDQogICAgICAgICAgICAgICByZXNjb3JfX0hvMl9fVGgsDQogICAgICAgICAgICAgICByZXNjb3JfX0hvMl9fSG8xLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICByZXNjb3JfX0luX19TYywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSW5fX1ksDQogICAgICAgICAgICAgICByZXNjb3JfX0luX19CZSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSW5fX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19Jbl9fVGgsDQogICAgICAgICAgICAgICByZXNjb3JfX0luX19IbzEsDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU2NfX1ksDQogICAgICAgICAgICAgICByZXNjb3JfX1NjX19CZSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU2NfX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19TY19fVGgsDQogICAgICAgICAgICAgICByZXNjb3JfX1NjX19IbzEsDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHJlc2Nvcl9fWV9fQmUsDQogICAgICAgICAgICAgICByZXNjb3JfX1lfX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19ZX19UaCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fWV9fSG8xLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICByZXNjb3JfX0JlX19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQmVfX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19CZV9fSG8xLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICByZXNjb3JfX0NvX19UaCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQ29fX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19UaF9fSG8xKSAlPiUgDQogIG11dGF0ZShJUyA9IHN0cl9zdWIoLnZhcmlhYmxlLCA5LCBlbmQgPSAxNikpICU+JQ0KICBzZXBhcmF0ZShJUywgYygiSVMxIiwgIklTMiIpKSAlPiUNCiAgc2VsZWN0KC5jaGFpbiwgLml0ZXJhdGlvbiwgLmRyYXcsIC52YXJpYWJsZSwgSVMxLCBJUzIsIC52YWx1ZSkgJT4lDQogIG11dGF0ZShJUzEgPSByZWNvZGVfZmFjdG9yKElTMSwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGluIHBsb3QgJT4lDQogIG11dGF0ZShJUzEgPSBmY3RfcmVsZXZlbChJUzEsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgbXV0YXRlKElTMiA9IHJlY29kZV9mYWN0b3IoSVMyLCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdCAlPiUNCiAgbXV0YXRlKElTMiA9IGZjdF9yZWxldmVsKElTMiwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IElTMiksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0wLjI1LCAxKSArDQogIGZhY2V0X3dyYXAofiBJUzEsIG5jb2wgPSAxMCkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChPbWVnYSkpKSArDQogIGdndGl0bGUoIlJlc2lkdWFsIGNvcnJlbGF0aW9ucyIpDQpgYGANClRoZSByZXNpZHVhbCBjb3JyZWxhdGlvbnMgYXJlIGZhaXJseSBsYXJnZSAoZS5nLiwgPiAwLjgpIGluIG1hbnkgY2FzZXMsIHBhcnRpY3VsYXJseSBiZXR3ZWVuIHRoZSArMSBtZXRob2RzLiBUaGVzZSBjb3JyZWxhdGlvbnMgc3VnZ2VzdCB3aGVyZSBzb3VyY2VzIG9mIHVuZXhwbGFpbmVkIHZhcmlhYmlsaXR5IG1heSBiZSBjb21tb24gYmV0d2VlbiBtZXRob2RzLg0KDQojIyMgUHJlZGljdGlvbnMNCk5leHQsIHRoZSBtb2RlbCB3YXMgdXNlZCB0byBtYWtlIG91dC1vZi1zYW1wbGUgcHJlZGljdGlvbnMgdG8gYSAibmV3IiBtYXRyaXgsIG9yIGRheSwgb3IgYm90aC4gSGVyZSwgIm5ldyIgcmVmZXJzIHRvIGFuIG91dC1vZi1zYW1wbGUgbWF0cml4IGFuZC9vciBkYXkgZnJvbSB0aGUgaHlwb3RoZXRpY2FsIGJyb2FkZXIgcG9wdWxhdGlvbiBvZiBtYXRyaWNlcyBvciBkYXlzLiBXaGVuIGNvbnNpZGVyaW5nIHByZWRpY3Rpb25zIHRvIGEgbmV3IG1hdHJpeCwgZm9yIGV4YW1wbGUsIHRoZSBwcmVkaWN0aW9uIGlzIGZvciBhbiBhdmVyYWdlIG1hdHJpeCBlc3RpbWF0ZWQgZnJvbSB0aGUgb2JzZXJ2ZWQgbWF0cmljZXMsIGFuZCBpbmNsdWRlcyB0aGUgdW5jZXJ0YWludHkgZXN0aW1hdGVkIGZyb20gdGhlIG9ic2VydmVkIG1hdHJpeCB0byBtYXRyaXggdmFyaWF0aW9uLiBJbiBjb250cmFzdCB0byB0aGUgY29uZGl0aW9uYWwgX21lYW5zXyBhYm92ZSwgdGhlIHByZWRpY3Rpb25zIGJlbG93IGluY29ycG9yYXRlIGJvdGggdGhlICRcbXUkIChleHBlY3RhdGlvbikgYW5kICRcc2lnbWEkIChzdGFuZGFyZCBkZXZpYXRpb24pIGNvbXBvbmVudHMgb2YgdGhlIGZpdHRlZCBtb2RlbC4gVGhhdCBpcywgdGhlIHByZWRpY3Rpb25zLCAkeV97bmV3fSQsIGFyZSBkcmF3biBmcm9tIA0KJCR5X3tuZXd9IFxzaW0gTihcaGF0e1xtdX0sIFxoYXR7XHNpZ21hfSkkJA0Kc28gdGhleSBpbmNsdWRlIGJvdGggcGFyYW1ldGVyIGFuZCBzYW1wbGluZyB1bmNlcnRhaW50eS4NCg0KIyMjIyBIeXBvdGhldGljYWwgZGF0YQ0KSHlwb3RoZXRpY2FsIGRhdGEgYXJlIGNyZWF0ZWQgYmVsb3cgdG8gaG9sZCB0aGUgY29uZGl0aW9ucyB0aGF0IHRoZSBtb2RlbCB3aWxsIHByZWRpY3QgdG8uIFRoZSBmaXJzdCBjb25kaXRpb24gaXMgZm9yIGEgIm5ldyIgZGF5LCBidXQgd2l0aCB0aGUgc2FtZSBtYXRyaXggYW5kIHR1bmUgY29uZGl0aW9ucyBhcyBvYnNlcnZlZC4gVGhlIG5ldyBkYXkgY2FuIGJlIGNvbnNpZGVyZWQgYXMgYW55IGRheSB0aGF0IG1pZ2h0IGJlbG9uZyB0byB0aGUgc2FtZSBwb3B1bGF0aW9uIGFzIHRoZSBvYnNlcnZlZCBkYXlzLiBBbiBhdmVyYWdlIGRheSwgYXNzdW1pbmcgdGhlIGRheXMgb2YgdGhpcyBleHBlcmltZW50IHdlcmUgZHJhd24gZnJvbSBhIGxhcmdlciBwb3B1bGF0aW9uIG9mIGRheXM7IGEgZnV0dXJlIG9yIHBhc3QgZGF5LCBmb3IgZXhhbXBsZS4NCg0KYGBge3IgbWF0cml4X2Zvcl9uZXdfZGF5LCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQoNCm5ld19kYXlfZGF0IDwtIGV4cGFuZF9ncmlkKG1hdHJpeCA9IGZhY3RvcihsZXZlbHMoZGZfbXZfYXMkbWF0cml4KSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfZXhwdCA9ICJuZXdfZGF5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmUgPSBmYWN0b3IoYygiTEhlIiwgIkhIZSIpKSkgJT4lDQogIG11dGF0ZSh0dW5lID0gcmVsZXZlbCh0dW5lLCByZWYgPSAiTEhlIikpDQoNCnNhdmUobmV3X2RheV9kYXQsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfZGF5X2RhdC5yZGEiKQ0KYGBgDQoNCmBgYHtyIHByaW50X21hdHJpeF9mb3JfbmV3X2RheSwgZWNobz1GQUxTRX0NCmxvYWQoICJmdWxsLWFuYWx5c2lzLWZpbGVzL25ld19kYXlfZGF0LnJkYSIgKQ0KcHJpbnQobmV3X2RheV9kYXQpDQpgYGANCg0KTmV4dCwgYSBoeXBvdGhldGljYWwgbmV3IG1hdHJpeCBmb3IgdGhlIG9ic2VydmVkIGRheXMgYW5kIHR1bmUgc2V0dGluZ3MuDQpgYGB7ciBkYXlfZm9yX25ld19tYXRyaXgsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfYXMucmRhIikNCg0KbmV3X21hdHJpeF9kYXQgPC0gZXhwYW5kX2dyaWQobWF0cml4ID0gZmFjdG9yKCJuZXdfbWF0cml4IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfZXhwdCA9IGZhY3RvcihsZXZlbHMoZGZfbXZfYXMkZGF5X2V4cHQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmUgPSBmYWN0b3IoYygiTEhlIiwgIkhIZSIpKSkgJT4lDQogIG11dGF0ZSh0dW5lID0gcmVsZXZlbCh0dW5lLCByZWYgPSAiTEhlIikpDQoNCnNhdmUobmV3X21hdHJpeF9kYXQsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfbWF0cml4X2RhdC5yZGEiKQ0KYGBgDQoNCmBgYHtyIHByaW50X2RheV9mb3JfbmV3X21hdHJpeCwgZWNobz1GQUxTRX0NCmxvYWQoICJmdWxsLWFuYWx5c2lzLWZpbGVzL25ld19tYXRyaXhfZGF0LnJkYSIgKQ0KcHJpbnQobmV3X21hdHJpeF9kYXQpDQpgYGANCg0KRmluYWxseSwgYSBuZXcgZGF5IGFuZCBtYXRyaXggZm9yIHRoZSBvYnNlcnZlZCB0dW5lIHNldHRpbmdzLg0KYGBge3IgcHJlZGljdF9uZXdfTmRfaXNfbW9kMV80LCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X2FzLnJkYSIpDQojIEluY2x1ZGUgcmVwbGljYXRlIG9ic2VydmF0aW9ucyBmb3IgZXN0aW1hdGluZyB1bmNlcnRhaW50eSBpbiBwcm9iYWJpbGl0eSB0byBvdmVyLWNvcnJlY3QNCm5ld19tYXRyaXhfZGF5X2RhdCA8LSBleHBhbmRfZ3JpZChtYXRyaXggPSBmYWN0b3IoIm5ld19tYXRyaXgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlfZXhwdCA9IGZhY3RvcigibmV3X2RheSIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1bmUgPSBmYWN0b3IoIGMoIkxIZSIsICJISGUiKSkpICU+JQ0KICBtdXRhdGUodHVuZSA9IHJlbGV2ZWwodHVuZSwgcmVmID0gIkxIZSIpKSANCg0Kc2F2ZShuZXdfbWF0cml4X2RheV9kYXQsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfbWF0cml4X2RheV9kYXQucmRhIikNCmBgYA0KDQpgYGB7ciBwcmludF9uZXdfbWF0cml4X2RheV9kYXRhLCBlY2hvPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfbWF0cml4X2RheV9kYXQucmRhIikNCnByaW50KG5ld19tYXRyaXhfZGF5X2RhdCkNCmBgYA0KDQojIyMjIERheQ0KVGhlIHByZWRpY3Rpb25zIGZvciB0aGUgb2JzZXJ2ZWQgZGF5cyBmb3IgYSBuZXcgbWF0cml4IGFyZSBiZWxvdy4NCmBgYHtyIHByZWRpY3RfbmV3X2RheSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19Bc19tdi5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfbWF0cml4X2RhdC5yZGEiKQ0KDQpwcmVkaWN0X25ld19tYXRyaXhfZGF0IDwtIG5ld19tYXRyaXhfZGF0ICU+JQ0KICBhZGRfcHJlZGljdGVkX2RyYXdzKG1vZDMsIA0KICAgICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSB+ICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25ld19sZXZlbHMgPSBUUlVFLCBjb3JlcyA9IDEpICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdA0KICBtdXRhdGUoZGF5X2V4cHQgPSByZWNvZGVfZmFjdG9yKGRheV9leHB0LCAiMzE2IiA9ICJEYXkgMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzIwIiA9ICJEYXkgMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMjEiID0gIkRheSAzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMzMCIgPSAiRGF5IDQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTEwIiA9ICJEYXkgNSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTExIiA9ICJEYXkgNiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MTUiID0gIkRheSA3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUxNiIgPSAiRGF5IDgiKSkgJT4lDQogIG11dGF0ZShtZXRob2QgPSBmY3RfcmVsZXZlbChtZXRob2QsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgbXV0YXRlKGRheV9leHB0ID0gZmN0X3JlbGV2ZWwoZGF5X2V4cHQsIGMoIkRheSAxIiwiRGF5IDIiLCJEYXkgMyIsIkRheSA0IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRheSA1IiwiRGF5IDYiLCJEYXkgNyIsIkRheSA4IikpKQ0KDQpzYXZlKHByZWRpY3RfbmV3X21hdHJpeF9kYXQsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9wcmVkaWN0X25ld19tYXRyaXhfZGF0LnJkYSIpDQpgYGANCg0KYGBge3IgcGxvdF9uZXdfZGF5X0FzLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03LjMzNiB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXQucmRhIikNCg0KcHJlZGljdF9uZXdfbWF0cml4X2RhdCAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnByZWRpY3Rpb24pKSArDQogIHN0YXRfc2xhYiggYWVzKHkgPSBtZXRob2QsIGNvbG9yID0gZGF5X2V4cHQgKSwgDQogICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgIGFscGhhID0gMC42LA0KICAgICAgICAgICAgIHNsYWJfdHlwZSA9ICJwZGYiDQogICAgICAgICAgICAgKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICdncmV5OTUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0zLCAyLCAxKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdncmF5JykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIHhsYWIoIlByZWRpY3RlZCBiaWFzIChwcGIpIikgKw0KICBnZ3RpdGxlKCJBcnNlbmljIikgKw0KICBmYWNldF93cmFwKH4gdHVuZSkNCmBgYA0KQXMgZXhwZWN0ZWQgZnJvbSBleGFtaW5pbmcgdGhlIGNvbmRpdGlvbmFsIG1lYW5zIGZvciAkXG11JCwgdGhlIG1vZGVsIHByZWRpY3RzIGEgaGlnaCBwcm9iYWJpbGl0eSBvZiByZWxhdGl2ZWx5IGV4dHJlbWUgb3Zlci1jb3JyZWN0aW9ucyBvbiAzLzMwIGZvciBhbGwgb2YgdGhlICsxIG1ldGhvZHMuIENvbnZlcnNlbHksIG5vbmUgb2YgdGhlICsyIG1ldGhvZCdzIHByZWRpY3Rpb25zIGluY2x1ZGVkIHRoaXMgcG9zc2liaWxpdHkuIFRoZSBwcmVkaWN0aW9ucyBmb3IgdGhlICsxIG1ldGhvZHMgYWxzbyBzdWdnZXN0IG11Y2ggbW9yZSBkYXkgdG8gZGF5IHZhcmlhYmlsaXR5IGluIGdlbmVyYWwuDQoNCkFzIHN1Z2dlc3RlZCBpbiB0aGUgY29uZGl0aW9uYWwgbWVhbnMgZm9yICRcc2lnbWEkLCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSArMSBhbmQgKzIgbWV0aG9kcyBhcmUgZ2VuZXJhbGx5IHByZWRpY3RlZCB0byBiZSBsb3dlciBmb3IgdGhlIExIZSB0dW5lLCB0aG91Z2ggdGhlIGRpZmZlcmVuY2UgaXMgbW9yZSBleHRyZW1lIGZvciB0aGUgKzEgbWV0aG9kcy4gVGhlIHN0YW5kYXJkIGRldmlhdGlvbiB3YXMgZ2VuZXJhbGx5IGxvd2VyIG9uIDMvMzAgZm9yIHRoZSArMiBtZXRob2RzIGFzIHdlbGwsIGNvbXBhcmVkIHRvIG90aGVyIGRheXMgd2l0aGluIG1ldGhvZC4NCg0KIyMjIyBNYXRyaXgNClRoZSBwcmVkaWN0aW9ucyB0byB0aGUgb2JzZXJ2ZWQgbWF0cmljZXMgZm9yIGEgbmV3IGRheSBpcyBiZWxvdy4NCmBgYHtyIHByZWRpY3RfbmV3X21hdHJpeCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19Bc19tdi5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9uZXdfZGF5X2RhdC5yZGEiKQ0KDQpwcmVkaWN0X25ld19kYXlfZGF0IDwtIG5ld19kYXlfZGF0ICU+JQ0KICBhZGRfcHJlZGljdGVkX2RyYXdzKCBtb2QzLCANCiAgICAgICAgICAgICAgICAgICAgICAgcmVfZm9ybXVsYSA9IH4gKDEgfCBtYXRyaXgpLA0KICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19uZXdfbGV2ZWxzID0gVFJVRSwgDQogICAgICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSApICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgZm9yIG1ldGhvZHMgaW4gcGxvdA0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIG11dGF0ZShtYXRyaXggPSByZWNvZGVfZmFjdG9yKG1hdHJpeCwgIm5lYXRfMSIgPSAiTTIrIFN0ZF8xIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWF0XzIiID0gIk0yKyBTdGRfMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWF0XzMiID0gIk0yKyBTdGRfMyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWF0XzQiID0gIk0yKyBTdGRfNCIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgZm9yIG1hdHJpeCBpbiBwbG90DQogIG11dGF0ZShtYXRyaXggPSBmY3RfcmVsZXZlbChtYXRyaXgsIGMoIkNhIiwiSyIsICJNZyIsICJOYSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIQ2wiLCAiUE80IiwgIlNPNCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNMisgU3RkXzEiLCAiTTIrIFN0ZF8yIiwgIk0yKyBTdGRfMyIsICJNMisgU3RkXzQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2F0ZXJfMSIsIndhdGVyXzMiLCAid2F0ZXJfNCIsICJ3YXRlcl81IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhdGVyXzYiLCAid2F0ZXJfNyIsICJ3YXRlcl84IiwgIndhdGVyXzkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXRlcl8xMCIsICJ3YXRlcl8xMSIsICJ3YXRlcl8xMiIpKSkgIyByZS1sZXZlbA0KDQpzYXZlKHByZWRpY3RfbmV3X2RheV9kYXQsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9wcmVkaWN0X25ld19kYXlfZGF0LnJkYSIpDQpgYGANCg0KYGBge3IgcGxvdF9uZXdfbWF0cml4X0FzLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ImNlbnRlciIsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03LjMzNn0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvcHJlZGljdF9uZXdfZGF5X2RhdC5yZGEiKQ0KDQpwcmVkaWN0X25ld19kYXlfZGF0ICU+JQ0KICBnZ3Bsb3QoIGFlcyggeCA9IC5wcmVkaWN0aW9uICkgKSArIA0KICBzdGF0X3NsYWIoIGFlcyh5ID0gbWV0aG9kLCBjb2xvciA9IG1hdHJpeCApLCANCiAgICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICAgYWxwaGEgPSAwLjYsDQogICAgICAgICAgICAgc2xhYl90eXBlID0gInBkZiINCiAgICAgICAgICAgICApICsNCiAgZ2VvbV92bGluZSggeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCggdmFsdWVzID0gYWxwaGEoIGMoICIjRkNGRkE0OTkiLCAiI0YyRTk2Nzk5IiwgIiNGNkQ1NDM5OSIsICIjRkFDMTI3OTkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNCRjM5NTI5OSIsICIjRDQ0ODQyOTkiLCAiI0U1NUMzMDk5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMDAwMDA0ODAiLCAiIzAwMDAwNDgwIiwgIiMwMDAwMDQ4MCIsICIjMDAwMDA0ODAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiLCAiIzMyMEE1RDgwIiwgIiMzMjBBNUQ4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiLCAiIzMyMEE1RDgwIiwgIiMzMjBBNUQ4MCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzMyMEE1RDgwIiwgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiKSwgMC41ICkgKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICdncmV5OTUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0zLCAyLCAxKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdncmF5JykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIHhsYWIoIlByZWRpY3RlZCBiaWFzIChwcGIpIiApICsNCiAgZ2d0aXRsZSgiQXJzZW5pYyIpICsNCiAgZmFjZXRfd3JhcCggfiB0dW5lKQ0KYGBgDQpNYXRyaXggdG8gbWF0cml4IHZhcmlhYmlsaXR5IGlzIHByZWRpY3RlZCB0byBiZSBsb3dlciB0aGFuIGRheSB0byBkYXksIGluIGdlbmVyYWwgYWNyb3NzIGFsbCBtZXRob2RzLiBXaXRoIHJlZ2FyZCB0byBhbnkgcGFydGljdWxhciBtYXRyaXgsIHRoZSBwcmVkaWN0aW9ucyBmb3Igc29tZSBvZiB0aGUgMjUwcHBtIG1hdHJpY2VzIGNvbnNpc3RlbnRseSBzdWdnZXN0IHBvc2l0aXZlIGJpYXMgZm9yICRUaCQsICRIb157KzF9JCwgYW5kICRJbiQgcmVsYXRpdmUgdG8gdGhlIG90aGVyIG1hdHJpY2VzIGluIHRob3NlIG1ldGhvZHMuIEZvciB0aGUgKzIgbWV0aG9kcywgdGhlIDI1MHBwbSAkU09fNCQgbWF0cml4IGlzIGNvbnNpc3RlbnRseSBwcmVkaWN0ZWQgd2l0aCBzb21ld2hhdCBoaWdoZXIgcHJvYmFiaWxpdHkgdG8gdW5kZXItY29ycmVjdCByZWxhdGl2ZSB0byBvdGhlciBtYXRyaWNlcy4gT3ZlcmFsbCBkaWZmZXJlbmNlcyBpbiBzdGFuZGFyZCBkZXZpYXRpb24gYnkgbWV0aG9kIGFyZSBhZ2FpbiBjbGVhciBpbiB0aGlzIGZpZ3VyZSwgd2l0aCAkVGgkIGFuZCAkSG9eeysxfSQgYmVpbmcgdGhlIGxlYXN0IHByZWNpc2UgcHJlZGljdGlvbnMuIFdpdGhpbiBtZXRob2QsIGRpZmZlcmVuY2VzIGR1ZSB0byB0dW5lIGFyZSBhZ2FpbiBhcHBhcmVudCwgd2l0aCB0aGUgSEhlIHR1bmUgZ2VuZXJhbGx5IHJlc3VsdGluZyBpbiBsZXNzIHByZWNpc2UgcHJlZGljdGlvbnMuIA0KDQojIyMjIE5ldyBkYXkgYW5kIG1hdHJpeA0KVGhlIHByZWRpY3Rpb25zIGZvciBhIG5ldyBkYXkgYW5kIG5ldyBtYXRyaXggZm9yIHRoZSBvYnNlcnZlZCB0dW5lIHNldHRpbmdzIGFyZSBiZWxvdy4gDQpgYGB7ciBwcmVkaWN0X25ld19kYXlfYW5kX21hdHJpeCwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19Bc19tdi5yZGEiKQ0KbG9hZCggImZ1bGwtYW5hbHlzaXMtZmlsZXMvbmV3X21hdHJpeF9kYXlfZGF0LnJkYSIgKQ0KDQpwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdCA8LSBuZXdfbWF0cml4X2RheV9kYXQgJT4lDQogIGFkZF9wcmVkaWN0ZWRfZHJhd3MoIG1vZDMsIA0KICAgICAgICAgICAgICAgICAgICAgICByZV9mb3JtdWxhID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25ld19sZXZlbHMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgY29yZXMgPSAxICkgICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgZm9yIG1ldGhvZHMgaW4gcGxvdA0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkNCg0Kc2F2ZShwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdCwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXlfZGF0LnJkYSIpDQpgYGANCg0KVGhlIHByb3BvcnRpb24gb2YgcG9zdGVyaW9yIHByZWRpY3Rpb24gc2FtcGxlcyB3aXRoIG92ZXItY29ycmVjdGlvbnMgZm9yIGVhY2ggY2FzZS4NCmBgYHtyIHByb2Jfb3ZlcmNvcnJlY3QsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXlfZGF0LnJkYSIpDQoNCnByb2Jfb3ZlciA8LSBwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdCAlPiUgDQogIG11dGF0ZShvdmVyID0gaWZlbHNlKC5wcmVkaWN0aW9uIDwgMC4wLCAxLCAwKSkgJT4lDQogIGdyb3VwX2J5KC5jYXRlZ29yeSwgdHVuZSkgJT4lDQogIHN1bW1hcmlzZShwX292ZXIgPSBzdW0ob3ZlcikgLyA2MDAwKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdA0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChtZXRob2QsIHR1bmUsIHBfb3ZlcikgJT4lDQogIG11dGF0ZShwX292ZXIgPSByb3VuZChwX292ZXIsIDIpKQ0KDQpzYXZlKHByb2Jfb3ZlciwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL3Byb2Jfb3Zlci5yZGEiKSANCg0KcHJpbnQocHJvYl9vdmVyKQ0KYGBgDQoNCg0KYGBge3IgcGxvdF9uZXdfZGF5X2FuZF9tYXRyaXhfQXMsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTcuMzM2fQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9wcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdC5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9wcm9iX292ZXIucmRhIikNCg0KcHJlZGljdF9uZXdfbWF0cml4X2RheV9kYXQgJT4lDQogIGdyb3VwX2J5KG1ldGhvZCwgbWF0cml4LCBkYXlfZXhwdCwgdHVuZSkgJT4lIA0KICAjc2FtcGxlX24oNjAwMCkgICU+JSAjIG9ubHkgbmVlZCAxIG9icyBwZXIgdHVuZSBmb3IgZWFjaCBtZXRob2QsIG1hdHJpeCwgZGF5DQogIGdncGxvdCggYWVzKCB4ID0gLnByZWRpY3Rpb24gKSApICsgDQogIHN0YXRfc2xhYihhZXMoeSA9IG1ldGhvZCwgY29sb3IgPSB0dW5lKSwgDQogICAgICAgICAgICBmaWxsID0gTkEsDQogICAgICAgICAgICBhbHBoYSA9IDAuNiwNCiAgICAgICAgICAgIHNsYWJfdHlwZSA9ICJwZGYiDQogICAgICAgICAgICApICsNCiAgZ2VvbV92bGluZSggeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICdncmV5OTUnLCBjb2xvdXIgPSAnYmxhY2snKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKC0zLCAyLCAxKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMC41LCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdncmF5JykgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLjUsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gcHJvYl9vdmVyLA0KICAgICAgICAgICAgYWVzKHggPSByZXAoMSwgMjApLCANCiAgICAgICAgICAgICAgICB5ID0gbWV0aG9kLCANCiAgICAgICAgICAgICAgICBncm91cCA9IHR1bmUsDQogICAgICAgICAgICAgICAgY29sb3IgPSB0dW5lLA0KICAgICAgICAgICAgICAgIGxhYmVsID1wX292ZXIpLA0KICAgICAgICAgICAgc2l6ZSA9IDMsDQogICAgICAgICAgICBudWRnZV95ID0gMC4yNSwNCiAgICAgICAgICAgIG51ZGdlX3ggPSAwLA0KICAgICAgICAgICAgbWluLnNlZ21lbnQubGVuZ3RoID0gSW5mKSArDQogIGdlb21fdmxpbmUoIHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICB4bGFiKCJQcmVkaWN0ZWQgYmlhcyAocHBiKSIgKSArDQogIGdndGl0bGUoIkFyc2VuaWMiKQ0KYGBgDQpJbiB0aGlzIGxhc3Qgc2V0IG9mIHByZWRpY3Rpb25zLCB0aGUgbW9zdCBjbGVhciB0YWtlYXdheXMgYXJlICgxKSB0aGUgdmFyaWF0aW9uIGluIHByZWNpc2lvbiBvZiB0aGUgcHJlZGljdGlvbnMgYWNyb3NzIHRoZSBkaWZmZXJlbnQgaW50ZXJuYWwgc3RhbmRhcmQgbWV0aG9kcyBhbmQgdHVuZXM7IGFuZCAoMikgdGhlIHZhcmlhdGlvbnMgaW4gdGhlIHByb3BvcnRpb24gb2Ygb3Zlci0gdnMuIHVuZGVyLWNvcnJlY3RlZCBkcmF3cyBmcm9tIHRoZSBwb3N0ZXJpb3IgcHJlZGljdGl2ZSBkaXN0cmlidXRpb24uIFRoZSBwcmVkaWN0aW9ucyBmb3IgdGhlICsyIG1ldGhvZHMgYXJlIGNsZWFybHkgbW9yZSBwcmVjaXNlIGFuZCB0aGVpciB0ZW5kZW5jeSB0byB1bmRlci1jb3JyZWN0LCBvbiBhdmVyYWdlLCBpcyBhbHNvIGNsZWFyLiBUaGUgcHJlZGljdGlvbnMgZm9yIHRoZSArMSBtZXRob2RzLCBieSBjb21wYXJpc29uLCBhcmUgbXVjaCBsZXNzIHByZWNpc2UgYW5kIHRoZSBiaWFzIGlzIHR5cGljYWxseSBlaXRoZXIgbWluaW1hbCB0byBtb3JlIGluIHRoZSBkaXJlY3Rpb24gb2Ygb3Zlci1jb3JyZWN0aW9uLiBPdmVyYWxsLCB0aGUgSEhlIHR1bmUgc2V0dGluZyBpcyBjb25zaXN0ZW50bHkgcHJlZGljdGVkIHdpdGggbGVzcyBwcmVjaXNpb24gYWNyb3NzIGFsbCBvZiB0aGUgbWV0aG9kcy4NCg0KIyBBIGZpbmFsIG1vZGVsIGZvciBzZWxlbml1bQ0KVGhlIGZpbmFsIG1vZGVsIGZvciBhcnNlbmljIGlzIGFsc28gYXBwbGllZCB0byB0aGUgc2VsZW5pdW0gb2JzZXJ2YXRpb25zIGluIHRoZSBmb2xsb3dpbmcgYW5hbHlzZXMuIEluIHRoaXMgbW9kZWwsIHRoZSBwcmlvcnMgb24gZml4ZWQgaW50ZXJjZXBzIGFuZCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBmb3IgdGhlIHZhcnlpbmcgaW50ZXJjZXB0cyB3ZXJlIGFkanVzdGVkIHVwd2FyZCBieSBhIGZhY3RvciBvZiAxMCB0byBhY2NvdW50IGZvciB0aGUgZGlmZmVyZW5jZSBpbiBzY2FsZS4NCmBgYHtyIGZpdF9tb2QzX3NlLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X3NlLnJkYSIpDQoNCmJmX1N0ZCA8LSBiZihTdGQgfiB0dW5lICsgKHR1bmUgfCBtYXRyaXgpICsgKHR1bmUgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgc2lnbWEgfiB0dW5lICsgKDEgfCBtYXRyaXgpICsgKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgZmFtaWx5ID0gZ2F1c3NpYW4oKSkNCg0KYmZfQWx0IDwtIGJmKEFsdCB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9IbzIgPC0gYmYoSG8yIH4gdHVuZSArICh0dW5lIHwgbWF0cml4KSArICh0dW5lIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX0luIDwtIGJmKEluIH4gdHVuZSArICh0dW5lIHwgbWF0cml4KSArICh0dW5lIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX1NjIDwtIGJmKFNjIH4gdHVuZSArICh0dW5lIHwgbWF0cml4KSArICh0dW5lIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCmJmX1kgPC0gYmYoWSB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9CZSA8LSBiZihCZSB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9DbyA8LSBiZihDbyB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9UaCA8LSBiZihUaCB+IHR1bmUgKyAodHVuZSB8IG1hdHJpeCkgKyAodHVuZSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBzaWdtYSB+IHR1bmUgKyAoMSB8IG1hdHJpeCkgKyAoMSB8IGRheV9leHB0KSwNCiAgICAgICAgICAgICBmYW1pbHkgPSBnYXVzc2lhbigpKQ0KDQpiZl9IbzEgPC0gYmYoSG8xIH4gdHVuZSArICh0dW5lIHwgbWF0cml4KSArICh0dW5lIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIHNpZ21hIH4gdHVuZSArICgxIHwgbWF0cml4KSArICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgIGZhbWlseSA9IGdhdXNzaWFuKCkpDQoNCm1vZDMgPC0gYnJtKGJmX1N0ZCArIA0KICAgICAgICAgICAgICBiZl9BbHQgKyANCiAgICAgICAgICAgICAgYmZfSG8yICsgDQogICAgICAgICAgICAgIGJmX0luICsgDQogICAgICAgICAgICAgIGJmX1NjICsgDQogICAgICAgICAgICAgIGJmX1kgKyANCiAgICAgICAgICAgICAgYmZfQmUgKyANCiAgICAgICAgICAgICAgYmZfQ28gKyANCiAgICAgICAgICAgICAgYmZfVGggKyANCiAgICAgICAgICAgICAgYmZfSG8xICsgDQogICAgICAgICAgICAgIHNldF9yZXNjb3IoVFJVRSksDQogIGRhdGEgPSBkZl9tdl9zZSwgDQogIHByaW9yID0gYyhwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiSG8yIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCByZXNwID0gIlkiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiVGgiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gIkludGVyY2VwdCIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiQWx0IiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJTYyIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCByZXNwID0gIkNvIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJiIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJTdGQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJJbiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkJlIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAic2QiLCByZXNwID0gIkhvMSIpLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMiwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDIsIDEpLCBjbGFzcyA9ICJJbnRlcmNlcHQiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgyLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8yIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMiwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMiwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMiwgMSksIGNsYXNzID0gIkludGVyY2VwdCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlkiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgyLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgyLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgyLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiVGgiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgyLCAxKSwgY2xhc3MgPSAiSW50ZXJjZXB0IiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgICANCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJTdGQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJIbzIiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJJbiIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiWSIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkJlIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJiIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gImIiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJUaCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAiYiIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkhvMSIpLA0KICAgICAgICAgICAgDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlN0ZCIpLA0KICAgICAgICAgICAgcHJpb3Iobm9ybWFsKDAsIDEwKSwgY2xhc3MgPSAic2QiLCBkcGFyID0gInNpZ21hIiwgcmVzcCA9ICJBbHQiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8yIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIkluIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlNjIiksDQogICAgICAgICAgICBwcmlvcihub3JtYWwoMCwgMTApLCBjbGFzcyA9ICJzZCIsIGRwYXIgPSAic2lnbWEiLCByZXNwID0gIlkiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQmUiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiQ28iKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiVGgiKSwNCiAgICAgICAgICAgIHByaW9yKG5vcm1hbCgwLCAxMCksIGNsYXNzID0gInNkIiwgZHBhciA9ICJzaWdtYSIsIHJlc3AgPSAiSG8xIiksDQogICAgICAgICAgDQogICAgICAgICAgICBwcmlvcihsa2ooMSksIGNsYXNzID0gInJlc2NvciIpDQogICAgICAgICAgICApLA0KICBjb250cm9sID0gbGlzdChhZGFwdF9kZWx0YSA9IDAuOTUsIG1heF90cmVlZGVwdGggPSAxNCksDQogIGluaXRfciA9IDAuMDUsDQogIHNhdmVfcGFycyA9IHNhdmVfcGFycyhhbGwgPSBUUlVFKSwNCiAgc2VlZCA9IDUyMTQsDQogIGNoYWlucz00LA0KICBpdGVyPTMwMDAsDQogIGNvcmVzPTQgKQ0KDQpzYXZlKG1vZDMsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQpgYGANCg0KIyMgVGFidWxhciBwYXJhbWV0ZXIgZXN0aW1hdGVzDQpBZ2FpbiwgYSBzdW1tYXJ5IG9mIHRoZSBwb3N0ZXJpb3IgZXN0aW1hdGVzLg0KYGBge3IgcHJpbnRfbW9kXzNfc2UsIGVjaG89RkFMU0V9DQpsb2FkKCAiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIgKQ0KcHJpbnQobW9kMywgcHJpb3IgPSBUUlVFKQ0KYGBgDQpBZ2FpbiwgdGhlIEhNQyBzYW1wbGluZyBsb29rcyB0byBoYXZlIGdvbmUgd2VsbC4NCg0KIyMgTW9kZWwgY2hlY2tzDQpOZXh0LCB0aGUgY2hlY2tzIGZvciB0aGUgc2VsZW5pdW0gbW9kZWwuDQoNCiMjIyBEZW5zaXR5IG92ZXJsYXkNCmBgYHtyIHBwY19kZW5zX292ZXJsYXlfM19zZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQoNCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJTdGQiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkFsdCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImFsdC5pc290b3BlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8yIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJJbiIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkluIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiU2MiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJTYyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIlkiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJZIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiQmUiLCBuc2FtcGxlcyA9IDIwLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJCZSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJkZW5zX292ZXJsYXkiLCByZXNwID0gIkNvIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQ28iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAiZGVuc19vdmVybGF5IiwgcmVzcCA9ICJUaCIsIG5zYW1wbGVzID0gMjAsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlRoIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gImRlbnNfb3ZlcmxheSIsIHJlc3AgPSAiSG8xIiwgbnNhbXBsZXMgPSAyMCwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIxKyIpKSANCmBgYA0KSW4gdGhpcyBjaGVjaywgY29tcGFyZWQgdG8gdGhlIHNhbWUgb25lIGZvciBhcnNlbmljLCBhbmQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHBlcmhhcHMgJFRoJCBhbmQgJEhvXnsrMX0kLCB0aGUgc2FtZSBtb2RlbCBzdHJ1Y3R1cmUgYXBwZWFycyB0byBiZSBkb2luZyBhIGJldHRlciBqb2Igb2YgcmVwbGljYXRpbmcgdGhlIG9ic2VydmVkIGRhdGEuDQoNCiMjIyBNZWRpYW4NCk5leHQgaXMgYSBjaGVjayBjb21wYXJpbmcgcmVwbGljYXRlZCBtZWRpYW5zIHRvIHRoZSBvYnNlcnZlZCBtZWRpYW5zLiANCmBgYHtyIHBwY19tZWRpYW5fM19zZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD02LCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQoNCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJTdGQiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIkFsdCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImFsdC5pc290b3BlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiSG8yIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJJbiIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkluIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiU2MiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJTYyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIlkiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJZIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiQmUiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJCZSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtZWRpYW4iLCByZXNwID0gIkNvIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQ28iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWVkaWFuIiwgcmVzcCA9ICJUaCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlRoIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1lZGlhbiIsIHJlc3AgPSAiSG8xIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIxKyIpKSANCmBgYA0KVGhpcyBjaGVjayBkb2Vzbid0IHN1Z2dlc3QgYW55IGdsYXJpbmcgaXNzdWVzLg0KDQojIyMgTWluDQpOZXh0IGlzIGEgY2hlY2sgY29tcGFyaW5nIHJlcGxpY2F0ZWQgbWlucyB0byB0aGUgb2JzZXJ2ZWQgbWlucy4gDQpgYGB7ciBwcGNfbWluXzNfc2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9NiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiU3RkIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiaW4tc2FtcGxlIikNCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJBbHQiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJhbHQuaXNvdG9wZSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIkhvMiIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiSW4iLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJJbiIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIlNjIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiU2MiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJZIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiWSIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIkJlIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiQmUiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWluIiwgcmVzcCA9ICJDbyIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkNvIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1pbiIsIHJlc3AgPSAiVGgiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJUaCIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtaW4iLCByZXNwID0gIkhvMSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMSsiKSkgDQpgYGANClRoaXMgY2hlY2sgbG9vayBnb29kIGZvciBtb3N0IG9mIHRoZSBtZXRob2RzLCBidXQgdGhlIGNoZWNrcyBmb3IgJEluJCwgJFkkLCAkVGgkLCBhbmQgJEhvXnsrMX0kIGVhY2ggc3VnZ2VzdCB0aGF0IHRoZSBtb2RlbCBpcyBjb25zaXN0ZW50bHkgZ2VuZXJhdGluZyBhIGxpZ2h0ZXIgbGVmdCB0YWlsIGNvbXBhcmVkIHRvIHRoZSBvYnNlcnZlZCBkYXRhLiANCg0KIyMjIE1heA0KTmV4dCBpcyBhIGNoZWNrIGNvbXBhcmluZyByZXBsaWNhdGVkIG1heHMgdG8gdGhlIG9ic2VydmVkIG1heHMuIA0KYGBge3IgcHBjX21heF8zX3NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTYsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfU2VfbXYucmRhIikNCg0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIlN0ZCIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoImluLXNhbXBsZSIpDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiQWx0IiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiYWx0Lmlzb3RvcGUiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJIbzIiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIkluIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiSW4iKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJTYyIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlNjIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiWSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIlkiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJCZSIsIGNvcmVzID0gMSkgKyB0aGVtZV90aWR5YmF5ZXMoKSArIGdndGl0bGUoIkJlIikgDQpwcF9jaGVjayhtb2QzLCB0eXBlID0gInN0YXQiLCBzdGF0ID0gIm1heCIsIHJlc3AgPSAiQ28iLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKCJDbyIpIA0KcHBfY2hlY2sobW9kMywgdHlwZSA9ICJzdGF0Iiwgc3RhdCA9ICJtYXgiLCByZXNwID0gIlRoIiwgY29yZXMgPSAxKSArIHRoZW1lX3RpZHliYXllcygpICsgZ2d0aXRsZSgiVGgiKSANCnBwX2NoZWNrKG1vZDMsIHR5cGUgPSAic3RhdCIsIHN0YXQgPSAibWF4IiwgcmVzcCA9ICJIbzEiLCBjb3JlcyA9IDEpICsgdGhlbWVfdGlkeWJheWVzKCkgKyBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjErIikpIA0KYGBgDQpUaGlzIGNoZWNrIGxvb2tzIHByZXR0eSByZWFzb25hYmxlIHdpdGggcmVnYXJkIHRvIHRoZSBtb2RlbCdzIGFiaWxpdHkgdG8gcmVwbGljYXRlIHRoZSBtYXggZm9yIGFsbCBtZXRob2RzLg0KDQojIyBQb3N0ZXJpb3IgaW5mZXJlbmNlcw0KTmV4dCwgdGhlIHBvc3RlcmlvciBpbmZlcmVuY2VzIGZyb20gdGhlIHNlbGVuaXVtIG1vZGVsLg0KDQojIyMgQ29uZGl0aW9uYWwgbWVhbnMNClRoZSBjb25kaXRpb25hbCBtZWFucyBlc3RpbWF0ZWQgZm9yIHRoZSBzZWxlbml1bSBwb3J0aW9uIG9mIHRoZSBleHBlcmltZW50IGFyZSBiZWxvdy4NCg0KIyMjIyAkXG11JA0KRmlyc3QsIHRoZSBlc3RpbWF0ZWQgY29uZGl0aW9uYWwgbWVhbnMgZm9yIHRoZSAkXG11JCBjb21wb25lbnQgb2YgdGhlIG1vZGVsLg0KDQojIyMjIyBUdW5lDQpFc3RpbWF0ZSBtZWFucyBjb25kaXRpb25hbCBvbiBtZXRob2QgYW5kIHR1bmUgd2hpbGUgbWFyZ2luYWxpemluZyBvdmVyIG1hdHJpeCBhbmQgZGF5Lg0KYGBge3IgY29uZGl0aW9uYWxfbWVhbnNfbWV0aG9kX3R1bmVfc2UsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KZml0dGVkX21ldGhvZF90dW5lX3NlIDwtIGRmX212X3NlICU+JQ0KICBhZGRfZml0dGVkX2RyYXdzKG1vZDMsIA0KICAgICAgICAgICAgICAgICAgIGRwYXIgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgcmVfZm9ybXVsYSA9IE5BLA0KICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSkNCnNhdmUoZml0dGVkX21ldGhvZF90dW5lX3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX21ldGhvZF90dW5lX3NlLnJkYSIpDQpgYGANCg0KYGBge3IgcG9zdGVyaW9yX3Bsb3RfbWV0aG9kX3R1bmVfU2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9tZXRob2RfdHVuZV9zZS5yZGEiKQ0KDQptdV9TdGQgPC0gZml0dGVkX21ldGhvZF90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiU3RkIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiaW4tc2FtcGxlIikNCg0KbXVfQWx0IDwtIGZpdHRlZF9tZXRob2RfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkFsdCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0KbXVfSG8yIDwtIGZpdHRlZF9tZXRob2RfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkNCg0KbXVfSW4gPC0gZml0dGVkX21ldGhvZF90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSW4iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJJbiIpDQoNCm11X1NjIDwtIGZpdHRlZF9tZXRob2RfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlNjIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQptdV9ZIDwtIGZpdHRlZF9tZXRob2RfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJZIikNCg0KbXVfQmUgPC0gZml0dGVkX21ldGhvZF90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQmUiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIkJlIikNCg0KbXVfQ28gPC0gZml0dGVkX21ldGhvZF90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQ28iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0KbXVfVGggPC0gZml0dGVkX21ldGhvZF90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiVGgiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIlRoIikNCg0KbXVfSG8xIDwtIGZpdHRlZF9tZXRob2RfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIrMSIpKQ0KDQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShtdV9TdGQsIG11X0FsdCwgbXVfSG8yLCBtdV9JbiwgbXVfU2MsIG11X1ksIG11X0JlLCBtdV9DbywgbXVfVGgsIG11X0hvMSwgbmNvbCA9IDUpDQpgYGANCg0KIyMjIyMgRGF5DQpFc3RpbWF0ZSBtZWFucyBjb25kaXRpb25hbCBvbiBtZXRob2QgYW5kIGRheSBhZnRlciBtYXJnaW5hbGl6aW5nIG92ZXIgbWF0cml4Lg0KYGBge3IgY29uZGl0aW9uYWxfbWVhbnNfbWV0aG9kX2RheV9zZSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQpmaXR0ZWRfbWV0aG9kX2RheV9zZSA8LSBkZl9tdl9zZSAlPiUNCiAgYWRkX2ZpdHRlZF9kcmF3cyhtb2QzLCANCiAgICAgICAgICAgICAgICAgICBkcGFyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSB+ICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSkNCnNhdmUoZml0dGVkX21ldGhvZF9kYXlfc2UsIGZpbGUgPSAiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfbWV0aG9kX2RheV9zZS5yZGEiKQ0KYGBgDQoNCmBgYHtyIHBvc3Rlcmlvcl9wbG90X21ldGhvZF9kYXlfc2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9tZXRob2RfZGF5X3NlLnJkYSIpDQoNCm11X1N0ZCA8LSBmaXR0ZWRfbWV0aG9kX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlN0ZCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMTApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQptdV9BbHQgPC0gZml0dGVkX21ldGhvZF9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDEwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiYWx0Lmlzb3RvcGUiKQ0KDQptdV9IbzIgPC0gZml0dGVkX21ldGhvZF9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzIiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDEwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIyKyIpKQ0KDQptdV9JbiA8LSBmaXR0ZWRfbWV0aG9kX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkluIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAxMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0KbXVfU2MgPC0gZml0dGVkX21ldGhvZF9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMTApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJTYyIpDQoNCm11X1kgPC0gZml0dGVkX21ldGhvZF9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJZIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAxMCkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIlkiKQ0KDQptdV9CZSA8LSBmaXR0ZWRfbWV0aG9kX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkJlIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAxMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQptdV9DbyA8LSBmaXR0ZWRfbWV0aG9kX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAxMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQ28iKQ0KDQptdV9UaCA8LSBmaXR0ZWRfbWV0aG9kX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlRoIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAxMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiVGgiKQ0KDQptdV9IbzEgPC0gZml0dGVkX21ldGhvZF9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzEiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDEwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG11X1N0ZCwgbXVfQWx0LCBtdV9IbzIsIG11X0luLCBtdV9TYywgbXVfWSwgbXVfQmUsIG11X0NvLCBtdV9UaCwgbXVfSG8xLCBuY29sID0gNSkNCmBgYA0KVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgdGhlIGNvbnNpc3RlbnQgb3Zlci1jb3JyZWN0aW9ucyAoaS5lLCBuZWdhdGl2ZSBiaWFzKSBleHBlY3RlZCBmb3IgYWxsIG9mIHRoZSAkKzEkIG1ldGhvZHMgYWNyb3NzIGFsbCBkYXlzIGZvciBib3RoIHR1bmUgc2V0dGluZ3MsIHdpdGggc29tZSBleGNlcHRpb25zIGhlcmUgYW5kIHRoZXJlIChlLmcuLCAkU2MkLCBISGUsIDMvMjApLiBGb3IgdGhvc2UgbWV0aG9kcywgMy8zMCBhbHNvIHN0YW5kcyBvdXQgd2l0aCBhbiBldmVuIG1vcmUgZXh0cmVtZSBvdmVyLWNvcnJlY3Rpb25zLiBCeSBjb21wYXJpc29uLCB0aGUgbWVhbnMgZm9yIHRoZSAkKzIkIG1ldGhvZHMgYXJlIHJlbGF0aXZlbHkgY29uc2lzdGVudCBhY3Jvc3MgdGhlIGRheXMgb2YgdGhlIGV4cGVyaW1lbnQsIHBhcnRpY3VsYXJseSBmb3IgdGhlIGluLXNhbXBsZSBtZXRob2QuIEFsc28gbm90ZSB0aGF0LCByZWxhdGl2ZSB0byB0aGUgYXJzZW5pYyBlc3RpbWF0ZXMsIHRoZSArMiBtZXRob2RzIHRlbmQgdG8gaGF2ZSBmZXdlciBlc3RpbWF0ZWQgdW5kZXItY29ycmVjdGlvbnMgKGkuZS4sIHBvc2l0aXZlIGJpYXMpIGVzdGltYXRlZCBhY3Jvc3MgZGF5cywgYW5kIHRoZSBhbHRlcm5hdGl2ZSBpc290b3BlIGFuZCAkSG9eeysyfSQgbWV0aG9kcyBhY3R1YWxseSBhcmUgZXN0aW1hdGVkIHRvIGhhdmUgbW9yZSBvdmVyLWNvcnJlY3Rpb25zLiBBZ2FpbiwgdGhlIGluLXNhbXBsZSBtZXRob2QgaXMgZ2VuZXJhbGx5IGVzdGltYXRlZCB0byBiZSB1bmJpYXNlZCBhY3Jvc3MgZGF5cywgd2l0aCBhbG1vc3QgbmVnbGlnaWJsZSB2YXJpYXRpb24uDQoNClRoZSB0dW5lIGVmZmVjdHMsIG92ZXJhbGwsIGxvb2sgbmVnbGlnaWJsZSB3aXRoaW4gZGF5cyBmb3IgYWxsIG9mIHRoZSArMiBtZXRob2RzLiBUaGVyZSBtYXkgYmUgc29tZSBkaWZmZXJlbmNlcyBkdWUgdG8gdHVuZSBzZXR0aW5nLCB3aXRoaW4gZGF5cywgZm9yIHRoZSArMSBtZXRob2RzLCBidXQgdGhvc2UgZGlmZmVyZW5jZXMgd291bGQgYmUgZmFpcmx5IGhhcmQgdG8gYXNjZXJ0YWluIHdpdGggaGlnaCBjZXJ0YWludHkuDQoNCiMjIyMjIE1hdHJpeA0KRXN0aW1hdGUgbWVhbnMgY29uZGl0aW9uYWwgb24gbWV0aG9kIGFuZCBtYXRyaXggYWZ0ZXIgbWFyZ2luYWxpemluZyBvdmVyIGRheS4NCmBgYHtyIGNvbmRpdGlvbmFsX21lYW5zX21ldGhvZF9tYXRyaXhfc2UsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KDQpmaXR0ZWRfbWV0aG9kX21hdHJpeF9zZSA8LSBkZl9tdl9zZSAlPiUNCiAgYWRkX2ZpdHRlZF9kcmF3cyhtb2QzLCANCiAgICAgICAgICAgICAgICAgICBkcGFyID0gRkFMU0UsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSB+ICgxIHwgbWF0cml4KSwNCiAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEpDQpzYXZlKGZpdHRlZF9tZXRob2RfbWF0cml4X3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX21ldGhvZF9tYXRyaXhfc2UucmRhIikNCmBgYA0KDQpgYGB7ciBwb3N0ZXJpb3JfcGxvdF9tZXRob2RfbWF0cml4X3NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX21ldGhvZF9tYXRyaXhfc2UucmRhIikNCg0KbXVfU3RkIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiU3RkIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQptdV9BbHQgPC0gZml0dGVkX21ldGhvZF9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0KbXVfSG8yIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8yIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCm11X0luIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSW4iKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0KbXVfU2MgPC0gZml0dGVkX21ldGhvZF9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQptdV9ZIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiWSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCm11X0JlIDwtIGZpdHRlZF9tZXRob2RfbWF0cml4X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiQmUiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oLTMwLCAyMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KG11KSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQptdV9DbyA8LSBmaXR0ZWRfbWV0aG9kX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IC52YWx1ZSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKC0zMCwgMjApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChtdSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0KbXVfVGggPC0gZml0dGVkX21ldGhvZF9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJUaCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCm11X0hvMSA8LSBmaXR0ZWRfbWV0aG9kX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAudmFsdWUpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMzAsIDIwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQobXUpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKG11X1N0ZCwgbXVfQWx0LCBtdV9IbzIsIG11X0luLCBtdV9TYywgbXVfWSwgbXVfQmUsIG11X0NvLCBtdV9UaCwgbXVfSG8xLCBuY29sID0gNSkNCmBgYA0KVGhlIGVzdGltYXRlcyB2YXJ5IHZlcnkgbGl0dGxlIGJ5IG1hdHJpeCBmb3IgYWxsIG9mIHRoZSBtZXRob2RzLiBBZ2FpbiwgdGhlIGdlbmVyYWwgcGF0dGVybiBvZiBvdmVyLWNvcnJlY3Rpb24gZm9yIHRoZSArMSBtZXRob2RzIGFuZCBtaW5pbWFsIGJpYXMgZm9yIHRoZSArMiBtZXRob2RzIGlzIGNsZWFyLiBBZ2FpbiwgdGhlIHR1bmUgZWZmZWN0cyBsb29rIHRvIGJlIHVuY2VydGFpbiB0byBtaW5pbWFsLg0KDQojIyMjICRcc2lnbWEkDQpOZXh0LCB0aGUgY29uZGl0aW9uYWwgbWVhbnMgZm9yIHRoZSAkXHNpZ21hJCBjb21wb25lbnQgb2YgdGhlIG1vZGVsLg0KDQojIyMjIyBUdW5lDQpgYGB7ciBjb25kaXRpb25hbF9zaWdtYV90dW5lX3NlLCBldmFsPUZBTFNFLCBpbmNsdWRlPVRSVUV9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X3NlLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfU2VfbXYucmRhIikNCg0KZml0dGVkX3NpZ21hX3R1bmVfc2UgPC0gZGZfbXZfc2UgJT4lDQogIGFkZF9maXR0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgZHBhciA9ICJzaWdtYSIsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBOQSwNCiAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEpDQpzYXZlKGZpdHRlZF9zaWdtYV90dW5lX3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX3NpZ21hX3R1bmVfc2UucmRhIikNCmBgYA0KDQpUaGUgZXhwZWN0ZWQgc3RhbmRhcmQgZGV2aWF0aW9ucyBieSBkYXkgYWZ0ZXIgbWFyZ2luYWxpemluZyBvdmVyIG1hdHJpeCBhcmUgYmVsb3cuDQpgYGB7ciBwb3N0ZXJpb3JfcGxvdF9zaWdtYV90dW5lX3NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTEwfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9maXR0ZWRfc2lnbWFfdHVuZV9zZS5yZGEiKQ0KDQpzaWdtYV9TdGQgPC0gZml0dGVkX3NpZ21hX3R1bmVfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTdGQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJpbi1zYW1wbGUiKQ0KDQpzaWdtYV9BbHQgPC0gZml0dGVkX3NpZ21hX3R1bmVfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJhbHQuaXNvdG9wZSIpDQoNCnNpZ21hX0hvMiA8LSBmaXR0ZWRfc2lnbWFfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkNCg0Kc2lnbWFfSW4gPC0gZml0dGVkX3NpZ21hX3R1bmVfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJJbiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIkluIikNCg0Kc2lnbWFfU2MgPC0gZml0dGVkX3NpZ21hX3R1bmVfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoIlNjIikNCg0Kc2lnbWFfWSA8LSBmaXR0ZWRfc2lnbWFfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJZIikNCg0Kc2lnbWFfQmUgPC0gZml0dGVkX3NpZ21hX3R1bmVfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJCZSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gdHVuZSwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiQmUiKQ0KDQpzaWdtYV9DbyA8LSBmaXR0ZWRfc2lnbWFfdHVuZV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJDbyIpDQoNCnNpZ21hX1RoIDwtIGZpdHRlZF9zaWdtYV90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiVGgiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IHR1bmUsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIlRoIikNCg0Kc2lnbWFfSG8xIDwtIGZpdHRlZF9zaWdtYV90dW5lX3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8xIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSB0dW5lLCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIisxIikpDQoNCmdyaWRFeHRyYTo6Z3JpZC5hcnJhbmdlKHNpZ21hX1N0ZCwgc2lnbWFfQWx0LCBzaWdtYV9IbzIsIHNpZ21hX0luLCBzaWdtYV9TYywgc2lnbWFfWSwgc2lnbWFfQmUsIHNpZ21hX0NvLCBzaWdtYV9UaCwgc2lnbWFfSG8xLCBuY29sID0gNSkNCmBgYA0KDQojIyMjIyBEYXkNCmBgYHtyIGNvbmRpdGlvbmFsX3NpZ21hX2RheV9zZSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQoNCmZpdHRlZF9zaWdtYV9kYXlfc2UgPC0gZGZfbXZfc2UgJT4lDQogIGFkZF9maXR0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgZHBhciA9ICJzaWdtYSIsIA0KICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSBzaWdtYSB+ICgxIHwgZGF5X2V4cHQpLA0KICAgICAgICAgICAgICAgICAgIGNvcmVzID0gMSkNCnNhdmUoZml0dGVkX3NpZ21hX2RheV9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9zaWdtYV9kYXlfc2UucmRhIikNCmBgYA0KDQpUaGUgZXhwZWN0ZWQgc3RhbmRhcmQgZGV2aWF0aW9ucyBieSBkYXkgYWZ0ZXIgbWFyZ2luYWxpemluZyBvdmVyIG1hdHJpeCBhcmUgYmVsb3cuDQpgYGB7ciBwb3N0ZXJpb3JfcGxvdF9zaWdtYV9kYXlfc2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD04LCBmaWcud2lkdGg9MTB9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2RmX212X3NlLnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL2ZpdHRlZF9zaWdtYV9kYXlfc2UucmRhIikNCg0Kc2lnbWFfU3RkIDwtIGZpdHRlZF9zaWdtYV9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTdGQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiaW4tc2FtcGxlIikNCg0Kc2lnbWFfQWx0IDwtIGZpdHRlZF9zaWdtYV9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiYWx0Lmlzb3RvcGUiKQ0KDQpzaWdtYV9IbzIgPC0gZml0dGVkX3NpZ21hX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkhvMiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKGV4cHJlc3Npb24oSG9eIjIrIikpDQoNCnNpZ21hX0luIDwtIGZpdHRlZF9zaWdtYV9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJJbiIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJJbiIpDQoNCnNpZ21hX1NjIDwtIGZpdHRlZF9zaWdtYV9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJTYyIpDQoNCnNpZ21hX1kgPC0gZml0dGVkX3NpZ21hX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlkiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiWSIpDQoNCnNpZ21hX0JlIDwtIGZpdHRlZF9zaWdtYV9kYXlfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJCZSIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gZGF5X2V4cHQsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkJlIikNCg0Kc2lnbWFfQ28gPC0gZml0dGVkX3NpZ21hX2RheV9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZSgiQ28iKQ0KDQpzaWdtYV9UaCA8LSBmaXR0ZWRfc2lnbWFfZGF5X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiVGgiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IGRheV9leHB0LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJUaCIpDQoNCnNpZ21hX0hvMSA8LSBmaXR0ZWRfc2lnbWFfZGF5X3NlICU+JSANCiAgZmlsdGVyKC5jYXRlZ29yeSA9PSAiSG8xIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBkYXlfZXhwdCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIrMSIpKQ0KDQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShzaWdtYV9TdGQsIHNpZ21hX0FsdCwgc2lnbWFfSG8yLCBzaWdtYV9Jbiwgc2lnbWFfU2MsIHNpZ21hX1ksIHNpZ21hX0JlLCBzaWdtYV9Dbywgc2lnbWFfVGgsIHNpZ21hX0hvMSwgbmNvbCA9IDUpDQpgYGANClN0YW5kYXJkIGRldmlhdGlvbiBpcyBlc3RpbWF0ZWQgdG8gdmFyeSBjb25zaWRlcmFibHkgZnJvbSBkYXkgdG8gZGF5IGZvciBzb21lIG9mIHRoZSArMSBtZXRob2RzLiBNdWNoIG9mIHRoYXQgdmFyaWFiaWxpdHksIGhvd2V2ZXIsIGlzIGF0dHJpYnV0ZWQgdG8gdGhlIGxhcmdlIGRldmlhdGlvbiBvbiAzLzMwLiBJbnRlcmVzdGluZ2x5LCBhbmQgaW4gY29udHJhc3QgdG8gdGhlIGFyc2VuaWMgZGF0YSwgdGhhdCAzLzMwIGVmZmVjdCBpc24ndCBpbmRpY2F0ZWQgZm9yICRJbiQsICRTYyQgYW5kICRZJC4gU3RhbmRhcmQgZGV2aWF0aW9uIGRpZG4ndCBjbGVhcmx5IHZhcnkgYnkgZGF5IGZvciB0aGUgKzIgbWV0aG9kcywgdGhvdWdoIHRoZXJlIHdhcyBzb21lIGluZGljYXRpb24gb2YgdGhhdCBpbiB0aGUgJEhvXnsyK30kIGVzdGltYXRlcy4gSW4gYW55IGNhc2UsIHRoZSBsYXJnZSBlZmZlY3Qgb24gMy8zMCBpcyBhZ2FpbiBub3QgaW5kaWNhdGVkIGZvciB0aGUgKzIgbWV0aG9kcy4gVGhpcyBmaWd1cmUgc3VnZ2VzdHMgc29tZSBjbGVhciBkaWZmZXJlbmNlcyBpbiBzdGFuZGFyZCBkZXZpYXRpb24gZHVlIHRvIHR1bmUgc2V0dGluZywgcGFydGljdWxhcmx5IGZvciB0aGUgKzEgbWV0aG9kczsgYW5kIHBvc3NpYmx5IGZvciB0aGUgJEhvXnsyK30kIG1ldGhvZC4NCg0KIyMjIyMgTWF0cml4DQpgYGB7ciBjb25kaXRpb25hbF9zaWdtYV9tYXRyaXhfc2UsIGV2YWw9RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KDQpmaXR0ZWRfc2lnbWFfbWF0cml4X3NlIDwtIGRmX212X3NlICU+JQ0KICBhZGRfZml0dGVkX2RyYXdzKG1vZDMsIA0KICAgICAgICAgICAgICAgICAgIGRwYXIgPSAic2lnbWEiLCANCiAgICAgICAgICAgICAgICAgICByZV9mb3JtdWxhID0gc2lnbWEgfiAoMSB8IG1hdHJpeCksDQogICAgICAgICAgICAgICAgICAgY29yZXMgPSAxKQ0Kc2F2ZShmaXR0ZWRfc2lnbWFfbWF0cml4X3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX3NpZ21hX21hdHJpeF9zZS5yZGEiKQ0KYGBgDQoNClRoZSBleHBlY3RlZCBzdGFuZGFyZCBkZXZpYXRpb25zIGJ5IG1hdHJpeCB3aGlsZSBtYXJnaW5hbGl6aW5nIG92ZXIgZGF5Lg0KYGBge3IgcG9zdGVyaW9yX3Bsb3Rfc2lnbWFfbWF0cml4X3NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD0xMH0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZml0dGVkX3NpZ21hX21hdHJpeF9zZS5yZGEiKQ0KDQpzaWdtYV9TdGQgPC0gZml0dGVkX3NpZ21hX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlN0ZCIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiaW4tc2FtcGxlIikNCg0Kc2lnbWFfQWx0IDwtIGZpdHRlZF9zaWdtYV9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJBbHQiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoImFsdC5pc290b3BlIikNCg0Kc2lnbWFfSG8yIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzIiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIGdndGl0bGUoZXhwcmVzc2lvbihIb14iMisiKSkNCg0Kc2lnbWFfSW4gPC0gZml0dGVkX3NpZ21hX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkluIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICBnZ3RpdGxlKCJJbiIpDQoNCnNpZ21hX1NjIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJTYyIpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBzaWdtYSkpICsNCiAgc3RhdF9wb2ludGludGVydmFsKGFlcyh5ID0gbWF0cml4LCBncm91cCA9IHR1bmUsIGNvbG9yID0gdHVuZSksDQogICAgICAgICAgICAgICAgICBwb2ludF9pbnRlcnZhbCA9IG1lZGlhbl9xaSwNCiAgICAgICAgICAgICAgICAgIC53aWR0aCA9IGMoMC41LCAwLjk1KSwNCiAgICAgICAgICAgICAgICAgIHNoYXBlID0gMywNCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJykgKw0KICB0aGVtZV90aWR5YmF5ZXMoKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKw0KICB4bGltKDAsIDMwKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLA0KICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZ2d0aXRsZSgiU2MiKQ0KDQpzaWdtYV9ZIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJZIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgeGxhYiggZXhwcmVzc2lvbihoYXQoc2lnbWEpKSkgKw0KICBnZ3RpdGxlKCJZIikNCg0Kc2lnbWFfQmUgPC0gZml0dGVkX3NpZ21hX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkJlIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkJlIikNCg0Kc2lnbWFfQ28gPC0gZml0dGVkX3NpZ21hX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIkNvIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIkNvIikNCg0Kc2lnbWFfVGggPC0gZml0dGVkX3NpZ21hX21hdHJpeF9zZSAlPiUgDQogIGZpbHRlciguY2F0ZWdvcnkgPT0gIlRoIikgJT4lDQogIGdncGxvdChhZXMoeCA9IHNpZ21hKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBtYXRyaXgsIGdyb3VwID0gdHVuZSwgY29sb3IgPSB0dW5lKSwNCiAgICAgICAgICAgICAgICAgIHBvaW50X2ludGVydmFsID0gbWVkaWFuX3FpLA0KICAgICAgICAgICAgICAgICAgLndpZHRoID0gYygwLjUsIDAuOTUpLA0KICAgICAgICAgICAgICAgICAgc2hhcGUgPSAzLA0KICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksDQogICAgICAgICAgICAgICAgICBhbHBoYSA9IDAuNSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnKSArDQogIHRoZW1lX3RpZHliYXllcygpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIHhsaW0oMCwgMzApICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkgKw0KICB4bGFiKCBleHByZXNzaW9uKGhhdChzaWdtYSkpKSArDQogIGdndGl0bGUoIlRoIikNCg0Kc2lnbWFfSG8xIDwtIGZpdHRlZF9zaWdtYV9tYXRyaXhfc2UgJT4lIA0KICBmaWx0ZXIoLmNhdGVnb3J5ID09ICJIbzEiKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gc2lnbWEpKSArDQogIHN0YXRfcG9pbnRpbnRlcnZhbChhZXMoeSA9IG1hdHJpeCwgZ3JvdXAgPSB0dW5lLCBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgwLCAzMCkgKw0KICB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KHNpZ21hKSkpICsNCiAgZ2d0aXRsZShleHByZXNzaW9uKEhvXiIrMSIpKQ0KDQpncmlkRXh0cmE6OmdyaWQuYXJyYW5nZShzaWdtYV9TdGQsIHNpZ21hX0FsdCwgc2lnbWFfSG8yLCBzaWdtYV9Jbiwgc2lnbWFfU2MsIHNpZ21hX1ksIHNpZ21hX0JlLCBzaWdtYV9Dbywgc2lnbWFfVGgsIHNpZ21hX0hvMSwgbmNvbCA9IDUpDQpgYGANCk92ZXJhbGwsIGV4Y2VwdGluZyBwZXJoYXBzIHRoZSAkU2MkIGFuZCAkQmUkIG1ldGhvZHMsIG1hdHJpeCB0byBtYXRyaXggdmFyaWFiaWxpdHkgaW4gc3RhbmRhcmQgZGV2aWF0aW9uIHdhcyBlc3RpbWF0ZWQgdG8gYmUgbmVnbGlnaWJsZS4gVGhlIHR1bmUgZWZmZWN0cyBvbiBzdGFuZGFyZCBkZXZpYXRpb24gYXJlIGNsZWFyZXIgaW4gdGhpcyBmaWd1cmUsIGhvd2V2ZXIsIHRoZSBleHRlbnQgdG8gd2hpY2ggZGVwZW5kZWQgb24gdGhlIG1ldGhvZC4NCg0KIyMjIFJlc2lkdWFsIENvcnJlbGF0aW9ucw0KTmV4dCwgdGhlIGVzdGltYXRlZCByZXNpZHVhbCBjb3JyZWxhdGlvbnMgYW1vbmcgSVMgbWV0aG9kcyBmb3IgdGhlIHNlbGVuaXVtIG1vZGVsLiANCmBgYHtyIHJlc2lkdWFsX2NvcnJlbGF0aW9uc19TZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSdjZW50ZXInLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgd2FybmluZz1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KDQptb2QzICU+JQ0KICBnYXRoZXJfZHJhd3MocmVzY29yX19TdGRfX0FsdCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19IbzIsDQogICAgICAgICAgICAgICByZXNjb3JfX1N0ZF9fSW4sDQogICAgICAgICAgICAgICByZXNjb3JfX1N0ZF9fU2MsDQogICAgICAgICAgICAgICByZXNjb3JfX1N0ZF9fWSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19CZSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19UaCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU3RkX19IbzEsDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19IbzIsDQogICAgICAgICAgICAgICByZXNjb3JfX0FsdF9fSW4sDQogICAgICAgICAgICAgICByZXNjb3JfX0FsdF9fU2MsDQogICAgICAgICAgICAgICByZXNjb3JfX0FsdF9fWSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19CZSwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19UaCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQWx0X19IbzEsDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSG8yX19JbiwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSG8yX19TYywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSG8yX19ZLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX0JlLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX0NvLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19IbzJfX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19Jbl9fU2MsDQogICAgICAgICAgICAgICByZXNjb3JfX0luX19ZLA0KICAgICAgICAgICAgICAgcmVzY29yX19Jbl9fQmUsDQogICAgICAgICAgICAgICByZXNjb3JfX0luX19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fSW5fX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19Jbl9fSG8xLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICByZXNjb3JfX1NjX19ZLA0KICAgICAgICAgICAgICAgcmVzY29yX19TY19fQmUsDQogICAgICAgICAgICAgICByZXNjb3JfX1NjX19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fU2NfX1RoLA0KICAgICAgICAgICAgICAgcmVzY29yX19TY19fSG8xLA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICByZXNjb3JfX1lfX0JlLA0KICAgICAgICAgICAgICAgcmVzY29yX19ZX19DbywNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fWV9fVGgsDQogICAgICAgICAgICAgICByZXNjb3JfX1lfX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19CZV9fQ28sDQogICAgICAgICAgICAgICByZXNjb3JfX0JlX19UaCwNCiAgICAgICAgICAgICAgIHJlc2Nvcl9fQmVfX0hvMSwNCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgcmVzY29yX19Db19fVGgsDQogICAgICAgICAgICAgICByZXNjb3JfX0NvX19IbzEsDQogICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgIHJlc2Nvcl9fVGhfX0hvMSkgJT4lIA0KICBtdXRhdGUoSVMgPSBzdHJfc3ViKC52YXJpYWJsZSwgOSwgZW5kID0gMTYpKSAlPiUNCiAgc2VwYXJhdGUoSVMsIGMoIklTMSIsICJJUzIiKSkgJT4lDQogIHNlbGVjdCguY2hhaW4sIC5pdGVyYXRpb24sIC5kcmF3LCAudmFyaWFibGUsIElTMSwgSVMyLCAudmFsdWUpICU+JQ0KICBtdXRhdGUoSVMxID0gcmVjb2RlX2ZhY3RvcihJUzEsICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90ICU+JQ0KICBtdXRhdGUoSVMxID0gZmN0X3JlbGV2ZWwoSVMxLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIG11dGF0ZShJUzIgPSByZWNvZGVfZmFjdG9yKElTMiwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGluIHBsb3QgJT4lDQogIG11dGF0ZShJUzIgPSBmY3RfcmVsZXZlbChJUzIsIGMoIkJlIiwiQ28iLCAiSG8xKyIsICJJbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYyIsICJUaCIsICJZIiwgImFsdC5pc290b3BlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluLXNhbXBsZSIsICJIbzIrIikpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gLnZhbHVlKSkgKw0KICBzdGF0X3BvaW50aW50ZXJ2YWwoYWVzKHkgPSBJUzIpLA0KICAgICAgICAgICAgICAgICAgcG9pbnRfaW50ZXJ2YWwgPSBtZWRpYW5fcWksDQogICAgICAgICAgICAgICAgICAud2lkdGggPSBjKDAuNSwgMC45NSksDQogICAgICAgICAgICAgICAgICBzaGFwZSA9IDMsDQogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC44KSwNCiAgICAgICAgICAgICAgICAgIGFscGhhID0gMC41KSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcpICsNCiAgdGhlbWVfdGlkeWJheWVzKCkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsNCiAgeGxpbSgtMC4yNSwgMSkgKw0KICAjdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksDQogICMgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCkpICsNCiAgZmFjZXRfd3JhcCh+IElTMSwgbmNvbCA9IDEwKSArDQogIHhsYWIoIGV4cHJlc3Npb24oaGF0KE9tZWdhKSkpICsNCiAgZ2d0aXRsZSgiUmVzaWR1YWwgY29ycmVsYXRpb25zIikNCmBgYA0KVGhlIHBhdHRlcm5zIGluIHRoZSByZXNpZHVhbCBjb3JyZWxhdGlvbnMgYXJlIHZlcnkgc2ltaWxhciB0byB0aGUgcGF0dGVybnMgd2l0aCBhcnNlbmljIGFib3ZlLiBUaGUgY29ycmVsYXRpb25zIGFyZSBnZW5lcmFsbHkgc3Ryb25nZXIgYmV0d2VlbiB0aGUgKzEgbWV0aG9kcy4gSG93ZXZlciwgaXQgaXMgbm90YWJsZSB0aGF0IHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgaW4tc2FtcGxlIGFuZCBhbHQuaXNvdG9wZSBtZXRob2RzIGFuZCB0aGUgb3RoZXJzIGFyZSBjb25zaWRlcmFibHkgc21hbGxlciBmb3IgdGhlIHNlbGVuaXVtIG1vZGVsIGNvbXBhcmVkIHRvIHRoZSBvbmUgZm9yIGFyc2VuaWMsIGFsdGhvdWdoIHRoZSBtb2RlbHMgYXJlIHRoZSBzYW1lIHN0cnVjdHVyYWxseS4NCg0KIyMjIFByZWRpY3Rpb25zDQpGaW5hbGx5LCB0aGUgcHJlZGljdGlvbnMgZm9yIHRoZSBzZWxlbml1bSBtb2RlbC4NCmBgYHtyIG1hdHJpeF9mb3JfbmV3X2RheV9zZSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvZGZfbXZfc2UucmRhIikNCg0KbmV3X2RheV9kYXRfc2UgPC0gZXhwYW5kX2dyaWQobWF0cml4ID0gZmFjdG9yKGxldmVscyhkZl9tdl9zZSRtYXRyaXgpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheV9leHB0ID0gIm5ld19kYXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVuZSA9IGZhY3RvcihjKCJMSGUiLCAiSEhlIikpKSAlPiUNCiAgbXV0YXRlKHR1bmUgPSByZWxldmVsKHR1bmUsIHJlZiA9ICJMSGUiKSkNCg0Kc2F2ZShuZXdfZGF5X2RhdF9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL25ld19kYXlfZGF0X3NlLnJkYSIpDQpgYGANCg0KYGBge3IgZGF5X2Zvcl9uZXdfbWF0cml4X3NlLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KDQpuZXdfbWF0cml4X2RhdF9zZSA8LSBleHBhbmRfZ3JpZChtYXRyaXggPSBmYWN0b3IoIm5ld19tYXRyaXgiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheV9leHB0ID0gZmFjdG9yKGxldmVscyhkZl9tdl9zZSRkYXlfZXhwdCkpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVuZSA9IGZhY3RvcihjKCJMSGUiLCAiSEhlIikpKSAlPiUNCiAgbXV0YXRlKHR1bmUgPSByZWxldmVsKHR1bmUsIHJlZiA9ICJMSGUiKSkNCg0Kc2F2ZShuZXdfbWF0cml4X2RhdF9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL25ld19tYXRyaXhfZGF0X3NlLnJkYSIpDQpgYGANCg0KYGBge3IgcHJlZGljdF9uZXdfTmRfaXNfbW9kMV80X3NlLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9kZl9tdl9zZS5yZGEiKQ0KDQpuZXdfbWF0cml4X2RheV9kYXRfc2UgPC0gZXhwYW5kX2dyaWQobWF0cml4ID0gZmFjdG9yKCJuZXdfbWF0cml4IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5X2V4cHQgPSBmYWN0b3IoIm5ld19kYXkiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dW5lID0gZmFjdG9yKCBjKCJMSGUiLCAiSEhlIikpKSAlPiUNCiAgbXV0YXRlKHR1bmUgPSByZWxldmVsKHR1bmUsIHJlZiA9ICJMSGUiKSkgDQoNCnNhdmUobmV3X21hdHJpeF9kYXlfZGF0X3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvbmV3X21hdHJpeF9kYXlfZGF0X3NlLnJkYSIpDQpgYGANCg0KIyMjIyBEYXkNClByZWRpY3Rpb25zIHRvIHRoZSBvYnNlcnZlZCBkYXlzIGZvciBhIG5ldyBtYXRyaXguDQpgYGB7ciBwcmVkaWN0X25ld19kYXlfc2UsIGV2YWw9RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTcuMzM2LCBpbmNsdWRlPUZBTFNFfQ0KbG9hZCgiZnVsbC1hbmFseXNpcy1maWxlcy9tb2QzX1NlX212LnJkYSIpDQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL25ld19tYXRyaXhfZGF0X3NlLnJkYSIpDQoNCnByZWRpY3RfbmV3X21hdHJpeF9kYXRfc2UgPC0gbmV3X21hdHJpeF9kYXRfc2UgJT4lDQogIGFkZF9wcmVkaWN0ZWRfZHJhd3MobW9kMywgDQogICAgICAgICAgICAgICAgICAgICAgcmVfZm9ybXVsYSA9IH4gKDEgfCBkYXlfZXhwdCksDQogICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbmV3X2xldmVscyA9IFRSVUUsIGNvcmVzID0gMSkgJT4lIA0KICBtdXRhdGUobWV0aG9kID0gcmVjb2RlX2ZhY3RvciguY2F0ZWdvcnksICJTdGQiID0gImluLXNhbXBsZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8yIiA9ICJIbzIrIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMSIgPSAiSG8xKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbHQiID0gImFsdC5pc290b3BlIikpICU+JSAjIGNoYW5nZSBsZXZlbCBuYW1lcyBpbiBwbG90DQogIG11dGF0ZShkYXlfZXhwdCA9IHJlY29kZV9mYWN0b3IoZGF5X2V4cHQsICIzMTYiID0gIkRheSAxIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzMjAiID0gIkRheSAyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjMyMSIgPSAiRGF5IDMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMzMwIiA9ICJEYXkgNCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MTAiID0gIkRheSA1IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI1MTEiID0gIkRheSA2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjUxNSIgPSAiRGF5IDciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNTE2IiA9ICJEYXkgOCIpKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBtdXRhdGUoZGF5X2V4cHQgPSBmY3RfcmVsZXZlbChkYXlfZXhwdCwgYygiRGF5IDEiLCJEYXkgMiIsIkRheSAzIiwiRGF5IDQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF5IDUiLCJEYXkgNiIsIkRheSA3IiwiRGF5IDgiKSkpDQoNCnNhdmUocHJlZGljdF9uZXdfbWF0cml4X2RhdF9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXRfc2UucmRhIikNCmBgYA0KDQpgYGB7ciBwbG90X25ld19kYXlfc2UsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0nY2VudGVyJywgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTcuMzM2IH0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvcHJlZGljdF9uZXdfbWF0cml4X2RhdF9zZS5yZGEiKQ0KDQpwcmVkaWN0X25ld19tYXRyaXhfZGF0X3NlICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAucHJlZGljdGlvbikpICsNCiAgc3RhdF9zbGFiKCBhZXMoeSA9IG1ldGhvZCwgY29sb3IgPSBkYXlfZXhwdCApLCANCiAgICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgICBzbGFiX3R5cGUgPSAicGRmIg0KICAgICAgICAgICAgICApICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAnZGFzaGVkJyApICsNCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gJ2dyZXk5NScsIGNvbG91ciA9ICdibGFjaycpKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoLTEwMCwgODAsIDQwKSkgKw0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAtMjAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDIwLCBsaW5ldHlwZSA9ICdkYXNoZWQnLCBjb2xvciA9ICdncmF5JykgKw0KICB4bGFiKCJQcmVkaWN0ZWQgYmlhcyAocHBiKSIpICsNCiAgZ2d0aXRsZSgiU2VsZW5pdW0iKSArDQogIGZhY2V0X3dyYXAofiB0dW5lKQ0KYGBgDQpDbGVhcmx5IHRoZSBpbi1zYW1wbGUgbWV0aG9kIGlzIHByZWRpY3RlZCB0byBoYXZlIHRoZSBsZWFzdCBiaWFzLCBvbiBhdmVyYWdlLCB0aGUgbGVhc3QgdmFyaWF0aW9uIGFjcm9zcyBhbmQgd2l0aGluIGRheXMuIFRoZXJlIGlzIG5vIGluZGljYXRpb24gb2YgaW1wb3J0YW50IGRheSB0byBkYXkgdmFyaWFiaWxpdHkgZm9yIHRoYXQgbWV0aG9kLiBUaGUgYWx0Lmlzb3RvcGUgbWV0aG9kIGFsc28gaXMgcHJlZGljdGVkIHRvIGJlIHJlYXNvbmFibHkgdW5iaWFzZWQgYW5kIHByZWNpc2UsIGJ1dCBkYXkgdG8gZGF5IHZhcmlhdGlvbiBpbiBleHBlY3RlZCBiaWFzIGlzIGNsZWFyLiBBIHNpbWlsYXIgY29uY2x1c2lvbiB3b3VsZCBkZXNjcmliZSB0aGUgcHJlZGljdGlvbnMgZm9yIHRoZSAkSG9eeysyfSQgbWV0aG9kLiBBY3Jvc3MgYWxsIG9mIHRoZSArMiBtZXRob2RzLCBiaWFzIHdhcyBwcmVkaWN0ZWQgd2l0aCBmYXIgZ3JlYXRlciBjZXJ0YWludHkgZm9yIExIZSB0dW5lIGNvbXBhcmVkIHRvIHRoZSBISGUgdHVuZSwgaW5kaWNhdGluZyB0aGUgZXN0aW1hdGVkIGRpZmZlcmVuY2VzIGluIHN0YW5kYXJkIGRldmlhdGlvbnMgZHVlIHRvIHR1bmUuIA0KDQojIyMjIE1hdHJpeA0KVGhlIHByZWRpY3Rpb25zIHRvIHRoZSBvYnNlcnZlZCBtYXRyaWNlcyB3aGlsZSBtYXJnaW5hbGl6aW5nIHRoZSBkYXkgZWZmZWN0cyBhcmUgYmVsb3cuDQpgYGB7ciBwcmVkaWN0X25ld19tYXRyaXhfc2UsIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL21vZDNfU2VfbXYucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbmV3X2RheV9kYXRfc2UucmRhIikNCg0KcHJlZGljdF9uZXdfZGF5X2RhdF9zZSA8LSBuZXdfZGF5X2RhdF9zZSAlPiUNCiAgYWRkX3ByZWRpY3RlZF9kcmF3cyggbW9kMywgDQogICAgICAgICAgICAgICAgICAgICAgIHJlX2Zvcm11bGEgPSB+ICgxIHwgbWF0cml4KSwNCiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbmV3X2xldmVscyA9IFRSVUUsIA0KICAgICAgICAgICAgICAgICAgICAgICBjb3JlcyA9IDEgKSAlPiUgDQogIG11dGF0ZShtZXRob2QgPSByZWNvZGVfZmFjdG9yKC5jYXRlZ29yeSwgIlN0ZCIgPSAiaW4tc2FtcGxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzIiID0gIkhvMisiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG8xIiA9ICJIbzErIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFsdCIgPSAiYWx0Lmlzb3RvcGUiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGZvciBtZXRob2RzIGluIHBsb3QNCiAgbXV0YXRlKG1ldGhvZCA9IGZjdF9yZWxldmVsKG1ldGhvZCwgYygiQmUiLCJDbyIsICJIbzErIiwgIkluIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNjIiwgIlRoIiwgIlkiLCAiYWx0Lmlzb3RvcGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4tc2FtcGxlIiwgIkhvMisiKSkpICU+JQ0KICBtdXRhdGUobWF0cml4ID0gcmVjb2RlX2ZhY3RvcihtYXRyaXgsICJuZWF0XzEiID0gIk0yKyBTdGRfMSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVhdF8yIiA9ICJNMisgU3RkXzIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVhdF8zIiA9ICJNMisgU3RkXzMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVhdF80IiA9ICJNMisgU3RkXzQiKSkgJT4lICMgY2hhbmdlIGxldmVsIG5hbWVzIGZvciBtYXRyaXggaW4gcGxvdA0KICBtdXRhdGUobWF0cml4ID0gZmN0X3JlbGV2ZWwobWF0cml4LCBjKCJDYSIsIksiLCAiTWciLCAiTmEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSENsIiwgIlBPNCIsICJTTzQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTTIrIFN0ZF8xIiwgIk0yKyBTdGRfMiIsICJNMisgU3RkXzMiLCAiTTIrIFN0ZF80IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhdGVyXzEiLCJ3YXRlcl8zIiwgIndhdGVyXzQiLCAid2F0ZXJfNSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXRlcl82IiwgIndhdGVyXzciLCAid2F0ZXJfOCIsICJ3YXRlcl85IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2F0ZXJfMTAiLCAid2F0ZXJfMTEiLCAid2F0ZXJfMTIiKSkpICMgcmUtbGV2ZWwNCg0Kc2F2ZShwcmVkaWN0X25ld19kYXlfZGF0X3NlLCBmaWxlID0gImZ1bGwtYW5hbHlzaXMtZmlsZXMvcHJlZGljdF9uZXdfZGF5X2RhdF9zZS5yZGEiKQ0KYGBgDQoNCmBgYHtyIHBsb3RfbmV3X21hdHJpeF9zZSwgZWNobz1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBmaWcuaGVpZ2h0PTEwLCBmaWcud2lkdGg9Ny4zMzZ9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X2RheV9kYXRfc2UucmRhIikNCg0KcHJlZGljdF9uZXdfZGF5X2RhdF9zZSAlPiUNCiAgZ2dwbG90KCBhZXMoIHggPSAucHJlZGljdGlvbiApICkgKyANCiAgc3RhdF9zbGFiKCBhZXMoeSA9IG1ldGhvZCwgY29sb3IgPSBtYXRyaXggKSwgDQogICAgICAgICAgICAgIGZpbGwgPSBOQSwNCiAgICAgICAgICAgICAgc2xhYl90eXBlID0gInBkZiINCiAgICAgICAgICAgICAgKSArDQogIGdlb21fdmxpbmUoIHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwoIHZhbHVlcyA9IGFscGhhKCBjKCAiI0ZDRkZBNDk5IiwgIiNGMkU5Njc5OSIsICIjRjZENTQzOTkiLCAiI0ZBQzEyNzk5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjQkYzOTUyOTkiLCAiI0Q0NDg0Mjk5IiwgIiNFNTVDMzA5OSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzAwMDAwNDgwIiwgIiMwMDAwMDQ4MCIsICIjMDAwMDA0ODAiLCAiIzAwMDAwNDgwIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMzIwQTVEODAiLCAiIzMyMEE1RDgwIiwgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMzIwQTVEODAiLCAiIzMyMEE1RDgwIiwgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMzMjBBNUQ4MCIsICIjMzIwQTVEODAiLCAiIzMyMEE1RDgwIiksIDAuNSApICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnZ3JleTk1JywgY29sb3VyID0gJ2JsYWNrJykpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAwLCA4MCwgNDApKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAnZ3JheScpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIHhsYWIoIlByZWRpY3RlZCBiaWFzIChwcGIpIiApICsNCiAgZ2d0aXRsZSgiU2VsZW5pdW0iKSArDQogIGZhY2V0X3dyYXAoIH4gdHVuZSkNCmBgYA0KTWF0cml4IHRvIG1hdHJpeCB2YXJpYWJpbGl0eSBpcyBwcmVkaWN0ZWQgdG8gbGFyZ2VseSBuZWdsaWdpYmxlIGZvciBtb3N0IG1ldGhvZHMuIFRoaXMgaXMgYSBiaXQgb2YgYSBjb250cmFzdCB0byB0aGUgYXJzZW5pYyBwcmVkaWN0aW9ucywgd2hpY2ggc2hvd2VkIGEgYml0IG1vcmUgdmFyaWF0aW9uLCBwYXJ0aWN1bGFybHkgaW4gdGhlIDI1MHBwbSBtYXRyaWNlcyB2cy4gb3RoZXJzLiANCg0KIyMjIyBOZXcgZGF5IGFuZCBtYXRyaXgNCkZpbmFsbHksIHRoZSBwcmVkaWN0aW9ucyB0byBhIG5ldyBtYXRyaXggYW5kIG5ldyBkYXkgZnJvbSB0aGUgc2VsZW5pdW0gbW9kZWwuDQpgYGB7ciBwcmVkaWN0X25ld19kYXlfYW5kX21hdHJpeF9zZSwgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvbW9kM19TZV9tdi5yZGEiKQ0KbG9hZCggImZ1bGwtYW5hbHlzaXMtZmlsZXMvbmV3X21hdHJpeF9kYXlfZGF0X3NlLnJkYSIgKQ0KDQpwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdF9zZSA8LSBuZXdfbWF0cml4X2RheV9kYXRfc2UgJT4lDQogIGFkZF9wcmVkaWN0ZWRfZHJhd3MoIG1vZDMsIA0KICAgICAgICAgICAgICAgICAgICAgICByZV9mb3JtdWxhID0gTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25ld19sZXZlbHMgPSBUUlVFLCANCiAgICAgICAgICAgICAgICAgICAgICAgY29yZXMgPSAxICkgICU+JSANCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgZm9yIG1ldGhvZHMgaW4gcGxvdA0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkNCg0Kc2F2ZShwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdF9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXlfZGF0X3NlLnJkYSIpDQpgYGANCg0KVGhlIHByb2JhYmlsaXR5IG9mIG92ZXItY29ycmVjdGlvbiBmb3IgZWFjaCBjYXNlIGNhbiBiZSBjYWxjdWxhdGVkIGZyb20gdGhlIHBvc3RlcmlvciBwcmVkaWN0aXZlIGRpc3RyaWJ1dGlvbi4NCmBgYHtyIHByb2Jfb3ZlcmNvcnJlY3Rfc2UsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsb2FkKCJmdWxsLWFuYWx5c2lzLWZpbGVzL3ByZWRpY3RfbmV3X21hdHJpeF9kYXlfZGF0X3NlLnJkYSIpDQoNCnByb2Jfb3Zlcl9zZSA8LSBwcmVkaWN0X25ld19tYXRyaXhfZGF5X2RhdF9zZSAlPiUgDQogIG11dGF0ZShvdmVyID0gaWZlbHNlKC5wcmVkaWN0aW9uIDwgMC4wLCAxLCAwKSkgJT4lDQogIGdyb3VwX2J5KC5jYXRlZ29yeSwgdHVuZSkgJT4lDQogIHN1bW1hcmlzZShwX292ZXIgPSBzdW0ob3ZlcikgLyA2MDAwKSAlPiUNCiAgbXV0YXRlKG1ldGhvZCA9IHJlY29kZV9mYWN0b3IoLmNhdGVnb3J5LCAiU3RkIiA9ICJpbi1zYW1wbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvMiIgPSAiSG8yKyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIbzEiID0gIkhvMSsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWx0IiA9ICJhbHQuaXNvdG9wZSIpKSAlPiUgIyBjaGFuZ2UgbGV2ZWwgbmFtZXMgaW4gcGxvdA0KICBtdXRhdGUobWV0aG9kID0gZmN0X3JlbGV2ZWwobWV0aG9kLCBjKCJCZSIsIkNvIiwgIkhvMSsiLCAiSW4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2MiLCAiVGgiLCAiWSIsICJhbHQuaXNvdG9wZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbi1zYW1wbGUiLCAiSG8yKyIpKSkgJT4lDQogIHNlbGVjdChtZXRob2QsIHR1bmUsIHBfb3ZlcikgJT4lDQogIG11dGF0ZShwX292ZXIgPSByb3VuZChwX292ZXIsIDIpKQ0KDQpzYXZlKHByb2Jfb3Zlcl9zZSwgZmlsZSA9ICJmdWxsLWFuYWx5c2lzLWZpbGVzL3Byb2Jfb3Zlcl9zZS5yZGEiKSANCg0KcHJpbnQocHJvYl9vdmVyX3NlKQ0KYGBgDQoNCmBgYHtyIHBsb3RfbmV3X2RheV9hbmRfbWF0cml4X3NlLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249J2NlbnRlcicsIGZpZy5oZWlnaHQ9MTAsIGZpZy53aWR0aD03LjMzNiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvcHJlZGljdF9uZXdfbWF0cml4X2RheV9kYXRfc2UucmRhIikNCmxvYWQoImZ1bGwtYW5hbHlzaXMtZmlsZXMvcHJvYl9vdmVyX3NlLnJkYSIpDQoNCnByZWRpY3RfbmV3X21hdHJpeF9kYXlfZGF0X3NlICU+JQ0KICBncm91cF9ieShtZXRob2QsIG1hdHJpeCwgZGF5X2V4cHQsIHR1bmUpICU+JSANCiAgc2FtcGxlX24oNjAwMCkgICU+JSAjIG9ubHkgbmVlZCAxIG9icyBwZXIgdHVuZSBmb3IgZWFjaCBtZXRob2QsIG1hdHJpeCwgZGF5DQogIHVuZ3JvdXAoKSAlPiUNCiAgZ2dwbG90KCBhZXMoIHggPSAucHJlZGljdGlvbiApICkgKyANCiAgc3RhdF9zbGFiKGFlcyh5ID0gbWV0aG9kLCANCiAgICAgICAgICAgICAgICBjb2xvciA9IHR1bmUpLA0KICAgICAgICAgICAgZmlsbCA9IE5BLA0KICAgICAgICAgICAgYWxwaGEgPSAwLjYsDQogICAgICAgICAgICBzbGFiX3R5cGUgPSAicGRmIg0KICAgICAgICAgICAgKSArDQogIGdlb21fdmxpbmUoIHhpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICdkYXNoZWQnICkgKw0KICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAnZ3JleTk1JywgY29sb3VyID0gJ2JsYWNrJykpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgtMTAwLCA4MCwgMjApKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC0yMCwgbGluZXR5cGUgPSAnZGFzaGVkJywgY29sb3IgPSAnZ3JheScpICsNCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMjAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcsIGNvbG9yID0gJ2dyYXknKSArDQogIGdlb21fdGV4dF9yZXBlbChkYXRhID0gcHJvYl9vdmVyX3NlLA0KICAgICAgICAgICAgYWVzKHggPSByZXAoNDAsIDIwKSwgDQogICAgICAgICAgICAgICAgeSA9IG1ldGhvZCwgDQogICAgICAgICAgICAgICAgZ3JvdXAgPSB0dW5lLA0KICAgICAgICAgICAgICAgIGNvbG9yID0gdHVuZSwNCiAgICAgICAgICAgICAgICBsYWJlbCA9IHBfb3ZlciksDQogICAgICAgICAgICBzaXplID0gMywNCiAgICAgICAgICAgIG51ZGdlX3kgPSAwLjI1LA0KICAgICAgICAgICAgbnVkZ2VfeCA9IDAsDQogICAgICAgICAgICBtaW4uc2VnbWVudC5sZW5ndGggPSBJbmYpICsNCiAgZ2VvbV92bGluZSggeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gJ2Rhc2hlZCcgKSArDQogIHhsYWIoIlByZWRpY3RlZCBiaWFzIChwcGIpIiApICsNCiAgZ2d0aXRsZSgiU2VsZW5pdW0iKQ0KYGBgDQpUaGlzIGZpZ3VyZSBhZ2FpbiBlbXBoYXNpemVzIGRpZmZlcmVuY2VzIGluIHByZWNpc2lvbiBiZXR3ZWVuIHRoZSBwcmVkaWN0aW9ucyBmb3IgdGhlICsyIGFuZCArMSBtZXRob2RzIGFzIHdlbGwgYXMgdGhlIHR3byB0dW5lIHNldHRpbmdzLiBDb21wYXJlZCB0byB0aGUgbW9kZWwgZm9yIGFyc2VuaWMsIHRoaXMgb25lIGZvciBzZWxlbml1bSBhbGxvY2F0ZXMgbW9yZSBwcm9iYWJpbGl0eSB0b3dhcmRzIG92ZXItY29ycmVjdGlvbnMgZm9yIHRoZSArMiBpbnRlcm5hbCBzdGFuZGFyZCBtZXRob2RzOyB3aGVyZWFzIGZvciB0aGUgYXJzZW5pYyBtb2RlbCwgYWxsICsyIG1ldGhvZHMgd2VyZSBwcmVkaWN0ZWQgd2l0aCBtb3N0IG9mIHRoZSBwcm9iYWJpbGl0eSBpbiB0aGUgcmVnaW9uIG9mIHVuZGVyLWNvcnJlY3Rpb24uIExpa2V3aXNlLCB0aGUgcHJlZGljdGlvbnMgZm9yIHRoZSArMSBtZXRob2RzIGFyZSBsYXJnZWx5IGluIHRoZSBkaXJlY3Rpb24gb2Ygb3Zlci1jb3JyZWN0aW9uLg0KDQpPdmVyYWxsLCB0aGUgaW4tc2FtcGxlIG1ldGhvZCBwcmVkaWN0aW9ucyBjb21wYXJlIGZhdm9yYWJseSBjb21wYXJlZCB0byBtb3N0IG90aGVyIG1ldGhvZHMgYW5kIHR1bmUgc2V0dGluZ3MuIFRoZSBleHBlY3RlZCBiaWFzIGlzIG5lYXJlciB6ZXJvIGFuZCB0aGUgdW5jZXJ0YWludHkgaW4gdGhlIHByZWRpY3Rpb25zIGFyZSBjb25zaWRlcmFibHkgc21hbGxlciwgZXZlbiBmb3IgdGhlIEhIZSB0dW5lIHNldHRpbmcuDQoNCiMgUmVmZXJlbmNlcw0KPGRpdiBpZD0icmVmcyI+PC9kaXY+DQoNCiMgU2Vzc2lvbiBJbmZvDQpgYGB7ciBzZXNzaW9uX2luZm99DQpzZXNzaW9uSW5mbygpDQpgYGA=