1 Data

This data set is all about all 2025 WNBA games which includes all star games. \(~\)

The filtered data set takes out the all star games and only looks at the teams within the WNBA. \(~\)

After filtering out the all star games, we want to predict specifically the team score of the median Seattle Storms game using a statistical model.

# Keep in case, below creates a simple table
#kable(summaryC)

# "Fancy Table" for league summary
summaryC %>%
  kbl(digits = 2, caption = "2025 League Stats") %>%
  kable_classic_2(full_width = F)
2025 League Stats
team_name mean_score sd_score mean_rebounds sd_rebounds mean_fgp sd_fgp mean_3pp sd_3pp mean_steals sd_steals
Aces 85.52 9.56 33.78 5.88 45.27 5.82 35.27 7.08 6.80 2.67
Dream 76.93 10.59 35.95 4.41 41.28 6.78 30.83 9.32 7.14 2.82
Fever 84.50 10.17 35.10 5.49 45.56 5.38 35.00 8.99 5.88 2.29
Liberty 84.98 9.92 36.90 5.77 44.53 5.61 35.38 10.06 7.75 2.19
Lynx 82.36 11.39 33.15 5.06 45.21 6.34 37.80 9.43 8.36 3.17
Mercury 81.93 12.60 32.26 5.39 44.28 7.34 32.97 10.34 6.55 2.12
Mystics 79.30 8.69 31.85 4.66 43.36 4.82 36.64 8.69 7.28 2.24
Sky 77.40 9.62 36.60 5.57 42.44 5.22 31.74 11.62 7.00 3.30
Sparks 78.40 10.57 32.67 5.52 42.63 6.15 32.09 11.00 7.30 2.78
Storm 82.67 9.65 34.67 6.02 43.43 5.39 28.35 9.03 9.24 3.27
Sun 80.36 9.89 33.43 4.62 44.30 5.28 32.84 11.67 7.89 3.29
Wings 84.20 11.47 34.75 4.65 44.47 5.24 32.06 11.75 7.12 2.95
# Keep in case, below creates a simple table
#kable(my_team_s)

# "Fancy Table" for win and loss median/variance
my_team_s %>%
  kbl(digits = 2, caption = "2025 Seattle Storms Win/Loss Means and Standard Deviations") %>%
  kable_classic(full_width = F)
2025 Seattle Storms Win/Loss Means and Standard Deviations
team_winner mean sd
FALSE 76.35 8.36
TRUE 86.96 8.08

2 Histogram and Boxplot

###Side by side histograms

p = df_hist %>%
  ggplot( aes(x=team_score, fill=result)) +
  geom_histogram( color="#e9ecef", alpha=0.6, position = 'identity') +
  scale_fill_manual(values=c("#2C5234", "#FBE122"))
p

boxplot(team_score ~ result, data = df_hist,
        col = c("#2C5234", "#FBE122"),
        main = "Points scored by game result",
        xlab = "Result", ylab = "Points")

These graphs show us that the average team score for a win is higher than a loss. This can be seen easier in the box plot since the median is higher in the box plot representing the winning games team score.

\(~\)

3 Models

Our first order model consists of a dependent variable team_score and independent variables field_goal_pct (fg%), total_rebounds (tr), three_point_field_goal_pct (3-pt %), and steals.

The equation for this first order model is team_score = -7.7862548 + 1.4083407 * fg% + 0.53063 * tr + 0.1411404 * 3-pt % + 0.746605 * steals.

\(~\)

After using the vif command, we found no multicollinearity issues within our variables as all values were between 1 and 2.

\(~\)

Looking at the correlation matrix, we found that no variables were highly correlated with each other. The highest correlation coefficient seen was 0.52 but that is under the threshold for high correlation.

\(~\)

4 Interaction Model

The full interaction model for predicting team score for the Seattle Storms is team_score = 28.937801 + 0.6626619 * fg% + -0.0405748 * tr + -0.3439152 * 3-pt % + -0.9288016 * steals + 0.0039546 * fg% * tr + -0.0024727 * fg% * 3-pt % + 0.0839728 * fg% * steals + 0.0240574 * tr * 3-pt% + -0.0249502 * tr * steals + -0.0293786 * 3-pt% * steals.

\(~\)

For a cleaner look for the full interaction model, look below.

Dependent variable:
team_score
field_goal_pct 0.663
(2.900)
total_rebounds -0.041
(2.714)
three_point_field_goal_pct -0.344
(2.074)
steals -0.929
(6.695)
field_goal_pct:total_rebounds 0.004
(0.053)
field_goal_pct:three_point_field_goal_pct -0.002
(0.024)
field_goal_pct:steals 0.084
(0.122)
total_rebounds:three_point_field_goal_pct 0.024
(0.029)
total_rebounds:steals -0.025
(0.071)
three_point_field_goal_pct:steals -0.029
(0.055)
Constant 28.938
(147.927)
Observations 42
R2 0.701
Adjusted R2 0.605
Residual Std. Error 6.069 (df = 31)
F Statistic 7.274*** (df = 10; 31)
Note: p<0.1; p<0.05; p<0.01

