1 Introduction

This report analyzes the 2025 WNBA season using official game box scores, with a focus on the Washington Mystics’ performance.

The goal of this analysis is to build the most accurate statistical model possible to predict the Mystics’ team score, ultimately evaluating their performance in a ‘median’ game where all independent variables are held at their median values.

2 Season Summary (tables)

Table 1 provides an aggregated statistical summary of all teams across the league, while Table 2 isolates the Mystics’ statistics, comparing their average scores in wins versus losses.

During the 2025 season, the Mystics struggled offensively, averaging 79.30 points per game, placing them in the lower half of the league in scoring and ultimately failing to qualify for the playoffs.

2025 WNBA Team Stats
team_name mean_score sd_score mean_field_goal sd_field_goal mean_rebounds sd_rebounds mean_threepoint sd_threepoint mean_steals sd_steals
Aces 85.52 9.56 45.27 5.82 33.78 5.88 35.27 7.08 6.80 2.67
Dream 76.93 10.59 41.28 6.78 35.95 4.41 30.83 9.32 7.14 2.82
Fever 84.50 10.17 45.56 5.38 35.10 5.49 35.00 8.99 5.88 2.29
Liberty 84.98 9.92 44.53 5.61 36.90 5.77 35.38 10.06 7.75 2.19
Lynx 82.36 11.39 45.21 6.34 33.15 5.06 37.80 9.43 8.36 3.17
Mercury 81.93 12.60 44.28 7.34 32.26 5.39 32.97 10.34 6.55 2.12
Mystics 79.30 8.69 43.36 4.82 31.85 4.66 36.64 8.69 7.28 2.24
Sky 77.40 9.62 42.44 5.22 36.60 5.57 31.74 11.62 7.00 3.30
Sparks 78.40 10.57 42.63 6.15 32.67 5.52 32.09 11.00 7.30 2.78
Storm 82.67 9.65 43.43 5.39 34.67 6.02 28.35 9.03 9.24 3.27
Sun 80.36 9.89 44.30 5.28 33.43 4.62 32.84 11.67 7.89 3.29
Wings 84.20 11.47 44.47 5.24 34.75 4.65 32.06 11.75 7.12 2.95
Washington Mystics 2025 win vs. loss Stats
team_winner mean sd
FALSE 76.19 7.62
TRUE 85.07 7.73

3 Boxplot

Boxplot for team score by game result

4 Models

There was no multicollinearity observed among the independent variables, as no pairs showed a high correlation (all were well below the absolute value of 0.8). Variance Inflation Factor (VIF) values supported this claim, as all were under 3 (around 1). Therefore, there was no need to remove any variables or recalculate a second model, as none of the predictors were highly correlated with one another.

Model1 Summary
Dependent variable:
team_score
field_goal_pct p = 0.00002
total_rebounds p = 0.175
three_point_field_goal_pct p = 0.086
steals p = 0.902
Constant p = 0.343
Observations 40
R2 0.616
Adjusted R2 0.572
Residual Std. Error 5.684 (df = 35)
F Statistic 14.052*** (df = 4; 35)
Note: p<0.1; p<0.05; p<0.01
Correlation Matrix
team_score field_goal_pct total_rebounds three_point_field_goal_pct steals
team_score 1 0.755 0.011 0.544 0.048
field_goal_pct 0.755 1 -0.121 0.546 0.119
total_rebounds 0.011 -0.121 1 -0.265 -0.099
three_point_field_goal_pct 0.544 0.546 -0.265 1 -0.114
steals 0.048 0.119 -0.099 -0.114 1
Variation Inflation Factor Matrix
field_goal_pct total_rebounds three_point_field_goal_pct steals
1.500 1.099 1.606 1.086

5 Interaction Model

We extend the model to include all 2 way interactions.

From the model2 summary, we see that only the two way interaction of total_rebounds*steals was found to be significant (p = .080) at alpha = .15. This led us to reduce our model to include only significant terms.

My final model is team_score= 55.3304037 + 1.1320374 * field_goal_pct + -1.0610145 * total_rebounds + 0.258809 * three_point_field_goal_pct + -5.8310382 * steals + 0.1803988 * total_rebounds:steals

Displayed in the model3 summary table, this model significantly predicts team score, F(5, 34) = 13.0540405, p<.0001, adjusted R^2= 0.6071329

