Introduction

This notebook analyses ten simulated time series, Y01–Y10, each of length n = 10{,}000, stored in data_arima.csv. Every series was generated from a non-seasonal ARIMA(p,d,q) model without drift. the analyses are done by using the Box–Jenkins methodology:

  1. Identification: inspect the sample ACF and PACF, test for stationarity, difference the series if necessary, and read tentative orders (p,q) from the ACF and PACF of the stationary series.
  2. Estimation: fit the tentative model by maximum likelihood and test the significance of every coefficient.
  3. Diagnostic checking: verify that the residuals behave like Gaussian white noise.

For every series, the manually identified model is also compared with the model selected automatically by forecast::auto.arima(). All tests use a significance level of \alpha = 5\%.

Identification rules. With n = 10{,}000, the approximate 95% bands of the sample ACF and PACF are \pm 1.96/\sqrt{n} \approx \pm 0.0196 (dashed lines in the plots).

Process ACF PACF
AR(p) tails off cuts off after lag p
MA(q) cuts off after lag q tails off
ARMA(p,q) tails off tails off

Libraries

library(tidyverse)
library(forecast)
library(tseries)
library(patchwork)
library(lmtest)

Dataset

The data set contains a time index t and the ten series.

df <- read_csv("data_arima.csv")
head(df)

Each column Y01–Y10 is one series observed at t = 1, \dots, 10{,}000.

df %>%
  pivot_longer(cols = Y01:Y10, names_to = "series", values_to = "value") %>%
  ggplot(aes(x = t, y = value)) +
    geom_line(colour = "steelblue") +
    facet_wrap(~ series, ncol = 2, scales = "free_y") +
    labs(x = "t", y = NULL) +
    theme_bw()

Three series, Y01, Y08 and Y09, wander away from their starting level and never return to a fixed mean. This is the typical appearance of a stochastic trend, i.e. non-stationarity in the mean. The other seven series fluctuate around constant levels (about 20, 75, 30, 100, 10, 60 and 50 for Y02–Y07 and Y10) with roughly constant variance, which suggests stationarity.

ARIMA Modelling

Each subsection follows the same steps: ACF and PACF of the original series, stationarity tests, differencing (when needed), identification, estimation, the fitted model equation, comparison with auto.arima(), and diagnostic checking.

Model 01

ACF & PACF Series 01

We start with the sample ACF of the original series, shown up to lag 5,000 to display its complete decay, and the PACF up to lag 36.

p_acf  <- ggAcf(df$Y01, lag.max = 5000) + ggtitle("ACF Y01") 
p_pacf <- ggPacf(df$Y01, lag.max = 36) + ggtitle("PACF Y01") 

p_acf | p_pacf

The ACF starts near 1 and decays almost linearly: it stays positive and significant for more than 3,000 lags before turning negative. The PACF has a single dominant spike close to 1 at lag 1. Such an extremely slow decay of the ACF is the classic signature of a non-stationary, so the ACF and PACF of the levels cannot be used to identify p and q.

Stationarity Test

Three tests are applied to the original series. The Augmented Dickey–Fuller (ADF) and Phillips–Perron (PP) tests have H_0: the series has a unit root (non-stationary). The KPSS test has the reverse null, H_0: the series is level-stationary.

adf.test(df$Y01)

    Augmented Dickey-Fuller Test

data:  df$Y01
Dickey-Fuller = -2.5227, Lag order = 21, p-value = 0.3569
alternative hypothesis: stationary

ADF: Dickey–Fuller = -2.5227, p-value = 0.3569 > 0.05, so the unit-root hypothesis is not rejected.

pp.test(df$Y01)

    Phillips-Perron Unit Root Test

data:  df$Y01
Dickey-Fuller Z(alpha) = -8.2347, Truncation lag parameter = 12, p-value = 0.6507
alternative hypothesis: stationary

PP: p-value = 0.6507 > 0.05, again no evidence against a unit root.

kpss.test(df$Y01)

    KPSS Test for Level Stationarity

data:  df$Y01
KPSS Level = 67.718, Truncation lag parameter = 12, p-value = 0.01

KPSS: statistic = 67.718, p-value \le 0.01, so level stationarity is rejected. All three tests agree: Y01 is non-stationary in the mean and has to be differenced.

Differencing

We take the first difference W_t = (1-B)Y_t = Y_t - Y_{t-1} and compare the original and the differenced series.

ts_01 <- ts(data=df$Y01)
diff_ts_01 <- diff(ts_01, lag = 1)
autoplot(ts_01) | autoplot(diff_ts_01)

The original series (left) drifts between roughly -100 and 450 without a fixed mean, whereas the differenced series (right) fluctuates around zero with constant variance. The ADF test confirms this.

adf.test(diff_ts_01)

    Augmented Dickey-Fuller Test

data:  diff_ts_01
Dickey-Fuller = -18.95, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

Dickey–Fuller = -18.95, p-value \le 0.01: the unit root is rejected, so W_t is stationary and d = 1. The ACF and PACF of W_t are now used to identify p and q.

p01_acf_diff  <- ggAcf(diff_ts_01, lag.max = 36) + ggtitle("ACF diff(Y01)") 
p01_pacf_diff <- ggPacf(diff_ts_01, lag.max = 36) + ggtitle("PACF diff(Y01)") 

p01_acf_diff | p01_pacf_diff

The ACF of W_t has significant spikes at lags 1 to 8 and then cuts off abruptly: from lag 9 onward all autocorrelations lie inside the bands. The PACF, in contrast, dies down gradually in an irregular, oscillating way. A cut-off ACF combined with a tailing-off PACF points to a pure MA process, and the last significant ACF lag gives q = 8. The tentative model is therefore ARIMA(0,1,8), without a constant because the differenced series has mean zero (no drift).

Parameter Estimation

ARIMA(0,1,8) is estimated by maximum likelihood with Arima().

m01 <- Arima(ts_01, order = c(0,1,8))
summary(m01)
Series: ts_01 
ARIMA(0,1,8) 

Coefficients:
         ma1     ma2     ma3      ma4     ma5     ma6     ma7     ma8
      0.4000  0.2042  0.4099  -0.5064  0.3076  0.3090  0.2052  0.4695
s.e.  0.0088  0.0095  0.0093   0.0098  0.0096  0.0091  0.0094  0.0087

sigma^2 = 0.9913:  log likelihood = -14142.54
AIC=28303.08   AICc=28303.09   BIC=28367.97

Training set error measures:
                      ME     RMSE       MAE      MPE     MAPE      MASE         ACF1
Training set -0.01413526 0.995185 0.7960329 9.455486 15.21431 0.6921013 -0.003393213

All eight MA coefficients are estimated precisely (standard errors below 0.01). The residual variance is \hat\sigma_a^2 = 0.9913, with AIC = 28303.08, AICc = 28303.09 and BIC = 28367.97. Next, each coefficient is tested with H_0: \theta_j = 0.

coeftest(m01)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ma1  0.4000239  0.0088346  45.279 < 2.2e-16 ***
ma2  0.2041584  0.0094758  21.545 < 2.2e-16 ***
ma3  0.4098869  0.0092919  44.112 < 2.2e-16 ***
ma4 -0.5064212  0.0097596 -51.890 < 2.2e-16 ***
ma5  0.3075549  0.0095837  32.092 < 2.2e-16 ***
ma6  0.3090082  0.0091218  33.876 < 2.2e-16 ***
ma7  0.2051990  0.0094095  21.808 < 2.2e-16 ***
ma8  0.4694732  0.0087348  53.748 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Every coefficient is highly significant (|z| \ge 21.5, p-value < 2.2\times10^{-16}), so no term can be dropped.

Fitted Model Equation

The general form of ARIMA(0,1,8) is

(1-B)\,Y_t = (1+\theta_1B+\theta_2B^2+\cdots+\theta_8B^8)\,a_t .

Substituting the estimates gives

\begin{aligned} (1-B)\,Y_t ={}& (1 + 0.4000B + 0.2042B^2 + 0.4099B^3 - 0.5064B^4 \\ &+ 0.3076B^5 + 0.3090B^6 + 0.2052B^7 + 0.4695B^8)\,a_t , \end{aligned}

and, written explicitly in terms of past observations and shocks,

\begin{aligned} Y_t ={}& Y_{t-1} + a_t + 0.4000\,a_{t-1} + 0.2042\,a_{t-2} + 0.4099\,a_{t-3} - 0.5064\,a_{t-4} \\ &+ 0.3076\,a_{t-5} + 0.3090\,a_{t-6} + 0.2052\,a_{t-7} + 0.4695\,a_{t-8}, \qquad a_t \sim \mathcal{N}(0,\ 0.9913). \end{aligned}

Each new value equals the previous value plus a shock that is a weighted sum of the current and the last eight innovations.

Comparison with auto.arima()

As a benchmark, auto.arima() selects a model automatically, allowing up to ten AR and ten MA terms.

aa01 <- auto.arima(ts_01, max.p = 10, max.q = 10)
aa01
Series: ts_01 
ARIMA(9,1,6) 

Coefficients:
         ar1     ar2      ar3      ar4     ar5     ar6      ar7      ar8     ar9     ma1      ma2     ma3      ma4     ma5     ma6
      0.2759  0.7792  -0.3439  -0.5522  0.3629  0.2653  -0.2345  -0.1193  0.1334  0.1203  -0.6988  0.3862  -0.0672  0.0550  0.4472
s.e.  0.0354  0.0287   0.0441   0.0260  0.0358  0.0252   0.0282   0.0208  0.0198  0.0347   0.0247  0.0437   0.0212  0.0201  0.0175

sigma^2 = 1.003:  log likelihood = -14195.62
AIC=28423.23   AICc=28423.29   BIC=28538.6

auto.arima() selects ARIMA(9,1,6), a model with 15 coefficients. It finds the correct order of differencing (d = 1), but its AICc (28423.29) is 120.2 units larger than the AICc of the manually identified ARIMA(0,1,8) (28303.09), and its BIC is 170.6 units larger. The automatic procedure therefore did not even find the model that is best by its own criterion: for a long series it searches stepwise using an approximate likelihood, and here it stopped in an over-parameterised local optimum.

coeftest(aa01)

z test of coefficients:

     Estimate Std. Error  z value  Pr(>|z|)    
ar1  0.275936   0.035350   7.8057 5.916e-15 ***
ar2  0.779181   0.028739  27.1124 < 2.2e-16 ***
ar3 -0.343920   0.044075  -7.8031 6.040e-15 ***
ar4 -0.552176   0.026017 -21.2236 < 2.2e-16 ***
ar5  0.362873   0.035785  10.1404 < 2.2e-16 ***
ar6  0.265342   0.025232  10.5162 < 2.2e-16 ***
ar7 -0.234477   0.028198  -8.3155 < 2.2e-16 ***
ar8 -0.119303   0.020786  -5.7397 9.483e-09 ***
ar9  0.133430   0.019826   6.7299 1.698e-11 ***
ma1  0.120336   0.034652   3.4727 0.0005152 ***
ma2 -0.698816   0.024715 -28.2750 < 2.2e-16 ***
ma3  0.386185   0.043749   8.8273 < 2.2e-16 ***
ma4 -0.067231   0.021216  -3.1688 0.0015306 ** 
ma5  0.054953   0.020058   2.7397 0.0061494 ** 
ma6  0.447165   0.017529  25.5104 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All 15 coefficients are individually significant, but significance alone does not make this a better model: it is far less parsimonious and fits worse than ARIMA(0,1,8) according to both AICc and BIC. The manual model is preferred.

Diagnostic Checking

An adequate model leaves residuals that behave like white noise. checkresiduals() plots the residuals, their ACF and their histogram, and runs the Ljung–Box test with H_0: no autocorrelation up to the chosen lag (here 11 lags, of which 8 degrees of freedom are absorbed by the MA coefficients).

checkresiduals(m01)

    Ljung-Box test

data:  Residuals from ARIMA(0,1,8)
Q* = 1.7283, df = 3, p-value = 0.6307

Model df: 8.   Total lags used: 11

Q^* = 1.7283 with 3 degrees of freedom and p-value = 0.6307 > 0.05: the residuals show no remaining autocorrelation. The residual ACF stays within the bands and the histogram is bell-shaped. Normality is checked formally with the Jarque–Bera test (H_0: the residuals are normally distributed).

res_01 <- m01$residuals
jarque.bera.test(res_01)

    Jarque Bera Test

data:  res_01
X-squared = 0.70053, df = 2, p-value = 0.7045

X^2 = 0.70053, p-value = 0.7045 > 0.05: normality is not rejected.

Conclusion. ARIMA(0,1,8) is adequate for Y01: all coefficients are significant and the residuals behave like Gaussian white noise.

Model 02

ACF & PACF Series 02

Y02 looks stationary in the overview plot, so its ACF and PACF are inspected directly (up to lag 36).

p_acf  <- ggAcf(df$Y02, lag.max = 36) + ggtitle("ACF Y02") 
p_pacf <- ggPacf(df$Y02, lag.max = 36) + ggtitle("PACF Y02") 

p_acf | p_pacf

The ACF decays exponentially from about 0.71 at lag 1 and becomes negligible after roughly lag 10, while the PACF has one large spike at lag 1 (about 0.71) and is insignificant afterwards. A tailing-off ACF together with a PACF that cuts off after lag 1 is the pattern of an AR(1) process, provided the series is stationary.

Stationarity Test

The same three tests are applied (ADF and PP: H_0 unit root; KPSS: H_0 level-stationary).

adf.test(df$Y02)

    Augmented Dickey-Fuller Test

data:  df$Y02
Dickey-Fuller = -20.106, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -20.106, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y02)

    Phillips-Perron Unit Root Test

data:  df$Y02
Dickey-Fuller Z(alpha) = -2930.6, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -2930.6, p-value \le 0.01, so the unit root is rejected again.

kpss.test(df$Y02)

    KPSS Test for Level Stationarity

data:  df$Y02
KPSS Level = 0.19092, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.19092, p-value \ge 0.10, so level stationarity is not rejected. All tests agree that Y02 is stationary, so d = 0 and no differencing is needed. Because the series fluctuates around about 20, the tentative model is ARIMA(1,0,0) with a non-zero mean.

Parameter Estimation

ts_02 <- ts(data=df$Y02)
m02 <- Arima(ts_02, order = c(1,0,0))
summary(m02)
Series: ts_02 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1    mean
      0.7076  19.957
s.e.  0.0071   0.034

sigma^2 = 0.9888:  log likelihood = -14132.25
AIC=28270.5   AICc=28270.5   BIC=28292.13

Training set error measures:
                       ME      RMSE       MAE        MPE     MAPE      MASE        ACF1
Training set 1.938135e-05 0.9942682 0.7979377 -0.2518663 4.028156 0.9253059 0.003414323

The estimates are \hat\phi_1 = 0.7076 and \hat\mu = 19.957. The value labelled mean (intercept in coeftest()) is the process mean, not the regression constant. The residual variance is \hat\sigma_a^2 = 0.9888, with AIC = AICc = 28270.5 and BIC = 28292.13.

coeftest(m02)

z test of coefficients:

            Estimate Std. Error z value  Pr(>|z|)    
ar1        0.7075777  0.0070623  100.19 < 2.2e-16 ***
intercept 19.9570229  0.0339929  587.09 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Both parameters are highly significant (z = 100.19 for \phi_1 and z = 587.09 for \mu).

Fitted Model Equation

The general form of ARIMA(1,0,0) with mean \mu is

(1-\phi_1B)\,(Y_t-\mu) = a_t .

With the estimates,

(1 - 0.7076B)\,(Y_t - 19.9570) = a_t ,

which expands to

Y_t = 5.8359 + 0.7076\,Y_{t-1} + a_t,\qquad a_t \sim \mathcal{N}(0,\ 0.9888),

where 5.8359 = 19.9570 \times (1 - 0.7076). Since |\hat\phi_1| < 1, the fitted model is stationary: the effect of a shock shrinks by a factor of 0.7076 every period.

Comparison with auto.arima()

aa02 <- auto.arima(ts_02, max.p = 10, max.q = 10)
aa02
Series: ts_02 
ARIMA(1,0,0) with non-zero mean 

Coefficients:
         ar1    mean
      0.7076  19.957
s.e.  0.0071   0.034

sigma^2 = 0.9888:  log likelihood = -14132.25
AIC=28270.5   AICc=28270.5   BIC=28292.13

auto.arima() selects exactly the same model, ARIMA(1,0,0) with a non-zero mean, with identical estimates and information criteria. Manual and automatic identification agree.

Diagnostic Checking

checkresiduals(m02)

    Ljung-Box test

data:  Residuals from ARIMA(1,0,0) with non-zero mean
Q* = 3.5031, df = 9, p-value = 0.941

Model df: 1.   Total lags used: 10

Ljung–Box: Q^* = 3.5031 with 9 degrees of freedom, p-value = 0.941: the residuals are white noise. The residual ACF lies within the bands and the histogram is symmetric and bell-shaped.

res_02 <- m02$residuals
jarque.bera.test(res_02)

    Jarque Bera Test

data:  res_02
X-squared = 1.9585, df = 2, p-value = 0.3756

Jarque–Bera: X^2 = 1.9585, p-value = 0.3756: normality is not rejected.

Conclusion. ARIMA(1,0,0) with a non-zero mean is adequate for Y02.

Model 03

ACF & PACF Series 03

p_acf  <- ggAcf(df$Y03, lag.max = 36) + ggtitle("ACF Y03") 
p_pacf <- ggPacf(df$Y03, lag.max = 36) + ggtitle("PACF Y03") 

p_acf | p_pacf

The ACF has significant spikes at lags 1 to 8 (positive at lags 1, 7 and 8, negative at lags 2 to 6) and cuts off sharply after lag 8. The PACF decays slowly in an irregular, oscillating way that is still visible around lag 20. This is the pattern of an MA(8) process, provided the series is stationary.

Stationarity Test

adf.test(df$Y03)

    Augmented Dickey-Fuller Test

data:  df$Y03
Dickey-Fuller = -26.085, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -26.085, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y03)

    Phillips-Perron Unit Root Test

data:  df$Y03
Dickey-Fuller Z(alpha) = -3190.9, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -3190.9, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y03)

    KPSS Test for Level Stationarity

data:  df$Y03
KPSS Level = 0.078839, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.078839, p-value \ge 0.10, so level stationarity is not rejected. Y03 is stationary (d = 0), and the tentative model is ARIMA(0,0,8) with a non-zero mean.

Parameter Estimation

ts_03 <- ts(data=df$Y03)
m03 <- Arima(ts_03, order = c(0,0,8))
summary(m03)
Series: ts_03 
ARIMA(0,0,8) with non-zero mean 

Coefficients:
         ma1      ma2      ma3      ma4      ma5      ma6     ma7     ma8     mean
      0.5026  -0.3882  -0.3044  -0.3055  -0.2031  -0.4057  0.2022  0.3961  74.9950
s.e.  0.0092   0.0103   0.0103   0.0105   0.0102   0.0105  0.0102  0.0092   0.0098

sigma^2 = 3.934:  log likelihood = -21034.82
AIC=42089.64   AICc=42089.66   BIC=42161.74

Training set error measures:
                        ME     RMSE      MAE         MPE     MAPE      MASE        ACF1
Training set -0.0001267169 1.982482 1.582264 -0.07077227 2.114717 0.6129917 0.002989087

The eight MA coefficients and the mean (\hat\mu = 74.9950) are estimated precisely. The residual variance is \hat\sigma_a^2 = 3.934, with AIC = 42089.64, AICc = 42089.66 and BIC = 42161.74.

coeftest(m03)

z test of coefficients:

            Estimate Std. Error  z value  Pr(>|z|)    
ma1        0.5026460  0.0092477   54.354 < 2.2e-16 ***
ma2       -0.3882372  0.0102587  -37.845 < 2.2e-16 ***
ma3       -0.3043659  0.0103447  -29.422 < 2.2e-16 ***
ma4       -0.3054866  0.0104822  -29.143 < 2.2e-16 ***
ma5       -0.2031159  0.0101965  -19.920 < 2.2e-16 ***
ma6       -0.4056971  0.0104551  -38.804 < 2.2e-16 ***
ma7        0.2021850  0.0101626   19.895 < 2.2e-16 ***
ma8        0.3961114  0.0091550   43.267 < 2.2e-16 ***
intercept 74.9949528  0.0097968 7655.048 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All coefficients are highly significant (|z| \ge 19.9).

Fitted Model Equation

The general form of ARIMA(0,0,8) with mean \mu is

Y_t-\mu = (1+\theta_1B+\theta_2B^2+\cdots+\theta_8B^8)\,a_t .

With the estimates,

\begin{aligned} Y_t - 74.9950 ={}& (1 + 0.5026B - 0.3882B^2 - 0.3044B^3 - 0.3055B^4 \\ &- 0.2031B^5 - 0.4057B^6 + 0.2022B^7 + 0.3961B^8)\,a_t , \end{aligned}

that is, explicitly,

\begin{aligned} Y_t ={}& 74.9950 + a_t + 0.5026\,a_{t-1} - 0.3882\,a_{t-2} - 0.3044\,a_{t-3} - 0.3055\,a_{t-4} \\ &- 0.2031\,a_{t-5} - 0.4057\,a_{t-6} + 0.2022\,a_{t-7} + 0.3961\,a_{t-8}, \qquad a_t \sim \mathcal{N}(0,\ 3.934). \end{aligned}

For a pure MA model the constant equals the mean, and observations more than eight periods apart are uncorrelated.

Comparison with auto.arima()

aa03 <- auto.arima(ts_03, max.p = 10, max.q = 10)
aa03
Series: ts_03 
ARIMA(10,0,2) with non-zero mean 

Coefficients:
         ar1     ar2      ar3      ar4      ar5      ar6     ar7      ar8      ar9    ar10     ma1      ma2     mean
      0.2448  0.1229  -0.2527  -0.0840  -0.1607  -0.2612  0.2524  -0.0301  -0.1835  0.0105  0.2477  -0.6464  74.9947
s.e.  0.0356  0.0193   0.0126   0.0179   0.0147   0.0159  0.0195   0.0115   0.0116  0.0146  0.0341   0.0328   0.0091

sigma^2 = 4.097:  log likelihood = -21235.51
AIC=42499.02   AICc=42499.06   BIC=42599.96

auto.arima() selects ARIMA(10,0,2) with a non-zero mean. This model fits clearly worse: \hat\sigma_a^2 = 4.097 instead of 3.934, AICc = 42499.06 (409.4 units larger than for MA(8)) and BIC = 42599.96 (438.2 units larger). An MA(8) process can be written exactly only as an AR model of infinite order; with at most ten AR terms plus two MA terms, the automatic model is just a rough approximation of it, and the stepwise search never reached the pure MA(8) structure. The manual MA(8) is far better.

Diagnostic Checking

checkresiduals(m03)

    Ljung-Box test

data:  Residuals from ARIMA(0,0,8) with non-zero mean
Q* = 3.1399, df = 3, p-value = 0.3706

Model df: 8.   Total lags used: 11

Ljung–Box: Q^* = 3.1399 with 3 degrees of freedom, p-value = 0.3706: no remaining autocorrelation.

res_03 <- m03$residuals
jarque.bera.test(res_03)

    Jarque Bera Test

data:  res_03
X-squared = 0.22751, df = 2, p-value = 0.8925

Jarque–Bera: X^2 = 0.22751, p-value = 0.8925: normality is not rejected.

Conclusion. ARIMA(0,0,8) with a non-zero mean is adequate for Y03.

Model 04

ACF & PACF Series 04

p_acf  <- ggAcf(df$Y04, lag.max = 36) + ggtitle("ACF Y04") 
p_pacf <- ggPacf(df$Y04, lag.max = 36) + ggtitle("PACF Y04") 

p_acf | p_pacf

Only the first two autocorrelations are significant (about 0.66 at lag 1 and 0.18 at lag 2), so the ACF cuts off after lag 2. The PACF alternates in sign (positive, negative, positive, …) and dies down within about eight lags. This is the pattern of an MA(2) process.

Stationarity Test

adf.test(df$Y04)

    Augmented Dickey-Fuller Test

data:  df$Y04
Dickey-Fuller = -20.116, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -20.116, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y04)

    Phillips-Perron Unit Root Test

data:  df$Y04
Dickey-Fuller Z(alpha) = -2502.1, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -2502.1, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y04)

    KPSS Test for Level Stationarity

data:  df$Y04
KPSS Level = 0.2533, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.2533, p-value \ge 0.10, so level stationarity is not rejected. Y04 is stationary (d = 0), and the tentative model is ARIMA(0,0,2) with a non-zero mean.

Parameter Estimation

ts_04 <- ts(data=df$Y04)
m04 <- Arima(ts_04, order = c(0,0,2))
summary(m04)
Series: ts_04 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1     ma2     mean
      1.2064  0.5018  30.0235
s.e.  0.0086  0.0087   0.0407

sigma^2 = 2.259:  log likelihood = -18263.33
AIC=36534.67   AICc=36534.67   BIC=36563.51

Training set error measures:
                       ME     RMSE      MAE        MPE     MAPE      MASE         ACF1
Training set 6.009103e-05 1.502776 1.202647 -0.2550741 4.050067 0.7452819 -0.003071841

The estimates are \hat\theta_1 = 1.2064, \hat\theta_2 = 0.5018 and \hat\mu = 30.0235, with \hat\sigma_a^2 = 2.259, AIC = AICc = 36534.67 and BIC = 36563.51.

coeftest(m04)

z test of coefficients:

            Estimate Std. Error z value  Pr(>|z|)    
ma1        1.2063581  0.0086365 139.682 < 2.2e-16 ***
ma2        0.5017600  0.0087254  57.505 < 2.2e-16 ***
intercept 30.0235158  0.0406936 737.794 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All parameters are highly significant (z = 139.68, 57.51 and 737.79).

Fitted Model Equation

The general form of ARIMA(0,0,2) with mean \mu is

Y_t-\mu = (1+\theta_1B+\theta_2B^2)\,a_t .

With the estimates,

Y_t - 30.0235 = (1 + 1.2064B + 0.5018B^2)\,a_t ,

that is, explicitly,

Y_t = 30.0235 + a_t + 1.2064\,a_{t-1} + 0.5018\,a_{t-2},\qquad a_t \sim \mathcal{N}(0,\ 2.259).

Comparison with auto.arima()

aa04 <- auto.arima(ts_04, max.p = 10, max.q = 10)
aa04
Series: ts_04 
ARIMA(0,0,2) with non-zero mean 

Coefficients:
         ma1     ma2     mean
      1.2064  0.5018  30.0235
s.e.  0.0086  0.0087   0.0407

sigma^2 = 2.259:  log likelihood = -18263.33
AIC=36534.67   AICc=36534.67   BIC=36563.51

auto.arima() selects the same model, ARIMA(0,0,2) with a non-zero mean, with identical estimates. Both approaches agree.

Diagnostic Checking

checkresiduals(m04)

    Ljung-Box test

data:  Residuals from ARIMA(0,0,2) with non-zero mean
Q* = 2.9641, df = 8, p-value = 0.9366

Model df: 2.   Total lags used: 10

Ljung–Box: Q^* = 2.9641 with 8 degrees of freedom, p-value = 0.9366: the residuals are white noise.