\(~\)

When reducing this model, we were given the limit of \(\alpha\) = 0.15. While reducing, I kept note of the adjusted R2 value just to see if an interaction term was not significant but predicted team score better.

\(~\)

While reducing, I ended up reducing all interaction terms except for total rebounds (tr) and 3-pt % and took note that while the interaction term was not significant at \(\alpha\) = 0.15, adjusted R2 was 0.6429 which was higher than the base model.

\(~\)

My final model is team_score = -7.7862548 + 1.4083407 * fg% + 0.53063 * tr + 0.1411404 * 3-pt % + 0.746605 * steals.

This model significantly predicts team score, f(4,37) = 18.9870959, p, adjusted R2 = 0.6370023

See table below for a clearer look for the final model.

Dependent variable:
team_score
field_goal_pct 1.408***
(0.223)
total_rebounds 0.531***
(0.173)
three_point_field_goal_pct 0.141
(0.124)
steals 0.747**
(0.287)
Constant -7.786
(12.729)
Observations 42
R2 0.672
Adjusted R2 0.637
Residual Std. Error 5.817 (df = 37)
F Statistic 18.987*** (df = 4; 37)
Note: p<0.1; p<0.05; p<0.01

\(~\)

5 Residual Analysis

# Gives us the versus fits plot to asses constant variance
ols_plot_resid_fit(model4)

# Gives us the histogram of the residuals to asses normality of the residuals
ols_plot_resid_hist(model4)

# Gives us the view for any outliers in the data
ols_plot_resid_stud(model4)

# Gives us both leverage and outliers in the data
ols_plot_resid_lev(model4, threshold = 3)

# Gives us the cooks d chart for significant values
ols_plot_cooksd_chart(model4)


\(~\)

For our residual analysis, from the histogram, we can tell that the distribution of the residuals is approximately normal with some skewness from the left. From our versus fits plot, we cannot see a pattern within the variance so we can say that there is constant variance for our residuals as well. Even with a slightly skewed histogram, I think that we can use this regression line as a solid predictor for the Seattle Storms team score.

We have influential values at games 10, 12, 37, and 41. \(~\)

We also have leverage points at games 12, 37, and 41. \(~\)

Game 10 was against the Connecticut Suns. \(~\)

Game 12 was against the New York Liberties. \(~\)

Game 37 was against the Washington Mystics. \(~\)

Game 41 was against the Minnesota Lynx.

\(~\)

6 Prediction

I built the model to predict my team’s points for a game in which they achieve the median value for each variable. \(~\)

The predicted team score is 82.0419787, with 95% confidence interval (80.1458374, 83.93812).

