Introduction and
Background
The dataset I am using for my analysis is an extensive collection of
metrics for every NBA player’s game-by-game performance across the
2022-2023 playoff season. It was published on the open-source data
science platform Kaggle (link can be found in references section below).
The original source for the data’s accuracy can be confirmed at
Basketball-reference.com, a well-established database for enthusiasts of
the sport. All statistical analysis will be conducted via the
programming language R.
As for the dataset’s contents, it is composed of all 217 players who
played some amount of time in the 2022-2023 postseason. It contained 30
variables, however only 10 played a role in my analysis, so I created a
reduced dataset which only contained the information pertinent to my
research question. An explanation and breakdown of the names and data
types for the variables used in my analysis is below:
“Player” = player’s name = character
“Pos” = player’s position on the court or in starting lineup =
character
“Tm” = team player plays for = character
“Age” = player’s age = integer
“PTS” = player’s points per game average = double
“AST” = player’s assists per game average = double
“TRB” = player’s rebounds per game average = double
“STL” = player’s steals per game average = double
“BLK” = player’s blocks per game average = double
“MP” = player’s minutes per game average = double
Using this dataset, I will be exploring the relationship that a
player’s impact on the game (measured via their average points,
rebounds, assists, steals and blocks) and circumstance (age, position
and team playing for) has on their playing time (measured by per minute
averages). I will refer to the five primary metrics of productivity
(points, rebounds, assists, steals and blocks) as the “five standard
statistics” of basketball.
Before conducting any thorough analysis, I would assume that there is
a positive correlation between a player’s playing time and their five
standard statistics, and a negative correlation between a player’s
playing time and their age. As for position, it would be my intuition
that traditionally smaller players, such as point guards and shooting
guards, have a higher average amount of playing time than their larger
positional counterparts like power forwards and centers. When it comes
to the importance of what team a player is on, I am unsure exactly what
to expect regarding any sort of significant difference in playing time
distribution from team to team, but I am sure that differences do exist
considering the multidude of different coaching methodologies out
there.
Given the sufficient size of my dataset, over 200 players from the 16
teams which participated in the postseason, and the reliability of its
sourcing, I am confident that I will be able to come to empircally
justified conclusions.
Initial Visual
Analysis
Below I created a pairwise scatter plot in order to concisely examine
the relationship that each of the quantitative variables relevant to my
analysis (age and the five standard basketball stats) have with a
player’s playing time.
Unsurprisingly, there was a very strong and positive correlation
between a player’s average points per game and their average minutes per
game (r ~ .895). Averages in assists, steals, rebounds and blocks also
each shared a positive correlation with playing time, but not to as
strong a degree (r ~ 0.77 to 0.54). Given that most basketball fans and
analysts would consider scoring to be the most important skill for any
player to posess, it does make sense that a player’s scoring average is
more determinant of his playing time than any other metric.
What was noticeable from the scatter plot was the exceptionally weak
relationship between a player’s age and his playing time (r ~ .115).
Conventional wisdom amongst many fans would be that players very early
on in their careers (low age value) and at the tail end of their careers
(high age value), would typically see far less playing time than the
athletes in their physical prime, however that is not a trend that this
data provides any sufficient evidence for.
ggpairs(Quantitative_Variables, title = "Pairwise Scatterplot of Quantitative Variables")

Simple Linear
Regression (SLR) and Residual Analysis
After using the aforementioned scatter plot to determine that points
per game had a supremely strong correlation with minutes per game, I
chose to explore the relationship between those two statistics further
via a simple linear regression model.
The regression model affirmed the previous conclusion taken away from
the scatter plot, which is that there is a statistically significant,
strong and positive correlation between scoring averages and playing
time averages. It appears that, for every additional point that a player
averages, he will play approximately an additional 1.4 minutes per game.
This function also operates with a slope intercept of about 7.32,
meaning there is an assumption that a standard player will “start” with
a playing time around 7 minutes per game before his scoring average is
taken into account.
To confirm reliability of my linear regression model, I then
performed residual analysis using a histogram, calculations and residual
scatter plot. While the distribution of the model’s residuals is
approximately normal and the mean of the residuals is extremely close to
zero, homoscedasticity of errors is not particularly meant. As when the
model predicted minutes per game of about 15 to 35, all the errors were
overestimates. But when the model predicted minutes per game of about 40
to 55, all the errors were underestimates. Although the residuals do not
show constant variance, I still believe there is strong utility in this
model given that other tenants of residual analysis appear to have been
sufficiently met.
Regression_Line_PTS_MP = lm(MP ~ PTS, data = Reduced_Playoff_Data)
summary(Regression_Line_PTS_MP)
Model_Residuals = resid(Regression_Line_PTS_MP)
Model_Predicted_Values = predict(Regression_Line_PTS_MP)
hist(Model_Residuals,
main = "Residual Analysis Histogram",
xlab = "Model Residuals")

mean(Model_Residuals)
plot(Model_Predicted_Values, Model_Residuals,
main = "Residual Analysis Scatterplot",
xlab = "Predicted minutes per game",
ylab = "Model Error (mins per game)")
abline(h=0)