library(stargazer)
stargazer(model2, type = "html", report = "vp*", digits = 6, title = "<b style='color:darkblue;'>Model2 Summary</b>") #pretty table
Model2 Summary
Dependent variable:
team_score
field_goal_pct p = 0.206449
total_rebounds p = 0.696185
three_point_field_goal_pct p = 0.916709
steals p = 0.095906*
field_goal_pct:total_rebounds p = 0.500611
field_goal_pct:three_point_field_goal_pct p = 0.345700
field_goal_pct:steals p = 0.600198
total_rebounds:three_point_field_goal_pct p = 0.274806
total_rebounds:steals p = 0.080013*
three_point_field_goal_pct:steals p = 0.633155
Constant p = 0.742463
Observations 40
R2 0.678942
Adjusted R2 0.568233
Residual Std. Error 5.711345 (df = 29)
F Statistic 6.132646*** (df = 10; 29)
Note: p<0.1; p<0.05; p<0.01
stargazer(model3, type = "html", report = "vp*", digits = 6, title = "<b style='color:darkblue;'>Model3 Summary</b>") #pretty table
Model3 Summary
Dependent variable:
team_score
field_goal_pct p = 0.000013***
total_rebounds p = 0.135006
three_point_field_goal_pct p = 0.050722*
steals p = 0.055127*
total_rebounds:steals p = 0.050941*
Constant p = 0.030452**
Observations 40
R2 0.657500
Adjusted R2 0.607133
Residual Std. Error 5.447991 (df = 34)
F Statistic 13.054040*** (df = 5; 34)
Note: p<0.1; p<0.05; p<0.01

6 Residual Analysis

Residual analysis shows us, via the histogram below, that the distribution is normally distributed. The versus fits plot indicates constant variance proven by random scatter and no funneling.

Utilizing studentized residuals plot, leverage plot, and cook’s distance, there was no influential values detected.

There are some leverage points (observation 32, 11, 12, 37, 28) and an outlier (observation 17) but not enough to alter our regression line or cause alarm.

ols_plot_resid_hist(model3) #Residual Histogram

ols_plot_resid_fit(model3) #Residual vs. Fitted Values (versus fits plot)

ols_plot_resid_stud(model3) #Studentized residuals

ols_plot_resid_lev(model3, threshold = 3) #leverage plot

ols_plot_cooksd_chart(model3) #cook's distance/outlier plot

7 Prediction

Experimental Region for Model 3 is:

  • Field_Goal_Pct = [31.30, 52.90]

  • Total_Rebounds = [22.00, 42.00]

  • Three_Point_Field_Goal_Pct = [20.70, 57.10]

  • Steals = [3.00, 13.00]

I built a model to predict the teams points for a game in which they achieve the median values for each variable. The predicted team score is 78.9117116, which has a 95% confidence interval of (77.0588701, 80.7645532).

