Introduction
Description
In this data set we have data from the 2008 NFL season. More
specifically we have factors that go into NFL fielgoals. Some variables
include the kicking team, Name, Distance, timerem, defscore, and
GOOD.
Kicking team - Name of the kicking team (categorical) Name - Name of
the kicker Distance - How far the ball is from the goal Time Remaining -
How much time is on the game clock remaining in the game Defensive Score
- The score of the opposing team GOOD - If the field goal is made or
not, a 1 for a make and 0 for a miss
Question
From general knowledge most fans assume that the longer the distance
it becomes less likely for a field goal to be made. Our question for
this analysis is to see if this statement remains true. We will be
exploring the association between a made field goal and distance
Data Cleaning
fieldgoals <- read.csv("https://raw.githubusercontent.com/TylerBattaglini/STA-321/refs/heads/main/nfl2008_fga.csv", header = TRUE)
clean_fieldgoals <- na.omit(fieldgoals)
clean_fieldgoals <- clean_fieldgoals %>% select(-GameDate, -AwayTeam, -HomeTeam, -qtr, -min, -sec, -def, -down, -togo, -kicker, -ydline, -homekick, -offscore, -season, -Missed, -Blocked)
y0=clean_fieldgoals$GOOD
fieldgoal.01 = rep(0, length(y0))
fieldgoal.01[which(y0=="pos")] = 1
clean_fieldgoals$fieldgoal.01 = fieldgoal.01
head(clean_fieldgoals)
kickteam name distance kickdiff timerem defscore GOOD fieldgoal.01
1 IND A.Vinatieri 30 -3 2822 3 1 0
2 IND A.Vinatieri 46 0 3287 0 1 0
3 IND A.Vinatieri 28 7 2720 0 1 0
4 IND A.Vinatieri 37 14 2742 0 1 0
5 IND A.Vinatieri 39 0 3056 0 1 0
6 IND A.Vinatieri 40 -3 3043 3 1 0
We take out any observations with a missing value. We also take out
many variables due to there being a high likeleyhood for
multicollineairty. We already have a variable for time so we eliminated
many variables related to time. We also already have a variable for a
make so we do not need any for a miss or blocked, that would just be a
repeat our data. The others are just categorical variables that are to
identify the kicker or kicking team which again we already have
variables that describe that.
Data Analysis
ylimit = max(density(clean_fieldgoals$distance)$y)
hist(clean_fieldgoals$distance, probability = TRUE, main = "Distance", xlab="Dis",
col = "azure1", border="lightseagreen")
lines(density(clean_fieldgoals$distance, adjust=2), col="blue")

We do an exploritory data anylsis on our predictor variable. We see
from the histogram above that there is no skew which means there is no
imbalanace.
s.logit = glm(GOOD ~ distance,
family = binomial(link = "logit"),
data = clean_fieldgoals)
result = summary(s.logit)
result
Call:
glm(formula = GOOD ~ distance, family = binomial(link = "logit"),
data = clean_fieldgoals)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 6.7056 0.5480 12.236 <2e-16 ***
distance -0.1194 0.0124 -9.631 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 809.65 on 1036 degrees of freedom
Residual deviance: 686.12 on 1035 degrees of freedom
AIC: 690.12
Number of Fisher Scoring iterations: 6
model.coef.stats = summary(s.logit)$coef
conf.ci = confint(s.logit)
Waiting for profiling to be done...
sum.stats = cbind(model.coef.stats, conf.ci.95=conf.ci)
kable(sum.stats,caption = "The summary stats of regression coefficients")
The summary stats of regression coefficients
(Intercept) |
6.7056029 |
0.5480144 |
12.236179 |
0 |
5.6755150 |
7.8271583 |
distance |
-0.1194428 |
0.0124020 |
-9.630942 |
0 |
-0.1445903 |
-0.0958982 |
From ouroutput above we see that distance is negatively asscoiated
with a made field goal. Our estimate is equal to -.1194. Our 95% CI is
[-.144, -.095]. This confidence interval also supports our
hypothesis.
model.coef.stats = summary(s.logit)$coef
odds.ratio = exp(coef(s.logit))
out.stats = cbind(model.coef.stats, odds.ratio = odds.ratio)
kable(out.stats,caption = "Summary Stats with Odds Ratios")
Summary Stats with Odds Ratios
(Intercept) |
6.7056029 |
0.5480144 |
12.236179 |
0 |
816.9704676 |
distance |
-0.1194428 |
0.0124020 |
-9.630942 |
0 |
0.8874148 |
Now we convert our estimate to an odds ratio. The odds ratio
associated with distance is .887 meaning that as distance increases by
one unit, the odds of being a made field goal goes down by 11.3%.
bmi.range = range(clean_fieldgoals$distance)
x = seq(bmi.range[1], bmi.range[2], length = 200)
beta.x = coef(s.logit)[1] + coef(s.logit)[2]*x
success.prob = exp(beta.x)/(1+exp(beta.x))
failure.prob = 1/(1+exp(beta.x))
ylimit = max(success.prob, failure.prob)
##
beta1 = coef(s.logit)[2]
success.prob.rate = beta1*exp(beta.x)/(1+exp(beta.x))^2
##
##
par(mfrow = c(1,2))
plot(x, success.prob, type = "l", lwd = 2, col = "navy",
main = "The probability of being \n a made field goal",
ylim=c(0, 1.1*ylimit),
xlab = "distance",
ylab = "probability",
axes = FALSE,
col.main = "navy",
cex.main = 0.8)
# lines(x, failure.prob,lwd = 2, col = "darkred")
axis(1, pos = 0)
axis(2)