res_04 <- m04$residuals
jarque.bera.test(res_04)

    Jarque Bera Test

data:  res_04
X-squared = 5.9529, df = 2, p-value = 0.05097

Jarque–Bera: X^2 = 5.9529, p-value = 0.05097, so normality is (narrowly) not rejected at the 5% level. With n = 10{,}000 the Jarque–Bera test reacts to very small departures; the histogram is bell-shaped, so the residuals can be treated as normal.

Conclusion. ARIMA(0,0,2) with a non-zero mean is adequate for Y04.

Model 05

ACF & PACF Series 05

p_acf  <- ggAcf(df$Y05, lag.max = 36) + ggtitle("ACF Y05") 
p_pacf <- ggPacf(df$Y05, lag.max = 36) + ggtitle("PACF Y05") 

p_acf | p_pacf

The ACF decays slowly in a wave-like pattern: large positive values up to about lag 8 are followed by small negative values between lags 10 and 20. The PACF has six significant spikes (lags 1 to 6, the last two negative) and cuts off after lag 6. This is the pattern of an AR(6) process.

Stationarity Test

adf.test(df$Y05)

    Augmented Dickey-Fuller Test

data:  df$Y05
Dickey-Fuller = -20.009, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -20.009, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y05)

    Phillips-Perron Unit Root Test

data:  df$Y05
Dickey-Fuller Z(alpha) = -9051, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -9051, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y05)

    KPSS Test for Level Stationarity

data:  df$Y05
KPSS Level = 0.18261, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.18261, p-value \ge 0.10, so level stationarity is not rejected. Y05 is stationary (d = 0), and the tentative model is ARIMA(6,0,0) with a non-zero mean.

Parameter Estimation

ts_05 <- ts(data=df$Y05)
m05 <- Arima(ts_05, order = c(6,0,0))
summary(m05)
Series: ts_05 
ARIMA(6,0,0) with non-zero mean 

Coefficients:
         ar1     ar2     ar3     ar4      ar5      ar6     mean
      0.0966  0.3931  0.3987  0.3931  -0.2997  -0.2931  99.9288
s.e.  0.0096  0.0091  0.0091  0.0091   0.0091   0.0096   0.0967

sigma^2 = 9.068:  log likelihood = -25210.7
AIC=50437.4   AICc=50437.41   BIC=50495.08

Training set error measures:
                       ME     RMSE      MAE        MPE     MAPE      MASE        ACF1
Training set 8.236513e-06 3.010228 2.408564 -0.0912889 2.417534 0.6537646 0.005604284

The six AR coefficients and the mean (\hat\mu = 99.9288) are estimated with standard errors below 0.01 (0.0967 for the mean). The residual variance is \hat\sigma_a^2 = 9.068, with AIC = 50437.40, AICc = 50437.41 and BIC = 50495.08.

coeftest(m05)

z test of coefficients:

            Estimate Std. Error  z value  Pr(>|z|)    
ar1        0.0966306  0.0095593   10.109 < 2.2e-16 ***
ar2        0.3931050  0.0091289   43.062 < 2.2e-16 ***
ar3        0.3986794  0.0091321   43.657 < 2.2e-16 ***
ar4        0.3931380  0.0091266   43.076 < 2.2e-16 ***
ar5       -0.2996752  0.0091363  -32.800 < 2.2e-16 ***
ar6       -0.2930599  0.0095665  -30.634 < 2.2e-16 ***
intercept 99.9287715  0.0967230 1033.144 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All coefficients are significant; the smallest test statistic is z = 10.11 for \phi_1.

Fitted Model Equation

The general form of ARIMA(6,0,0) with mean \mu is

(1-\phi_1B-\phi_2B^2-\cdots-\phi_6B^6)\,(Y_t-\mu) = a_t .

With the estimates,

(1 - 0.0966B - 0.3931B^2 - 0.3987B^3 - 0.3931B^4 + 0.2997B^5 + 0.2931B^6)\,(Y_t - 99.9288) = a_t ,

which expands to

\begin{aligned} Y_t ={}& 31.0960 + 0.0966\,Y_{t-1} + 0.3931\,Y_{t-2} + 0.3987\,Y_{t-3} + 0.3931\,Y_{t-4} \\ &- 0.2997\,Y_{t-5} - 0.2931\,Y_{t-6} + a_t, \qquad a_t \sim \mathcal{N}(0,\ 9.068), \end{aligned}

where 31.0960 = 99.9288 \times (1 - 0.6888) and 0.6888 is the sum of the six AR coefficients.

Comparison with auto.arima()

aa05 <- auto.arima(ts_05, max.p = 10, max.q = 10)
aa05
Series: ts_05 
ARIMA(7,0,0) with non-zero mean 

Coefficients:
         ar1     ar2     ar3     ar4      ar5      ar6     ar7     mean
      0.1022  0.3986  0.3911  0.3859  -0.3070  -0.2947  0.0185  99.9288
s.e.  0.0100  0.0096  0.0099  0.0100   0.0099   0.0096  0.0100   0.0985

sigma^2 = 9.066:  log likelihood = -25208.99
AIC=50435.98   AICc=50436   BIC=50500.88

auto.arima() selects ARIMA(7,0,0), i.e. one more AR term. The extra coefficient is tiny (\hat\phi_7 = 0.0185 with standard error 0.0100), and the gain is negligible: AICc is only 1.41 units lower (50436.00 vs 50437.41), while BIC is 5.80 units higher (50500.88 vs 50495.08).

coeftest(aa05)

z test of coefficients:

            Estimate Std. Error   z value Pr(>|z|)    
ar1        0.1022347  0.0099994   10.2241  < 2e-16 ***
ar2        0.3985785  0.0096067   41.4897  < 2e-16 ***
ar3        0.3911033  0.0099422   39.3375  < 2e-16 ***
ar4        0.3858599  0.0099606   38.7386  < 2e-16 ***
ar5       -0.3069778  0.0099450  -30.8677  < 2e-16 ***
ar6       -0.2946904  0.0096129  -30.6556  < 2e-16 ***
ar7        0.0184744  0.0100009    1.8473  0.06471 .  
intercept 99.9287867  0.0985301 1014.1960  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The z-test confirms that ar7 is not significant at the 5% level (z \approx 1.85). An AICc difference below 2 means the two models are practically equivalent, and BIC, which penalises each parameter by \ln n \approx 9.21 instead of 2, prefers AR(6). By the principle of parsimony, the manual AR(6) is preferred.

Diagnostic Checking

checkresiduals(m05)

    Ljung-Box test

data:  Residuals from ARIMA(6,0,0) with non-zero mean
Q* = 4.0466, df = 4, p-value = 0.3997

Model df: 6.   Total lags used: 10

Ljung–Box: Q^* = 4.0466 with 4 degrees of freedom, p-value = 0.3997: no remaining autocorrelation.

res_05 <- m05$residuals
jarque.bera.test(res_05)

    Jarque Bera Test

data:  res_05
X-squared = 0.62972, df = 2, p-value = 0.7299

Jarque–Bera: X^2 = 0.62972, p-value = 0.7299: normality is not rejected.

Conclusion. ARIMA(6,0,0) with a non-zero mean is adequate for Y05.

Model 06

ACF & PACF Series 06

p_acf  <- ggAcf(df$Y06, lag.max = 36) + ggtitle("ACF Y06") 
p_pacf <- ggPacf(df$Y06, lag.max = 36) + ggtitle("PACF Y06") 

p_acf | p_pacf

The ACF has a single significant, negative spike at lag 1 (about -0.43) and is insignificant afterwards. The PACF is negative at the first lags and decays exponentially towards zero. This is the pattern of an MA(1) process with a negative coefficient.

Stationarity Test

adf.test(df$Y06)

    Augmented Dickey-Fuller Test

data:  df$Y06
Dickey-Fuller = -22.722, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -22.722, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y06)

    Phillips-Perron Unit Root Test

data:  df$Y06
Dickey-Fuller Z(alpha) = -11880, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -11880, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y06)

    KPSS Test for Level Stationarity

data:  df$Y06
KPSS Level = 0.046055, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.046055, p-value \ge 0.10, so level stationarity is not rejected. Y06 is stationary (d = 0), and the tentative model is ARIMA(0,0,1) with a non-zero mean.

Parameter Estimation

ts_06 <- ts(data=df$Y06)
m06 <- Arima(ts_06, order = c(0,0,1))
summary(m06)
Series: ts_06 
ARIMA(0,0,1) with non-zero mean 

Coefficients:
          ma1    mean
      -0.5936  9.9999
s.e.   0.0081  0.0041

sigma^2 = 1.023:  log likelihood = -14303.21
AIC=28612.43   AICc=28612.43   BIC=28634.06

Training set error measures:
                       ME     RMSE       MAE       MPE     MAPE      MASE        ACF1
Training set 0.0001789569 1.011426 0.8086233 -1.056863 8.270721 0.5086325 0.004490465

The estimates are \hat\theta_1 = -0.5936 and \hat\mu = 9.9999, with \hat\sigma_a^2 = 1.023, AIC = AICc = 28612.43 and BIC = 28634.06. The implied lag-1 autocorrelation, \hat\theta_1/(1+\hat\theta_1^2) = -0.439, matches the spike seen in the ACF.

coeftest(m06)

z test of coefficients:

            Estimate Std. Error  z value  Pr(>|z|)    
ma1       -0.5936216  0.0081425  -72.904 < 2.2e-16 ***
intercept  9.9999364  0.0041108 2432.584 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Both parameters are highly significant (z = -72.90 and z = 2432.58).

Fitted Model Equation

The general form of ARIMA(0,0,1) with mean \mu is

Y_t-\mu = (1+\theta_1B)\,a_t .

With the estimates,

Y_t - 9.9999 = (1 - 0.5936B)\,a_t ,

that is, explicitly,

Y_t = 9.9999 + a_t - 0.5936\,a_{t-1},\qquad a_t \sim \mathcal{N}(0,\ 1.023).

Since |\hat\theta_1| < 1, the model is invertible.

Comparison with auto.arima()

aa06 <- auto.arima(ts_06, max.p = 10, max.q = 10)
aa06
Series: ts_06 
ARIMA(1,0,1) with non-zero mean 

Coefficients:
         ar1      ma1    mean
      0.0125  -0.6018  9.9999
s.e.  0.0170   0.0136  0.0041

sigma^2 = 1.023:  log likelihood = -14302.94
AIC=28613.88   AICc=28613.88   BIC=28642.72

auto.arima() selects ARIMA(1,0,1) with a non-zero mean, adding an AR term with \hat\phi_1 = 0.0125 (standard error 0.0170).

coeftest(aa06)

z test of coefficients:

           Estimate Std. Error   z value Pr(>|z|)    
ar1        0.012518   0.016968    0.7378   0.4606    
ma1       -0.601809   0.013609  -44.2227   <2e-16 ***
intercept  9.999930   0.004079 2451.5779   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The extra AR coefficient is clearly not significant (z \approx 0.74). Moreover, the exact AICc of ARIMA(1,0,1) (28613.88) is 1.45 units higher than that of MA(1), and its BIC is 8.66 units higher, so auto.arima() returned a model that is worse by its own criterion. The reason is that, for long series, auto.arima() ranks the candidate models with an approximate likelihood during the search and re-estimates only the chosen model by exact maximum likelihood; under exact likelihood, MA(1) is better. The manual MA(1) is preferred.

Diagnostic Checking

checkresiduals(m06)

    Ljung-Box test

data:  Residuals from ARIMA(0,0,1) with non-zero mean
Q* = 6.9066, df = 9, p-value = 0.6468

Model df: 1.   Total lags used: 10

Ljung–Box: Q^* = 6.9066 with 9 degrees of freedom, p-value = 0.6468: the residuals are white noise.

res_06 <- m06$residuals
jarque.bera.test(res_06)

    Jarque Bera Test

data:  res_06
X-squared = 6.1596, df = 2, p-value = 0.04597

Jarque–Bera: X^2 = 6.1596, p-value = 0.04597, so normality is rejected at the 5% level, but only marginally. The series was simulated with Gaussian innovations, so this is a false rejection (a type I error): with n = 10{,}000 the test is very powerful, and at \alpha = 5\% about one in twenty correctly specified models is flagged by chance. The histogram is bell-shaped, and normality is not required for consistent estimation of ARIMA parameters (it matters mainly for exact prediction intervals).

Conclusion. ARIMA(0,0,1) with a non-zero mean is adequate for Y06.

Model 07

ACF & PACF Series 07

p_acf  <- ggAcf(df$Y07, lag.max = 36) + ggtitle("ACF Y07") 
p_pacf <- ggPacf(df$Y07, lag.max = 36) + ggtitle("PACF Y07") 

p_acf | p_pacf

Both functions tail off. The ACF oscillates with alternating signs and decays over about 20 lags, and the PACF shows large spikes at the first lags that die down irregularly over about 15 lags. Neither function cuts off, so Y07 follows a mixed ARMA(p,q) process whose orders cannot be read directly from the plots.

Stationarity Test

adf.test(df$Y07)

    Augmented Dickey-Fuller Test

data:  df$Y07
Dickey-Fuller = -19.546, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -19.546, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y07)

    Phillips-Perron Unit Root Test

data:  df$Y07
Dickey-Fuller Z(alpha) = -18395, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -18395, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y07)

    KPSS Test for Level Stationarity

data:  df$Y07
KPSS Level = 0.084136, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.084136, p-value \ge 0.10, so level stationarity is not rejected. Y07 is stationary (d = 0).

Order Selection for the Mixed Model

Because the ACF and the PACF both tail off, the orders are chosen by fitting every ARMA(p,q) model with p \le 4 and q \le 6 by exact maximum likelihood and ranking them by BIC. This exhaustive search over a small grid is the manual counterpart of auto.arima().

ic_grid <- function(y, d, p_max = 4, q_max = 6) {
  grid <- expand.grid(p = 0:p_max, q = 0:q_max)
  grid$AICc <- NA_real_
  grid$BIC  <- NA_real_
  for (i in seq_len(nrow(grid))) {
    fit <- tryCatch(Arima(y, order = c(grid$p[i], d, grid$q[i])),
                    error = function(e) NULL)
    if (!is.null(fit)) {
      grid$AICc[i] <- fit$aicc
      grid$BIC[i]  <- fit$bic
    }
  }
  grid %>%
    mutate(model = sprintf("ARIMA(%d,%d,%d)", p, d, q)) %>%
    arrange(BIC) %>%
    select(model, AICc, BIC)
}

ts_07   <- ts(data=df$Y07)
grid_07 <- ic_grid(ts_07, d = 0)
head(grid_07, 5)

The smallest BIC is attained by ARIMA(3,0,5), and the smallest AICc by ARIMA(3,0,5). The tentative model is therefore ARIMA(3,0,5) with a non-zero mean.

Parameter Estimation

m07 <- Arima(ts_07, order = c(3,0,5))
summary(m07)
Series: ts_07 
ARIMA(3,0,5) with non-zero mean 

Coefficients:
          ar1     ar2     ar3     ma1     ma2     ma3      ma4     ma5     mean
      -0.4989  0.0896  0.4993  -0.399  0.6059  0.6050  -0.3026  0.4107  59.9868
s.e.   0.0126  0.0155  0.0122   0.013  0.0120  0.0115   0.0123  0.0115   0.0419

sigma^2 = 3.944:  log likelihood = -21049.72
AIC=42119.45   AICc=42119.47   BIC=42191.55

Training set error measures:
                        ME     RMSE      MAE        MPE     MAPE      MASE         ACF1
Training set -0.0001913709 1.985106 1.588324 -0.1130719 2.675219 0.1980213 0.0005221438

The three AR coefficients, five MA coefficients and the mean (\hat\mu = 59.9868) are estimated precisely. The residual variance is \hat\sigma_a^2 = 3.944, with AIC = 42119.45, AICc = 42119.47 and BIC = 42191.55.

coeftest(m07)

z test of coefficients:

           Estimate Std. Error   z value  Pr(>|z|)    
ar1       -0.498897   0.012605  -39.5805 < 2.2e-16 ***
ar2        0.089606   0.015477    5.7896 7.055e-09 ***
ar3        0.499349   0.012229   40.8321 < 2.2e-16 ***
ma1       -0.399026   0.012969  -30.7669 < 2.2e-16 ***
ma2        0.605871   0.012008   50.4536 < 2.2e-16 ***
ma3        0.604994   0.011511   52.5577 < 2.2e-16 ***
ma4       -0.302583   0.012259  -24.6827 < 2.2e-16 ***
ma5        0.410708   0.011482   35.7685 < 2.2e-16 ***
intercept 59.986830   0.041872 1432.6073 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All coefficients are significant; the smallest test statistic is z = 5.79 for \phi_2 (p-value \approx 7\times10^{-9}).

Fitted Model Equation

The general form of ARIMA(3,0,5) with mean \mu is

(1-\phi_1B-\phi_2B^2-\phi_3B^3)\,(Y_t-\mu) = (1+\theta_1B+\theta_2B^2+\cdots+\theta_5B^5)\,a_t .

With the estimates,

\begin{aligned} (1 + 0.4989B - 0.0896B^2 - 0.4993B^3)\,(Y_t - 59.9868) ={}& (1 - 0.3990B + 0.6059B^2 + 0.6050B^3 \\ &- 0.3026B^4 + 0.4107B^5)\,a_t , \end{aligned}

which expands to

\begin{aligned} Y_t ={}& 54.5845 - 0.4989\,Y_{t-1} + 0.0896\,Y_{t-2} + 0.4993\,Y_{t-3} \\ &+ a_t - 0.3990\,a_{t-1} + 0.6059\,a_{t-2} + 0.6050\,a_{t-3} - 0.3026\,a_{t-4} + 0.4107\,a_{t-5}, \qquad a_t \sim \mathcal{N}(0,\ 3.944), \end{aligned}

where 54.5845 = 59.9868 \times (1 - 0.0901) and 0.0901 is the sum of the three AR coefficients.

Comparison with auto.arima()

aa07 <- auto.arima(ts_07, max.p = 10, max.q = 10)
aa07
Series: ts_07 
ARIMA(10,0,3) with non-zero mean 

Coefficients:
          ar1      ar2     ar3     ar4      ar5      ar6      ar7     ar8     ar9    ar10     ma1     ma2     ma3     mean
      -1.2787  -0.1822  1.2038  0.9888  -0.0655  -0.6036  -0.3578  0.0641  0.1723  0.0848  0.3828  0.1757  0.5486  59.9855
s.e.   0.0379   0.0440  0.0313  0.0641   0.0513   0.0421   0.0490  0.0267  0.0250  0.0174  0.0367  0.0214  0.0199   0.0430

sigma^2 = 3.95:  log likelihood = -21055.18
AIC=42140.35   AICc=42140.4   BIC=42248.51

auto.arima() selects ARIMA(10,0,3) with a non-zero mean, with 13 ARMA coefficients instead of 8. It is worse by both criteria: AICc = 42140.40 (20.9 units larger than for ARIMA(3,0,5)) and BIC = 42248.51 (57.0 units larger). The stepwise search, run on an approximate likelihood, drifted towards a long AR polynomial that only approximates the true structure, whereas the exhaustive grid search with exact likelihood found the better and more parsimonious ARIMA(3,0,5).

Diagnostic Checking

checkresiduals(m07)

    Ljung-Box test

data:  Residuals from ARIMA(3,0,5) with non-zero mean
Q* = 2.8719, df = 3, p-value = 0.4118

Model df: 8.   Total lags used: 11

Ljung–Box: Q^* = 2.8719 with 3 degrees of freedom, p-value = 0.4118: no remaining autocorrelation.

res_07 <- m07$residuals
jarque.bera.test(res_07)

    Jarque Bera Test

data:  res_07
X-squared = 0.62123, df = 2, p-value = 0.733

Jarque–Bera: X^2 = 0.62123, p-value = 0.733: normality is not rejected.

Conclusion. ARIMA(3,0,5) with a non-zero mean is adequate for Y07.

Model 08

ACF & PACF Series 08

As for Y01, the ACF of the levels is shown up to lag 5,000.

p_acf  <- ggAcf(df$Y08, lag.max = 5000) + ggtitle("ACF Y08") 
p_pacf <- ggPacf(df$Y08, lag.max = 36) + ggtitle("PACF Y08") 

p_acf | p_pacf

The ACF decays very slowly, with long waves that persist up to lag 5,000, and the PACF has a spike close to 1 at lag 1. Both are signs of a non-stationary series.

Stationarity Test

adf.test(df$Y08)

    Augmented Dickey-Fuller Test

data:  df$Y08
Dickey-Fuller = -2.2797, Lag order = 21, p-value = 0.4599
alternative hypothesis: stationary

ADF: Dickey–Fuller = -2.2797, p-value = 0.4599 > 0.05, so the unit root is not rejected.

pp.test(df$Y08)

    Phillips-Perron Unit Root Test

data:  df$Y08
Dickey-Fuller Z(alpha) = -23.055, Truncation lag parameter = 12, p-value = 0.03844
alternative hypothesis: stationary

PP: Z(\alpha) = -23.055, p-value = 0.03844 < 0.05, so this test rejects the unit root at the 5% level, in contrast with the ADF test.

kpss.test(df$Y08)

    KPSS Test for Level Stationarity

data:  df$Y08
KPSS Level = 10.338, Truncation lag parameter = 12, p-value = 0.01

KPSS: statistic = 10.338, p-value \le 0.01, so level stationarity is rejected. Two of the three tests, together with the plots, indicate non-stationarity. The PP test corrects for serial correlation non-parametrically (here with only 12 lags), and it is known to over-reject a true unit root when the differenced series has strong short-run dynamics, especially moving-average components; the ADF test handles such dynamics through its 21 augmentation lags. We therefore conclude that Y08 is non-stationary and difference it.

Differencing

ts_08 <- ts(data=df$Y08)
diff_ts_08 <- diff(ts_08, lag = 1)
autoplot(ts_08) | autoplot(diff_ts_08)

The original series wanders between about 80 and 250 without a fixed mean, while the differenced series W_t = Y_t - Y_{t-1} fluctuates around zero with constant variance.

adf.test(diff_ts_08)

    Augmented Dickey-Fuller Test

data:  diff_ts_08
Dickey-Fuller = -23.467, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

Dickey–Fuller = -23.467, p-value \le 0.01: W_t is stationary and d = 1.

p08_acf_diff  <- ggAcf(diff_ts_08, lag.max = 36) + ggtitle("ACF diff(Y08)") 
p08_pacf_diff <- ggPacf(diff_ts_08, lag.max = 36) + ggtitle("PACF diff(Y08)") 

p08_acf_diff | p08_pacf_diff

The ACF of W_t is a damped sine wave (alternating groups of positive and negative autocorrelations that fade out within about 20 lags), and the PACF also dies down: large spikes at lags 1 to 4 are followed by smaller significant spikes up to about lag 10. Both functions tail off, so W_t follows a mixed ARMA(p,q) process.

Order Selection for the Mixed Model

As for Y07, all models with p \le 4 and q \le 6 are compared, now with d = 1 (the function ic_grid() was defined in Model 07).

grid_08 <- ic_grid(ts_08, d = 1)
head(grid_08, 5)

The smallest BIC is attained by ARIMA(2,1,3), and the smallest AICc by ARIMA(4,1,5). The tentative model is ARIMA(2,1,3) without a constant.

Parameter Estimation

m08 <- Arima(ts_08, order = c(2,1,3))
summary(m08)
Series: ts_08 
ARIMA(2,1,3) 

Coefficients:
         ar1      ar2     ma1      ma2      ma3
      0.6846  -0.6997  0.6033  -0.1857  -0.4097
s.e.  0.0086   0.0083  0.0108   0.0137   0.0105

sigma^2 = 2.251:  log likelihood = -18245.18
AIC=36502.36   AICc=36502.37   BIC=36545.62

Training set error measures:
                       ME     RMSE      MAE         MPE      MAPE      MASE        ACF1
Training set -0.005375228 1.500045 1.201171 -0.00893472 0.8403576 0.3886642 0.003783089

The estimates are \hat\phi_1 = 0.6846, \hat\phi_2 = -0.6997, \hat\theta_1 = 0.6033, \hat\theta_2 = -0.1857 and \hat\theta_3 = -0.4097, with \hat\sigma_a^2 = 2.251, AIC = 36502.36, AICc = 36502.37 and BIC = 36545.62.

coeftest(m08)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ar1  0.6846163  0.0085716  79.870 < 2.2e-16 ***
ar2 -0.6997123  0.0082530 -84.783 < 2.2e-16 ***
ma1  0.6033251  0.0107631  56.055 < 2.2e-16 ***
ma2 -0.1857441  0.0136597 -13.598 < 2.2e-16 ***
ma3 -0.4097409  0.0104906 -39.058 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All coefficients are significant; the smallest test statistic is |z| = 13.60 for \theta_2.

Fitted Model Equation

The general form of ARIMA(2,1,3) is

(1-\phi_1B-\phi_2B^2)\,(1-B)\,Y_t = (1+\theta_1B+\theta_2B^2+\theta_3B^3)\,a_t .

With the estimates,

(1 - 0.6846B + 0.6997B^2)\,(1-B)\,Y_t = (1 + 0.6033B - 0.1857B^2 - 0.4097B^3)\,a_t .

Multiplying out the AR side, (1-\phi_1B-\phi_2B^2)(1-B) = 1-(1+\phi_1)B+(\phi_1-\phi_2)B^2+\phi_2B^3 = 1 - 1.6846B + 1.3843B^2 - 0.6997B^3, so the explicit form is

\begin{aligned} Y_t ={}& 1.6846\,Y_{t-1} - 1.3843\,Y_{t-2} + 0.6997\,Y_{t-3} \\ &+ a_t + 0.6033\,a_{t-1} - 0.1857\,a_{t-2} - 0.4097\,a_{t-3}, \qquad a_t \sim \mathcal{N}(0,\ 2.251). \end{aligned}

The coefficients of Y_{t-1}, Y_{t-2} and Y_{t-3} sum to one (1.6846 - 1.3843 + 0.6997 = 1), which reflects the unit root.

Comparison with auto.arima()

aa08 <- auto.arima(ts_08, max.p = 10, max.q = 10)
aa08
Series: ts_08 
ARIMA(7,1,3) 

Coefficients:
         ar1      ar2     ar3      ar4      ar5     ar6      ar7     ma1      ma2      ma3
      0.7348  -0.8512  0.1217  -0.0828  -0.0460  0.0474  -0.0403  0.5577  -0.1055  -0.3369
s.e.  0.0937   0.0398  0.0793   0.0588   0.0612  0.0289   0.0244  0.0936   0.1229   0.0745

sigma^2 = 2.249:  log likelihood = -18236.57
AIC=36495.13   AICc=36495.16   BIC=36574.44

auto.arima() selects ARIMA(7,1,3), with 10 coefficients instead of 5. Its AICc (36495.16) is 7.2 units lower than that of ARIMA(2,1,3), but its BIC (36574.44) is 28.8 units higher.

coeftest(aa08)

z test of coefficients:

     Estimate Std. Error  z value  Pr(>|z|)    
