Working Model for the Final Exam

Caution: Please follow the suggested expressions and guided steps to complete the exam. Other approaches such as transformation for trivialize the problems that will not meet the exam objectives.

The Kumaraswamy distribution is a two-parameter continuous probability distribution defined on the interval (0, 1). It is often used as an alternative to the Beta distribution due to its simple closed-form expressions for the cumulative distribution function (CDF) and quantile function. It is commonly used in

  • Hydrology: Modeling rainfall, streamflow, or other bounded natural phenomena

  • Economics: Income shares, proportions, or bounded indices

  • Monte Carlo simulation: Efficient random variate generation (via inverse transform)

  • Machine learning: Output layer for bounded targets, prior distributions in Bayesian models

  • Reliability engineering: Modeling failure rates of systems with bounded lifetimes


Let \(X\) be the Kumaraswamy random variable with Cumulative Distribution Function (CDF)

\[ F(x; a, b) = 1 - (1 - x^a)^b \]

where \(a > 0\) and \(b > 0\) unknown parameters and \(0 < x < 1\).

The following are two special case of the Kumaraswamy distribution:

  1. Uniform Distribution: When \(a = 1\) and \(b = 1\), the Kumaraswamy distribution becomes a uniform distribution over \([0, 1]\) with CDF \(F(x) = x\).

  2. Power Distribution: when \(b = 1\) and \(a > 0\), the Kumaraswamy distribution becomes a power distribution over \([0, 1]\) with CDF \(F(x) = x^a\).

This final exam focuses on inferences of Kumaraswamy distribution and related data analysis.

Part A: Methodological Derivations


Problem A1:

Show that the density function of the Kumaraswamy distribution is:

\[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}. \] Answer:

The CDF of the Kumaraswamy distribution is \[ F(x; a, b) = 1 - (1 - x^a)^b \quad, 0<x<1,a>0,b>0. \] To find the PDF \(f(x; a, b)\), we compute: \[ f(x; a, b) = \frac{d}{dx} F(x; a, b) = \frac{d}{dx} \left[ 1 - (1 - x^a)^b \right]. \] Apply the sum rule to simplifies the exmpression to: \[ f(x; a, b) = - \frac{d}{dx} (1 - x^a)^b \] Then using the chain rule, treat \((1 - x^a)\) as the inner function: \[ f(x; a, b) = - \left[ b(1 - x^a)^{b-1} \cdot \frac{d}{dx}(1 - x^a) \right] \] Therefore: \[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}, 0 < x < 1. \] So the density is: \[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1}. \]

Problem A2:

Let \(\{x_1, x_2, \cdots, x_n \}\) be an i.i.d. random sample taken from a population that follows the aove 2-parameter Kumaraswamy distribution. Write out the loglikelihood function of \(a\) and \(b\), denoted by \(\ell(a,b)\), based on the above random sample and derive the gradient vector \([\ell_a^\prime(a,b), \ell_b^\prime(a,b)]\), the first order partial derivative of the log-likelihood with respect to parameters \(a\) and \(b\).

Answer:

Given the probability density function (PDF): \[ f(x; a, b) = ab \, x^{a-1} (1 - x^a)^{b-1} \] Taking logs gives he Log-Likelihood Function: \[ \ell(a, b) = n \ln(a) + n \ln(b) + (a-1) \sum_{i=1}^{n} \ln(x_i) + (b-1) \sum_{i=1}^{n} \ln(1 - x_i^a) \] The Gradient Vector with respect to \(a\): \[ \ell_a^\prime(a, b) = \frac{n}{a} + \sum_{i=1}^{n} \ln(x_i) - (b-1) \sum_{i=1}^{n} \frac{x_i^a \ln(x_i)}{1 - x_i^a} \] Partial derivative with respect to \(b\): \[ \ell_b^\prime(a, b) = \frac{n}{b} + \sum_{i=1}^{n} \ln(1 - x_i^a) \]

Problem A3:

Based on the gradients functions obtained in the above problem A2, derive the observed Fisher Information matrix (i.e, the negative Hessian Matrix).

Answer:

From Problem A2, the gradient functions are: \[ \ell_a^\prime(a, b) = \frac{n}{a} + \sum_{i=1}^{n} \ln(x_i) - (b-1) \sum_{i=1}^{n} \frac{x_i^a \ln(x_i)}{1 - x_i^a} \] and \[ \ell_b^\prime(a, b) = \frac{n}{b} + \sum_{i=1}^{n} \ln(1 - x_i^a). \] Second derivative with respect to \(a\) \[ \frac{\partial^2 \ell}{\partial a^2} = -\frac{n}{a^2} - (b-1) \sum_{i=1}^{n} \frac{x_i^a (\ln x_i)^2}{(1-x_i^a)^2} \] Second derivative with respect to \(b\) \[ \frac{\partial^2 \ell}{\partial b^2} = -\frac{n}{b^2} \] Mixed Observed Information: \[ \frac{\partial^2 \ell}{\partial a \partial b} = -\sum_{i=1}^{n} \frac{x_i^a \ln x_i}{1-x_i^a} \] Therefore, the Hseesian matrix is: \[ H(a,b) = \begin{bmatrix} -\frac{n}{a^2} - (b-1) \sum_{i=1}^{n} \frac{x_i^a (\ln x_i)^2}{(1-x_i^a)^2} & -\sum_{i=1}^{n} \frac{x_i^a \ln x_i}{1-x_i^a} \\ -\sum_{i=1}^{n} \frac{x_i^a \ln x_i}{1-x_i^a} & -\frac{n}{b^2} \end{bmatrix} \] The observed Fisher Information is defined as the negative Hessian matrix: \[ J(a,b) = -H(a,b) \]


Problem A4:

Consider power distribution \(F(x) = x^a, (a >0 \quad \text{ and }\quad x \in (0,1))\), a special case of the Kumaraswamy distribution with \(b = 1\), and a random sample from this distribution \(\{ x_1, x_2, \cdots, x_n\}\). Derive the MLE and MME of \(a\) respectively. [Hint: To find the MME, you need to compute the moment of the power distribution; that is, \(E[X^k] = \int_0^1 x^k F'(x) dx\). Note that both the MLE and the MME have closed-form expressions.]

Answer:

Maximum Likelihood Estimator (MLE) differenitate with respect to \(a\): \[ \frac{d\ell}{da} = \frac{n}{a} + \sum_{i=1}^n \ln x_i = 0 \] The MLE \(\hat{a}\) is: \[ \hat{a} = \frac{-n}{\sum_{i=1}^n \ln x_i} \] The MME \(a\):

\[ E[X] = \int_{0}^{1} x f(x) dx = \int_{0}^{1} x(ax^{a-1}) dx = a \int_{0}^{1} x^a dx=\frac{a}{a+1} \] we set the theoretical mean equal to the sample mean \(\bar{x}\): \[ \bar{x} = \frac{a}{a+1} \] Solving for \(a\): \[ \bar{x}(a + 1) = a \] \[ \bar{x}a + \bar{x} = a \] \[ \bar{x} = a - \bar{x}a \] \[ \bar{x} = a(1 - \bar{x}) \] The MME is therefore: \[ \tilde{a} = \frac{\bar{x}}{1 - \bar{x}} \]


Problem A5:

Using the same setting as in Problem A4, find the asymptotic (Wald) confidence interval for \(a\). [Hint: Compute the Fisher information for \(a\), then take its reciprocal to obtain the variance.]

Answer:

Find the second derivative of the log-likelihood derived in Problem A4: \[ \ell(a) = n \ln(a) + (a-1) \sum_{i=1}^{n} \ln(x_i) \] The second derivative of the log-likelihood \(\ell(a)\) with respect to \(a\) is: \[ \frac{d^2 \ell}{d a^2} = -\frac{n}{a^2} \] So, the Fisher information for the sample is the negative expectation of the second derivative: \[ I_n(a) = -E\left[ \frac{d^2 \ell}{d a^2} \right] = \frac{n}{a^2} \] Therefore, \[ \text{Var}(\hat{a}) \approx \frac{a^2}{n} \] Using the plug-in principle, we estimate this variance using the MLE \(\hat{a}\): \[ \widehat{\text{Var}}(\hat{a}) = \frac{\hat{a}^2}{n} \] Thus the asymptotic \((1 - \alpha) \times 100\%\) Wald confidence interval for \(a\) is: \[ \hat{a} \pm z_{1-\alpha/2} \frac{\hat{a}}{\sqrt{n}} \] For a 95% confidence interval (\(z_{0.975} \approx 1.96\)): \[ \left[ \hat{a} \left( 1 - \frac{1.96}{\sqrt{n}} \right), \quad \hat{a} \left( 1 + \frac{1.96}{\sqrt{n}} \right) \right] \]

Problem A6:

Using the same setting as in Problem A4, perform a likelihood ratio test for the hypothesis \(H_0 :a=1\) (i.e., the power distribution reduces to a uniform distribution). [Hint: Evaluate the log-likelihood function at the maximum likelihood estimate \(\hat{a}\) and at \(a=1\), then use these values to construct the LRT test statistic.]

Answer:

We test: \[ H_0: a = 1 \quad \text{vs.} \quad H_a: a \neq 1 \] The likelihood ratio test statistic is: \[ LR = 2 \left[ \ell(\hat{a}) - \ell(1) \right] \] Under the power model: \[ \ell(a) = n \ln(a) + (a-1) \sum_{i=1}^{n} \ln(x_i) \]

Under the Alternative Hypothesis (\(H_a: a = \hat{a}\)): \[\ell(H_a) = \ell(\hat{a}) = n \ln(\hat{a}) + (\hat{a}-1) \sum_{i=1}^{n} \ln(x_i)\] \[\ell(1) = n \ln(1) + (1-1) \sum_{i=1}^{n} \ln(x_i)=0\] Hence, \[ LR = 2 [ n \ln \hat{a} + (\hat{a}-1) \sum_{i=1}^{n} \ln(x_i)] \] Under \(H_0\), for large \(n\): \[LR \sim \chi^2_1\] Reject \(H_0\) at the 5% significance level if: \[LR > 3.841\]


Part B: Numerical Analysis

All code must be well commented and adhere to best coding practices

Working Dataset: A small reservoir supplies water to a town. During the dry season (50 days), engineers record the fraction of usable storage filled each morning. Values near 0 mean the reservoir is nearly empty; values near 1 mean it’s full. The distribution tends to be right‑skewed (mostly low levels due to drought) but with occasional replenishment.

The following 50 data points (ordered for clarity) represent the daily proportion of usable storage:

0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78


Problem B1:

Fit the Kumaraswamy distribution to the above data. Use the derivations in Problem A2 to find the MLE of \(a\) and \(b\). Please copy the key formulas before coding.

Key formulas:

The log-likelihood is \[\ell(a,b) = n \ln a + n \ln b + (a-1) \sum_{i=1}^{n} \ln x_i + (b-1) \sum_{i=1}^{n} \ln(1 - x_i^a)\] The gradient is \[\ell_a^\prime(a,b) = \frac{n}{a} + \sum_{i=1}^{n} \ln x_i - (b-1) \sum_{i=1}^{n} \frac{x_i^a \ln x_i}{1 - x_i^a}\] \[\ell_b^\prime(a,b) = \frac{n}{b} + \sum_{i=1}^{n} \ln(1 - x_i^a)\]

# data
x <- c(
  0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.20, 0.21, 0.22,
  0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.30, 0.31, 0.32,
  0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.42,
  0.43, 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.50, 0.51, 0.52,
  0.53, 0.54, 0.55, 0.56, 0.57, 0.58, 0.59, 0.60, 0.61, 0.78
)

n <- length(x)
xbar <- mean(x)
sumlogx <- sum(log(x))


# Log-likelihood function for Kumaraswamy distribution
kuma.loglik <- function(params, data){
  a <- params[1]
  b <- params[2]
  
  # Keep parameters positive
  if(a <= 0 || b <= 0){
    return(-1e10)
  }
  
  n <- length(data)
  
  # Log-likelihood
  ll <- n * log(a) + n * log(b) +
        (a - 1) * sum(log(data)) +
        (b - 1) * sum(log(1 - data^a))
  
  return(ll)
}

# Gradient (score vector) of the log-likelihood
kuma.grad <- function(params, data){
  a <- params[1]
  b <- params[2]
  
  n <- length(data)
  
  # Partial derivative with respect to a
  da <- n / a + sum(log(data)) -
        (b - 1) * sum((data^a * log(data)) / (1 - data^a))
  
  # Partial derivative with respect to b
  db <- n / b + sum(log(1 - data^a))
  
  return(c(da, db))
}

# MLE using optim() with gradient, following lecture style
mle_result <- optim(
  par = c(1, 1),
  fn = kuma.loglik,
  gr = kuma.grad,
  data = x,
  method = "L-BFGS-B",
  hessian = TRUE,
  lower = c(1e-8, 1e-8),
  control = list(
    maxit = 1000,
    fnscale = -1,
    trace = FALSE,
    abstol = 1e-8
  )
)

# Extract MLEs
a_hat <- mle_result$par[1]
b_hat <- mle_result$par[2]

# One clean output box
data.frame(
  a_hat = a_hat,
  b_hat = b_hat
)
     a_hat    b_hat
1 2.529601 7.883389

Conclusion:

The fitted Kumaraswamy distribution gives MLEs approximately \(\hat{a} \approx 2.53 \quad \text{and} \quad \hat{b} \approx 7.88\).

Problem B2:

Fit the power distribution to the above data using the derived of \(a\) obtained in Problem A4 to test the following hypothesis using likelihood ratio procedure ar significance level \(\alpha = 0.05\):

\[ H_0: b = 1 \quad \text{ versus } \quad H_a: b \ne 1. \]

State the statistical decision clearly. What is the practical implication of the testing result?

# Power distribution MLE of a from Part A4
a_hat_power <- -n / sum(log(x))

# Log-likelihood under the power model (b = 1)
power.loglik <- function(a, data){
  n <- length(data)
  ll <- n * log(a) + (a - 1) * sum(log(data))
  return(ll)
}

# Restricted and unrestricted log-likelihood values
ll_full <- kuma.loglik(c(a_hat, b_hat), x)
ll_restricted <- power.loglik(a_hat_power, x)

# Likelihood ratio test statistic
LR_b1 <- 2 * (ll_full - ll_restricted)

# p-value from chi-square(1)
p_value_b1 <- 1 - pchisq(LR_b1, df = 1)

data.frame(
  a_hat_power = a_hat_power,
  ll_full = ll_full,
  ll_restricted = ll_restricted,
  LR_stat = LR_b1,
  p_value = p_value_b1
)
  a_hat_power  ll_full ll_restricted  LR_stat      p_value
1   0.9393197 24.56271     0.1000435 48.92533 2.658984e-12

Conclusion:

Since the p-value is extremely small, we reject \(H_0: b = 1\). This means the power distribution is too restrictive for these data. In practical terms, the reservoir storage proportions are not adequately described by the one-parameter power model, and the second Kumaraswamy parameter b is needed for a better fit.


Problem B3:

Use the procedure and code from Problem B1 to estimate the MLEs of \(a\) and \(b\), and then complete the following analyses:

(1). Obtain the bootstrap sampling distributions of \(\hat{a}\) and \(\hat{b}\) and plot each distribution using Gaussian kernel density curves.

# Bootstrap sampling distributions of a_hat and b_hat
set.seed(123)

# Number of bootstrap samples
B <- 2000

# Store bootstrap estimates
boot_a <- NULL
boot_b <- NULL

for(i in 1:B){
  
  # Bootstrap sample
  boot_sample <- sample(x, size = n, replace = TRUE)
  
  # Refit Kumaraswamy model to bootstrap sample
  boot_fit <- optim(
    par = c(a_hat, b_hat),
    fn = kuma.loglik,
    gr = kuma.grad,
    data = boot_sample,
    method = "L-BFGS-B",
    lower = c(1e-8, 1e-8),
    control = list(
      maxit = 1000,
      fnscale = -1,
      trace = FALSE,
      abstol = 1e-8
    )
  )
  
  # Save bootstrap estimates
  boot_a[i] <- boot_fit$par[1]
  boot_b[i] <- boot_fit$par[2]
}
# Plot bootstrap distribution of a_hat
hist(boot_a,
     probability = TRUE,
     breaks = 20,
     main = "Bootstrap Distribution of a_hat",
     xlab = expression(hat(a)))
lines(density(boot_a), col = "blue", lwd = 2)

# Plot bootstrap distribution of b_hat
hist(boot_b,
     probability = TRUE,
     breaks = 20,
     main = "Bootstrap Distribution of b_hat",
     xlab = expression(hat(b)))
lines(density(boot_b), col = "blue", lwd = 2)

Conclusion:

The bootstrap sampling distribution of \(\hat{a}\) appears fairly concentrated and roughly symmetric around the MLE. In contrast, the bootstrap sampling distribution of \(\hat{b}\) is more spread out and shows noticeable right-skewness. The Gaussian kernel density curves confirm that the normal approximation is more reasonable for \(\hat{a}\) than for \(\hat{b}\).

(2). Construct both the \(95\%\) bootstrap confidence interval and the Wald confidence interval for \(b\). Do these intervals agree with the results obtained in Problem B2? [Compute the standard error of \(\hat{b}\) using the observed Fisher information matrix, i.e., the inverse of the negative Hessian obtained from optim()]

# 95% percentile bootstrap CI for b
ci_boot_b <- quantile(boot_b, probs = c(0.025, 0.975))

# Wald CI for b using observed Fisher information
Hess <- mle_result$hessian
covar <- solve(-Hess)
se_b_hat <- sqrt(covar[2, 2])

z <- qnorm(0.975)
ci_wald_b <- c(
  b_hat - z * se_b_hat,
  b_hat + z * se_b_hat
)

data.frame(
  lower_boot = ci_boot_b[1],
  upper_boot = ci_boot_b[2],
  lower_wald = ci_wald_b[1],
  upper_wald = ci_wald_b[2]
)
     lower_boot upper_boot lower_wald upper_wald
2.5%    5.03667   16.34823   3.484028   12.28275

Answer:

Yes. Both the 95% percentile bootstrap confidence interval and the Wald confidence interval for b lie entirely above 1. Therefore, both intervals agree with the likelihood ratio test result in Problem B2, which rejects \(H_0: b=1\).


(3). Based on the bootstrap sampling distributions from part (1) of this problem, assess whether the validity of the Wald confidence interval is supported.

Answer:

The Wald confidence interval is based on asymptotic normality, so it is better supported when the sampling distribution of the estimator is approximately symmetric. Here, the bootstrap distribution of \(\hat{b}\) shows noticeable right-skewness. This suggests that the normal approximation is not perfect, so the Wald confidence interval is less strongly supported than the bootstrap percentile interval. Therefore, the bootstrap interval is more appropriate for b in this analysis.


Problem B4:

In the introduction to the working model for this exam, the Kumaraswamy distribution reduces to the uniform distribution on (0,1). In this problem, we perform a likelihood ratio test for the following hypothesis to assess whether the data come from the uniform distribution on (0,1):

\[ H_0: a = 1\quad \& \quad b = 1\quad \text{ versus } \quad H_a: a \ne 1 \quad \text{or} \quad b \ne 1 \quad \text{or}\quad (a \ne 1 \quad \& \quad b \ne 1). \]

Provide a practical interpretation of the above test result. [Hint: \(H_a\) basically says that there is no constraints for \(a\) and \(b\). Please review the lecture note for module 11 on the likelihood ratio test before coding.]

# Log-likelihood under the null model a = 1, b = 1 (uniform distribution)
ll_null <- kuma.loglik(c(1, 1), x)

# Likelihood ratio statistic
LR_uniform <- 2 * (ll_full - ll_null)

# p-value from chi-square(2)
p_value_uniform <- 1 - pchisq(LR_uniform, df = 2)

data.frame(
  ll_full = ll_full,
  ll_null = ll_null,
  LR_stat = LR_uniform,
  p_value = p_value_uniform
)
   ll_full ll_null  LR_stat      p_value
1 24.56271       0 49.12542 2.150558e-11

Conclusion:

The p-value is extremely small, so we reject \(H_0: a=1, b = 1\). This means the reservoir storage proportions are not consistent with a uniform distribution on (0,1). In practical terms, the data show a clear distributional shape instead of being spread evenly across all possible storage levels. Therefore, the full Kumaraswamy model is more appropriate than the uniform model.

LS0tDQp0aXRsZTogIlNUQSA1MDYgRmluYWwgRXhhbWluYXRpb24iDQphdXRob3I6ICJYaWFveWluZyBNYSINCmRhdGU6ICIgRHVlOiBNYXkgNSwgMjAyNiAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgdG9jX2NvbGxhcHNlZDogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgc21vb3RoX3Njcm9sbDogeWVzDQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogICAgdGhlbWU6IHNwYWNlbGFiDQogIHBkZl9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgyIHsgLyogSGVhZGVyIDIgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTZweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImtuaXRyIikNCiAgIGxpYnJhcnkoa25pdHIpDQp9DQppZiAoIXJlcXVpcmUoInBhbmRlciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJwYW5kZXIiKQ0KICAgbGlicmFyeShwYW5kZXIpDQp9DQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCiAgbGlicmFyeShnZ3Bsb3QyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJ0aWR5dmVyc2UiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJ0aWR5dmVyc2UiKQ0KICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCg0KaWYgKCFyZXF1aXJlKCJwbG90bHkiKSkgew0KICBpbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQ0KICBsaWJyYXJ5KHBsb3RseSkNCn0NCiMjIyMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgICMgc29tZXRpbWVzLCB5b3UgY29kZSBtYXkgcHJvZHVjZSB3YXJuaW5nIG1lc3NhZ2VzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGUuIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBUUlVFLCAgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIHRoZSBvdXRwdXQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQQ0KICAgICAgICAgICAgICAgICAgICAgICkgIA0KYGBgDQogDQoNCiMjICoqV29ya2luZyBNb2RlbCBmb3IgdGhlIEZpbmFsIEV4YW0qKg0KDQo8Zm9udCBjb2xvciA9ICJvcmFuZ2UiPioqQ2F1dGlvbioqOiAqUGxlYXNlIGZvbGxvdyB0aGUgc3VnZ2VzdGVkIGV4cHJlc3Npb25zIGFuZCBndWlkZWQgc3RlcHMgdG8gY29tcGxldGUgdGhlIGV4YW0uIE90aGVyIGFwcHJvYWNoZXMgc3VjaCBhcyB0cmFuc2Zvcm1hdGlvbiBmb3IgdHJpdmlhbGl6ZSB0aGUgcHJvYmxlbXMgdGhhdCB3aWxsIG5vdCBtZWV0IHRoZSBleGFtIG9iamVjdGl2ZXMuKjwvZm9udD4NCg0KDQpUaGUgKipLdW1hcmFzd2FteSBkaXN0cmlidXRpb24qKiBpcyBhIHR3by1wYXJhbWV0ZXIgY29udGludW91cyBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24gZGVmaW5lZCBvbiB0aGUgaW50ZXJ2YWwgKDAsIDEpLiBJdCBpcyBvZnRlbiB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBCZXRhIGRpc3RyaWJ1dGlvbiBkdWUgdG8gaXRzIHNpbXBsZSBjbG9zZWQtZm9ybSBleHByZXNzaW9ucyBmb3IgdGhlIGN1bXVsYXRpdmUgZGlzdHJpYnV0aW9uIGZ1bmN0aW9uIChDREYpIGFuZCBxdWFudGlsZSBmdW5jdGlvbi4gSXQgaXMgY29tbW9ubHkgdXNlZCBpbiANCg0KKiAqKkh5ZHJvbG9neSoqOiBNb2RlbGluZyByYWluZmFsbCwgc3RyZWFtZmxvdywgb3Igb3RoZXIgYm91bmRlZCBuYXR1cmFsIHBoZW5vbWVuYQ0KDQoqICoqRWNvbm9taWNzKio6IEluY29tZSBzaGFyZXMsIHByb3BvcnRpb25zLCBvciBib3VuZGVkIGluZGljZXMNCg0KKiAqKk1vbnRlIENhcmxvIHNpbXVsYXRpb24qKjogRWZmaWNpZW50IHJhbmRvbSB2YXJpYXRlIGdlbmVyYXRpb24gKHZpYSBpbnZlcnNlIHRyYW5zZm9ybSkNCg0KKiAqKk1hY2hpbmUgbGVhcm5pbmcqKjogT3V0cHV0IGxheWVyIGZvciBib3VuZGVkIHRhcmdldHMsIHByaW9yIGRpc3RyaWJ1dGlvbnMgaW4gQmF5ZXNpYW4gbW9kZWxzDQoNCiogKipSZWxpYWJpbGl0eSBlbmdpbmVlcmluZyoqOiBNb2RlbGluZyBmYWlsdXJlIHJhdGVzIG9mIHN5c3RlbXMgd2l0aCBib3VuZGVkIGxpZmV0aW1lcw0KDQpcDQoNCkxldCAkWCQgYmUgdGhlIEt1bWFyYXN3YW15IHJhbmRvbSB2YXJpYWJsZSB3aXRoIEN1bXVsYXRpdmUgRGlzdHJpYnV0aW9uIEZ1bmN0aW9uIChDREYpICANCg0KJCQNCkYoeDsgYSwgYikgPSAxIC0gKDEgLSB4XmEpXmINCiQkDQoNCndoZXJlICRhID4gMCQgYW5kICRiID4gMCQgdW5rbm93biBwYXJhbWV0ZXJzIGFuZCAkMCA8IHggPCAxJC4gDQoNClRoZSBmb2xsb3dpbmcgYXJlIHR3byBzcGVjaWFsIGNhc2Ugb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbjoNCg0KMS4gKipVbmlmb3JtIERpc3RyaWJ1dGlvbioqOiBXaGVuICRhID0gMSQgYW5kICRiID0gMSQsIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gYmVjb21lcyBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG92ZXIgJFswLCAxXSQgd2l0aCBDREYgJEYoeCkgPSB4JC4NCg0KDQoyLiAqKlBvd2VyIERpc3RyaWJ1dGlvbioqOiB3aGVuICRiID0gMSQgYW5kICRhID4gMCQsIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gYmVjb21lcyBhIHBvd2VyIGRpc3RyaWJ1dGlvbiBvdmVyICRbMCwgMV0kIHdpdGggQ0RGICRGKHgpID0geF5hJC4gDQoNClRoaXMgZmluYWwgZXhhbSBmb2N1c2VzIG9uIGluZmVyZW5jZXMgb2YgS3VtYXJhc3dhbXkgZGlzdHJpYnV0aW9uIGFuZCByZWxhdGVkIGRhdGEgYW5hbHlzaXMuDQoNCg0KIyMgUGFydCBBOiBNZXRob2RvbG9naWNhbCBEZXJpdmF0aW9ucw0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQTEqKjogDQpTaG93IHRoYXQgdGhlIGRlbnNpdHkgZnVuY3Rpb24gb2YgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBpczoNCg0KJCQNCmYoeDsgYSwgYikgPSBhYiBcLCB4XnthLTF9ICgxIC0geF5hKV57Yi0xfS4NCiQkDQoqKkFuc3dlcjoqKg0KDQpUaGUgQ0RGIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gaXMgDQokJA0KRih4OyBhLCBiKSA9IDEgLSAoMSAtIHheYSleYiBccXVhZCwgMDx4PDEsYT4wLGI+MC4NCiQkDQpUbyBmaW5kIHRoZSBQREYgJGYoeDsgYSwgYikkLCB3ZSBjb21wdXRlOg0KJCQNCmYoeDsgYSwgYikgPSBcZnJhY3tkfXtkeH0gRih4OyBhLCBiKSA9IFxmcmFje2R9e2R4fSBcbGVmdFsgMSAtICgxIC0geF5hKV5iIFxyaWdodF0uDQokJA0KQXBwbHkgdGhlIHN1bSBydWxlIHRvIHNpbXBsaWZpZXMgdGhlIGV4bXByZXNzaW9uIHRvOg0KJCQNCmYoeDsgYSwgYikgPSAtIFxmcmFje2R9e2R4fSAoMSAtIHheYSleYg0KJCQNClRoZW4gdXNpbmcgdGhlIGNoYWluIHJ1bGUsIHRyZWF0ICQoMSAtIHheYSkkIGFzIHRoZSBpbm5lciBmdW5jdGlvbjoNCiQkDQpmKHg7IGEsIGIpID0gLSBcbGVmdFsgYigxIC0geF5hKV57Yi0xfSBcY2RvdCBcZnJhY3tkfXtkeH0oMSAtIHheYSkgXHJpZ2h0XQ0KJCQNClRoZXJlZm9yZToNCiQkDQpmKHg7IGEsIGIpID0gYWIgXCwgeF57YS0xfSAoMSAtIHheYSlee2ItMX0sIDAgPCB4IDwgMS4NCiQkDQpTbyB0aGUgZGVuc2l0eSBpczogDQokJA0KZih4OyBhLCBiKSA9IGFiIFwsIHhee2EtMX0gKDEgLSB4XmEpXntiLTF9Lg0KJCQNClwNCg0KIyMjICoqUHJvYmxlbSBBMioqOiANCkxldCAkXHt4XzEsIHhfMiwgXGNkb3RzLCB4X24gXH0kIGJlIGFuIGkuaS5kLiByYW5kb20gc2FtcGxlIHRha2VuIGZyb20gYSBwb3B1bGF0aW9uIHRoYXQgZm9sbG93cyB0aGUgYW92ZSAyLXBhcmFtZXRlciBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24uIFdyaXRlIG91dCB0aGUgbG9nbGlrZWxpaG9vZCBmdW5jdGlvbiBvZiAkYSQgYW5kICRiJCwgZGVub3RlZCBieSAkXGVsbChhLGIpJCwgYmFzZWQgb24gdGhlIGFib3ZlIHJhbmRvbSBzYW1wbGUgYW5kICoqZGVyaXZlKiogdGhlIGdyYWRpZW50IHZlY3RvciAkW1xlbGxfYV5ccHJpbWUoYSxiKSwgXGVsbF9iXlxwcmltZShhLGIpXSQsIHRoZSBmaXJzdCBvcmRlciBwYXJ0aWFsIGRlcml2YXRpdmUgb2YgdGhlIGxvZy1saWtlbGlob29kIHdpdGggcmVzcGVjdCB0byBwYXJhbWV0ZXJzICRhJCBhbmQgJGIkLg0KDQoqKkFuc3dlcjoqKg0KDQpHaXZlbiB0aGUgcHJvYmFiaWxpdHkgZGVuc2l0eSBmdW5jdGlvbiAoUERGKToNCiQkDQpmKHg7IGEsIGIpID0gYWIgXCwgeF57YS0xfSAoMSAtIHheYSlee2ItMX0NCiQkDQpUYWtpbmcgbG9ncyBnaXZlcyBoZSBMb2ctTGlrZWxpaG9vZCBGdW5jdGlvbjoNCiQkDQpcZWxsKGEsIGIpID0gbiBcbG4oYSkgKyBuIFxsbihiKSArIChhLTEpIFxzdW1fe2k9MX1ee259IFxsbih4X2kpICsgKGItMSkgXHN1bV97aT0xfV57bn0gXGxuKDEgLSB4X2leYSkNCiQkDQpUaGUgR3JhZGllbnQgVmVjdG9yIHdpdGggcmVzcGVjdCB0byAkYSQ6DQokJA0KXGVsbF9hXlxwcmltZShhLCBiKSA9IFxmcmFje259e2F9ICsgXHN1bV97aT0xfV57bn0gXGxuKHhfaSkgLSAoYi0xKSBcc3VtX3tpPTF9XntufSBcZnJhY3t4X2leYSBcbG4oeF9pKX17MSAtIHhfaV5hfQ0KJCQNClBhcnRpYWwgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gJGIkOg0KJCQNClxlbGxfYl5ccHJpbWUoYSwgYikgPSBcZnJhY3tufXtifSArIFxzdW1fe2k9MX1ee259IFxsbigxIC0geF9pXmEpDQokJA0KXA0KDQojIyMgKipQcm9ibGVtIEEzKio6IA0KQmFzZWQgb24gdGhlIGdyYWRpZW50cyBmdW5jdGlvbnMgb2J0YWluZWQgaW4gdGhlIGFib3ZlIHByb2JsZW0gQTIsICoqZGVyaXZlKiogdGhlIG9ic2VydmVkIEZpc2hlciBJbmZvcm1hdGlvbiBtYXRyaXggKGkuZSwgdGhlIG5lZ2F0aXZlIEhlc3NpYW4gTWF0cml4KS4NCg0KKipBbnN3ZXI6KioNCg0KRnJvbSBQcm9ibGVtIEEyLCB0aGUgZ3JhZGllbnQgZnVuY3Rpb25zIGFyZToNCiQkDQpcZWxsX2FeXHByaW1lKGEsIGIpID0gXGZyYWN7bn17YX0gKyBcc3VtX3tpPTF9XntufSBcbG4oeF9pKSAtIChiLTEpIFxzdW1fe2k9MX1ee259IFxmcmFje3hfaV5hIFxsbih4X2kpfXsxIC0geF9pXmF9DQokJA0KYW5kDQokJA0KXGVsbF9iXlxwcmltZShhLCBiKSA9IFxmcmFje259e2J9ICsgXHN1bV97aT0xfV57bn0gXGxuKDEgLSB4X2leYSkuDQokJA0KU2Vjb25kIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvICRhJCANCiQkDQpcZnJhY3tccGFydGlhbF4yIFxlbGx9e1xwYXJ0aWFsIGFeMn0gPSAtXGZyYWN7bn17YV4yfSAtIChiLTEpIFxzdW1fe2k9MX1ee259IFxmcmFje3hfaV5hIChcbG4geF9pKV4yfXsoMS14X2leYSleMn0NCiQkDQpTZWNvbmQgZGVyaXZhdGl2ZSB3aXRoIHJlc3BlY3QgdG8gJGIkIA0KJCQNClxmcmFje1xwYXJ0aWFsXjIgXGVsbH17XHBhcnRpYWwgYl4yfSA9IC1cZnJhY3tufXtiXjJ9DQokJA0KTWl4ZWQgT2JzZXJ2ZWQgSW5mb3JtYXRpb246DQokJA0KXGZyYWN7XHBhcnRpYWxeMiBcZWxsfXtccGFydGlhbCBhIFxwYXJ0aWFsIGJ9ID0gLVxzdW1fe2k9MX1ee259IFxmcmFje3hfaV5hIFxsbiB4X2l9ezEteF9pXmF9DQokJA0KVGhlcmVmb3JlLCB0aGUgSHNlZXNpYW4gbWF0cml4IGlzOg0KJCQNCkgoYSxiKSA9IFxiZWdpbntibWF0cml4fSAtXGZyYWN7bn17YV4yfSAtIChiLTEpIFxzdW1fe2k9MX1ee259IFxmcmFje3hfaV5hIChcbG4geF9pKV4yfXsoMS14X2leYSleMn0gJiAtXHN1bV97aT0xfV57bn0gXGZyYWN7eF9pXmEgXGxuIHhfaX17MS14X2leYX0gXFwgLVxzdW1fe2k9MX1ee259IFxmcmFje3hfaV5hIFxsbiB4X2l9ezEteF9pXmF9ICYgLVxmcmFje259e2JeMn0gXGVuZHtibWF0cml4fQ0KJCQNClRoZSBvYnNlcnZlZCBGaXNoZXIgSW5mb3JtYXRpb24gaXMgZGVmaW5lZCBhcyB0aGUgbmVnYXRpdmUgSGVzc2lhbiBtYXRyaXg6DQokJA0KSihhLGIpID0gLUgoYSxiKQ0KJCQNCg0KXA0KDQojIyMgKipQcm9ibGVtIEE0Kio6IA0KDQpDb25zaWRlciBwb3dlciBkaXN0cmlidXRpb24gJEYoeCkgPSB4XmEsIChhID4wIFxxdWFkIFx0ZXh0eyBhbmQgfVxxdWFkIHggXGluICgwLDEpKSQsIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBLdW1hcmFzd2FteSBkaXN0cmlidXRpb24gd2l0aCAkYiA9IDEkLCBhbmQgYSByYW5kb20gc2FtcGxlIGZyb20gdGhpcyBkaXN0cmlidXRpb24gJFx7IHhfMSwgeF8yLCBcY2RvdHMsIHhfblx9JC4gKipEZXJpdmUqKiB0aGUgTUxFIGFuZCBNTUUgb2YgJGEkIHJlc3BlY3RpdmVseS4gWypIaW50OiBUbyBmaW5kIHRoZSBNTUUsIHlvdSBuZWVkIHRvIGNvbXB1dGUgdGhlIG1vbWVudCBvZiB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uOyB0aGF0IGlzLCAkRVtYXmtdID0gXGludF8wXjEgeF5rIEYnKHgpIGR4JC4gTm90ZSB0aGF0IGJvdGggdGhlIE1MRSBhbmQgdGhlIE1NRSBoYXZlIGNsb3NlZC1mb3JtIGV4cHJlc3Npb25zLipdDQoNCioqQW5zd2VyOioqDQoNCk1heGltdW0gTGlrZWxpaG9vZCBFc3RpbWF0b3IgKE1MRSkgZGlmZmVyZW5pdGF0ZSB3aXRoIHJlc3BlY3QgdG8gJGEkOg0KJCQNClxmcmFje2RcZWxsfXtkYX0gPSBcZnJhY3tufXthfSArIFxzdW1fe2k9MX1ebiBcbG4geF9pID0gMA0KJCQNClRoZSBNTEUgJFxoYXR7YX0kIGlzOg0KJCQNClxoYXR7YX0gPSBcZnJhY3stbn17XHN1bV97aT0xfV5uIFxsbiB4X2l9DQokJA0KVGhlIE1NRSAkYSQ6DQoNCiQkDQpFW1hdID0gXGludF97MH1eezF9IHggZih4KSBkeCA9IFxpbnRfezB9XnsxfSB4KGF4XnthLTF9KSBkeCA9IGEgXGludF97MH1eezF9IHheYSBkeD1cZnJhY3thfXthKzF9DQokJA0Kd2Ugc2V0IHRoZSB0aGVvcmV0aWNhbCBtZWFuIGVxdWFsIHRvIHRoZSBzYW1wbGUgbWVhbiAkXGJhcnt4fSQ6DQokJA0KXGJhcnt4fSA9IFxmcmFje2F9e2ErMX0NCiQkDQpTb2x2aW5nIGZvciAkYSQ6DQokJA0KXGJhcnt4fShhICsgMSkgPSBhIA0KJCQNCiQkDQpcYmFye3h9YSArIFxiYXJ7eH0gPSBhDQokJA0KJCQNClxiYXJ7eH0gPSBhIC0gXGJhcnt4fWENCiQkDQokJA0KXGJhcnt4fSA9IGEoMSAtIFxiYXJ7eH0pDQokJA0KVGhlIE1NRSBpcyB0aGVyZWZvcmU6DQokJA0KXHRpbGRle2F9ID0gXGZyYWN7XGJhcnt4fX17MSAtIFxiYXJ7eH19DQokJA0KDQpcDQoNCiMjIyAqKlByb2JsZW0gQTUqKjoNCg0KVXNpbmcgdGhlIHNhbWUgc2V0dGluZyBhcyBpbiAqKlByb2JsZW0gQTQqKiwgZmluZCB0aGUgYXN5bXB0b3RpYyAoV2FsZCkgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgJGEkLiBbKkhpbnQ6IENvbXB1dGUgdGhlIEZpc2hlciBpbmZvcm1hdGlvbiBmb3IgJGEkLCB0aGVuIHRha2UgaXRzIHJlY2lwcm9jYWwgdG8gb2J0YWluIHRoZSB2YXJpYW5jZSouXQ0KDQoqKkFuc3dlcjoqKg0KDQpGaW5kIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZSBvZiB0aGUgbG9nLWxpa2VsaWhvb2QgZGVyaXZlZCBpbiBQcm9ibGVtIEE0Og0KJCQNClxlbGwoYSkgPSBuIFxsbihhKSArIChhLTEpIFxzdW1fe2k9MX1ee259IFxsbih4X2kpDQokJA0KVGhlIHNlY29uZCBkZXJpdmF0aXZlIG9mIHRoZSBsb2ctbGlrZWxpaG9vZCAkXGVsbChhKSQgd2l0aCByZXNwZWN0IHRvICRhJCBpczoNCiQkDQpcZnJhY3tkXjIgXGVsbH17ZCBhXjJ9ID0gLVxmcmFje259e2FeMn0NCiQkDQpTbywgdGhlIEZpc2hlciBpbmZvcm1hdGlvbiBmb3IgdGhlIHNhbXBsZSBpcyB0aGUgbmVnYXRpdmUgZXhwZWN0YXRpb24gb2YgdGhlIHNlY29uZCBkZXJpdmF0aXZlOg0KJCQNCklfbihhKSA9IC1FXGxlZnRbIFxmcmFje2ReMiBcZWxsfXtkIGFeMn0gXHJpZ2h0XSA9IFxmcmFje259e2FeMn0NCiQkDQpUaGVyZWZvcmUsDQokJA0KXHRleHR7VmFyfShcaGF0e2F9KSBcYXBwcm94IFxmcmFje2FeMn17bn0NCiQkDQpVc2luZyB0aGUgcGx1Zy1pbiBwcmluY2lwbGUsIHdlIGVzdGltYXRlIHRoaXMgdmFyaWFuY2UgdXNpbmcgdGhlIE1MRSAkXGhhdHthfSQ6DQokJA0KXHdpZGVoYXR7XHRleHR7VmFyfX0oXGhhdHthfSkgPSBcZnJhY3tcaGF0e2F9XjJ9e259DQokJA0KVGh1cyB0aGUgYXN5bXB0b3RpYyAkKDEgLSBcYWxwaGEpIFx0aW1lcyAxMDBcJSQgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGZvciAkYSQgaXM6DQokJA0KXGhhdHthfSBccG0gel97MS1cYWxwaGEvMn0gXGZyYWN7XGhhdHthfX17XHNxcnR7bn19DQokJA0KRm9yIGEgOTUlIGNvbmZpZGVuY2UgaW50ZXJ2YWwgKCR6X3swLjk3NX0gXGFwcHJveCAxLjk2JCk6DQokJA0KXGxlZnRbIFxoYXR7YX0gXGxlZnQoIDEgLSBcZnJhY3sxLjk2fXtcc3FydHtufX0gXHJpZ2h0KSwgXHF1YWQgXGhhdHthfSBcbGVmdCggMSArIFxmcmFjezEuOTZ9e1xzcXJ0e259fSBccmlnaHQpIFxyaWdodF0NCiQkDQpcDQoNCiMjIyAqKlByb2JsZW0gQTYqKjoNCg0KVXNpbmcgdGhlIHNhbWUgc2V0dGluZyBhcyBpbiAqKlByb2JsZW0gQTQqKiwgcGVyZm9ybSBhIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBmb3IgdGhlIGh5cG90aGVzaXMgJEhfMCA6YT0xJCAoaS5lLiwgdGhlIHBvd2VyIGRpc3RyaWJ1dGlvbiByZWR1Y2VzIHRvIGEgdW5pZm9ybSBkaXN0cmlidXRpb24pLiBbKkhpbnQ6IEV2YWx1YXRlIHRoZSBsb2ctbGlrZWxpaG9vZCBmdW5jdGlvbiBhdCB0aGUgbWF4aW11bSBsaWtlbGlob29kIGVzdGltYXRlICRcaGF0e2F9JCBhbmQgYXQgJGE9MSQsIHRoZW4gdXNlIHRoZXNlIHZhbHVlcyB0byBjb25zdHJ1Y3QgdGhlIExSVCB0ZXN0IHN0YXRpc3RpYy4qXQ0KDQoqKkFuc3dlcjoqKg0KDQpXZSB0ZXN0Og0KJCQNCkhfMDogYSA9IDEgXHF1YWQgXHRleHR7dnMufSBccXVhZCBIX2E6IGEgXG5lcSAxDQokJA0KVGhlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMgaXM6DQokJA0KTFIgPSAyIFxsZWZ0WyBcZWxsKFxoYXR7YX0pIC0gXGVsbCgxKSBccmlnaHRdDQokJA0KVW5kZXIgdGhlIHBvd2VyIG1vZGVsOg0KJCQNClxlbGwoYSkgPSBuIFxsbihhKSArIChhLTEpIFxzdW1fe2k9MX1ee259IFxsbih4X2kpDQokJA0KDQpVbmRlciB0aGUgQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyAoJEhfYTogYSA9IFxoYXR7YX0kKToNCiQkXGVsbChIX2EpID0gXGVsbChcaGF0e2F9KSA9IG4gXGxuKFxoYXR7YX0pICsgKFxoYXR7YX0tMSkgXHN1bV97aT0xfV57bn0gXGxuKHhfaSkkJA0KJCRcZWxsKDEpID0gbiBcbG4oMSkgKyAoMS0xKSBcc3VtX3tpPTF9XntufSBcbG4oeF9pKT0wJCQNCkhlbmNlLA0KJCQNCkxSID0gMiBbIG4gXGxuIFxoYXR7YX0gKyAoXGhhdHthfS0xKSBcc3VtX3tpPTF9XntufSBcbG4oeF9pKV0NCiQkDQpVbmRlciAkSF8wJCwgZm9yIGxhcmdlICRuJDoNCiQkTFIgXHNpbSBcY2hpXjJfMSQkDQpSZWplY3QgJEhfMCQgYXQgdGhlIDUlIHNpZ25pZmljYW5jZSBsZXZlbCBpZjoNCiQkTFIgPiAzLjg0MSQkDQoNClwNCg0KIyMgUGFydCBCOiBOdW1lcmljYWwgQW5hbHlzaXMNCg0KKipBbGwgY29kZSBtdXN0IGJlIHdlbGwgY29tbWVudGVkIGFuZCBhZGhlcmUgdG8gYmVzdCBjb2RpbmcgcHJhY3RpY2VzKioNCg0KKipXb3JraW5nIERhdGFzZXQqKjogQSBzbWFsbCByZXNlcnZvaXIgc3VwcGxpZXMgd2F0ZXIgdG8gYSB0b3duLiBEdXJpbmcgdGhlIGRyeSBzZWFzb24gKDUwIGRheXMpLCBlbmdpbmVlcnMgcmVjb3JkIHRoZSBmcmFjdGlvbiBvZiB1c2FibGUgc3RvcmFnZSBmaWxsZWQgZWFjaCBtb3JuaW5nLiBWYWx1ZXMgbmVhciAwIG1lYW4gdGhlIHJlc2Vydm9pciBpcyBuZWFybHkgZW1wdHk7IHZhbHVlcyBuZWFyIDEgbWVhbiBpdCdzIGZ1bGwuIFRoZSBkaXN0cmlidXRpb24gdGVuZHMgdG8gYmUgcmlnaHTigJFza2V3ZWQgKG1vc3RseSBsb3cgbGV2ZWxzIGR1ZSB0byBkcm91Z2h0KSBidXQgd2l0aCBvY2Nhc2lvbmFsIHJlcGxlbmlzaG1lbnQuDQoNClRoZSBmb2xsb3dpbmcgNTAgZGF0YSBwb2ludHMgKG9yZGVyZWQgZm9yIGNsYXJpdHkpIHJlcHJlc2VudCB0aGUgZGFpbHkgcHJvcG9ydGlvbiBvZiB1c2FibGUgc3RvcmFnZToNCg0KYGBgDQowLjEyLCAwLjE0LCAwLjE1LCAwLjE2LCAwLjE3LCAwLjE4LCAwLjE5LCAwLjIwLCAwLjIxLCAwLjIyLA0KMC4yMywgMC4yNCwgMC4yNSwgMC4yNiwgMC4yNywgMC4yOCwgMC4yOSwgMC4zMCwgMC4zMSwgMC4zMiwNCjAuMzMsIDAuMzQsIDAuMzUsIDAuMzYsIDAuMzcsIDAuMzgsIDAuMzksIDAuNDAsIDAuNDEsIDAuNDIsDQowLjQzLCAwLjQ0LCAwLjQ1LCAwLjQ2LCAwLjQ3LCAwLjQ4LCAwLjQ5LCAwLjUwLCAwLjUxLCAwLjUyLA0KMC41MywgMC41NCwgMC41NSwgMC41NiwgMC41NywgMC41OCwgMC41OSwgMC42MCwgMC42MSwgMC43OA0KYGBgDQoNClwNCg0KIyMjICoqUHJvYmxlbSBCMSoqOg0KDQpGaXQgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiB0byB0aGUgYWJvdmUgZGF0YS4gVXNlIHRoZSBkZXJpdmF0aW9ucyBpbiAqKlByb2JsZW0gQTIqKiB0byBmaW5kIHRoZSBNTEUgb2YgJGEkIGFuZCAkYiQuIFBsZWFzZSBjb3B5IHRoZSBrZXkgZm9ybXVsYXMgYmVmb3JlIGNvZGluZy4NCg0KKipLZXkgZm9ybXVsYXM6KioNCg0KVGhlIGxvZy1saWtlbGlob29kIGlzDQokJFxlbGwoYSxiKSA9IG4gXGxuIGEgKyBuIFxsbiBiICsgKGEtMSkgXHN1bV97aT0xfV57bn0gXGxuIHhfaSArIChiLTEpIFxzdW1fe2k9MX1ee259IFxsbigxIC0geF9pXmEpJCQNClRoZSBncmFkaWVudCBpcw0KJCRcZWxsX2FeXHByaW1lKGEsYikgPSBcZnJhY3tufXthfSArIFxzdW1fe2k9MX1ee259IFxsbiB4X2kgLSAoYi0xKSBcc3VtX3tpPTF9XntufSBcZnJhY3t4X2leYSBcbG4geF9pfXsxIC0geF9pXmF9JCQNCiQkXGVsbF9iXlxwcmltZShhLGIpID0gXGZyYWN7bn17Yn0gKyBcc3VtX3tpPTF9XntufSBcbG4oMSAtIHhfaV5hKSQkDQoNCmBgYHtyfQ0KIyBkYXRhDQp4IDwtIGMoDQogIDAuMTIsIDAuMTQsIDAuMTUsIDAuMTYsIDAuMTcsIDAuMTgsIDAuMTksIDAuMjAsIDAuMjEsIDAuMjIsDQogIDAuMjMsIDAuMjQsIDAuMjUsIDAuMjYsIDAuMjcsIDAuMjgsIDAuMjksIDAuMzAsIDAuMzEsIDAuMzIsDQogIDAuMzMsIDAuMzQsIDAuMzUsIDAuMzYsIDAuMzcsIDAuMzgsIDAuMzksIDAuNDAsIDAuNDEsIDAuNDIsDQogIDAuNDMsIDAuNDQsIDAuNDUsIDAuNDYsIDAuNDcsIDAuNDgsIDAuNDksIDAuNTAsIDAuNTEsIDAuNTIsDQogIDAuNTMsIDAuNTQsIDAuNTUsIDAuNTYsIDAuNTcsIDAuNTgsIDAuNTksIDAuNjAsIDAuNjEsIDAuNzgNCikNCg0KbiA8LSBsZW5ndGgoeCkNCnhiYXIgPC0gbWVhbih4KQ0Kc3VtbG9neCA8LSBzdW0obG9nKHgpKQ0KDQoNCiMgTG9nLWxpa2VsaWhvb2QgZnVuY3Rpb24gZm9yIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbg0Ka3VtYS5sb2dsaWsgPC0gZnVuY3Rpb24ocGFyYW1zLCBkYXRhKXsNCiAgYSA8LSBwYXJhbXNbMV0NCiAgYiA8LSBwYXJhbXNbMl0NCiAgDQogICMgS2VlcCBwYXJhbWV0ZXJzIHBvc2l0aXZlDQogIGlmKGEgPD0gMCB8fCBiIDw9IDApew0KICAgIHJldHVybigtMWUxMCkNCiAgfQ0KICANCiAgbiA8LSBsZW5ndGgoZGF0YSkNCiAgDQogICMgTG9nLWxpa2VsaWhvb2QNCiAgbGwgPC0gbiAqIGxvZyhhKSArIG4gKiBsb2coYikgKw0KICAgICAgICAoYSAtIDEpICogc3VtKGxvZyhkYXRhKSkgKw0KICAgICAgICAoYiAtIDEpICogc3VtKGxvZygxIC0gZGF0YV5hKSkNCiAgDQogIHJldHVybihsbCkNCn0NCg0KIyBHcmFkaWVudCAoc2NvcmUgdmVjdG9yKSBvZiB0aGUgbG9nLWxpa2VsaWhvb2QNCmt1bWEuZ3JhZCA8LSBmdW5jdGlvbihwYXJhbXMsIGRhdGEpew0KICBhIDwtIHBhcmFtc1sxXQ0KICBiIDwtIHBhcmFtc1syXQ0KICANCiAgbiA8LSBsZW5ndGgoZGF0YSkNCiAgDQogICMgUGFydGlhbCBkZXJpdmF0aXZlIHdpdGggcmVzcGVjdCB0byBhDQogIGRhIDwtIG4gLyBhICsgc3VtKGxvZyhkYXRhKSkgLQ0KICAgICAgICAoYiAtIDEpICogc3VtKChkYXRhXmEgKiBsb2coZGF0YSkpIC8gKDEgLSBkYXRhXmEpKQ0KICANCiAgIyBQYXJ0aWFsIGRlcml2YXRpdmUgd2l0aCByZXNwZWN0IHRvIGINCiAgZGIgPC0gbiAvIGIgKyBzdW0obG9nKDEgLSBkYXRhXmEpKQ0KICANCiAgcmV0dXJuKGMoZGEsIGRiKSkNCn0NCg0KIyBNTEUgdXNpbmcgb3B0aW0oKSB3aXRoIGdyYWRpZW50LCBmb2xsb3dpbmcgbGVjdHVyZSBzdHlsZQ0KbWxlX3Jlc3VsdCA8LSBvcHRpbSgNCiAgcGFyID0gYygxLCAxKSwNCiAgZm4gPSBrdW1hLmxvZ2xpaywNCiAgZ3IgPSBrdW1hLmdyYWQsDQogIGRhdGEgPSB4LA0KICBtZXRob2QgPSAiTC1CRkdTLUIiLA0KICBoZXNzaWFuID0gVFJVRSwNCiAgbG93ZXIgPSBjKDFlLTgsIDFlLTgpLA0KICBjb250cm9sID0gbGlzdCgNCiAgICBtYXhpdCA9IDEwMDAsDQogICAgZm5zY2FsZSA9IC0xLA0KICAgIHRyYWNlID0gRkFMU0UsDQogICAgYWJzdG9sID0gMWUtOA0KICApDQopDQoNCiMgRXh0cmFjdCBNTEVzDQphX2hhdCA8LSBtbGVfcmVzdWx0JHBhclsxXQ0KYl9oYXQgPC0gbWxlX3Jlc3VsdCRwYXJbMl0NCg0KIyBPbmUgY2xlYW4gb3V0cHV0IGJveA0KZGF0YS5mcmFtZSgNCiAgYV9oYXQgPSBhX2hhdCwNCiAgYl9oYXQgPSBiX2hhdA0KKQ0KDQpgYGANCioqQ29uY2x1c2lvbjoqKg0KDQpUaGUgZml0dGVkIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiBnaXZlcyBNTEVzIGFwcHJveGltYXRlbHkgJFxoYXR7YX0gXGFwcHJveCAyLjUzIFxxdWFkIFx0ZXh0e2FuZH0gXHF1YWQgXGhhdHtifSBcYXBwcm94IDcuODgkLg0KXA0KDQojIyMgKipQcm9ibGVtIEIyKio6DQoNCkZpdCB0aGUgKipwb3dlciBkaXN0cmlidXRpb24qKiB0byB0aGUgYWJvdmUgZGF0YSB1c2luZyB0aGUgZGVyaXZlZCAgb2YgJGEkIG9idGFpbmVkIGluICoqUHJvYmxlbSBBNCoqIHRvIHRlc3QgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2lzIHVzaW5nIGxpa2VsaWhvb2QgcmF0aW8gcHJvY2VkdXJlIGFyIHNpZ25pZmljYW5jZSBsZXZlbCAkXGFscGhhID0gMC4wNSQ6DQoNCiQkDQpIXzA6IGIgPSAxIFxxdWFkIFx0ZXh0eyB2ZXJzdXMgfSBccXVhZCBIX2E6IGIgXG5lIDEuDQokJA0KDQpTdGF0ZSB0aGUgc3RhdGlzdGljYWwgZGVjaXNpb24gY2xlYXJseS4gV2hhdCBpcyB0aGUgcHJhY3RpY2FsIGltcGxpY2F0aW9uIG9mIHRoZSB0ZXN0aW5nIHJlc3VsdD8NCg0KYGBge3J9DQojIFBvd2VyIGRpc3RyaWJ1dGlvbiBNTEUgb2YgYSBmcm9tIFBhcnQgQTQNCmFfaGF0X3Bvd2VyIDwtIC1uIC8gc3VtKGxvZyh4KSkNCg0KIyBMb2ctbGlrZWxpaG9vZCB1bmRlciB0aGUgcG93ZXIgbW9kZWwgKGIgPSAxKQ0KcG93ZXIubG9nbGlrIDwtIGZ1bmN0aW9uKGEsIGRhdGEpew0KICBuIDwtIGxlbmd0aChkYXRhKQ0KICBsbCA8LSBuICogbG9nKGEpICsgKGEgLSAxKSAqIHN1bShsb2coZGF0YSkpDQogIHJldHVybihsbCkNCn0NCg0KIyBSZXN0cmljdGVkIGFuZCB1bnJlc3RyaWN0ZWQgbG9nLWxpa2VsaWhvb2QgdmFsdWVzDQpsbF9mdWxsIDwtIGt1bWEubG9nbGlrKGMoYV9oYXQsIGJfaGF0KSwgeCkNCmxsX3Jlc3RyaWN0ZWQgPC0gcG93ZXIubG9nbGlrKGFfaGF0X3Bvd2VyLCB4KQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gdGVzdCBzdGF0aXN0aWMNCkxSX2IxIDwtIDIgKiAobGxfZnVsbCAtIGxsX3Jlc3RyaWN0ZWQpDQoNCiMgcC12YWx1ZSBmcm9tIGNoaS1zcXVhcmUoMSkNCnBfdmFsdWVfYjEgPC0gMSAtIHBjaGlzcShMUl9iMSwgZGYgPSAxKQ0KDQpkYXRhLmZyYW1lKA0KICBhX2hhdF9wb3dlciA9IGFfaGF0X3Bvd2VyLA0KICBsbF9mdWxsID0gbGxfZnVsbCwNCiAgbGxfcmVzdHJpY3RlZCA9IGxsX3Jlc3RyaWN0ZWQsDQogIExSX3N0YXQgPSBMUl9iMSwNCiAgcF92YWx1ZSA9IHBfdmFsdWVfYjENCikNCmBgYA0KDQoqKkNvbmNsdXNpb246KioNCg0KU2luY2UgdGhlIHAtdmFsdWUgaXMgZXh0cmVtZWx5IHNtYWxsLCB3ZSByZWplY3QgJEhfMDogYiA9IDEkLg0KVGhpcyBtZWFucyB0aGUgcG93ZXIgZGlzdHJpYnV0aW9uIGlzIHRvbyByZXN0cmljdGl2ZSBmb3IgdGhlc2UgZGF0YS4gSW4gcHJhY3RpY2FsIHRlcm1zLCB0aGUgcmVzZXJ2b2lyIHN0b3JhZ2UgcHJvcG9ydGlvbnMgYXJlIG5vdCBhZGVxdWF0ZWx5IGRlc2NyaWJlZCBieSB0aGUgb25lLXBhcmFtZXRlciBwb3dlciBtb2RlbCwgYW5kIHRoZSBzZWNvbmQgS3VtYXJhc3dhbXkgcGFyYW1ldGVyIGIgaXMgbmVlZGVkIGZvciBhIGJldHRlciBmaXQuDQoNClwNCg0KIyMjICoqUHJvYmxlbSBCMyoqOg0KDQpVc2UgdGhlIHByb2NlZHVyZSBhbmQgY29kZSBmcm9tICoqUHJvYmxlbSBCMSoqIHRvIGVzdGltYXRlIHRoZSBNTEVzIG9mICRhJCBhbmQgJGIkLCBhbmQgdGhlbiBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGFuYWx5c2VzOg0KDQooMSkuIE9idGFpbiB0aGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbnMgb2YgJFxoYXR7YX0kIGFuZCAkXGhhdHtifSQgYW5kIHBsb3QgZWFjaCBkaXN0cmlidXRpb24gdXNpbmcgKipHYXVzc2lhbiBrZXJuZWwgZGVuc2l0eSBjdXJ2ZXMqKi4NCg0KYGBge3J9DQojIEJvb3RzdHJhcCBzYW1wbGluZyBkaXN0cmlidXRpb25zIG9mIGFfaGF0IGFuZCBiX2hhdA0Kc2V0LnNlZWQoMTIzKQ0KDQojIE51bWJlciBvZiBib290c3RyYXAgc2FtcGxlcw0KQiA8LSAyMDAwDQoNCiMgU3RvcmUgYm9vdHN0cmFwIGVzdGltYXRlcw0KYm9vdF9hIDwtIE5VTEwNCmJvb3RfYiA8LSBOVUxMDQoNCmZvcihpIGluIDE6Qil7DQogIA0KICAjIEJvb3RzdHJhcCBzYW1wbGUNCiAgYm9vdF9zYW1wbGUgPC0gc2FtcGxlKHgsIHNpemUgPSBuLCByZXBsYWNlID0gVFJVRSkNCiAgDQogICMgUmVmaXQgS3VtYXJhc3dhbXkgbW9kZWwgdG8gYm9vdHN0cmFwIHNhbXBsZQ0KICBib290X2ZpdCA8LSBvcHRpbSgNCiAgICBwYXIgPSBjKGFfaGF0LCBiX2hhdCksDQogICAgZm4gPSBrdW1hLmxvZ2xpaywNCiAgICBnciA9IGt1bWEuZ3JhZCwNCiAgICBkYXRhID0gYm9vdF9zYW1wbGUsDQogICAgbWV0aG9kID0gIkwtQkZHUy1CIiwNCiAgICBsb3dlciA9IGMoMWUtOCwgMWUtOCksDQogICAgY29udHJvbCA9IGxpc3QoDQogICAgICBtYXhpdCA9IDEwMDAsDQogICAgICBmbnNjYWxlID0gLTEsDQogICAgICB0cmFjZSA9IEZBTFNFLA0KICAgICAgYWJzdG9sID0gMWUtOA0KICAgICkNCiAgKQ0KICANCiAgIyBTYXZlIGJvb3RzdHJhcCBlc3RpbWF0ZXMNCiAgYm9vdF9hW2ldIDwtIGJvb3RfZml0JHBhclsxXQ0KICBib290X2JbaV0gPC0gYm9vdF9maXQkcGFyWzJdDQp9DQpgYGANCg0KYGBge3J9DQoNCiMgUGxvdCBib290c3RyYXAgZGlzdHJpYnV0aW9uIG9mIGFfaGF0DQpoaXN0KGJvb3RfYSwNCiAgICAgcHJvYmFiaWxpdHkgPSBUUlVFLA0KICAgICBicmVha3MgPSAyMCwNCiAgICAgbWFpbiA9ICJCb290c3RyYXAgRGlzdHJpYnV0aW9uIG9mIGFfaGF0IiwNCiAgICAgeGxhYiA9IGV4cHJlc3Npb24oaGF0KGEpKSkNCmxpbmVzKGRlbnNpdHkoYm9vdF9hKSwgY29sID0gImJsdWUiLCBsd2QgPSAyKQ0KDQojIFBsb3QgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBvZiBiX2hhdA0KaGlzdChib290X2IsDQogICAgIHByb2JhYmlsaXR5ID0gVFJVRSwNCiAgICAgYnJlYWtzID0gMjAsDQogICAgIG1haW4gPSAiQm9vdHN0cmFwIERpc3RyaWJ1dGlvbiBvZiBiX2hhdCIsDQogICAgIHhsYWIgPSBleHByZXNzaW9uKGhhdChiKSkpDQpsaW5lcyhkZW5zaXR5KGJvb3RfYiksIGNvbCA9ICJibHVlIiwgbHdkID0gMikNCg0KYGBgDQoNCioqQ29uY2x1c2lvbjoqKg0KDQpUaGUgYm9vdHN0cmFwIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiAkXGhhdHthfSQgYXBwZWFycyBmYWlybHkgY29uY2VudHJhdGVkIGFuZCByb3VnaGx5IHN5bW1ldHJpYyBhcm91bmQgdGhlIE1MRS4gSW4gY29udHJhc3QsIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9uIG9mICRcaGF0e2J9JCBpcyBtb3JlIHNwcmVhZCBvdXQgYW5kIHNob3dzIG5vdGljZWFibGUgcmlnaHQtc2tld25lc3MuIFRoZSBHYXVzc2lhbiBrZXJuZWwgZGVuc2l0eSBjdXJ2ZXMgY29uZmlybSB0aGF0IHRoZSBub3JtYWwgYXBwcm94aW1hdGlvbiBpcyBtb3JlIHJlYXNvbmFibGUgZm9yICRcaGF0e2F9JCB0aGFuIGZvciAkXGhhdHtifSQuDQoNCigyKS4gIENvbnN0cnVjdCBib3RoIHRoZSAkOTVcJSQgKipib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCoqIGFuZCB0aGUgKipXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwqKiBmb3IgJGIkLiBEbyB0aGVzZSBpbnRlcnZhbHMgYWdyZWUgd2l0aCB0aGUgcmVzdWx0cyBvYnRhaW5lZCBpbiAqKlByb2JsZW0gQjIqKj8gWypDb21wdXRlIHRoZSBzdGFuZGFyZCBlcnJvciBvZiAkXGhhdHtifSQgdXNpbmcgdGhlIG9ic2VydmVkIEZpc2hlciBpbmZvcm1hdGlvbiBtYXRyaXgsIGkuZS4sIHRoZSBpbnZlcnNlIG9mIHRoZSBuZWdhdGl2ZSBIZXNzaWFuIG9idGFpbmVkIGZyb20gb3B0aW0oKSpdDQoNCmBgYHtyfQ0KIyA5NSUgcGVyY2VudGlsZSBib290c3RyYXAgQ0kgZm9yIGINCmNpX2Jvb3RfYiA8LSBxdWFudGlsZShib290X2IsIHByb2JzID0gYygwLjAyNSwgMC45NzUpKQ0KDQojIFdhbGQgQ0kgZm9yIGIgdXNpbmcgb2JzZXJ2ZWQgRmlzaGVyIGluZm9ybWF0aW9uDQpIZXNzIDwtIG1sZV9yZXN1bHQkaGVzc2lhbg0KY292YXIgPC0gc29sdmUoLUhlc3MpDQpzZV9iX2hhdCA8LSBzcXJ0KGNvdmFyWzIsIDJdKQ0KDQp6IDwtIHFub3JtKDAuOTc1KQ0KY2lfd2FsZF9iIDwtIGMoDQogIGJfaGF0IC0geiAqIHNlX2JfaGF0LA0KICBiX2hhdCArIHogKiBzZV9iX2hhdA0KKQ0KDQpkYXRhLmZyYW1lKA0KICBsb3dlcl9ib290ID0gY2lfYm9vdF9iWzFdLA0KICB1cHBlcl9ib290ID0gY2lfYm9vdF9iWzJdLA0KICBsb3dlcl93YWxkID0gY2lfd2FsZF9iWzFdLA0KICB1cHBlcl93YWxkID0gY2lfd2FsZF9iWzJdDQopDQpgYGANCg0KKipBbnN3ZXI6KioNCg0KWWVzLiBCb3RoIHRoZSA5NSUgcGVyY2VudGlsZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbCBhbmQgdGhlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBmb3IgYiBsaWUgZW50aXJlbHkgYWJvdmUgMS4gVGhlcmVmb3JlLCBib3RoIGludGVydmFscyBhZ3JlZSB3aXRoIHRoZSBsaWtlbGlob29kIHJhdGlvIHRlc3QgcmVzdWx0IGluIFByb2JsZW0gQjIsIHdoaWNoIHJlamVjdHMgJEhfMDogYj0xJC4NCg0KXA0KDQooMykuIEJhc2VkIG9uIHRoZSBib290c3RyYXAgc2FtcGxpbmcgZGlzdHJpYnV0aW9ucyBmcm9tIHBhcnQgKDEpIG9mIHRoaXMgcHJvYmxlbSwgYXNzZXNzIHdoZXRoZXIgdGhlIHZhbGlkaXR5IG9mIHRoZSBXYWxkIGNvbmZpZGVuY2UgaW50ZXJ2YWwgaXMgc3VwcG9ydGVkLg0KDQoqKkFuc3dlcjoqKg0KDQpUaGUgV2FsZCBjb25maWRlbmNlIGludGVydmFsIGlzIGJhc2VkIG9uIGFzeW1wdG90aWMgbm9ybWFsaXR5LCBzbyBpdCBpcyBiZXR0ZXIgc3VwcG9ydGVkIHdoZW4gdGhlIHNhbXBsaW5nIGRpc3RyaWJ1dGlvbiBvZiB0aGUgZXN0aW1hdG9yIGlzIGFwcHJveGltYXRlbHkgc3ltbWV0cmljLiBIZXJlLCB0aGUgYm9vdHN0cmFwIGRpc3RyaWJ1dGlvbiBvZiAkXGhhdHtifSQgc2hvd3Mgbm90aWNlYWJsZSByaWdodC1za2V3bmVzcy4gVGhpcyBzdWdnZXN0cyB0aGF0IHRoZSBub3JtYWwgYXBwcm94aW1hdGlvbiBpcyBub3QgcGVyZmVjdCwgc28gdGhlIFdhbGQgY29uZmlkZW5jZSBpbnRlcnZhbCBpcyBsZXNzIHN0cm9uZ2x5IHN1cHBvcnRlZCB0aGFuIHRoZSBib290c3RyYXAgcGVyY2VudGlsZSBpbnRlcnZhbC4gVGhlcmVmb3JlLCB0aGUgYm9vdHN0cmFwIGludGVydmFsIGlzIG1vcmUgYXBwcm9wcmlhdGUgZm9yIGIgaW4gdGhpcyBhbmFseXNpcy4NCg0KXA0KDQojIyMgKipQcm9ibGVtIEI0Kio6DQoNCkluIHRoZSBpbnRyb2R1Y3Rpb24gdG8gdGhlIHdvcmtpbmcgbW9kZWwgZm9yIHRoaXMgZXhhbSwgdGhlIEt1bWFyYXN3YW15IGRpc3RyaWJ1dGlvbiByZWR1Y2VzIHRvIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvbiAoMCwxKS4gSW4gdGhpcyBwcm9ibGVtLCB3ZSBwZXJmb3JtIGEgKipsaWtlbGlob29kIHJhdGlvIHRlc3QqKiBmb3IgdGhlIGZvbGxvd2luZyBoeXBvdGhlc2lzIHRvIGFzc2VzcyB3aGV0aGVyIHRoZSBkYXRhIGNvbWUgZnJvbSB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24gb24gKDAsMSk6DQoNCiQkDQpIXzA6IGEgPSAxXHF1YWQgXCYgXHF1YWQgYiA9IDFccXVhZCBcdGV4dHsgdmVyc3VzIH0gXHF1YWQgSF9hOiBhIFxuZSAxIFxxdWFkIFx0ZXh0e29yfSBccXVhZCBiIFxuZSAxIFxxdWFkIFx0ZXh0e29yfVxxdWFkIChhIFxuZSAxIFxxdWFkIFwmIFxxdWFkIGIgXG5lIDEpLg0KJCQNCg0KUHJvdmlkZSBhIHByYWN0aWNhbCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYWJvdmUgdGVzdCByZXN1bHQuIFsqSGludDogJEhfYSQgYmFzaWNhbGx5IHNheXMgdGhhdCB0aGVyZSBpcyBubyBjb25zdHJhaW50cyBmb3IgJGEkIGFuZCAkYiQuIFBsZWFzZSByZXZpZXcgdGhlIGxlY3R1cmUgbm90ZSBmb3IgbW9kdWxlIDExICBvbiB0aGUgbGlrZWxpaG9vZCByYXRpbyB0ZXN0IGJlZm9yZSBjb2RpbmcuKl0NCmBgYHtyfQ0KIyBMb2ctbGlrZWxpaG9vZCB1bmRlciB0aGUgbnVsbCBtb2RlbCBhID0gMSwgYiA9IDEgKHVuaWZvcm0gZGlzdHJpYnV0aW9uKQ0KbGxfbnVsbCA8LSBrdW1hLmxvZ2xpayhjKDEsIDEpLCB4KQ0KDQojIExpa2VsaWhvb2QgcmF0aW8gc3RhdGlzdGljDQpMUl91bmlmb3JtIDwtIDIgKiAobGxfZnVsbCAtIGxsX251bGwpDQoNCiMgcC12YWx1ZSBmcm9tIGNoaS1zcXVhcmUoMikNCnBfdmFsdWVfdW5pZm9ybSA8LSAxIC0gcGNoaXNxKExSX3VuaWZvcm0sIGRmID0gMikNCg0KZGF0YS5mcmFtZSgNCiAgbGxfZnVsbCA9IGxsX2Z1bGwsDQogIGxsX251bGwgPSBsbF9udWxsLA0KICBMUl9zdGF0ID0gTFJfdW5pZm9ybSwNCiAgcF92YWx1ZSA9IHBfdmFsdWVfdW5pZm9ybQ0KKQ0KYGBgDQoqKkNvbmNsdXNpb246KioNCg0KVGhlIHAtdmFsdWUgaXMgZXh0cmVtZWx5IHNtYWxsLCBzbyB3ZSByZWplY3QgJEhfMDogYT0xLCBiID0gMSQuDQpUaGlzIG1lYW5zIHRoZSByZXNlcnZvaXIgc3RvcmFnZSBwcm9wb3J0aW9ucyBhcmUgbm90IGNvbnNpc3RlbnQgd2l0aCBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9uICgwLDEpLiBJbiBwcmFjdGljYWwgdGVybXMsIHRoZSBkYXRhIHNob3cgYSBjbGVhciBkaXN0cmlidXRpb25hbCBzaGFwZSBpbnN0ZWFkIG9mIGJlaW5nIHNwcmVhZCBldmVubHkgYWNyb3NzIGFsbCBwb3NzaWJsZSBzdG9yYWdlIGxldmVscy4gVGhlcmVmb3JlLCB0aGUgZnVsbCBLdW1hcmFzd2FteSBtb2RlbCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRoYW4gdGhlIHVuaWZvcm0gbW9kZWwuDQpcDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K