Bootstrap Sampling for
Regression Coefficients
Using my regression model regarding the relationship between points
per game and minutes per game, I then created confidence intervals for
both the slope of the function, and the intercept of the function
(points per game). These bootstrap confidence intervals were formed with
a confidence level of 95%, and predicated on 1,000 samples. My most
recent run of the bootstrap algorithm, produced the following
values:
Intercept ~ [6.21, 8.46]
Points Per Game ~ [1.31, 1.55]
Remember, the linear model produced coefficient values that are both
safely within those intervals (7.32 and 1.4 respectively).
set.seed(123) # for reproducibility
B = 1000 # number of bootstrap resamples
n = nrow(Reduced_Playoff_Data)
vec_id =seq_len(n)
# storage
Boot.beta0 = numeric(B) # intercept
Boot.beta1 = numeric(B) # slope
for (i in seq_len(B)) {
boot_id = sample(vec_id, n, replace = TRUE) # resample rows
boot_reg = lm(MP ~ PTS, data = Reduced_Playoff_Data[boot_id, , drop = FALSE])
co = coef(boot_reg)
Boot.beta0[i] = co[1] # intercept
Boot.beta1[i] = co[2] # slope for PTS
}
# 95% percentile confidence intervals
ci_beta0 = quantile(Boot.beta0, c(0.025, 0.975))
ci_beta1 = quantile(Boot.beta1, c(0.025, 0.975))
ci_beta0
ci_beta1
hist(Boot.beta0, main = "Slope Intercept Model Coefficient", xlab = "Slope Intercept Value", ylab = "Bootstrap Sample Frequency")

hist(Boot.beta1, main = "Points Per Game Model Coefficient", xlab = "Points Per Game Value", ylab = "Bootstrap Sample Frequency")

