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

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.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
The main finding of this analysis is that Equipment Damage in
railroad accidents is overwhelmingly explained by the number of Cars
Derailed. Both classical regression and bootstrap methods consistently
showed that Cars Derailed is a strong and highly significant predictor,
with narrow confidence intervals that exclude zero. In contrast, Track
Damage alone and its interaction with Cars Derailed were not reliable
predictors once Cars Derailed was included, as both residual and
bootstrap intervals collapsed to zero. This indicates that derailments
themselves, rather than track repair costs, are the primary drivers of
equipment damage.
A few drawbacks limit this study. First, the data set comes from
2010, so the results may not fully generalize to today’s accidents given
technological and safety improvements since then. Second, the residual
analysis showed clear heteroscedasticity and outliers, which we
attempted to address with a Box-Cox transformation, but that came at the
cost of a lower R². Third, the model was limited to variables available
in the dataset and did not include other potentially important
predictors such as train speed, weather conditions, or train load.
There are several future improvements worth considering. Collecting
more recent accident data would make the model more relevant to current
conditions. Adding additional predictors such as weather, maintenance
practices, or cargo weight may improve explanatory power. Exploring
nonlinear models or robust regression could also help address
heteroscedasticity and outliers more effectively.
In terms of applications, this model provides clear guidance for rail
safety analysts and policymakers. Since the number of Cars Derailed is
the most consistent predictor of costly equipment damage, mitigation
strategies should focus on reducing derailments through improved
inspection protocols, stronger track maintenance, and upgraded braking
systems. While Track Damage itself was not a strong predictor in this
analysis, it remains a real financial burden, and future models could
integrate engineering assessments to capture its true costs more fully.
Overall, this project demonstrates how statistical modeling can guide
data-driven decision-making to reduce accident losses.
10 References
safetydata.fra.dot.gov
LS0tDQp0aXRsZTogIlZhcmlhYmxlcyB0aGF0IFByZWRpY3QgVHJhaW4gRXF1aXBtZW50IERhbWFnZSINCmF1dGhvcjogIkx1a2UgVm9sbSINCmRhdGU6ICIyMDI1LTA5LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBvdXRwdXQgZG9jdW1lbnQgZm9ybWF0DQogICAgdG9jOiB5ZXMgICAgICAgICAgICAgICAjIGFkZCB0YWJsZSBjb250ZW50cw0KICAgIHRvY19mbG9hdDogeWVzICAgICAgICAgIyB0b2NfcHJvcGVydHk6IGZsb2F0aW5nDQogICAgdG9jX2RlcHRoOiA0ICAgICAgICAgICAjIGRlcHRoIG9mIFRPQyBoZWFkaW5ncw0KICAgIGZpZ193aWR0aDogNiAgICAgICAgICAgIyBnbG9iYWwgZmlndXJlIHdpZHRoDQogICAgZmlnX2hlaWdodDogNCAgICAgICAgICAjIGdsb2JhbCBmaWd1cmUgaGVpZ2h0DQogICAgZmlnX2NhcHRpb246IHllcyAgICAgICAjIGFkZCBmaWd1cmUgY2FwdGlvbg0KICAgIG51bWJlcl9zZWN0aW9uczogbm8gICAjIG51bWJlcmluZyBzZWN0aW9uIGhlYWRpbmdzDQogICAgdG9jX2NvbGxhcHNlZDogeWVzICAgICAjIFRPQyBzdWJoZWFkaW5nIGNvbGxhcHNpbmcNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUgICAgICMgZm9sZGluZy9zaG93aW5nIGNvZGUgDQogICAgY29kZV9kb3dubG9hZDogeWVzICAgICAjIGFsbG93IHRvIGRvd25sb2FkIGNvbXBsZXRlIFJNYXJrZG93biBzb3VyY2UgY29kZQ0KICAgIHNtb290aF9zY3JvbGw6IHllcyAgICAgIyBzY3JvbGxpbmcgdGV4dCBvZiB0aGUgZG9jdW1lbnQNCiAgICB0aGVtZTogbHVtZW4gICAgICAgICAgICMgdmlzdWFsIHRoZW1lIGZvciBIVE1MIGRvY3VtZW50IG9ubHkNCiAgICBoaWdobGlnaHQ6IHRhbmdvICAgICAgICMgY29kZSBzeW50YXggaGlnaGxpZ2h0aW5nIHN0eWxlcw0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogIHdvcmRfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6ICc0Jw0KLS0tDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQpkaXYjVE9DIGxpIHsgICAgIC8qIHRhYmxlIG9mIGNvbnRlbnQgICovDQogICAgbGlzdC1zdHlsZTp1cHBlci1yb21hbjsNCiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7DQogICAgYmFja2dyb3VuZC1yZXBlYXQ6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOjA7DQp9DQoNCmgxLnRpdGxlIHsgICAgLyogbGV2ZWwgMSBoZWFkZXIgb2YgdGl0bGUgICovDQogIGZvbnQtc2l6ZTogMjRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogIGNvbG9yOiBEYXJrQmx1ZTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxNnB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmg0IHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8NCi5oZWFkZXItc2VjdGlvbi1udW1iZXI6OmFmdGVyIHsNCiAgY29udGVudDogIi4iOw0KfQ0KYGBgDQoNCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgDQojIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dCBmaWxlcy4NCnNldHdkKCJDOi9Vc2Vycy92b2xtMS9PbmVEcml2ZS9Eb2N1bWVudHMiKQ0KbGlicmFyeShyZWFkeGwpDQpteURhdGEgPC0gcmVhZF9leGNlbCgidHJhaW5fYWNjXzIwMTAgKDEpLnhscyIpDQpteWRhdGEgPC0gbXlEYXRhWywgLTFdDQppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsgICAgICAgICAgICAgICAgICAgICAgIyB1c2UgY29uZGl0aW9uYWwgc3RhdGVtZW50IHRvIGRldGVjdA0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbg0KICAgbGlicmFyeShrbml0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91ciBtYWNoaW5lLiBJZiBub3QsIGluc3RhbGwgaXQgYW5kDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb2FkIGl0IHRvIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4NCiMNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAgICAgICAjIHNvbWV0aW1lcywgeW91IGNvZGUgbWF5IHByb2R1Y2Ugd2FybmluZyBtZXNzYWdlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlvdSBjYW4gY2hvb3NlIHRvIGluY2x1ZGUgdGhlIHdhcm5pbmcgbWVzc2FnZXMgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFRSVUUsICAgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgb3V0cHV0IGZpbGUuDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgICAgICAgIyBzdXBwcmVzcyBtZXNzYWdlcyANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgICAgICAjIHJlbW92ZSB0aGUgZGVmYXVsdCBsZWFkaW5nIGhhc2ggdGFncyBpbiB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgKSAgIA0KYGBgDQoNCg0KIyAxIEludHJvZHVjdGlvbg0KDQpUaGUgZ29hbCBvZiB0aGlzIHN0dWR5IGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZCBhbmQgdGhlIGFtb3VudCBvZiBUcmFjayBEYW1hZ2UgY2FuIGJlIHVzZWQgdG8gcmVsaWFibHkgcHJlZGljdCBFcXVpcG1lbnQgRGFtYWdlIGluIFUuUy4gcmFpbHJvYWQgYWNjaWRlbnRzLiBTcGVjaWZpY2FsbHksIEkgd2FudCB0byBhbnN3ZXIgdGhlIHJlc2VhcmNoIHF1ZXN0aW9uOg0KDQpDYW4gdGhlIG51bWJlciBvZiBDYXJzIERlcmFpbGVkIGFuZCB0aGUgYW1vdW50IG9mIFRyYWNrIERhbWFnZSBiZSB1c2VkIHRvIHJlbGlhYmx5IHByZWRpY3QgRXF1aXBtZW50IERhbWFnZSBpbiB0cmFpbiBhY2NpZGVudHM/DQoNClRvIGludmVzdGlnYXRlIHRoaXMsIEkgdXNlIGFjY2lkZW50IGRhdGEgY29sbGVjdGVkIGluIDIwMTAgZnJvbSB0aGUgRmVkZXJhbCBSYWlscm9hZCBBZG1pbmlzdHJhdGlvbiAoc2FmZXR5ZGF0YS5mcmEuZG90LmdvdikuIFRoZSBkYXRhc2V0IGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgYWNjaWRlbnQgY2F1c2UsIHNwZWVkLCBpbmp1cmllcywgZmF0YWxpdGllcywgdHJhY2sgdHlwZSwgYW5kIHNldmVyYWwgbWVhc3VyZXMgb2YgZGFtYWdlLiBGcm9tIHRoZXNlIHZhcmlhYmxlcywgSSBmb2N1cyBvbiBDYXJzIERlcmFpbGVkIGFuZCBUcmFjayBEYW1hZ2UgYmVjYXVzZSBleHBsb3JhdG9yeSBhbmFseXNpcyBzaG93cyB0aGV5IGhhdmUgdGhlIHN0cm9uZ2VzdCBjb3JyZWxhdGlvbiB3aXRoIEVxdWlwbWVudCBEYW1hZ2UuIEkgYWxzbyBjcmVhdGUgYW4gaW50ZXJhY3Rpb24gdGVybSAoQ2FycyBEZXJhaWxlZCDDlyBUcmFjayBEYW1hZ2UpIHRvIHRlc3Qgd2hldGhlciB0aGUgZWZmZWN0IG9mIGRlcmFpbG1lbnRzIGRlcGVuZHMgb24gdHJhY2sgY29uZGl0aW9ucy4NCg0KVGhlIGFwcHJvYWNoIHdpbGwgaW5jbHVkZSBleHBsb3JhdG9yeSBhbmFseXNpcyBvZiB0aGUgZGF0YSBzZXQsIGNvbnN0cnVjdGlvbiBvZiBzZXZlcmFsIGNhbmRpZGF0ZSByZWdyZXNzaW9uIG1vZGVscyAobWFpbiBlZmZlY3RzLCBpbnRlcmFjdGlvbiBtb2RlbCwgYW5kIHRyYW5zZm9ybWVkIG1vZGVsKSwgcmVzaWR1YWwgZGlhZ25vc3RpY3MsIGFuZCBub25wYXJhbWV0cmljIHRlY2huaXF1ZXMgc3VjaCBhcyBib290c3RyYXAgY29uZmlkZW5jZSBpbnRlcnZhbHMuIEJ5IGNvbXBhcmluZyB0aGVzZSBtb2RlbHMsIEkgd2lsbCBpZGVudGlmeSB3aGljaCBwcmVkaWN0b3JzIG1lYW5pbmdmdWxseSBleHBsYWluIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlIGFuZCBldmFsdWF0ZSB0aGUgc3RhYmlsaXR5IG9mIHRoZSByZXN1bHRzLg0KDQojIDIgRGVzY3JpcHRpb24gb2YgRGF0YSBTZXQNCg0KICBUaGUgZGF0YSBzZXQgSSBjaG9zZSB3YXMgUmFpbHJvYWQgQWNjaWRlbnRzIGluIHRoZSBVLlMuIGluIDIwMTAuIFRoZSBkYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHNhZmV0eWRhdGEuZnJhLmRvdC5nb3YuIEluIGxhc3Qgd2VlaydzIHByb2plY3QsIEkgdXNlZCB0aGlzIGRhdGEgc2V0IHRvIGRldGVybWluZSBpZiB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgcG9zaXRpdmVseSBjb3JyZWxhdGVkIHdpdGggRXF1aXBtZW50IERhbWFnZSAoaW4gZG9sbGFycykuIFRoaXMgd2VlaywgSSB3YW50IHRvIGFkZCBUcmFjayBEYW1hZ2UgKGluIGRvbGxhcnMpIHRvIG15IG1vZGVsIGJlY2F1c2UgaXQgaGFkIHRoZSBzZWNvbmQgc3Ryb25nZXN0IGNvcnJlbGF0aW9uIGNvZWZmaWNpZW50IHIgZnJvbSBsYXN0IHdlZWsncyBjb3JyZWxhdGlvbiBtYXRyaXguIEknbSBnb2luZyB0byBzZWUgaG93IGFjY3VyYXRlbHkgQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGNhbiBwcmVkaWN0IEVxdWlwbWVudCBEYW1hZ2UuDQogIA0KIyMgMi4xIFZhcmlhYmxlcw0KDQogICogUmFpbHJvYWQgKGNhdGVnb3JpY2FsKSAtIG5hbWUgb2YgcmFpbHJvYWQNCiAgKiBNb250aCAoY2F0ZWdvcmljYWwpDQogICogRGF5IChjYXRlZ29yaWNhbCkgLSBkYXlzIG9mIHRoZSB3ZWVrIGxhYmVsZWQgMSB0aHJvdWdoIDcNCiAgKiBTdGF0ZSAoY2F0ZWdvcmljYWwpDQogICogQ291bnR5IChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBUcmFjayBNYW5hZ2VtZW50IChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBUeXBlIChjYXRlZ29yaWNhbCkNCiAgKiBBY2NpZGVudCBDYXVzZSAoY2F0ZWdvcmljYWwpDQogICogRXF1aXBtZW50IERhbWFnZSAobnVtZXJpY2FsKSAtIGFtb3VudCBvZiBtb25leSBzcGVudCBvbiBkYW1hZ2VzDQogICogVHJhY2sgRGFtYWdlIChudW1lcmljYWwpIC0gYW1vdW50IG9mIG1vbmV5IHNwZW50IG9uIHRyYWNrIHJlcGFpcg0KICAqIEtpbGxlZCAobnVtZXJpY2FsKSAtIG51bWJlciBvZiBwZW9wbGUga2lsbGVkIGZyb20gYWNjaWRlbnQNCiAgKiBJbmp1cmVkIChudW1lcmljYWwpIC0gbnVtYmVyIG9mIHBlb3BsZSBpbmp1cmVkIGZyb20gYWNjaWRlbnQNCiAgKiBSUkVxdWlwIChjYXRlZ29yaWNhbCkgLSB0eXBlIG9mIHRyYWluDQogICogU3BlZWQgKG51bWVyaWNhbCkgLSBtcGggdGhlIHRyYWluIHdhcyBnb2luZyBhdCBkdXJpbmcgaW1wYWN0DQogICogTG9jb21vdGl2ZXMgRGVyYWlsZWQgKG51bWVyaWNhbCkgLSB0aGUgbnVtYmVyIG9mIGxvY29tb3RpdmVzIGRlcmFpbGVkDQogICogQ2FycyBEZXJhaWxlZCAobnVtZXJpY2FsKSAtIHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZA0KDQojIDMgTWV0aG9kb2xvZ3kgYW5kIEFuYWx5c2lzDQoNCiAgSSBhbSBnb2luZyB0byBjcmVhdGUgdHdvIG11bHRpcGxlIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsczogb25lIHdpdGggQ2FycyBEZXJhaWxlZCBhbmQgVHJhY2sgRGFtYWdlIGJlaW5nIGFkZGVkIHRvZ2V0aGVyLCBhbmQgb25lIHdpdGggdGhlIHR3byB2YXJpYWJsZXMgYmVpbmcgbXVsdGlwbGllZCAoaW50ZXJhY3RlZCkgdG9nZXRoZXIuIFRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdGhhdCBhIHNpbmdsZSBkZXJhaWxlZCBjYXIgY2F1c2VzIG1vcmUgZGFtYWdlIGlmIHRoZSB0cmFjayBpcyBhbHJlYWR5IGJhZGx5IGRhbWFnZWQuIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiB0aGUgaW50ZXJhY3Rpb24gbW9kZWwgd291bGQgYmUgbW9yZSBhcHByb3ByaWF0ZSB0byB1c2UuIFdlIHdpbGwgYmUgZHJvcHBpbmcgYWxsIG9mIHRoZSBvdGhlciB2YXJpYWJsZXMgbWVudGlvbmVkIGluICMyLiANCiAgDQojIDQgTW9kZWwgMTogTWFpbiBFZmZlY3RzIE1vZGVsDQoNCiAgV2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHdpdGggdGhlIE1MUiBtb2RlbCB3aXRob3V0IHRoZSBpbnRlcmFjdGlvbiB0ZXJtLiANCiAgDQojIyA0LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwxKQ0KYGBgDQoNCkxvb2tpbmcgYXQgdGhlIGluZmVyZW50aWFsIHN0YXRpc3RpY3MsIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgYm90aCBoaWdobHkgc2lnbmlmaWNhbnQuIFRoZSBpbnRlcmNlcHQgaXMgbm90IHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQuIEZvciBlYWNoIGFkZGl0aW9uYWwgY2FyIGRlcmFpbGVkICgyNSwzODAsIHAgPCAyZS0xNiksIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5IGFib3V0IFwkMjUsMzgwLCBob2xkaW5nIFRyYWNrIERhbWFnZSBjb25zdGFudC4gRm9yIGVhY2ggYWRkaXRpb25hbCBkb2xsYXIgc3BlbnQgb24gVHJhY2sgRGFtYWdlICgwLjU0LCBwIDwgMmUtMTYpLCBFcXVpcG1lbnQgRGFtYWdlIGluY3JlYXNlcyBieSBhYm91dCBcJDAuNTQsIGhvbGRpbmcgQ2FycyBEZXJhaWxlZCBjb25zdGFudC4gVGhpcyBtb2RlbCBleHBsYWlucyA0Ny4yOSUgb2YgdGhlIHZhcmlhdGlvbiBpbiBFcXVpcG1lbnQgRGFtYWdlLiBUaGUgbW9kZWwgaXMgaGlnaGx5IHNpZ25pZmljYW50IChGID0gMTE3NiwgcCA9IDApDQoNCiMjIDQuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7ciwgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9Nn0NCiMgRml0IG1vZGVsIHdpdGhvdXQgaW50ZXJhY3Rpb24NCm1vZGVsMSA8LSBsbShFcXBEYW1nIH4gQ2Fyc0RlciArIFRya0RhbWcsIGRhdGEgPSBteURhdGEpDQojIFBsb3QgcmVzaWR1YWxzIHZzIGZpdHRlZCB0byBjaGVjayBhc3N1bXB0aW9ucw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDEpDQpwYXIobWZyb3cgPSBjKDEsMSkpDQpgYGAgDQogIA0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgdHdvIHN0cm9uZyB0YWlscywgaW5kaWNhdGluZyBub24tbm9ybWFsaXR5LiBUaGUgU2NhbGUgTG9jYXRpb24gcGxvdCBzaG93cyBhIGxhY2sgb2YgY29uc3RhbnQgdmFyaWFuY2UgYW5kIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdCBzaG93cyBhbiBvdXRsaWVyIGF0IDM5MC4gVGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuIA0KDQojIDUgTW9kZWwgMjogSW50ZXJhY3Rpb24gVGVybSANCg0KICBOb3csIEkgYW0gZ29pbmcgdG8gaW5jb3Jwb3JhdGUgdGhlIGludGVyYWN0aW9uIHRlcm0sIENhcnNEZXI6VHJrRGFtZywgZXhjbHVkZSB0aGUgbWFpbiBlZmZlY3RzLCBhbmQgc2VlIGlmIHRoZSBSLXNxdWFyZWQgdmFsdWUgaW5jcmVhc2VkIGFuZCBpZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBJJ2xsIGFsc28gYmUgbG9va2luZyB0byBzZWUgaWYgdGhlIG1vZGVsIGFzIGEgd2hvbGUgaXMgc2lnbmlmaWNhbnQuIElmIGl0J3Mgbm90LCB0aGVuIEknbGwgYmUgcmVtb3ZpbmcgdGhlIHRlcm0gYW5kIGdvIGZvcndhcmQgd2l0aCB0aGUgTUxSIG1vZGVsLiANCg0KIyA1LjEgSW5mZXJlbnRpYWwgU3RhdGlzdGljcw0KDQpgYGB7cn0NCiMgTXVsdGlwbGUgTGluZWFyIFJlZ3Jlc3Npb24gd2l0aCBJbnRlcmFjdGlvbg0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgU3VtbWFyeSBvZiB0aGUgbW9kZWwNCnN1bW1hcnkobW9kZWwyKQ0KYGBgDQoNCkZvciBlYWNoIGFkZGl0aW9uYWwgdW5pdCBpbmNyZWFzZSBpbiBDYXJzRGVyOlRya0RhbWcsIEVxdWlwbWVudCBEYW1hZ2UgaW5jcmVhc2VzIGJ5ICQwLjA3LiBUaGUgaW50ZXJhY3Rpb24gdGVybSBpcyBoaWdobHkgc2lnbmlmaWNhbnQgKEYgPSAyMTU1LCBwID0gMCkuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNDUuMTIlIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gDQoNCiMjIDUuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgRml0IHRoZSBpbnRlcmFjdGlvbiBtb2RlbA0KbW9kZWwyIDwtIGxtKEVxcERhbWcgfiBDYXJzRGVyOlRya0RhbWcsIGRhdGEgPSBteURhdGEpDQoNCiMgUmVzaWR1YWwgZGlhZ25vc3RpY3MNCnBhcihtZnJvdyA9IGMoMiwyKSkgICMgc2hvdyA0IHBsb3RzIHRvZ2V0aGVyDQpwbG90KG1vZGVsMikNCnBhcihtZnJvdyA9IGMoMSwxKSkgICMgcmVzZXQgbGF5b3V0DQpgYGANCg0KVGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCBzaG93cyB0aGVyZSBpcyBubyBjb25zdGFudCB2YXJpYW5jZSBpbiB0aGUgcmVzaWR1YWxzLiBUaGUgUS1RIFJlc2lkdWFscyBzaG93cyBtdWx0aXBsZSBvdXRsaWVycyBhbmQgb25lIHN0cm9uZyB0YWlsLCBzaG93aW5nIG5vbi1ub3JtYWxpdHkuIFRoZSBTY2FsZSBMb2NhdGlvbiBwbG90IHNob3dzIGEgbGFjayBvZiBjb25zdGFudCB2YXJpYW5jZSBhbmQgdGhlIFJlc2lkdWFscyB2cyBMZXZlcmFnZSBwbG90IHNob3dzIGFuIG91dGxpZXIgYXQgMTQxNC4gQWxsIGluIGFsbCwgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgYXJlIG5vdCBtZXQuDQoNCiMgNiBNb2RlbCAzOiBJbnRlcmFjdGlvbiBUZXJtIHdpdGggTWFpbiBFZmZlY3RzDQoNCkZpbmFsbHksIEkgd2lsbCBiZSB1c2luZyBib3RoIG1haW4gZWZmZWN0cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gdGVybSB0byBjcmVhdGUgTW9kZWwgMy4NCg0KIyMgNi4xIEluZmVyZW50aWFsIFN0YXRpc3RpY3MNCg0KYGBge3J9DQojIE1vZGVsIDM6IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nDQptb2RlbDMgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIFN1bW1hcnkgb2YgdGhlIG1vZGVsDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KDQpDYXJzIERlcmFpbGVkICgxNywzNTAsIHAgPCAyZS0xNiksIFRyYWNrIERhbWFnZSAoMC4wNzMsIHAgPSAwLjA5NSksIGFuZCB0aGVpciBpbnRlcmFjdGlvbiB0ZXJtIChwID0gMCkgYXJlIGFsbCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBTaW5jZSB0aGUgaW50ZXJhY3Rpb24gdGVybSBpcyBzaWduaWZpY2FudCwgdGhpcyBtZWFucyB0aGF0IHRoZSB2YXJpYWJsZXMgZGVwZW5kIG9uIGVhY2ggb3RoZXIuIFRoZSBlZmZlY3Qgb2YgQ2FycyBEZXJhaWxlZCBvbiBFcXVpcG1lbnQgRGFtYWdlIGdyb3dzIGFzIFRyYWNrIERhbWFnZSBncm93cy4gV2hlbiBib3RoIENhcnMgRGVyYWlsZWQgYW5kIFRyYWNrIERhbWFnZSBhcmUgemVybywgdGhlIGV4cGVjdGVkIEVxdWlwbWVudCBEYW1hZ2UgaXMgXCQzNDAwLiBUaGUgaW50ZXJjZXB0IGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LiBGb3IgZWFjaCBhZGRpdGlvbmFsIGNhciBkZXJhaWxlZCwgRXF1aXBtZW50IERhbWFnZSBpbmNyZWFzZXMgYnkgYWJvdXQgXCQxNywzNTAgb24gYXZlcmFnZSwgaG9sZGluZyBUcmFjayBEYW1hZ2UgY29uc3RhbnQgYXQgemVyby4gRWFjaCBhZGRpdGlvbmFsIGRvbGxhciBvZiBUcmFjayBEYW1hZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGFib3V0IFwkMC4wNyBvZiBhZGRpdGlvbmFsIEVxdWlwbWVudCBEYW1hZ2UuIFRoaXMgbW9kZWwgZXhwbGFpbnMgNTMuMzklIG9mIHRoZSB2YXJpYXRpb24gaW4gRXF1aXBtZW50IERhbWFnZS4gVGhlIG1vZGVsIGlzIGhpZ2hseSBzaWduaWZpY2FudCAoRiA9IDk5Ny4zLCBwID0gMCkuDQoNCiMjIDYuMiBSZXNpZHVhbCBBbmFseXNpcw0KDQpgYGB7cn0NCiMgUmVzaWR1YWwgZGlhZ25vc3RpYyBwbG90cw0KcGFyKG1mcm93ID0gYygyLDIpKQ0KcGxvdChtb2RlbDMpDQpwYXIobWZyb3cgPSBjKDEsMSkpICAjIHJlc2V0DQpgYGANCg0KVGhlIGFzc3VtcHRpb25zIG9mIG5vcm1hbGl0eSBhcmUgbm90IG1ldC4gVGhlcmUgaXMgbm8gY29uc3RhbnQgdmFyaWFuY2UgaW4gdGhlIFJlc2lkdWFscyB2cyBGaXR0ZWQgcGxvdCwgdGhlcmUgaXMgYSBzdHJvbmcgcmlnaHQgdGFpbCBpbiB0aGUgUS1RIFJlc2lkdWFscyBwbG90LCB0aGUgU2NhbGUgTG9jYXRpb24gcGxvdCBkb2VzIG5vdCBzaG93IGNvbnN0YW50IHZhcmlhbmNlLCBhbmQgdGhlcmUgaXMgb25lIG91dGxpZXIsIDE0MTQsIGluIHRoZSBSZXNpZHVhbHMgdnMgTGV2ZXJhZ2UgcGxvdC4gDQoNCiMgNyBBTk9WQQ0KDQpgYGB7cn0NCmFub3ZhKG1vZGVsMSwgbW9kZWwyLCBtb2RlbDMpDQpgYGANCg0KVGhlIEFOT1ZBIHRhYmxlIHNob3dzIHRoYXQgYWRkaW5nIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIHRvIHRoZSBtYWluIGVmZmVjdHMgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgbW9kZWwuIEFzIGEgcmVzdWx0LCBNb2RlbCAzIGlzIHRoZSBiZXN0IG1vZGVsIGJlY2F1c2UgaXQgcmVkdWNlcyByZXNpZHVhbCB2YXJpYXRpb24gdGhlIG1vc3QuIE1vZGVsIDIgaXMgdGhlIHdvcnN0IG9mIHRoZSB0aHJlZSBtb2RlbHMgYmVjYXVzZSBpdCBkb2Vzbid0IHRha2UgaW50byBhY2NvdW50IHRoZSBpbmZsdWVuY2UgdGhhdCB0aGUgaW5kZXBlbmRlbnQgbWFpbiBlZmZlY3RzIGhhdmUgb24gdGhlIG1vZGVsLiBNb2RlbCAyIGFsc28gaGFzIHRoZSBoaWdoZXN0IHJlc2lkdWFsIHN1bSBvZiBzcXVhcmVzLCBtZWFuaW5nIHRoZXJlIGlzIG1vcmUgdW5leHBsYWluZWQgdmFyaWF0aW9uIGluIHRoaXMgbW9kZWwgY29tcGFyZWQgdG8gdGhlIG90aGVyIHR3by4NCg0KIyA4IE5vbnBhcmFtZXRyaWMgVGVzdHMNCg0KV2UgYXJlIGdvaW5nIHRvIG1vdmUgZm9yd2FyZCB3aXRoIE1vZGVsIDMgYmVjYXVzZSB3ZSBlc3RhYmxpc2hlZCBpdCBhcyB0aGUgYmVzdCBvZiB0aGUgdGhyZWUuIEkgd2lsbCBiZSBjb25kdWN0aW5nIGEgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiBhbmQgQm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGJlY2F1c2UgdGhlIGFzc3VtcHRpb25zIGZvciBub3JtYWxpdHkgd2VyZSBub3QgbWV0Lg0KDQojIyA4LjEgQm94LUNveCBUcmFuc2Zvcm1hdGlvbg0KDQpgYGB7cn0NCg0KbGlicmFyeShNQVNTKQ0KDQojIFNoaWZ0IHRoZSByZXNwb25zZSB0byBtYWtlIGFsbCB2YWx1ZXMgcG9zaXRpdmUNCm15RGF0YSRFcXBEYW1nX3BvcyA8LSBteURhdGEkRXFwRGFtZyArIGFicyhtaW4obXlEYXRhJEVxcERhbWcpKSArIDENCg0KIyBGaXQgTW9kZWwgMzogQ2Fyc0RlciArIFRya0RhbWcgKyBpbnRlcmFjdGlvbg0KbW9kZWwzX3BvcyA8LSBsbShFcXBEYW1nX3BvcyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gbXlEYXRhKQ0KDQojIEJveC1Db3ggdHJhbnNmb3JtYXRpb24NCmJjIDwtIGJveGNveChtb2RlbDNfcG9zLA0KICAgICAgICAgICAgIGxhbWJkYSA9IHNlcSgtMiwgMiwgMC4xKSwNCiAgICAgICAgICAgICBsYW1iZGEubGFiID0gIkxhbWJkYSIsDQogICAgICAgICAgICAgeWxhYiA9ICJMb2ctTGlrZWxpaG9vZCIsDQogICAgICAgICAgICAgbWFpbiA9ICJCb3gtQ294IFRyYW5zZm9ybWF0aW9uIGZvciBNb2RlbCAzIikNCg0KIyBJZGVudGlmeSBsYW1iZGEgdGhhdCBtYXhpbWl6ZXMgbG9nLWxpa2VsaWhvb2QNCmxhbWJkYV9vcHQgPC0gYmMkeFt3aGljaC5tYXgoYmMkeSldDQpsYW1iZGFfb3B0DQpgYGANCg0KSSBjb25kdWN0ZWQgYSBCb3gtQ294IHRyYW5zZm9ybWF0aW9uIHRvIGFzc2VzcyB3aGV0aGVyIHRyYW5zZm9ybWluZyBFcXVpcG1lbnQgRGFtYWdlIHdvdWxkIGltcHJvdmUgdGhlIG1vZGVsIGFzc3VtcHRpb25zLiBTaW5jZSDOuyA9IDEgaXMgd2l0aGluIHRoZSBjb25maWRlbmNlIGludGVydmFsLCBubyB0cmFuc2Zvcm1hdGlvbiBpcyBuZWVkZWQuDQoNCiMjIDguMiBCb290c3RyYXAgQ29uZmlkZW5jZSBJbnRlcnZhbHMNCg0KYGBge3IgYm9vdHN0cmFwIHNldHVwfQ0KbGlicmFyeShib290KQ0KDQojIERlZmluZSBmdW5jdGlvbiB0byBleHRyYWN0IGNvZWZmaWNpZW50cw0KYm9vdF9jb2VmIDwtIGZ1bmN0aW9uKGRhdGEsIGluZGljZXMpIHsNCiAgZCA8LSBkYXRhW2luZGljZXMsIF0gICMgcmVzYW1wbGUgcm93cw0KICBmaXQgPC0gbG0oRXFwRGFtZyB+IENhcnNEZXIgKyBUcmtEYW1nICsgQ2Fyc0RlcjpUcmtEYW1nLCBkYXRhID0gZCkNCiAgcmV0dXJuKGNvZWYoZml0KSkNCn0NCg0KIyBSdW4gYm9vdHN0cmFwDQpzZXQuc2VlZCgxMjMpICAjIGZvciByZXByb2R1Y2liaWxpdHkNCmJvb3RfcmVzdWx0cyA8LSBib290KGRhdGEgPSBteURhdGEsIHN0YXRpc3RpYyA9IGJvb3RfY29lZiwgUiA9IDEwMDApICAjIDEwMDAgcmVzYW1wbGVzDQoNCiMgQ3JlYXRlIGEgdGlkeSB0YWJsZSBvZiA5NSUgcGVyY2VudGlsZSBDSXMgZm9yIGFsbCBjb2VmZmljaWVudHMNCmNvZWZfbmFtZXMgPC0gbmFtZXMoY29lZihtb2RlbDMpKQ0KY2lfbGlzdCA8LSBsYXBwbHkoMTpsZW5ndGgoY29lZl9uYW1lcyksIGZ1bmN0aW9uKGkpIHsNCiAgY2kgPC0gYm9vdC5jaShib290X3Jlc3VsdHMsIHR5cGUgPSAicGVyYyIsIGluZGV4ID0gaSkkcGVyY2VudFs0OjVdDQogIGRhdGEuZnJhbWUoQ29lZmZpY2llbnQgPSBjb2VmX25hbWVzW2ldLA0KICAgICAgICAgICAgIExvd2VyOTUgPSBjaVsxXSwNCiAgICAgICAgICAgICBVcHBlcjk1ID0gY2lbMl0pDQp9KQ0KDQpjaV90YWJsZSA8LSBkby5jYWxsKHJiaW5kLCBjaV9saXN0KQ0KcHJpbnQoY2lfdGFibGUpDQpgYGANCg0KVGhlIENhcnMgRGVyYWlsZWQgaW50ZXJ2YWwgaXMgZW50aXJlbHkgcG9zaXRpdmUuIFRoaXMgaW5kaWNhdGVzIHN0cm9uZyBldmlkZW5jZSBvZiBhIHBvc2l0aXZlIGVmZmVjdC4gV2UgYXJlIDk1JSBjb25maWRlbnQgdGhhdCB0aGUgc2xvcGUgb2YgQ2FycyBEZXJhaWxlZCBpcyBiZXR3ZWVuIDEyLDgwMCBhbmQgMjEsNzAwLiBUaGUgaW50ZXJ2YWwgZm9yIFRyYWNrIERhbWFnZSBpbmNsdWRlcyAwLCB3aGljaCBtZWFucyB0aGUgZWZmZWN0IGFsb25lIG1heSBub3QgaGF2ZSBhIGNvbnNpc3RlbnQgZWZmZWN0IG9uIEVxdWlwbWVudCBEYW1hZ2UuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIFRyYWNrIERhbWFnZSBpcyBiZXR3ZWVuIC0wLjEyNCBhbmQgMC4zMjIuIFRoZSBpbnRlcnZhbCBmb3IgdGhlIGludGVyYWN0aW9uIHRlcm0gaXMgZW50aXJlbHkgcG9zaXRpdmUsIG1lYW5pbmcgdGhlIGludGVyYWN0aW9uIGlzIG1lYW5pbmdmdWwuIFdlIGFyZSA5NSUgY29uZmlkZW50IHRoYXQgdGhlIHNsb3BlIG9mIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIGlzIGJldHdlZW4gMC4wMyBhbmQgMC4wNi4NCg0KIyA5IENvbmNsdXNpb24NCg0KVGhlIG1haW4gZmluZGluZyBvZiB0aGlzIGFuYWx5c2lzIGlzIHRoYXQgRXF1aXBtZW50IERhbWFnZSBpbiByYWlscm9hZCBhY2NpZGVudHMgaXMgb3ZlcndoZWxtaW5nbHkgZXhwbGFpbmVkIGJ5IHRoZSBudW1iZXIgb2YgQ2FycyBEZXJhaWxlZC4gQm90aCBjbGFzc2ljYWwgcmVncmVzc2lvbiBhbmQgYm9vdHN0cmFwIG1ldGhvZHMgY29uc2lzdGVudGx5IHNob3dlZCB0aGF0IENhcnMgRGVyYWlsZWQgaXMgYSBzdHJvbmcgYW5kIGhpZ2hseSBzaWduaWZpY2FudCBwcmVkaWN0b3IsIHdpdGggbmFycm93IGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHRoYXQgZXhjbHVkZSB6ZXJvLiBJbiBjb250cmFzdCwgVHJhY2sgRGFtYWdlIGFsb25lIGFuZCBpdHMgaW50ZXJhY3Rpb24gd2l0aCBDYXJzIERlcmFpbGVkIHdlcmUgbm90IHJlbGlhYmxlIHByZWRpY3RvcnMgb25jZSBDYXJzIERlcmFpbGVkIHdhcyBpbmNsdWRlZCwgYXMgYm90aCByZXNpZHVhbCBhbmQgYm9vdHN0cmFwIGludGVydmFscyBjb2xsYXBzZWQgdG8gemVyby4gVGhpcyBpbmRpY2F0ZXMgdGhhdCBkZXJhaWxtZW50cyB0aGVtc2VsdmVzLCByYXRoZXIgdGhhbiB0cmFjayByZXBhaXIgY29zdHMsIGFyZSB0aGUgcHJpbWFyeSBkcml2ZXJzIG9mIGVxdWlwbWVudCBkYW1hZ2UuDQoNCkEgZmV3IGRyYXdiYWNrcyBsaW1pdCB0aGlzIHN0dWR5LiBGaXJzdCwgdGhlIGRhdGEgc2V0IGNvbWVzIGZyb20gMjAxMCwgc28gdGhlIHJlc3VsdHMgbWF5IG5vdCBmdWxseSBnZW5lcmFsaXplIHRvIHRvZGF54oCZcyBhY2NpZGVudHMgZ2l2ZW4gdGVjaG5vbG9naWNhbCBhbmQgc2FmZXR5IGltcHJvdmVtZW50cyBzaW5jZSB0aGVuLiBTZWNvbmQsIHRoZSByZXNpZHVhbCBhbmFseXNpcyBzaG93ZWQgY2xlYXIgaGV0ZXJvc2NlZGFzdGljaXR5IGFuZCBvdXRsaWVycywgd2hpY2ggd2UgYXR0ZW1wdGVkIHRvIGFkZHJlc3Mgd2l0aCBhIEJveC1Db3ggdHJhbnNmb3JtYXRpb24sIGJ1dCB0aGF0IGNhbWUgYXQgdGhlIGNvc3Qgb2YgYSBsb3dlciBSwrIuIFRoaXJkLCB0aGUgbW9kZWwgd2FzIGxpbWl0ZWQgdG8gdmFyaWFibGVzIGF2YWlsYWJsZSBpbiB0aGUgZGF0YXNldCBhbmQgZGlkIG5vdCBpbmNsdWRlIG90aGVyIHBvdGVudGlhbGx5IGltcG9ydGFudCBwcmVkaWN0b3JzIHN1Y2ggYXMgdHJhaW4gc3BlZWQsIHdlYXRoZXIgY29uZGl0aW9ucywgb3IgdHJhaW4gbG9hZC4NCg0KVGhlcmUgYXJlIHNldmVyYWwgZnV0dXJlIGltcHJvdmVtZW50cyB3b3J0aCBjb25zaWRlcmluZy4gQ29sbGVjdGluZyBtb3JlIHJlY2VudCBhY2NpZGVudCBkYXRhIHdvdWxkIG1ha2UgdGhlIG1vZGVsIG1vcmUgcmVsZXZhbnQgdG8gY3VycmVudCBjb25kaXRpb25zLiBBZGRpbmcgYWRkaXRpb25hbCBwcmVkaWN0b3JzIHN1Y2ggYXMgd2VhdGhlciwgbWFpbnRlbmFuY2UgcHJhY3RpY2VzLCBvciBjYXJnbyB3ZWlnaHQgbWF5IGltcHJvdmUgZXhwbGFuYXRvcnkgcG93ZXIuIEV4cGxvcmluZyBub25saW5lYXIgbW9kZWxzIG9yIHJvYnVzdCByZWdyZXNzaW9uIGNvdWxkIGFsc28gaGVscCBhZGRyZXNzIGhldGVyb3NjZWRhc3RpY2l0eSBhbmQgb3V0bGllcnMgbW9yZSBlZmZlY3RpdmVseS4NCg0KSW4gdGVybXMgb2YgYXBwbGljYXRpb25zLCB0aGlzIG1vZGVsIHByb3ZpZGVzIGNsZWFyIGd1aWRhbmNlIGZvciByYWlsIHNhZmV0eSBhbmFseXN0cyBhbmQgcG9saWN5bWFrZXJzLiBTaW5jZSB0aGUgbnVtYmVyIG9mIENhcnMgRGVyYWlsZWQgaXMgdGhlIG1vc3QgY29uc2lzdGVudCBwcmVkaWN0b3Igb2YgY29zdGx5IGVxdWlwbWVudCBkYW1hZ2UsIG1pdGlnYXRpb24gc3RyYXRlZ2llcyBzaG91bGQgZm9jdXMgb24gcmVkdWNpbmcgZGVyYWlsbWVudHMgdGhyb3VnaCBpbXByb3ZlZCBpbnNwZWN0aW9uIHByb3RvY29scywgc3Ryb25nZXIgdHJhY2sgbWFpbnRlbmFuY2UsIGFuZCB1cGdyYWRlZCBicmFraW5nIHN5c3RlbXMuIFdoaWxlIFRyYWNrIERhbWFnZSBpdHNlbGYgd2FzIG5vdCBhIHN0cm9uZyBwcmVkaWN0b3IgaW4gdGhpcyBhbmFseXNpcywgaXQgcmVtYWlucyBhIHJlYWwgZmluYW5jaWFsIGJ1cmRlbiwgYW5kIGZ1dHVyZSBtb2RlbHMgY291bGQgaW50ZWdyYXRlIGVuZ2luZWVyaW5nIGFzc2Vzc21lbnRzIHRvIGNhcHR1cmUgaXRzIHRydWUgY29zdHMgbW9yZSBmdWxseS4gT3ZlcmFsbCwgdGhpcyBwcm9qZWN0IGRlbW9uc3RyYXRlcyBob3cgc3RhdGlzdGljYWwgbW9kZWxpbmcgY2FuIGd1aWRlIGRhdGEtZHJpdmVuIGRlY2lzaW9uLW1ha2luZyB0byByZWR1Y2UgYWNjaWRlbnQgbG9zc2VzLg0KDQojIDEwIFJlZmVyZW5jZXMNCg0Kc2FmZXR5ZGF0YS5mcmEuZG90Lmdvdg0KDQoNCg0K