1 Introduction

In this assignment, we are tasked with creating different multiple regression models so we can incorporate more variables into the model. I want to take a look and see which variables are most predictive, and which model is the best.

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.

2.1 Variables

  • Railroad (categorical) - name of railroad
  • Month (categorical)
  • Day (categorical) - days of the week labeled 1 through 7
  • State (categorical)
  • County (categorical)
  • Track Type (categorical)
  • Track Management (categorical)
  • Accident Type (categorical)
  • Accident Cause (categorical)
  • Equipment Damage (numerical) - amount of money spent on damages
  • Track Damage (numerical) - amount of money spent on track repair
  • Killed (numerical) - number of people killed from accident
  • Injured (numerical) - number of people injured from accident
  • RREquip (categorical) - type of train
  • Speed (numerical) - mph the train was going at during impact
  • Locomotives Derailed (numerical) - the number of locomotives derailed
  • Cars Derailed (numerical) - the number of Cars Derailed

3 Methodology and Analysis

I am 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.

4 Model 1: Main Effects Model

We are going to start with the MLR model without the interaction term.

4.1 Inferential Statistics

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

4.2 Residual Analysis

# 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 shows 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 assumptions for normality are not met.

5 Model 2: Interaction Term

Now, I am going to incorporate the interaction term, CarsDer:TrkDamg, exclude the main effects, and see if the R-squared value increased and if the interaction term is statistically significant. I’ll also be looking to see if the model as a whole is significant. If it’s not, then I’ll be removing the term and go forward with the MLR model.

5.1 Inferential Statistics

# Multiple Linear Regression with Interaction
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)

# Summary of the model
summary(model2)

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

Residuals:
     Min       1Q   Median       3Q      Max 
-1799092   -44483   -33634   -15771  3153755 

Coefficients:
                 Estimate Std. Error t value Pr(>|t|)    
(Intercept)     4.624e+04  3.635e+03   12.72   <2e-16 ***
CarsDer:TrkDamg 7.002e-02  1.508e-03   46.42   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 184200 on 2619 degrees of freedom
Multiple R-squared:  0.4514,    Adjusted R-squared:  0.4512 
F-statistic:  2155 on 1 and 2619 DF,  p-value: < 2.2e-16

For each additional unit increase in CarsDer:TrkDamg, Equipment Damage increases by $0.07. The interaction term is highly significant (F = 2155, p = 0). This model explains 45.12% of the variation in Equipment Damage.

5.2 Residual Analysis

# Fit the interaction model
model2 <- lm(EqpDamg ~ CarsDer:TrkDamg, data = myData)

# Residual diagnostics
par(mfrow = c(2,2))  # show 4 plots together
plot(model2)

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

The Residuals vs Fitted plot shows there is no constant variance in the residuals. The Q-Q Residuals shows multiple outliers and one strong tail, showing non-normality. The Scale Location plot shows a lack of constant variance and the Residuals vs Leverage plot shows an outlier at 1414. All in all, the assumptions for normality are not met.

6 Model 3: Interaction Term with Main Effects

Finally, I will be using both main effects and their interaction term to create Model 3.

6.1 Inferential Statistics

# 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), Track Damage (0.073, p = 0.095), and their interaction term (p = 0) are all statistically significant. Since the interaction term is significant, this means that the variables depend on each other. The effect of Cars Derailed on Equipment Damage grows as Track Damage grows. When both Cars Derailed and Track Damage are zero, the expected Equipment Damage is $3400. The intercept is not statistically significant. For each additional car derailed, Equipment Damage increases by about $17,350 on average, holding Track Damage constant at zero. Each additional dollar of Track Damage is associated with about $0.07 of additional Equipment Damage. This model explains 53.39% of the variation in Equipment Damage. The model is highly significant (F = 997.3, p = 0).

6.2 Residual Analysis

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

7 ANOVA

anova(model1, model2, model3)
Analysis of Variance Table

Model 1: EqpDamg ~ CarsDer + TrkDamg
Model 2: EqpDamg ~ CarsDer:TrkDamg
Model 3: EqpDamg ~ CarsDer + TrkDamg + CarsDer:TrkDamg
  Res.Df        RSS Df   Sum of Sq      F    Pr(>F)    
