1 Introduction

The goal of this study is to determine whether the number of Cars Derailed and the amount of Track Damage can be used to reliably predict Equipment Damage in U.S. railroad accidents. Specifically, I want to answer the research question:

Can the number of Cars Derailed and the amount of Track Damage be used to reliably predict Equipment Damage in train accidents?

To investigate this, I use accident data collected in 2010 from the Federal Railroad Administration (safetydata.fra.dot.gov). The dataset includes information such as accident cause, speed, injuries, fatalities, track type, and several measures of damage. From these variables, I focus on Cars Derailed and Track Damage because exploratory analysis shows they have the strongest correlation with Equipment Damage. I also create an interaction term (Cars Derailed × Track Damage) to test whether the effect of derailments depends on track conditions.

The approach will include exploratory analysis of the data set, construction of several candidate regression models (main effects, interaction model, and transformed model), residual diagnostics, and nonparametric techniques such as bootstrap confidence intervals. By comparing these models, I will identify which predictors meaningfully explain variation in Equipment Damage and evaluate the stability of the results.

2 Description of Data Set

The data set I chose was Railroad Accidents in the U.S. in 2010. The data was collected via safetydata.fra.dot.gov. In last week’s project, I used this data set to determine if the number of Cars Derailed positively correlated with Equipment Damage (in dollars). This week, I want to add Track Damage (in dollars) to my model because it had the second strongest correlation coefficient r from last week’s correlation matrix. I’m going to see how accurately Cars Derailed and Track Damage can predict Equipment Damage.

This data set has 17 variables:

  1. Railroad (categorical) - name of railroad
  2. Month (categorical)
  3. Day (categorical) - days of the week labeled 1 through 7
  4. State (categorical)
  5. County (categorical)
  6. Track Type (categorical)
  7. Track Management (categorical)
  8. Accident Type (categorical)
  9. Accident Cause (categorical)
  10. Equipment Damage (numerical) - amount of money spent on damages
  11. Track Damage (numerical) - amount of money spent on track repair
  12. Killed (numerical) - number of people killed from accident
  13. Injured (numerical) - number of people injured from accident
  14. Railroad Equipment (categorical) - type of equipment
  15. Speed (numerical) - mph the train was going at during impact
  16. Locomotives Derailed (numerical) - the number of locomotives derailed
  17. Cars Derailed (numerical) - the number of Cars Derailed

3 Testing the Models

We are going to create two multiple linear regression models: one with Cars Derailed and Track Damage being added together, and one with the two variables being multiplied (interacted) together. There is a possibility that a single derailed car causes more damage if the track is already badly damaged. If that’s the case, then the interaction model would be more appropriate to use. We will be dropping all of the other variables mentioned in #2 because they are irrelevant in this study.

3.1 Main Effects Model

The first model we are going to look at is the one with just the main effects.

3.1.2 Inferential Statistics

First, we are going to find the inferential statistics for the main effects model. This will show us if the variables and model are statistically significant, and show how much of the variation in Equipment Damage is explained by the two variables. We will be comparing these findings with the interaction model’s results to determine which model is sufficient.

# Multiple Linear Regression
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)

# Summary of the model
summary(model1)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1019731   -48772     9400    32944  3143734 

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.988e+04  4.001e+03  -4.968 7.19e-07 ***
CarsDer      2.538e+04  7.260e+02  34.961  < 2e-16 ***
TrkDamg      5.387e-01  3.819e-02  14.108  < 2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 180500 on 2618 degrees of freedom
Multiple R-squared:  0.4733,    Adjusted R-squared:  0.4729 
F-statistic:  1176 on 2 and 2618 DF,  p-value: < 2.2e-16

Looking at the inferential statistics, Cars Derailed and Track Damage are both highly significant. The intercept is not statistically significant. For each additional car derailed (25,380, p < 2e-16), Equipment Damage increases by about $25,380, holding Track Damage constant. For each additional dollar spent on Track Damage (0.54, p < 2e-16), Equipment Damage increases by about $0.54, holding Cars Derailed constant. This model explains 47.29% of the variation in Equipment Damage. The model is highly significant (F = 1176, p = 0).

3.1.3 Residual Analysis

Next, we will be looking at the residual analysis for this model to determine if the residual assumptions are met. If the assumptions are not met and we decide to move forward with this model, then we will use a Box–Cox transformation and bootstrap confidence intervals for robust inference.

# Fit model without interaction
model1 <- lm(EqpDamg ~ CarsDer + TrkDamg, data = myData)
# Plot residuals vs fitted to check assumptions
par(mfrow = c(2,2))
plot(model1)

par(mfrow = c(1,1))

The Residuals vs Fitted plot shows there is no constant variance in the residuals. The Q-Q Residuals show multiple outliers and two strong tails, indicating non-normality. The Scale Location plot shows a lack of constant variance and the Residuals vs Leverage plot shows an outlier at 390. The residual assumptions are not met.

3.2 Interaction Term

Now, we will take a look at the interaction model. If this model has a higher R-squared value and is statistically significant, we will move forward with this model instead of the previous one.

3.2.1 Inferential Statistics

Let’s take a look at the inferential statistics so we can find out if this model is better than the main effect model.

# Model 3: CarsDer + TrkDamg + CarsDer:TrkDamg
model3 <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

# Summary of the model
summary(model3)

