1 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.

2 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.

3 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.

4 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.

4.1 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.

5 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")

5.1 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.

5.2 Model checks

Posterior predictive checks are useful for visualizing the extent to which the fitted model generates replicate data that resembles the observed data.

5.2.1 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.

5.3 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.

6 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")

6.1 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.

6.2 Model checks

Posterior predictive checks are useful for visualizing the extent to which the fitted model generates replicate data that resembles the observed data.

6.2.1 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.

6.3 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.

6.4 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.

7 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")

7.1 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.

7.2 Model checks

Next, the density checks.

7.2.1 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.

7.2.2 Median

Next is a check comparing replicated medians to the observed medians.

In the above check, the observed median (black vertical line) should fall in the bulk of the replicated medians (blue histogram). The plot for the in-sample clearly suggests that the model may be consistently overestimating the observed median for that method. This would agree with the density plot for the in-sample method above. Nevertheless, the scale of the bias is on the order of around 100 ppt, which may be less meaningful in the practical sense.

7.2.3 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+}\).

7.2.4 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).

7.3 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.

7.4 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.

7.4.1 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.

7.4.1.1 \(\mu\)

First, the estimated conditional means for the \(\mu\) component of the model.

7.4.1.1.1 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")

7.4.1.1.2 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.

7.4.1.1.3 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.

7.4.1.2 \(\sigma\)

Next, the conditional means for the \(\sigma\) component of the model.

7.4.1.2.1 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.

7.4.1.2.2 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.

7.4.1.2.3 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.

7.4.2 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.

7.4.3 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.

7.4.3.1 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")

7.4.3.2 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.

7.4.3.3 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.

7.4.3.4 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.

8 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")

8.1 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.

8.2 Model checks

Next, the checks for the selenium model.

8.2.1 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.

8.2.2 Median

Next is a check comparing replicated medians to the observed medians.

This check doesn’t suggest any glaring issues.

8.2.3 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.

8.2.4 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.

8.3 Posterior inferences

Next, the posterior inferences from the selenium model.

8.3.1 Conditional means

The conditional means estimated for the selenium portion of the experiment are below.

8.3.1.1 \(\mu\)

First, the estimated conditional means for the \(\mu\) component of the model.

8.3.1.1.1 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")

8.3.1.1.2 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.

8.3.1.1.3 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.

8.3.1.2 \(\sigma\)

Next, the conditional means for the \(\sigma\) component of the model.

8.3.1.2.1 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.

8.3.1.2.2 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.

8.3.1.2.3 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.

8.3.2 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.

8.3.3 Predictions

Finally, the predictions for the selenium model.

8.3.3.1 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.

8.3.3.2 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.

8.3.3.3 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.

9 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.

10 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=