1 Introduction

1.0.1 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

1.0.2 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

1.0.3 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)

head(clean_fieldgoals)
  kickteam        name distance kickdiff timerem defscore GOOD
1      IND A.Vinatieri       30       -3    2822        3    1
2      IND A.Vinatieri       46        0    3287        0    1
3      IND A.Vinatieri       28        7    2720        0    1
4      IND A.Vinatieri       37       14    2742        0    1
5      IND A.Vinatieri       39        0    3056        0    1
6      IND A.Vinatieri       40       -3    3043        3    1

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.

library(psych)
pairs.panels(clean_fieldgoals[,-9], 
             method = "pearson",
             hist.col = "#00AFBB",
             density = TRUE,
             ellipses = TRUE
             )

All of our predictor values are unimodal except for defscore.

par(mfrow=c(1,2))
hist(clean_fieldgoals$defscore, xlab="defscore", main = "")

Based on the histogram above we discretize defscore

defscore = clean_fieldgoals$defscore
grp.defscore = defscore
grp.defscore[defscore %in% c(0:10)] = "1-10"
grp.defscore[defscore %in% c(11:18)] = "11-18"
grp.defscore[defscore %in% c(19:26)] = "19-26"
grp.defscore[defscore %in% c(27:99)] = "27+"
clean_fieldgoals$grp.defscore = grp.defscore
head(grp.defscore)
[1] "1-10" "1-10" "1-10" "1-10" "1-10" "1-10"

There is some correlation between the variables kickdiff vs defscore and kickdiff vs timerem.

In our smallest and final model we want to have kick difficulty, distance, time remaining because we know distance is a big indicator on whether or not a field goal is good or not and the same goes for kick difficulty and time remaining.

2 Analysis

full.model = glm(GOOD ~grp.defscore + kickteam + name + distance + kickdiff + timerem, 
          family = binomial(link = "logit"),
          data = clean_fieldgoals)  
kable(summary(full.model)$coef, 
      caption="Summary of inferential statistics of the full model")
Summary of inferential statistics of the full model
Estimate Std. Error z value Pr(>|z|)
(Intercept) 7.2558776 0.9592165 7.5643791 0.0000000
grp.defscore11-18 0.3900319 0.3310042 1.1783290 0.2386655
grp.defscore19-26 1.0910882 0.5275585 2.0681844 0.0386227
grp.defscore27+ -0.1364864 0.5812398 -0.2348194 0.8143489
kickteamATL 0.2156559 0.9976163 0.2161711 0.8288544
kickteamBAL -0.5216642 1.5651327 -0.3333035 0.7389052
kickteamBUF -0.7825280 0.7983419 -0.9801915 0.3269916
kickteamCAR 0.1170202 0.9133814 0.1281176 0.8980559
kickteamCHI 0.6797891 1.2205735 0.5569424 0.5775668
kickteamCIN -0.5650050 0.9285361 -0.6084901 0.5428625
kickteamCLE -0.6753615 0.8309901 -0.8127191 0.4163791
kickteamDAL 0.3877854 1.0088755 0.3843739 0.7007013
kickteamDEN -1.1697085 0.7938203 -1.4735180 0.1406114
kickteamDET 15.8239761 757.6724102 0.0208850 0.9833374
kickteamGB -0.3063564 0.8779672 -0.3489383 0.7271357
kickteamHOU -0.0434635 0.9242212 -0.0470271 0.9624916
kickteamIND -0.6654705 0.8746319 -0.7608578 0.4467420
kickteamJAC -0.7257592 0.8553650 -0.8484790 0.3961713
kickteamKC -2.2742405 0.9940930 -2.2877543 0.0221518
kickteamMIA -0.0259070 0.9163971 -0.0282705 0.9774464
kickteamMIN 0.3136299 0.9160708 0.3423642 0.7320768
kickteamNE -0.4881056 0.8596060 -0.5678248 0.5701540
kickteamNO -1.9313398 1.4334513 -1.3473355 0.1778722
kickteamNYG 12.6228135 3956.1804062 0.0031907 0.9974542
kickteamNYJ -21.0269475 3956.1803921 -0.0053150 0.9957593
kickteamOAK -0.5166534 0.8982161 -0.5751995 0.5651564
kickteamPHI -0.2582728 0.8231102 -0.3137767 0.7536907
kickteamPIT -0.3420525 0.8700066 -0.3931608 0.6942007
kickteamSD -0.2351465 0.9250057 -0.2542108 0.7993327
kickteamSEA -0.2348942 0.9248464 -0.2539819 0.7995096
kickteamSF -0.3368254 0.8686680 -0.3877493 0.6982016
kickteamSTL 0.0564636 0.8434508 0.0669435 0.9466267
kickteamTB -0.8694446 0.8198702 -1.0604662 0.2889326
kickteamTEN -0.2234026 0.8285824 -0.2696203 0.7874524
kickteamWAS -1.2528242 0.7780121 -1.6102888 0.1073348
nameC.Barth 0.6544918 1.1324063 0.5779655 0.5632874
nameD.Rayner 13.8651583 3956.1803931 0.0035047 0.9972037
nameG.Hartley 16.4788689 988.0657044 0.0166779 0.9866936
nameJ.Carney -12.6449218 3956.1803983 -0.0031962 0.9974498
nameJ.Feely 20.1237309 3956.1803830 0.0050867 0.9959415
nameM.Gramatica 0.9339553 1.4794047 0.6313048 0.5278412
nameM.Stover -0.2247927 1.5178776 -0.1480967 0.8822665
distance -0.1310321 0.0137846 -9.5056979 0.0000000
kickdiff 0.0094157 0.0135669 0.6940249 0.4876666
timerem 0.0001139 0.0001443 0.7897314 0.4296846
reduced.model = glm(GOOD ~ distance + timerem + kickdiff + grp.defscore, 
          family = binomial(link = "logit"),
          data = clean_fieldgoals) 