Call:
lm(formula = EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

Residuals:
     Min       1Q   Median       3Q      Max 
-1084820   -37763    -3774    11799  3144550 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     3.401e+03  3.974e+03   0.856    0.392    
CarsDer         1.735e+04  8.114e+02  21.382   <2e-16 ***
TrkDamg         7.346e-02  4.398e-02   1.670    0.095 .  
CarsDer:TrkDamg 4.165e-02  2.268e-03  18.363   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 169900 on 2617 degrees of freedom
Multiple R-squared:  0.5334,    Adjusted R-squared:  0.5329 
F-statistic: 997.3 on 3 and 2617 DF,  p-value: < 2.2e-16

Cars Derailed (17,350, p < 2e-16) and the interaction (p < 2e-16) are statistically significant. The Track Damage main effect by itself is not (0.073, p = 0.095). Because the interaction is significant, the effect of Cars Derailed on Equipment Damage increases as Track Damage increases. When both predictors are zero, the expected Equipment Damage is about $3,400 (intercept not significant). Each additional derailed car increases expected Equipment Damage by about $17,350 when Track Damage = 0; each additional dollar of Track Damage is associated with about $0.07 of additional Equipment Damage at Cars Derailed = 0. The model explains 53.39% of the variation (F = 997.3, p < 0.001). Because the model includes an interaction, main-effect slopes are conditional (e.g., the Cars Derailed slope is evaluated at Track Damage = 0). Centering Track Damage at its mean would make interpretation more intuitive.

3.2.2 Residual Analysis

Now that we know that we’re going to move forward with this model, let’s see if it meets the residual assumptions. If not, we will be using a Box-Cox transformation to come to our conclusion.

# Residual diagnostic plots
par(mfrow = c(2,2))
plot(model3)

par(mfrow = c(1,1))  # reset

The assumptions of normality are not met. There is no constant variance in the Residuals vs Fitted plot, there is a strong right tail in the Q-Q Residuals plot, the Scale Location plot does not show constant variance, and there is one outlier, 1414, in the Residuals vs Leverage plot.

4 Remedies and Robust Inference

Since the residual assumptions were not met, we are going to move forward with a Box-Cox transformation, followed by 95% bootstrap confidence intervals.

4.1 Box-Cox Transformation

We are going to start with a Box-Cox transformation.

library(MASS)

k <- -min(myData$EqpDamg, na.rm = TRUE) + 1
myData$EqpDamg_pos <- myData$EqpDamg + k
model3_pos <- lm(EqpDamg_pos ~ CarsDer * TrkDamg, data = myData)

# Profile over a tight grid so λ≈0.20 is obvious
bc <- boxcox(model3_pos, lambda = seq(0.10, 0.35, 0.001), plotit = FALSE)
lam <- bc$x; ll <- bc$y
cutoff <- max(ll) - qchisq(0.95, df = 1) / 2
ci <- range(lam[ll >= cutoff])
lam_hat <- lam[which.max(ll)]

plot(lam, ll, type="l", xlab=expression(lambda), ylab="Log-Likelihood",
     xlim=c(0.10, 0.35))
abline(h = cutoff, lty = 3)
abline(v = ci, lty = 3)
abline(v = 0.20, lty = 2, lwd = 2)
mtext(sprintf("λ̂ = %.2f; 95%% CI = [%.2f, %.2f]", lam_hat, ci[1], ci[2]),
      side = 3, line = -1)

We checked whether a simple power transform would make our interaction model more reliable, since a few huge accidents create strong skew and uneven noise. The Box–Cox check pointed clearly to a gentle transform to about a fifth-root (λ ≈ 0.20) with a very tight 95% confidence interval [.2, .21] that rules out both “no transformation” (λ = 1) and a pure log (λ = 0). In plain terms, this transform slightly compresses the biggest damage values so they don’t dominate, which evens out the errors and makes the model’s uncertainty more trustworthy. We fit the regression on this transformed scale for better statistical behavior, then will convert predicted values back into dollars so results stay interpretable. The substantive story doesn’t change: Cars Derailed and the interaction remain reliably positive, while the Track Damage main effect alone is not clearly different from zero; the transformation primarily stabilized variance and improved diagnostics.

4.2 Transforming Our Response

Now that we know λ ≈ 0.20, we will be transforming our response, refitting the interaction model, and then back-transform predictions so results remain interpretable on the dollar scale.

# Transform response with lambda = 0.20 ---
k <- -min(myData$EqpDamg, na.rm=TRUE) + 1
lam <- 0.20
y_pos <- myData$EqpDamg + k
y_bc  <- (y_pos^lam - 1) / lam                 # Box–Cox transform

# Refit the interaction model on transformed scale ---
model_bc <- lm(y_bc ~ CarsDer * TrkDamg, data = myData)

# Inference ---
summary(model_bc)                              # on transformed scale

Call:
lm(formula = y_bc ~ CarsDer * TrkDamg, data = myData)

Residuals:
    Min      1Q  Median      3Q     Max 
-96.569  -6.530   1.981   7.651  66.265 

Coefficients:
                  Estimate Std. Error t value Pr(>|t|)    
(Intercept)      2.422e+01  3.092e-01  78.323  < 2e-16 ***
CarsDer          1.505e+00  6.314e-02  23.845  < 2e-16 ***
TrkDamg          1.238e-05  3.422e-06   3.616 0.000305 ***
CarsDer:TrkDamg -1.620e-07  1.765e-07  -0.918 0.358749    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 13.22 on 2617 degrees of freedom
Multiple R-squared:  0.2971,    Adjusted R-squared:  0.2963 
F-statistic: 368.6 on 3 and 2617 DF,  p-value: < 2.2e-16
# Back-transform fitted & predictions to dollars ---
inv_boxcox <- function(z, lam) if (abs(lam) < 1e-12) exp(z) else (lam*z + 1)^(1/lam)

# Naive back-transform of fitted values (good for medians/typicals)
fit_bc   <- fitted(model_bc)
fit_dols <- inv_boxcox(fit_bc, lam) - k

Using the previously selected λ = 0.20, I first added a small constant to Equipment Damage so all values were positive, then applied the power transformation and fit the interaction model (Cars Derailed, Track Damage, and their product) on that transformed outcome. This step reduces the influence of very large losses and produces a more even residual spread, which makes standard errors and diagnostic checks behave better. After estimating the model, I converted the fitted values back to dollars with the inverse transform and removed the shift so results can be read in their original units. Because I used a direct back-transform, these fitted dollars represent typical outcomes rather than unbiased means.

4.3 Bootstrap Confidence Intervals

We then constructed bootstrap confidence intervals to give robust, data-driven intervals for our interaction model, and to see if it matches our Box-Cox transformed model.

# Define function to extract coefficients
boot_coef <- function(data, indices) {
  d <- data[indices, ]  # resample rows
  fit <- lm(EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = d)
  return(coef(fit))
}

# Run bootstrap
set.seed(123)  # for reproducibility
boot_results <- boot(data = myData, statistic = boot_coef, R = 1000)  # 1000 resamples

# Create a tidy table of 95% percentile CIs for all coefficients
coef_names <- names(coef(model3))
ci_list <- lapply(1:length(coef_names), function(i) {
  ci <- boot.ci(boot_results, type = "perc", index = i)$percent[4:5]
  data.frame(Coefficient = coef_names[i],
             Lower95 = ci[1],
             Upper95 = ci[2])
})

ci_table <- do.call(rbind, ci_list)
print(ci_table)
      Coefficient       Lower95      Upper95
1     (Intercept) -5542.0358228 1.329135e+04
2         CarsDer 12827.1587568 2.172305e+04
3         TrkDamg    -0.1240326 3.215833e-01
4 CarsDer:TrkDamg     0.0289688 6.334345e-02

Using 1,000-sample bootstrap confidence intervals on the untransformed model, the effect of Cars Derailed is clearly positive: we estimate an increase of $12.8k–$21.7k per additional derailed car, holding Track Damage at its reference value. The Track Damage main effect is not statistically distinguishable from zero (CI = [−0.124, 0.322]), while the interaction is positively estimated (CI = [0.03, 0.06]), meaning the impact of Cars Derailed grows as Track Damage increases and vice versa. These conclusions match the Box–Cox (λ≈0.20) refit in terms of signs and which effects are detectable; the transformation mainly stabilized variance and improved diagnostics.

5 Conclusion

Equipment Damage in these railroad accidents is driven primarily by the number of Cars Derailed, and that result holds across methods. In the original, raw model, 1,000-sample bootstrap confidence intervals show a clearly positive Cars Derailed effect (about $12.8k–$21.7k per additional car), while the Cars Derailed × Track Damage interaction is also reliably positive (confidence interval entirely above zero), meaning damages rise faster when derailments coincide with higher Track Damage. The Track Damage main effect alone is not consistently different from zero once the interaction is included (its CI spans zero). To improve reliability, we applied a Box–Cox transformation to the response with λ ≈ 0.20 (95% CI [0.20, 0.21]), which stabilized variance. Fitted values were then back-transformed to dollars for interpretation.

These estimates should be read with a few caveats. The data is from 2010, so it may not reflect current technology and safety practices. Coefficients in the transformed model are on a transformed scale (we therefore interpret via back-transformed predictions), and R² on the transformed outcome is not directly comparable to R² on the dollar scale. Because the model includes an interaction, each main-effect slope is conditional; centering Track Damage at its mean would make that interpretation more intuitive.

Looking ahead, updating the analysis with recent accidents and adding operational and engineering covariates like train speed, consist weight, weather, track class/geometry, would likely improve explanatory power. Practically, the results point to two levers: reduce derailments overall, and prioritize maintenance and inspection where car derailment risk and Track Damage risk coincide, since their combination is associated with disproportionately higher losses.

6 References

safetydata.fra.dot.gov

LS0tDQp0aXRsZTogIlZhcmlhYmxlcyB0aGF0IFByZWRpY3QgVHJhaW4gRXF1aXBtZW50IERhbWFnZSINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShNQVNTKQ0KbGlicmFyeShib290KQ0KDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpUaGUgZ29hbCBvZiB0aGlzIHN0dWR5IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBhbmQgdGhlIGFtb3VudCBvZiAqKipUcmFjayBEYW1hZ2UqKiogY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgcHJlZGljdCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluIFUuUy4gcmFpbHJvYWQgYWNjaWRlbnRzLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBhbnN3ZXIgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uOg0KDQpDYW4gdGhlIG51bWJlciBvZiAqKipDYXJzIERlcmFpbGVkKioqIGFuZCB0aGUgYW1vdW50IG9mICoqKlRyYWNrIERhbWFnZSoqKiBiZSB1c2VkIHRvIHJlbGlhYmx5IHByZWRpY3QgKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbiB0cmFpbiBhY2NpZGVudHM/DQoNClRvIGludmVzdGlnYXRlIHRoaXMsIEkgdXNlIGFjY2lkZW50IGRhdGEgY29sbGVjdGVkIGluIDIwMTAgZnJvbSB0aGUgRmVkZXJhbCBSYWlscm9hZCBBZG1pbmlzdHJhdGlvbiAoc2FmZXR5ZGF0YS5mcmEuZG90LmdvdikuIFRoZSBkYXRhc2V0IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWNjaWRlbnQgY2F1c2UsIHNwZWVkLCBpbmp1cmllcywgZmF0YWxpdGllcywgdHJhY2sgdHlwZSwgYW5kIHNldmVyYWwgbWVhc3VyZXMgb2YgZGFtYWdlLiBGcm9tIHRoZXNlIHZhcmlhYmxlcywgSSBmb2N1cyBvbiAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYmVjYXVzZSBleHBsb3JhdG9yeSBhbmFseXNpcyBzaG93cyB0aGV5IGhhdmUgdGhlIHN0cm9uZ2VzdCBjb3JyZWxhdGlvbiB3aXRoICoqKkVxdWlwbWVudCBEYW1hZ2UqKiouIEkgYWxzbyBjcmVhdGUgYW4gaW50ZXJhY3Rpb24gdGVybSAoKioqQ2FycyBEZXJhaWxlZCoqKiDDlyAqKipUcmFjayBEYW1hZ2UqKiopIHRvIHRlc3Qgd2hldGhlciB0aGUgZWZmZWN0IG9mIGRlcmFpbG1lbnRzIGRlcGVuZHMgb24gdHJhY2sgY29uZGl0aW9ucy4NCg0KVGhlIGFwcHJvYWNoIHdpbGwgaW5jbHVkZSBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSBzZXQsIGNvbnN0cnVjdGlvbiBvZiBzZXZlcmFsIGNhbmRpZGF0ZSByZWdyZXNzaW9uIG1vZGVscyAobWFpbiBlZmZlY3RzLCBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRyYW5zZm9ybWVkIG1vZGVsKSwgcmVzaWR1YWwgZGlhZ25vc3RpY3MsIGFuZCBub25wYXJhbWV0cmljIHRlY2huaXF1ZXMgc3VjaCBhcyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEJ5IGNvbXBhcmluZyB0aGVzZSBtb2RlbHMsIEkgd2lsbCBpZGVudGlmeSB3aGljaCBwcmVkaWN0b3JzIG1lYW5pbmdmdWxseSBleHBsYWluIHZhcmlhdGlvbiBpbiAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGFuZCBldmFsdWF0ZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSByZXN1bHRzLg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mICoqKkNhcnMgRGVyYWlsZWQqKiogcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggKioqRXF1aXBtZW50IERhbWFnZSoqKiAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCAqKipUcmFjayBEYW1hZ2UqKiogKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgKioqQ2FycyBEZXJhaWxlZCoqKiBhbmQgKioqVHJhY2sgRGFtYWdlKioqIGNhbiBwcmVkaWN0ICoqKkVxdWlwbWVudCBEYW1hZ2UqKiouDQogIA0KVGhpcyBkYXRhIHNldCBoYXMgMTcgdmFyaWFibGVzOg0KDQoxLiAqKipSYWlscm9hZCoqKiAoY2F0ZWdvcmljYWwpIC0gbmFtZSBvZiByYWlscm9hZA0KMi4gKioqTW9udGgqKiogKGNhdGVnb3JpY2FsKQ0KMy4gKioqRGF5KioqIChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCjQuICoqKlN0YXRlKioqIChjYXRlZ29yaWNhbCkNCjUuICoqKkNvdW50eSoqKiAoY2F0ZWdvcmljYWwpDQo2LiAqKipUcmFjayBUeXBlKioqIChjYXRlZ29yaWNhbCkNCjcuICoqKlRyYWNrIE1hbmFnZW1lbnQqKiogKGNhdGVnb3JpY2FsKQ0KOC4gKioqQWNjaWRlbnQgVHlwZSoqKiAoY2F0ZWdvcmljYWwpDQo5LiAqKipBY2NpZGVudCBDYXVzZSoqKiAoY2F0ZWdvcmljYWwpDQoxMC4gKioqRXF1aXBtZW50IERhbWFnZSoqKiAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQoxMS4gKioqVHJhY2sgRGFtYWdlKioqIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KMTIuICoqKktpbGxlZCoqKiAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCjEzLiAqKipJbmp1cmVkKioqIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCjE0LiAqKipSYWlscm9hZCBFcXVpcG1lbnQqKiogKGNhdGVnb3JpY2FsKSAtIHR5cGUgb2YgZXF1aXBtZW50DQoxNS4gKioqU3BlZWQqKiogKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQoxNi4gKioqTG9jb21vdGl2ZXMgRGVyYWlsZWQqKiogKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQoxNy4gKioqQ2FycyBEZXJhaWxlZCoqKiAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKg0KDQojIDMgVGVzdGluZyB0aGUgTW9kZWxzDQoNCiAgV2UgYXJlIGdvaW5nIHRvIGNyZWF0ZSB0d28gbXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWxzOiBvbmUgd2l0aCAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYmVpbmcgYWRkZWQgdG9nZXRoZXIsIGFuZCBvbmUgd2l0aCB0aGUgdHdvIHZhcmlhYmxlcyBiZWluZyBtdWx0aXBsaWVkIChpbnRlcmFjdGVkKSB0b2dldGhlci4gVGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0IGEgc2luZ2xlIGRlcmFpbGVkIGNhciBjYXVzZXMgbW9yZSBkYW1hZ2UgaWYgdGhlIHRyYWNrIGlzIGFscmVhZHkgYmFkbHkgZGFtYWdlZC4gSWYgdGhhdCdzIHRoZSBjYXNlLCB0aGVuIHRoZSBpbnRlcmFjdGlvbiBtb2RlbCB3b3VsZCBiZSBtb3JlIGFwcHJvcHJpYXRlIHRvIHVzZS4gV2Ugd2lsbCBiZSBkcm9wcGluZyBhbGwgb2YgdGhlIG90aGVyIHZhcmlhYmxlcyBtZW50aW9uZWQgaW4gIzIgYmVjYXVzZSB0aGV5IGFyZSBpcnJlbGV2YW50IGluIHRoaXMgc3R1ZHkuDQogIA0KIyMgMy4xIE1haW4gRWZmZWN0cyBNb2RlbA0KDQogIFRoZSBmaXJzdCBtb2RlbCB3ZSBhcmUgZ29pbmcgdG8gbG9vayBhdCBpcyB0aGUgb25lIHdpdGgganVzdCB0aGUgbWFpbiBlZmZlY3RzLiANCiAgDQojIyMgMy4xLjIgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQogIEZpcnN0LCB3ZSBhcmUgZ29pbmcgdG8gZmluZCB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBmb3IgdGhlIG1haW4gZWZmZWN0cyBtb2RlbC4gVGhpcyB3aWxsIHNob3cgdXMgaWYgdGhlIHZhcmlhYmxlcyBhbmQgbW9kZWwgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIGFuZCBzaG93IGhvdyBtdWNoIG9mIHRoZSB2YXJpYXRpb24gaW4gKioqRXF1aXBtZW50IERhbWFnZSoqKiBpcyBleHBsYWluZWQgYnkgdGhlIHR3byB2YXJpYWJsZXMuIFdlIHdpbGwgYmUgY29tcGFyaW5nIHRoZXNlIGZpbmRpbmdzIHdpdGggdGhlIGludGVyYWN0aW9uIG1vZGVsJ3MgcmVzdWx0cyB0byBkZXRlcm1pbmUgd2hpY2ggbW9kZWwgaXMgc3VmZmljaWVudC4NCg0KYGBge3J9DQojIE11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uDQptb2RlbDEgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMSkNCmBgYA0KDQpMb29raW5nIGF0IHRoZSBpbmZlcmVudGlhbCBzdGF0aXN0aWNzLCAqKipDYXJzIERlcmFpbGVkKioqIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogYXJlIGJvdGggaGlnaGx5IHNpZ25pZmljYW50LiBUaGUgaW50ZXJjZXB0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBGb3IgZWFjaCBhZGRpdGlvbmFsICoqKmNhciBkZXJhaWxlZCoqKiAoMjUsMzgwLCBwIDwgMmUtMTYpLCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluY3JlYXNlcyBieSBhYm91dCBcJDI1LDM4MCwgaG9sZGluZyAqKipUcmFjayBEYW1hZ2UqKiogY29uc3RhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgZG9sbGFyIHNwZW50IG9uICoqKlRyYWNrIERhbWFnZSoqKiAoMC41NCwgcCA8IDJlLTE2KSwgKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbmNyZWFzZXMgYnkgYWJvdXQgXCQwLjU0LCBob2xkaW5nICoqKkNhcnMgRGVyYWlsZWQqKiogY29uc3RhbnQuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDcuMjklIG9mIHRoZSB2YXJpYXRpb24gaW4gKioqRXF1aXBtZW50IERhbWFnZSoqKi4gVGhlIG1vZGVsIGlzIGhpZ2hseSBzaWduaWZpY2FudCAoRiA9IDExNzYsIHAgPSAwKS4NCg0KIyMjIDMuMS4zIFJlc2lkdWFsIEFuYWx5c2lzDQoNCk5leHQsIHdlIHdpbGwgYmUgbG9va2luZyBhdCB0aGUgcmVzaWR1YWwgYW5hbHlzaXMgZm9yIHRoaXMgbW9kZWwgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXNpZHVhbCBhc3N1bXB0aW9ucyBhcmUgbWV0LiBJZiB0aGUgYXNzdW1wdGlvbnMgYXJlIG5vdCBtZXQgYW5kIHdlIGRlY2lkZSB0byBtb3ZlIGZvcndhcmQgd2l0aCB0aGlzIG1vZGVsLCB0aGVuIHdlIHdpbGwgdXNlIGEgQm944oCTQ294IHRyYW5zZm9ybWF0aW9uIGFuZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIHJvYnVzdCBpbmZlcmVuY2UuDQoNCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQ0KIyBGaXQgbW9kZWwgd2l0aG91dCBpbnRlcmFjdGlvbg0KbW9kZWwxIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCiMgUGxvdCByZXNpZHVhbHMgdnMgZml0dGVkIHRvIGNoZWNrIGFzc3VtcHRpb25zDQpwYXIobWZyb3cgPSBjKDIsMikpDQpwbG90KG1vZGVsMSkNCnBhcihtZnJvdyA9IGMoMSwxKSkNCmBgYCANCiAgDQpUaGUgUmVzaWR1YWxzIHZzIEZpdHRlZCBwbG90IHNob3dzIHRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSByZXNpZHVhbHMuIFRoZSBRLVEgUmVzaWR1YWxzIHNob3cgbXVsdGlwbGUgb3V0bGllcnMgYW5kIHR3byBzdHJvbmcgdGFpbHMsIGluZGljYXRpbmcgbm9uLW5vcm1hbGl0eS4gVGhlIFNjYWxlIExvY2F0aW9uIHBsb3Qgc2hvd3MgYSBsYWNrIG9mIGNvbnN0YW50IHZhcmlhbmNlIGFuZCB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3Qgc2hvd3MgYW4gb3V0bGllciBhdCAzOTAuIFRoZSByZXNpZHVhbCBhc3N1bXB0aW9ucyBhcmUgbm90IG1ldC4NCg0KIyMgMy4yIEludGVyYWN0aW9uIFRlcm0NCg0KTm93LCB3ZSB3aWxsIHRha2UgYSBsb29rIGF0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbC4gSWYgdGhpcyBtb2RlbCBoYXMgYSBoaWdoZXIgUi1zcXVhcmVkIHZhbHVlIGFuZCBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCB3ZSB3aWxsIG1vdmUgZm9yd2FyZCB3aXRoIHRoaXMgbW9kZWwgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgb25lLg0KDQojIyMgMy4yLjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpMZXQncyB0YWtlIGEgbG9vayBhdCB0aGUgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBzbyB3ZSBjYW4gZmluZCBvdXQgaWYgdGhpcyBtb2RlbCBpcyBiZXR0ZXIgdGhhbiB0aGUgbWFpbiBlZmZlY3QgbW9kZWwuDQoNCmBgYHtyfQ0KIyBNb2RlbCAzOiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZw0KbW9kZWwzIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBTdW1tYXJ5IG9mIHRoZSBtb2RlbA0Kc3VtbWFyeShtb2RlbDMpDQpgYGANCg0KKioqQ2FycyBEZXJhaWxlZCoqKiAoMTcsMzUwLCBwIDwgMmUtMTYpIGFuZCB0aGUgaW50ZXJhY3Rpb24gKHAgPCAyZS0xNikgYXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIFRoZSAqKipUcmFjayBEYW1hZ2UqKiogbWFpbiBlZmZlY3QgYnkgaXRzZWxmIGlzIG5vdCAoMC4wNzMsIHAgPSAwLjA5NSkuIEJlY2F1c2UgdGhlIGludGVyYWN0aW9uIGlzIHNpZ25pZmljYW50LCB0aGUgZWZmZWN0IG9mICoqKkNhcnMgRGVyYWlsZWQqKiogb24gKioqRXF1aXBtZW50IERhbWFnZSoqKiBpbmNyZWFzZXMgYXMgKioqVHJhY2sgRGFtYWdlKioqIGluY3JlYXNlcy4gV2hlbiBib3RoIHByZWRpY3RvcnMgYXJlIHplcm8sIHRoZSBleHBlY3RlZCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGlzIGFib3V0IFwkMyw0MDAgKGludGVyY2VwdCBub3Qgc2lnbmlmaWNhbnQpLiBFYWNoIGFkZGl0aW9uYWwgZGVyYWlsZWQgY2FyIGluY3JlYXNlcyBleHBlY3RlZCAqKipFcXVpcG1lbnQgRGFtYWdlKioqIGJ5IGFib3V0IFwkMTcsMzUwIHdoZW4gKioqVHJhY2sgRGFtYWdlKioqID0gMDsgZWFjaCBhZGRpdGlvbmFsIGRvbGxhciBvZiAqKipUcmFjayBEYW1hZ2UqKiogaXMgYXNzb2NpYXRlZCB3aXRoIGFib3V0IFwkMC4wNyBvZiBhZGRpdGlvbmFsICoqKkVxdWlwbWVudCBEYW1hZ2UqKiogYXQgKioqQ2FycyBEZXJhaWxlZCoqKiAgPSAwLiBUaGUgbW9kZWwgZXhwbGFpbnMgNTMuMzklIG9mIHRoZSB2YXJpYXRpb24gKEYgPSA5OTcuMywgcCA8IDAuMDAxKS4gQmVjYXVzZSB0aGUgbW9kZWwgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24sIG1haW4tZWZmZWN0IHNsb3BlcyBhcmUgY29uZGl0aW9uYWwgKGUuZy4sIHRoZSAqKipDYXJzIERlcmFpbGVkKioqIHNsb3BlIGlzIGV2YWx1YXRlZCBhdCAqKipUcmFjayBEYW1hZ2UqKiogPSAwKS4gQ2VudGVyaW5nICoqKlRyYWNrIERhbWFnZSoqKiBhdCBpdHMgbWVhbiB3b3VsZCBtYWtlIGludGVycHJldGF0aW9uIG1vcmUgaW50dWl0aXZlLg0KDQojIyMgMy4yLjIgUmVzaWR1YWwgQW5hbHlzaXMNCg0KTm93IHRoYXQgd2Uga25vdyB0aGF0IHdlJ3JlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIHRoaXMgbW9kZWwsIGxldCdzIHNlZSBpZiBpdCBtZWV0cyB0aGUgcmVzaWR1YWwgYXNzdW1wdGlvbnMuIElmIG5vdCwgd2Ugd2lsbCBiZSB1c2luZyBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24gdG8gY29tZSB0byBvdXIgY29uY2x1c2lvbi4NCg0KYGBge3J9DQojIFJlc2lkdWFsIGRpYWdub3N0aWMgcGxvdHMNCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobW9kZWwzKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldA0KYGBgDQoNClRoZSBhc3N1bXB0aW9ucyBvZiBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIFRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QsIHRoZXJlIGlzIGEgc3Ryb25nIHJpZ2h0IHRhaWwgaW4gdGhlIFEtUSBSZXNpZHVhbHMgcGxvdCwgdGhlIFNjYWxlIExvY2F0aW9uIHBsb3QgZG9lcyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgYW5kIHRoZXJlIGlzIG9uZSBvdXRsaWVyLCAxNDE0LCBpbiB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3QuIA0KDQojIDQgUmVtZWRpZXMgYW5kIFJvYnVzdCBJbmZlcmVuY2UNCg0KU2luY2UgdGhlIHJlc2lkdWFsIGFzc3VtcHRpb25zIHdlcmUgbm90IG1ldCwgd2UgYXJlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiwgZm9sbG93ZWQgYnkgOTUlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscy4NCg0KIyMgNC4xIEJveC1Db3ggVHJhbnNmb3JtYXRpb24NCg0KV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uLiANCg0KYGBge3IgYm94Y294X3pvb20sIGVjaG89VFJVRSwgZmlnLndpZHRoPTcsIGZpZy5oZWlnaHQ9NH0NCmxpYnJhcnkoTUFTUykNCg0KayA8LSAtbWluKG15RGF0YSRFcXBEYW1nLCBuYS5ybSA9IFRSVUUpICsgMQ0KbXlEYXRhJEVxcERhbWdfcG9zIDwtIG15RGF0YSRFcXBEYW1nICsgaw0KbW9kZWwzX3BvcyA8LSBsbShFcXBEYW1nX3BvcyB+IENhcnNEZXIgKiBUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFByb2ZpbGUgb3ZlciBhIHRpZ2h0IGdyaWQgc28gzrviiYgwLjIwIGlzIG9idmlvdXMNCmJjIDwtIGJveGNveChtb2RlbDNfcG9zLCBsYW1iZGEgPSBzZXEoMC4xMCwgMC4zNSwgMC4wMDEpLCBwbG90aXQgPSBGQUxTRSkNCmxhbSA8LSBiYyR4OyBsbCA8LSBiYyR5DQpjdXRvZmYgPC0gbWF4KGxsKSAtIHFjaGlzcSgwLjk1LCBkZiA9IDEpIC8gMg0KY2kgPC0gcmFuZ2UobGFtW2xsID49IGN1dG9mZl0pDQpsYW1faGF0IDwtIGxhbVt3aGljaC5tYXgobGwpXQ0KDQpwbG90KGxhbSwgbGwsIHR5cGU9ImwiLCB4bGFiPWV4cHJlc3Npb24obGFtYmRhKSwgeWxhYj0iTG9nLUxpa2VsaWhvb2QiLA0KICAgICB4bGltPWMoMC4xMCwgMC4zNSkpDQphYmxpbmUoaCA9IGN1dG9mZiwgbHR5ID0gMykNCmFibGluZSh2ID0gY2ksIGx0eSA9IDMpDQphYmxpbmUodiA9IDAuMjAsIGx0eSA9IDIsIGx3ZCA9IDIpDQptdGV4dChzcHJpbnRmKCLOu8yCID0gJS4yZjsgOTUlJSBDSSA9IFslLjJmLCAlLjJmXSIsIGxhbV9oYXQsIGNpWzFdLCBjaVsyXSksDQogICAgICBzaWRlID0gMywgbGluZSA9IC0xKQ0KYGBgDQoNCldlIGNoZWNrZWQgd2hldGhlciBhIHNpbXBsZSBwb3dlciB0cmFuc2Zvcm0gd291bGQgbWFrZSBvdXIgaW50ZXJhY3Rpb24gbW9kZWwgbW9yZSByZWxpYWJsZSwgc2luY2UgYSBmZXcgaHVnZSBhY2NpZGVudHMgY3JlYXRlIHN0cm9uZyBza2V3IGFuZCB1bmV2ZW4gbm9pc2UuIFRoZSBCb3jigJNDb3ggY2hlY2sgcG9pbnRlZCBjbGVhcmx5IHRvIGEgZ2VudGxlIHRyYW5zZm9ybSB0byBhYm91dCBhIGZpZnRoLXJvb3QgKM67IOKJiCAwLjIwKSB3aXRoIGEgdmVyeSB0aWdodCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBbLjIsIC4yMV0gdGhhdCBydWxlcyBvdXQgYm90aCDigJxubyB0cmFuc2Zvcm1hdGlvbuKAnSAozrsgPSAxKSBhbmQgYSBwdXJlIGxvZyAozrsgPSAwKS4gSW4gcGxhaW4gdGVybXMsIHRoaXMgdHJhbnNmb3JtIHNsaWdodGx5IGNvbXByZXNzZXMgdGhlIGJpZ2dlc3QgZGFtYWdlIHZhbHVlcyBzbyB0aGV5IGRvbuKAmXQgZG9taW5hdGUsIHdoaWNoIGV2ZW5zIG91dCB0aGUgZXJyb3JzIGFuZCBtYWtlcyB0aGUgbW9kZWzigJlzIHVuY2VydGFpbnR5IG1vcmUgdHJ1c3R3b3J0aHkuIFdlIGZpdCB0aGUgcmVncmVzc2lvbiBvbiB0aGlzIHRyYW5zZm9ybWVkIHNjYWxlIGZvciBiZXR0ZXIgc3RhdGlzdGljYWwgYmVoYXZpb3IsIHRoZW4gd2lsbCBjb252ZXJ0IHByZWRpY3RlZCB2YWx1ZXMgYmFjayBpbnRvIGRvbGxhcnMgc28gcmVzdWx0cyBzdGF5IGludGVycHJldGFibGUuIFRoZSBzdWJzdGFudGl2ZSBzdG9yeSBkb2VzbuKAmXQgY2hhbmdlOiBDYXJzIERlcmFpbGVkIGFuZCB0aGUgaW50ZXJhY3Rpb24gcmVtYWluIHJlbGlhYmx5IHBvc2l0aXZlLCB3aGlsZSB0aGUgVHJhY2sgRGFtYWdlIG1haW4gZWZmZWN0IGFsb25lIGlzIG5vdCBjbGVhcmx5IGRpZmZlcmVudCBmcm9tIHplcm87IHRoZSB0cmFuc2Zvcm1hdGlvbiBwcmltYXJpbHkgc3RhYmlsaXplZCB2YXJpYW5jZSBhbmQgaW1wcm92ZWQgZGlhZ25vc3RpY3MuDQoNCiMjIDQuMiBUcmFuc2Zvcm1pbmcgT3VyIFJlc3BvbnNlDQoNCk5vdyB0aGF0IHdlIGtub3cgzrsg4omIIDAuMjAsIHdlIHdpbGwgYmUgdHJhbnNmb3JtaW5nIG91ciByZXNwb25zZSwgcmVmaXR0aW5nIHRoZSBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRoZW4gYmFjay10cmFuc2Zvcm0gcHJlZGljdGlvbnMgc28gcmVzdWx0cyByZW1haW4gaW50ZXJwcmV0YWJsZSBvbiB0aGUgZG9sbGFyIHNjYWxlLiANCg0KYGBge3J9DQoNCiMgVHJhbnNmb3JtIHJlc3BvbnNlIHdpdGggbGFtYmRhID0gMC4yMCAtLS0NCmsgPC0gLW1pbihteURhdGEkRXFwRGFtZywgbmEucm09VFJVRSkgKyAxDQpsYW0gPC0gMC4yMA0KeV9wb3MgPC0gbXlEYXRhJEVxcERhbWcgKyBrDQp5X2JjICA8LSAoeV9wb3NebGFtIC0gMSkgLyBsYW0gICAgICAgICAgICAgICAgICMgQm944oCTQ294IHRyYW5zZm9ybQ0KDQojIFJlZml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbCBvbiB0cmFuc2Zvcm1lZCBzY2FsZSAtLS0NCm1vZGVsX2JjIDwtIGxtKHlfYmMgfiBDYXJzRGVyICogVHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBJbmZlcmVuY2UgLS0tDQpzdW1tYXJ5KG1vZGVsX2JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb24gdHJhbnNmb3JtZWQgc2NhbGUNCg0KIyBCYWNrLXRyYW5zZm9ybSBmaXR0ZWQgJiBwcmVkaWN0aW9ucyB0byBkb2xsYXJzIC0tLQ0KaW52X2JveGNveCA8LSBmdW5jdGlvbih6LCBsYW0pIGlmIChhYnMobGFtKSA8IDFlLTEyKSBleHAoeikgZWxzZSAobGFtKnogKyAxKV4oMS9sYW0pDQoNCiMgTmFpdmUgYmFjay10cmFuc2Zvcm0gb2YgZml0dGVkIHZhbHVlcyAoZ29vZCBmb3IgbWVkaWFucy90eXBpY2FscykNCmZpdF9iYyAgIDwtIGZpdHRlZChtb2RlbF9iYykNCmZpdF9kb2xzIDwtIGludl9ib3hjb3goZml0X2JjLCBsYW0pIC0gaw0KYGBgDQoNClVzaW5nIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIM67ID0gMC4yMCwgSSBmaXJzdCBhZGRlZCBhIHNtYWxsIGNvbnN0YW50IHRvICoqKkVxdWlwbWVudCBEYW1hZ2UqKiogc28gYWxsIHZhbHVlcyB3ZXJlIHBvc2l0aXZlLCB0aGVuIGFwcGxpZWQgdGhlIHBvd2VyIHRyYW5zZm9ybWF0aW9uIGFuZCBmaXQgdGhlIGludGVyYWN0aW9uIG1vZGVsICgqKipDYXJzIERlcmFpbGVkKioqLCAqKipUcmFjayBEYW1hZ2UqKiosIGFuZCB0aGVpciBwcm9kdWN0KSBvbiB0aGF0IHRyYW5zZm9ybWVkIG91dGNvbWUuIFRoaXMgc3RlcCByZWR1Y2VzIHRoZSBpbmZsdWVuY2Ugb2YgdmVyeSBsYXJnZSBsb3NzZXMgYW5kIHByb2R1Y2VzIGEgbW9yZSBldmVuIHJlc2lkdWFsIHNwcmVhZCwgd2hpY2ggbWFrZXMgc3RhbmRhcmQgZXJyb3JzIGFuZCBkaWFnbm9zdGljIGNoZWNrcyBiZWhhdmUgYmV0dGVyLiBBZnRlciBlc3RpbWF0aW5nIHRoZSBtb2RlbCwgSSBjb252ZXJ0ZWQgdGhlIGZpdHRlZCB2YWx1ZXMgYmFjayB0byBkb2xsYXJzIHdpdGggdGhlIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZW1vdmVkIHRoZSBzaGlmdCBzbyByZXN1bHRzIGNhbiBiZSByZWFkIGluIHRoZWlyIG9yaWdpbmFsIHVuaXRzLiBCZWNhdXNlIEkgdXNlZCBhIGRpcmVjdCBiYWNrLXRyYW5zZm9ybSwgdGhlc2UgZml0dGVkIGRvbGxhcnMgcmVwcmVzZW50IHR5cGljYWwgb3V0Y29tZXMgcmF0aGVyIHRoYW4gdW5iaWFzZWQgbWVhbnMuDQoNCiMjIDQuMyBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMNCg0KV2UgdGhlbiBjb25zdHJ1Y3RlZCBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgdG8gZ2l2ZSByb2J1c3QsIGRhdGEtZHJpdmVuIGludGVydmFscyBmb3Igb3VyIGludGVyYWN0aW9uIG1vZGVsLCBhbmQgdG8gc2VlIGlmIGl0IG1hdGNoZXMgb3VyIEJveC1Db3ggdHJhbnNmb3JtZWQgbW9kZWwuDQoNCmBgYHtyIGJvb3RzdHJhcCBzZXR1cH0NCg0KIyBEZWZpbmUgZnVuY3Rpb24gdG8gZXh0cmFjdCBjb2VmZmljaWVudHMNCmJvb3RfY29lZiA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7DQogIGQgPC0gZGF0YVtpbmRpY2VzLCBdICAjIHJlc2FtcGxlIHJvd3MNCiAgZml0IDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IGQpDQogIHJldHVybihjb2VmKGZpdCkpDQp9DQoNCiMgUnVuIGJvb3RzdHJhcA0Kc2V0LnNlZWQoMTIzKSAgIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpib290X3Jlc3VsdHMgPC0gYm9vdChkYXRhID0gbXlEYXRhLCBzdGF0aXN0aWMgPSBib290X2NvZWYsIFIgPSAxMDAwKSAgIyAxMDAwIHJlc2FtcGxlcw0KDQojIENyZWF0ZSBhIHRpZHkgdGFibGUgb2YgOTUlIHBlcmNlbnRpbGUgQ0lzIGZvciBhbGwgY29lZmZpY2llbnRzDQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwzKSkNCmNpX2xpc3QgPC0gbGFwcGx5KDE6bGVuZ3RoKGNvZWZfbmFtZXMpLCBmdW5jdGlvbihpKSB7DQogIGNpIDwtIGJvb3QuY2koYm9vdF9yZXN1bHRzLCB0eXBlID0gInBlcmMiLCBpbmRleCA9IGkpJHBlcmNlbnRbNDo1XQ0KICBkYXRhLmZyYW1lKENvZWZmaWNpZW50ID0gY29lZl9uYW1lc1tpXSwNCiAgICAgICAgICAgICBMb3dlcjk1ID0gY2lbMV0sDQogICAgICAgICAgICAgVXBwZXI5NSA9IGNpWzJdKQ0KfSkNCg0KY2lfdGFibGUgPC0gZG8uY2FsbChyYmluZCwgY2lfbGlzdCkNCnByaW50KGNpX3RhYmxlKQ0KYGBgDQoNClVzaW5nIDEsMDAwLXNhbXBsZSBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMgb24gdGhlIHVudHJhbnNmb3JtZWQgbW9kZWwsIHRoZSBlZmZlY3Qgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBpcyBjbGVhcmx5IHBvc2l0aXZlOiB3ZSBlc3RpbWF0ZSBhbiBpbmNyZWFzZSBvZiBcJDEyLjhr4oCTXCQyMS43ayBwZXIgYWRkaXRpb25hbCBkZXJhaWxlZCBjYXIsIGhvbGRpbmcgKioqVHJhY2sgRGFtYWdlKioqIGF0IGl0cyByZWZlcmVuY2UgdmFsdWUuIFRoZSAqKipUcmFjayBEYW1hZ2UqKiogbWFpbiBlZmZlY3QgaXMgbm90IHN0YXRpc3RpY2FsbHkgZGlzdGluZ3Vpc2hhYmxlIGZyb20gemVybyAoQ0kgPSBb4oiSMC4xMjQsIDAuMzIyXSksIHdoaWxlIHRoZSBpbnRlcmFjdGlvbiBpcyBwb3NpdGl2ZWx5IGVzdGltYXRlZCAoQ0kgPSBbMC4wMywgMC4wNl0pLCBtZWFuaW5nIHRoZSBpbXBhY3Qgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiBncm93cyBhcyAqKipUcmFjayBEYW1hZ2UqKiogaW5jcmVhc2VzIGFuZCB2aWNlIHZlcnNhLiBUaGVzZSBjb25jbHVzaW9ucyBtYXRjaCB0aGUgQm944oCTQ294ICjOu+KJiDAuMjApIHJlZml0IGluIHRlcm1zIG9mIHNpZ25zIGFuZCB3aGljaCBlZmZlY3RzIGFyZSBkZXRlY3RhYmxlOyB0aGUgdHJhbnNmb3JtYXRpb24gbWFpbmx5IHN0YWJpbGl6ZWQgdmFyaWFuY2UgYW5kIGltcHJvdmVkIGRpYWdub3N0aWNzLg0KDQojIDUgQ29uY2x1c2lvbg0KDQoqKipFcXVpcG1lbnQgRGFtYWdlKioqIGluIHRoZXNlIHJhaWxyb2FkIGFjY2lkZW50cyBpcyBkcml2ZW4gcHJpbWFyaWx5IGJ5IHRoZSBudW1iZXIgb2YgKioqQ2FycyBEZXJhaWxlZCoqKiwgYW5kIHRoYXQgcmVzdWx0IGhvbGRzIGFjcm9zcyBtZXRob2RzLiBJbiB0aGUgb3JpZ2luYWwsIHJhdyBtb2RlbCwgMSwwMDAtc2FtcGxlIGJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBzaG93IGEgY2xlYXJseSBwb3NpdGl2ZSAqKipDYXJzIERlcmFpbGVkKioqIGVmZmVjdCAoYWJvdXQgXCQxMi44a+KAkyQyMS43ayBwZXIgYWRkaXRpb25hbCBjYXIpLCB3aGlsZSB0aGUgKioqQ2FycyBEZXJhaWxlZCoqKiDDlyAqKipUcmFjayBEYW1hZ2UqKiogaW50ZXJhY3Rpb24gaXMgYWxzbyByZWxpYWJseSBwb3NpdGl2ZSAoY29uZmlkZW5jZSBpbnRlcnZhbCBlbnRpcmVseSBhYm92ZSB6ZXJvKSwgbWVhbmluZyBkYW1hZ2VzIHJpc2UgZmFzdGVyIHdoZW4gZGVyYWlsbWVudHMgY29pbmNpZGUgd2l0aCBoaWdoZXIgKioqVHJhY2sgRGFtYWdlKioqLiBUaGUgKioqVHJhY2sgRGFtYWdlKioqIG1haW4gZWZmZWN0IGFsb25lIGlzIG5vdCBjb25zaXN0ZW50bHkgZGlmZmVyZW50IGZyb20gemVybyBvbmNlIHRoZSBpbnRlcmFjdGlvbiBpcyBpbmNsdWRlZCAoaXRzIENJIHNwYW5zIHplcm8pLiBUbyBpbXByb3ZlIHJlbGlhYmlsaXR5LCB3ZSBhcHBsaWVkIGEgQm944oCTQ294IHRyYW5zZm9ybWF0aW9uIHRvIHRoZSByZXNwb25zZSB3aXRoIM67IOKJiCAwLjIwICg5NSUgQ0kgWzAuMjAsIDAuMjFdKSwgd2hpY2ggc3RhYmlsaXplZCB2YXJpYW5jZS4gRml0dGVkIHZhbHVlcyB3ZXJlIHRoZW4gYmFjay10cmFuc2Zvcm1lZCB0byBkb2xsYXJzIGZvciBpbnRlcnByZXRhdGlvbi4NCg0KVGhlc2UgZXN0aW1hdGVzIHNob3VsZCBiZSByZWFkIHdpdGggYSBmZXcgY2F2ZWF0cy4gVGhlIGRhdGEgaXMgZnJvbSAyMDEwLCBzbyBpdCBtYXkgbm90IHJlZmxlY3QgY3VycmVudCB0ZWNobm9sb2d5IGFuZCBzYWZldHkgcHJhY3RpY2VzLiBDb2VmZmljaWVudHMgaW4gdGhlIHRyYW5zZm9ybWVkIG1vZGVsIGFyZSBvbiBhIHRyYW5zZm9ybWVkIHNjYWxlICh3ZSB0aGVyZWZvcmUgaW50ZXJwcmV0IHZpYSBiYWNrLXRyYW5zZm9ybWVkIHByZWRpY3Rpb25zKSwgYW5kIFLCsiBvbiB0aGUgdHJhbnNmb3JtZWQgb3V0Y29tZSBpcyBub3QgZGlyZWN0bHkgY29tcGFyYWJsZSB0byBSwrIgb24gdGhlIGRvbGxhciBzY2FsZS4gQmVjYXVzZSB0aGUgbW9kZWwgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24sIGVhY2ggbWFpbi1lZmZlY3Qgc2xvcGUgaXMgY29uZGl0aW9uYWw7IGNlbnRlcmluZyAqKipUcmFjayBEYW1hZ2UqKiogYXQgaXRzIG1lYW4gd291bGQgbWFrZSB0aGF0IGludGVycHJldGF0aW9uIG1vcmUgaW50dWl0aXZlLg0KDQpMb29raW5nIGFoZWFkLCB1cGRhdGluZyB0aGUgYW5hbHlzaXMgd2l0aCByZWNlbnQgYWNjaWRlbnRzIGFuZCBhZGRpbmcgb3BlcmF0aW9uYWwgYW5kIGVuZ2luZWVyaW5nIGNvdmFyaWF0ZXMgbGlrZSB0cmFpbiBzcGVlZCwgY29uc2lzdCB3ZWlnaHQsIHdlYXRoZXIsIHRyYWNrIGNsYXNzL2dlb21ldHJ5LCB3b3VsZCBsaWtlbHkgaW1wcm92ZSBleHBsYW5hdG9yeSBwb3dlci4gUHJhY3RpY2FsbHksIHRoZSByZXN1bHRzIHBvaW50IHRvIHR3byBsZXZlcnM6IHJlZHVjZSBkZXJhaWxtZW50cyBvdmVyYWxsLCBhbmQgcHJpb3JpdGl6ZSBtYWludGVuYW5jZSBhbmQgaW5zcGVjdGlvbiB3aGVyZSBjYXIgZGVyYWlsbWVudCByaXNrIGFuZCAqKipUcmFjayBEYW1hZ2UqKiogcmlzayBjb2luY2lkZSwgc2luY2UgdGhlaXIgY29tYmluYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGRpc3Byb3BvcnRpb25hdGVseSBoaWdoZXIgbG9zc2VzLg0KDQojIDYgUmVmZXJlbmNlcw0KDQpzYWZldHlkYXRhLmZyYS5kb3QuZ292DQoNCg0KDQo=