0.1 R Markdown

1 Introduction

Below are tables one and two that describe the overall summary for the 2024 season as well as my team, the NY Liberty. The goal of this project is to build the best model to predict points scored in a “median” game. This season, the NY Liberty made it to the playoffs, hence the greater number of observations for this team than others.

Table 1 – an overview of the observed variables’ means(including score, field goal percentage, rebounds, three point percentage, and steals) along with the standard deviations, for all teams.

Table 2 – a comparison of the overall wins and losses for the New York Liberty in the 2024 season.

#table for Team Summaries 
summary %>%
  kbl(digits = 2, caption = "Team Summaries") %>%
  kable_paper( full_width = F, html_font = "Cambria") 
Team Summaries
team_name mean_score sd_score mean_fgp sd_fgp mean_rebounds sd_rebounds mean_three sd_three 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
#table for My Team 
my_team_results %>%
  kbl(digits = 1, caption = "My Team Wins/Losses") %>%
  kable_paper( full_width = F, html_font = "Cambria")
My Team Wins/Losses
team_winner mean
FALSE 80.0
TRUE 86.5

2 Plots

The box plot below displays how many points the NY Liberty scored in games they won versus games they lost during the 2024 season. The Liberty scored notably more points in their wins than in their losses, with a mean of 86.475 in wins compared to 80 in losses. The distribution for wins is also more narrow and skewed higher overall, while the loss distribution shows greater spread and a lower tail.

library(ggplot2)
#create box plot for points scored by wins vs losses
boxplot(team_score ~ result, data = df_hist, 
        col = c('lightblue', 'lightgreen'),
        main = "Points Scored by Game Result", 
        xlab = "Result", ylab = "Points")  

3 Models

When assessing for model utility, no interactions were found between the variables in the first model, so there was not a need for a reduced model.

3.1 Interaction Model

Model 2 is the interaction model. This model includes 4 first order terms and 6 interaction terms. All interaction terms were found to be non-significant as well as the first order term “steals”. These terms were removed in the final model.

3.1.1 Final Model

After all models were run and model reduction was completed, my final model is team_score= 3.2455521+ 1.1788679 * field_goal_pct + 0.5183829 * total_rebounds + 0.285623 * three_point_field_goal_pct .

This model significantly predicts team score, f(3, 48) = 32.2409164, p,.00001, adjusted R^2= 0.6476021 .

Dependent variable:
team_score
field_goal_pct 1.179***
(0.181)
total_rebounds 0.518***
(0.151)
three_point_field_goal_pct 0.286***
(0.101)
Constant 3.246
(10.049)
Observations 52
R2 0.668
Adjusted R2 0.648
Residual Std. Error 5.887 (df = 48)
F Statistic 32.241*** (df = 3; 48)
Note: p<0.1; p<0.05; p<0.01

4 Residual Analysis

Histogram: The residual histogram demonstrates a normal distribution of the residuals.

Versus Fits Plot: The residuals appear to be randomly scattered, following no curve or pattern, satisfying the linearity assumption. There is no apparent heteroscedasticity as the spread of the residuals stays roughly the same across all fitted values.

Cook’s D Plot: Five outliers are detected by this plot, with the most significant being observations 12 and 30. Observation 12 (NY Liberty vs ATL Dream, 9-19-24) was a particularly low scoring game, with a lower number of rebounds, and a high three point percentage, compared to the mean values. Observation 30 (NY Liberty vs CT Sun, 7-10-24) was also a relatively low scoring game, with a lower three point percentage and low amount of steals, compared to the mean values.

Studentized Residual Plot: The studentized residual plot identifies two leverage points: observation 12(NY Liberty vs ATL Dream, 9-19-24) and 1 (NY Liberty vs MN Lynx, 10-20-24).

#residual plots for final model 
hist(model3$residuals)

plot(model3$fitted.values, model3$residuals)

ols_plot_cooksd_bar(model3)

ols_plot_resid_lev(model3, threshold = 3)

5 Prediction and Estimation