1   2618 8.5269e+13                                    
2   2619 8.8817e+13 -1 -3.5477e+12 122.91 < 2.2e-16 ***
3   2617 7.5536e+13  2  1.3281e+13 230.06 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

The ANOVA table shows that adding the interaction term to the main effects significantly improves the model. As a result, Model 3 is the best model because it reduces residual variation the most. Model 2 is the worst of the three models because it doesn’t take into account the influence that the independent main effects have on the model. Model 2 also has the highest residual sum of squares, meaning there is more unexplained variation in this model compared to the other two.

8 Nonparametric Tests

We are going to move forward with Model 3 because we established it as the best of the three. I will be conducting a Box-Cox transformation and Bootstrap confidence intervals because the assumptions for normality were not met.

8.1 Box-Cox Transformation

library(MASS)

# Shift the response to make all values positive
myData$EqpDamg_pos <- myData$EqpDamg + abs(min(myData$EqpDamg)) + 1

# Fit Model 3: CarsDer + TrkDamg + interaction
model3_pos <- lm(EqpDamg_pos ~ CarsDer + TrkDamg + CarsDer:TrkDamg, data = myData)

# Box-Cox transformation
bc <- boxcox(model3_pos,
             lambda = seq(-2, 2, 0.1),
             lambda.lab = "Lambda",
             ylab = "Log-Likelihood",
             main = "Box-Cox Transformation for Model 3")

# Identify lambda that maximizes log-likelihood
lambda_opt <- bc$x[which.max(bc$y)]
lambda_opt
[1] 0.2222222

I conducted a Box-Cox transformation to assess whether transforming Equipment Damage would improve the model assumptions. Since λ = 1 is within the confidence interval, no transformation is needed.

8.2 Bootstrap Confidence Intervals

library(boot)

# 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

The Cars Derailed interval is entirely positive. This indicates strong evidence of a positive effect. We are 95% confident that the slope of Cars Derailed is between 12,800 and 21,700. The interval for Track Damage includes 0, which means the effect alone may not have a consistent effect on Equipment Damage. We are 95% confident that the slope of Track Damage is between -0.124 and 0.322. The interval for the interaction term is entirely positive, meaning the interaction is meaningful. We are 95% confident that the slope of the interaction term is between 0.03 and 0.06.

9 Conclusion

In conclusion, the model with the interaction term and both main effects, Model 3, was the best model of the three. It explained the highest variation in Equipment Damage (53.29%). We are certain that the main effect of Cars Derailed is significant, but are unsure if Track Damage alone is significant because its 95% bootstrap interval contains 0. The interaction term is statistically significant, meaning that the effect of Cars Derailed depends on Track Damage and vice versa.

10 References

safetydata.fra.dot.gov