LS0tDQp0aXRsZTogIlRoZSBXYXNoaW5ndG9uIE15c3RpY3M6IEEgMjAyNSBXTkJBIEFuYWx5c2lzIFJlcG9ydCINCmF1dGhvcjogIkthZWxpIEFuZHJld3MiDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgZmlnX3dpZHRoOiAzDQogICAgZmlnX2hlaWdodDogMw0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KLS0tDQoNCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0NCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICJUYWJsZSBvZiBDb250ZW50cyI7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBmb250LXNpemU6IDEuMmVtOw0KICBkaXNwbGF5OiBibG9jazsNCiAgY29sb3I6IG5hdnk7DQogIG1hcmdpbi1ib3R0b206IDEwcHg7DQp9DQoNCg0KZGl2I1RPQyBsaSB7ICAgICAvKiB0YWJsZSBvZiBjb250ZW50ICAqLw0KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47DQogICAgYmFja2dyb3VuZC1pbWFnZTpub25lOw0KICAgIGJhY2tncm91bmQtcmVwZWF0Om5vbmU7DQogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOw0KfQ0KDQpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLw0KICBmb250LXNpemU6IDIycHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogUHVycGxlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCn0NCg0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgZm9udC1zaXplOiAxNXB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IG5hdnk7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCg0KaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogIGZvbnQtc2l6ZTogMThweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQoNCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDIwcHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IFB1cnBsZTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8NCiAgICBmb250LXNpemU6IDE2cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLw0KICAgIGZvbnQtc2l6ZTogMTRweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IHB1cnBsZTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQovKiBBZGQgZG90cyBhZnRlciBudW1iZXJlZCBoZWFkZXJzICovDQouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7DQogIGNvbnRlbnQ6ICIuIjsNCg0KYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KLmhpZ2hsaWdodG1lIHsgYmFja2dyb3VuZC1jb2xvcjp5ZWxsb3c7IH0NCg0KcCB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0NCg0KfQ0KYGBgDQoNCmBgYHtyIFNldHVwLCBpbmNsdWRlPUZBTFNFLCBlY2hvID0gRn0NCg0Kc2V0d2QoIkM6L1VzZXJzL2thZWxpL0Rvd25sb2Fkcy9zdGF0MzE5c3ByaW5nMjAyNlIiKQ0KDQojbGlicmFyaWVzDQpsaWJyYXJ5KGdncGxvdDIpICNwbG90cw0KbGlicmFyeShkcGx5cikgI0RhdGEgd3JhbmdsaW5nIA0KbGlicmFyeShjYXIpICNWSUYNCmxpYnJhcnkob2xzcnIpICNSZXNpZHVhbCBhbmFseXNpcyBwbG90cw0KbGlicmFyeShrYWJsZUV4dHJhKSAjZmFuY3kgdGFibGVzDQpgYGANCg0KYGBge3IgRGF0YSBXcmFuZ2xpbmcgdy8gRFBMWVIsIGluY2x1ZGU9RiwgZWNobyA9IEZ9DQoNCiNkYXRhc2V0DQpkYXRhIDwtIHJlYWQuY3N2KCJXTkJBXzIwMjVfYm94LXNjb3Jlcy5jc3YiLCBoZWFkZXIgPSBUKQ0KDQojZmlsdGVyIG91dCBhbGwgc3RhciBnYW1lIChvbmx5IGluY2x1ZGUgb2ZmaWNpYWwgV05CQSBnYW1lcyksIGtlZXAgbmFtZSBhcyBkYXRhIGZvciB0aGlzIGlzIHRoZSB0cnVlIGRhdGFzZXQgd2Ugd2FudCB0byBvYnNlcnZlIA0KZGF0YSA9IGRhdGEgJT4lIA0KICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9IlRlYW0gVVNBIikgDQoNCiNncm91cCBkYXRhIGJ5IHRlYW0sIGZpbmQgbWVhbi9zZCBvZiBzZWxlY3RlZCB2YXJpYWJsZXMNCnN1bW1hcnkgPSBkYXRhICU+JQ0KICBncm91cF9ieSh0ZWFtX25hbWUpICU+JSANCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksIA0KICAgICAgICAgICAgbWVhbl9maWVsZF9nb2FsPW1lYW4oZmllbGRfZ29hbF9wY3QpLCBzZF9maWVsZF9nb2FsPXNkKGZpZWxkX2dvYWxfcGN0KSwNCiAgICAgICAgICAgIG1lYW5fcmVib3VuZHM9bWVhbih0b3RhbF9yZWJvdW5kcyksIHNkX3JlYm91bmRzPXNkKHRvdGFsX3JlYm91bmRzKSwNCiAgICAgICAgICAgIG1lYW5fdGhyZWVwb2ludD1tZWFuKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwgc2RfdGhyZWVwb2ludD1zZCh0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksDQogICAgICAgICAgICBtZWFuX3N0ZWFscz1tZWFuKHN0ZWFscyksIHNkX3N0ZWFscz1zZChzdGVhbHMpKQ0KDQojc2VsZWN0IG9ubHkgdmFyaWFibGVzIHdlIG5lZWQgYW5kIGZpbHRlciBvbiBteSB0ZWFtIChNeXN0aWNzKQ0KbXlfdGVhbSA9IGRhdGEgJT4lDQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsDQogICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzLCB0ZWFtX25hbWUsIHRlYW1fd2lubmVyKSAlPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiTXlzdGljcyIpDQoNCiNncm91cHMgY2FzZXMgYnkgd2luIHZzLiBsb3NzLCBzdW1tYXJpemVzIHZhcmlhYmxlcyB3aXRoIG1lYW4gYW5kIFNEIA0KbXlfdGVhbSA9IG15X3RlYW0gJT4lDQogIGdyb3VwX2J5KHRlYW1fd2lubmVyKSAlPiUNCiAgc3VtbWFyaXplKG1lYW49bWVhbih0ZWFtX3Njb3JlKSwgc2Q9c2QodGVhbV9zY29yZSkpDQoNCmRmX2hpc3QgPSBkYXRhICU+JQ0KICBmaWx0ZXIodGVhbV9uYW1lID09ICJNeXN0aWNzIikgJT4lDQogIG11dGF0ZShyZXN1bHQ9Y2FzZV93aGVuKHRlYW1fd2lubmVyPT1UUlVFIH4gIldpbiIsICNGaWx0ZXIgbXkgdGVhbSBhbmQgbGFiZWwgd2luIGFuZCBsb3NzIA0KICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtX3dpbm5lcj09RkFMU0V+Ikxvc3MiKSkNCg0KZGZfbW9kZWwxID0gZGF0YSAlPiUNCiAgZmlsdGVyKHRlYW1fbmFtZSA9PSAiTXlzdGljcyIpICNGaWx0ZXIgb3V0IGp1c3QgbXkgdGVhbSBmb3IgbW9kZWwgYnVpbGRpbmcNCg0KYGBgDQoNCiMgSW50cm9kdWN0aW9uDQoNClRoaXMgcmVwb3J0IGFuYWx5emVzIHRoZSAyMDI1IFdOQkEgc2Vhc29uIHVzaW5nIG9mZmljaWFsIGdhbWUgYm94IHNjb3Jlcywgd2l0aCBhIGZvY3VzIG9uIHRoZSBXYXNoaW5ndG9uIE15c3RpY3MnIHBlcmZvcm1hbmNlLg0KDQpUaGUgZ29hbCBvZiB0aGlzIGFuYWx5c2lzIGlzIHRvIGJ1aWxkIHRoZSBtb3N0IGFjY3VyYXRlIHN0YXRpc3RpY2FsIG1vZGVsIHBvc3NpYmxlIHRvIHByZWRpY3QgdGhlIE15c3RpY3MnIHRlYW0gc2NvcmUsIHVsdGltYXRlbHkgZXZhbHVhdGluZyB0aGVpciBwZXJmb3JtYW5jZSBpbiBhICdtZWRpYW4nIGdhbWUgd2hlcmUgYWxsIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcmUgaGVsZCBhdCB0aGVpciBtZWRpYW4gdmFsdWVzLg0KDQojIFNlYXNvbiBTdW1tYXJ5ICh0YWJsZXMpDQoNClRhYmxlIDEgcHJvdmlkZXMgYW4gYWdncmVnYXRlZCBzdGF0aXN0aWNhbCBzdW1tYXJ5IG9mIGFsbCB0ZWFtcyBhY3Jvc3MgdGhlIGxlYWd1ZSwgd2hpbGUgVGFibGUgMiBpc29sYXRlcyB0aGUgTXlzdGljcycgc3RhdGlzdGljcywgY29tcGFyaW5nIHRoZWlyIGF2ZXJhZ2Ugc2NvcmVzIGluIHdpbnMgdmVyc3VzIGxvc3Nlcy4gDQoNCkR1cmluZyB0aGUgMjAyNSBzZWFzb24sIHRoZSBNeXN0aWNzIHN0cnVnZ2xlZCBvZmZlbnNpdmVseSwgYXZlcmFnaW5nIDc5LjMwIHBvaW50cyBwZXIgZ2FtZSwgcGxhY2luZyB0aGVtIGluIHRoZSBsb3dlciBoYWxmIG9mIHRoZSBsZWFndWUgaW4gc2NvcmluZyBhbmQgdWx0aW1hdGVseSBmYWlsaW5nIHRvIHF1YWxpZnkgZm9yIHRoZSBwbGF5b2Zmcy4NCg0KYGBge3IgVGFibGVzLCBJbmNsdWRlID0gVCwgZWNobyA9IEZ9DQpzdW1tYXJ5ICU+JQ0KICBrYmwoZGlnaXRzID0gMiwgY2FwdGlvbiA9ICIyMDI1IFdOQkEgVGVhbSBTdGF0cyIpICU+JSAjVGFibGUgc3VtbWFyeSBvZiBXTkJBIHN0YXRzDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpYygiaG92ZXIiLCBodG1sX2ZvbnQgPSAiVGltZXMtTmV3LVJvbWFuIiwgZnVsbF93aWR0aCA9IEYpDQoNCm15X3RlYW0gJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gIldhc2hpbmd0b24gTXlzdGljcyAyMDI1IHdpbiB2cy4gbG9zcyBTdGF0cyIpICU+JSAjVGFibGUgc3VtbWFyeSBvZiBteXN0aWNzIHdpbiB2cyBsb3NzIHN0YXRzDQogIGthYmxlX3N0eWxpbmcoKSAlPiUNCiAga2FibGVfY2xhc3NpYygiaG92ZXIiLCBodG1sX2ZvbnQgPSAiVGltZXMtTmV3LVJvbWFuIiwgZnVsbF93aWR0aCA9IEYpDQoNCmBgYA0KIyBCb3hwbG90DQoNCkJveHBsb3QgZm9yIHRlYW0gc2NvcmUgYnkgZ2FtZSByZXN1bHQgDQoNCg0KYGBge3IgZ3JhcGhzLCBJbmNsdWRlID0gVCwgZmlnLndpZHRoPSAxMCwgZmlnLmhlaWdodCA9IDUsIGVjaG8gPSBGfQ0KDQpwID0gZGZfaGlzdCAlPiUgI0NyZWF0ZXMgYSBwcmV0dHkgaGlzdG9ncmFtIA0KICBnZ3Bsb3QoIGFlcyh4PXRlYW1fc2NvcmUsIGZpbGw9cmVzdWx0KSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEsIGNvbG9yPSIjZTllY2VmIiwgYWxwaGE9MC42LCBwb3NpdGlvbiA9ICdpZGVudGl0eScpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2OWIzYTIiLCAiIzQwNDA4MCIpKSANCg0KYm94cGxvdCh0ZWFtX3Njb3JlIH4gcmVzdWx0LCBkYXRhID0gZGZfaGlzdCwgbm90Y2ggPSBGQUxTRSwNCiAgICAgICAgY29sID0gYygiI2UwM2EzZSIsICIjMDAyYjVjIiksDQogICAgICAgIG1haW4gPSAiUG9pbnRzIFNjb3JlIGJ5IEdhbWUgUmVzdWx0IiwNCiAgICAgICAgeGxhYiA9ICJSZXN1bHQiLCB5bGFiID0gIlBvaW50cyIpDQoNCg0KYGBgDQoNCiMgTW9kZWxzIA0KDQpUaGVyZSB3YXMgbm8gbXVsdGljb2xsaW5lYXJpdHkgb2JzZXJ2ZWQgYW1vbmcgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlcywgYXMgbm8gcGFpcnMgc2hvd2VkIGEgaGlnaCBjb3JyZWxhdGlvbiAoYWxsIHdlcmUgd2VsbCBiZWxvdyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgMC44KS4gVmFyaWFuY2UgSW5mbGF0aW9uIEZhY3RvciAoVklGKSB2YWx1ZXMgc3VwcG9ydGVkIHRoaXMgY2xhaW0sIGFzIGFsbCB3ZXJlIHVuZGVyIDMgKGFyb3VuZCAxKS4gVGhlcmVmb3JlLCB0aGVyZSB3YXMgbm8gbmVlZCB0byByZW1vdmUgYW55IHZhcmlhYmxlcyBvciByZWNhbGN1bGF0ZSBhIHNlY29uZCBtb2RlbCwgYXMgbm9uZSBvZiB0aGUgcHJlZGljdG9ycyB3ZXJlIGhpZ2hseSBjb3JyZWxhdGVkIHdpdGggb25lIGFub3RoZXIuIA0KDQpgYGB7ciBGaXJzdCBPcmRlciBNb2RlbCwgZWNobyA9IEZBTFNFLCBtZXNzYWdlPUYsIHJlc3VsdHM9ImFzaXMifQ0KDQpjb3JfZGF0YT0gZGZfbW9kZWwxICU+JSAjbXlfdGVhbSB3aXRoIGp1c3QgbnVtZXJpYyB2YWx1ZXMgcGVydGFpbmluZyB0byB0aGUgbW9kZWwNCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywNCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMpDQoNCm1vZGVsMSA9IGxtKHRlYW1fc2NvcmV+ZmllbGRfZ29hbF9wY3QgKyB0b3RhbF9yZWJvdW5kcyArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0ICtzdGVhbHMsIGRhdGEgPSBkZl9tb2RlbDEpICNmaXJzdCBvcmRlciBtb2RlbA0KbGlicmFyeShzdGFyZ2F6ZXIpICNwcmV0dHkgdGFibGVzIQ0Kc3RhcmdhemVyKG1vZGVsMSwgdHlwZSA9ICJodG1sIiwgcmVwb3J0ID0gInYqcCIsIHRpdGxlID0gIjxiIHN0eWxlPSdjb2xvcjpkYXJrYmx1ZTsnPk1vZGVsMSBTdW1tYXJ5PC9iPiIpDQoNCiNubyBuZWVkIHRvIHJlZHVjZSBtb2RlbCwgbm8gbXVsdGljb2xsaW5lYXJpdHkgDQoNCiNjb3IoY29yX2RhdGEpICNjb3JyZWxhdGlvbiBtYXRyaXgNCnN0YXJnYXplcihjb3IoY29yX2RhdGEpLCB0eXBlID0gImh0bWwiLCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5Db3JyZWxhdGlvbiBNYXRyaXg8L2I+IikNCg0Kc3RhcmdhemVyKHZpZihtb2RlbDEpLCB0eXBlID0gImh0bWwiLCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5WYXJpYXRpb24gSW5mbGF0aW9uIEZhY3RvciBNYXRyaXg8L2I+IikgI1ZhcmlhbmNlIGluZmxhdGlvbiBmYWN0b3IgDQoNCmBgYA0KDQojIEludGVyYWN0aW9uIE1vZGVsDQoNCldlIGV4dGVuZCB0aGUgbW9kZWwgdG8gaW5jbHVkZSBhbGwgMiB3YXkgaW50ZXJhY3Rpb25zLiANCg0KYGBge3IgSW50ZXJhY3Rpb24gTW9kZWwsIGVjaG8gPSBGLCBpbmNsdWRlID1GLCBtZXNzYWdlPUZBTFNFfQ0KDQptb2RlbDIgPSBsbSh0ZWFtX3Njb3JlfmZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHN0ZWFscyArIA0KICAgICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcyArICBmaWVsZF9nb2FsX3BjdCp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArICBmaWVsZF9nb2FsX3BjdCpzdGVhbHMgKw0KICAgICAgICAgICAgICB0b3RhbF9yZWJvdW5kcyp0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzKnN0ZWFscyArIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KnN0ZWFscywgZGF0YSA9IA0KICAgICAgICAgICAgICBkZl9tb2RlbDEpICNNb2RlbDIgaXMgTW9kZWwxICsgYWxsIHR3by13YXkgaW50ZXJhY3Rpb25zDQpzdW1tYXJ5KG1vZGVsMikNCg0KbW9kZWwzID0gbG0odGVhbV9zY29yZX5maWVsZF9nb2FsX3BjdCArIHRvdGFsX3JlYm91bmRzICsgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3QgKyBzdGVhbHMgKyB0b3RhbF9yZWJvdW5kcypzdGVhbHMsIGRhdGEgPSANCiAgICAgICAgICAgICAgZGZfbW9kZWwxKSAjbW9kZWwyIGJ1dCByZW1vdmluZyBhbGwgaW5zaWduaWZpY2FudCB0d28td2F5IGludGVyYWN0aW9ucw0KDQptb2RlbDNzdW0gPSBzdW1tYXJ5KG1vZGVsMykgI3B1dCBtb2RlbCBzdW1tYXJ5IGludG8gYW4gb2JqZWN0L3ZhcmlhYmxlIG5hbWVzIG1vZGVsM3N1bQ0KDQptb2RlbDNzdW0NCg0KYGBgDQpGcm9tIHRoZSBtb2RlbDIgc3VtbWFyeSwgd2Ugc2VlIHRoYXQgb25seSB0aGUgdHdvIHdheSBpbnRlcmFjdGlvbiBvZiB0b3RhbF9yZWJvdW5kcypzdGVhbHMgd2FzIGZvdW5kIHRvIGJlIHNpZ25pZmljYW50IChwID0gLjA4MCkgYXQgYWxwaGEgPSAuMTUuIFRoaXMgbGVkIHVzIHRvIHJlZHVjZSBvdXIgbW9kZWwgdG8gaW5jbHVkZSBvbmx5IHNpZ25pZmljYW50IHRlcm1zLg0KDQpNeSBmaW5hbCBtb2RlbCBpcyB0ZWFtX3Njb3JlPSBgciBtb2RlbDMkY29lZmZpY2llbnRzWzFdYCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbMl1gICogZmllbGRfZ29hbF9wY3QgKyBgciBtb2RlbDMkY29lZmZpY2llbnRzWzNdYCAqIHRvdGFsX3JlYm91bmRzICsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1s0XWAgKiB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbNV1gICogc3RlYWxzICsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1s2XWAgKiB0b3RhbF9yZWJvdW5kczpzdGVhbHMNCg0KRGlzcGxheWVkIGluIHRoZSBtb2RlbDMgc3VtbWFyeSB0YWJsZSwgdGhpcyBtb2RlbCBzaWduaWZpY2FudGx5IHByZWRpY3RzIHRlYW0gc2NvcmUsIEYoYHIgbW9kZWwzc3VtJGZzdGF0aXN0aWNbMl1gLCBgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1szXWApID0gYHIgbW9kZWwzc3VtJGZzdGF0aXN0aWNbMV1gLCBwPC4wMDAxLCBhZGp1c3RlZCBSXjI9IGByIG1vZGVsM3N1bSRhZGouci5zcXVhcmVkYA0KDQoNCmBgYHtyICwgcmVzdWx0cyA9ICJhc2lzIiwgaW5jbHVkZSA9IFRSVUUsIG1lc3NhZ2UgPSBGQUxTRX0NCmxpYnJhcnkoc3RhcmdhemVyKQ0Kc3RhcmdhemVyKG1vZGVsMiwgdHlwZSA9ICJodG1sIiwgcmVwb3J0ID0gInZwKiIsIGRpZ2l0cyA9IDYsIHRpdGxlID0gIjxiIHN0eWxlPSdjb2xvcjpkYXJrYmx1ZTsnPk1vZGVsMiBTdW1tYXJ5PC9iPiIpICNwcmV0dHkgdGFibGUNCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIsIHJlcG9ydCA9ICJ2cCoiLCBkaWdpdHMgPSA2LCB0aXRsZSA9ICI8YiBzdHlsZT0nY29sb3I6ZGFya2JsdWU7Jz5Nb2RlbDMgU3VtbWFyeTwvYj4iKSAjcHJldHR5IHRhYmxlDQpgYGANCg0KDQojIFJlc2lkdWFsIEFuYWx5c2lzDQoNClJlc2lkdWFsIGFuYWx5c2lzIHNob3dzIHVzLCB2aWEgdGhlIGhpc3RvZ3JhbSBiZWxvdywgdGhhdCB0aGUgZGlzdHJpYnV0aW9uIGlzIG5vcm1hbGx5IGRpc3RyaWJ1dGVkLiBUaGUgdmVyc3VzIGZpdHMgcGxvdCBpbmRpY2F0ZXMgY29uc3RhbnQgdmFyaWFuY2UgcHJvdmVuIGJ5IHJhbmRvbSBzY2F0dGVyIGFuZCBubyBmdW5uZWxpbmcuDQoNClV0aWxpemluZyBzdHVkZW50aXplZCByZXNpZHVhbHMgcGxvdCwgbGV2ZXJhZ2UgcGxvdCwgYW5kIGNvb2sncyBkaXN0YW5jZSwgdGhlcmUgd2FzIG5vIGluZmx1ZW50aWFsIHZhbHVlcyBkZXRlY3RlZC4gDQoNClRoZXJlIGFyZSBzb21lIGxldmVyYWdlIHBvaW50cyAob2JzZXJ2YXRpb24gMzIsIDExLCAxMiwgMzcsIDI4KSBhbmQgYW4gb3V0bGllciAob2JzZXJ2YXRpb24gMTcpIGJ1dCBub3QgZW5vdWdoIHRvIGFsdGVyIG91ciByZWdyZXNzaW9uIGxpbmUgb3IgY2F1c2UgYWxhcm0uIA0KDQpgYGB7ciBSZXNpZHVhbHMsIEluY2x1ZGUgPSBULCBmaWcud2lkdGg9IDYsIGZpZy5oZWlnaHQ9IDR9DQpvbHNfcGxvdF9yZXNpZF9oaXN0KG1vZGVsMykgI1Jlc2lkdWFsIEhpc3RvZ3JhbQ0Kb2xzX3Bsb3RfcmVzaWRfZml0KG1vZGVsMykgI1Jlc2lkdWFsIHZzLiBGaXR0ZWQgVmFsdWVzICh2ZXJzdXMgZml0cyBwbG90KQ0Kb2xzX3Bsb3RfcmVzaWRfc3R1ZChtb2RlbDMpICNTdHVkZW50aXplZCByZXNpZHVhbHMNCm9sc19wbG90X3Jlc2lkX2xldihtb2RlbDMsIHRocmVzaG9sZCA9IDMpICNsZXZlcmFnZSBwbG90DQpvbHNfcGxvdF9jb29rc2RfY2hhcnQobW9kZWwzKSAjY29vaydzIGRpc3RhbmNlL291dGxpZXIgcGxvdA0KDQpgYGANCg0KIyBQcmVkaWN0aW9uDQoNCkV4cGVyaW1lbnRhbCBSZWdpb24gZm9yIE1vZGVsIDMgaXM6IA0KICAgICAgICANCi0gRmllbGRfR29hbF9QY3QgPSBbMzEuMzAsIDUyLjkwXQ0KICAgICAgICANCi0gVG90YWxfUmVib3VuZHMgPSBbMjIuMDAsIDQyLjAwXQ0KICAgICAgICANCi0gVGhyZWVfUG9pbnRfRmllbGRfR29hbF9QY3QgPSBbMjAuNzAsIDU3LjEwXQ0KICAgICAgICANCi0gU3RlYWxzID0gWzMuMDAsIDEzLjAwXQ0KICAgICAgICANCmBgYHtyIFByZWRpY3Rpb24sIGluY2x1ZGU9Rn0NCnN1bW1hcnkoY29yX2RhdGEpICNnZXQgbWVkaWFuIHZhbHVlcw0KDQojY3JlYXRlIG5ldyBkYXRhZnJhbWUgb2YgcHJlZGljdGVkIHZhbHVlcyB0byBwbHVnIGludG8gbW9kZWwNCm5ld2RhdGE9ZGF0YS5mcmFtZShmaWVsZF9nb2FsX3BjdCA9IDQzLjIwLCB0b3RhbF9yZWJvdW5kcz0zMS4wMCwgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Q9MzUuNzAsIHN0ZWFscyA9IDcpICNtZWRpYW4gdmFsdWVzIGZvciBlYWNoIGluZGVwZW5kZW50IHZhcmlhYmxlDQoNCiNwcmVkaWN0aW9uIG1vZGVsDQpwcmVkaWN0aW9uID0gcHJlZGljdChtb2RlbDMsIG5ld2RhdGEsIGludGVydmFsID0gImNvbmZpZGVuY2UiLCBsZXZlbCA9IC45NSkgI3ByZWRpY3RpbmcgdGhlIG1vZGVsIHdpdGggYWJvdmUgKG1lZGlhbikgdmFsdWVzDQoNCmBgYA0KSSBidWlsdCBhIG1vZGVsIHRvIHByZWRpY3QgdGhlIHRlYW1zIHBvaW50cyBmb3IgYSBnYW1lIGluIHdoaWNoIHRoZXkgYWNoaWV2ZSB0aGUgbWVkaWFuIHZhbHVlcyBmb3IgZWFjaCB2YXJpYWJsZS4gVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIHByZWRpY3Rpb25bMV1gLCB3aGljaCBoYXMgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCBvZiAoYHIgcHJlZGljdGlvblsyXWAsIGByIHByZWRpY3Rpb25bM11gKS4NCg0KDQoNCg==