LS0tDQp0aXRsZTogIjIwMjUgV05CQSBTZWF0dGxlIFN0b3JtcyBBbmFseXNpcyINCmF1dGhvcjogIk1hcml1cyBEYXZpZCBGaXJ1bG92aWNpIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2NfY29sbGFwc2VkOiB5ZXMNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4NCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAga2VlcF9tZDogeWVzDQplZGl0b3Jfb3B0aW9uczogDQogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUNCi0tLQ0KDQpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9DQojVE9DOjpiZWZvcmUgew0KICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOw0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1zaXplOiAxLjJlbTsNCiAgZGlzcGxheTogYmxvY2s7DQogIGNvbG9yOiBuYXZ5Ow0KICBtYXJnaW4tYm90dG9tOiAxMHB4Ow0KfQ0KDQoNCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8NCiAgICBsaXN0LXN0eWxlOnVwcGVyLXJvbWFuOw0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCn0NCg0KaDEudGl0bGUgeyAgICAvKiBsZXZlbCAxIGhlYWRlciBvZiB0aXRsZSAgKi8NCiAgZm9udC1zaXplOiAyMnB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgY29sb3I6IERhcmtSZWQ7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KfQ0KDQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICBmb250LXNpemU6IDE1cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICBjb2xvcjogbmF2eTsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDEgeyAvKiBIZWFkZXIgMSAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMjBweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLw0KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgew0KICBjb250ZW50OiAiLiI7DQoNCmJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9DQoNCnAgeyBiYWNrZ3JvdW5kLWNvbG9yOndoaXRlOyB9DQoNCn0NCmBgYA0KDQoNCmBgYCB7ciBzZXR1cCwgaW5jbHVkZT1GfQ0KIyBTZXR1cCBDaHVuaw0KDQojIFNldHMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5ICh3ZCkgYXMgdGhlIHdvcmtpbmcgZm9sZGVyDQpzZXR3ZCgifi9TVEEgMzE5IFNwcmluZyAyMDI2IikNCg0KIyBJbXBvcnQgdGhlIFdOQkEgZGF0YSBzZXQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBTZWF0dGxlIFN0b3Jtcw0KZGF0YSA9IHJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXIgPSBUKQ0KDQojIExpYnJhcmllcyB3ZSB3aWxsIGJlIHVzaW5nIHRocm91Z2hvdXQgdGhpcyBwcm9qZWN0DQojIA0KbGlicmFyeShnZ3Bsb3QyKQ0KIyANCmxpYnJhcnkoZHBseXIpDQojIFZJRiBpbiBjYXIgcGFja2FnZQ0KbGlicmFyeShjYXIpDQojIA0KbGlicmFyeShvbHNycikNCg0KIyBQYWNrYWdlIGZvciBuaWNlciBtYXJrZG93biB0YWJsZXMNCmxpYnJhcnkoa2FibGVFeHRyYSkNCg0KIyBOaWNlciBUYWJsZXMgZm9yIFJlZ3Jlc3Npb24gYW5kIHN0dWZmDQpsaWJyYXJ5KHN0YXJnYXplcikNCg0KDQpgYGANCg0KIyBEYXRhDQoNCmBgYCB7ciB3cmFuZ2xpbmcsIGluY2x1ZGUgPSBGfQ0KIyBEYXRhIFdyYW5nbGluZyBDaHVuaw0KDQpzdW1tYXJ5KGRhdGEpDQoNCiMgRmlsdGVyaW5nIG91dCBBbGwgU3RhciBHYW1lcyAoUHJpbWFyeSB1c2UgaGVyZSkNCmRmID0gZGF0YSAlPiUNCiAgZmlsdGVyKHRlYW1faWQgPCAyMSkNCg0KIyBBbHRlcm5hdGUgd2F5IG9mIGZpbHRlcmluZyBvdXQgdGhlIEFsbCBTdGFyIEdhbWVzDQpkZjIgPSBkYXRhICU+JQ0KICBmaWx0ZXIoKHRlYW1fbmFtZSAhPSAiVGVhbSBXTkJBIiAmIHRlYW1fbmFtZSAhPSAiVGVhbSBVU0EiKSkNCg0KIyBHcm91cCBkYXRhIGJ5IHRlYW0sIGZpbmRzIG1lYW4vc2Qgb2YgYWxsIHZhcmlhYmxlcw0KDQpzdW1tYXJ5QyA9IGRmICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JQ0KICBzdW1tYXJpc2UobWVhbl9zY29yZSA9IG1lYW4odGVhbV9zY29yZSksIHNkX3Njb3JlID0gc2QodGVhbV9zY29yZSksIA0KICAgICAgICAgICAgbWVhbl9yZWJvdW5kcz1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmVib3VuZHM9c2QodG90YWxfcmVib3VuZHMpLA0KICAgICAgICAgICAgbWVhbl9mZ3A9bWVhbihmaWVsZF9nb2FsX3BjdCksIHNkX2ZncD1zZChmaWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuXzNwcD1tZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwgc2RfM3BwPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fc3RlYWxzPW1lYW4oc3RlYWxzKSwgc2Rfc3RlYWxzPXNkKHN0ZWFscykpDQoNCiMgR2l2ZXMgYSBzdW1tYXJ5IG9mIHRoZSB2YXJpYWJsZXMNCnN1bW1hcnlDDQoNCg0KIyBOZXcgRGF0YSBGcmFtZSBvbmx5IHVzaW5nIHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGVyY2VudCwgcmVib3VuZHMsIDMtUG9pbnQNCiMgUGVyY2VudGFnZSwgYW5kIFN0ZWFscw0KIyBGaWx0ZXJzIG91dCBldmVyeSB0ZWFtIGJ1dCB0aGUgU2VhdHRsZSBTdG9ybXMgIlN0b3JtIg0KDQpteV90ZWFtID0gZGYgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIA0KICAgICAgICAgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QsIHN0ZWFscywgdGVhbV9uYW1lLCB0ZWFtX3dpbm5lcikgJT4lDQogIGZpbHRlcih0ZWFtX25hbWUgPT0gIlN0b3JtIikNCg0KIyBHcm91cHMgY2FzZXMgYnkgd2luIHZzLiBsb3NzDQojIFN1bW1hcml6ZXMgYWxsIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIHNkDQoNCm15X3RlYW1fcyA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKHRlYW1fc2NvcmUpLCBzZCA9IHNkKHRlYW1fc2NvcmUpKQ0KDQpteV90ZWFtX3MNCg0KDQojTXV0YXRlIGFuZCBjYXNlX3doZW4NCg0KZGZfaGlzdCA9IGRmICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJTdG9ybSIpICU+JQ0KICBtdXRhdGUocmVzdWx0ID0gY2FzZV93aGVuKHRlYW1fd2lubmVyID09IFRSVUUgfiAiV2luIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW1fd2lubmVyID09IEZBTFNFIH4gIkxvc3MiKSkNCg0KDQoNCmBgYA0KDQoNClRoaXMgZGF0YSBzZXQgaXMgYWxsIGFib3V0IGFsbCAyMDI1IFdOQkEgZ2FtZXMgd2hpY2ggaW5jbHVkZXMgYWxsIHN0YXIgZ2FtZXMuDQokfiQNCg0KVGhlIGZpbHRlcmVkIGRhdGEgc2V0IHRha2VzIG91dCB0aGUgYWxsIHN0YXIgZ2FtZXMgYW5kIG9ubHkgbG9va3MgYXQgdGhlIHRlYW1zIHdpdGhpbiB0aGUgV05CQS4NCiR+JA0KDQpBZnRlciBmaWx0ZXJpbmcgb3V0IHRoZSBhbGwgc3RhciBnYW1lcywgd2Ugd2FudCB0byBwcmVkaWN0IHNwZWNpZmljYWxseSB0aGUgdGVhbSBzY29yZSBvZiB0aGUNCm1lZGlhbiBTZWF0dGxlIFN0b3JtcyBnYW1lIHVzaW5nIGEgc3RhdGlzdGljYWwgbW9kZWwuDQoNCmBgYHtyIHRhYmxlcywgaW5jbHVkZT1UUlVFLCBjb21tZW50PU5BfQ0KDQojIEtlZXAgaW4gY2FzZSwgYmVsb3cgY3JlYXRlcyBhIHNpbXBsZSB0YWJsZQ0KI2thYmxlKHN1bW1hcnlDKQ0KDQojICJGYW5jeSBUYWJsZSIgZm9yIGxlYWd1ZSBzdW1tYXJ5DQpzdW1tYXJ5QyAlPiUNCiAga2JsKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiMjAyNSBMZWFndWUgU3RhdHMiKSAlPiUNCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQ0KDQojIEtlZXAgaW4gY2FzZSwgYmVsb3cgY3JlYXRlcyBhIHNpbXBsZSB0YWJsZQ0KI2thYmxlKG15X3RlYW1fcykNCg0KIyAiRmFuY3kgVGFibGUiIGZvciB3aW4gYW5kIGxvc3MgbWVkaWFuL3ZhcmlhbmNlDQpteV90ZWFtX3MgJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gIjIwMjUgU2VhdHRsZSBTdG9ybXMgV2luL0xvc3MgTWVhbnMgYW5kIFN0YW5kYXJkIERldmlhdGlvbnMiKSAlPiUNCiAga2FibGVfY2xhc3NpYyhmdWxsX3dpZHRoID0gRikNCg0KDQpgYGANCg0KIyBIaXN0b2dyYW0gYW5kIEJveHBsb3QNCg0KYGBge3IgZ3JhcGhzLCBpbmNsdWRlID0gVCwgZmlnLndpZHRoID0gNCwgZmlnLmhlaWdodCA9IDQsIG1lc3NhZ2UgPSBGfQ0KIyMjU2lkZSBieSBzaWRlIGhpc3RvZ3JhbXMNCg0KcCA9IGRmX2hpc3QgJT4lDQogIGdncGxvdCggYWVzKHg9dGVhbV9zY29yZSwgZmlsbD1yZXN1bHQpKSArDQogIGdlb21faGlzdG9ncmFtKCBjb2xvcj0iI2U5ZWNlZiIsIGFscGhhPTAuNiwgcG9zaXRpb24gPSAnaWRlbnRpdHknKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCIjMkM1MjM0IiwgIiNGQkUxMjIiKSkNCnANCg0KYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwNCiAgICAgICAgY29sID0gYygiIzJDNTIzNCIsICIjRkJFMTIyIiksDQogICAgICAgIG1haW4gPSAiUG9pbnRzIHNjb3JlZCBieSBnYW1lIHJlc3VsdCIsDQogICAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKQ0KDQpgYGANCg0KVGhlc2UgZ3JhcGhzIHNob3cgdXMgdGhhdCB0aGUgYXZlcmFnZSB0ZWFtIHNjb3JlIGZvciBhIHdpbiBpcyBoaWdoZXIgdGhhbiBhIGxvc3MuIA0KVGhpcyBjYW4gYmUgc2VlbiBlYXNpZXIgaW4gdGhlIGJveCBwbG90IHNpbmNlIHRoZSBtZWRpYW4gaXMgaGlnaGVyIGluIHRoZSBib3ggcGxvdCByZXByZXNlbnRpbmcgdGhlIHdpbm5pbmcgZ2FtZXMgdGVhbSBzY29yZS4NCg0KJH4kDQoNCiMgTW9kZWxzDQoNCg0KYGBgIHtyIGZpcnN0IG9yZGVyIG1vZGVsLCBlY2hvID0gRiwgaW5jbHVkZSA9IEZ9DQoNCiMgRmlyc3QgT3JkZXIgTW9kZWwNCm1vZGVsMSA9IGxtKHRlYW1fc2NvcmUgfiBmaWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzKyANCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KyBzdGVhbHMsDQogICAgICAgICBkYXRhID0gbXlfdGVhbSkNCg0Kc3VtbWFyeShtb2RlbDEpDQoNCiMgR2l2ZXMgdXMgdGhlIFZJRiBmb3Igb3VyIDFzdCBtb2RlbCB0byBmaW5kIG11bHRpY29sbGluZWFyaXR5DQp2aWYobW9kZWwxKQ0KDQojIEdpdmVzIHVzIG9ubHkgaW5kZXBlbmRlbnQgdmFyaWFibGVzDQpjb3JfZGF0YSA9IG15X3RlYW0gJT4lDQogIHNlbGVjdChmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LA0KICAgICAgICAgc3RlYWxzKQ0KDQojIEdpdmVzIHVzIGEgY29ycmVsYXRpb24gbWF0cml4IGJldHdlZW4gb3VyIGluZGVwZW5kZW50IHZhcmlhYmxlcw0KY29yKGNvcl9kYXRhKQ0KDQoNCiMgTm8gbmVlZCBmb3IgbW9kZWwgMiBhcyB0aGVyZSB3ZXJlIG5vIGhpZ2hseSBjb3JyZWxhdGVkIHBhaXJzICh8cnw+IDAuOCkNCiMgVklGIHZhbHVlcyBhbHNvIGxvb2sgZmluZSwgbm90aGluZyBhYm92ZSA0DQojIFNob3J0ZW5lZCB0b3RhbCByZWJvdW5kcyB0byB0ciBmb3Igd3JpdGluZyBwdXJwb3NlcyBpbiBuYXJyYXRpdmUNCg0KYGBgDQoNCk91ciBmaXJzdCBvcmRlciBtb2RlbCBjb25zaXN0cyBvZiBhIGRlcGVuZGVudCB2YXJpYWJsZSB0ZWFtX3Njb3JlIGFuZCBpbmRlcGVuZGVudA0KdmFyaWFibGVzIGZpZWxkX2dvYWxfcGN0IChmZyUpLCB0b3RhbF9yZWJvdW5kcyAodHIpLCB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCAoMy1wdCAlKSwNCmFuZCBzdGVhbHMuDQoNClRoZSBlcXVhdGlvbiBmb3IgdGhpcyBmaXJzdCBvcmRlciBtb2RlbCBpcyB0ZWFtX3Njb3JlID0gYHIgbW9kZWwxJGNvZWZmaWNpZW50c1sxXWAgKyBgciBtb2RlbDEkY29lZmZpY2llbnRzWzJdYCAqIGZnJSArDQpgciBtb2RlbDEkY29lZmZpY2llbnRzWzNdYCAqIHRyICsgYHIgbW9kZWwxJGNvZWZmaWNpZW50c1s0XWAgKiAzLXB0ICUgKw0KYHIgbW9kZWwxJGNvZWZmaWNpZW50c1s1XWAgKiBzdGVhbHMuDQoNCiR+JA0KDQpBZnRlciB1c2luZyB0aGUgdmlmIGNvbW1hbmQsIHdlIGZvdW5kIG5vIG11bHRpY29sbGluZWFyaXR5IGlzc3VlcyB3aXRoaW4gb3VyIHZhcmlhYmxlcw0KYXMgYWxsIHZhbHVlcyB3ZXJlIGJldHdlZW4gMSBhbmQgMi4NCg0KJH4kDQoNCkxvb2tpbmcgYXQgdGhlIGNvcnJlbGF0aW9uIG1hdHJpeCwgd2UgZm91bmQgdGhhdCBubyB2YXJpYWJsZXMgd2VyZSBoaWdobHkgY29ycmVsYXRlZA0Kd2l0aCBlYWNoIG90aGVyLiBUaGUgaGlnaGVzdCBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCBzZWVuIHdhcyAwLjUyIGJ1dCB0aGF0IGlzIHVuZGVyDQp0aGUgdGhyZXNob2xkIGZvciBoaWdoIGNvcnJlbGF0aW9uLg0KDQokfiQNCg0KIyBJbnRlcmFjdGlvbiBNb2RlbA0KDQpgYGAge3IgaW50ZXJhY3Rpb24gbW9kZWwsIHJlc3VsdHMgPSAnYXNpcycsIGVjaG8gPSBGLCBpbmNsdWRlID0gRiwgY29tbWVudD1OQX0NCg0KIyBGdWxsIGludGVyYWN0aW9uIG1vZGVsIChDb25zaWRlcmVkIE1vZGVsIDMgZHVlIHRvIGFzc2lnbm1lbnQpDQptb2RlbDMgPSBsbSh0ZWFtX3Njb3JlIH4gZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyANCiAgICAgICAgICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QrIHN0ZWFscw0KICAgICAgICAgKyBmaWVsZF9nb2FsX3BjdCAqIHRvdGFsX3JlYm91bmRzIA0KICAgICAgICAgKyBmaWVsZF9nb2FsX3BjdCAqIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0DQogICAgICAgICArIGZpZWxkX2dvYWxfcGN0ICogc3RlYWxzDQogICAgICAgICArIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QNCiAgICAgICAgICsgdG90YWxfcmVib3VuZHMgKiBzdGVhbHMNCiAgICAgICAgICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKiBzdGVhbHMgDQogICAgICAgICAsIGRhdGEgPSBteV90ZWFtKQ0KDQojIFN1bW1hcml6ZXMgbW9kZWwgMw0Kc3VtbWFyeShtb2RlbDMpDQoNCg0KDQojIEludGVyYWN0aW9uIE1vZGVsIEFkanVzdGVkIGZvciB3aGVuIGFscGhhID0gMC4xNSAoQWthIFAgPiAwLjE1KQ0KIyBObyBpbnRlcmFjdGlvbiB0ZXJtIHdhcyBzaWduaWZpY2FudCBhdCBhbHBoYSA9IDAuMTUNCiMgQ2xvc2VzdCBvbmUgd2FzIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgYXQgcCA9IDAuMjEyNDMNCg0KbW9kZWw0ID0gbG0odGVhbV9zY29yZSB+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgDQogICAgICAgICArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KyBzdGVhbHMsIGRhdGEgPSBteV90ZWFtKQ0KDQojIFN1bW1hcml6ZXMgbW9kZWwgNCBmb3IgdmlzdWFsaXphdGlvbg0KbW9kZWw0c3VtID0gc3VtbWFyeShtb2RlbDQpDQoNCmBgYA0KDQpgYGB7ciBleHBlcmltZW50LCBpbmNsdWRlID0gRiwgZWNobyA9IEZ9DQojIEV4cGVyaW1lbnRhbCBNb2RlbCwgbm90IGZvciBhY3R1YWwgZ3JhZGluZw0KIyBXYW50ZWQgdG8gc2VlIGlmIHRoZXJlIHdlcmUgYW55IHRlcm1zIHRoYXQgaGFkIGEgYmV0dGVyDQojIGFkai4gUl4yIHRoYW4gdGhlIGJhc2UgbW9kZWwNCm1vZGVsRSA9IGxtKHRlYW1fc2NvcmUgfiBmaWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzIA0KICAgICAgICAgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCsgc3RlYWxzDQogICAgICAgICArIHRvdGFsX3JlYm91bmRzICogdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QNCiAgICAgICAgICwgZGF0YSA9IG15X3RlYW0pDQoNCnN1bW1hcnkobW9kZWxFKQ0KDQpzdW1tYXJ5KG1vZGVsNCkNCg0KYGBgDQoNCmBgYCB7ciBpbmxpbmUgY29kZSwgaW5jbHVkZT1GfQ0KIyBUaGUgc3R1ZmYgaW4gcmVkIGlzIHRha2VuIGZyb20gdGhlIGdsb2JhbCBlbnZpcm9ubWVudCwgZm9ybWF0dGluZyBpcw0KIyBhIGxpdHRsZSB3ZWlyZCB0aG8sIG1ha2Ugc3VyZSB0byBjaGVjayBhbnkgZm9ybWF0dGluZyBlcnJvcnMNCiMgU3VwZXIgc2NyaXB0cyBhcmUgZG9uZSBieSBeZnVubnl0aGluZ14NCiMgJH4kIGNyZWF0ZXMgYSBibGFuayBzcGFjZQ0KIyA8YnI+IGNyZWF0ZXMgYSA8YnI+ZWFrLCB1c2VmdWwgZm9yIHRoZSBncmFwaCBsYXRlciBvbg0KYGBgDQoNClRoZSBmdWxsIGludGVyYWN0aW9uIG1vZGVsIGZvciBwcmVkaWN0aW5nIHRlYW0gc2NvcmUgZm9yIHRoZSBTZWF0dGxlIFN0b3JtcyBpcw0KdGVhbV9zY29yZSA9IGByIG1vZGVsMyRjb2VmZmljaWVudHNbMV1gICsgIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMl1gICogZmclICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzNdYCAqIHRyICsgIGByIG1vZGVsMyRjb2VmZmljaWVudHNbNF1gICogMy1wdCAlICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzVdYCAqIHN0ZWFscyArICBgciBtb2RlbDMkY29lZmZpY2llbnRzWzZdYCAqIGZnJSAqIHRyICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzddYCAqIGZnJSAqIDMtcHQgJSArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbOF1gICogZmclICogc3RlYWxzICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzldYCAqIHRyICogMy1wdCUgKw0KIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMTBdYCAqIHRyICogc3RlYWxzICsNCiBgciBtb2RlbDMkY29lZmZpY2llbnRzWzExXWAgKiAzLXB0JSAqIHN0ZWFscy4NCiANCiR+JA0KDQpGb3IgYSBjbGVhbmVyIGxvb2sgZm9yIHRoZSBmdWxsIGludGVyYWN0aW9uIG1vZGVsLCBsb29rIGJlbG93Lg0KDQpgYGAge3IgZnVsbGludGVyYWN0aW9uZ3JhcGgsIGluY2x1ZGUgPSAgVCwgZWNobyA9IEYsIHJlc3VsdHMgPSAnYXNpcyd9DQojIG1lc3NhZ2UgPSBGIGdldHMgcmlkIG9mIGEgZnV0dXJlIG1lc3NhZ2UsIEkgZGlkbid0IGhhdmUgdGhhdCBwcm9ibGVtIGhlcmUNCmxpYnJhcnkoc3RhcmdhemVyKQ0KDQojIE1ha2VzIGEgbmljZSBsb29raW5nIHRhYmxlIGZvciBvdXIgZmluYWwgbW9kZWwNCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIpDQpgYGANCg0KJH4kDQoNCldoZW4gcmVkdWNpbmcgdGhpcyBtb2RlbCwgd2Ugd2VyZSBnaXZlbiB0aGUgbGltaXQgb2YgJFxhbHBoYSQgPSAwLjE1Lg0KV2hpbGUgcmVkdWNpbmcsIEkga2VwdCBub3RlIG9mIHRoZSBhZGp1c3RlZCBSXjJeIHZhbHVlIGp1c3QgdG8gc2VlIGlmIGFuIGludGVyYWN0aW9uDQp0ZXJtIHdhcyBub3Qgc2lnbmlmaWNhbnQgYnV0IHByZWRpY3RlZCB0ZWFtIHNjb3JlIGJldHRlci4NCg0KJH4kDQoNCldoaWxlIHJlZHVjaW5nLCBJIGVuZGVkIHVwIHJlZHVjaW5nIGFsbCBpbnRlcmFjdGlvbiB0ZXJtcyBleGNlcHQgZm9yIHRvdGFsIHJlYm91bmRzICh0cikNCmFuZCAzLXB0ICUgYW5kIHRvb2sgbm90ZSB0aGF0IHdoaWxlIHRoZSBpbnRlcmFjdGlvbiB0ZXJtIHdhcyBub3Qgc2lnbmlmaWNhbnQgYXQNCiRcYWxwaGEkID0gMC4xNSwgYWRqdXN0ZWQgUl4yXiB3YXMgMC42NDI5IHdoaWNoIHdhcyBoaWdoZXIgdGhhbiB0aGUgYmFzZSBtb2RlbC4NCg0KJH4kDQoNCk15IGZpbmFsIG1vZGVsIGlzIHRlYW1fc2NvcmUgPSBgciBtb2RlbDQkY29lZmZpY2llbnRzWzFdYCArIGByIG1vZGVsNCRjb2VmZmljaWVudHNbMl1gICogZmclICsNCmByIG1vZGVsNCRjb2VmZmljaWVudHNbM11gICogdHIgKyBgciBtb2RlbDQkY29lZmZpY2llbnRzWzRdYCAqIDMtcHQgJSArDQpgciBtb2RlbDQkY29lZmZpY2llbnRzWzVdYCAqIHN0ZWFscy4NCg0KDQpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgZihgciBtb2RlbDRzdW0kZnN0YXRpc3RpY1syXWAsYHIgbW9kZWw0c3VtJGZzdGF0aXN0aWNbM11gKSA9IGByIG1vZGVsNHN1bSRmc3RhdGlzdGljWzFdYCwgDQpwLCBhZGp1c3RlZCBSXjJeID0gYHIgbW9kZWw0c3VtJGFkai5yLnNxdWFyZWRgDQoNClNlZSB0YWJsZSBiZWxvdyBmb3IgYSBjbGVhcmVyIGxvb2sgZm9yIHRoZSBmaW5hbCBtb2RlbC4NCg0KYGBgIHtyLCBpbmNsdWRlID0gVCwgZWNobyA9IEYsIHJlc3VsdHMgPSAnYXNpcyd9DQojIG1lc3NhZ2UgPSBGIGdldHMgcmlkIG9mIGEgZnV0dXJlIG1lc3NhZ2UsIEkgZGlkbid0IGhhdmUgdGhhdCBwcm9ibGVtIHRob3VnaCBoZXJlDQpsaWJyYXJ5KHN0YXJnYXplcikNCg0KIyBNYWtlcyBhIG5pY2UgbG9va2luZyB0YWJsZSBmb3Igb3VyIGZpbmFsIG1vZGVsDQpzdGFyZ2F6ZXIobW9kZWw0LCB0eXBlID0gImh0bWwiKQ0KYGBgDQoNCiR+JA0KDQojIFJlc2lkdWFsIEFuYWx5c2lzDQoNCmBgYCB7ciByZXNpZHVhbCBhbmFseXNpcywgaW5jbHVkZSA9IFQsIGZpZy53aWR0aCA9IDQsIGZpZy5oZWlnaHQgPSA0fQ0KDQojIEdpdmVzIHVzIHRoZSB2ZXJzdXMgZml0cyBwbG90IHRvIGFzc2VzIGNvbnN0YW50IHZhcmlhbmNlDQpvbHNfcGxvdF9yZXNpZF9maXQobW9kZWw0KQ0KDQojIEdpdmVzIHVzIHRoZSBoaXN0b2dyYW0gb2YgdGhlIHJlc2lkdWFscyB0byBhc3NlcyBub3JtYWxpdHkgb2YgdGhlIHJlc2lkdWFscw0Kb2xzX3Bsb3RfcmVzaWRfaGlzdChtb2RlbDQpDQoNCiMgR2l2ZXMgdXMgdGhlIHZpZXcgZm9yIGFueSBvdXRsaWVycyBpbiB0aGUgZGF0YQ0Kb2xzX3Bsb3RfcmVzaWRfc3R1ZChtb2RlbDQpDQoNCiMgR2l2ZXMgdXMgYm90aCBsZXZlcmFnZSBhbmQgb3V0bGllcnMgaW4gdGhlIGRhdGENCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDQsIHRocmVzaG9sZCA9IDMpDQoNCiMgR2l2ZXMgdXMgdGhlIGNvb2tzIGQgY2hhcnQgZm9yIHNpZ25pZmljYW50IHZhbHVlcw0Kb2xzX3Bsb3RfY29va3NkX2NoYXJ0KG1vZGVsNCkNCg0KDQoNCg0KYGBgDQoNCjxicj4NCiR+JA0KDQpGb3Igb3VyIHJlc2lkdWFsIGFuYWx5c2lzLCBmcm9tIHRoZSBoaXN0b2dyYW0sIHdlIGNhbiB0ZWxsIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgcmVzaWR1YWxzIGlzIGFwcHJveGltYXRlbHkgbm9ybWFsIHdpdGggc29tZSBza2V3bmVzcyBmcm9tIHRoZSBsZWZ0LiBGcm9tIG91ciB2ZXJzdXMgZml0cyBwbG90LCB3ZSBjYW5ub3Qgc2VlIGEgcGF0dGVybiB3aXRoaW4gdGhlIHZhcmlhbmNlIHNvIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBpcyBjb25zdGFudCB2YXJpYW5jZSBmb3Igb3VyIHJlc2lkdWFscyBhcyB3ZWxsLiBFdmVuIHdpdGggYSBzbGlnaHRseSBza2V3ZWQgaGlzdG9ncmFtLCBJIHRoaW5rIHRoYXQgd2UgY2FuIHVzZSB0aGlzIHJlZ3Jlc3Npb24gbGluZSBhcyBhIHNvbGlkIHByZWRpY3RvciBmb3IgdGhlIFNlYXR0bGUgU3Rvcm1zIHRlYW0gc2NvcmUuDQoNCldlIGhhdmUgaW5mbHVlbnRpYWwgdmFsdWVzIGF0IGdhbWVzIDEwLCAxMiwgMzcsIGFuZCA0MS4NCiR+JA0KDQpXZSBhbHNvIGhhdmUgbGV2ZXJhZ2UgcG9pbnRzIGF0IGdhbWVzIDEyLCAzNywgYW5kIDQxLg0KJH4kDQoNCkdhbWUgMTAgd2FzIGFnYWluc3QgdGhlIENvbm5lY3RpY3V0IFN1bnMuDQokfiQNCg0KR2FtZSAxMiB3YXMgYWdhaW5zdCB0aGUgTmV3IFlvcmsgTGliZXJ0aWVzLg0KJH4kDQoNCkdhbWUgMzcgd2FzIGFnYWluc3QgdGhlIFdhc2hpbmd0b24gTXlzdGljcy4NCiR+JA0KDQpHYW1lIDQxIHdhcyBhZ2FpbnN0IHRoZSBNaW5uZXNvdGEgTHlueC4NCg0KJH4kDQoNCiMgUHJlZGljdGlvbg0KDQpgYGAge3IgcHJlZGljdGlvbiwgaW5jbHVkZSA9IEZ9DQoNCiMgU3VtbWFyaXplcyBvdXIgdmFyaWFibGVzIHRvIGdyYWIgdGhlIGV4cGVyaW1lbnRhbCByZWdpb24gYW5kDQojIHRoZSBtZWRpYW4gZm9yIG91ciB2YXJpYWJsZXMNCnN1bW1hcnkoY29yX2RhdGEpDQoNCiMgTmV3IGRhdGEgZnJhbWUgZm9yIHRoZSBtZWRpYW4gZ2FtZXMNCm5ld2RhdGEgPSBkYXRhLmZyYW1lKGZpZWxkX2dvYWxfcGN0ID0gNDMuMDAsIHRvdGFsX3JlYm91bmRzID0gMzQuMDAsDQogICAgICAgICAgICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCA9IDI5LjMwLCBzdGVhbHMgPSA5LjUpDQoNCiMgUHJlZGljdGluZyB0aGUgbWVkaWFuIGdhbWUgd2l0aCBhIDk1JSBjb25maWRlbmNlIGludGVydmFsDQptZWRpYW5fZ2FtZSA9IHByZWRpY3QobW9kZWw0LCBuZXdkYXRhLCBpbnRlcnZhbCA9ICJjb25maWRlbmNlIiwgbGV2ZWwgPSAuOTUpDQoNCmBgYA0KDQpJIGJ1aWx0IHRoZSBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSBpbiB3aGljaCB0aGV5IGFjaGlldmUgdGhlIG1lZGlhbiB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gDQokfiQNCg0KVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIG1lZGlhbl9nYW1lWzFdYCwgd2l0aCANCjk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBtZWRpYW5fZ2FtZVsyXWAsIGByIG1lZGlhbl9nYW1lWzNdYCkuDQoNCg0KDQoNCg0K