I built this model to predict my team’s points for a game in which they achieve the median value for each variable. The experimental region is (-13.8325, 15.1010). The predicted team score is 84.6709881, with 95% confidence interval (83.0084105, 86.3335656)

LS0tCnRpdGxlOiAiUiBBc3NpZ25tZW50IDYiCmF1dGhvcjogIkxlYWggWnVyZmx1ZWgiCmRhdGU6ICJNYXkgNCwgMjAyNiIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IAogICAgY3NzOiBzdHlsZXMuY3NzCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIHRvY19jb2xsYXBzZWQ6IHllcwogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMKICAgIHNtb290aF9zY3JvbGw6IHllcwogICAgdGhlbWU6IGx1bWVuCiAgcGRmX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICBmaWdfd2lkdGg6IDMKICAgIGZpZ19oZWlnaHQ6IDMKICB3b3JkX2RvY3VtZW50OiAKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB5ZXMKICAgIGtlZXBfbWQ6IHllcwplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KCmBgYHtjc3MsIGVjaG8gPSBGQUxTRX0KI1RPQzo6YmVmb3JlIHsKICBjb250ZW50OiAiVGFibGUgb2YgQ29udGVudHMiOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMS4yZW07CiAgZGlzcGxheTogYmxvY2s7CiAgY29sb3I6IG5hdnk7CiAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKCmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjJweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgZm9udC1mYW1pbHk6ICJHaWxsIFNhbnMiLCBzYW5zLXNlcmlmOwp9CgpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogIGZvbnQtc2l6ZTogMTVweDsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBuYXZ5OwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKICBjb2xvcjogRGFya0JsdWU7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgpoMSB7IC8qIEhlYWRlciAxIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDIwcHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IGRhcmtyZWQ7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMiB7IC8qIEhlYWRlciAyIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoMyB7IC8qIEhlYWRlciAzIC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgICBmb250LXNpemU6IDE0cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKLyogQWRkIGRvdHMgYWZ0ZXIgbnVtYmVyZWQgaGVhZGVycyAqLwouaGVhZGVyLXNlY3Rpb24tbnVtYmVyOjphZnRlciB7CiAgY29udGVudDogIi4iOwoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKfQpgYGAKCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQoKc2V0d2QoIn4vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtV2VzdENoZXN0ZXJVbml2ZXJzaXR5b2ZQQS9TVEEgMzE5IHNwcmluZyAyMDI2IikKCmRhdGE9cmVhZC5jc3YoIldOQkFfMjAyNV9ib3gtc2NvcmVzLmNzdiIsIGhlYWRlciA9IFQpCgpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoY2FyKQpsaWJyYXJ5KG9sc3JyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCgpgYGAKCiMjIFIgTWFya2Rvd24KCgpgYGB7ciB3cmFuZ2xpbmcsIGluY2x1ZGU9RkFMU0V9CgpzdW1tYXJ5KGRhdGEpCmxpYnJhcnkoZHBseXIpCgojQWxsIFdCTkEgdGVhbXMgaW5jbHVkZWQsIHJlbW92ZSBzY29yZXMgZnJvbSBBbGwgc3RhciBnYW1lIApkYXRhID0gZGF0YSAlPiUKICBmaWx0ZXIodGVhbV9uYW1lICE9ICJUZWFtIFdOQkEiICYgdGVhbV9uYW1lICE9ICJUZWFtIFVTQSIpCgojIGdyb3VwIGRhdGEgYnkgdGVhbSwgZmluZCBtZWFuL3NkIG9mIGFsbCB2YXJpYWJsZXMKc3VtbWFyeSA9IGRhdGEgJT4lCiAgZ3JvdXBfYnkodGVhbV9uYW1lKSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fc2NvcmU9bWVhbih0ZWFtX3Njb3JlKSwgc2Rfc2NvcmU9c2QodGVhbV9zY29yZSksIAogICAgICAgICAgICBtZWFuX2ZncD1tZWFuKGZpZWxkX2dvYWxfcGN0KSwgc2RfZmdwPXNkKGZpZWxkX2dvYWxfcGN0KSwgCiAgICAgICAgICAgbWVhbl9yZWJvdW5kcz1tZWFuKHRvdGFsX3JlYm91bmRzKSwgc2RfcmVib3VuZHM9c2QodG90YWxfcmVib3VuZHMpLAogICAgICAgICAgIG1lYW5fdGhyZWU9bWVhbih0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCksIHNkX3RocmVlPXNkKHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KSwKICAgICAgICAgICBtZWFuX3N0ZWFscz1tZWFuKHN0ZWFscyksIHNkX3N0ZWFscz1zZChzdGVhbHMpKSAKCiAgCiNzZWxlY3Qgb25seSB2YXJpYWJsZXMgd2UgbmVlZCBhbmQgZmlsdGVyIG9uIG15IHRlYW0KbXlfdGVhbSA9IGRhdGEgJT4lCiAgc2VsZWN0KHRlYW1fc2NvcmUsIGZpZWxkX2dvYWxfcGN0LCB0b3RhbF9yZWJvdW5kcywgCiAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0LCBzdGVhbHMsIHRlYW1fbmFtZSwgdGVhbV93aW5uZXIpICU+JQogIGZpbHRlcih0ZWFtX25hbWUgPT0gIkxpYmVydHkiKQoKI2dyb3VwcyBjYXNlcyBieSB3aW4gdnMuIGxvc3MKI3N1bW1hcml6ZSBhbGwgdmFyaWFibGVzIHdpdGggbWVhbiBhbmQgc2QKbXlfdGVhbV9yZXN1bHRzID0gbXlfdGVhbSAlPiUgCiAgZ3JvdXBfYnkodGVhbV93aW5uZXIpICU+JQogIHN1bW1hcmlzZShtZWFuPW1lYW4odGVhbV9zY29yZSkpCiNjcmVhdGUgbmV3IGRhdGEgZnJhbWUgZm9yIG15IHRlYW0ncyB3aW5zIGFuZCBsb3NzZXMgCmRmX2hpc3QgPSBkYXRhICU+JSAKICAgIGZpbHRlcih0ZWFtX25hbWUgPT0gIkxpYmVydHkiKSAlPiUKICAgIG11dGF0ZSAocmVzdWx0PSBjYXNlX3doZW4odGVhbV93aW5uZXIgPT0gVFJVRSB+ICJ3aW4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbV93aW5uZXIgPT0gRkFMU0UgfiAibG9zcyIpKQoKYGBgCgojIEludHJvZHVjdGlvbgoKCkJlbG93IGFyZSB0YWJsZXMgb25lIGFuZCB0d28gdGhhdCBkZXNjcmliZSB0aGUgb3ZlcmFsbCBzdW1tYXJ5IGZvciB0aGUgMjAyNCBzZWFzb24gYXMgd2VsbCBhcyBteSB0ZWFtLCB0aGUgTlkgTGliZXJ0eS4gVGhlIGdvYWwgb2YgdGhpcyBwcm9qZWN0IGlzIHRvIGJ1aWxkIHRoZSBiZXN0IG1vZGVsIHRvIHByZWRpY3QgcG9pbnRzIHNjb3JlZCBpbiBhICJtZWRpYW4iIGdhbWUuIFRoaXMgc2Vhc29uLCB0aGUgTlkgTGliZXJ0eSBtYWRlIGl0IHRvIHRoZSBwbGF5b2ZmcywgaGVuY2UgdGhlIGdyZWF0ZXIgbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBmb3IgdGhpcyB0ZWFtIHRoYW4gb3RoZXJzLiAKCioqVGFibGUgMSoqIC0tIGFuIG92ZXJ2aWV3IG9mIHRoZSBvYnNlcnZlZCB2YXJpYWJsZXMnIG1lYW5zKGluY2x1ZGluZyBzY29yZSwgZmllbGQgZ29hbCBwZXJjZW50YWdlLCByZWJvdW5kcywgdGhyZWUgcG9pbnQgcGVyY2VudGFnZSwgYW5kIHN0ZWFscykgYWxvbmcgd2l0aCB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucywgZm9yIGFsbCB0ZWFtcy4gCgoqKlRhYmxlIDIqKiAtLSBhIGNvbXBhcmlzb24gb2YgdGhlIG92ZXJhbGwgd2lucyBhbmQgbG9zc2VzIGZvciB0aGUgTmV3IFlvcmsgTGliZXJ0eSBpbiB0aGUgMjAyNCBzZWFzb24uIAoKYGBge3IgdGFibGVzLCBpbmNsdWRlPVRSVUV9CiN0YWJsZSBmb3IgVGVhbSBTdW1tYXJpZXMgCnN1bW1hcnkgJT4lCiAga2JsKGRpZ2l0cyA9IDIsIGNhcHRpb24gPSAiVGVhbSBTdW1tYXJpZXMiKSAlPiUKICBrYWJsZV9wYXBlciggZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJDYW1icmlhIikgCiAgCiN0YWJsZSBmb3IgTXkgVGVhbSAKbXlfdGVhbV9yZXN1bHRzICU+JQogIGtibChkaWdpdHMgPSAxLCBjYXB0aW9uID0gIk15IFRlYW0gV2lucy9Mb3NzZXMiKSAlPiUKICBrYWJsZV9wYXBlciggZnVsbF93aWR0aCA9IEYsIGh0bWxfZm9udCA9ICJDYW1icmlhIikKCmBgYAoKIyBQbG90cwoKVGhlIGJveCBwbG90IGJlbG93IGRpc3BsYXlzIGhvdyBtYW55IHBvaW50cyB0aGUgTlkgTGliZXJ0eSBzY29yZWQgaW4gZ2FtZXMgdGhleSB3b24gdmVyc3VzIGdhbWVzIHRoZXkgbG9zdCBkdXJpbmcgdGhlIDIwMjQgc2Vhc29uLiBUaGUgTGliZXJ0eSBzY29yZWQgbm90YWJseSBtb3JlIHBvaW50cyBpbiB0aGVpciB3aW5zIHRoYW4gaW4gdGhlaXIgbG9zc2VzLCB3aXRoIGEgbWVhbiBvZiA4Ni40NzUgaW4gd2lucyBjb21wYXJlZCB0byA4MCBpbiBsb3NzZXMuIFRoZSBkaXN0cmlidXRpb24gZm9yIHdpbnMgaXMgYWxzbyBtb3JlIG5hcnJvdyBhbmQgc2tld2VkIGhpZ2hlciBvdmVyYWxsLCB3aGlsZSB0aGUgbG9zcyBkaXN0cmlidXRpb24gc2hvd3MgZ3JlYXRlciBzcHJlYWQgYW5kIGEgbG93ZXIgdGFpbC4gCgoKYGBge3IgZ3JhcGhzLCBpbmNsdWRlPVRSVUUsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTQsIGZpZy5hbGlnbj0nY2VudGVyJ30KCmxpYnJhcnkoZ2dwbG90MikKI2NyZWF0ZSBib3ggcGxvdCBmb3IgcG9pbnRzIHNjb3JlZCBieSB3aW5zIHZzIGxvc3Nlcwpib3hwbG90KHRlYW1fc2NvcmUgfiByZXN1bHQsIGRhdGEgPSBkZl9oaXN0LCAKICAgICAgICBjb2wgPSBjKCdsaWdodGJsdWUnLCAnbGlnaHRncmVlbicpLAogICAgICAgIG1haW4gPSAiUG9pbnRzIFNjb3JlZCBieSBHYW1lIFJlc3VsdCIsIAogICAgICAgIHhsYWIgPSAiUmVzdWx0IiwgeWxhYiA9ICJQb2ludHMiKSAgCgpgYGAKCiMgTW9kZWxzCgpXaGVuIGFzc2Vzc2luZyBmb3IgbW9kZWwgdXRpbGl0eSwgbm8gaW50ZXJhY3Rpb25zIHdlcmUgZm91bmQgYmV0d2VlbiB0aGUgdmFyaWFibGVzIGluIHRoZSBmaXJzdCBtb2RlbCwgc28gdGhlcmUgd2FzIG5vdCBhIG5lZWQgZm9yIGEgcmVkdWNlZCBtb2RlbC4gCgoKYGBge3IgZmlyc3Qgb3JkZXIgbW9kZWwsIGluY2x1ZGU9RkFMU0V9CiNtb2RlbCAxIGlzIGEgZmlyc3Qgb3JkZXIgbW9kZWwgd2l0aCA0IHRlcm1zIAptb2RlbCA9IGxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCsgc3RlYWxzLCBkYXRhPW15X3RlYW0pCnN1bW1hcnkgKG1vZGVsKQoKI2NvcnJlbGF0aW9uIG1hdHJpeCByZXF1aXJlcyBhbGwgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcyBzbyBrZWVwIG9ubHkgdGhvc2UgdmFyaWFibGVzCmNvcl9kYXRhPSBteV90ZWFtICU+JQogIHNlbGVjdCh0ZWFtX3Njb3JlLCBmaWVsZF9nb2FsX3BjdCwgdG90YWxfcmVib3VuZHMsIAogICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgc3RlYWxzKQojY29ycmVsYXRpb24gbWF0cml4CmNvcihjb3JfZGF0YSkKCiNubyB2YXJpYWJsZSBpbnRlcmFjdGlvbnMsIHNvIG5vIG5lZWQgZm9yIGEgcmVkdWNlZCBtb2RlbAoKYGBgCgojIyBJbnRlcmFjdGlvbiBNb2RlbApNb2RlbCAyIGlzIHRoZSBpbnRlcmFjdGlvbiBtb2RlbC4gVGhpcyBtb2RlbCBpbmNsdWRlcyA0IGZpcnN0IG9yZGVyIHRlcm1zIGFuZCA2IGludGVyYWN0aW9uIHRlcm1zLiBBbGwgaW50ZXJhY3Rpb24gdGVybXMgd2VyZSBmb3VuZCB0byBiZSBub24tc2lnbmlmaWNhbnQgYXMgd2VsbCBhcyB0aGUgZmlyc3Qgb3JkZXIgdGVybSAic3RlYWxzIi4gVGhlc2UgdGVybXMgd2VyZSByZW1vdmVkIGluIHRoZSBmaW5hbCBtb2RlbC4gCgpgYGB7ciBpbnRlcmFjdGlvbiBtb2RlbCxyZXN1bHRzPSdhc2lzJywgaW5jbHVkZT1GfQojbW9kZWwgMiBpcyBhbiBpbnRlcmFjdGlvbiBtb2RlbCAKbW9kZWwyPWxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0K3RvdGFsX3JlYm91bmRzKwogICAgICAgICAgICB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCtzdGVhbHMrCiAgICAgICAgICBmaWVsZF9nb2FsX3BjdCp0b3RhbF9yZWJvdW5kcysgCiAgICAgICAgICAgIGZpZWxkX2dvYWxfcGN0KnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KwogICAgICAgICAgICBmaWVsZF9nb2FsX3BjdCpzdGVhbHMrCiAgICAgICAgICAgIHRvdGFsX3JlYm91bmRzKnRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KwogICAgICAgICAgICB0b3RhbF9yZWJvdW5kcypzdGVhbHMrCiAgICAgICAgICAgIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0KnN0ZWFscywgZGF0YT1teV90ZWFtKQpzdW1tYXJ5KG1vZGVsMikKCiNtb2RlbCAzIGlzIHRoZSBmaW5hbCBtb2RlbCwgcmVkdWNlZCB3aXRoIG5vbi1zaWduaWZpY2FudCB0ZXJtcyByZW1vdmVkCm1vZGVsMyA9IGxtKHRlYW1fc2NvcmV+IGZpZWxkX2dvYWxfcGN0ICsgdG90YWxfcmVib3VuZHMgKyB0aHJlZV9wb2ludF9maWVsZF9nb2FsX3BjdCwgZGF0YT1teV90ZWFtKQptb2RlbDNzdW09c3VtbWFyeSAobW9kZWwzKQoKYGBgCgojIyMgRmluYWwgTW9kZWwKCkFmdGVyIGFsbCBtb2RlbHMgd2VyZSBydW4gYW5kIG1vZGVsIHJlZHVjdGlvbiB3YXMgY29tcGxldGVkLCBteSBmaW5hbCBtb2RlbCBpcyB0ZWFtX3Njb3JlPSBgciBtb2RlbDMkY29lZmZpY2llbnRzWzFdYCsgYHIgbW9kZWwzJGNvZWZmaWNpZW50c1syXWAgKiBmaWVsZF9nb2FsX3BjdCArIGByIG1vZGVsMyRjb2VmZmljaWVudHNbM11gICogdG90YWxfcmVib3VuZHMgKyBgciBtb2RlbDMkY29lZmZpY2llbnRzWzRdYCAqIHRocmVlX3BvaW50X2ZpZWxkX2dvYWxfcGN0IC4gCgpUaGlzIG1vZGVsIHNpZ25pZmljYW50bHkgcHJlZGljdHMgdGVhbSBzY29yZSwgZihgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1syXWAsIGByIG1vZGVsM3N1bSRmc3RhdGlzdGljWzNdYCkgPSBgciBtb2RlbDNzdW0kZnN0YXRpc3RpY1sxXWAsIHAsLjAwMDAxLCBhZGp1c3RlZCBSXjI9IGByIG1vZGVsM3N1bSRhZGouci5zcXVhcmVkYCAuCgpgYGAge3IgZmluYWwgdGFibGUsIHJlc3VsdHM9J2FzaXMnLCBlY2hvPUYsIGluY2x1ZGU9IFQsIG1lc3NhZ2U9Rn0KCiN0YWJsZSB0byBzdW1tYXJpemUgZmluYWwgbW9kZWwKbGlicmFyeShzdGFyZ2F6ZXIpCnN0YXJnYXplcihtb2RlbDMsIHR5cGUgPSAiaHRtbCIpCiAKYGBgCgojIFJlc2lkdWFsIEFuYWx5c2lzCgoqKkhpc3RvZ3JhbSoqOiBUaGUgcmVzaWR1YWwgaGlzdG9ncmFtIGRlbW9uc3RyYXRlcyBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdGhlIHJlc2lkdWFscy4gCgoqKlZlcnN1cyBGaXRzIFBsb3QqKjogVGhlIHJlc2lkdWFscyBhcHBlYXIgdG8gYmUgcmFuZG9tbHkgc2NhdHRlcmVkLCBmb2xsb3dpbmcgbm8gY3VydmUgb3IgcGF0dGVybiwgc2F0aXNmeWluZyB0aGUgbGluZWFyaXR5IGFzc3VtcHRpb24uIFRoZXJlIGlzIG5vIGFwcGFyZW50IGhldGVyb3NjZWRhc3RpY2l0eSBhcyB0aGUgc3ByZWFkIG9mIHRoZSByZXNpZHVhbHMgc3RheXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgYWxsIGZpdHRlZCB2YWx1ZXMuIAoKKipDb29rJ3MgRCBQbG90Kio6IEZpdmUgb3V0bGllcnMgYXJlIGRldGVjdGVkIGJ5IHRoaXMgcGxvdCwgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBiZWluZyBvYnNlcnZhdGlvbnMgMTIgYW5kIDMwLiBPYnNlcnZhdGlvbiAxMiAoTlkgTGliZXJ0eSB2cyBBVEwgRHJlYW0sIDktMTktMjQpIHdhcyBhIHBhcnRpY3VsYXJseSBsb3cgc2NvcmluZyBnYW1lLCB3aXRoIGEgbG93ZXIgbnVtYmVyIG9mIHJlYm91bmRzLCBhbmQgYSBoaWdoIHRocmVlIHBvaW50IHBlcmNlbnRhZ2UsIGNvbXBhcmVkIHRvIHRoZSBtZWFuIHZhbHVlcy4gT2JzZXJ2YXRpb24gMzAgKE5ZIExpYmVydHkgdnMgQ1QgU3VuLCA3LTEwLTI0KSB3YXMgYWxzbyBhIHJlbGF0aXZlbHkgbG93IHNjb3JpbmcgZ2FtZSwgd2l0aCBhIGxvd2VyIHRocmVlIHBvaW50IHBlcmNlbnRhZ2UgYW5kIGxvdyBhbW91bnQgb2Ygc3RlYWxzLCBjb21wYXJlZCB0byB0aGUgbWVhbiB2YWx1ZXMuIAoKKipTdHVkZW50aXplZCBSZXNpZHVhbCBQbG90Kio6IFRoZSBzdHVkZW50aXplZCByZXNpZHVhbCBwbG90IGlkZW50aWZpZXMgdHdvIGxldmVyYWdlIHBvaW50czogb2JzZXJ2YXRpb24gMTIoTlkgTGliZXJ0eSB2cyBBVEwgRHJlYW0sIDktMTktMjQpIGFuZCAxIChOWSBMaWJlcnR5IHZzIE1OIEx5bngsIDEwLTIwLTI0KS4gCgoKYGBge3IgcmVzaWR1YWxzfQojcmVzaWR1YWwgcGxvdHMgZm9yIGZpbmFsIG1vZGVsIApoaXN0KG1vZGVsMyRyZXNpZHVhbHMpCnBsb3QobW9kZWwzJGZpdHRlZC52YWx1ZXMsIG1vZGVsMyRyZXNpZHVhbHMpCm9sc19wbG90X2Nvb2tzZF9iYXIobW9kZWwzKQpvbHNfcGxvdF9yZXNpZF9sZXYobW9kZWwzLCB0aHJlc2hvbGQgPSAzKQpgYGAKCiMgUHJlZGljdGlvbiBhbmQgRXN0aW1hdGlvbiAKCmBgYHtyIHByZWRpY3Rpb24sIGluY2x1ZGU9RkFMU0V9CiN0aGlzIHN1bW1hcnkgaXMgZm9yIGZpbmRpbmcgdGhlIG1lZGlhbiB2YWx1ZXMKc3VtbWFyeShjb3JfZGF0YSkKI3RoaXMgaXMgYSBuZXcgZGF0YSBmcmFtZSBmb3IgdGhlIG1lZGlhbiBnYW1lCm5ld2RhdGE9ZGF0YS5mcmFtZShmaWVsZF9nb2FsX3BjdD0gNDQuMjUgLCB0b3RhbF9yZWJvdW5kcz0gMzYuNSwgdGhyZWVfcG9pbnRfZmllbGRfZ29hbF9wY3Q9IDM2LjIwKQojcHJlZGljdGluZyB0aGUgbWVkaWFuIGdhbWUKcHJlZGljdGlvbj1wcmVkaWN0KG1vZGVsMywgbmV3ZGF0YSwgaW50ZXJ2YWw9ICJjb25maWRlbmNlIiwgbGV2ZWw9Ljk1KQoKYGBgCkkgYnVpbHQgdGhpcyBtb2RlbCB0byBwcmVkaWN0IG15IHRlYW0ncyBwb2ludHMgZm9yIGEgZ2FtZSBpbiB3aGljaCB0aGV5IGFjaGlldmUgdGhlIG1lZGlhbiB2YWx1ZSBmb3IgZWFjaCB2YXJpYWJsZS4gVGhlIGV4cGVyaW1lbnRhbCByZWdpb24gaXMgKC0xMy44MzI1LCAxNS4xMDEwKS4gVGhlIHByZWRpY3RlZCB0ZWFtIHNjb3JlIGlzIGByIHByZWRpY3Rpb25bMV1gLCB3aXRoIDk1JSBjb25maWRlbmNlIGludGVydmFsIChgciBwcmVkaWN0aW9uWzJdYCwgYHIgcHJlZGljdGlvblszXWApCgo=