Conclusions
Ultimately, we can conclude that there is certainly a strong,
positive and linear relationship between a NBA player’s scoring average
and his average playing time. Per the simple regression model, a
player’s minutes per game average increases by 1.4 for every additional
point he averages. Our bootstrap sampling coefficient calculations
produced confidence intervals at the 95% confidence level that strongly
overlapped with those values. If forced to pick one model to predict a
player’s playing time based on his scoring output, the bootstrap method
may be deemed more reliable due to the regression model producing
residuals of an inconsistent variance.
LS0tCnRpdGxlOiAiSG93IGFuIE5CQSBQbGF5ZXIncyBTY29yaW5nIE91dHB1dCBBZmZlY3RzIGhpcyBQbGF5aW5nIFRpbWUiCmF1dGhvcjogIkNocmlzIEJhaG0iCmRhdGU6ICIyMDI1LTA5LTE0IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IHRydWUKICAgICAgc21vb3RoX3Njcm9sbDogdHJ1ZQogICAgdG9jX2RlcHRoOiA0CiAgICBmaWdfd2lkdGg6IDYKICAgIGZpZ19oZWlnaHQ6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGx1bWVuCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKICAgIGZpZ19jYXB0aW9uOiB0cnVlCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6IDQKLS0tCgpgYGB7Y3NzLCBlY2hvID0gRkFMU0V9CmRpdiNUT0MgbGkgeyAgICAgLyogdGFibGUgb2YgY29udGVudCAgKi8KICAgIGxpc3Qtc3R5bGU6dXBwZXItcm9tYW47CiAgICBiYWNrZ3JvdW5kLWltYWdlOm5vbmU7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjowOwp9CgpoMS50aXRsZSB7ICAgIC8qIGxldmVsIDEgaGVhZGVyIG9mIHRpdGxlICAqLwogIGZvbnQtc2l6ZTogMjRweDsKICBmb250LXdlaWdodDogYm9sZDsKICBjb2xvcjogRGFya1JlZDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmg0LmF1dGhvciB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrUmVkOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDQuZGF0ZSB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovCiAgZm9udC1zaXplOiAxOHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmgxIHsgLyogSGVhZGVyIDEgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKaDIgeyAvKiBIZWFkZXIgMiAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxOHB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDMgeyAvKiBIZWFkZXIgMyAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBuYXZ5OwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKaDQgeyAvKiBIZWFkZXIgNCAtIGFuZCB0aGUgYXV0aG9yIGFuZCBkYXRhIGhlYWRlcnMgdXNlIHRoaXMgdG9vICAqLwogICAgZm9udC1zaXplOiAxNHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogZGFya3JlZDsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCi8qIEFkZCBkb3RzIGFmdGVyIG51bWJlcmVkIGhlYWRlcnMgKi8KLmhlYWRlci1zZWN0aW9uLW51bWJlcjo6YWZ0ZXIgewogIGNvbnRlbnQ6ICIuIjsKfQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIGNvZGUgY2h1bmsgc3BlY2lmaWVzIHdoZXRoZXIgdGhlIFIgY29kZSwgd2FybmluZ3MsIGFuZCBvdXRwdXQgCiMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGVzLgoKaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7ICAgICAgICAgICAgICAgICAgICAgICMgdXNlIGNvbmRpdGlvbmFsIHN0YXRlbWVudCB0byBkZXRlY3QKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKSAgICAgICAgICAgICAgICAgICMgd2hldGhlciBhIHBhY2thZ2Ugd2FzIGluc3RhbGxlZCBpbgogICBsaWJyYXJ5KGtuaXRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5b3VyIG1hY2hpbmUuIElmIG5vdCwgaW5zdGFsbCBpdCBhbmQKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbG9hZCBpdCB0byB0aGUgd29ya2luZyBkaXJlY3RvcnkuCiMKa25pdHI6Om9wdHNfY2h1bmskc2V0KAoJZWNobyA9IFRSVUUsCgltZXNzYWdlID0gRkFMU0UsCgl3YXJuaW5nID0gRkFMU0UsCgljb21tZW50ID0gTkEsCglyZXN1bHRzID0gVFJVRQopCiAgIApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShHR2FsbHkpCgpgYGAKCiMjIEludHJvZHVjdGlvbiBhbmQgQmFja2dyb3VuZApUaGUgZGF0YXNldCBJIGFtIHVzaW5nIGZvciBteSBhbmFseXNpcyBpcyBhbiBleHRlbnNpdmUgY29sbGVjdGlvbiBvZiBtZXRyaWNzIGZvciBldmVyeSBOQkEgcGxheWVyJ3MgZ2FtZS1ieS1nYW1lIHBlcmZvcm1hbmNlIGFjcm9zcyB0aGUgMjAyMi0yMDIzIHBsYXlvZmYgc2Vhc29uLiBJdCB3YXMgcHVibGlzaGVkIG9uIHRoZSBvcGVuLXNvdXJjZSBkYXRhIHNjaWVuY2UgcGxhdGZvcm0gS2FnZ2xlIChsaW5rIGNhbiBiZSBmb3VuZCBpbiByZWZlcmVuY2VzIHNlY3Rpb24gYmVsb3cpLiBUaGUgb3JpZ2luYWwgc291cmNlIGZvciB0aGUgZGF0YSdzIGFjY3VyYWN5IGNhbiBiZSBjb25maXJtZWQgYXQgQmFza2V0YmFsbC1yZWZlcmVuY2UuY29tLCBhIHdlbGwtZXN0YWJsaXNoZWQgZGF0YWJhc2UgZm9yIGVudGh1c2lhc3RzIG9mIHRoZSBzcG9ydC4gQWxsIHN0YXRpc3RpY2FsIGFuYWx5c2lzIHdpbGwgYmUgY29uZHVjdGVkIHZpYSB0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgUi4KCkFzIGZvciB0aGUgZGF0YXNldCdzIGNvbnRlbnRzLCBpdCBpcyBjb21wb3NlZCBvZiBhbGwgMjE3IHBsYXllcnMgd2hvIHBsYXllZCBzb21lIGFtb3VudCBvZiB0aW1lIGluIHRoZSAyMDIyLTIwMjMgcG9zdHNlYXNvbi4gSXQgY29udGFpbmVkIDMwIHZhcmlhYmxlcywgaG93ZXZlciBvbmx5IDEwIHBsYXllZCBhIHJvbGUgaW4gbXkgYW5hbHlzaXMsIHNvIEkgY3JlYXRlZCBhIHJlZHVjZWQgZGF0YXNldCB3aGljaCBvbmx5IGNvbnRhaW5lZCB0aGUgaW5mb3JtYXRpb24gcGVydGluZW50IHRvIG15IHJlc2VhcmNoIHF1ZXN0aW9uLiBBbiBleHBsYW5hdGlvbiBhbmQgYnJlYWtkb3duIG9mIHRoZSBuYW1lcyBhbmQgZGF0YSB0eXBlcyBmb3IgdGhlIHZhcmlhYmxlcyB1c2VkIGluIG15IGFuYWx5c2lzIGlzIGJlbG93OgoKLSAgICJQbGF5ZXIiID0gcGxheWVyJ3MgbmFtZSA9IGNoYXJhY3RlcgoKLSAgICJQb3MiID0gcGxheWVyJ3MgcG9zaXRpb24gb24gdGhlIGNvdXJ0IG9yIGluIHN0YXJ0aW5nIGxpbmV1cCA9IGNoYXJhY3RlcgoKLSAgICJUbSIgPSB0ZWFtIHBsYXllciBwbGF5cyBmb3IgPSBjaGFyYWN0ZXIKCi0gICAiQWdlIiA9IHBsYXllcidzIGFnZSA9IGludGVnZXIKCi0gICAiUFRTIiA9IHBsYXllcidzIHBvaW50cyBwZXIgZ2FtZSBhdmVyYWdlID0gZG91YmxlCgotICAgIkFTVCIgPSBwbGF5ZXIncyBhc3Npc3RzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKCi0gICAiVFJCIiA9IHBsYXllcidzIHJlYm91bmRzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKCi0gICAiU1RMIiA9IHBsYXllcidzIHN0ZWFscyBwZXIgZ2FtZSBhdmVyYWdlID0gZG91YmxlCgotICAgIkJMSyIgPSBwbGF5ZXIncyBibG9ja3MgcGVyIGdhbWUgYXZlcmFnZSA9IGRvdWJsZQoKLSAgICJNUCIgPSBwbGF5ZXIncyBtaW51dGVzIHBlciBnYW1lIGF2ZXJhZ2UgPSBkb3VibGUKClVzaW5nIHRoaXMgZGF0YXNldCwgSSB3aWxsIGJlIGV4cGxvcmluZyB0aGUgcmVsYXRpb25zaGlwIHRoYXQgYSBwbGF5ZXIncyBpbXBhY3Qgb24gdGhlIGdhbWUgKG1lYXN1cmVkIHZpYSB0aGVpciBhdmVyYWdlIHBvaW50cywgcmVib3VuZHMsIGFzc2lzdHMsIHN0ZWFscyBhbmQgYmxvY2tzKSBhbmQgY2lyY3Vtc3RhbmNlIChhZ2UsIHBvc2l0aW9uIGFuZCB0ZWFtIHBsYXlpbmcgZm9yKSBoYXMgb24gdGhlaXIgcGxheWluZyB0aW1lIChtZWFzdXJlZCBieSBwZXIgbWludXRlIGF2ZXJhZ2VzKS4gSSB3aWxsIHJlZmVyIHRvIHRoZSBmaXZlIHByaW1hcnkgbWV0cmljcyBvZiBwcm9kdWN0aXZpdHkgKHBvaW50cywgcmVib3VuZHMsIGFzc2lzdHMsIHN0ZWFscyBhbmQgYmxvY2tzKSBhcyB0aGUgImZpdmUgc3RhbmRhcmQgc3RhdGlzdGljcyIgb2YgYmFza2V0YmFsbC4KCkJlZm9yZSBjb25kdWN0aW5nIGFueSB0aG9yb3VnaCBhbmFseXNpcywgSSB3b3VsZCBhc3N1bWUgdGhhdCB0aGVyZSBpcyBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUgYW5kIHRoZWlyIGZpdmUgc3RhbmRhcmQgc3RhdGlzdGljcywgYW5kIGEgbmVnYXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBhIHBsYXllcidzIHBsYXlpbmcgdGltZSBhbmQgdGhlaXIgYWdlLiBBcyBmb3IgcG9zaXRpb24sIGl0IHdvdWxkIGJlIG15IGludHVpdGlvbiB0aGF0IHRyYWRpdGlvbmFsbHkgc21hbGxlciBwbGF5ZXJzLCBzdWNoIGFzIHBvaW50IGd1YXJkcyBhbmQgc2hvb3RpbmcgZ3VhcmRzLCBoYXZlIGEgaGlnaGVyIGF2ZXJhZ2UgYW1vdW50IG9mIHBsYXlpbmcgdGltZSB0aGFuIHRoZWlyIGxhcmdlciBwb3NpdGlvbmFsIGNvdW50ZXJwYXJ0cyBsaWtlIHBvd2VyIGZvcndhcmRzIGFuZCBjZW50ZXJzLiBXaGVuIGl0IGNvbWVzIHRvIHRoZSBpbXBvcnRhbmNlIG9mIHdoYXQgdGVhbSBhIHBsYXllciBpcyBvbiwgSSBhbSB1bnN1cmUgZXhhY3RseSB3aGF0IHRvIGV4cGVjdCByZWdhcmRpbmcgYW55IHNvcnQgb2Ygc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBwbGF5aW5nIHRpbWUgZGlzdHJpYnV0aW9uIGZyb20gdGVhbSB0byB0ZWFtLCBidXQgSSBhbSBzdXJlIHRoYXQgZGlmZmVyZW5jZXMgZG8gZXhpc3QgY29uc2lkZXJpbmcgdGhlIG11bHRpZHVkZSBvZiBkaWZmZXJlbnQgY29hY2hpbmcgbWV0aG9kb2xvZ2llcyBvdXQgdGhlcmUuCgpHaXZlbiB0aGUgc3VmZmljaWVudCBzaXplIG9mIG15IGRhdGFzZXQsIG92ZXIgMjAwIHBsYXllcnMgZnJvbSB0aGUgMTYgdGVhbXMgd2hpY2ggcGFydGljaXBhdGVkIGluIHRoZSBwb3N0c2Vhc29uLCBhbmQgdGhlIHJlbGlhYmlsaXR5IG9mIGl0cyBzb3VyY2luZywgSSBhbSBjb25maWRlbnQgdGhhdCBJIHdpbGwgYmUgYWJsZSB0byBjb21lIHRvIGVtcGlyY2FsbHkganVzdGlmaWVkIGNvbmNsdXNpb25zLgpgYGB7ciBEYXRhX1JlYWRfaW5fYW5kX0NsZWFuaW5nLCBpbmNsdWRlPUZBTFNFfQpGdWxsX1BsYXlvZmZfRGF0YV9TZXQgPSByZWFkLmNzdjIoIlBsYXlvZmZfRGF0YS5jc3YiKSAlPiUKICBtdXRhdGUoYWNyb3NzKGMoQWdlLCBNUCwgRkcsIEZHQSwgRkcuLCBYM1AsIFgzUEEsIFgzUC4sIFgyUCwgWDJQQSwgWDJQLiwgZUZHLiwgRlQsCiAgICAgICAgICAgICAgICAgIEZUQSwgRlQuLCBPUkIsIERSQiwgVFJCLCBBU1QsIFNUTCwgQkxLLCBUT1YsIFBGLCBQVFMpLAogICAgICAgICAgICAgICAgYXMuZG91YmxlKSkKIyMgTW92aW5nIGZvcndhcmQgcmVhZCBpbiBkYXRhIHNldCBmcm9tIEdpdEh1YiAoOS8xOC8yNSkKCmdsaW1wc2UoRnVsbF9QbGF5b2ZmX0RhdGFfU2V0KQoKUmVkdWNlZF9QbGF5b2ZmX0RhdGEgPSBGdWxsX1BsYXlvZmZfRGF0YV9TZXQgJT4lCiAgc2VsZWN0KFBsYXllciwgUG9zLCBUbSwgQWdlLCBQVFMsIEFTVCwgVFJCLCBTVEwsIEJMSywgTVApCgpnbGltcHNlKFJlZHVjZWRfUGxheW9mZl9EYXRhKQoKUGxheWVyID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkUGxheWVyClBvcyA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFBvcwpUbSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFRtCkFnZSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJEFnZQpQVFMgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSRQVFMKQVNUID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkQVNUClRSQiA9IFJlZHVjZWRfUGxheW9mZl9EYXRhJFRSQgpTVEwgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSRTVEwKQkxLID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkQkxLCk1QID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGEkTVAKClF1YW50aXRhdGl2ZV9WYXJpYWJsZXMgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YVtjKCJBZ2UiLCAiUFRTIiwgIkFTVCIsICJUUkIiLCAiU1RMIiwgIkJMSyIsICJNUCIpXQoKQ2F0ZWdvcmljYWxfVmFyaWFibGVzID0gUmVkdWNlZF9QbGF5b2ZmX0RhdGFbYygiUG9zIiwgIlRtIildCmBgYAoKIyMgSW5pdGlhbCBWaXN1YWwgQW5hbHlzaXMgCkJlbG93IEkgY3JlYXRlZCBhIHBhaXJ3aXNlIHNjYXR0ZXIgcGxvdCBpbiBvcmRlciB0byBjb25jaXNlbHkgZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIHRoYXQgZWFjaCBvZiB0aGUgcXVhbnRpdGF0aXZlIHZhcmlhYmxlcyByZWxldmFudCB0byBteSBhbmFseXNpcyAoYWdlIGFuZCB0aGUgZml2ZSBzdGFuZGFyZCBiYXNrZXRiYWxsIHN0YXRzKSBoYXZlIHdpdGggYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUuIAoKVW5zdXJwcmlzaW5nbHksIHRoZXJlIHdhcyBhIHZlcnkgc3Ryb25nIGFuZCBwb3NpdGl2ZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGEgcGxheWVyJ3MgYXZlcmFnZSBwb2ludHMgcGVyIGdhbWUgYW5kIHRoZWlyIGF2ZXJhZ2UgbWludXRlcyBwZXIgZ2FtZSAociB+IC44OTUpLiBBdmVyYWdlcyBpbiBhc3Npc3RzLCBzdGVhbHMsIHJlYm91bmRzIGFuZCBibG9ja3MgYWxzbyBlYWNoIHNoYXJlZCBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIHdpdGggcGxheWluZyB0aW1lLCBidXQgbm90IHRvIGFzIHN0cm9uZyBhIGRlZ3JlZSAociB+IDAuNzcgdG8gMC41NCkuIEdpdmVuIHRoYXQgbW9zdCBiYXNrZXRiYWxsIGZhbnMgYW5kIGFuYWx5c3RzIHdvdWxkIGNvbnNpZGVyIHNjb3JpbmcgdG8gYmUgdGhlIG1vc3QgaW1wb3J0YW50IHNraWxsIGZvciBhbnkgcGxheWVyIHRvIHBvc2VzcywgaXQgZG9lcyBtYWtlIHNlbnNlIHRoYXQgYSBwbGF5ZXIncyBzY29yaW5nIGF2ZXJhZ2UgaXMgbW9yZSBkZXRlcm1pbmFudCBvZiBoaXMgcGxheWluZyB0aW1lIHRoYW4gYW55IG90aGVyIG1ldHJpYy4KCldoYXQgd2FzIG5vdGljZWFibGUgZnJvbSB0aGUgc2NhdHRlciBwbG90IHdhcyB0aGUgZXhjZXB0aW9uYWxseSB3ZWFrIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgcGxheWVyJ3MgYWdlIGFuZCBoaXMgcGxheWluZyB0aW1lIChyIH4gLjExNSkuIENvbnZlbnRpb25hbCB3aXNkb20gYW1vbmdzdCBtYW55IGZhbnMgd291bGQgYmUgdGhhdCBwbGF5ZXJzIHZlcnkgZWFybHkgb24gaW4gdGhlaXIgY2FyZWVycyAobG93IGFnZSB2YWx1ZSkgYW5kIGF0IHRoZSB0YWlsIGVuZCBvZiB0aGVpciBjYXJlZXJzIChoaWdoIGFnZSB2YWx1ZSksIHdvdWxkIHR5cGljYWxseSBzZWUgZmFyIGxlc3MgcGxheWluZyB0aW1lIHRoYW4gdGhlIGF0aGxldGVzIGluIHRoZWlyIHBoeXNpY2FsIHByaW1lLCBob3dldmVyIHRoYXQgaXMgbm90IGEgdHJlbmQgdGhhdCB0aGlzIGRhdGEgcHJvdmlkZXMgYW55IHN1ZmZpY2llbnQgZXZpZGVuY2UgZm9yLiAKYGBge3IgRGF0YV9BbmFseXNpcywgcmVzdWx0cz0naGlkZSd9CmdncGFpcnMoUXVhbnRpdGF0aXZlX1ZhcmlhYmxlcywgdGl0bGUgPSAiUGFpcndpc2UgU2NhdHRlcnBsb3Qgb2YgUXVhbnRpdGF0aXZlIFZhcmlhYmxlcyIpCmBgYAoKIyMgU2ltcGxlIExpbmVhciBSZWdyZXNzaW9uIChTTFIpIGFuZCBSZXNpZHVhbCBBbmFseXNpcwpBZnRlciB1c2luZyB0aGUgYWZvcmVtZW50aW9uZWQgc2NhdHRlciBwbG90IHRvIGRldGVybWluZSB0aGF0IHBvaW50cyBwZXIgZ2FtZSBoYWQgYSBzdXByZW1lbHkgc3Ryb25nIGNvcnJlbGF0aW9uIHdpdGggbWludXRlcyBwZXIgZ2FtZSwgSSBjaG9zZSB0byBleHBsb3JlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aG9zZSB0d28gc3RhdGlzdGljcyBmdXJ0aGVyIHZpYSBhIHNpbXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbC4gCgpUaGUgcmVncmVzc2lvbiBtb2RlbCBhZmZpcm1lZCB0aGUgcHJldmlvdXMgY29uY2x1c2lvbiB0YWtlbiBhd2F5IGZyb20gdGhlIHNjYXR0ZXIgcGxvdCwgd2hpY2ggaXMgdGhhdCB0aGVyZSBpcyBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQsIHN0cm9uZyBhbmQgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBzY29yaW5nIGF2ZXJhZ2VzIGFuZCBwbGF5aW5nIHRpbWUgYXZlcmFnZXMuIEl0IGFwcGVhcnMgdGhhdCwgZm9yIGV2ZXJ5IGFkZGl0aW9uYWwgcG9pbnQgdGhhdCBhIHBsYXllciBhdmVyYWdlcywgaGUgd2lsbCBwbGF5IGFwcHJveGltYXRlbHkgYW4gYWRkaXRpb25hbCAxLjQgbWludXRlcyBwZXIgZ2FtZS4gVGhpcyBmdW5jdGlvbiBhbHNvIG9wZXJhdGVzIHdpdGggYSBzbG9wZSBpbnRlcmNlcHQgb2YgYWJvdXQgNy4zMiwgbWVhbmluZyB0aGVyZSBpcyBhbiBhc3N1bXB0aW9uIHRoYXQgYSBzdGFuZGFyZCBwbGF5ZXIgd2lsbCAic3RhcnQiIHdpdGggYSBwbGF5aW5nIHRpbWUgYXJvdW5kIDcgbWludXRlcyBwZXIgZ2FtZSBiZWZvcmUgaGlzIHNjb3JpbmcgYXZlcmFnZSBpcyB0YWtlbiBpbnRvIGFjY291bnQuCgpUbyBjb25maXJtIHJlbGlhYmlsaXR5IG9mIG15IGxpbmVhciByZWdyZXNzaW9uIG1vZGVsLCBJIHRoZW4gcGVyZm9ybWVkIHJlc2lkdWFsIGFuYWx5c2lzIHVzaW5nIGEgaGlzdG9ncmFtLCBjYWxjdWxhdGlvbnMgYW5kIHJlc2lkdWFsIHNjYXR0ZXIgcGxvdC4gV2hpbGUgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbW9kZWwncyByZXNpZHVhbHMgaXMgYXBwcm94aW1hdGVseSBub3JtYWwgYW5kIHRoZSBtZWFuIG9mIHRoZSByZXNpZHVhbHMgaXMgZXh0cmVtZWx5IGNsb3NlIHRvIHplcm8sIGhvbW9zY2VkYXN0aWNpdHkgb2YgZXJyb3JzIGlzIG5vdCBwYXJ0aWN1bGFybHkgbWVhbnQuIEFzIHdoZW4gdGhlIG1vZGVsIHByZWRpY3RlZCBtaW51dGVzIHBlciBnYW1lIG9mIGFib3V0IDE1IHRvIDM1LCBhbGwgdGhlIGVycm9ycyB3ZXJlIG92ZXJlc3RpbWF0ZXMuIEJ1dCB3aGVuIHRoZSBtb2RlbCBwcmVkaWN0ZWQgbWludXRlcyBwZXIgZ2FtZSBvZiBhYm91dCA0MCB0byA1NSwgYWxsIHRoZSBlcnJvcnMgd2VyZSB1bmRlcmVzdGltYXRlcy4gQWx0aG91Z2ggdGhlIHJlc2lkdWFscyBkbyBub3Qgc2hvdyBjb25zdGFudCB2YXJpYW5jZSwgSSBzdGlsbCBiZWxpZXZlIHRoZXJlIGlzIHN0cm9uZyB1dGlsaXR5IGluIHRoaXMgbW9kZWwgZ2l2ZW4gdGhhdCBvdGhlciB0ZW5hbnRzIG9mIHJlc2lkdWFsIGFuYWx5c2lzIGFwcGVhciB0byBoYXZlIGJlZW4gc3VmZmljaWVudGx5IG1ldC4KYGBge3IgTGluZWFyX1JlZ3Jlc3Npb24sIHJlc3VsdHM9J2hpZGUnfQpSZWdyZXNzaW9uX0xpbmVfUFRTX01QID0gbG0oTVAgfiBQVFMsIGRhdGEgPSBSZWR1Y2VkX1BsYXlvZmZfRGF0YSkKc3VtbWFyeShSZWdyZXNzaW9uX0xpbmVfUFRTX01QKQoKTW9kZWxfUmVzaWR1YWxzID0gcmVzaWQoUmVncmVzc2lvbl9MaW5lX1BUU19NUCkKTW9kZWxfUHJlZGljdGVkX1ZhbHVlcyA9IHByZWRpY3QoUmVncmVzc2lvbl9MaW5lX1BUU19NUCkKaGlzdChNb2RlbF9SZXNpZHVhbHMsCiAgICAgbWFpbiA9ICJSZXNpZHVhbCBBbmFseXNpcyBIaXN0b2dyYW0iLAogICAgIHhsYWIgPSAiTW9kZWwgUmVzaWR1YWxzIikKbWVhbihNb2RlbF9SZXNpZHVhbHMpCnBsb3QoTW9kZWxfUHJlZGljdGVkX1ZhbHVlcywgTW9kZWxfUmVzaWR1YWxzLAogICAgIG1haW4gPSAiUmVzaWR1YWwgQW5hbHlzaXMgU2NhdHRlcnBsb3QiLAogICAgIHhsYWIgPSAiUHJlZGljdGVkIG1pbnV0ZXMgcGVyIGdhbWUiLAogICAgIHlsYWIgPSAiTW9kZWwgRXJyb3IgKG1pbnMgcGVyIGdhbWUpIikKYWJsaW5lKGg9MCkKYGBgCgojIyBCb290c3RyYXAgU2FtcGxpbmcgZm9yIFJlZ3Jlc3Npb24gQ29lZmZpY2llbnRzClVzaW5nIG15IHJlZ3Jlc3Npb24gbW9kZWwgcmVnYXJkaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb2ludHMgcGVyIGdhbWUgYW5kIG1pbnV0ZXMgcGVyIGdhbWUsIEkgdGhlbiBjcmVhdGVkIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBib3RoIHRoZSBzbG9wZSBvZiB0aGUgZnVuY3Rpb24sIGFuZCB0aGUgaW50ZXJjZXB0IG9mIHRoZSBmdW5jdGlvbiAocG9pbnRzIHBlciBnYW1lKS4gVGhlc2UgYm9vdHN0cmFwIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIHdlcmUgZm9ybWVkIHdpdGggYSBjb25maWRlbmNlIGxldmVsIG9mIDk1JSwgYW5kIHByZWRpY2F0ZWQgb24gMSwwMDAgc2FtcGxlcy4gTXkgbW9zdCByZWNlbnQgcnVuIG9mIHRoZSBib290c3RyYXAgYWxnb3JpdGhtLCBwcm9kdWNlZCB0aGUgZm9sbG93aW5nIHZhbHVlczoKCkludGVyY2VwdCB+IFs2LjIxLCA4LjQ2XQoKUG9pbnRzIFBlciBHYW1lIH4gWzEuMzEsIDEuNTVdCgpSZW1lbWJlciwgdGhlIGxpbmVhciBtb2RlbCBwcm9kdWNlZCBjb2VmZmljaWVudCB2YWx1ZXMgdGhhdCBhcmUgYm90aCBzYWZlbHkgd2l0aGluIHRob3NlIGludGVydmFscyAoNy4zMiBhbmQgMS40IHJlc3BlY3RpdmVseSkuCgpgYGB7ciBCb290c3RyYXAgUmVncmVzc2lvbiwgcmVzdWx0cz0naGlkZSd9CnNldC5zZWVkKDEyMykgICAgICAgICAgICAgICAgICMgZm9yIHJlcHJvZHVjaWJpbGl0eQpCID0gMTAwMCAgICAgICAgICAgICAgICAgICAgICMgbnVtYmVyIG9mIGJvb3RzdHJhcCByZXNhbXBsZXMKCm4gPSBucm93KFJlZHVjZWRfUGxheW9mZl9EYXRhKQp2ZWNfaWQgPXNlcV9sZW4obikKCiMgc3RvcmFnZQpCb290LmJldGEwID0gbnVtZXJpYyhCKSAjIGludGVyY2VwdApCb290LmJldGExID0gbnVtZXJpYyhCKSAjIHNsb3BlCgpmb3IgKGkgaW4gc2VxX2xlbihCKSkgewogIGJvb3RfaWQgPSBzYW1wbGUodmVjX2lkLCBuLCByZXBsYWNlID0gVFJVRSkgIyByZXNhbXBsZSByb3dzCiAgYm9vdF9yZWcgPSBsbShNUCB+IFBUUywgZGF0YSA9IFJlZHVjZWRfUGxheW9mZl9EYXRhW2Jvb3RfaWQsICwgZHJvcCA9IEZBTFNFXSkgCiAgY28gPSBjb2VmKGJvb3RfcmVnKQogIEJvb3QuYmV0YTBbaV0gPSBjb1sxXSAgICAjIGludGVyY2VwdAogIEJvb3QuYmV0YTFbaV0gPSBjb1syXSAgICAjIHNsb3BlIGZvciBQVFMKfQoKIyA5NSUgcGVyY2VudGlsZSBjb25maWRlbmNlIGludGVydmFscwpjaV9iZXRhMCA9IHF1YW50aWxlKEJvb3QuYmV0YTAsIGMoMC4wMjUsIDAuOTc1KSkKY2lfYmV0YTEgPSBxdWFudGlsZShCb290LmJldGExLCBjKDAuMDI1LCAwLjk3NSkpCmNpX2JldGEwCmNpX2JldGExCgpoaXN0KEJvb3QuYmV0YTAsIG1haW4gPSAiU2xvcGUgSW50ZXJjZXB0IE1vZGVsIENvZWZmaWNpZW50IiwgeGxhYiA9ICJTbG9wZSBJbnRlcmNlcHQgVmFsdWUiLCB5bGFiID0gIkJvb3RzdHJhcCBTYW1wbGUgRnJlcXVlbmN5IikKaGlzdChCb290LmJldGExLCBtYWluID0gIlBvaW50cyBQZXIgR2FtZSBNb2RlbCBDb2VmZmljaWVudCIsIHhsYWIgPSAiUG9pbnRzIFBlciBHYW1lIFZhbHVlIiwgeWxhYiA9ICJCb290c3RyYXAgU2FtcGxlIEZyZXF1ZW5jeSIpCmBgYAoKIyMgQ29uY2x1c2lvbnMKVWx0aW1hdGVseSwgd2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlcmUgaXMgY2VydGFpbmx5IGEgc3Ryb25nLCBwb3NpdGl2ZSBhbmQgbGluZWFyIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgTkJBIHBsYXllcidzIHNjb3JpbmcgYXZlcmFnZSBhbmQgaGlzIGF2ZXJhZ2UgcGxheWluZyB0aW1lLiAKUGVyIHRoZSBzaW1wbGUgcmVncmVzc2lvbiBtb2RlbCwgYSBwbGF5ZXIncyBtaW51dGVzIHBlciBnYW1lIGF2ZXJhZ2UgaW5jcmVhc2VzIGJ5IDEuNCBmb3IgZXZlcnkgYWRkaXRpb25hbCBwb2ludCBoZSBhdmVyYWdlcy4gT3VyIGJvb3RzdHJhcCBzYW1wbGluZyBjb2VmZmljaWVudCBjYWxjdWxhdGlvbnMgcHJvZHVjZWQgY29uZmlkZW5jZSBpbnRlcnZhbHMgYXQgdGhlIDk1JSBjb25maWRlbmNlIGxldmVsIHRoYXQgc3Ryb25nbHkgb3ZlcmxhcHBlZCB3aXRoIHRob3NlIHZhbHVlcy4gSWYgZm9yY2VkIHRvIHBpY2sgb25lIG1vZGVsIHRvIHByZWRpY3QgYSBwbGF5ZXIncyBwbGF5aW5nIHRpbWUgYmFzZWQgb24gaGlzIHNjb3Jpbmcgb3V0cHV0LCB0aGUgYm9vdHN0cmFwIG1ldGhvZCBtYXkgYmUgZGVlbWVkIG1vcmUgcmVsaWFibGUgZHVlIHRvIHRoZSByZWdyZXNzaW9uIG1vZGVsIHByb2R1Y2luZyByZXNpZHVhbHMgb2YgYW4gaW5jb25zaXN0ZW50IHZhcmlhbmNlLgoKIyMgUmVmZXJlbmNlczoKCkRhdGFzZXQgTGluazogPGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vZGF0YXNldHMvdml2b3ZpbmNvLzIwMjIyMDIzLW5iYS1wbGF5ZXItc3RhdHMtcmVndWxhcj4K