ar1  0.734817   0.093741   7.8388 4.549e-15 ***
ar2 -0.851172   0.039796 -21.3886 < 2.2e-16 ***
ar3  0.121681   0.079311   1.5342   0.12498    
ar4 -0.082842   0.058824  -1.4083   0.15904    
ar5 -0.046002   0.061197  -0.7517   0.45223    
ar6  0.047368   0.028917   1.6381   0.10141    
ar7 -0.040307   0.024363  -1.6544   0.09804 .  
ma1  0.557676   0.093550   5.9612 2.503e-09 ***
ma2 -0.105457   0.122889  -0.8581   0.39081    
ma3 -0.336931   0.074454  -4.5254 6.029e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Six of the ten coefficients (ar3 to ar7 and ma2) are not significant at the 5% level. AICc penalises each extra parameter by about 2, whereas BIC penalises it by \ln n \approx 9.21. The additional AR terms absorb the tiny residual autocorrelation discussed below and improve the likelihood slightly, but at the cost of six insignificant coefficients. Parsimony and BIC favour ARIMA(2,1,3), which is also the model the series was generated from; the automatic model over-fits.

Diagnostic Checking

checkresiduals(m08)

    Ljung-Box test

data:  Residuals from ARIMA(2,1,3)
Q* = 15.186, df = 5, p-value = 0.009597

Model df: 5.   Total lags used: 10

Ljung–Box: Q^* = 15.186 with 5 degrees of freedom, p-value = 0.0096, so white noise is rejected at the 5% level. The residual ACF shows why: only a handful of very small autocorrelations, the largest at lag 7 (about 0.024), lie just outside the \pm 0.0196 bands. With n = 10{,}000 the Ljung–Box test detects even negligible dependence (an autocorrelation of 0.024 explains less than 0.1% of the residual variance). Because the series was simulated from ARIMA(2,1,3), this rejection is a false alarm (a type I error). In a real application one would try adding terms, but the over-fitted auto.arima() model above shows that such terms are insignificant and worsen BIC.

res_08 <- m08$residuals
jarque.bera.test(res_08)

    Jarque Bera Test

data:  res_08
X-squared = 0.34746, df = 2, p-value = 0.8405

Jarque–Bera: X^2 = 0.34746, p-value = 0.8405: normality is not rejected.

Conclusion. ARIMA(2,1,3) is retained for Y08. All coefficients are significant and the residuals are normal; the Ljung–Box rejection reflects autocorrelations too small to matter in practice.

Model 09

ACF & PACF Series 09

p_acf  <- ggAcf(df$Y09, lag.max = 5000) + ggtitle("ACF Y09") 
p_pacf <- ggPacf(df$Y09, lag.max = 36) + ggtitle("PACF Y09") 

p_acf | p_pacf

The ACF of the levels decays slowly with long waves, and the PACF has a dominant spike close to 1 at lag 1 followed by smaller spikes at lags 2 to 5. The slow ACF decay again indicates non-stationarity.

Stationarity Test

adf.test(df$Y09)

    Augmented Dickey-Fuller Test

data:  df$Y09
Dickey-Fuller = -2.4453, Lag order = 21, p-value = 0.3897
alternative hypothesis: stationary

ADF: Dickey–Fuller = -2.4453, p-value = 0.3897 > 0.05, so the unit root is not rejected.

pp.test(df$Y09)

    Phillips-Perron Unit Root Test

data:  df$Y09
Dickey-Fuller Z(alpha) = -23.056, Truncation lag parameter = 12, p-value = 0.03843
alternative hypothesis: stationary

PP: Z(\alpha) = -23.056, p-value = 0.03843 < 0.05, so the PP test again rejects the unit root, unlike the ADF test.

kpss.test(df$Y09)

    KPSS Test for Level Stationarity

data:  df$Y09
KPSS Level = 35.883, Truncation lag parameter = 12, p-value = 0.01

KPSS: statistic = 35.883, p-value \le 0.01, so level stationarity is rejected. As for Y08, the ADF and KPSS tests and the plots agree, while the PP test is affected by the strong short-run dynamics of the differenced series. Y09 is non-stationary and is differenced.

Differencing

ts_09 <- ts(data=df$Y09)
diff_ts_09 <- diff(ts_09, lag = 1)
autoplot(ts_09) | autoplot(diff_ts_09)

The original series wanders without a fixed mean, while the differenced series fluctuates around zero with constant variance.

adf.test(diff_ts_09)

    Augmented Dickey-Fuller Test

data:  diff_ts_09
Dickey-Fuller = -23.161, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

Dickey–Fuller = -23.161, p-value \le 0.01: W_t is stationary and d = 1.

p09_acf_diff  <- ggAcf(diff_ts_09, lag.max = 36) + ggtitle("ACF diff(Y09)") 
p09_pacf_diff <- ggPacf(diff_ts_09, lag.max = 36) + ggtitle("PACF diff(Y09)") 

p09_acf_diff | p09_pacf_diff

The ACF of W_t is a slowly damped sine wave (with a period of about 8 lags) that is still visible beyond lag 30, whereas the PACF has four significant spikes (lags 1 to 4) and cuts off afterwards. A tailing-off ACF with a PACF that cuts off after lag 4 identifies an AR(4) process for W_t, so the tentative model is ARIMA(4,1,0) without a constant.

Parameter Estimation

m09 <- Arima(ts_09, order = c(4,1,0))
summary(m09)
Series: ts_09 
ARIMA(4,1,0) 

Coefficients:
         ar1      ar2      ar3      ar4
      0.3991  -0.2036  -0.2096  -0.3379
s.e.  0.0094   0.0100   0.0100   0.0094

sigma^2 = 1.035:  log likelihood = -14358.39
AIC=28726.79   AICc=28726.79   BIC=28762.84

Training set error measures:
                      ME     RMSE       MAE          MPE      MAPE      MASE         ACF1
Training set 0.004983071 1.017068 0.8110864 0.0007137312 0.1600883 0.6847773 0.0006931769

The estimates are \hat\phi_1 = 0.3991, \hat\phi_2 = -0.2036, \hat\phi_3 = -0.2096 and \hat\phi_4 = -0.3379, with \hat\sigma_a^2 = 1.035, AIC = AICc = 28726.79 and BIC = 28762.84.

coeftest(m09)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ar1  0.3990913  0.0094106  42.409 < 2.2e-16 ***
ar2 -0.2036409  0.0100131 -20.337 < 2.2e-16 ***
ar3 -0.2096380  0.0100126 -20.937 < 2.2e-16 ***
ar4 -0.3378805  0.0094210 -35.864 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All four AR coefficients are highly significant (|z| \ge 20.3).

Fitted Model Equation

The general form of ARIMA(4,1,0) is

(1-\phi_1B-\phi_2B^2-\phi_3B^3-\phi_4B^4)\,(1-B)\,Y_t = a_t .

With the estimates,

(1 - 0.3991B + 0.2036B^2 + 0.2096B^3 + 0.3379B^4)\,(1-B)\,Y_t = a_t .

Multiplying out the AR side gives

\begin{aligned} &1-(1+\phi_1)B+(\phi_1-\phi_2)B^2+(\phi_2-\phi_3)B^3+(\phi_3-\phi_4)B^4+\phi_4B^5 \\ &= 1 - 1.3991B + 0.6027B^2 + 0.0060B^3 + 0.1282B^4 - 0.3379B^5 , \end{aligned}

so the explicit form is

\begin{aligned} Y_t ={}& 1.3991\,Y_{t-1} - 0.6027\,Y_{t-2} - 0.0060\,Y_{t-3} - 0.1282\,Y_{t-4} + 0.3379\,Y_{t-5} + a_t, \qquad a_t \sim \mathcal{N}(0,\ 1.035). \end{aligned}

As for Y08, the five autoregressive coefficients sum to one (up to rounding), which reflects the unit root.

Comparison with auto.arima()

aa09 <- auto.arima(ts_09, max.p = 10, max.q = 10)
aa09
Series: ts_09 
ARIMA(4,1,0) 

Coefficients:
         ar1      ar2      ar3      ar4
      0.3991  -0.2036  -0.2096  -0.3379
s.e.  0.0094   0.0100   0.0100   0.0094

sigma^2 = 1.035:  log likelihood = -14358.39
AIC=28726.79   AICc=28726.79   BIC=28762.84
coeftest(aa09)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ar1  0.3990913  0.0094106  42.409 < 2.2e-16 ***
ar2 -0.2036409  0.0100131 -20.337 < 2.2e-16 ***
ar3 -0.2096380  0.0100126 -20.937 < 2.2e-16 ***
ar4 -0.3378805  0.0094210 -35.864 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

auto.arima() selects exactly the same model, ARIMA(4,1,0), with identical estimates and significance tests. Both approaches agree.

Diagnostic Checking

checkresiduals(m09)

    Ljung-Box test

data:  Residuals from ARIMA(4,1,0)
Q* = 3.7051, df = 6, p-value = 0.7165

Model df: 4.   Total lags used: 10

Ljung–Box: Q^* = 3.7051 with 6 degrees of freedom, p-value = 0.7165: the residuals are white noise.

res_09 <- m09$residuals
jarque.bera.test(res_09)

    Jarque Bera Test

data:  res_09
X-squared = 0.11057, df = 2, p-value = 0.9462

Jarque–Bera: X^2 = 0.11057, p-value = 0.9462: normality is not rejected.

Conclusion. ARIMA(4,1,0) is adequate for Y09.

Model 10

ACF & PACF Series 10

p_acf  <- ggAcf(df$Y10, lag.max = 36) + ggtitle("ACF Y10") 
p_pacf <- ggPacf(df$Y10, lag.max = 36) + ggtitle("PACF Y10") 

p_acf | p_pacf

The ACF is a damped sine wave: positive at lags 1 and 2, negative at lags 3 to 6, positive again around lags 8 to 10, and negligible after about lag 12. The PACF has two significant spikes (about 0.76 at lag 1 and -0.60 at lag 2) and cuts off afterwards. This is the pattern of an AR(2) process with complex roots.

Stationarity Test

adf.test(df$Y10)

    Augmented Dickey-Fuller Test

data:  df$Y10
Dickey-Fuller = -21.278, Lag order = 21, p-value = 0.01
alternative hypothesis: stationary

ADF: Dickey–Fuller = -21.278, p-value \le 0.01, so the unit root is rejected.

pp.test(df$Y10)

    Phillips-Perron Unit Root Test

data:  df$Y10
Dickey-Fuller Z(alpha) = -1452.6, Truncation lag parameter = 12, p-value = 0.01
alternative hypothesis: stationary

PP: Z(\alpha) = -1452.6, p-value \le 0.01, so the unit root is rejected.

kpss.test(df$Y10)

    KPSS Test for Level Stationarity

data:  df$Y10
KPSS Level = 0.09477, Truncation lag parameter = 12, p-value = 0.1

KPSS: statistic = 0.09477, p-value \ge 0.10, so level stationarity is not rejected. Y10 is stationary (d = 0), and the tentative model is ARIMA(2,0,0) with a non-zero mean.

Parameter Estimation

ts_10 <- ts(data=df$Y10)
m10 <- Arima(ts_10, order = c(2,0,0))
summary(m10)
Series: ts_10 
ARIMA(2,0,0) with non-zero mean 

Coefficients:
         ar1      ar2     mean
      1.2131  -0.6018  49.9794
s.e.  0.0080   0.0080   0.0520

sigma^2 = 4.094:  log likelihood = -21235.86
AIC=42479.73   AICc=42479.73   BIC=42508.57

Training set error measures:
                       ME     RMSE      MAE        MPE     MAPE      MASE        ACF1
Training set 9.326962e-05 2.022957 1.621585 -0.1660213 3.268997 0.7485863 0.003651908

The estimates are \hat\phi_1 = 1.2131, \hat\phi_2 = -0.6018 and \hat\mu = 49.9794, with \hat\sigma_a^2 = 4.094, AIC = AICc = 42479.73 and BIC = 42508.57.

coeftest(m10)

z test of coefficients:

            Estimate Std. Error z value  Pr(>|z|)    
ar1        1.2130912  0.0079855 151.911 < 2.2e-16 ***
ar2       -0.6018124  0.0079897 -75.323 < 2.2e-16 ***
intercept 49.9794164  0.0520412 960.381 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

All parameters are highly significant (z = 151.91, -75.32 and 960.38).

Fitted Model Equation

The general form of ARIMA(2,0,0) with mean \mu is

(1-\phi_1B-\phi_2B^2)\,(Y_t-\mu) = a_t .

With the estimates,

(1 - 1.2131B + 0.6018B^2)\,(Y_t - 49.9794) = a_t ,

which expands to

Y_t = 19.4281 + 1.2131\,Y_{t-1} - 0.6018\,Y_{t-2} + a_t,\qquad a_t \sim \mathcal{N}(0,\ 4.094),

where 19.4281 = 49.9794 \times (1 - 1.2131 + 0.6018).

Comparison with auto.arima()

aa10 <- auto.arima(ts_10, max.p = 10, max.q = 10)
aa10
Series: ts_10 
ARIMA(2,0,0) with non-zero mean 

Coefficients:
         ar1      ar2     mean
      1.2131  -0.6018  49.9794
s.e.  0.0080   0.0080   0.0520

sigma^2 = 4.094:  log likelihood = -21235.86
AIC=42479.73   AICc=42479.73   BIC=42508.57

auto.arima() selects the same model, ARIMA(2,0,0) with a non-zero mean, with identical estimates. Both approaches agree.

Diagnostic Checking

checkresiduals(m10)

    Ljung-Box test

data:  Residuals from ARIMA(2,0,0) with non-zero mean
Q* = 7.8159, df = 8, p-value = 0.4517

Model df: 2.   Total lags used: 10

Ljung–Box: Q^* = 7.8159 with 8 degrees of freedom, p-value = 0.4517: the residuals are white noise.

res_10 <- m10$residuals
jarque.bera.test(res_10)

    Jarque Bera Test

data:  res_10
X-squared = 1.3388, df = 2, p-value = 0.512

Jarque–Bera: X^2 = 1.3388, p-value = 0.512: normality is not rejected.

Conclusion. ARIMA(2,0,0) with a non-zero mean is adequate for Y10.

Manual vs auto.arima()

The table below collects, for every series, the manually identified model and the model chosen by auto.arima(), together with their AICc and BIC, the number of insignificant coefficients (p-value > 0.05) in the automatic model, and the Ljung–Box p-values computed with the same lag choice as checkresiduals().

manual <- list(Y01 = m01, Y02 = m02, Y03 = m03, Y04 = m04, Y05 = m05,
               Y06 = m06, Y07 = m07, Y08 = m08, Y09 = m09, Y10 = m10)
auto   <- list(Y01 = aa01, Y02 = aa02, Y03 = aa03, Y04 = aa04, Y05 = aa05,
               Y06 = aa06, Y07 = aa07, Y08 = aa08, Y09 = aa09, Y10 = aa10)

model_label <- function(fit) {
  o <- arimaorder(fit)
  sprintf("ARIMA(%d,%d,%d)", o[1], o[2], o[3])
}
n_insignificant <- function(fit) {
  ct <- coeftest(fit)
  sum(ct[!rownames(ct) %in% c("intercept", "drift"), 4] > 0.05)
}
ljung_box_p <- function(fit) {
  k <- sum(fit$arma[1:2])                       # number of AR + MA coefficients
  Box.test(residuals(fit), lag = max(k + 3, 10), type = "Ljung-Box", fitdf = k)$p.value
}

comparison <- tibble(
  Series                       = names(manual),
  Manual                       = map_chr(manual, model_label),
  `auto.arima`                 = map_chr(auto, model_label),
  Agree                        = Manual == `auto.arima`,
  `AICc manual`                = map_dbl(manual, "aicc"),
  `AICc auto`                  = map_dbl(auto, "aicc"),
  `BIC manual`                 = map_dbl(manual, "bic"),
  `BIC auto`                   = map_dbl(auto, "bic"),
  `Insignificant coef. (auto)` = map_int(auto, n_insignificant),
  `Ljung-Box p (manual)`       = map_dbl(manual, ljung_box_p),
  `Ljung-Box p (auto)`         = map_dbl(auto, ljung_box_p)
) %>%
  mutate(across(where(is.double), ~ round(.x, 3)))

comparison

Agreement. auto.arima() reproduces the manual model exactly for four series: Y02 (AR(1)), Y04 (MA(2)), Y09 (ARIMA(4,1,0)) and Y10 (AR(2)). These are low-order models with simple ACF/PACF patterns, and both approaches give identical estimates. The order of differencing chosen by auto.arima() is correct for all ten series, so its KPSS-based choice of d agrees with the unit-root tests used here.

One extra, insignificant term. For Y05 and Y06, auto.arima() adds one parameter that is not significant (ar7 in AR(7), z \approx 1.85; ar1 in ARMA(1,1), z \approx 0.74). For Y05, the AICc of AR(7) is only 1.41 units lower, a difference below 2 that does not indicate a real improvement, and BIC prefers AR(6). For Y06, the selected ARMA(1,1) even has a higher exact AICc (by 1.45) and BIC (by 8.66) than MA(1).

Several extra terms. For Y08, ARIMA(7,1,3) has a lower AICc than ARIMA(2,1,3) (by 7.21) but a higher BIC (by 28.82) and six insignificant coefficients. The extra AR terms model a tiny amount of residual autocorrelation that is statistically detectable only because n is so large.

Over-parameterised local optima. For Y01, Y03 and Y07, auto.arima() returns large models, ARIMA(9,1,6), ARIMA(10,0,2) and ARIMA(10,0,3), whose AICc is worse than that of the manual model by 120.2, 409.4 and 20.9 units, respectively (BIC is worse by 170.6, 438.2 and 57.0 units). Here the automatic search failed by its own standard, because it did not find the model with the smallest AICc.

Conclusion. The manual Box–Jenkins approach recovered the data-generating model for all ten series and produced parsimonious models with significant coefficients and well-behaved residuals. It combined cut-off patterns in the ACF and PACF, significance tests, residual diagnostics, and an exhaustive information-criterion search reserved for the genuinely mixed models. auto.arima() is a valuable and fast benchmark, especially for low-order models, but its output should be checked rather than accepted blindly. A more thorough automatic search is available through auto.arima(y, stepwise = FALSE, approximation = FALSE, max.order = 15, ic = "bic"), at a much higher computational cost for series of this length.

Summary