kable(summary(reduced.model)$coef, 
      caption="Summary of inferential statistics of the reduced model")
Summary of inferential statistics of the reduced model
Estimate Std. Error z value Pr(>|z|)
(Intercept) 6.4367599 0.6185545 10.4061313 0.0000000
distance -0.1215100 0.0125796 -9.6592898 0.0000000
timerem 0.0001100 0.0001338 0.8218077 0.4111863
kickdiff 0.0099186 0.0123044 0.8061065 0.4201815
grp.defscore11-18 0.2987973 0.3073211 0.9722642 0.3309191
grp.defscore19-26 1.2527248 0.4951909 2.5297816 0.0114134
grp.defscore27+ -0.0516108 0.5375298 -0.0960148 0.9235088
library(MASS)
final.model.forward = stepAIC(reduced.model, 
                      scope = list(lower=formula(reduced.model),upper=formula(full.model)),
                      direction = "forward",
                      trace = 0
                      )
kable(summary(final.model.forward)$coef, 
      caption="Summary of inferential statistics of the final model")
Summary of inferential statistics of the final model
Estimate Std. Error z value Pr(>|z|)
(Intercept) 6.4367599 0.6185545 10.4061313 0.0000000
distance -0.1215100 0.0125796 -9.6592898 0.0000000
timerem 0.0001100 0.0001338 0.8218077 0.4111863
kickdiff 0.0099186 0.0123044 0.8061065 0.4201815
grp.defscore11-18 0.2987973 0.3073211 0.9722642 0.3309191
grp.defscore19-26 1.2527248 0.4951909 2.5297816 0.0114134
grp.defscore27+ -0.0516108 0.5375298 -0.0960148 0.9235088
global.measure=function(s.logit){
dev.resid = s.logit$deviance
dev.0.resid = s.logit$null.deviance
aic = s.logit$aic
goodness = cbind(Deviance.residual =dev.resid, Null.Deviance.Residual = dev.0.resid,
      AIC = aic)
goodness
}
goodness=rbind(full.model = global.measure(full.model),
      reduced.model=global.measure(reduced.model),
      final.model=global.measure(final.model.forward))
row.names(goodness) = c("full.model", "reduced.model", "final.model")
kable(goodness, caption ="Comparison of global goodness-of-fit statistics")
Comparison of global goodness-of-fit statistics
Deviance.residual Null.Deviance.Residual AIC
full.model 630.8280 809.6515 720.8280
reduced.model 676.9963 809.6515 690.9963
final.model 676.9963 809.6515 690.9963

2.1 Final Model

In our exploritory analysis, we saw that two varibales were correlated. After automoatic varribale selction we dropped kickteam and name. Although some varibales in defscore, kick difficulty, and time remaining we still keep them in our model because they are important to our study.

model.coef.stats = summary(final.model.forward)$coef
odds.ratio = exp(coef(final.model.forward))
out.stats = cbind(model.coef.stats, odds.ratio = odds.ratio)                 
kable(out.stats,caption = "Summary Stats with Odds Ratios")
Summary Stats with Odds Ratios
Estimate Std. Error z value Pr(>|z|) odds.ratio
(Intercept) 6.4367599 0.6185545 10.4061313 0.0000000 624.3804346
distance -0.1215100 0.0125796 -9.6592898 0.0000000 0.8855822
timerem 0.0001100 0.0001338 0.8218077 0.4111863 1.0001100
kickdiff 0.0099186 0.0123044 0.8061065 0.4201815 1.0099680
grp.defscore11-18 0.2987973 0.3073211 0.9722642 0.3309191 1.3482363
grp.defscore19-26 1.2527248 0.4951909 2.5297816 0.0114134 3.4998666
grp.defscore27+ -0.0516108 0.5375298 -0.0960148 0.9235088 0.9496984