The graph above is our S curve which is pointing down like we think
it would because it shows probability of a made field goal as distance
goes up. We see that the probability of a field goal goes down as the
distance goes up.
LS0tDQp0aXRsZTogIkZhY3RvcnMgSW5mbHVlbmNlIE5GTCBGaWVsZCBHb2FscyINCmF1dGhvcjogJ1R5bGVyIEJhdHRhZ2xpbmknDQpkYXRlOiAiMjAyNC0xMC0xMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJubGVxc2x2IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm5sZXFzbHYiKQ0KICAgbGlicmFyeShubGVxc2x2KQ0KfQ0KIw0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBzeWNoIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KICAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiY2FyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyIikNCiAgIGxpYnJhcnkoY2FyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiAgIGxpYnJhcnkoZHBseXIpDQp9DQppZiAoIXJlcXVpcmUoImNhcmV0IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKQ0KICAgbGlicmFyeShjYXJldCkNCn0NCg0KIyBzcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgICMNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQojIyMgRGVzY3JpcHRpb24NCkluIHRoaXMgZGF0YSBzZXQgd2UgaGF2ZSBkYXRhIGZyb20gdGhlIDIwMDggTkZMIHNlYXNvbi4gTW9yZSBzcGVjaWZpY2FsbHkgd2UgaGF2ZSBmYWN0b3JzIHRoYXQgZ28gaW50byBORkwgZmllbGdvYWxzLiBTb21lIHZhcmlhYmxlcyBpbmNsdWRlIHRoZSBraWNraW5nIHRlYW0sIE5hbWUsIERpc3RhbmNlLCB0aW1lcmVtLCBkZWZzY29yZSwgYW5kIEdPT0QuDQoNCktpY2tpbmcgdGVhbSAtIE5hbWUgb2YgdGhlIGtpY2tpbmcgdGVhbSAoY2F0ZWdvcmljYWwpDQpOYW1lIC0gTmFtZSBvZiB0aGUga2lja2VyDQpEaXN0YW5jZSAtIEhvdyBmYXIgdGhlIGJhbGwgaXMgZnJvbSB0aGUgZ29hbA0KVGltZSBSZW1haW5pbmcgLSBIb3cgbXVjaCB0aW1lIGlzIG9uIHRoZSBnYW1lIGNsb2NrIHJlbWFpbmluZyBpbiB0aGUgZ2FtZQ0KRGVmZW5zaXZlIFNjb3JlIC0gVGhlIHNjb3JlIG9mIHRoZSBvcHBvc2luZyB0ZWFtDQpHT09EIC0gSWYgdGhlIGZpZWxkIGdvYWwgaXMgbWFkZSBvciBub3QsIGEgMSBmb3IgYSBtYWtlIGFuZCAwIGZvciBhIG1pc3MNCg0KIyMjIFF1ZXN0aW9uDQoNCkZyb20gZ2VuZXJhbCBrbm93bGVkZ2UgbW9zdCBmYW5zIGFzc3VtZSB0aGF0IHRoZSBsb25nZXIgdGhlIGRpc3RhbmNlIGl0IGJlY29tZXMgbGVzcyBsaWtlbHkgZm9yIGEgZmllbGQgZ29hbCB0byBiZSBtYWRlLiBPdXIgcXVlc3Rpb24gZm9yIHRoaXMgYW5hbHlzaXMgaXMgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IHJlbWFpbnMgdHJ1ZS4gV2Ugd2lsbCBiZSBleHBsb3JpbmcgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSBtYWRlIGZpZWxkIGdvYWwgYW5kIGRpc3RhbmNlDQoNCiMjIyBEYXRhIENsZWFuaW5nDQoNCmBgYHtyfQ0KDQpmaWVsZGdvYWxzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL25mbDIwMDhfZmdhLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCmNsZWFuX2ZpZWxkZ29hbHMgPC0gbmEub21pdChmaWVsZGdvYWxzKQ0KY2xlYW5fZmllbGRnb2FscyA8LSBjbGVhbl9maWVsZGdvYWxzICU+JSBzZWxlY3QoLUdhbWVEYXRlLCAtQXdheVRlYW0sIC1Ib21lVGVhbSwgLXF0ciwgLW1pbiwgLXNlYywgLWRlZiwgLWRvd24sIC10b2dvLCAta2lja2VyLCAteWRsaW5lLCAtaG9tZWtpY2ssIC1vZmZzY29yZSwgLXNlYXNvbiwgLU1pc3NlZCwgLUJsb2NrZWQpDQp5MD1jbGVhbl9maWVsZGdvYWxzJEdPT0QNCmZpZWxkZ29hbC4wMSA9IHJlcCgwLCBsZW5ndGgoeTApKQ0KZmllbGRnb2FsLjAxW3doaWNoKHkwPT0icG9zIildID0gMQ0KY2xlYW5fZmllbGRnb2FscyRmaWVsZGdvYWwuMDEgPSBmaWVsZGdvYWwuMDENCmhlYWQoY2xlYW5fZmllbGRnb2FscykNCmBgYA0KV2UgdGFrZSBvdXQgYW55IG9ic2VydmF0aW9ucyB3aXRoIGEgbWlzc2luZyB2YWx1ZS4gV2UgYWxzbyB0YWtlIG91dCBtYW55IHZhcmlhYmxlcyBkdWUgdG8gdGhlcmUgYmVpbmcgYSBoaWdoIGxpa2VsZXlob29kIGZvciBtdWx0aWNvbGxpbmVhaXJ0eS4gV2UgYWxyZWFkeSBoYXZlIGEgdmFyaWFibGUgZm9yIHRpbWUgc28gd2UgZWxpbWluYXRlZCBtYW55IHZhcmlhYmxlcyByZWxhdGVkIHRvIHRpbWUuIFdlIGFsc28gYWxyZWFkeSBoYXZlIGEgdmFyaWFibGUgZm9yIGEgbWFrZSBzbyB3ZSBkbyBub3QgbmVlZCBhbnkgZm9yIGEgbWlzcyBvciBibG9ja2VkLCB0aGF0IHdvdWxkIGp1c3QgYmUgYSByZXBlYXQgb3VyIGRhdGEuIFRoZSBvdGhlcnMgYXJlIGp1c3QgY2F0ZWdvcmljYWwgdmFyaWFibGVzIHRoYXQgYXJlIHRvIGlkZW50aWZ5IHRoZSBraWNrZXIgb3Iga2lja2luZyB0ZWFtIHdoaWNoIGFnYWluIHdlIGFscmVhZHkgaGF2ZSB2YXJpYWJsZXMgdGhhdCBkZXNjcmliZSB0aGF0LiANCg0KDQoNCiMgRGF0YSBBbmFseXNpcw0KDQpgYGB7cn0NCnlsaW1pdCA9IG1heChkZW5zaXR5KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UpJHkpDQpoaXN0KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UsIHByb2JhYmlsaXR5ID0gVFJVRSwgbWFpbiA9ICJEaXN0YW5jZSIsIHhsYWI9IkRpcyIsIA0KICAgICAgIGNvbCA9ICJhenVyZTEiLCBib3JkZXI9ImxpZ2h0c2VhZ3JlZW4iKQ0KICBsaW5lcyhkZW5zaXR5KGNsZWFuX2ZpZWxkZ29hbHMkZGlzdGFuY2UsIGFkanVzdD0yKSwgY29sPSJibHVlIikgDQpgYGANCg0KV2UgZG8gYW4gZXhwbG9yaXRvcnkgZGF0YSBhbnlsc2lzIG9uIG91ciBwcmVkaWN0b3IgdmFyaWFibGUuIFdlIHNlZSBmcm9tIHRoZSBoaXN0b2dyYW0gYWJvdmUgdGhhdCB0aGVyZSBpcyBubyBza2V3IHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIGltYmFsYW5hY2UuIA0KDQpgYGB7cn0NCnMubG9naXQgPSBnbG0oR09PRCB+IGRpc3RhbmNlLCANCiAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IiksDQogICAgICAgICAgZGF0YSA9IGNsZWFuX2ZpZWxkZ29hbHMpICAgICAgICAgICAgICAgICANCnJlc3VsdCA9IHN1bW1hcnkocy5sb2dpdCkNCnJlc3VsdA0KDQoNCmBgYA0KDQpgYGB7cn0NCm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KHMubG9naXQpJGNvZWYgICAgICANCmNvbmYuY2kgPSBjb25maW50KHMubG9naXQpICAgICAgICAgICAgICAgICAgICANCnN1bS5zdGF0cyA9IGNiaW5kKG1vZGVsLmNvZWYuc3RhdHMsIGNvbmYuY2kuOTU9Y29uZi5jaSkNCmthYmxlKHN1bS5zdGF0cyxjYXB0aW9uID0gIlRoZSBzdW1tYXJ5IHN0YXRzIG9mIHJlZ3Jlc3Npb24gY29lZmZpY2llbnRzIikgDQoNCmBgYA0KDQpGcm9tIG91cm91dHB1dCBhYm92ZSB3ZSBzZWUgdGhhdCBkaXN0YW5jZSBpcyBuZWdhdGl2ZWx5IGFzc2NvaWF0ZWQgd2l0aCBhIG1hZGUgZmllbGQgZ29hbC4gT3VyIGVzdGltYXRlIGlzIGVxdWFsIHRvIC0uMTE5NC4gT3VyIDk1JSBDSSBpcyBbLS4xNDQsIC0uMDk1XS4gVGhpcyBjb25maWRlbmNlIGludGVydmFsIGFsc28gc3VwcG9ydHMgb3VyIGh5cG90aGVzaXMuDQoNCmBgYHtyfQ0KbW9kZWwuY29lZi5zdGF0cyA9IHN1bW1hcnkocy5sb2dpdCkkY29lZg0Kb2Rkcy5yYXRpbyA9IGV4cChjb2VmKHMubG9naXQpKQ0Kb3V0LnN0YXRzID0gY2JpbmQobW9kZWwuY29lZi5zdGF0cywgb2Rkcy5yYXRpbyA9IG9kZHMucmF0aW8pICAgICAgICAgICAgICAgICANCmthYmxlKG91dC5zdGF0cyxjYXB0aW9uID0gIlN1bW1hcnkgU3RhdHMgd2l0aCBPZGRzIFJhdGlvcyIpDQoNCmBgYA0KDQpOb3cgd2UgY29udmVydCBvdXIgZXN0aW1hdGUgdG8gYW4gb2RkcyByYXRpby4gVGhlIG9kZHMgcmF0aW8gYXNzb2NpYXRlZCB3aXRoIGRpc3RhbmNlIGlzIC44ODcgbWVhbmluZyB0aGF0IGFzIGRpc3RhbmNlIGluY3JlYXNlcyBieSBvbmUgdW5pdCwgdGhlIG9kZHMgb2YgYmVpbmcgYSBtYWRlIGZpZWxkIGdvYWwgZ29lcyBkb3duIGJ5IDExLjMlLiANCg0KYGBge3J9DQpibWkucmFuZ2UgPSByYW5nZShjbGVhbl9maWVsZGdvYWxzJGRpc3RhbmNlKQ0KeCA9IHNlcShibWkucmFuZ2VbMV0sIGJtaS5yYW5nZVsyXSwgbGVuZ3RoID0gMjAwKQ0KYmV0YS54ID0gY29lZihzLmxvZ2l0KVsxXSArIGNvZWYocy5sb2dpdClbMl0qeA0Kc3VjY2Vzcy5wcm9iID0gZXhwKGJldGEueCkvKDErZXhwKGJldGEueCkpDQpmYWlsdXJlLnByb2IgPSAxLygxK2V4cChiZXRhLngpKQ0KeWxpbWl0ID0gbWF4KHN1Y2Nlc3MucHJvYiwgZmFpbHVyZS5wcm9iKQ0KIyMNCmJldGExID0gY29lZihzLmxvZ2l0KVsyXQ0Kc3VjY2Vzcy5wcm9iLnJhdGUgPSBiZXRhMSpleHAoYmV0YS54KS8oMStleHAoYmV0YS54KSleMg0KIyMNCiMjDQpwYXIobWZyb3cgPSBjKDEsMikpDQpwbG90KHgsIHN1Y2Nlc3MucHJvYiwgdHlwZSA9ICJsIiwgbHdkID0gMiwgY29sID0gIm5hdnkiLA0KICAgICBtYWluID0gIlRoZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBcbiBhIG1hZGUgZmllbGQgZ29hbCIsIA0KICAgICB5bGltPWMoMCwgMS4xKnlsaW1pdCksDQogICAgIHhsYWIgPSAiZGlzdGFuY2UiLA0KICAgICB5bGFiID0gInByb2JhYmlsaXR5IiwNCiAgICAgYXhlcyA9IEZBTFNFLA0KICAgICBjb2wubWFpbiA9ICJuYXZ5IiwNCiAgICAgY2V4Lm1haW4gPSAwLjgpDQojIGxpbmVzKHgsIGZhaWx1cmUucHJvYixsd2QgPSAyLCBjb2wgPSAiZGFya3JlZCIpDQpheGlzKDEsIHBvcyA9IDApDQpheGlzKDIpDQpgYGANCg0KVGhlIGdyYXBoIGFib3ZlIGlzIG91ciBTIGN1cnZlIHdoaWNoIGlzIHBvaW50aW5nIGRvd24gbGlrZSB3ZSB0aGluayBpdCB3b3VsZCBiZWNhdXNlIGl0IHNob3dzIHByb2JhYmlsaXR5IG9mIGEgbWFkZSBmaWVsZCBnb2FsIGFzIGRpc3RhbmNlIGdvZXMgdXAuIFdlIHNlZSB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBhIGZpZWxkIGdvYWwgZ29lcyBkb3duIGFzIHRoZSBkaXN0YW5jZSBnb2VzIHVwLg0KDQojIENvbmNsdXNpb24NCg0KV2UgdXNlZCBhIHJlYWwgd29ybGQgZGF0YXNldCBvZiB0aGUgMjAwOCBORkwgc2Vhc29uIG9mIE5GTCBraWNraW5nIGZpZWxkIGdvYWxzLiBXZSBoYXZlIGNvbmNsdWRlZCBmcm9tIHRoZSBhbmFseXNpcyBhYm92ZSB0aGF0IG91ciBoeXBvdGhlc2lzIGlzIGNvcnJlY3QuIEFzIHRoZSBkaXN0YW5jZSBvZiBhIGZpZWxkIGdvYWwgZ29lcyB1cCBpbiBkaXN0YW5jZSB0aGUgcHJvYmFiaWxpdHkgb2YgYSBtYWtlIGdvZXMgZG93bi4NCg0KDQoNCg==