LS0tCnRpdGxlOiAiQVJJTUEgTW9kZWxsaW5nIG9mIFNpbXVsYXRlZCBUaW1lIFNlcmllcyIKc3VidGl0bGU6ICJCb3jigJNKZW5raW5zIGlkZW50aWZpY2F0aW9uLCBlc3RpbWF0aW9uIGFuZCBkaWFnbm9zdGljIGNoZWNraW5nIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG1hdGhfbWV0aG9kOiBrYXRleAogICAgdGhlbWU6IHlldGkKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICB0b2NfY29sbGFwc2VkOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IGZhbHNlCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFKQpgYGAKCiMjIEludHJvZHVjdGlvbgoKVGhpcyBub3RlYm9vayBhbmFseXNlcyB0ZW4gc2ltdWxhdGVkIHRpbWUgc2VyaWVzLCBgWTAxYOKAk2BZMTBgLCBlYWNoIG9mIGxlbmd0aCAkbiA9IDEweyx9MDAwJCwgc3RvcmVkIGluIGBkYXRhX2FyaW1hLmNzdmAuIEV2ZXJ5IHNlcmllcyB3YXMgZ2VuZXJhdGVkIGZyb20gYSBub24tc2Vhc29uYWwgQVJJTUEoJHAsZCxxJCkgbW9kZWwgd2l0aG91dCBkcmlmdC4gdGhlIGFuYWx5c2VzIGFyZSBkb25lIGJ5IHVzaW5nIHRoZSBCb3jigJNKZW5raW5zIG1ldGhvZG9sb2d5OgoKMS4gKipJZGVudGlmaWNhdGlvbioqOiBpbnNwZWN0IHRoZSBzYW1wbGUgQUNGIGFuZCBQQUNGLCB0ZXN0IGZvciBzdGF0aW9uYXJpdHksIGRpZmZlcmVuY2UgdGhlIHNlcmllcyBpZiBuZWNlc3NhcnksIGFuZCByZWFkIHRlbnRhdGl2ZSBvcmRlcnMgJChwLHEpJCBmcm9tIHRoZSBBQ0YgYW5kIFBBQ0Ygb2YgdGhlIHN0YXRpb25hcnkgc2VyaWVzLgoyLiAqKkVzdGltYXRpb24qKjogZml0IHRoZSB0ZW50YXRpdmUgbW9kZWwgYnkgbWF4aW11bSBsaWtlbGlob29kIGFuZCB0ZXN0IHRoZSBzaWduaWZpY2FuY2Ugb2YgZXZlcnkgY29lZmZpY2llbnQuCjMuICoqRGlhZ25vc3RpYyBjaGVja2luZyoqOiB2ZXJpZnkgdGhhdCB0aGUgcmVzaWR1YWxzIGJlaGF2ZSBsaWtlIEdhdXNzaWFuIHdoaXRlIG5vaXNlLgoKRm9yIGV2ZXJ5IHNlcmllcywgdGhlIG1hbnVhbGx5IGlkZW50aWZpZWQgbW9kZWwgaXMgYWxzbyBjb21wYXJlZCB3aXRoIHRoZSBtb2RlbCBzZWxlY3RlZCBhdXRvbWF0aWNhbGx5IGJ5IGBmb3JlY2FzdDo6YXV0by5hcmltYSgpYC4gQWxsIHRlc3RzIHVzZSBhIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAkXGFscGhhID0gNVwlJC4KCgoqKklkZW50aWZpY2F0aW9uIHJ1bGVzLioqIFdpdGggJG4gPSAxMHssfTAwMCQsIHRoZSBhcHByb3hpbWF0ZSA5NSUgYmFuZHMgb2YgdGhlIHNhbXBsZSBBQ0YgYW5kIFBBQ0YgYXJlICRccG0gMS45Ni9cc3FydHtufSBcYXBwcm94IFxwbSAwLjAxOTYkIChkYXNoZWQgbGluZXMgaW4gdGhlIHBsb3RzKS4KCnwgUHJvY2VzcyAgICAgIHwgQUNGICAgICAgICAgICAgICAgICAgICAgICAgfCBQQUNGICAgICAgICAgICAgICAgICAgICAgICB8CnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgQVIoJHAkKSAgICAgIHwgdGFpbHMgb2ZmICAgICAgICAgICAgICAgICAgfCBjdXRzIG9mZiBhZnRlciBsYWcgJHAkICAgICB8CnwgTUEoJHEkKSAgICAgIHwgY3V0cyBvZmYgYWZ0ZXIgbGFnICRxJCAgICAgfCB0YWlscyBvZmYgICAgICAgICAgICAgICAgICB8CnwgQVJNQSgkcCxxJCkgIHwgdGFpbHMgb2ZmICAgICAgICAgICAgICAgICAgfCB0YWlscyBvZmYgICAgICAgICAgICAgICAgICB8CgojIyBMaWJyYXJpZXMKCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkodHNlcmllcykKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkobG10ZXN0KQpgYGAKCiMjIERhdGFzZXQKClRoZSBkYXRhIHNldCBjb250YWlucyBhIHRpbWUgaW5kZXggYHRgIGFuZCB0aGUgdGVuIHNlcmllcy4KCmBgYHtyfQpkZiA8LSByZWFkX2NzdigiZGF0YV9hcmltYS5jc3YiKQpoZWFkKGRmKQpgYGAKCkVhY2ggY29sdW1uIGBZMDFg4oCTYFkxMGAgaXMgb25lIHNlcmllcyBvYnNlcnZlZCBhdCAkdCA9IDEsIFxkb3RzLCAxMHssfTAwMCQuCgpgYGB7ciwgZmlnLndpZHRoPTEwfQpkZiAlPiUKICBwaXZvdF9sb25nZXIoY29scyA9IFkwMTpZMTAsIG5hbWVzX3RvID0gInNlcmllcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIGdncGxvdChhZXMoeCA9IHQsIHkgPSB2YWx1ZSkpICsKICAgIGdlb21fbGluZShjb2xvdXIgPSAic3RlZWxibHVlIikgKwogICAgZmFjZXRfd3JhcCh+IHNlcmllcywgbmNvbCA9IDIsIHNjYWxlcyA9ICJmcmVlX3kiKSArCiAgICBsYWJzKHggPSAidCIsIHkgPSBOVUxMKSArCiAgICB0aGVtZV9idygpCmBgYAoKVGhyZWUgc2VyaWVzLCBgWTAxYCwgYFkwOGAgYW5kIGBZMDlgLCB3YW5kZXIgYXdheSBmcm9tIHRoZWlyIHN0YXJ0aW5nIGxldmVsIGFuZCBuZXZlciByZXR1cm4gdG8gYSBmaXhlZCBtZWFuLiBUaGlzIGlzIHRoZSB0eXBpY2FsIGFwcGVhcmFuY2Ugb2YgYSBzdG9jaGFzdGljIHRyZW5kLCBpLmUuIG5vbi1zdGF0aW9uYXJpdHkgaW4gdGhlIG1lYW4uIFRoZSBvdGhlciBzZXZlbiBzZXJpZXMgZmx1Y3R1YXRlIGFyb3VuZCBjb25zdGFudCBsZXZlbHMgKGFib3V0IDIwLCA3NSwgMzAsIDEwMCwgMTAsIDYwIGFuZCA1MCBmb3IgYFkwMmDigJNgWTA3YCBhbmQgYFkxMGApIHdpdGggcm91Z2hseSBjb25zdGFudCB2YXJpYW5jZSwgd2hpY2ggc3VnZ2VzdHMgc3RhdGlvbmFyaXR5LgoKIyMgQVJJTUEgTW9kZWxsaW5nCgpFYWNoIHN1YnNlY3Rpb24gZm9sbG93cyB0aGUgc2FtZSBzdGVwczogQUNGIGFuZCBQQUNGIG9mIHRoZSBvcmlnaW5hbCBzZXJpZXMsIHN0YXRpb25hcml0eSB0ZXN0cywgZGlmZmVyZW5jaW5nICh3aGVuIG5lZWRlZCksIGlkZW50aWZpY2F0aW9uLCBlc3RpbWF0aW9uLCB0aGUgZml0dGVkIG1vZGVsIGVxdWF0aW9uLCBjb21wYXJpc29uIHdpdGggYGF1dG8uYXJpbWEoKWAsIGFuZCBkaWFnbm9zdGljIGNoZWNraW5nLgoKIyMjIE1vZGVsIDAxCgojIyMjIEFDRiAmIFBBQ0YgU2VyaWVzIDAxCgpXZSBzdGFydCB3aXRoIHRoZSBzYW1wbGUgQUNGIG9mIHRoZSBvcmlnaW5hbCBzZXJpZXMsIHNob3duIHVwIHRvIGxhZyA1LDAwMCB0byBkaXNwbGF5IGl0cyBjb21wbGV0ZSBkZWNheSwgYW5kIHRoZSBQQUNGIHVwIHRvIGxhZyAzNi4KCmBgYHtyfQpwX2FjZiAgPC0gZ2dBY2YoZGYkWTAxLCBsYWcubWF4ID0gNTAwMCkgKyBnZ3RpdGxlKCJBQ0YgWTAxIikgCnBfcGFjZiA8LSBnZ1BhY2YoZGYkWTAxLCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiUEFDRiBZMDEiKSAKCnBfYWNmIHwgcF9wYWNmCmBgYAoKVGhlIEFDRiBzdGFydHMgbmVhciAxIGFuZCBkZWNheXMgYWxtb3N0IGxpbmVhcmx5OiBpdCBzdGF5cyBwb3NpdGl2ZSBhbmQgc2lnbmlmaWNhbnQgZm9yIG1vcmUgdGhhbiAzLDAwMCBsYWdzIGJlZm9yZSB0dXJuaW5nIG5lZ2F0aXZlLiBUaGUgUEFDRiBoYXMgYSBzaW5nbGUgZG9taW5hbnQgc3Bpa2UgY2xvc2UgdG8gMSBhdCBsYWcgMS4gU3VjaCBhbiBleHRyZW1lbHkgc2xvdyBkZWNheSBvZiB0aGUgQUNGIGlzIHRoZSBjbGFzc2ljIHNpZ25hdHVyZSBvZiBhIG5vbi1zdGF0aW9uYXJ5LCBzbyB0aGUgQUNGIGFuZCBQQUNGIG9mIHRoZSBsZXZlbHMgY2Fubm90IGJlIHVzZWQgdG8gaWRlbnRpZnkgJHAkIGFuZCAkcSQuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpUaHJlZSB0ZXN0cyBhcmUgYXBwbGllZCB0byB0aGUgb3JpZ2luYWwgc2VyaWVzLiBUaGUgQXVnbWVudGVkIERpY2tleeKAk0Z1bGxlciAoQURGKSBhbmQgUGhpbGxpcHPigJNQZXJyb24gKFBQKSB0ZXN0cyBoYXZlICRIXzAkOiB0aGUgc2VyaWVzIGhhcyBhIHVuaXQgcm9vdCAobm9uLXN0YXRpb25hcnkpLiBUaGUgS1BTUyB0ZXN0IGhhcyB0aGUgcmV2ZXJzZSBudWxsLCAkSF8wJDogdGhlIHNlcmllcyBpcyBsZXZlbC1zdGF0aW9uYXJ5LgoKYGBge3J9CmFkZi50ZXN0KGRmJFkwMSkKYGBgCgpBREY6IERpY2tleeKAk0Z1bGxlciAkPSAtMi41MjI3JCwgcC12YWx1ZSAkPSAwLjM1NjkgPiAwLjA1JCwgc28gdGhlIHVuaXQtcm9vdCBoeXBvdGhlc2lzIGlzIG5vdCByZWplY3RlZC4KCmBgYHtyfQpwcC50ZXN0KGRmJFkwMSkKYGBgCgpQUDogcC12YWx1ZSAkPSAwLjY1MDcgPiAwLjA1JCwgYWdhaW4gbm8gZXZpZGVuY2UgYWdhaW5zdCBhIHVuaXQgcm9vdC4KCmBgYHtyfQprcHNzLnRlc3QoZGYkWTAxKQpgYGAKCktQU1M6IHN0YXRpc3RpYyAkPSA2Ny43MTgkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIGxldmVsIHN0YXRpb25hcml0eSBpcyByZWplY3RlZC4gQWxsIHRocmVlIHRlc3RzIGFncmVlOiAqKmBZMDFgIGlzIG5vbi1zdGF0aW9uYXJ5IGluIHRoZSBtZWFuKiogYW5kIGhhcyB0byBiZSBkaWZmZXJlbmNlZC4KCiMjIyMgRGlmZmVyZW5jaW5nCgpXZSB0YWtlIHRoZSBmaXJzdCBkaWZmZXJlbmNlICRXX3QgPSAoMS1CKVlfdCA9IFlfdCAtIFlfe3QtMX0kIGFuZCBjb21wYXJlIHRoZSBvcmlnaW5hbCBhbmQgdGhlIGRpZmZlcmVuY2VkIHNlcmllcy4KCmBgYHtyfQp0c18wMSA8LSB0cyhkYXRhPWRmJFkwMSkKZGlmZl90c18wMSA8LSBkaWZmKHRzXzAxLCBsYWcgPSAxKQphdXRvcGxvdCh0c18wMSkgfCBhdXRvcGxvdChkaWZmX3RzXzAxKQpgYGAKClRoZSBvcmlnaW5hbCBzZXJpZXMgKGxlZnQpIGRyaWZ0cyBiZXR3ZWVuIHJvdWdobHkgJC0xMDAkIGFuZCAkNDUwJCB3aXRob3V0IGEgZml4ZWQgbWVhbiwgd2hlcmVhcyB0aGUgZGlmZmVyZW5jZWQgc2VyaWVzIChyaWdodCkgZmx1Y3R1YXRlcyBhcm91bmQgemVybyB3aXRoIGNvbnN0YW50IHZhcmlhbmNlLiBUaGUgQURGIHRlc3QgY29uZmlybXMgdGhpcy4KCmBgYHtyfQphZGYudGVzdChkaWZmX3RzXzAxKQpgYGAKCkRpY2tleeKAk0Z1bGxlciAkPSAtMTguOTUkLCBwLXZhbHVlICRcbGUgMC4wMSQ6IHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQsIHNvICRXX3QkIGlzIHN0YXRpb25hcnkgYW5kICoqJGQgPSAxJCoqLiBUaGUgQUNGIGFuZCBQQUNGIG9mICRXX3QkIGFyZSBub3cgdXNlZCB0byBpZGVudGlmeSAkcCQgYW5kICRxJC4KCmBgYHtyfQpwMDFfYWNmX2RpZmYgIDwtIGdnQWNmKGRpZmZfdHNfMDEsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJBQ0YgZGlmZihZMDEpIikgCnAwMV9wYWNmX2RpZmYgPC0gZ2dQYWNmKGRpZmZfdHNfMDEsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIGRpZmYoWTAxKSIpIAoKcDAxX2FjZl9kaWZmIHwgcDAxX3BhY2ZfZGlmZgpgYGAKClRoZSBBQ0Ygb2YgJFdfdCQgaGFzIHNpZ25pZmljYW50IHNwaWtlcyBhdCBsYWdzIDEgdG8gOCBhbmQgdGhlbiBjdXRzIG9mZiBhYnJ1cHRseTogZnJvbSBsYWcgOSBvbndhcmQgYWxsIGF1dG9jb3JyZWxhdGlvbnMgbGllIGluc2lkZSB0aGUgYmFuZHMuIFRoZSBQQUNGLCBpbiBjb250cmFzdCwgZGllcyBkb3duIGdyYWR1YWxseSBpbiBhbiBpcnJlZ3VsYXIsIG9zY2lsbGF0aW5nIHdheS4gQSBjdXQtb2ZmIEFDRiBjb21iaW5lZCB3aXRoIGEgdGFpbGluZy1vZmYgUEFDRiBwb2ludHMgdG8gYSBwdXJlIE1BIHByb2Nlc3MsIGFuZCB0aGUgbGFzdCBzaWduaWZpY2FudCBBQ0YgbGFnIGdpdmVzICRxID0gOCQuIFRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgdGhlcmVmb3JlICoqQVJJTUEoMCwxLDgpKiosIHdpdGhvdXQgYSBjb25zdGFudCBiZWNhdXNlIHRoZSBkaWZmZXJlbmNlZCBzZXJpZXMgaGFzIG1lYW4gemVybyAobm8gZHJpZnQpLgoKIyMjIyBQYXJhbWV0ZXIgRXN0aW1hdGlvbgoKQVJJTUEoMCwxLDgpIGlzIGVzdGltYXRlZCBieSBtYXhpbXVtIGxpa2VsaWhvb2Qgd2l0aCBgQXJpbWEoKWAuCgpgYGB7cn0KbTAxIDwtIEFyaW1hKHRzXzAxLCBvcmRlciA9IGMoMCwxLDgpKQpzdW1tYXJ5KG0wMSkKYGBgCgpBbGwgZWlnaHQgTUEgY29lZmZpY2llbnRzIGFyZSBlc3RpbWF0ZWQgcHJlY2lzZWx5IChzdGFuZGFyZCBlcnJvcnMgYmVsb3cgMC4wMSkuIFRoZSByZXNpZHVhbCB2YXJpYW5jZSBpcyAkXGhhdFxzaWdtYV9hXjIgPSAwLjk5MTMkLCB3aXRoIEFJQyAkPSAyODMwMy4wOCQsIEFJQ2MgJD0gMjgzMDMuMDkkIGFuZCBCSUMgJD0gMjgzNjcuOTckLiBOZXh0LCBlYWNoIGNvZWZmaWNpZW50IGlzIHRlc3RlZCB3aXRoICRIXzA6IFx0aGV0YV9qID0gMCQuCgpgYGB7cn0KY29lZnRlc3QobTAxKQpgYGAKCkV2ZXJ5IGNvZWZmaWNpZW50IGlzIGhpZ2hseSBzaWduaWZpY2FudCAoJHx6fCBcZ2UgMjEuNSQsIHAtdmFsdWUgJDwgMi4yXHRpbWVzMTBeey0xNn0kKSwgc28gbm8gdGVybSBjYW4gYmUgZHJvcHBlZC4KCiMjIyMgRml0dGVkIE1vZGVsIEVxdWF0aW9uCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIEFSSU1BKDAsMSw4KSBpcwoKJCQKKDEtQilcLFlfdCA9ICgxK1x0aGV0YV8xQitcdGhldGFfMkJeMitcY2RvdHMrXHRoZXRhXzhCXjgpXCxhX3QgLgokJAoKU3Vic3RpdHV0aW5nIHRoZSBlc3RpbWF0ZXMgZ2l2ZXMKCiQkClxiZWdpbnthbGlnbmVkfQooMS1CKVwsWV90ID17fSYgKDEgKyAwLjQwMDBCICsgMC4yMDQyQl4yICsgMC40MDk5Ql4zIC0gMC41MDY0Ql40IFxcCiYrIDAuMzA3NkJeNSArIDAuMzA5MEJeNiArIDAuMjA1MkJeNyArIDAuNDY5NUJeOClcLGFfdCAsClxlbmR7YWxpZ25lZH0KJCQKCmFuZCwgd3JpdHRlbiBleHBsaWNpdGx5IGluIHRlcm1zIG9mIHBhc3Qgb2JzZXJ2YXRpb25zIGFuZCBzaG9ja3MsCgokJApcYmVnaW57YWxpZ25lZH0KWV90ID17fSYgWV97dC0xfSArIGFfdCArIDAuNDAwMFwsYV97dC0xfSArIDAuMjA0MlwsYV97dC0yfSArIDAuNDA5OVwsYV97dC0zfSAtIDAuNTA2NFwsYV97dC00fSBcXAomKyAwLjMwNzZcLGFfe3QtNX0gKyAwLjMwOTBcLGFfe3QtNn0gKyAwLjIwNTJcLGFfe3QtN30gKyAwLjQ2OTVcLGFfe3QtOH0sClxxcXVhZCBhX3QgXHNpbSBcbWF0aGNhbHtOfSgwLFwgMC45OTEzKS4KXGVuZHthbGlnbmVkfQokJAoKRWFjaCBuZXcgdmFsdWUgZXF1YWxzIHRoZSBwcmV2aW91cyB2YWx1ZSBwbHVzIGEgc2hvY2sgdGhhdCBpcyBhIHdlaWdodGVkIHN1bSBvZiB0aGUgY3VycmVudCBhbmQgdGhlIGxhc3QgZWlnaHQgaW5ub3ZhdGlvbnMuCgojIyMjIENvbXBhcmlzb24gd2l0aCBhdXRvLmFyaW1hKCkKCkFzIGEgYmVuY2htYXJrLCBgYXV0by5hcmltYSgpYCBzZWxlY3RzIGEgbW9kZWwgYXV0b21hdGljYWxseSwgYWxsb3dpbmcgdXAgdG8gdGVuIEFSIGFuZCB0ZW4gTUEgdGVybXMuCgpgYGB7cn0KYWEwMSA8LSBhdXRvLmFyaW1hKHRzXzAxLCBtYXgucCA9IDEwLCBtYXgucSA9IDEwKQphYTAxCmBgYAoKYGF1dG8uYXJpbWEoKWAgc2VsZWN0cyAqKkFSSU1BKDksMSw2KSoqLCBhIG1vZGVsIHdpdGggMTUgY29lZmZpY2llbnRzLiBJdCBmaW5kcyB0aGUgY29ycmVjdCBvcmRlciBvZiBkaWZmZXJlbmNpbmcgKCRkID0gMSQpLCBidXQgaXRzIEFJQ2MgKCQyODQyMy4yOSQpIGlzICQxMjAuMiQgdW5pdHMgKmxhcmdlciogdGhhbiB0aGUgQUlDYyBvZiB0aGUgbWFudWFsbHkgaWRlbnRpZmllZCBBUklNQSgwLDEsOCkgKCQyODMwMy4wOSQpLCBhbmQgaXRzIEJJQyBpcyAkMTcwLjYkIHVuaXRzIGxhcmdlci4gVGhlIGF1dG9tYXRpYyBwcm9jZWR1cmUgdGhlcmVmb3JlIGRpZCBub3QgZXZlbiBmaW5kIHRoZSBtb2RlbCB0aGF0IGlzIGJlc3QgYnkgaXRzIG93biBjcml0ZXJpb246IGZvciBhIGxvbmcgc2VyaWVzIGl0IHNlYXJjaGVzIHN0ZXB3aXNlIHVzaW5nIGFuIGFwcHJveGltYXRlIGxpa2VsaWhvb2QsIGFuZCBoZXJlIGl0IHN0b3BwZWQgaW4gYW4gb3Zlci1wYXJhbWV0ZXJpc2VkIGxvY2FsIG9wdGltdW0uCgpgYGB7cn0KY29lZnRlc3QoYWEwMSkKYGBgCgpBbGwgMTUgY29lZmZpY2llbnRzIGFyZSBpbmRpdmlkdWFsbHkgc2lnbmlmaWNhbnQsIGJ1dCBzaWduaWZpY2FuY2UgYWxvbmUgZG9lcyBub3QgbWFrZSB0aGlzIGEgYmV0dGVyIG1vZGVsOiBpdCBpcyBmYXIgbGVzcyBwYXJzaW1vbmlvdXMgYW5kIGZpdHMgd29yc2UgdGhhbiBBUklNQSgwLDEsOCkgYWNjb3JkaW5nIHRvIGJvdGggQUlDYyBhbmQgQklDLiBUaGUgbWFudWFsIG1vZGVsIGlzIHByZWZlcnJlZC4KCiMjIyMgRGlhZ25vc3RpYyBDaGVja2luZwoKQW4gYWRlcXVhdGUgbW9kZWwgbGVhdmVzIHJlc2lkdWFscyB0aGF0IGJlaGF2ZSBsaWtlIHdoaXRlIG5vaXNlLiBgY2hlY2tyZXNpZHVhbHMoKWAgcGxvdHMgdGhlIHJlc2lkdWFscywgdGhlaXIgQUNGIGFuZCB0aGVpciBoaXN0b2dyYW0sIGFuZCBydW5zIHRoZSBManVuZ+KAk0JveCB0ZXN0IHdpdGggJEhfMCQ6IG5vIGF1dG9jb3JyZWxhdGlvbiB1cCB0byB0aGUgY2hvc2VuIGxhZyAoaGVyZSAxMSBsYWdzLCBvZiB3aGljaCA4IGRlZ3JlZXMgb2YgZnJlZWRvbSBhcmUgYWJzb3JiZWQgYnkgdGhlIE1BIGNvZWZmaWNpZW50cykuCgpgYGB7cn0KY2hlY2tyZXNpZHVhbHMobTAxKQpgYGAKCiRRXiogPSAxLjcyODMkIHdpdGggMyBkZWdyZWVzIG9mIGZyZWVkb20gYW5kIHAtdmFsdWUgJD0gMC42MzA3ID4gMC4wNSQ6IHRoZSByZXNpZHVhbHMgc2hvdyBubyByZW1haW5pbmcgYXV0b2NvcnJlbGF0aW9uLiBUaGUgcmVzaWR1YWwgQUNGIHN0YXlzIHdpdGhpbiB0aGUgYmFuZHMgYW5kIHRoZSBoaXN0b2dyYW0gaXMgYmVsbC1zaGFwZWQuIE5vcm1hbGl0eSBpcyBjaGVja2VkIGZvcm1hbGx5IHdpdGggdGhlIEphcnF1ZeKAk0JlcmEgdGVzdCAoJEhfMCQ6IHRoZSByZXNpZHVhbHMgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkKS4KCmBgYHtyfQpyZXNfMDEgPC0gbTAxJHJlc2lkdWFscwpqYXJxdWUuYmVyYS50ZXN0KHJlc18wMSkKYGBgCgokWF4yID0gMC43MDA1MyQsIHAtdmFsdWUgJD0gMC43MDQ1ID4gMC4wNSQ6IG5vcm1hbGl0eSBpcyBub3QgcmVqZWN0ZWQuCgoqKkNvbmNsdXNpb24uKiogQVJJTUEoMCwxLDgpIGlzIGFkZXF1YXRlIGZvciBgWTAxYDogYWxsIGNvZWZmaWNpZW50cyBhcmUgc2lnbmlmaWNhbnQgYW5kIHRoZSByZXNpZHVhbHMgYmVoYXZlIGxpa2UgR2F1c3NpYW4gd2hpdGUgbm9pc2UuCgoKIyMjIE1vZGVsIDAyCgojIyMjIEFDRiAmIFBBQ0YgU2VyaWVzIDAyCgpgWTAyYCBsb29rcyBzdGF0aW9uYXJ5IGluIHRoZSBvdmVydmlldyBwbG90LCBzbyBpdHMgQUNGIGFuZCBQQUNGIGFyZSBpbnNwZWN0ZWQgZGlyZWN0bHkgKHVwIHRvIGxhZyAzNikuCgpgYGB7cn0KcF9hY2YgIDwtIGdnQWNmKGRmJFkwMiwgbGFnLm1heCA9IDM2KSArIGdndGl0bGUoIkFDRiBZMDIiKSAKcF9wYWNmIDwtIGdnUGFjZihkZiRZMDIsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIFkwMiIpIAoKcF9hY2YgfCBwX3BhY2YKYGBgCgpUaGUgQUNGIGRlY2F5cyBleHBvbmVudGlhbGx5IGZyb20gYWJvdXQgMC43MSBhdCBsYWcgMSBhbmQgYmVjb21lcyBuZWdsaWdpYmxlIGFmdGVyIHJvdWdobHkgbGFnIDEwLCB3aGlsZSB0aGUgUEFDRiBoYXMgb25lIGxhcmdlIHNwaWtlIGF0IGxhZyAxIChhYm91dCAwLjcxKSBhbmQgaXMgaW5zaWduaWZpY2FudCBhZnRlcndhcmRzLiBBIHRhaWxpbmctb2ZmIEFDRiB0b2dldGhlciB3aXRoIGEgUEFDRiB0aGF0IGN1dHMgb2ZmIGFmdGVyIGxhZyAxIGlzIHRoZSBwYXR0ZXJuIG9mIGFuICoqQVIoMSkqKiBwcm9jZXNzLCBwcm92aWRlZCB0aGUgc2VyaWVzIGlzIHN0YXRpb25hcnkuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpUaGUgc2FtZSB0aHJlZSB0ZXN0cyBhcmUgYXBwbGllZCAoQURGIGFuZCBQUDogJEhfMCQgdW5pdCByb290OyBLUFNTOiAkSF8wJCBsZXZlbC1zdGF0aW9uYXJ5KS4KCmBgYHtyfQphZGYudGVzdChkZiRZMDIpCmBgYAoKQURGOiBEaWNrZXnigJNGdWxsZXIgJD0gLTIwLjEwNiQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gdGhlIHVuaXQgcm9vdCBpcyByZWplY3RlZC4KCmBgYHtyfQpwcC50ZXN0KGRmJFkwMikKYGBgCgpQUDogJFooXGFscGhhKSA9IC0yOTMwLjYkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQgYWdhaW4uCgpgYGB7cn0Ka3Bzcy50ZXN0KGRmJFkwMikKYGBgCgpLUFNTOiBzdGF0aXN0aWMgJD0gMC4xOTA5MiQsIHAtdmFsdWUgJFxnZSAwLjEwJCwgc28gbGV2ZWwgc3RhdGlvbmFyaXR5IGlzIG5vdCByZWplY3RlZC4gQWxsIHRlc3RzIGFncmVlIHRoYXQgKipgWTAyYCBpcyBzdGF0aW9uYXJ5KiosIHNvICRkID0gMCQgYW5kIG5vIGRpZmZlcmVuY2luZyBpcyBuZWVkZWQuIEJlY2F1c2UgdGhlIHNlcmllcyBmbHVjdHVhdGVzIGFyb3VuZCBhYm91dCAyMCwgdGhlIHRlbnRhdGl2ZSBtb2RlbCBpcyAqKkFSSU1BKDEsMCwwKSB3aXRoIGEgbm9uLXplcm8gbWVhbioqLgoKIyMjIyBQYXJhbWV0ZXIgRXN0aW1hdGlvbgoKYGBge3J9CnRzXzAyIDwtIHRzKGRhdGE9ZGYkWTAyKQptMDIgPC0gQXJpbWEodHNfMDIsIG9yZGVyID0gYygxLDAsMCkpCnN1bW1hcnkobTAyKQpgYGAKClRoZSBlc3RpbWF0ZXMgYXJlICRcaGF0XHBoaV8xID0gMC43MDc2JCBhbmQgJFxoYXRcbXUgPSAxOS45NTckLiBUaGUgdmFsdWUgbGFiZWxsZWQgYG1lYW5gIChgaW50ZXJjZXB0YCBpbiBgY29lZnRlc3QoKWApIGlzIHRoZSBwcm9jZXNzIG1lYW4sIG5vdCB0aGUgcmVncmVzc2lvbiBjb25zdGFudC4gVGhlIHJlc2lkdWFsIHZhcmlhbmNlIGlzICRcaGF0XHNpZ21hX2FeMiA9IDAuOTg4OCQsIHdpdGggQUlDICQ9JCBBSUNjICQ9IDI4MjcwLjUkIGFuZCBCSUMgJD0gMjgyOTIuMTMkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wMikKYGBgCgpCb3RoIHBhcmFtZXRlcnMgYXJlIGhpZ2hseSBzaWduaWZpY2FudCAoJHogPSAxMDAuMTkkIGZvciAkXHBoaV8xJCBhbmQgJHogPSA1ODcuMDkkIGZvciAkXG11JCkuCgojIyMjIEZpdHRlZCBNb2RlbCBFcXVhdGlvbgoKVGhlIGdlbmVyYWwgZm9ybSBvZiBBUklNQSgxLDAsMCkgd2l0aCBtZWFuICRcbXUkIGlzCgokJAooMS1ccGhpXzFCKVwsKFlfdC1cbXUpID0gYV90IC4KJCQKCldpdGggdGhlIGVzdGltYXRlcywKCiQkCigxIC0gMC43MDc2QilcLChZX3QgLSAxOS45NTcwKSA9IGFfdCAsCiQkCgp3aGljaCBleHBhbmRzIHRvCgokJApZX3QgPSA1LjgzNTkgKyAwLjcwNzZcLFlfe3QtMX0gKyBhX3QsXHFxdWFkIGFfdCBcc2ltIFxtYXRoY2Fse059KDAsXCAwLjk4ODgpLAokJAoKd2hlcmUgJDUuODM1OSA9IDE5Ljk1NzAgXHRpbWVzICgxIC0gMC43MDc2KSQuIFNpbmNlICR8XGhhdFxwaGlfMXwgPCAxJCwgdGhlIGZpdHRlZCBtb2RlbCBpcyBzdGF0aW9uYXJ5OiB0aGUgZWZmZWN0IG9mIGEgc2hvY2sgc2hyaW5rcyBieSBhIGZhY3RvciBvZiAkMC43MDc2JCBldmVyeSBwZXJpb2QuCgojIyMjIENvbXBhcmlzb24gd2l0aCBhdXRvLmFyaW1hKCkKCmBgYHtyfQphYTAyIDwtIGF1dG8uYXJpbWEodHNfMDIsIG1heC5wID0gMTAsIG1heC5xID0gMTApCmFhMDIKYGBgCgpgYXV0by5hcmltYSgpYCBzZWxlY3RzIGV4YWN0bHkgdGhlIHNhbWUgbW9kZWwsIEFSSU1BKDEsMCwwKSB3aXRoIGEgbm9uLXplcm8gbWVhbiwgd2l0aCBpZGVudGljYWwgZXN0aW1hdGVzIGFuZCBpbmZvcm1hdGlvbiBjcml0ZXJpYS4gTWFudWFsIGFuZCBhdXRvbWF0aWMgaWRlbnRpZmljYXRpb24gYWdyZWUuCgojIyMjIERpYWdub3N0aWMgQ2hlY2tpbmcKCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhtMDIpCmBgYAoKTGp1bmfigJNCb3g6ICRRXiogPSAzLjUwMzEkIHdpdGggOSBkZWdyZWVzIG9mIGZyZWVkb20sIHAtdmFsdWUgJD0gMC45NDEkOiB0aGUgcmVzaWR1YWxzIGFyZSB3aGl0ZSBub2lzZS4gVGhlIHJlc2lkdWFsIEFDRiBsaWVzIHdpdGhpbiB0aGUgYmFuZHMgYW5kIHRoZSBoaXN0b2dyYW0gaXMgc3ltbWV0cmljIGFuZCBiZWxsLXNoYXBlZC4KCmBgYHtyfQpyZXNfMDIgPC0gbTAyJHJlc2lkdWFscwpqYXJxdWUuYmVyYS50ZXN0KHJlc18wMikKYGBgCgpKYXJxdWXigJNCZXJhOiAkWF4yID0gMS45NTg1JCwgcC12YWx1ZSAkPSAwLjM3NTYkOiBub3JtYWxpdHkgaXMgbm90IHJlamVjdGVkLgoKKipDb25jbHVzaW9uLioqIEFSSU1BKDEsMCwwKSB3aXRoIGEgbm9uLXplcm8gbWVhbiBpcyBhZGVxdWF0ZSBmb3IgYFkwMmAuCgoKIyMjIE1vZGVsIDAzCgojIyMjIEFDRiAmIFBBQ0YgU2VyaWVzIDAzCgpgYGB7cn0KcF9hY2YgIDwtIGdnQWNmKGRmJFkwMywgbGFnLm1heCA9IDM2KSArIGdndGl0bGUoIkFDRiBZMDMiKSAKcF9wYWNmIDwtIGdnUGFjZihkZiRZMDMsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIFkwMyIpIAoKcF9hY2YgfCBwX3BhY2YKYGBgCgpUaGUgQUNGIGhhcyBzaWduaWZpY2FudCBzcGlrZXMgYXQgbGFncyAxIHRvIDggKHBvc2l0aXZlIGF0IGxhZ3MgMSwgNyBhbmQgOCwgbmVnYXRpdmUgYXQgbGFncyAyIHRvIDYpIGFuZCBjdXRzIG9mZiBzaGFycGx5IGFmdGVyIGxhZyA4LiBUaGUgUEFDRiBkZWNheXMgc2xvd2x5IGluIGFuIGlycmVndWxhciwgb3NjaWxsYXRpbmcgd2F5IHRoYXQgaXMgc3RpbGwgdmlzaWJsZSBhcm91bmQgbGFnIDIwLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIG9mIGFuICoqTUEoOCkqKiBwcm9jZXNzLCBwcm92aWRlZCB0aGUgc2VyaWVzIGlzIHN0YXRpb25hcnkuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpgYGB7cn0KYWRmLnRlc3QoZGYkWTAzKQpgYGAKCkFERjogRGlja2V54oCTRnVsbGVyICQ9IC0yNi4wODUkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQuCgpgYGB7cn0KcHAudGVzdChkZiRZMDMpCmBgYAoKUFA6ICRaKFxhbHBoYSkgPSAtMzE5MC45JCwgcC12YWx1ZSAkXGxlIDAuMDEkLCBzbyB0aGUgdW5pdCByb290IGlzIHJlamVjdGVkLgoKYGBge3J9Cmtwc3MudGVzdChkZiRZMDMpCmBgYAoKS1BTUzogc3RhdGlzdGljICQ9IDAuMDc4ODM5JCwgcC12YWx1ZSAkXGdlIDAuMTAkLCBzbyBsZXZlbCBzdGF0aW9uYXJpdHkgaXMgbm90IHJlamVjdGVkLiAqKmBZMDNgIGlzIHN0YXRpb25hcnkqKiAoJGQgPSAwJCksIGFuZCB0aGUgdGVudGF0aXZlIG1vZGVsIGlzICoqQVJJTUEoMCwwLDgpIHdpdGggYSBub24temVybyBtZWFuKiouCgojIyMjIFBhcmFtZXRlciBFc3RpbWF0aW9uCgpgYGB7cn0KdHNfMDMgPC0gdHMoZGF0YT1kZiRZMDMpCm0wMyA8LSBBcmltYSh0c18wMywgb3JkZXIgPSBjKDAsMCw4KSkKc3VtbWFyeShtMDMpCmBgYAoKVGhlIGVpZ2h0IE1BIGNvZWZmaWNpZW50cyBhbmQgdGhlIG1lYW4gKCRcaGF0XG11ID0gNzQuOTk1MCQpIGFyZSBlc3RpbWF0ZWQgcHJlY2lzZWx5LiBUaGUgcmVzaWR1YWwgdmFyaWFuY2UgaXMgJFxoYXRcc2lnbWFfYV4yID0gMy45MzQkLCB3aXRoIEFJQyAkPSA0MjA4OS42NCQsIEFJQ2MgJD0gNDIwODkuNjYkIGFuZCBCSUMgJD0gNDIxNjEuNzQkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wMykKYGBgCgpBbGwgY29lZmZpY2llbnRzIGFyZSBoaWdobHkgc2lnbmlmaWNhbnQgKCR8enwgXGdlIDE5LjkkKS4KCiMjIyMgRml0dGVkIE1vZGVsIEVxdWF0aW9uCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIEFSSU1BKDAsMCw4KSB3aXRoIG1lYW4gJFxtdSQgaXMKCiQkCllfdC1cbXUgPSAoMStcdGhldGFfMUIrXHRoZXRhXzJCXjIrXGNkb3RzK1x0aGV0YV84Ql44KVwsYV90IC4KJCQKCldpdGggdGhlIGVzdGltYXRlcywKCiQkClxiZWdpbnthbGlnbmVkfQpZX3QgLSA3NC45OTUwID17fSYgKDEgKyAwLjUwMjZCIC0gMC4zODgyQl4yIC0gMC4zMDQ0Ql4zIC0gMC4zMDU1Ql40IFxcCiYtIDAuMjAzMUJeNSAtIDAuNDA1N0JeNiArIDAuMjAyMkJeNyArIDAuMzk2MUJeOClcLGFfdCAsClxlbmR7YWxpZ25lZH0KJCQKCnRoYXQgaXMsIGV4cGxpY2l0bHksCgokJApcYmVnaW57YWxpZ25lZH0KWV90ID17fSYgNzQuOTk1MCArIGFfdCArIDAuNTAyNlwsYV97dC0xfSAtIDAuMzg4MlwsYV97dC0yfSAtIDAuMzA0NFwsYV97dC0zfSAtIDAuMzA1NVwsYV97dC00fSBcXAomLSAwLjIwMzFcLGFfe3QtNX0gLSAwLjQwNTdcLGFfe3QtNn0gKyAwLjIwMjJcLGFfe3QtN30gKyAwLjM5NjFcLGFfe3QtOH0sClxxcXVhZCBhX3QgXHNpbSBcbWF0aGNhbHtOfSgwLFwgMy45MzQpLgpcZW5ke2FsaWduZWR9CiQkCgpGb3IgYSBwdXJlIE1BIG1vZGVsIHRoZSBjb25zdGFudCBlcXVhbHMgdGhlIG1lYW4sIGFuZCBvYnNlcnZhdGlvbnMgbW9yZSB0aGFuIGVpZ2h0IHBlcmlvZHMgYXBhcnQgYXJlIHVuY29ycmVsYXRlZC4KCiMjIyMgQ29tcGFyaXNvbiB3aXRoIGF1dG8uYXJpbWEoKQoKYGBge3J9CmFhMDMgPC0gYXV0by5hcmltYSh0c18wMywgbWF4LnAgPSAxMCwgbWF4LnEgPSAxMCkKYWEwMwpgYGAKCmBhdXRvLmFyaW1hKClgIHNlbGVjdHMgKipBUklNQSgxMCwwLDIpIHdpdGggYSBub24temVybyBtZWFuKiouIFRoaXMgbW9kZWwgZml0cyBjbGVhcmx5IHdvcnNlOiAkXGhhdFxzaWdtYV9hXjIgPSA0LjA5NyQgaW5zdGVhZCBvZiAkMy45MzQkLCBBSUNjICQ9IDQyNDk5LjA2JCAoJDQwOS40JCB1bml0cyBsYXJnZXIgdGhhbiBmb3IgTUEoOCkpIGFuZCBCSUMgJD0gNDI1OTkuOTYkICgkNDM4LjIkIHVuaXRzIGxhcmdlcikuIEFuIE1BKDgpIHByb2Nlc3MgY2FuIGJlIHdyaXR0ZW4gZXhhY3RseSBvbmx5IGFzIGFuIEFSIG1vZGVsIG9mIGluZmluaXRlIG9yZGVyOyB3aXRoIGF0IG1vc3QgdGVuIEFSIHRlcm1zIHBsdXMgdHdvIE1BIHRlcm1zLCB0aGUgYXV0b21hdGljIG1vZGVsIGlzIGp1c3QgYSByb3VnaCBhcHByb3hpbWF0aW9uIG9mIGl0LCBhbmQgdGhlIHN0ZXB3aXNlIHNlYXJjaCBuZXZlciByZWFjaGVkIHRoZSBwdXJlIE1BKDgpIHN0cnVjdHVyZS4gVGhlIG1hbnVhbCBNQSg4KSBpcyBmYXIgYmV0dGVyLgoKIyMjIyBEaWFnbm9zdGljIENoZWNraW5nCgpgYGB7cn0KY2hlY2tyZXNpZHVhbHMobTAzKQpgYGAKCkxqdW5n4oCTQm94OiAkUV4qID0gMy4xMzk5JCB3aXRoIDMgZGVncmVlcyBvZiBmcmVlZG9tLCBwLXZhbHVlICQ9IDAuMzcwNiQ6IG5vIHJlbWFpbmluZyBhdXRvY29ycmVsYXRpb24uCgpgYGB7cn0KcmVzXzAzIDwtIG0wMyRyZXNpZHVhbHMKamFycXVlLmJlcmEudGVzdChyZXNfMDMpCmBgYAoKSmFycXVl4oCTQmVyYTogJFheMiA9IDAuMjI3NTEkLCBwLXZhbHVlICQ9IDAuODkyNSQ6IG5vcm1hbGl0eSBpcyBub3QgcmVqZWN0ZWQuCgoqKkNvbmNsdXNpb24uKiogQVJJTUEoMCwwLDgpIHdpdGggYSBub24temVybyBtZWFuIGlzIGFkZXF1YXRlIGZvciBgWTAzYC4KCgojIyMgTW9kZWwgMDQKCiMjIyMgQUNGICYgUEFDRiBTZXJpZXMgMDQKCmBgYHtyfQpwX2FjZiAgPC0gZ2dBY2YoZGYkWTA0LCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiQUNGIFkwNCIpIApwX3BhY2YgPC0gZ2dQYWNmKGRmJFkwNCwgbGFnLm1heCA9IDM2KSArIGdndGl0bGUoIlBBQ0YgWTA0IikgCgpwX2FjZiB8IHBfcGFjZgpgYGAKCk9ubHkgdGhlIGZpcnN0IHR3byBhdXRvY29ycmVsYXRpb25zIGFyZSBzaWduaWZpY2FudCAoYWJvdXQgMC42NiBhdCBsYWcgMSBhbmQgMC4xOCBhdCBsYWcgMiksIHNvIHRoZSBBQ0YgY3V0cyBvZmYgYWZ0ZXIgbGFnIDIuIFRoZSBQQUNGIGFsdGVybmF0ZXMgaW4gc2lnbiAocG9zaXRpdmUsIG5lZ2F0aXZlLCBwb3NpdGl2ZSwg4oCmKSBhbmQgZGllcyBkb3duIHdpdGhpbiBhYm91dCBlaWdodCBsYWdzLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIG9mIGFuICoqTUEoMikqKiBwcm9jZXNzLgoKIyMjIyBTdGF0aW9uYXJpdHkgVGVzdAoKYGBge3J9CmFkZi50ZXN0KGRmJFkwNCkKYGBgCgpBREY6IERpY2tleeKAk0Z1bGxlciAkPSAtMjAuMTE2JCwgcC12YWx1ZSAkXGxlIDAuMDEkLCBzbyB0aGUgdW5pdCByb290IGlzIHJlamVjdGVkLgoKYGBge3J9CnBwLnRlc3QoZGYkWTA0KQpgYGAKClBQOiAkWihcYWxwaGEpID0gLTI1MDIuMSQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gdGhlIHVuaXQgcm9vdCBpcyByZWplY3RlZC4KCmBgYHtyfQprcHNzLnRlc3QoZGYkWTA0KQpgYGAKCktQU1M6IHN0YXRpc3RpYyAkPSAwLjI1MzMkLCBwLXZhbHVlICRcZ2UgMC4xMCQsIHNvIGxldmVsIHN0YXRpb25hcml0eSBpcyBub3QgcmVqZWN0ZWQuICoqYFkwNGAgaXMgc3RhdGlvbmFyeSoqICgkZCA9IDAkKSwgYW5kIHRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgKipBUklNQSgwLDAsMikgd2l0aCBhIG5vbi16ZXJvIG1lYW4qKi4KCiMjIyMgUGFyYW1ldGVyIEVzdGltYXRpb24KCmBgYHtyfQp0c18wNCA8LSB0cyhkYXRhPWRmJFkwNCkKbTA0IDwtIEFyaW1hKHRzXzA0LCBvcmRlciA9IGMoMCwwLDIpKQpzdW1tYXJ5KG0wNCkKYGBgCgpUaGUgZXN0aW1hdGVzIGFyZSAkXGhhdFx0aGV0YV8xID0gMS4yMDY0JCwgJFxoYXRcdGhldGFfMiA9IDAuNTAxOCQgYW5kICRcaGF0XG11ID0gMzAuMDIzNSQsIHdpdGggJFxoYXRcc2lnbWFfYV4yID0gMi4yNTkkLCBBSUMgJD0kIEFJQ2MgJD0gMzY1MzQuNjckIGFuZCBCSUMgJD0gMzY1NjMuNTEkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wNCkKYGBgCgpBbGwgcGFyYW1ldGVycyBhcmUgaGlnaGx5IHNpZ25pZmljYW50ICgkeiA9IDEzOS42OCQsICQ1Ny41MSQgYW5kICQ3MzcuNzkkKS4KCiMjIyMgRml0dGVkIE1vZGVsIEVxdWF0aW9uCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIEFSSU1BKDAsMCwyKSB3aXRoIG1lYW4gJFxtdSQgaXMKCiQkCllfdC1cbXUgPSAoMStcdGhldGFfMUIrXHRoZXRhXzJCXjIpXCxhX3QgLgokJAoKV2l0aCB0aGUgZXN0aW1hdGVzLAoKJCQKWV90IC0gMzAuMDIzNSA9ICgxICsgMS4yMDY0QiArIDAuNTAxOEJeMilcLGFfdCAsCiQkCgp0aGF0IGlzLCBleHBsaWNpdGx5LAoKJCQKWV90ID0gMzAuMDIzNSArIGFfdCArIDEuMjA2NFwsYV97dC0xfSArIDAuNTAxOFwsYV97dC0yfSxccXF1YWQgYV90IFxzaW0gXG1hdGhjYWx7Tn0oMCxcIDIuMjU5KS4KJCQKCiMjIyMgQ29tcGFyaXNvbiB3aXRoIGF1dG8uYXJpbWEoKQoKYGBge3J9CmFhMDQgPC0gYXV0by5hcmltYSh0c18wNCwgbWF4LnAgPSAxMCwgbWF4LnEgPSAxMCkKYWEwNApgYGAKCmBhdXRvLmFyaW1hKClgIHNlbGVjdHMgdGhlIHNhbWUgbW9kZWwsIEFSSU1BKDAsMCwyKSB3aXRoIGEgbm9uLXplcm8gbWVhbiwgd2l0aCBpZGVudGljYWwgZXN0aW1hdGVzLiBCb3RoIGFwcHJvYWNoZXMgYWdyZWUuCgojIyMjIERpYWdub3N0aWMgQ2hlY2tpbmcKCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhtMDQpCmBgYAoKTGp1bmfigJNCb3g6ICRRXiogPSAyLjk2NDEkIHdpdGggOCBkZWdyZWVzIG9mIGZyZWVkb20sIHAtdmFsdWUgJD0gMC45MzY2JDogdGhlIHJlc2lkdWFscyBhcmUgd2hpdGUgbm9pc2UuCgpgYGB7cn0KcmVzXzA0IDwtIG0wNCRyZXNpZHVhbHMKamFycXVlLmJlcmEudGVzdChyZXNfMDQpCmBgYAoKSmFycXVl4oCTQmVyYTogJFheMiA9IDUuOTUyOSQsIHAtdmFsdWUgJD0gMC4wNTA5NyQsIHNvIG5vcm1hbGl0eSBpcyAobmFycm93bHkpIG5vdCByZWplY3RlZCBhdCB0aGUgNSUgbGV2ZWwuIFdpdGggJG4gPSAxMHssfTAwMCQgdGhlIEphcnF1ZeKAk0JlcmEgdGVzdCByZWFjdHMgdG8gdmVyeSBzbWFsbCBkZXBhcnR1cmVzOyB0aGUgaGlzdG9ncmFtIGlzIGJlbGwtc2hhcGVkLCBzbyB0aGUgcmVzaWR1YWxzIGNhbiBiZSB0cmVhdGVkIGFzIG5vcm1hbC4KCioqQ29uY2x1c2lvbi4qKiBBUklNQSgwLDAsMikgd2l0aCBhIG5vbi16ZXJvIG1lYW4gaXMgYWRlcXVhdGUgZm9yIGBZMDRgLgoKCiMjIyBNb2RlbCAwNQoKIyMjIyBBQ0YgJiBQQUNGIFNlcmllcyAwNQoKYGBge3J9CnBfYWNmICA8LSBnZ0FjZihkZiRZMDUsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJBQ0YgWTA1IikgCnBfcGFjZiA8LSBnZ1BhY2YoZGYkWTA1LCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiUEFDRiBZMDUiKSAKCnBfYWNmIHwgcF9wYWNmCmBgYAoKVGhlIEFDRiBkZWNheXMgc2xvd2x5IGluIGEgd2F2ZS1saWtlIHBhdHRlcm46IGxhcmdlIHBvc2l0aXZlIHZhbHVlcyB1cCB0byBhYm91dCBsYWcgOCBhcmUgZm9sbG93ZWQgYnkgc21hbGwgbmVnYXRpdmUgdmFsdWVzIGJldHdlZW4gbGFncyAxMCBhbmQgMjAuIFRoZSBQQUNGIGhhcyBzaXggc2lnbmlmaWNhbnQgc3Bpa2VzIChsYWdzIDEgdG8gNiwgdGhlIGxhc3QgdHdvIG5lZ2F0aXZlKSBhbmQgY3V0cyBvZmYgYWZ0ZXIgbGFnIDYuIFRoaXMgaXMgdGhlIHBhdHRlcm4gb2YgYW4gKipBUig2KSoqIHByb2Nlc3MuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpgYGB7cn0KYWRmLnRlc3QoZGYkWTA1KQpgYGAKCkFERjogRGlja2V54oCTRnVsbGVyICQ9IC0yMC4wMDkkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQuCgpgYGB7cn0KcHAudGVzdChkZiRZMDUpCmBgYAoKUFA6ICRaKFxhbHBoYSkgPSAtOTA1MSQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gdGhlIHVuaXQgcm9vdCBpcyByZWplY3RlZC4KCmBgYHtyfQprcHNzLnRlc3QoZGYkWTA1KQpgYGAKCktQU1M6IHN0YXRpc3RpYyAkPSAwLjE4MjYxJCwgcC12YWx1ZSAkXGdlIDAuMTAkLCBzbyBsZXZlbCBzdGF0aW9uYXJpdHkgaXMgbm90IHJlamVjdGVkLiAqKmBZMDVgIGlzIHN0YXRpb25hcnkqKiAoJGQgPSAwJCksIGFuZCB0aGUgdGVudGF0aXZlIG1vZGVsIGlzICoqQVJJTUEoNiwwLDApIHdpdGggYSBub24temVybyBtZWFuKiouCgojIyMjIFBhcmFtZXRlciBFc3RpbWF0aW9uCgpgYGB7cn0KdHNfMDUgPC0gdHMoZGF0YT1kZiRZMDUpCm0wNSA8LSBBcmltYSh0c18wNSwgb3JkZXIgPSBjKDYsMCwwKSkKc3VtbWFyeShtMDUpCmBgYAoKVGhlIHNpeCBBUiBjb2VmZmljaWVudHMgYW5kIHRoZSBtZWFuICgkXGhhdFxtdSA9IDk5LjkyODgkKSBhcmUgZXN0aW1hdGVkIHdpdGggc3RhbmRhcmQgZXJyb3JzIGJlbG93IDAuMDEgKDAuMDk2NyBmb3IgdGhlIG1lYW4pLiBUaGUgcmVzaWR1YWwgdmFyaWFuY2UgaXMgJFxoYXRcc2lnbWFfYV4yID0gOS4wNjgkLCB3aXRoIEFJQyAkPSA1MDQzNy40MCQsIEFJQ2MgJD0gNTA0MzcuNDEkIGFuZCBCSUMgJD0gNTA0OTUuMDgkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wNSkKYGBgCgpBbGwgY29lZmZpY2llbnRzIGFyZSBzaWduaWZpY2FudDsgdGhlIHNtYWxsZXN0IHRlc3Qgc3RhdGlzdGljIGlzICR6ID0gMTAuMTEkIGZvciAkXHBoaV8xJC4KCiMjIyMgRml0dGVkIE1vZGVsIEVxdWF0aW9uCgpUaGUgZ2VuZXJhbCBmb3JtIG9mIEFSSU1BKDYsMCwwKSB3aXRoIG1lYW4gJFxtdSQgaXMKCiQkCigxLVxwaGlfMUItXHBoaV8yQl4yLVxjZG90cy1ccGhpXzZCXjYpXCwoWV90LVxtdSkgPSBhX3QgLgokJAoKV2l0aCB0aGUgZXN0aW1hdGVzLAoKJCQKKDEgLSAwLjA5NjZCIC0gMC4zOTMxQl4yIC0gMC4zOTg3Ql4zIC0gMC4zOTMxQl40ICsgMC4yOTk3Ql41ICsgMC4yOTMxQl42KVwsKFlfdCAtIDk5LjkyODgpID0gYV90ICwKJCQKCndoaWNoIGV4cGFuZHMgdG8KCiQkClxiZWdpbnthbGlnbmVkfQpZX3QgPXt9JiAzMS4wOTYwICsgMC4wOTY2XCxZX3t0LTF9ICsgMC4zOTMxXCxZX3t0LTJ9ICsgMC4zOTg3XCxZX3t0LTN9ICsgMC4zOTMxXCxZX3t0LTR9IFxcCiYtIDAuMjk5N1wsWV97dC01fSAtIDAuMjkzMVwsWV97dC02fSArIGFfdCwKXHFxdWFkIGFfdCBcc2ltIFxtYXRoY2Fse059KDAsXCA5LjA2OCksClxlbmR7YWxpZ25lZH0KJCQKCndoZXJlICQzMS4wOTYwID0gOTkuOTI4OCBcdGltZXMgKDEgLSAwLjY4ODgpJCBhbmQgJDAuNjg4OCQgaXMgdGhlIHN1bSBvZiB0aGUgc2l4IEFSIGNvZWZmaWNpZW50cy4KCiMjIyMgQ29tcGFyaXNvbiB3aXRoIGF1dG8uYXJpbWEoKQoKYGBge3J9CmFhMDUgPC0gYXV0by5hcmltYSh0c18wNSwgbWF4LnAgPSAxMCwgbWF4LnEgPSAxMCkKYWEwNQpgYGAKCmBhdXRvLmFyaW1hKClgIHNlbGVjdHMgKipBUklNQSg3LDAsMCkqKiwgaS5lLiBvbmUgbW9yZSBBUiB0ZXJtLiBUaGUgZXh0cmEgY29lZmZpY2llbnQgaXMgdGlueSAoJFxoYXRccGhpXzcgPSAwLjAxODUkIHdpdGggc3RhbmRhcmQgZXJyb3IgJDAuMDEwMCQpLCBhbmQgdGhlIGdhaW4gaXMgbmVnbGlnaWJsZTogQUlDYyBpcyBvbmx5ICQxLjQxJCB1bml0cyBsb3dlciAoJDUwNDM2LjAwJCB2cyAkNTA0MzcuNDEkKSwgd2hpbGUgQklDIGlzICQ1LjgwJCB1bml0cyBoaWdoZXIgKCQ1MDUwMC44OCQgdnMgJDUwNDk1LjA4JCkuCgpgYGB7cn0KY29lZnRlc3QoYWEwNSkKYGBgCgpUaGUgei10ZXN0IGNvbmZpcm1zIHRoYXQgYGFyN2AgaXMgbm90IHNpZ25pZmljYW50IGF0IHRoZSA1JSBsZXZlbCAoJHogXGFwcHJveCAxLjg1JCkuIEFuIEFJQ2MgZGlmZmVyZW5jZSBiZWxvdyAyIG1lYW5zIHRoZSB0d28gbW9kZWxzIGFyZSBwcmFjdGljYWxseSBlcXVpdmFsZW50LCBhbmQgQklDLCB3aGljaCBwZW5hbGlzZXMgZWFjaCBwYXJhbWV0ZXIgYnkgJFxsbiBuIFxhcHByb3ggOS4yMSQgaW5zdGVhZCBvZiAyLCBwcmVmZXJzIEFSKDYpLiBCeSB0aGUgcHJpbmNpcGxlIG9mIHBhcnNpbW9ueSwgdGhlIG1hbnVhbCBBUig2KSBpcyBwcmVmZXJyZWQuCgojIyMjIERpYWdub3N0aWMgQ2hlY2tpbmcKCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhtMDUpCmBgYAoKTGp1bmfigJNCb3g6ICRRXiogPSA0LjA0NjYkIHdpdGggNCBkZWdyZWVzIG9mIGZyZWVkb20sIHAtdmFsdWUgJD0gMC4zOTk3JDogbm8gcmVtYWluaW5nIGF1dG9jb3JyZWxhdGlvbi4KCmBgYHtyfQpyZXNfMDUgPC0gbTA1JHJlc2lkdWFscwpqYXJxdWUuYmVyYS50ZXN0KHJlc18wNSkKYGBgCgpKYXJxdWXigJNCZXJhOiAkWF4yID0gMC42Mjk3MiQsIHAtdmFsdWUgJD0gMC43Mjk5JDogbm9ybWFsaXR5IGlzIG5vdCByZWplY3RlZC4KCioqQ29uY2x1c2lvbi4qKiBBUklNQSg2LDAsMCkgd2l0aCBhIG5vbi16ZXJvIG1lYW4gaXMgYWRlcXVhdGUgZm9yIGBZMDVgLgoKCiMjIyBNb2RlbCAwNgoKIyMjIyBBQ0YgJiBQQUNGIFNlcmllcyAwNgoKYGBge3J9CnBfYWNmICA8LSBnZ0FjZihkZiRZMDYsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJBQ0YgWTA2IikgCnBfcGFjZiA8LSBnZ1BhY2YoZGYkWTA2LCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiUEFDRiBZMDYiKSAKCnBfYWNmIHwgcF9wYWNmCmBgYAoKVGhlIEFDRiBoYXMgYSBzaW5nbGUgc2lnbmlmaWNhbnQsIG5lZ2F0aXZlIHNwaWtlIGF0IGxhZyAxIChhYm91dCAkLTAuNDMkKSBhbmQgaXMgaW5zaWduaWZpY2FudCBhZnRlcndhcmRzLiBUaGUgUEFDRiBpcyBuZWdhdGl2ZSBhdCB0aGUgZmlyc3QgbGFncyBhbmQgZGVjYXlzIGV4cG9uZW50aWFsbHkgdG93YXJkcyB6ZXJvLiBUaGlzIGlzIHRoZSBwYXR0ZXJuIG9mIGFuICoqTUEoMSkqKiBwcm9jZXNzIHdpdGggYSBuZWdhdGl2ZSBjb2VmZmljaWVudC4KCiMjIyMgU3RhdGlvbmFyaXR5IFRlc3QKCmBgYHtyfQphZGYudGVzdChkZiRZMDYpCmBgYAoKQURGOiBEaWNrZXnigJNGdWxsZXIgJD0gLTIyLjcyMiQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gdGhlIHVuaXQgcm9vdCBpcyByZWplY3RlZC4KCmBgYHtyfQpwcC50ZXN0KGRmJFkwNikKYGBgCgpQUDogJFooXGFscGhhKSA9IC0xMTg4MCQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gdGhlIHVuaXQgcm9vdCBpcyByZWplY3RlZC4KCmBgYHtyfQprcHNzLnRlc3QoZGYkWTA2KQpgYGAKCktQU1M6IHN0YXRpc3RpYyAkPSAwLjA0NjA1NSQsIHAtdmFsdWUgJFxnZSAwLjEwJCwgc28gbGV2ZWwgc3RhdGlvbmFyaXR5IGlzIG5vdCByZWplY3RlZC4gKipgWTA2YCBpcyBzdGF0aW9uYXJ5KiogKCRkID0gMCQpLCBhbmQgdGhlIHRlbnRhdGl2ZSBtb2RlbCBpcyAqKkFSSU1BKDAsMCwxKSB3aXRoIGEgbm9uLXplcm8gbWVhbioqLgoKIyMjIyBQYXJhbWV0ZXIgRXN0aW1hdGlvbgoKYGBge3J9CnRzXzA2IDwtIHRzKGRhdGE9ZGYkWTA2KQptMDYgPC0gQXJpbWEodHNfMDYsIG9yZGVyID0gYygwLDAsMSkpCnN1bW1hcnkobTA2KQpgYGAKClRoZSBlc3RpbWF0ZXMgYXJlICRcaGF0XHRoZXRhXzEgPSAtMC41OTM2JCBhbmQgJFxoYXRcbXUgPSA5Ljk5OTkkLCB3aXRoICRcaGF0XHNpZ21hX2FeMiA9IDEuMDIzJCwgQUlDICQ9JCBBSUNjICQ9IDI4NjEyLjQzJCBhbmQgQklDICQ9IDI4NjM0LjA2JC4gVGhlIGltcGxpZWQgbGFnLTEgYXV0b2NvcnJlbGF0aW9uLCAkXGhhdFx0aGV0YV8xLygxK1xoYXRcdGhldGFfMV4yKSA9IC0wLjQzOSQsIG1hdGNoZXMgdGhlIHNwaWtlIHNlZW4gaW4gdGhlIEFDRi4KCmBgYHtyfQpjb2VmdGVzdChtMDYpCmBgYAoKQm90aCBwYXJhbWV0ZXJzIGFyZSBoaWdobHkgc2lnbmlmaWNhbnQgKCR6ID0gLTcyLjkwJCBhbmQgJHogPSAyNDMyLjU4JCkuCgojIyMjIEZpdHRlZCBNb2RlbCBFcXVhdGlvbgoKVGhlIGdlbmVyYWwgZm9ybSBvZiBBUklNQSgwLDAsMSkgd2l0aCBtZWFuICRcbXUkIGlzCgokJApZX3QtXG11ID0gKDErXHRoZXRhXzFCKVwsYV90IC4KJCQKCldpdGggdGhlIGVzdGltYXRlcywKCiQkCllfdCAtIDkuOTk5OSA9ICgxIC0gMC41OTM2QilcLGFfdCAsCiQkCgp0aGF0IGlzLCBleHBsaWNpdGx5LAoKJCQKWV90ID0gOS45OTk5ICsgYV90IC0gMC41OTM2XCxhX3t0LTF9LFxxcXVhZCBhX3QgXHNpbSBcbWF0aGNhbHtOfSgwLFwgMS4wMjMpLgokJAoKU2luY2UgJHxcaGF0XHRoZXRhXzF8IDwgMSQsIHRoZSBtb2RlbCBpcyBpbnZlcnRpYmxlLgoKIyMjIyBDb21wYXJpc29uIHdpdGggYXV0by5hcmltYSgpCgpgYGB7cn0KYWEwNiA8LSBhdXRvLmFyaW1hKHRzXzA2LCBtYXgucCA9IDEwLCBtYXgucSA9IDEwKQphYTA2CmBgYAoKYGF1dG8uYXJpbWEoKWAgc2VsZWN0cyAqKkFSSU1BKDEsMCwxKSB3aXRoIGEgbm9uLXplcm8gbWVhbioqLCBhZGRpbmcgYW4gQVIgdGVybSB3aXRoICRcaGF0XHBoaV8xID0gMC4wMTI1JCAoc3RhbmRhcmQgZXJyb3IgJDAuMDE3MCQpLgoKYGBge3J9CmNvZWZ0ZXN0KGFhMDYpCmBgYAoKVGhlIGV4dHJhIEFSIGNvZWZmaWNpZW50IGlzIGNsZWFybHkgbm90IHNpZ25pZmljYW50ICgkeiBcYXBwcm94IDAuNzQkKS4gTW9yZW92ZXIsIHRoZSBleGFjdCBBSUNjIG9mIEFSSU1BKDEsMCwxKSAoJDI4NjEzLjg4JCkgaXMgJDEuNDUkIHVuaXRzICpoaWdoZXIqIHRoYW4gdGhhdCBvZiBNQSgxKSwgYW5kIGl0cyBCSUMgaXMgJDguNjYkIHVuaXRzIGhpZ2hlciwgc28gYGF1dG8uYXJpbWEoKWAgcmV0dXJuZWQgYSBtb2RlbCB0aGF0IGlzIHdvcnNlIGJ5IGl0cyBvd24gY3JpdGVyaW9uLiBUaGUgcmVhc29uIGlzIHRoYXQsIGZvciBsb25nIHNlcmllcywgYGF1dG8uYXJpbWEoKWAgcmFua3MgdGhlIGNhbmRpZGF0ZSBtb2RlbHMgd2l0aCBhbiBhcHByb3hpbWF0ZSBsaWtlbGlob29kIGR1cmluZyB0aGUgc2VhcmNoIGFuZCByZS1lc3RpbWF0ZXMgb25seSB0aGUgY2hvc2VuIG1vZGVsIGJ5IGV4YWN0IG1heGltdW0gbGlrZWxpaG9vZDsgdW5kZXIgZXhhY3QgbGlrZWxpaG9vZCwgTUEoMSkgaXMgYmV0dGVyLiBUaGUgbWFudWFsIE1BKDEpIGlzIHByZWZlcnJlZC4KCiMjIyMgRGlhZ25vc3RpYyBDaGVja2luZwoKYGBge3J9CmNoZWNrcmVzaWR1YWxzKG0wNikKYGBgCgpManVuZ+KAk0JveDogJFFeKiA9IDYuOTA2NiQgd2l0aCA5IGRlZ3JlZXMgb2YgZnJlZWRvbSwgcC12YWx1ZSAkPSAwLjY0NjgkOiB0aGUgcmVzaWR1YWxzIGFyZSB3aGl0ZSBub2lzZS4KCmBgYHtyfQpyZXNfMDYgPC0gbTA2JHJlc2lkdWFscwpqYXJxdWUuYmVyYS50ZXN0KHJlc18wNikKYGBgCgpKYXJxdWXigJNCZXJhOiAkWF4yID0gNi4xNTk2JCwgcC12YWx1ZSAkPSAwLjA0NTk3JCwgc28gbm9ybWFsaXR5IGlzIHJlamVjdGVkIGF0IHRoZSA1JSBsZXZlbCwgYnV0IG9ubHkgbWFyZ2luYWxseS4gVGhlIHNlcmllcyB3YXMgc2ltdWxhdGVkIHdpdGggR2F1c3NpYW4gaW5ub3ZhdGlvbnMsIHNvIHRoaXMgaXMgYSBmYWxzZSByZWplY3Rpb24gKGEgdHlwZSBJIGVycm9yKTogd2l0aCAkbiA9IDEweyx9MDAwJCB0aGUgdGVzdCBpcyB2ZXJ5IHBvd2VyZnVsLCBhbmQgYXQgJFxhbHBoYSA9IDVcJSQgYWJvdXQgb25lIGluIHR3ZW50eSBjb3JyZWN0bHkgc3BlY2lmaWVkIG1vZGVscyBpcyBmbGFnZ2VkIGJ5IGNoYW5jZS4gVGhlIGhpc3RvZ3JhbSBpcyBiZWxsLXNoYXBlZCwgYW5kIG5vcm1hbGl0eSBpcyBub3QgcmVxdWlyZWQgZm9yIGNvbnNpc3RlbnQgZXN0aW1hdGlvbiBvZiBBUklNQSBwYXJhbWV0ZXJzIChpdCBtYXR0ZXJzIG1haW5seSBmb3IgZXhhY3QgcHJlZGljdGlvbiBpbnRlcnZhbHMpLgoKKipDb25jbHVzaW9uLioqIEFSSU1BKDAsMCwxKSB3aXRoIGEgbm9uLXplcm8gbWVhbiBpcyBhZGVxdWF0ZSBmb3IgYFkwNmAuCgoKIyMjIE1vZGVsIDA3CgojIyMjIEFDRiAmIFBBQ0YgU2VyaWVzIDA3CgpgYGB7cn0KcF9hY2YgIDwtIGdnQWNmKGRmJFkwNywgbGFnLm1heCA9IDM2KSArIGdndGl0bGUoIkFDRiBZMDciKSAKcF9wYWNmIDwtIGdnUGFjZihkZiRZMDcsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIFkwNyIpIAoKcF9hY2YgfCBwX3BhY2YKYGBgCgpCb3RoIGZ1bmN0aW9ucyB0YWlsIG9mZi4gVGhlIEFDRiBvc2NpbGxhdGVzIHdpdGggYWx0ZXJuYXRpbmcgc2lnbnMgYW5kIGRlY2F5cyBvdmVyIGFib3V0IDIwIGxhZ3MsIGFuZCB0aGUgUEFDRiBzaG93cyBsYXJnZSBzcGlrZXMgYXQgdGhlIGZpcnN0IGxhZ3MgdGhhdCBkaWUgZG93biBpcnJlZ3VsYXJseSBvdmVyIGFib3V0IDE1IGxhZ3MuIE5laXRoZXIgZnVuY3Rpb24gY3V0cyBvZmYsIHNvIGBZMDdgIGZvbGxvd3MgYSAqKm1peGVkIEFSTUEoJHAscSQpKiogcHJvY2VzcyB3aG9zZSBvcmRlcnMgY2Fubm90IGJlIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgcGxvdHMuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpgYGB7cn0KYWRmLnRlc3QoZGYkWTA3KQpgYGAKCkFERjogRGlja2V54oCTRnVsbGVyICQ9IC0xOS41NDYkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQuCgpgYGB7cn0KcHAudGVzdChkZiRZMDcpCmBgYAoKUFA6ICRaKFxhbHBoYSkgPSAtMTgzOTUkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQuCgpgYGB7cn0Ka3Bzcy50ZXN0KGRmJFkwNykKYGBgCgpLUFNTOiBzdGF0aXN0aWMgJD0gMC4wODQxMzYkLCBwLXZhbHVlICRcZ2UgMC4xMCQsIHNvIGxldmVsIHN0YXRpb25hcml0eSBpcyBub3QgcmVqZWN0ZWQuICoqYFkwN2AgaXMgc3RhdGlvbmFyeSoqICgkZCA9IDAkKS4KCiMjIyMgT3JkZXIgU2VsZWN0aW9uIGZvciB0aGUgTWl4ZWQgTW9kZWwKCkJlY2F1c2UgdGhlIEFDRiBhbmQgdGhlIFBBQ0YgYm90aCB0YWlsIG9mZiwgdGhlIG9yZGVycyBhcmUgY2hvc2VuIGJ5IGZpdHRpbmcgZXZlcnkgQVJNQSgkcCxxJCkgbW9kZWwgd2l0aCAkcCBcbGUgNCQgYW5kICRxIFxsZSA2JCBieSBleGFjdCBtYXhpbXVtIGxpa2VsaWhvb2QgYW5kIHJhbmtpbmcgdGhlbSBieSBCSUMuIFRoaXMgZXhoYXVzdGl2ZSBzZWFyY2ggb3ZlciBhIHNtYWxsIGdyaWQgaXMgdGhlIG1hbnVhbCBjb3VudGVycGFydCBvZiBgYXV0by5hcmltYSgpYC4gCgpgYGB7cn0KaWNfZ3JpZCA8LSBmdW5jdGlvbih5LCBkLCBwX21heCA9IDQsIHFfbWF4ID0gNikgewogIGdyaWQgPC0gZXhwYW5kLmdyaWQocCA9IDA6cF9tYXgsIHEgPSAwOnFfbWF4KQogIGdyaWQkQUlDYyA8LSBOQV9yZWFsXwogIGdyaWQkQklDICA8LSBOQV9yZWFsXwogIGZvciAoaSBpbiBzZXFfbGVuKG5yb3coZ3JpZCkpKSB7CiAgICBmaXQgPC0gdHJ5Q2F0Y2goQXJpbWEoeSwgb3JkZXIgPSBjKGdyaWQkcFtpXSwgZCwgZ3JpZCRxW2ldKSksCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jdGlvbihlKSBOVUxMKQogICAgaWYgKCFpcy5udWxsKGZpdCkpIHsKICAgICAgZ3JpZCRBSUNjW2ldIDwtIGZpdCRhaWNjCiAgICAgIGdyaWQkQklDW2ldICA8LSBmaXQkYmljCiAgICB9CiAgfQogIGdyaWQgJT4lCiAgICBtdXRhdGUobW9kZWwgPSBzcHJpbnRmKCJBUklNQSglZCwlZCwlZCkiLCBwLCBkLCBxKSkgJT4lCiAgICBhcnJhbmdlKEJJQykgJT4lCiAgICBzZWxlY3QobW9kZWwsIEFJQ2MsIEJJQykKfQoKdHNfMDcgICA8LSB0cyhkYXRhPWRmJFkwNykKZ3JpZF8wNyA8LSBpY19ncmlkKHRzXzA3LCBkID0gMCkKaGVhZChncmlkXzA3LCA1KQpgYGAKClRoZSBzbWFsbGVzdCBCSUMgaXMgYXR0YWluZWQgYnkgYHIgZ3JpZF8wNyRtb2RlbFsxXWAsIGFuZCB0aGUgc21hbGxlc3QgQUlDYyBieSBgciBncmlkXzA3JG1vZGVsW3doaWNoLm1pbihncmlkXzA3JEFJQ2MpXWAuIFRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgdGhlcmVmb3JlICoqQVJJTUEoMywwLDUpIHdpdGggYSBub24temVybyBtZWFuKiouCgojIyMjIFBhcmFtZXRlciBFc3RpbWF0aW9uCgpgYGB7cn0KbTA3IDwtIEFyaW1hKHRzXzA3LCBvcmRlciA9IGMoMywwLDUpKQpzdW1tYXJ5KG0wNykKYGBgCgpUaGUgdGhyZWUgQVIgY29lZmZpY2llbnRzLCBmaXZlIE1BIGNvZWZmaWNpZW50cyBhbmQgdGhlIG1lYW4gKCRcaGF0XG11ID0gNTkuOTg2OCQpIGFyZSBlc3RpbWF0ZWQgcHJlY2lzZWx5LiBUaGUgcmVzaWR1YWwgdmFyaWFuY2UgaXMgJFxoYXRcc2lnbWFfYV4yID0gMy45NDQkLCB3aXRoIEFJQyAkPSA0MjExOS40NSQsIEFJQ2MgJD0gNDIxMTkuNDckIGFuZCBCSUMgJD0gNDIxOTEuNTUkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wNykKYGBgCgpBbGwgY29lZmZpY2llbnRzIGFyZSBzaWduaWZpY2FudDsgdGhlIHNtYWxsZXN0IHRlc3Qgc3RhdGlzdGljIGlzICR6ID0gNS43OSQgZm9yICRccGhpXzIkIChwLXZhbHVlICRcYXBwcm94IDdcdGltZXMxMF57LTl9JCkuCgojIyMjIEZpdHRlZCBNb2RlbCBFcXVhdGlvbgoKVGhlIGdlbmVyYWwgZm9ybSBvZiBBUklNQSgzLDAsNSkgd2l0aCBtZWFuICRcbXUkIGlzCgokJAooMS1ccGhpXzFCLVxwaGlfMkJeMi1ccGhpXzNCXjMpXCwoWV90LVxtdSkgPSAoMStcdGhldGFfMUIrXHRoZXRhXzJCXjIrXGNkb3RzK1x0aGV0YV81Ql41KVwsYV90IC4KJCQKCldpdGggdGhlIGVzdGltYXRlcywKCiQkClxiZWdpbnthbGlnbmVkfQooMSArIDAuNDk4OUIgLSAwLjA4OTZCXjIgLSAwLjQ5OTNCXjMpXCwoWV90IC0gNTkuOTg2OCkKPXt9JiAoMSAtIDAuMzk5MEIgKyAwLjYwNTlCXjIgKyAwLjYwNTBCXjMgXFwKJi0gMC4zMDI2Ql40ICsgMC40MTA3Ql41KVwsYV90ICwKXGVuZHthbGlnbmVkfQokJAoKd2hpY2ggZXhwYW5kcyB0bwoKJCQKXGJlZ2lue2FsaWduZWR9CllfdCA9e30mIDU0LjU4NDUgLSAwLjQ5ODlcLFlfe3QtMX0gKyAwLjA4OTZcLFlfe3QtMn0gKyAwLjQ5OTNcLFlfe3QtM30gXFwKJisgYV90IC0gMC4zOTkwXCxhX3t0LTF9ICsgMC42MDU5XCxhX3t0LTJ9ICsgMC42MDUwXCxhX3t0LTN9IC0gMC4zMDI2XCxhX3t0LTR9ICsgMC40MTA3XCxhX3t0LTV9LApccXF1YWQgYV90IFxzaW0gXG1hdGhjYWx7Tn0oMCxcIDMuOTQ0KSwKXGVuZHthbGlnbmVkfQokJAoKd2hlcmUgJDU0LjU4NDUgPSA1OS45ODY4IFx0aW1lcyAoMSAtIDAuMDkwMSkkIGFuZCAkMC4wOTAxJCBpcyB0aGUgc3VtIG9mIHRoZSB0aHJlZSBBUiBjb2VmZmljaWVudHMuCgojIyMjIENvbXBhcmlzb24gd2l0aCBhdXRvLmFyaW1hKCkKCmBgYHtyfQphYTA3IDwtIGF1dG8uYXJpbWEodHNfMDcsIG1heC5wID0gMTAsIG1heC5xID0gMTApCmFhMDcKYGBgCgpgYXV0by5hcmltYSgpYCBzZWxlY3RzICoqQVJJTUEoMTAsMCwzKSB3aXRoIGEgbm9uLXplcm8gbWVhbioqLCB3aXRoIDEzIEFSTUEgY29lZmZpY2llbnRzIGluc3RlYWQgb2YgOC4gSXQgaXMgd29yc2UgYnkgYm90aCBjcml0ZXJpYTogQUlDYyAkPSA0MjE0MC40MCQgKCQyMC45JCB1bml0cyBsYXJnZXIgdGhhbiBmb3IgQVJJTUEoMywwLDUpKSBhbmQgQklDICQ9IDQyMjQ4LjUxJCAoJDU3LjAkIHVuaXRzIGxhcmdlcikuIFRoZSBzdGVwd2lzZSBzZWFyY2gsIHJ1biBvbiBhbiBhcHByb3hpbWF0ZSBsaWtlbGlob29kLCBkcmlmdGVkIHRvd2FyZHMgYSBsb25nIEFSIHBvbHlub21pYWwgdGhhdCBvbmx5IGFwcHJveGltYXRlcyB0aGUgdHJ1ZSBzdHJ1Y3R1cmUsIHdoZXJlYXMgdGhlIGV4aGF1c3RpdmUgZ3JpZCBzZWFyY2ggd2l0aCBleGFjdCBsaWtlbGlob29kIGZvdW5kIHRoZSBiZXR0ZXIgYW5kIG1vcmUgcGFyc2ltb25pb3VzIEFSSU1BKDMsMCw1KS4KCiMjIyMgRGlhZ25vc3RpYyBDaGVja2luZwoKYGBge3J9CmNoZWNrcmVzaWR1YWxzKG0wNykKYGBgCgpManVuZ+KAk0JveDogJFFeKiA9IDIuODcxOSQgd2l0aCAzIGRlZ3JlZXMgb2YgZnJlZWRvbSwgcC12YWx1ZSAkPSAwLjQxMTgkOiBubyByZW1haW5pbmcgYXV0b2NvcnJlbGF0aW9uLgoKYGBge3J9CnJlc18wNyA8LSBtMDckcmVzaWR1YWxzCmphcnF1ZS5iZXJhLnRlc3QocmVzXzA3KQpgYGAKCkphcnF1ZeKAk0JlcmE6ICRYXjIgPSAwLjYyMTIzJCwgcC12YWx1ZSAkPSAwLjczMyQ6IG5vcm1hbGl0eSBpcyBub3QgcmVqZWN0ZWQuCgoqKkNvbmNsdXNpb24uKiogQVJJTUEoMywwLDUpIHdpdGggYSBub24temVybyBtZWFuIGlzIGFkZXF1YXRlIGZvciBgWTA3YC4KCgojIyMgTW9kZWwgMDgKCiMjIyMgQUNGICYgUEFDRiBTZXJpZXMgMDgKCkFzIGZvciBgWTAxYCwgdGhlIEFDRiBvZiB0aGUgbGV2ZWxzIGlzIHNob3duIHVwIHRvIGxhZyA1LDAwMC4KCmBgYHtyfQpwX2FjZiAgPC0gZ2dBY2YoZGYkWTA4LCBsYWcubWF4ID0gNTAwMCkgKyBnZ3RpdGxlKCJBQ0YgWTA4IikgCnBfcGFjZiA8LSBnZ1BhY2YoZGYkWTA4LCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiUEFDRiBZMDgiKSAKCnBfYWNmIHwgcF9wYWNmCmBgYAoKVGhlIEFDRiBkZWNheXMgdmVyeSBzbG93bHksIHdpdGggbG9uZyB3YXZlcyB0aGF0IHBlcnNpc3QgdXAgdG8gbGFnIDUsMDAwLCBhbmQgdGhlIFBBQ0YgaGFzIGEgc3Bpa2UgY2xvc2UgdG8gMSBhdCBsYWcgMS4gQm90aCBhcmUgc2lnbnMgb2YgYSBub24tc3RhdGlvbmFyeSBzZXJpZXMuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpgYGB7cn0KYWRmLnRlc3QoZGYkWTA4KQpgYGAKCkFERjogRGlja2V54oCTRnVsbGVyICQ9IC0yLjI3OTckLCBwLXZhbHVlICQ9IDAuNDU5OSA+IDAuMDUkLCBzbyB0aGUgdW5pdCByb290IGlzIG5vdCByZWplY3RlZC4KCmBgYHtyfQpwcC50ZXN0KGRmJFkwOCkKYGBgCgpQUDogJFooXGFscGhhKSA9IC0yMy4wNTUkLCBwLXZhbHVlICQ9IDAuMDM4NDQgPCAwLjA1JCwgc28gdGhpcyB0ZXN0IHJlamVjdHMgdGhlIHVuaXQgcm9vdCBhdCB0aGUgNSUgbGV2ZWwsIGluIGNvbnRyYXN0IHdpdGggdGhlIEFERiB0ZXN0LgoKYGBge3J9Cmtwc3MudGVzdChkZiRZMDgpCmBgYAoKS1BTUzogc3RhdGlzdGljICQ9IDEwLjMzOCQsIHAtdmFsdWUgJFxsZSAwLjAxJCwgc28gbGV2ZWwgc3RhdGlvbmFyaXR5IGlzIHJlamVjdGVkLiBUd28gb2YgdGhlIHRocmVlIHRlc3RzLCB0b2dldGhlciB3aXRoIHRoZSBwbG90cywgaW5kaWNhdGUgbm9uLXN0YXRpb25hcml0eS4gVGhlIFBQIHRlc3QgY29ycmVjdHMgZm9yIHNlcmlhbCBjb3JyZWxhdGlvbiBub24tcGFyYW1ldHJpY2FsbHkgKGhlcmUgd2l0aCBvbmx5IDEyIGxhZ3MpLCBhbmQgaXQgaXMga25vd24gdG8gb3Zlci1yZWplY3QgYSB0cnVlIHVuaXQgcm9vdCB3aGVuIHRoZSBkaWZmZXJlbmNlZCBzZXJpZXMgaGFzIHN0cm9uZyBzaG9ydC1ydW4gZHluYW1pY3MsIGVzcGVjaWFsbHkgbW92aW5nLWF2ZXJhZ2UgY29tcG9uZW50czsgdGhlIEFERiB0ZXN0IGhhbmRsZXMgc3VjaCBkeW5hbWljcyB0aHJvdWdoIGl0cyAyMSBhdWdtZW50YXRpb24gbGFncy4gV2UgdGhlcmVmb3JlIGNvbmNsdWRlIHRoYXQgKipgWTA4YCBpcyBub24tc3RhdGlvbmFyeSoqIGFuZCBkaWZmZXJlbmNlIGl0LgoKIyMjIyBEaWZmZXJlbmNpbmcKCmBgYHtyfQp0c18wOCA8LSB0cyhkYXRhPWRmJFkwOCkKZGlmZl90c18wOCA8LSBkaWZmKHRzXzA4LCBsYWcgPSAxKQphdXRvcGxvdCh0c18wOCkgfCBhdXRvcGxvdChkaWZmX3RzXzA4KQpgYGAKClRoZSBvcmlnaW5hbCBzZXJpZXMgd2FuZGVycyBiZXR3ZWVuIGFib3V0IDgwIGFuZCAyNTAgd2l0aG91dCBhIGZpeGVkIG1lYW4sIHdoaWxlIHRoZSBkaWZmZXJlbmNlZCBzZXJpZXMgJFdfdCA9IFlfdCAtIFlfe3QtMX0kIGZsdWN0dWF0ZXMgYXJvdW5kIHplcm8gd2l0aCBjb25zdGFudCB2YXJpYW5jZS4KCmBgYHtyfQphZGYudGVzdChkaWZmX3RzXzA4KQpgYGAKCkRpY2tleeKAk0Z1bGxlciAkPSAtMjMuNDY3JCwgcC12YWx1ZSAkXGxlIDAuMDEkOiAkV190JCBpcyBzdGF0aW9uYXJ5IGFuZCAqKiRkID0gMSQqKi4KCmBgYHtyfQpwMDhfYWNmX2RpZmYgIDwtIGdnQWNmKGRpZmZfdHNfMDgsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJBQ0YgZGlmZihZMDgpIikgCnAwOF9wYWNmX2RpZmYgPC0gZ2dQYWNmKGRpZmZfdHNfMDgsIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIGRpZmYoWTA4KSIpIAoKcDA4X2FjZl9kaWZmIHwgcDA4X3BhY2ZfZGlmZgpgYGAKClRoZSBBQ0Ygb2YgJFdfdCQgaXMgYSBkYW1wZWQgc2luZSB3YXZlIChhbHRlcm5hdGluZyBncm91cHMgb2YgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGF1dG9jb3JyZWxhdGlvbnMgdGhhdCBmYWRlIG91dCB3aXRoaW4gYWJvdXQgMjAgbGFncyksIGFuZCB0aGUgUEFDRiBhbHNvIGRpZXMgZG93bjogbGFyZ2Ugc3Bpa2VzIGF0IGxhZ3MgMSB0byA0IGFyZSBmb2xsb3dlZCBieSBzbWFsbGVyIHNpZ25pZmljYW50IHNwaWtlcyB1cCB0byBhYm91dCBsYWcgMTAuIEJvdGggZnVuY3Rpb25zIHRhaWwgb2ZmLCBzbyAkV190JCBmb2xsb3dzIGEgKiptaXhlZCBBUk1BKCRwLHEkKSoqIHByb2Nlc3MuCgojIyMjIE9yZGVyIFNlbGVjdGlvbiBmb3IgdGhlIE1peGVkIE1vZGVsCgpBcyBmb3IgYFkwN2AsIGFsbCBtb2RlbHMgd2l0aCAkcCBcbGUgNCQgYW5kICRxIFxsZSA2JCBhcmUgY29tcGFyZWQsIG5vdyB3aXRoICRkID0gMSQgKHRoZSBmdW5jdGlvbiBgaWNfZ3JpZCgpYCB3YXMgZGVmaW5lZCBpbiBNb2RlbCAwNykuCgpgYGB7cn0KZ3JpZF8wOCA8LSBpY19ncmlkKHRzXzA4LCBkID0gMSkKaGVhZChncmlkXzA4LCA1KQpgYGAKClRoZSBzbWFsbGVzdCBCSUMgaXMgYXR0YWluZWQgYnkgYHIgZ3JpZF8wOCRtb2RlbFsxXWAsIGFuZCB0aGUgc21hbGxlc3QgQUlDYyBieSBgciBncmlkXzA4JG1vZGVsW3doaWNoLm1pbihncmlkXzA4JEFJQ2MpXWAuIFRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgKipBUklNQSgyLDEsMykqKiB3aXRob3V0IGEgY29uc3RhbnQuCgojIyMjIFBhcmFtZXRlciBFc3RpbWF0aW9uCgpgYGB7cn0KbTA4IDwtIEFyaW1hKHRzXzA4LCBvcmRlciA9IGMoMiwxLDMpKQpzdW1tYXJ5KG0wOCkKYGBgCgpUaGUgZXN0aW1hdGVzIGFyZSAkXGhhdFxwaGlfMSA9IDAuNjg0NiQsICRcaGF0XHBoaV8yID0gLTAuNjk5NyQsICRcaGF0XHRoZXRhXzEgPSAwLjYwMzMkLCAkXGhhdFx0aGV0YV8yID0gLTAuMTg1NyQgYW5kICRcaGF0XHRoZXRhXzMgPSAtMC40MDk3JCwgd2l0aCAkXGhhdFxzaWdtYV9hXjIgPSAyLjI1MSQsIEFJQyAkPSAzNjUwMi4zNiQsIEFJQ2MgJD0gMzY1MDIuMzckIGFuZCBCSUMgJD0gMzY1NDUuNjIkLiAKCmBgYHtyfQpjb2VmdGVzdChtMDgpCmBgYAoKQWxsIGNvZWZmaWNpZW50cyBhcmUgc2lnbmlmaWNhbnQ7IHRoZSBzbWFsbGVzdCB0ZXN0IHN0YXRpc3RpYyBpcyAkfHp8ID0gMTMuNjAkIGZvciAkXHRoZXRhXzIkLgoKIyMjIyBGaXR0ZWQgTW9kZWwgRXF1YXRpb24KClRoZSBnZW5lcmFsIGZvcm0gb2YgQVJJTUEoMiwxLDMpIGlzCgokJAooMS1ccGhpXzFCLVxwaGlfMkJeMilcLCgxLUIpXCxZX3QgPSAoMStcdGhldGFfMUIrXHRoZXRhXzJCXjIrXHRoZXRhXzNCXjMpXCxhX3QgLgokJAoKV2l0aCB0aGUgZXN0aW1hdGVzLAoKJCQKKDEgLSAwLjY4NDZCICsgMC42OTk3Ql4yKVwsKDEtQilcLFlfdCA9ICgxICsgMC42MDMzQiAtIDAuMTg1N0JeMiAtIDAuNDA5N0JeMylcLGFfdCAuCiQkCgpNdWx0aXBseWluZyBvdXQgdGhlIEFSIHNpZGUsICQoMS1ccGhpXzFCLVxwaGlfMkJeMikoMS1CKSA9IDEtKDErXHBoaV8xKUIrKFxwaGlfMS1ccGhpXzIpQl4yK1xwaGlfMkJeMyA9IDEgLSAxLjY4NDZCICsgMS4zODQzQl4yIC0gMC42OTk3Ql4zJCwgc28gdGhlIGV4cGxpY2l0IGZvcm0gaXMKCiQkClxiZWdpbnthbGlnbmVkfQpZX3QgPXt9JiAxLjY4NDZcLFlfe3QtMX0gLSAxLjM4NDNcLFlfe3QtMn0gKyAwLjY5OTdcLFlfe3QtM30gXFwKJisgYV90ICsgMC42MDMzXCxhX3t0LTF9IC0gMC4xODU3XCxhX3t0LTJ9IC0gMC40MDk3XCxhX3t0LTN9LApccXF1YWQgYV90IFxzaW0gXG1hdGhjYWx7Tn0oMCxcIDIuMjUxKS4KXGVuZHthbGlnbmVkfQokJAoKVGhlIGNvZWZmaWNpZW50cyBvZiAkWV97dC0xfSQsICRZX3t0LTJ9JCBhbmQgJFlfe3QtM30kIHN1bSB0byBvbmUgKCQxLjY4NDYgLSAxLjM4NDMgKyAwLjY5OTcgPSAxJCksIHdoaWNoIHJlZmxlY3RzIHRoZSB1bml0IHJvb3QuCgojIyMjIENvbXBhcmlzb24gd2l0aCBhdXRvLmFyaW1hKCkKCmBgYHtyfQphYTA4IDwtIGF1dG8uYXJpbWEodHNfMDgsIG1heC5wID0gMTAsIG1heC5xID0gMTApCmFhMDgKYGBgCgpgYXV0by5hcmltYSgpYCBzZWxlY3RzICoqQVJJTUEoNywxLDMpKiosIHdpdGggMTAgY29lZmZpY2llbnRzIGluc3RlYWQgb2YgNS4gSXRzIEFJQ2MgKCQzNjQ5NS4xNiQpIGlzICQ3LjIkIHVuaXRzICpsb3dlciogdGhhbiB0aGF0IG9mIEFSSU1BKDIsMSwzKSwgYnV0IGl0cyBCSUMgKCQzNjU3NC40NCQpIGlzICQyOC44JCB1bml0cyBoaWdoZXIuCgpgYGB7cn0KY29lZnRlc3QoYWEwOCkKYGBgCgpTaXggb2YgdGhlIHRlbiBjb2VmZmljaWVudHMgKGBhcjNgIHRvIGBhcjdgIGFuZCBgbWEyYCkgYXJlIG5vdCBzaWduaWZpY2FudCBhdCB0aGUgNSUgbGV2ZWwuIEFJQ2MgcGVuYWxpc2VzIGVhY2ggZXh0cmEgcGFyYW1ldGVyIGJ5IGFib3V0IDIsIHdoZXJlYXMgQklDIHBlbmFsaXNlcyBpdCBieSAkXGxuIG4gXGFwcHJveCA5LjIxJC4gVGhlIGFkZGl0aW9uYWwgQVIgdGVybXMgYWJzb3JiIHRoZSB0aW55IHJlc2lkdWFsIGF1dG9jb3JyZWxhdGlvbiBkaXNjdXNzZWQgYmVsb3cgYW5kIGltcHJvdmUgdGhlIGxpa2VsaWhvb2Qgc2xpZ2h0bHksIGJ1dCBhdCB0aGUgY29zdCBvZiBzaXggaW5zaWduaWZpY2FudCBjb2VmZmljaWVudHMuIFBhcnNpbW9ueSBhbmQgQklDIGZhdm91ciBBUklNQSgyLDEsMyksIHdoaWNoIGlzIGFsc28gdGhlIG1vZGVsIHRoZSBzZXJpZXMgd2FzIGdlbmVyYXRlZCBmcm9tOyB0aGUgYXV0b21hdGljIG1vZGVsIG92ZXItZml0cy4KCiMjIyMgRGlhZ25vc3RpYyBDaGVja2luZwoKYGBge3J9CmNoZWNrcmVzaWR1YWxzKG0wOCkKYGBgCgpManVuZ+KAk0JveDogJFFeKiA9IDE1LjE4NiQgd2l0aCA1IGRlZ3JlZXMgb2YgZnJlZWRvbSwgcC12YWx1ZSAkPSAwLjAwOTYkLCBzbyB3aGl0ZSBub2lzZSBpcyByZWplY3RlZCBhdCB0aGUgNSUgbGV2ZWwuIFRoZSByZXNpZHVhbCBBQ0Ygc2hvd3Mgd2h5OiBvbmx5IGEgaGFuZGZ1bCBvZiB2ZXJ5IHNtYWxsIGF1dG9jb3JyZWxhdGlvbnMsIHRoZSBsYXJnZXN0IGF0IGxhZyA3IChhYm91dCAwLjAyNCksIGxpZSBqdXN0IG91dHNpZGUgdGhlICRccG0gMC4wMTk2JCBiYW5kcy4gV2l0aCAkbiA9IDEweyx9MDAwJCB0aGUgTGp1bmfigJNCb3ggdGVzdCBkZXRlY3RzIGV2ZW4gbmVnbGlnaWJsZSBkZXBlbmRlbmNlIChhbiBhdXRvY29ycmVsYXRpb24gb2YgMC4wMjQgZXhwbGFpbnMgbGVzcyB0aGFuIDAuMSUgb2YgdGhlIHJlc2lkdWFsIHZhcmlhbmNlKS4gQmVjYXVzZSB0aGUgc2VyaWVzIHdhcyBzaW11bGF0ZWQgZnJvbSBBUklNQSgyLDEsMyksIHRoaXMgcmVqZWN0aW9uIGlzIGEgZmFsc2UgYWxhcm0gKGEgdHlwZSBJIGVycm9yKS4gSW4gYSByZWFsIGFwcGxpY2F0aW9uIG9uZSB3b3VsZCB0cnkgYWRkaW5nIHRlcm1zLCBidXQgdGhlIG92ZXItZml0dGVkIGBhdXRvLmFyaW1hKClgIG1vZGVsIGFib3ZlIHNob3dzIHRoYXQgc3VjaCB0ZXJtcyBhcmUgaW5zaWduaWZpY2FudCBhbmQgd29yc2VuIEJJQy4KCmBgYHtyfQpyZXNfMDggPC0gbTA4JHJlc2lkdWFscwpqYXJxdWUuYmVyYS50ZXN0KHJlc18wOCkKYGBgCgpKYXJxdWXigJNCZXJhOiAkWF4yID0gMC4zNDc0NiQsIHAtdmFsdWUgJD0gMC44NDA1JDogbm9ybWFsaXR5IGlzIG5vdCByZWplY3RlZC4KCioqQ29uY2x1c2lvbi4qKiBBUklNQSgyLDEsMykgaXMgcmV0YWluZWQgZm9yIGBZMDhgLiBBbGwgY29lZmZpY2llbnRzIGFyZSBzaWduaWZpY2FudCBhbmQgdGhlIHJlc2lkdWFscyBhcmUgbm9ybWFsOyB0aGUgTGp1bmfigJNCb3ggcmVqZWN0aW9uIHJlZmxlY3RzIGF1dG9jb3JyZWxhdGlvbnMgdG9vIHNtYWxsIHRvIG1hdHRlciBpbiBwcmFjdGljZS4KCgojIyMgTW9kZWwgMDkKCiMjIyMgQUNGICYgUEFDRiBTZXJpZXMgMDkKCmBgYHtyfQpwX2FjZiAgPC0gZ2dBY2YoZGYkWTA5LCBsYWcubWF4ID0gNTAwMCkgKyBnZ3RpdGxlKCJBQ0YgWTA5IikgCnBfcGFjZiA8LSBnZ1BhY2YoZGYkWTA5LCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiUEFDRiBZMDkiKSAKCnBfYWNmIHwgcF9wYWNmCmBgYAoKVGhlIEFDRiBvZiB0aGUgbGV2ZWxzIGRlY2F5cyBzbG93bHkgd2l0aCBsb25nIHdhdmVzLCBhbmQgdGhlIFBBQ0YgaGFzIGEgZG9taW5hbnQgc3Bpa2UgY2xvc2UgdG8gMSBhdCBsYWcgMSBmb2xsb3dlZCBieSBzbWFsbGVyIHNwaWtlcyBhdCBsYWdzIDIgdG8gNS4gVGhlIHNsb3cgQUNGIGRlY2F5IGFnYWluIGluZGljYXRlcyBub24tc3RhdGlvbmFyaXR5LgoKIyMjIyBTdGF0aW9uYXJpdHkgVGVzdAoKYGBge3J9CmFkZi50ZXN0KGRmJFkwOSkKYGBgCgpBREY6IERpY2tleeKAk0Z1bGxlciAkPSAtMi40NDUzJCwgcC12YWx1ZSAkPSAwLjM4OTcgPiAwLjA1JCwgc28gdGhlIHVuaXQgcm9vdCBpcyBub3QgcmVqZWN0ZWQuCgpgYGB7cn0KcHAudGVzdChkZiRZMDkpCmBgYAoKUFA6ICRaKFxhbHBoYSkgPSAtMjMuMDU2JCwgcC12YWx1ZSAkPSAwLjAzODQzIDwgMC4wNSQsIHNvIHRoZSBQUCB0ZXN0IGFnYWluIHJlamVjdHMgdGhlIHVuaXQgcm9vdCwgdW5saWtlIHRoZSBBREYgdGVzdC4KCmBgYHtyfQprcHNzLnRlc3QoZGYkWTA5KQpgYGAKCktQU1M6IHN0YXRpc3RpYyAkPSAzNS44ODMkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIGxldmVsIHN0YXRpb25hcml0eSBpcyByZWplY3RlZC4gQXMgZm9yIGBZMDhgLCB0aGUgQURGIGFuZCBLUFNTIHRlc3RzIGFuZCB0aGUgcGxvdHMgYWdyZWUsIHdoaWxlIHRoZSBQUCB0ZXN0IGlzIGFmZmVjdGVkIGJ5IHRoZSBzdHJvbmcgc2hvcnQtcnVuIGR5bmFtaWNzIG9mIHRoZSBkaWZmZXJlbmNlZCBzZXJpZXMuICoqYFkwOWAgaXMgbm9uLXN0YXRpb25hcnkqKiBhbmQgaXMgZGlmZmVyZW5jZWQuCgojIyMjIERpZmZlcmVuY2luZwoKYGBge3J9CnRzXzA5IDwtIHRzKGRhdGE9ZGYkWTA5KQpkaWZmX3RzXzA5IDwtIGRpZmYodHNfMDksIGxhZyA9IDEpCmF1dG9wbG90KHRzXzA5KSB8IGF1dG9wbG90KGRpZmZfdHNfMDkpCmBgYAoKVGhlIG9yaWdpbmFsIHNlcmllcyB3YW5kZXJzIHdpdGhvdXQgYSBmaXhlZCBtZWFuLCB3aGlsZSB0aGUgZGlmZmVyZW5jZWQgc2VyaWVzIGZsdWN0dWF0ZXMgYXJvdW5kIHplcm8gd2l0aCBjb25zdGFudCB2YXJpYW5jZS4KCmBgYHtyfQphZGYudGVzdChkaWZmX3RzXzA5KQpgYGAKCkRpY2tleeKAk0Z1bGxlciAkPSAtMjMuMTYxJCwgcC12YWx1ZSAkXGxlIDAuMDEkOiAkV190JCBpcyBzdGF0aW9uYXJ5IGFuZCAqKiRkID0gMSQqKi4KCmBgYHtyfQpwMDlfYWNmX2RpZmYgIDwtIGdnQWNmKGRpZmZfdHNfMDksIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJBQ0YgZGlmZihZMDkpIikgCnAwOV9wYWNmX2RpZmYgPC0gZ2dQYWNmKGRpZmZfdHNfMDksIGxhZy5tYXggPSAzNikgKyBnZ3RpdGxlKCJQQUNGIGRpZmYoWTA5KSIpIAoKcDA5X2FjZl9kaWZmIHwgcDA5X3BhY2ZfZGlmZgpgYGAKClRoZSBBQ0Ygb2YgJFdfdCQgaXMgYSBzbG93bHkgZGFtcGVkIHNpbmUgd2F2ZSAod2l0aCBhIHBlcmlvZCBvZiBhYm91dCA4IGxhZ3MpIHRoYXQgaXMgc3RpbGwgdmlzaWJsZSBiZXlvbmQgbGFnIDMwLCB3aGVyZWFzIHRoZSBQQUNGIGhhcyBmb3VyIHNpZ25pZmljYW50IHNwaWtlcyAobGFncyAxIHRvIDQpIGFuZCBjdXRzIG9mZiBhZnRlcndhcmRzLiBBIHRhaWxpbmctb2ZmIEFDRiB3aXRoIGEgUEFDRiB0aGF0IGN1dHMgb2ZmIGFmdGVyIGxhZyA0IGlkZW50aWZpZXMgYW4gQVIoNCkgcHJvY2VzcyBmb3IgJFdfdCQsIHNvIHRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgKipBUklNQSg0LDEsMCkqKiB3aXRob3V0IGEgY29uc3RhbnQuCgojIyMjIFBhcmFtZXRlciBFc3RpbWF0aW9uCgpgYGB7cn0KbTA5IDwtIEFyaW1hKHRzXzA5LCBvcmRlciA9IGMoNCwxLDApKQpzdW1tYXJ5KG0wOSkKYGBgCgpUaGUgZXN0aW1hdGVzIGFyZSAkXGhhdFxwaGlfMSA9IDAuMzk5MSQsICRcaGF0XHBoaV8yID0gLTAuMjAzNiQsICRcaGF0XHBoaV8zID0gLTAuMjA5NiQgYW5kICRcaGF0XHBoaV80ID0gLTAuMzM3OSQsIHdpdGggJFxoYXRcc2lnbWFfYV4yID0gMS4wMzUkLCBBSUMgJD0kIEFJQ2MgJD0gMjg3MjYuNzkkIGFuZCBCSUMgJD0gMjg3NjIuODQkLgoKYGBge3J9CmNvZWZ0ZXN0KG0wOSkKYGBgCgpBbGwgZm91ciBBUiBjb2VmZmljaWVudHMgYXJlIGhpZ2hseSBzaWduaWZpY2FudCAoJHx6fCBcZ2UgMjAuMyQpLgoKIyMjIyBGaXR0ZWQgTW9kZWwgRXF1YXRpb24KClRoZSBnZW5lcmFsIGZvcm0gb2YgQVJJTUEoNCwxLDApIGlzCgokJAooMS1ccGhpXzFCLVxwaGlfMkJeMi1ccGhpXzNCXjMtXHBoaV80Ql40KVwsKDEtQilcLFlfdCA9IGFfdCAuCiQkCgpXaXRoIHRoZSBlc3RpbWF0ZXMsCgokJAooMSAtIDAuMzk5MUIgKyAwLjIwMzZCXjIgKyAwLjIwOTZCXjMgKyAwLjMzNzlCXjQpXCwoMS1CKVwsWV90ID0gYV90IC4KJCQKCk11bHRpcGx5aW5nIG91dCB0aGUgQVIgc2lkZSBnaXZlcwoKJCQKXGJlZ2lue2FsaWduZWR9CiYxLSgxK1xwaGlfMSlCKyhccGhpXzEtXHBoaV8yKUJeMisoXHBoaV8yLVxwaGlfMylCXjMrKFxwaGlfMy1ccGhpXzQpQl40K1xwaGlfNEJeNSBcXAomPSAxIC0gMS4zOTkxQiArIDAuNjAyN0JeMiArIDAuMDA2MEJeMyArIDAuMTI4MkJeNCAtIDAuMzM3OUJeNSAsClxlbmR7YWxpZ25lZH0KJCQKCnNvIHRoZSBleHBsaWNpdCBmb3JtIGlzCgokJApcYmVnaW57YWxpZ25lZH0KWV90ID17fSYgMS4zOTkxXCxZX3t0LTF9IC0gMC42MDI3XCxZX3t0LTJ9IC0gMC4wMDYwXCxZX3t0LTN9IC0gMC4xMjgyXCxZX3t0LTR9ICsgMC4zMzc5XCxZX3t0LTV9ICsgYV90LApccXF1YWQgYV90IFxzaW0gXG1hdGhjYWx7Tn0oMCxcIDEuMDM1KS4KXGVuZHthbGlnbmVkfQokJAoKQXMgZm9yIGBZMDhgLCB0aGUgZml2ZSBhdXRvcmVncmVzc2l2ZSBjb2VmZmljaWVudHMgc3VtIHRvIG9uZSAodXAgdG8gcm91bmRpbmcpLCB3aGljaCByZWZsZWN0cyB0aGUgdW5pdCByb290LgoKIyMjIyBDb21wYXJpc29uIHdpdGggYXV0by5hcmltYSgpCgpgYGB7cn0KYWEwOSA8LSBhdXRvLmFyaW1hKHRzXzA5LCBtYXgucCA9IDEwLCBtYXgucSA9IDEwKQphYTA5CmBgYAoKYGBge3J9CmNvZWZ0ZXN0KGFhMDkpCmBgYAoKYGF1dG8uYXJpbWEoKWAgc2VsZWN0cyBleGFjdGx5IHRoZSBzYW1lIG1vZGVsLCBBUklNQSg0LDEsMCksIHdpdGggaWRlbnRpY2FsIGVzdGltYXRlcyBhbmQgc2lnbmlmaWNhbmNlIHRlc3RzLiBCb3RoIGFwcHJvYWNoZXMgYWdyZWUuCgojIyMjIERpYWdub3N0aWMgQ2hlY2tpbmcKCmBgYHtyfQpjaGVja3Jlc2lkdWFscyhtMDkpCmBgYAoKTGp1bmfigJNCb3g6ICRRXiogPSAzLjcwNTEkIHdpdGggNiBkZWdyZWVzIG9mIGZyZWVkb20sIHAtdmFsdWUgJD0gMC43MTY1JDogdGhlIHJlc2lkdWFscyBhcmUgd2hpdGUgbm9pc2UuCgpgYGB7cn0KcmVzXzA5IDwtIG0wOSRyZXNpZHVhbHMKamFycXVlLmJlcmEudGVzdChyZXNfMDkpCmBgYAoKSmFycXVl4oCTQmVyYTogJFheMiA9IDAuMTEwNTckLCBwLXZhbHVlICQ9IDAuOTQ2MiQ6IG5vcm1hbGl0eSBpcyBub3QgcmVqZWN0ZWQuCgoqKkNvbmNsdXNpb24uKiogQVJJTUEoNCwxLDApIGlzIGFkZXF1YXRlIGZvciBgWTA5YC4KCgojIyMgTW9kZWwgMTAKCiMjIyMgQUNGICYgUEFDRiBTZXJpZXMgMTAKCmBgYHtyfQpwX2FjZiAgPC0gZ2dBY2YoZGYkWTEwLCBsYWcubWF4ID0gMzYpICsgZ2d0aXRsZSgiQUNGIFkxMCIpIApwX3BhY2YgPC0gZ2dQYWNmKGRmJFkxMCwgbGFnLm1heCA9IDM2KSArIGdndGl0bGUoIlBBQ0YgWTEwIikgCgpwX2FjZiB8IHBfcGFjZgpgYGAKClRoZSBBQ0YgaXMgYSBkYW1wZWQgc2luZSB3YXZlOiBwb3NpdGl2ZSBhdCBsYWdzIDEgYW5kIDIsIG5lZ2F0aXZlIGF0IGxhZ3MgMyB0byA2LCBwb3NpdGl2ZSBhZ2FpbiBhcm91bmQgbGFncyA4IHRvIDEwLCBhbmQgbmVnbGlnaWJsZSBhZnRlciBhYm91dCBsYWcgMTIuIFRoZSBQQUNGIGhhcyB0d28gc2lnbmlmaWNhbnQgc3Bpa2VzIChhYm91dCAwLjc2IGF0IGxhZyAxIGFuZCAkLTAuNjAkIGF0IGxhZyAyKSBhbmQgY3V0cyBvZmYgYWZ0ZXJ3YXJkcy4gVGhpcyBpcyB0aGUgcGF0dGVybiBvZiBhbiAqKkFSKDIpKiogcHJvY2VzcyB3aXRoIGNvbXBsZXggcm9vdHMuCgojIyMjIFN0YXRpb25hcml0eSBUZXN0CgpgYGB7cn0KYWRmLnRlc3QoZGYkWTEwKQpgYGAKCkFERjogRGlja2V54oCTRnVsbGVyICQ9IC0yMS4yNzgkLCBwLXZhbHVlICRcbGUgMC4wMSQsIHNvIHRoZSB1bml0IHJvb3QgaXMgcmVqZWN0ZWQuCgpgYGB7cn0KcHAudGVzdChkZiRZMTApCmBgYAoKUFA6ICRaKFxhbHBoYSkgPSAtMTQ1Mi42JCwgcC12YWx1ZSAkXGxlIDAuMDEkLCBzbyB0aGUgdW5pdCByb290IGlzIHJlamVjdGVkLgoKYGBge3J9Cmtwc3MudGVzdChkZiRZMTApCmBgYAoKS1BTUzogc3RhdGlzdGljICQ9IDAuMDk0NzckLCBwLXZhbHVlICRcZ2UgMC4xMCQsIHNvIGxldmVsIHN0YXRpb25hcml0eSBpcyBub3QgcmVqZWN0ZWQuICoqYFkxMGAgaXMgc3RhdGlvbmFyeSoqICgkZCA9IDAkKSwgYW5kIHRoZSB0ZW50YXRpdmUgbW9kZWwgaXMgKipBUklNQSgyLDAsMCkgd2l0aCBhIG5vbi16ZXJvIG1lYW4qKi4KCiMjIyMgUGFyYW1ldGVyIEVzdGltYXRpb24KCmBgYHtyfQp0c18xMCA8LSB0cyhkYXRhPWRmJFkxMCkKbTEwIDwtIEFyaW1hKHRzXzEwLCBvcmRlciA9IGMoMiwwLDApKQpzdW1tYXJ5KG0xMCkKYGBgCgpUaGUgZXN0aW1hdGVzIGFyZSAkXGhhdFxwaGlfMSA9IDEuMjEzMSQsICRcaGF0XHBoaV8yID0gLTAuNjAxOCQgYW5kICRcaGF0XG11ID0gNDkuOTc5NCQsIHdpdGggJFxoYXRcc2lnbWFfYV4yID0gNC4wOTQkLCBBSUMgJD0kIEFJQ2MgJD0gNDI0NzkuNzMkIGFuZCBCSUMgJD0gNDI1MDguNTckLiAKCmBgYHtyfQpjb2VmdGVzdChtMTApCmBgYAoKQWxsIHBhcmFtZXRlcnMgYXJlIGhpZ2hseSBzaWduaWZpY2FudCAoJHogPSAxNTEuOTEkLCAkLTc1LjMyJCBhbmQgJDk2MC4zOCQpLgoKIyMjIyBGaXR0ZWQgTW9kZWwgRXF1YXRpb24KClRoZSBnZW5lcmFsIGZvcm0gb2YgQVJJTUEoMiwwLDApIHdpdGggbWVhbiAkXG11JCBpcwoKJCQKKDEtXHBoaV8xQi1ccGhpXzJCXjIpXCwoWV90LVxtdSkgPSBhX3QgLgokJAoKV2l0aCB0aGUgZXN0aW1hdGVzLAoKJCQKKDEgLSAxLjIxMzFCICsgMC42MDE4Ql4yKVwsKFlfdCAtIDQ5Ljk3OTQpID0gYV90ICwKJCQKCndoaWNoIGV4cGFuZHMgdG8KCiQkCllfdCA9IDE5LjQyODEgKyAxLjIxMzFcLFlfe3QtMX0gLSAwLjYwMThcLFlfe3QtMn0gKyBhX3QsXHFxdWFkIGFfdCBcc2ltIFxtYXRoY2Fse059KDAsXCA0LjA5NCksCiQkCgp3aGVyZSAkMTkuNDI4MSA9IDQ5Ljk3OTQgXHRpbWVzICgxIC0gMS4yMTMxICsgMC42MDE4KSQuCgojIyMjIENvbXBhcmlzb24gd2l0aCBhdXRvLmFyaW1hKCkKCmBgYHtyfQphYTEwIDwtIGF1dG8uYXJpbWEodHNfMTAsIG1heC5wID0gMTAsIG1heC5xID0gMTApCmFhMTAKYGBgCgpgYXV0by5hcmltYSgpYCBzZWxlY3RzIHRoZSBzYW1lIG1vZGVsLCBBUklNQSgyLDAsMCkgd2l0aCBhIG5vbi16ZXJvIG1lYW4sIHdpdGggaWRlbnRpY2FsIGVzdGltYXRlcy4gQm90aCBhcHByb2FjaGVzIGFncmVlLgoKIyMjIyBEaWFnbm9zdGljIENoZWNraW5nCgpgYGB7cn0KY2hlY2tyZXNpZHVhbHMobTEwKQpgYGAKCkxqdW5n4oCTQm94OiAkUV4qID0gNy44MTU5JCB3aXRoIDggZGVncmVlcyBvZiBmcmVlZG9tLCBwLXZhbHVlICQ9IDAuNDUxNyQ6IHRoZSByZXNpZHVhbHMgYXJlIHdoaXRlIG5vaXNlLgoKYGBge3J9CnJlc18xMCA8LSBtMTAkcmVzaWR1YWxzCmphcnF1ZS5iZXJhLnRlc3QocmVzXzEwKQpgYGAKCkphcnF1ZeKAk0JlcmE6ICRYXjIgPSAxLjMzODgkLCBwLXZhbHVlICQ9IDAuNTEyJDogbm9ybWFsaXR5IGlzIG5vdCByZWplY3RlZC4KCioqQ29uY2x1c2lvbi4qKiBBUklNQSgyLDAsMCkgd2l0aCBhIG5vbi16ZXJvIG1lYW4gaXMgYWRlcXVhdGUgZm9yIGBZMTBgLgoKCiMjIyBNYW51YWwgdnMgYXV0by5hcmltYSgpCgpUaGUgdGFibGUgYmVsb3cgY29sbGVjdHMsIGZvciBldmVyeSBzZXJpZXMsIHRoZSBtYW51YWxseSBpZGVudGlmaWVkIG1vZGVsIGFuZCB0aGUgbW9kZWwgY2hvc2VuIGJ5IGBhdXRvLmFyaW1hKClgLCB0b2dldGhlciB3aXRoIHRoZWlyIEFJQ2MgYW5kIEJJQywgdGhlIG51bWJlciBvZiBpbnNpZ25pZmljYW50IGNvZWZmaWNpZW50cyAocC12YWx1ZSAkPiAwLjA1JCkgaW4gdGhlIGF1dG9tYXRpYyBtb2RlbCwgYW5kIHRoZSBManVuZ+KAk0JveCBwLXZhbHVlcyBjb21wdXRlZCB3aXRoIHRoZSBzYW1lIGxhZyBjaG9pY2UgYXMgYGNoZWNrcmVzaWR1YWxzKClgLgoKYGBge3J9Cm1hbnVhbCA8LSBsaXN0KFkwMSA9IG0wMSwgWTAyID0gbTAyLCBZMDMgPSBtMDMsIFkwNCA9IG0wNCwgWTA1ID0gbTA1LAogICAgICAgICAgICAgICBZMDYgPSBtMDYsIFkwNyA9IG0wNywgWTA4ID0gbTA4LCBZMDkgPSBtMDksIFkxMCA9IG0xMCkKYXV0byAgIDwtIGxpc3QoWTAxID0gYWEwMSwgWTAyID0gYWEwMiwgWTAzID0gYWEwMywgWTA0ID0gYWEwNCwgWTA1ID0gYWEwNSwKICAgICAgICAgICAgICAgWTA2ID0gYWEwNiwgWTA3ID0gYWEwNywgWTA4ID0gYWEwOCwgWTA5ID0gYWEwOSwgWTEwID0gYWExMCkKCm1vZGVsX2xhYmVsIDwtIGZ1bmN0aW9uKGZpdCkgewogIG8gPC0gYXJpbWFvcmRlcihmaXQpCiAgc3ByaW50ZigiQVJJTUEoJWQsJWQsJWQpIiwgb1sxXSwgb1syXSwgb1szXSkKfQpuX2luc2lnbmlmaWNhbnQgPC0gZnVuY3Rpb24oZml0KSB7CiAgY3QgPC0gY29lZnRlc3QoZml0KQogIHN1bShjdFshcm93bmFtZXMoY3QpICVpbiUgYygiaW50ZXJjZXB0IiwgImRyaWZ0IiksIDRdID4gMC4wNSkKfQpsanVuZ19ib3hfcCA8LSBmdW5jdGlvbihmaXQpIHsKICBrIDwtIHN1bShmaXQkYXJtYVsxOjJdKSAgICAgICAgICAgICAgICAgICAgICAgIyBudW1iZXIgb2YgQVIgKyBNQSBjb2VmZmljaWVudHMKICBCb3gudGVzdChyZXNpZHVhbHMoZml0KSwgbGFnID0gbWF4KGsgKyAzLCAxMCksIHR5cGUgPSAiTGp1bmctQm94IiwgZml0ZGYgPSBrKSRwLnZhbHVlCn0KCmNvbXBhcmlzb24gPC0gdGliYmxlKAogIFNlcmllcyAgICAgICAgICAgICAgICAgICAgICAgPSBuYW1lcyhtYW51YWwpLAogIE1hbnVhbCAgICAgICAgICAgICAgICAgICAgICAgPSBtYXBfY2hyKG1hbnVhbCwgbW9kZWxfbGFiZWwpLAogIGBhdXRvLmFyaW1hYCAgICAgICAgICAgICAgICAgPSBtYXBfY2hyKGF1dG8sIG1vZGVsX2xhYmVsKSwKICBBZ3JlZSAgICAgICAgICAgICAgICAgICAgICAgID0gTWFudWFsID09IGBhdXRvLmFyaW1hYCwKICBgQUlDYyBtYW51YWxgICAgICAgICAgICAgICAgID0gbWFwX2RibChtYW51YWwsICJhaWNjIiksCiAgYEFJQ2MgYXV0b2AgICAgICAgICAgICAgICAgICA9IG1hcF9kYmwoYXV0bywgImFpY2MiKSwKICBgQklDIG1hbnVhbGAgICAgICAgICAgICAgICAgID0gbWFwX2RibChtYW51YWwsICJiaWMiKSwKICBgQklDIGF1dG9gICAgICAgICAgICAgICAgICAgID0gbWFwX2RibChhdXRvLCAiYmljIiksCiAgYEluc2lnbmlmaWNhbnQgY29lZi4gKGF1dG8pYCA9IG1hcF9pbnQoYXV0bywgbl9pbnNpZ25pZmljYW50KSwKICBgTGp1bmctQm94IHAgKG1hbnVhbClgICAgICAgID0gbWFwX2RibChtYW51YWwsIGxqdW5nX2JveF9wKSwKICBgTGp1bmctQm94IHAgKGF1dG8pYCAgICAgICAgID0gbWFwX2RibChhdXRvLCBsanVuZ19ib3hfcCkKKSAlPiUKICBtdXRhdGUoYWNyb3NzKHdoZXJlKGlzLmRvdWJsZSksIH4gcm91bmQoLngsIDMpKSkKCmNvbXBhcmlzb24KYGBgCgoqKkFncmVlbWVudC4qKiBgYXV0by5hcmltYSgpYCByZXByb2R1Y2VzIHRoZSBtYW51YWwgbW9kZWwgZXhhY3RseSBmb3IgZm91ciBzZXJpZXM6IGBZMDJgIChBUigxKSksIGBZMDRgIChNQSgyKSksIGBZMDlgIChBUklNQSg0LDEsMCkpIGFuZCBgWTEwYCAoQVIoMikpLiBUaGVzZSBhcmUgbG93LW9yZGVyIG1vZGVscyB3aXRoIHNpbXBsZSBBQ0YvUEFDRiBwYXR0ZXJucywgYW5kIGJvdGggYXBwcm9hY2hlcyBnaXZlIGlkZW50aWNhbCBlc3RpbWF0ZXMuIFRoZSBvcmRlciBvZiBkaWZmZXJlbmNpbmcgY2hvc2VuIGJ5IGBhdXRvLmFyaW1hKClgIGlzIGNvcnJlY3QgZm9yIGFsbCB0ZW4gc2VyaWVzLCBzbyBpdHMgS1BTUy1iYXNlZCBjaG9pY2Ugb2YgJGQkIGFncmVlcyB3aXRoIHRoZSB1bml0LXJvb3QgdGVzdHMgdXNlZCBoZXJlLgoKKipPbmUgZXh0cmEsIGluc2lnbmlmaWNhbnQgdGVybS4qKiBGb3IgYFkwNWAgYW5kIGBZMDZgLCBgYXV0by5hcmltYSgpYCBhZGRzIG9uZSBwYXJhbWV0ZXIgdGhhdCBpcyBub3Qgc2lnbmlmaWNhbnQgKGBhcjdgIGluIEFSKDcpLCAkeiBcYXBwcm94IDEuODUkOyBgYXIxYCBpbiBBUk1BKDEsMSksICR6IFxhcHByb3ggMC43NCQpLiBGb3IgYFkwNWAsIHRoZSBBSUNjIG9mIEFSKDcpIGlzIG9ubHkgMS40MSB1bml0cyBsb3dlciwgYSBkaWZmZXJlbmNlIGJlbG93IDIgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBhIHJlYWwgaW1wcm92ZW1lbnQsIGFuZCBCSUMgcHJlZmVycyBBUig2KS4gRm9yIGBZMDZgLCB0aGUgc2VsZWN0ZWQgQVJNQSgxLDEpIGV2ZW4gaGFzIGEgKmhpZ2hlciogZXhhY3QgQUlDYyAoYnkgMS40NSkgYW5kIEJJQyAoYnkgOC42NikgdGhhbiBNQSgxKS4KCioqU2V2ZXJhbCBleHRyYSB0ZXJtcy4qKiBGb3IgYFkwOGAsIEFSSU1BKDcsMSwzKSBoYXMgYSBsb3dlciBBSUNjIHRoYW4gQVJJTUEoMiwxLDMpIChieSA3LjIxKSBidXQgYSBoaWdoZXIgQklDIChieSAyOC44MikgYW5kIHNpeCBpbnNpZ25pZmljYW50IGNvZWZmaWNpZW50cy4gVGhlIGV4dHJhIEFSIHRlcm1zIG1vZGVsIGEgdGlueSBhbW91bnQgb2YgcmVzaWR1YWwgYXV0b2NvcnJlbGF0aW9uIHRoYXQgaXMgc3RhdGlzdGljYWxseSBkZXRlY3RhYmxlIG9ubHkgYmVjYXVzZSAkbiQgaXMgc28gbGFyZ2UuCgoqKk92ZXItcGFyYW1ldGVyaXNlZCBsb2NhbCBvcHRpbWEuKiogRm9yIGBZMDFgLCBgWTAzYCBhbmQgYFkwN2AsIGBhdXRvLmFyaW1hKClgIHJldHVybnMgbGFyZ2UgbW9kZWxzLCBBUklNQSg5LDEsNiksIEFSSU1BKDEwLDAsMikgYW5kIEFSSU1BKDEwLDAsMyksIHdob3NlIEFJQ2MgaXMgd29yc2UgdGhhbiB0aGF0IG9mIHRoZSBtYW51YWwgbW9kZWwgYnkgMTIwLjIsIDQwOS40IGFuZCAyMC45IHVuaXRzLCByZXNwZWN0aXZlbHkgKEJJQyBpcyB3b3JzZSBieSAxNzAuNiwgNDM4LjIgYW5kIDU3LjAgdW5pdHMpLiBIZXJlIHRoZSBhdXRvbWF0aWMgc2VhcmNoIGZhaWxlZCBieSBpdHMgb3duIHN0YW5kYXJkLCBiZWNhdXNlIGl0IGRpZCBub3QgZmluZCB0aGUgbW9kZWwgd2l0aCB0aGUgc21hbGxlc3QgQUlDYy4KCioqQ29uY2x1c2lvbi4qKiBUaGUgbWFudWFsIEJveOKAk0plbmtpbnMgYXBwcm9hY2ggcmVjb3ZlcmVkIHRoZSBkYXRhLWdlbmVyYXRpbmcgbW9kZWwgZm9yIGFsbCB0ZW4gc2VyaWVzIGFuZCBwcm9kdWNlZCBwYXJzaW1vbmlvdXMgbW9kZWxzIHdpdGggc2lnbmlmaWNhbnQgY29lZmZpY2llbnRzIGFuZCB3ZWxsLWJlaGF2ZWQgcmVzaWR1YWxzLiBJdCBjb21iaW5lZCBjdXQtb2ZmIHBhdHRlcm5zIGluIHRoZSBBQ0YgYW5kIFBBQ0YsIHNpZ25pZmljYW5jZSB0ZXN0cywgcmVzaWR1YWwgZGlhZ25vc3RpY3MsIGFuZCBhbiBleGhhdXN0aXZlIGluZm9ybWF0aW9uLWNyaXRlcmlvbiBzZWFyY2ggcmVzZXJ2ZWQgZm9yIHRoZSBnZW51aW5lbHkgbWl4ZWQgbW9kZWxzLiBgYXV0by5hcmltYSgpYCBpcyBhIHZhbHVhYmxlIGFuZCBmYXN0IGJlbmNobWFyaywgZXNwZWNpYWxseSBmb3IgbG93LW9yZGVyIG1vZGVscywgYnV0IGl0cyBvdXRwdXQgc2hvdWxkIGJlIGNoZWNrZWQgcmF0aGVyIHRoYW4gYWNjZXB0ZWQgYmxpbmRseS4gQSBtb3JlIHRob3JvdWdoIGF1dG9tYXRpYyBzZWFyY2ggaXMgYXZhaWxhYmxlIHRocm91Z2ggYGF1dG8uYXJpbWEoeSwgc3RlcHdpc2UgPSBGQUxTRSwgYXBwcm94aW1hdGlvbiA9IEZBTFNFLCBtYXgub3JkZXIgPSAxNSwgaWMgPSAiYmljIilgLCBhdCBhIG11Y2ggaGlnaGVyIGNvbXB1dGF0aW9uYWwgY29zdCBmb3Igc2VyaWVzIG9mIHRoaXMgbGVuZ3RoLgoKIyMgU3VtbWFyeQoKYGBge3Igc3VtbWFyeS1wbG90LCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTI1LCBmaWcud2lkdGg9MTh9CiMgLS0tLSBIZWxwZXIgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmZtdDQgPC0gZnVuY3Rpb24oeCkgZm9ybWF0QyhhYnMoeCksIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gNCkKCiMgTXVsdGlwbHkgdHdvIHBvbHlub21pYWxzIGluIEIgKGNvZWZmaWNpZW50cyBpbiBpbmNyZWFzaW5nIHBvd2VycyBvZiBCKQpwb2x5X211bHQgPC0gZnVuY3Rpb24oYSwgYikgewogIG91dCA8LSBudW1lcmljKGxlbmd0aChhKSArIGxlbmd0aChiKSAtIDEpCiAgZm9yIChpIGluIHNlcV9hbG9uZyhhKSkgZm9yIChqIGluIHNlcV9hbG9uZyhiKSkKICAgIG91dFtpICsgaiAtIDFdIDwtIG91dFtpICsgaiAtIDFdICsgYVtpXSAqIGJbal0KICBvdXQKfQoKIyBFeHBsaWNpdCBmb3JtICBZX3QgPSBjICsgc3VtKHBzaV9rIFlfe3Qta30pICsgYV90ICsgc3VtKHRoZXRhX2ogYV97dC1qfSksCiMgd2l0aCAxIC0gcHNpXzEgQiAtIHBzaV8yIEJeMiAtIC4uLiA9IHBoaShCKSgxIC0gQileZCAgYW5kICBjID0gbXUgKDEgLSBzdW0ocGhpKSkuCiMgUmV0dXJucyBwbG90bWF0aCBzdHJpbmdzLCBvbmUgcGVyIGxpbmUgb2YgdGhlIGVxdWF0aW9uLCBwbHVzIHRoZSBpbm5vdmF0aW9uIHZhcmlhbmNlLgpleHBsaWNpdF9saW5lcyA8LSBmdW5jdGlvbihmaXQsIHBlcl9saW5lID0gNCkgewogIGNmICA8LSBjb2VmKGZpdCkKICBwaGkgPC0gY2ZbZ3JlcGwoIl5hciIsIG5hbWVzKGNmKSldCiAgdGggIDwtIGNmW2dyZXBsKCJebWEiLCBuYW1lcyhjZikpXQogIGQgICA8LSBmaXQkYXJtYVs2XQoKICBhcl9wb2x5IDwtIGMoMSwgLXBoaSkKICBmb3IgKGsgaW4gc2VxX2xlbihkKSkgYXJfcG9seSA8LSBwb2x5X211bHQoYXJfcG9seSwgYygxLCAtMSkpCiAgcHNpIDwtIC1hcl9wb2x5Wy0xXQogIGNvbnN0IDwtIGlmICgiaW50ZXJjZXB0IiAlaW4lIG5hbWVzKGNmKSkgdW5uYW1lKGNmWyJpbnRlcmNlcHQiXSkgKiAoMSAtIHN1bShwaGkpKSBlbHNlIDAKCiAgdGVybXMgPC0gbGlzdCgpCiAgYWRkX3Rlcm0gPC0gZnVuY3Rpb24odmFsdWUsIGJvZHkpIHRlcm1zW1tsZW5ndGgodGVybXMpICsgMV1dIDw8LSBsaXN0KG5lZyA9IHZhbHVlIDwgMCwgYm9keSA9IGJvZHkpCiAgaWYgKGNvbnN0ICE9IDApIGFkZF90ZXJtKGNvbnN0LCBzcHJpbnRmKCciJXMiJywgZm10NChjb25zdCkpKQogIGZvciAoayBpbiBzZXFfYWxvbmcocHNpKSkgewogICAgYm9keSA8LSBpZiAoYWJzKGFicyhwc2lba10pIC0gMSkgPCAxZS04KSBzcHJpbnRmKCJZW3QgLSAlZF0iLCBrKQogICAgICAgICAgICBlbHNlIHNwcmludGYoJyIlcyIgKiBZW3QgLSAlZF0nLCBmbXQ0KHBzaVtrXSksIGspCiAgICBhZGRfdGVybShwc2lba10sIGJvZHkpCiAgfQogIGFkZF90ZXJtKDEsICJhW3RdIikKICBmb3IgKGogaW4gc2VxX2Fsb25nKHRoKSkgYWRkX3Rlcm0odGhbal0sIHNwcmludGYoJyIlcyIgKiBhW3QgLSAlZF0nLCBmbXQ0KHRoW2pdKSwgaikpCgogIGdyb3VwcyA8LSBzcGxpdChzZXFfYWxvbmcodGVybXMpLCBjZWlsaW5nKHNlcV9hbG9uZyh0ZXJtcykgLyBwZXJfbGluZSkpCiAgbGluZXMgPC0gbWFwX2NocihzZXFfYWxvbmcoZ3JvdXBzKSwgZnVuY3Rpb24oZykgewogICAgdHh0IDwtICIiCiAgICBmb3IgKGkgaW4gZ3JvdXBzW1tnXV0pIHsKICAgICAgdG0gPC0gdGVybXNbW2ldXQogICAgICBpZiAoZyA9PSAxICYmIGkgPT0gZ3JvdXBzW1tnXV1bMV0pIHsKICAgICAgICB0eHQgPC0gcGFzdGUwKGlmICh0bSRuZWcpICItICIgZWxzZSAiIiwgdG0kYm9keSkKICAgICAgfSBlbHNlIHsKICAgICAgICB0eHQgPC0gcGFzdGUodHh0LCBpZiAodG0kbmVnKSAiLSIgZWxzZSAiKyIsIHRtJGJvZHkpCiAgICAgIH0KICAgIH0KICAgIGlmIChnID09IDEpIHBhc3RlKCJZW3RdID09IiwgdHh0KSBlbHNlIHRyaW13cyh0eHQpCiAgfSkKICBjKGxpbmVzLCBzcHJpbnRmKCdhW3RdICUlfiUlIE4oMCwgIiVzIiknLCBmb3JtYXRDKGZpdCRzaWdtYTIsIGZvcm1hdCA9ICJmIiwgZGlnaXRzID0gNCkpKQp9CgojIC0tLS0gT25lIHJvdyBvZiBwYW5lbHMgcGVyIHNlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3VtbWFyeV9yb3cgPC0gZnVuY3Rpb24oZml0LCBuYW1lKSB7CiAgeSAgICAgPC0gdHMoZGZbW25hbWVdXSkKICBkICAgICA8LSBmaXQkYXJtYVs2XQogIHcgICAgIDwtIGlmIChkID4gMCkgZGlmZih5LCBkaWZmZXJlbmNlcyA9IGQpIGVsc2UgeQogIGxhYl93IDwtIGlmIChkID4gMCkgcGFzdGUwKCJkaWZmKCIsIG5hbWUsICIpIikgZWxzZSBuYW1lCiAgdGl0bGUgPC0gcGFzdGUwKG5hbWUsICI6ICIsIG1vZGVsX2xhYmVsKGZpdCksCiAgICAgICAgICAgICAgICAgIGlmICgiaW50ZXJjZXB0IiAlaW4lIG5hbWVzKGNvZWYoZml0KSkpICIgd2l0aCBub24temVybyBtZWFuIiBlbHNlICIiKQoKICBwX29yaWcgPC0gZ2dwbG90KHRpYmJsZSh0ID0gYXMubnVtZXJpYyh0aW1lKHkpKSwgdmFsdWUgPSBhcy5udW1lcmljKHkpKSwgYWVzKHQsIHZhbHVlKSkgKwogICAgZ2VvbV9saW5lKGNvbG91ciA9ICJzdGVlbGJsdWUiKSArCiAgICBsYWJzKHRpdGxlID0gcGFzdGUwKG5hbWUsICI6IG9yaWdpbmFsIHNlcmllcyIpLCB4ID0gInQiLCB5ID0gTlVMTCkgKwogICAgdGhlbWVfYncoYmFzZV9zaXplID0gOCkKCiAgcF9kaWZmIDwtIGlmIChkID4gMCkgewogICAgZ2dwbG90KHRpYmJsZSh0ID0gYXMubnVtZXJpYyh0aW1lKHcpKSwgdmFsdWUgPSBhcy5udW1lcmljKHcpKSwgYWVzKHQsIHZhbHVlKSkgKwogICAgICBnZW9tX2xpbmUoY29sb3VyID0gImRhcmtvcmFuZ2UiKSArCiAgICAgIGxhYnModGl0bGUgPSBwYXN0ZTAobmFtZSwgIjogZmlyc3QgZGlmZmVyZW5jZSIpLCB4ID0gInQiLCB5ID0gTlVMTCkgKwogICAgICB0aGVtZV9idyhiYXNlX3NpemUgPSA4KQogIH0gZWxzZSB7CiAgICBnZ3Bsb3QoKSArCiAgICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAuNSwgeSA9IDAuNSwgc2l6ZSA9IDMsCiAgICAgICAgICAgICAgIGxhYmVsID0gIlN0YXRpb25hcnkgKGQgPSAwKTpcbm5vIGRpZmZlcmVuY2luZyBuZWVkZWQiKSArCiAgICAgIHhsaW0oMCwgMSkgKyB5bGltKDAsIDEpICsKICAgICAgbGFicyh0aXRsZSA9IHBhc3RlMChuYW1lLCAiOiBmaXJzdCBkaWZmZXJlbmNlIikpICsKICAgICAgdGhlbWVfdm9pZChiYXNlX3NpemUgPSA4KQogIH0KCiAgcF9hY2YgIDwtIGdnQWNmKHcsIGxhZy5tYXggPSAzNikgKwogICAgbGFicyh0aXRsZSA9IHBhc3RlKCJBQ0Ygb2YiLCBsYWJfdyksIHkgPSBOVUxMKSArIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDgpCiAgcF9wYWNmIDwtIGdnUGFjZih3LCBsYWcubWF4ID0gMzYpICsKICAgIGxhYnModGl0bGUgPSBwYXN0ZSgiUEFDRiBvZiIsIGxhYl93KSwgeSA9IE5VTEwpICsgdGhlbWVfYncoYmFzZV9zaXplID0gOCkKCiAgZXEgICAgPC0gZXhwbGljaXRfbGluZXMoZml0KQogIHlfcG9zIDwtIHNlcSgwLjg1LCBieSA9IC0wLjIsIGxlbmd0aC5vdXQgPSBsZW5ndGgoZXEpKQogIHBfZXEgIDwtIGdncGxvdCgpICsKICAgIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAsIHkgPSB5X3BvcywgbGFiZWwgPSBlcSwgcGFyc2UgPSBUUlVFLCBoanVzdCA9IDAsIHNpemUgPSAzLjYpICsKICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBleHBhbmQgPSBjKDAsIDApKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSkgKwogICAgbGFicyh0aXRsZSA9IHRpdGxlKSArCiAgICB0aGVtZV92b2lkKGJhc2Vfc2l6ZSA9IDgpCgogIGxpc3QocF9vcmlnLCBwX2RpZmYsIHBfYWNmLCBwX3BhY2YsIHBfZXEpCn0KCiMgLS0tLSBBc3NlbWJsZSB0aGUgZmlndXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcGFuZWxzIDwtIGltYXAobWFudWFsLCBzdW1tYXJ5X3JvdykKCnN1bW1hcnlfcGxvdCA8LSB3cmFwX3Bsb3RzKHVubGlzdChwYW5lbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSwgbmNvbCA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyA9IGMoMS4zLCAxLjMsIDEsIDEsIDEuOSkpICsKICBwbG90X2Fubm90YXRpb24oCiAgICB0aXRsZSAgICA9ICJTdW1tYXJ5IG9mIHRoZSB0ZW4gZml0dGVkIEFSSU1BIG1vZGVscyIsCiAgICBzdWJ0aXRsZSA9ICJPcmlnaW5hbCBzZXJpZXMsIGZpcnN0IGRpZmZlcmVuY2UgKHdoZW4gZCA9IDEpLCBBQ0YgYW5kIFBBQ0Ygb2YgdGhlIHN0YXRpb25hcnkgc2VyaWVzLCBhbmQgdGhlIGV4cGxpY2l0IGZpdHRlZCBlcXVhdGlvbiIKICApCmBgYAo=