In our grp.defscore varibale group we have 4 categories. The baseline category is from 0-10 defensive score. We see from the table above that the odds ratio of defensive score 19-26 is 3.5, meaning when all our other varibles are at the same level the odds of a made field goal with a defensive score of 19-26 is about 3.5 times more likley than our baseline of 0-10. But the same ratio goes down by .05 when comparing scores 27+ with the baseline of 0-10

3 Conclusion

This analysis focused on the association between the factors that go into a made field goal. After explortaory analysis we re-grouped our varibale of defensive score and defined dummy variables.

Since we know that distance, kick difficulty and defensive score have a big influence on a mde field goal we include these factors even though they are not significant. After varibale selection we are left with distnace and defensive score 19-26 and our non significant values of kick difficulty, time remianing, and the remaining of our dummy varibales for defensive score.

From previous football knowldge a majority of games are decided in the 20-28 range. We may be able to draw the conclusion that in high leverage situations a kicker makes the field goal. But we also have a part of our analysis that shows when the defensive score is 27+ a make goes down but we most lilely have a smaller sample which would make it less significant. So we cannot draw any conlusions about our analysis and will have to take a deeper look into our analysis to draw more conclusions.

LS0tDQp0aXRsZTogIkZhY3RvcnMgSW5mbHVlbmNlIE5GTCBGaWVsZCBHb2FscyINCmF1dGhvcjogJ1R5bGVyIEJhdHRhZ2xpbmknDQpkYXRlOiAiMjAyNC0xMC0xMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDogDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHllcw0KICAgIHRoZW1lOiBsdW1lbg0KICB3b3JkX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBrZWVwX21kOiB5ZXMNCiAgcGRmX2RvY3VtZW50OiANCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIGZpZ193aWR0aDogMw0KICAgIGZpZ19oZWlnaHQ6IDMNCmVkaXRvcl9vcHRpb25zOiANCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQ0KYWx3YXlzX2FsbG93X2h0bWw6IHRydWUNCi0tLQ0KDQpgYGB7PWh0bWx9DQoNCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+DQoNCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLw0KDQpoMS50aXRsZSB7ICAvKiBUaXRsZSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgdGhlIHJlcG9ydCB0aXRsZSAqLw0KICBmb250LXNpemU6IDI0cHg7DQogIGZvbnQtd2VpZ2h0OiBib2xkOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KICBmb250LWZhbWlseTogIkdpbGwgU2FucyIsIHNhbnMtc2VyaWY7DQp9DQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovDQogIGZvbnQtc2l6ZTogMjBweDsNCiAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7DQogIGNvbG9yOiBEYXJrUmVkOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoNC5kYXRlIHsgLyogSGVhZGVyIDQgLSBmb250IHNwZWNpZmljYXRpb25zIGZvciB0aGUgZGF0ZSAgKi8NCiAgZm9udC1zaXplOiAxOHB4Ow0KICBmb250LXdlaWdodDogYm9sZDsNCiAgZm9udC1mYW1pbHk6IHN5c3RlbS11aTsNCiAgY29sb3I6IERhcmtCbHVlOw0KICB0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpoMSB7IC8qIEhlYWRlciAxIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMSBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMjJweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQpoMiB7IC8qIEhlYWRlciAyIC0gZm9udCBzcGVjaWZpY2F0aW9ucyBmb3IgbGV2ZWwgMiBzZWN0aW9uIHRpdGxlICovDQogICAgZm9udC1zaXplOiAyMHB4Ow0KICAgIGZvbnQtd2VpZ2h0OiBib2xkOw0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBuYXZ5Ow0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8NCiAgICBmb250LXNpemU6IDE4cHg7DQogICAgZm9udC13ZWlnaHQ6IGJvbGQ7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IG5hdnk7DQogICAgdGV4dC1hbGlnbjogbGVmdDsNCn0NCg0KaDQgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgb2YgbGV2ZWwgNCBzZWN0aW9uIHRpdGxlICAqLw0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LXdlaWdodDogYm9sZDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogZGFya3JlZDsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpib2R5IHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQouaGlnaGxpZ2h0bWUgeyBiYWNrZ3JvdW5kLWNvbG9yOnllbGxvdzsgfQ0KDQpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQ0KDQo8L3N0eWxlPg0KYGBgDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBEZXRlY3QsIGluc3RhbGwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLg0KaWYgKCFyZXF1aXJlKCJrbml0ciIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJrbml0ciIpDQogICBsaWJyYXJ5KGtuaXRyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJNQVNTIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJubGVxc2x2IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoIm5sZXFzbHYiKQ0KICAgbGlicmFyeShubGVxc2x2KQ0KfQ0KIw0KaWYgKCFyZXF1aXJlKCJwYW5kZXIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygicGFuZGVyIikNCiAgIGxpYnJhcnkocGFuZGVyKQ0KfQ0KDQppZiAoIXJlcXVpcmUoInBzeWNoIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygicHN5Y2giKQ0KICAgbGlicmFyeShwc3ljaCkNCn0NCmlmICghcmVxdWlyZSgiTUFTUyIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIk1BU1MiKQ0KICAgbGlicmFyeShNQVNTKQ0KfQ0KaWYgKCFyZXF1aXJlKCJnZ3Bsb3QyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIpDQogICBsaWJyYXJ5KGdncGxvdDIpDQp9DQppZiAoIXJlcXVpcmUoIkdHYWxseSIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoIkdHYWxseSIpDQogICBsaWJyYXJ5KEdHYWxseSkNCn0NCmlmICghcmVxdWlyZSgiY2FyIikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyIikNCiAgIGxpYnJhcnkoY2FyKQ0KfQ0KaWYgKCFyZXF1aXJlKCJkcGx5ciIpKSB7ICAgDQogIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikNCiAgIGxpYnJhcnkoZHBseXIpDQp9DQppZiAoIXJlcXVpcmUoImNhcmV0IikpIHsgICANCiAgaW5zdGFsbC5wYWNrYWdlcygiY2FyZXQiKQ0KICAgbGlicmFyeShjYXJldCkNCn0NCg0KIyBzcGVjaWZpY2F0aW9ucyBvZiBvdXRwdXRzIG9mIGNvZGUgaW4gY29kZSBjaHVua3MNCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAjIGluY2x1ZGUgY29kZSBjaHVuayBpbiB0aGUgb3V0cHV0IGZpbGUNCiAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IEZBTFNFLCAgIyBzb21ldGltZXMsIHlvdSBjb2RlIG1heSBwcm9kdWNlIHdhcm5pbmcgbWVzc2FnZXMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUgd2FybmluZyBtZXNzYWdlcyBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBvdXRwdXQgZmlsZS4gDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMgPSBGQUxTRSwgICMNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ID0gTkEgICAgICAgIyB5b3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgb3V0cHV0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaW4gdGhlIG91dHB1dCBmaWxlLg0KICAgICAgICAgICAgICAgICAgICAgICkgICANCmBgYA0KDQojIEludHJvZHVjdGlvbg0KDQojIyMgRGVzY3JpcHRpb24NCkluIHRoaXMgZGF0YSBzZXQgd2UgaGF2ZSBkYXRhIGZyb20gdGhlIDIwMDggTkZMIHNlYXNvbi4gTW9yZSBzcGVjaWZpY2FsbHkgd2UgaGF2ZSBmYWN0b3JzIHRoYXQgZ28gaW50byBORkwgZmllbGdvYWxzLiBTb21lIHZhcmlhYmxlcyBpbmNsdWRlIHRoZSBraWNraW5nIHRlYW0sIE5hbWUsIERpc3RhbmNlLCB0aW1lcmVtLCBkZWZzY29yZSwgYW5kIEdPT0QuDQoNCktpY2tpbmcgdGVhbSAtIE5hbWUgb2YgdGhlIGtpY2tpbmcgdGVhbSAoY2F0ZWdvcmljYWwpDQpOYW1lIC0gTmFtZSBvZiB0aGUga2lja2VyDQpEaXN0YW5jZSAtIEhvdyBmYXIgdGhlIGJhbGwgaXMgZnJvbSB0aGUgZ29hbA0KVGltZSBSZW1haW5pbmcgLSBIb3cgbXVjaCB0aW1lIGlzIG9uIHRoZSBnYW1lIGNsb2NrIHJlbWFpbmluZyBpbiB0aGUgZ2FtZQ0KRGVmZW5zaXZlIFNjb3JlIC0gVGhlIHNjb3JlIG9mIHRoZSBvcHBvc2luZyB0ZWFtDQpHT09EIC0gSWYgdGhlIGZpZWxkIGdvYWwgaXMgbWFkZSBvciBub3QsIGEgMSBmb3IgYSBtYWtlIGFuZCAwIGZvciBhIG1pc3MNCg0KIyMjIFF1ZXN0aW9uDQoNCkZyb20gZ2VuZXJhbCBrbm93bGVkZ2UgbW9zdCBmYW5zIGFzc3VtZSB0aGF0IHRoZSBsb25nZXIgdGhlIGRpc3RhbmNlIGl0IGJlY29tZXMgbGVzcyBsaWtlbHkgZm9yIGEgZmllbGQgZ29hbCB0byBiZSBtYWRlLiBPdXIgcXVlc3Rpb24gZm9yIHRoaXMgYW5hbHlzaXMgaXMgdG8gc2VlIGlmIHRoaXMgc3RhdGVtZW50IHJlbWFpbnMgdHJ1ZS4gV2Ugd2lsbCBiZSBleHBsb3JpbmcgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gYSBtYWRlIGZpZWxkIGdvYWwgYW5kIGRpc3RhbmNlDQoNCiMjIyBEYXRhIENsZWFuaW5nDQoNCmBgYHtyfQ0KDQpmaWVsZGdvYWxzIDwtIHJlYWQuY3N2KCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vVHlsZXJCYXR0YWdsaW5pL1NUQS0zMjEvcmVmcy9oZWFkcy9tYWluL25mbDIwMDhfZmdhLmNzdiIsIGhlYWRlciA9IFRSVUUpDQoNCmBgYA0KDQpgYGB7cn0NCmNsZWFuX2ZpZWxkZ29hbHMgPC0gbmEub21pdChmaWVsZGdvYWxzKQ0KY2xlYW5fZmllbGRnb2FscyA8LSBjbGVhbl9maWVsZGdvYWxzICU+JSBzZWxlY3QoLUdhbWVEYXRlLCAtQXdheVRlYW0sIC1Ib21lVGVhbSwgLXF0ciwgLW1pbiwgLXNlYywgLWRlZiwgLWRvd24sIC10b2dvLCAta2lja2VyLCAteWRsaW5lLCAtaG9tZWtpY2ssIC1vZmZzY29yZSwgLXNlYXNvbiwgLU1pc3NlZCwgLUJsb2NrZWQpDQoNCmhlYWQoY2xlYW5fZmllbGRnb2FscykNCmBgYA0KDQpXZSB0YWtlIG91dCBhbnkgb2JzZXJ2YXRpb25zIHdpdGggYSBtaXNzaW5nIHZhbHVlLiBXZSBhbHNvIHRha2Ugb3V0IG1hbnkgdmFyaWFibGVzIGR1ZSB0byB0aGVyZSBiZWluZyBhIGhpZ2ggbGlrZWxleWhvb2QgZm9yIG11bHRpY29sbGluZWFpcnR5LiBXZSBhbHJlYWR5IGhhdmUgYSB2YXJpYWJsZSBmb3IgdGltZSBzbyB3ZSBlbGltaW5hdGVkIG1hbnkgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdGltZS4gV2UgYWxzbyBhbHJlYWR5IGhhdmUgYSB2YXJpYWJsZSBmb3IgYSBtYWtlIHNvIHdlIGRvIG5vdCBuZWVkIGFueSBmb3IgYSBtaXNzIG9yIGJsb2NrZWQsIHRoYXQgd291bGQganVzdCBiZSBhIHJlcGVhdCBvdXIgZGF0YS4gVGhlIG90aGVycyBhcmUganVzdCBjYXRlZ29yaWNhbCB2YXJpYWJsZXMgdGhhdCBhcmUgdG8gaWRlbnRpZnkgdGhlIGtpY2tlciBvciBraWNraW5nIHRlYW0gd2hpY2ggYWdhaW4gd2UgYWxyZWFkeSBoYXZlIHZhcmlhYmxlcyB0aGF0IGRlc2NyaWJlIHRoYXQuIA0KDQpgYGB7cn0NCmxpYnJhcnkocHN5Y2gpDQpwYWlycy5wYW5lbHMoY2xlYW5fZmllbGRnb2Fsc1ssLTldLCANCiAgICAgICAgICAgICBtZXRob2QgPSAicGVhcnNvbiIsDQogICAgICAgICAgICAgaGlzdC5jb2wgPSAiIzAwQUZCQiIsDQogICAgICAgICAgICAgZGVuc2l0eSA9IFRSVUUsDQogICAgICAgICAgICAgZWxsaXBzZXMgPSBUUlVFDQogICAgICAgICAgICAgKQ0KYGBgDQpBbGwgb2Ygb3VyIHByZWRpY3RvciB2YWx1ZXMgYXJlIHVuaW1vZGFsIGV4Y2VwdCBmb3IgZGVmc2NvcmUuIA0KDQpgYGB7cn0NCnBhcihtZnJvdz1jKDEsMikpDQpoaXN0KGNsZWFuX2ZpZWxkZ29hbHMkZGVmc2NvcmUsIHhsYWI9ImRlZnNjb3JlIiwgbWFpbiA9ICIiKQ0KDQpgYGANCg0KQmFzZWQgb24gdGhlIGhpc3RvZ3JhbSBhYm92ZSB3ZSBkaXNjcmV0aXplIGRlZnNjb3JlDQoNCmBgYHtyfQ0KZGVmc2NvcmUgPSBjbGVhbl9maWVsZGdvYWxzJGRlZnNjb3JlDQpncnAuZGVmc2NvcmUgPSBkZWZzY29yZQ0KZ3JwLmRlZnNjb3JlW2RlZnNjb3JlICVpbiUgYygwOjEwKV0gPSAiMS0xMCINCmdycC5kZWZzY29yZVtkZWZzY29yZSAlaW4lIGMoMTE6MTgpXSA9ICIxMS0xOCINCmdycC5kZWZzY29yZVtkZWZzY29yZSAlaW4lIGMoMTk6MjYpXSA9ICIxOS0yNiINCmdycC5kZWZzY29yZVtkZWZzY29yZSAlaW4lIGMoMjc6OTkpXSA9ICIyNysiDQpjbGVhbl9maWVsZGdvYWxzJGdycC5kZWZzY29yZSA9IGdycC5kZWZzY29yZQ0KaGVhZChncnAuZGVmc2NvcmUpDQpgYGANCg0KVGhlcmUgaXMgc29tZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHRoZSB2YXJpYWJsZXMga2lja2RpZmYgdnMgZGVmc2NvcmUgYW5kIGtpY2tkaWZmIHZzIHRpbWVyZW0uIA0KDQpJbiBvdXIgc21hbGxlc3QgYW5kIGZpbmFsIG1vZGVsIHdlIHdhbnQgdG8gaGF2ZSBraWNrIGRpZmZpY3VsdHksIGRpc3RhbmNlLCB0aW1lIHJlbWFpbmluZyBiZWNhdXNlIHdlIGtub3cgZGlzdGFuY2UgaXMgYSBiaWcgaW5kaWNhdG9yIG9uIHdoZXRoZXIgb3Igbm90IGEgZmllbGQgZ29hbCBpcyBnb29kIG9yIG5vdCBhbmQgdGhlIHNhbWUgZ29lcyBmb3Iga2ljayBkaWZmaWN1bHR5IGFuZCB0aW1lIHJlbWFpbmluZy4NCg0KIyBBbmFseXNpcw0KDQpgYGB7cn0NCmZ1bGwubW9kZWwgPSBnbG0oR09PRCB+Z3JwLmRlZnNjb3JlICsga2lja3RlYW0gKyBuYW1lICsgZGlzdGFuY2UgKyBraWNrZGlmZiArIHRpbWVyZW0sIA0KICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwNCiAgICAgICAgICBkYXRhID0gY2xlYW5fZmllbGRnb2FscykgIA0Ka2FibGUoc3VtbWFyeShmdWxsLm1vZGVsKSRjb2VmLCANCiAgICAgIGNhcHRpb249IlN1bW1hcnkgb2YgaW5mZXJlbnRpYWwgc3RhdGlzdGljcyBvZiB0aGUgZnVsbCBtb2RlbCIpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KcmVkdWNlZC5tb2RlbCA9IGdsbShHT09EIH4gZGlzdGFuY2UgKyB0aW1lcmVtICsga2lja2RpZmYgKyBncnAuZGVmc2NvcmUsIA0KICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSwNCiAgICAgICAgICBkYXRhID0gY2xlYW5fZmllbGRnb2FscykgDQprYWJsZShzdW1tYXJ5KHJlZHVjZWQubW9kZWwpJGNvZWYsIA0KICAgICAgY2FwdGlvbj0iU3VtbWFyeSBvZiBpbmZlcmVudGlhbCBzdGF0aXN0aWNzIG9mIHRoZSByZWR1Y2VkIG1vZGVsIikNCg0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShNQVNTKQ0KZmluYWwubW9kZWwuZm9yd2FyZCA9IHN0ZXBBSUMocmVkdWNlZC5tb2RlbCwgDQogICAgICAgICAgICAgICAgICAgICAgc2NvcGUgPSBsaXN0KGxvd2VyPWZvcm11bGEocmVkdWNlZC5tb2RlbCksdXBwZXI9Zm9ybXVsYShmdWxsLm1vZGVsKSksDQogICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gImZvcndhcmQiLA0KICAgICAgICAgICAgICAgICAgICAgIHRyYWNlID0gMA0KICAgICAgICAgICAgICAgICAgICAgICkNCmthYmxlKHN1bW1hcnkoZmluYWwubW9kZWwuZm9yd2FyZCkkY29lZiwgDQogICAgICBjYXB0aW9uPSJTdW1tYXJ5IG9mIGluZmVyZW50aWFsIHN0YXRpc3RpY3Mgb2YgdGhlIGZpbmFsIG1vZGVsIikNCmBgYA0KDQpgYGB7cn0NCmdsb2JhbC5tZWFzdXJlPWZ1bmN0aW9uKHMubG9naXQpew0KZGV2LnJlc2lkID0gcy5sb2dpdCRkZXZpYW5jZQ0KZGV2LjAucmVzaWQgPSBzLmxvZ2l0JG51bGwuZGV2aWFuY2UNCmFpYyA9IHMubG9naXQkYWljDQpnb29kbmVzcyA9IGNiaW5kKERldmlhbmNlLnJlc2lkdWFsID1kZXYucmVzaWQsIE51bGwuRGV2aWFuY2UuUmVzaWR1YWwgPSBkZXYuMC5yZXNpZCwNCiAgICAgIEFJQyA9IGFpYykNCmdvb2RuZXNzDQp9DQpnb29kbmVzcz1yYmluZChmdWxsLm1vZGVsID0gZ2xvYmFsLm1lYXN1cmUoZnVsbC5tb2RlbCksDQogICAgICByZWR1Y2VkLm1vZGVsPWdsb2JhbC5tZWFzdXJlKHJlZHVjZWQubW9kZWwpLA0KICAgICAgZmluYWwubW9kZWw9Z2xvYmFsLm1lYXN1cmUoZmluYWwubW9kZWwuZm9yd2FyZCkpDQpyb3cubmFtZXMoZ29vZG5lc3MpID0gYygiZnVsbC5tb2RlbCIsICJyZWR1Y2VkLm1vZGVsIiwgImZpbmFsLm1vZGVsIikNCmthYmxlKGdvb2RuZXNzLCBjYXB0aW9uID0iQ29tcGFyaXNvbiBvZiBnbG9iYWwgZ29vZG5lc3Mtb2YtZml0IHN0YXRpc3RpY3MiKQ0KDQpgYGANCg0KIyMgRmluYWwgTW9kZWwNCg0KSW4gb3VyIGV4cGxvcml0b3J5IGFuYWx5c2lzLCB3ZSBzYXcgdGhhdCB0d28gdmFyaWJhbGVzIHdlcmUgY29ycmVsYXRlZC4gQWZ0ZXIgYXV0b21vYXRpYyB2YXJyaWJhbGUgc2VsY3Rpb24gd2UgZHJvcHBlZCBraWNrdGVhbSBhbmQgbmFtZS4gQWx0aG91Z2ggc29tZSB2YXJpYmFsZXMgaW4gZGVmc2NvcmUsIGtpY2sgZGlmZmljdWx0eSwgYW5kIHRpbWUgcmVtYWluaW5nIHdlIHN0aWxsIGtlZXAgdGhlbSBpbiBvdXIgbW9kZWwgYmVjYXVzZSB0aGV5IGFyZSBpbXBvcnRhbnQgdG8gb3VyIHN0dWR5Lg0KDQpgYGB7cn0NCm1vZGVsLmNvZWYuc3RhdHMgPSBzdW1tYXJ5KGZpbmFsLm1vZGVsLmZvcndhcmQpJGNvZWYNCm9kZHMucmF0aW8gPSBleHAoY29lZihmaW5hbC5tb2RlbC5mb3J3YXJkKSkNCm91dC5zdGF0cyA9IGNiaW5kKG1vZGVsLmNvZWYuc3RhdHMsIG9kZHMucmF0aW8gPSBvZGRzLnJhdGlvKSAgICAgICAgICAgICAgICAgDQprYWJsZShvdXQuc3RhdHMsY2FwdGlvbiA9ICJTdW1tYXJ5IFN0YXRzIHdpdGggT2RkcyBSYXRpb3MiKQ0KDQpgYGANCg0KSW4gb3VyIGdycC5kZWZzY29yZSB2YXJpYmFsZSBncm91cCB3ZSBoYXZlIDQgY2F0ZWdvcmllcy4gVGhlIGJhc2VsaW5lIGNhdGVnb3J5IGlzIGZyb20gMC0xMCBkZWZlbnNpdmUgc2NvcmUuIFdlIHNlZSBmcm9tIHRoZSB0YWJsZSBhYm92ZSB0aGF0IHRoZSBvZGRzIHJhdGlvIG9mIGRlZmVuc2l2ZSBzY29yZSAxOS0yNiBpcyAzLjUsIG1lYW5pbmcgd2hlbiBhbGwgb3VyIG90aGVyIHZhcmlibGVzIGFyZSBhdCB0aGUgc2FtZSBsZXZlbCB0aGUgb2RkcyBvZiBhIG1hZGUgZmllbGQgZ29hbCB3aXRoIGEgZGVmZW5zaXZlIHNjb3JlIG9mIDE5LTI2IGlzIGFib3V0IDMuNSB0aW1lcyBtb3JlIGxpa2xleSB0aGFuIG91ciBiYXNlbGluZSBvZiAwLTEwLiBCdXQgdGhlIHNhbWUgcmF0aW8gZ29lcyBkb3duIGJ5IC4wNSB3aGVuIGNvbXBhcmluZyBzY29yZXMgMjcrIHdpdGggdGhlIGJhc2VsaW5lIG9mIDAtMTANCg0KIyBDb25jbHVzaW9uDQoNClRoaXMgYW5hbHlzaXMgZm9jdXNlZCBvbiB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZmFjdG9ycyB0aGF0IGdvIGludG8gYSBtYWRlIGZpZWxkIGdvYWwuIEFmdGVyIGV4cGxvcnRhb3J5IGFuYWx5c2lzIHdlIHJlLWdyb3VwZWQgb3VyIHZhcmliYWxlIG9mIGRlZmVuc2l2ZSBzY29yZSBhbmQgZGVmaW5lZCBkdW1teSB2YXJpYWJsZXMuIA0KDQpTaW5jZSB3ZSBrbm93IHRoYXQgZGlzdGFuY2UsIGtpY2sgZGlmZmljdWx0eSBhbmQgZGVmZW5zaXZlIHNjb3JlIGhhdmUgYSBiaWcgaW5mbHVlbmNlIG9uIGEgbWRlIGZpZWxkIGdvYWwgd2UgaW5jbHVkZSB0aGVzZSBmYWN0b3JzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBzaWduaWZpY2FudC4gQWZ0ZXIgdmFyaWJhbGUgc2VsZWN0aW9uIHdlIGFyZSBsZWZ0IHdpdGggZGlzdG5hY2UgYW5kIGRlZmVuc2l2ZSBzY29yZSAxOS0yNiAgYW5kIG91ciBub24gc2lnbmlmaWNhbnQgdmFsdWVzIG9mIGtpY2sgZGlmZmljdWx0eSwgdGltZSByZW1pYW5pbmcsIGFuZCB0aGUgcmVtYWluaW5nIG9mIG91ciBkdW1teSB2YXJpYmFsZXMgZm9yIGRlZmVuc2l2ZSBzY29yZS4NCg0KRnJvbSBwcmV2aW91cyBmb290YmFsbCBrbm93bGRnZSBhIG1ham9yaXR5IG9mIGdhbWVzIGFyZSBkZWNpZGVkIGluIHRoZSAyMC0yOCByYW5nZS4gV2UgbWF5IGJlIGFibGUgdG8gZHJhdyB0aGUgY29uY2x1c2lvbiB0aGF0IGluIGhpZ2ggbGV2ZXJhZ2Ugc2l0dWF0aW9ucyBhIGtpY2tlciBtYWtlcyB0aGUgZmllbGQgZ29hbC4gQnV0IHdlIGFsc28gaGF2ZSBhIHBhcnQgb2Ygb3VyIGFuYWx5c2lzIHRoYXQgc2hvd3Mgd2hlbiB0aGUgZGVmZW5zaXZlIHNjb3JlIGlzIDI3KyBhIG1ha2UgZ29lcyBkb3duIGJ1dCB3ZSBtb3N0IGxpbGVseSBoYXZlIGEgc21hbGxlciBzYW1wbGUgd2hpY2ggd291bGQgbWFrZSBpdCBsZXNzIHNpZ25pZmljYW50LiBTbyB3ZSBjYW5ub3QgZHJhdyBhbnkgY29ubHVzaW9ucyBhYm91dCBvdXIgYW5hbHlzaXMgYW5kIHdpbGwgaGF2ZSB0byB0YWtlIGEgZGVlcGVyIGxvb2sgaW50byBvdXIgYW5hbHlzaXMgdG8gZHJhdyBtb3JlIGNvbmNsdXNpb25zLiANCg==