LS0tDQp0aXRsZTogIk11bHRpcGxlIExpbmVhciBSZWdyZXNzaW9uIE1vZGVscyINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCnNldHdkKCJDOi9Vc2Vycy92b2xtMS9PbmVEcml2ZS9Eb2N1bWVudHMiKQ0KbGlicmFyeShyZWFkeGwpDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQpteWRhdGEgPC0gbXlEYXRhWywgLTFdDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpJbiB0aGlzIGFzc2lnbm1lbnQsIHdlIGFyZSB0YXNrZWQgd2l0aCBjcmVhdGluZyBkaWZmZXJlbnQgbXVsdGlwbGUgcmVncmVzc2lvbiBtb2RlbHMgc28gd2UgY2FuIGluY29ycG9yYXRlIG1vcmUgdmFyaWFibGVzIGludG8gdGhlIG1vZGVsLiBJIHdhbnQgdG8gdGFrZSBhIGxvb2sgYW5kIHNlZSB3aGljaCB2YXJpYWJsZXMgYXJlIG1vc3QgcHJlZGljdGl2ZSwgYW5kIHdoaWNoIG1vZGVsIGlzIHRoZSBiZXN0Lg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggRXF1aXBtZW50IERhbWFnZSAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCBUcmFjayBEYW1hZ2UgKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGNhbiBwcmVkaWN0IEVxdWlwbWVudCBEYW1hZ2UuDQogIA0KIyMgMi4xIFZhcmlhYmxlcw0KDQogICogUmFpbHJvYWQgKGNhdGVnb3JpY2FsKSAtIG5hbWUgb2YgcmFpbHJvYWQNCiAgKiBNb250aCAoY2F0ZWdvcmljYWwpDQogICogRGF5IChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCiAgKiBTdGF0ZSAoY2F0ZWdvcmljYWwpDQogICogQ291bnR5IChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBNYW5hZ2VtZW50IChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBDYXVzZSAoY2F0ZWdvcmljYWwpDQogICogRXF1aXBtZW50IERhbWFnZSAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQogICogVHJhY2sgRGFtYWdlIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KICAqIEtpbGxlZCAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCiAgKiBJbmp1cmVkIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCiAgKiBSUkVxdWlwIChjYXRlZ29yaWNhbCkgLSB0eXBlIG9mIHRyYWluDQogICogU3BlZWQgKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQogICogTG9jb21vdGl2ZXMgRGVyYWlsZWQgKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQogICogQ2FycyBEZXJhaWxlZCAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZA0KDQojIDMgTWV0aG9kb2xvZ3kgYW5kIEFuYWx5c2lzDQoNCiAgSSBhbSBnb2luZyB0byBjcmVhdGUgdHdvIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsczogb25lIHdpdGggQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGJlaW5nIGFkZGVkIHRvZ2V0aGVyLCBhbmQgb25lIHdpdGggdGhlIHR3byB2YXJpYWJsZXMgYmVpbmcgbXVsdGlwbGllZCAoaW50ZXJhY3RlZCkgdG9nZXRoZXIuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHNpbmdsZSBkZXJhaWxlZCBjYXIgY2F1c2VzIG1vcmUgZGFtYWdlIGlmIHRoZSB0cmFjayBpcyBhbHJlYWR5IGJhZGx5IGRhbWFnZWQuIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byB1c2UuIFdlIHdpbGwgYmUgZHJvcHBpbmcgYWxsIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgbWVudGlvbmVkIGluICMyLiANCiAgDQojIDQgTW9kZWwgMTogTWFpbiBFZmZlY3RzIE1vZGVsDQoNCiAgV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIE1MUiBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtLiANCiAgDQojIyA0LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgYm90aCBoaWdobHkgc2lnbmlmaWNhbnQuIFRoZSBpbnRlcmNlcHQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgY2FyIGRlcmFpbGVkICgyNSwzODAsIHAgPCAyZS0xNiksIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMjUsMzgwLCBob2xkaW5nIFRyYWNrIERhbWFnZSBjb25zdGFudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBkb2xsYXIgc3BlbnQgb24gVHJhY2sgRGFtYWdlICgwLjU0LCBwIDwgMmUtMTYpLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCBcJDAuNTQsIGhvbGRpbmcgQ2FycyBEZXJhaWxlZCBjb25zdGFudC4gVGhpcyBtb2RlbCBleHBsYWlucyA0Ny4yOSUgb2YgdGhlIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlLiBUaGUgbW9kZWwgaXMgaGlnaGx5IHNpZ25pZmljYW50IChGID0gMTE3NiwgcCA9IDApDQoNCiMjIDQuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCiMgRml0IG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQojIFBsb3QgcmVzaWR1YWxzIHZzIGZpdHRlZCB0byBjaGVjayBhc3N1bXB0aW9ucw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDEpDQpwYXIobWZyb3cgPSBjKDEsMSkpDQpgYGAgDQogIA0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgdHdvIHN0cm9uZyB0YWlscywgaW5kaWNhdGluZyBub24tbm9ybWFsaXR5LiBUaGUgU2NhbGUgTG9jYXRpb24gcGxvdCBzaG93cyBhIGxhY2sgb2YgY29uc3RhbnQgdmFyaWFuY2UgYW5kIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdCBzaG93cyBhbiBvdXRsaWVyIGF0IDM5MC4gVGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIA0KDQojIDUgTW9kZWwgMjogSW50ZXJhY3Rpb24gVGVybSANCg0KICBOb3csIEkgYW0gZ29pbmcgdG8gaW5jb3Jwb3JhdGUgdGhlIGludGVyYWN0aW9uIHRlcm0sIENhcnNEZXI6VHJrRGFtZywgZXhjbHVkZSB0aGUgbWFpbiBlZmZlY3RzLCBhbmQgc2VlIGlmIHRoZSBSLXNxdWFyZWQgdmFsdWUgaW5jcmVhc2VkIGFuZCBpZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJJ2xsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlIG1vZGVsIGFzIGEgd2hvbGUgaXMgc2lnbmlmaWNhbnQuIElmIGl0J3Mgbm90LCB0aGVuIEknbGwgYmUgcmVtb3ZpbmcgdGhlIHRlcm0gYW5kIGdvIGZvcndhcmQgd2l0aCB0aGUgTUxSIG1vZGVsLiANCg0KIyA1LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBJbnRlcmFjdGlvbg0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwyKQ0KYGBgDQoNCkZvciBlYWNoIGFkZGl0aW9uYWwgdW5pdCBpbmNyZWFzZSBpbiBDYXJzRGVyOlRya0RhbWcsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5ICQwLjA3LiBUaGUgaW50ZXJhY3Rpb24gdGVybSBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSAyMTU1LCBwID0gMCkuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDUuMTIlIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gDQoNCiMjIDUuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbA0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgUmVzaWR1YWwgZGlhZ25vc3RpY3MNCnBhcihtZnJvdyA9IGMoMiwyKSkgICMgc2hvdyA0IHBsb3RzIHRvZ2V0aGVyDQpwbG90KG1vZGVsMikNCnBhcihtZnJvdyA9IGMoMSwxKSkgICMgcmVzZXQgbGF5b3V0DQpgYGANCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgb25lIHN0cm9uZyB0YWlsLCBzaG93aW5nIG5vbi1ub3JtYWxpdHkuIFRoZSBTY2FsZSBMb2NhdGlvbiBwbG90IHNob3dzIGEgbGFjayBvZiBjb25zdGFudCB2YXJpYW5jZSBhbmQgdGhlIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBwbG90IHNob3dzIGFuIG91dGxpZXIgYXQgMTQxNC4gQWxsIGluIGFsbCwgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuDQoNCiMgNiBNb2RlbCAzOiBJbnRlcmFjdGlvbiBUZXJtIHdpdGggTWFpbiBFZmZlY3RzDQoNCkZpbmFsbHksIEkgd2lsbCBiZSB1c2luZyBib3RoIG1haW4gZWZmZWN0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSB0byBjcmVhdGUgTW9kZWwgMy4NCg0KIyMgNi4xIEluZmVyZW50aWFsIFN0YXRpc3RpY3MNCg0KYGBge3J9DQojIE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nDQptb2RlbDMgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KQ2FycyBEZXJhaWxlZCAoMTcsMzUwLCBwIDwgMmUtMTYpLCBUcmFjayBEYW1hZ2UgKDAuMDczLCBwID0gMC4wOTUpLCBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSAocCA9IDApIGFyZSBhbGwgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gU2luY2UgdGhlIGludGVyYWN0aW9uIHRlcm0gaXMgc2lnbmlmaWNhbnQsIHRoaXMgbWVhbnMgdGhhdCB0aGUgdmFyaWFibGVzIGRlcGVuZCBvbiBlYWNoIG90aGVyLiBUaGUgZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgb24gRXF1aXBtZW50IERhbWFnZSBncm93cyBhcyBUcmFjayBEYW1hZ2UgZ3Jvd3MuIFdoZW4gYm90aCBDYXJzIERlcmFpbGVkIGFuZCBUcmFjayBEYW1hZ2UgYXJlIHplcm8sIHRoZSBleHBlY3RlZCBFcXVpcG1lbnQgRGFtYWdlIGlzIFwkMzQwMC4gVGhlIGludGVyY2VwdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBjYXIgZGVyYWlsZWQsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMTcsMzUwIG9uIGF2ZXJhZ2UsIGhvbGRpbmcgVHJhY2sgRGFtYWdlIGNvbnN0YW50IGF0IHplcm8uIEVhY2ggYWRkaXRpb25hbCBkb2xsYXIgb2YgVHJhY2sgRGFtYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBhYm91dCBcJDAuMDcgb2YgYWRkaXRpb25hbCBFcXVpcG1lbnQgRGFtYWdlLiBUaGlzIG1vZGVsIGV4cGxhaW5zIDUzLjM5JSBvZiB0aGUgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UuIFRoZSBtb2RlbCBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSA5OTcuMywgcCA9IDApLg0KDQojIyA2LjIgUmVzaWR1YWwgQW5hbHlzaXMNCg0KYGBge3J9DQojIFJlc2lkdWFsIGRpYWdub3N0aWMgcGxvdHMNCnBhcihtZnJvdyA9IGMoMiwyKSkNCnBsb3QobW9kZWwzKQ0KcGFyKG1mcm93ID0gYygxLDEpKSAgIyByZXNldA0KYGBgDQoNClRoZSBhc3N1bXB0aW9ucyBvZiBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIFRoZXJlIGlzIG5vIGNvbnN0YW50IHZhcmlhbmNlIGluIHRoZSBSZXNpZHVhbHMgdnMgRml0dGVkIHBsb3QsIHRoZXJlIGlzIGEgc3Ryb25nIHJpZ2h0IHRhaWwgaW4gdGhlIFEtUSBSZXNpZHVhbHMgcGxvdCwgdGhlIFNjYWxlIExvY2F0aW9uIHBsb3QgZG9lcyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgYW5kIHRoZXJlIGlzIG9uZSBvdXRsaWVyLCAxNDE0LCBpbiB0aGUgUmVzaWR1YWxzIHZzIExldmVyYWdlIHBsb3QuIA0KDQojIDcgQU5PVkENCg0KYGBge3J9DQphbm92YShtb2RlbDEsIG1vZGVsMiwgbW9kZWwzKQ0KYGBgDQoNClRoZSBBTk9WQSB0YWJsZSBzaG93cyB0aGF0IGFkZGluZyB0aGUgaW50ZXJhY3Rpb24gdGVybSB0byB0aGUgbWFpbiBlZmZlY3RzIHNpZ25pZmljYW50bHkgaW1wcm92ZXMgdGhlIG1vZGVsLiBBcyBhIHJlc3VsdCwgTW9kZWwgMyBpcyB0aGUgYmVzdCBtb2RlbCBiZWNhdXNlIGl0IHJlZHVjZXMgcmVzaWR1YWwgdmFyaWF0aW9uIHRoZSBtb3N0LiBNb2RlbCAyIGlzIHRoZSB3b3JzdCBvZiB0aGUgdGhyZWUgbW9kZWxzIGJlY2F1c2UgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgaW5mbHVlbmNlIHRoYXQgdGhlIGluZGVwZW5kZW50IG1haW4gZWZmZWN0cyBoYXZlIG9uIHRoZSBtb2RlbC4gTW9kZWwgMiBhbHNvIGhhcyB0aGUgaGlnaGVzdCByZXNpZHVhbCBzdW0gb2Ygc3F1YXJlcywgbWVhbmluZyB0aGVyZSBpcyBtb3JlIHVuZXhwbGFpbmVkIHZhcmlhdGlvbiBpbiB0aGlzIG1vZGVsIGNvbXBhcmVkIHRvIHRoZSBvdGhlciB0d28uDQoNCiMgOCBOb25wYXJhbWV0cmljIFRlc3RzDQoNCldlIGFyZSBnb2luZyB0byBtb3ZlIGZvcndhcmQgd2l0aCBNb2RlbCAzIGJlY2F1c2Ugd2UgZXN0YWJsaXNoZWQgaXQgYXMgdGhlIGJlc3Qgb2YgdGhlIHRocmVlLiBJIHdpbGwgYmUgY29uZHVjdGluZyBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24gYW5kIEJvb3RzdHJhcCBjb25maWRlbmNlIGludGVydmFscyBiZWNhdXNlIHRoZSBhc3N1bXB0aW9ucyBmb3Igbm9ybWFsaXR5IHdlcmUgbm90IG1ldC4NCg0KIyMgOC4xIEJveC1Db3ggVHJhbnNmb3JtYXRpb24NCg0KYGBge3J9DQoNCmxpYnJhcnkoTUFTUykNCg0KIyBTaGlmdCB0aGUgcmVzcG9uc2UgdG8gbWFrZSBhbGwgdmFsdWVzIHBvc2l0aXZlDQpteURhdGEkRXFwRGFtZ19wb3MgPC0gbXlEYXRhJEVxcERhbWcgKyBhYnMobWluKG15RGF0YSRFcXBEYW1nKSkgKyAxDQoNCiMgRml0IE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgaW50ZXJhY3Rpb24NCm1vZGVsM19wb3MgPC0gbG0oRXFwRGFtZ19wb3MgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IG15RGF0YSkNCg0KIyBCb3gtQ294IHRyYW5zZm9ybWF0aW9uDQpiYyA8LSBib3hjb3gobW9kZWwzX3BvcywNCiAgICAgICAgICAgICBsYW1iZGEgPSBzZXEoLTIsIDIsIDAuMSksDQogICAgICAgICAgICAgbGFtYmRhLmxhYiA9ICJMYW1iZGEiLA0KICAgICAgICAgICAgIHlsYWIgPSAiTG9nLUxpa2VsaWhvb2QiLA0KICAgICAgICAgICAgIG1haW4gPSAiQm94LUNveCBUcmFuc2Zvcm1hdGlvbiBmb3IgTW9kZWwgMyIpDQoNCiMgSWRlbnRpZnkgbGFtYmRhIHRoYXQgbWF4aW1pemVzIGxvZy1saWtlbGlob29kDQpsYW1iZGFfb3B0IDwtIGJjJHhbd2hpY2gubWF4KGJjJHkpXQ0KbGFtYmRhX29wdA0KYGBgDQoNCkkgY29uZHVjdGVkIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiB0byBhc3Nlc3Mgd2hldGhlciB0cmFuc2Zvcm1pbmcgRXF1aXBtZW50IERhbWFnZSB3b3VsZCBpbXByb3ZlIHRoZSBtb2RlbCBhc3N1bXB0aW9ucy4gU2luY2UgzrsgPSAxIGlzIHdpdGhpbiB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbCwgbm8gdHJhbnNmb3JtYXRpb24gaXMgbmVlZGVkLg0KDQojIyA4LjIgQm9vdHN0cmFwIENvbmZpZGVuY2UgSW50ZXJ2YWxzDQoNCmBgYHtyIGJvb3RzdHJhcCBzZXR1cH0NCmxpYnJhcnkoYm9vdCkNCg0KIyBEZWZpbmUgZnVuY3Rpb24gdG8gZXh0cmFjdCBjb2VmZmljaWVudHMNCmJvb3RfY29lZiA8LSBmdW5jdGlvbihkYXRhLCBpbmRpY2VzKSB7DQogIGQgPC0gZGF0YVtpbmRpY2VzLCBdICAjIHJlc2FtcGxlIHJvd3MNCiAgZml0IDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyICsgVHJrRGFtZyArIENhcnNEZXI6VHJrRGFtZywgZGF0YSA9IGQpDQogIHJldHVybihjb2VmKGZpdCkpDQp9DQoNCiMgUnVuIGJvb3RzdHJhcA0Kc2V0LnNlZWQoMTIzKSAgIyBmb3IgcmVwcm9kdWNpYmlsaXR5DQpib290X3Jlc3VsdHMgPC0gYm9vdChkYXRhID0gbXlEYXRhLCBzdGF0aXN0aWMgPSBib290X2NvZWYsIFIgPSAxMDAwKSAgIyAxMDAwIHJlc2FtcGxlcw0KDQojIENyZWF0ZSBhIHRpZHkgdGFibGUgb2YgOTUlIHBlcmNlbnRpbGUgQ0lzIGZvciBhbGwgY29lZmZpY2llbnRzDQpjb2VmX25hbWVzIDwtIG5hbWVzKGNvZWYobW9kZWwzKSkNCmNpX2xpc3QgPC0gbGFwcGx5KDE6bGVuZ3RoKGNvZWZfbmFtZXMpLCBmdW5jdGlvbihpKSB7DQogIGNpIDwtIGJvb3QuY2koYm9vdF9yZXN1bHRzLCB0eXBlID0gInBlcmMiLCBpbmRleCA9IGkpJHBlcmNlbnRbNDo1XQ0KICBkYXRhLmZyYW1lKENvZWZmaWNpZW50ID0gY29lZl9uYW1lc1tpXSwNCiAgICAgICAgICAgICBMb3dlcjk1ID0gY2lbMV0sDQogICAgICAgICAgICAgVXBwZXI5NSA9IGNpWzJdKQ0KfSkNCg0KY2lfdGFibGUgPC0gZG8uY2FsbChyYmluZCwgY2lfbGlzdCkNCnByaW50KGNpX3RhYmxlKQ0KYGBgDQoNClRoZSBDYXJzIERlcmFpbGVkIGludGVydmFsIGlzIGVudGlyZWx5IHBvc2l0aXZlLiBUaGlzIGluZGljYXRlcyBzdHJvbmcgZXZpZGVuY2Ugb2YgYSBwb3NpdGl2ZSBlZmZlY3QuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIENhcnMgRGVyYWlsZWQgaXMgYmV0d2VlbiAxMiw4MDAgYW5kIDIxLDcwMC4gVGhlIGludGVydmFsIGZvciBUcmFjayBEYW1hZ2UgaW5jbHVkZXMgMCwgd2hpY2ggbWVhbnMgdGhlIGVmZmVjdCBhbG9uZSBtYXkgbm90IGhhdmUgYSBjb25zaXN0ZW50IGVmZmVjdCBvbiBFcXVpcG1lbnQgRGFtYWdlLiBXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSBzbG9wZSBvZiBUcmFjayBEYW1hZ2UgaXMgYmV0d2VlbiAtMC4xMjQgYW5kIDAuMzIyLiBUaGUgaW50ZXJ2YWwgZm9yIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIGVudGlyZWx5IHBvc2l0aXZlLCBtZWFuaW5nIHRoZSBpbnRlcmFjdGlvbiBpcyBtZWFuaW5nZnVsLiBXZSBhcmUgOTUlIGNvbmZpZGVudCB0aGF0IHRoZSBzbG9wZSBvZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBiZXR3ZWVuIDAuMDMgYW5kIDAuMDYuDQoNCiMgOSBDb25jbHVzaW9uDQoNCiAgSW4gY29uY2x1c2lvbiwgdGhlIG1vZGVsIHdpdGggdGhlIGludGVyYWN0aW9uIHRlcm0gYW5kIGJvdGggbWFpbiBlZmZlY3RzLCBNb2RlbCAzLCB3YXMgdGhlIGJlc3QgbW9kZWwgb2YgdGhlIHRocmVlLiBJdCBleHBsYWluZWQgdGhlIGhpZ2hlc3QgdmFyaWF0aW9uIGluIEVxdWlwbWVudCBEYW1hZ2UgKDUzLjI5JSkuIFdlIGFyZSBjZXJ0YWluIHRoYXQgdGhlIG1haW4gZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgaXMgc2lnbmlmaWNhbnQsIGJ1dCBhcmUgdW5zdXJlIGlmIFRyYWNrIERhbWFnZSBhbG9uZSBpcyBzaWduaWZpY2FudCBiZWNhdXNlIGl0cyA5NSUgYm9vdHN0cmFwIGludGVydmFsIGNvbnRhaW5zIDAuIFRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIG1lYW5pbmcgdGhhdCB0aGUgZWZmZWN0IG9mIENhcnMgRGVyYWlsZWQgZGVwZW5kcyBvbiBUcmFjayBEYW1hZ2UgYW5kIHZpY2UgdmVyc2EuIA0KICANCiMgMTAgUmVmZXJlbmNlcw0KDQpzYWZldHlkYXRhLmZyYS5kb3QuZ292DQoNCg0KDQo=