Introduction
In this assignment we will be looking at a data set about the LPGA
which is the woman’s golf league. With this data set we will be seeing
if our initial model will need any transformations. We will also being
using greens in regulation as our response variable. We want to look at
how all these different predictor variables in golf correlate to greens
in regulation. We will perform necessary tests to find a good model for
this.
Data Description
The data in this project was taken from (https://users.stat.ufl.edu/~winner/datasets.html). My
variables are
- Golfer- Name of the Golfer
- Nation- Where the golfer is from
- Region- What region the golfer is from
- fairways- How many fairways the golfer hit in regulation
- fairAtt- How many attempts the golfer took to get to the
fairway
- fairPct- The percent of fairways hit in regulation
- totPutts- Total amount of putts the golfer had
- totRounds- Total amouint of rounds played by the golfer
- avePutts- Average amount of putts when you reached the green per
hole
- greenReg- How many greens were hit in regulation
- totPrize- Amount of money won
- events- How many events the golfer went to
- driveDist- The average distance that the golfer hit with their
drive
- sandSaves- The amount of sand saves the golfer had
- sandAtt- The amount of shots taken from the sand
- sandPct- The percentage of shots that made it out of the sand
Practical
Question
The point of this study is to figure out the association between
greens in regulation and the predictor values available in this data
set.
Exploratory Data
Analysis
We first want to look at how the predictor variables affect our
response variable in greens hit in regulation.





Looking at the first scatter plot with the variable fairway we can
see that it has a positive linear trend. This means that the more
fairways you hit in regulation, the more greens you will hit in
regulation.
The scatter plot with fairway percentage seems left skewed. This
shows that most of the golfers in this data set were mostly hitting
higher percentages into the fairways.
The scatter plot for drive distance seems to have a more positive
linear trend.
The scatter plot for sand attempts seems to be slightly right skewed
with two possible outliers past the 120 sand attempts.
The scatter plot for sand percentage also has a positive linear
trend.
Full model and
diagnostics
We need to make a linear model with the predictor values. Based on
previous experiences, we have taken out Golfer, Nation, Region,
totPrize, and totRounds. The number of events, number of rounds, and
total prize will not be able to influence getting on the green in
regulation. We also need to drop the variables totPutts, avePutts,
sandSaves, and fairAtt because they are also not variables that can
affect a persons ability to get on the green in regulation. This is due
to them either not directly correlated or happen after you get onto the
green.
Regression Coefficients
| (Intercept) |
-9.9257920 |
8.8445752 |
-1.122246 |
0.2635273 |
| fairway |
0.0191607 |
0.0018383 |
10.423042 |
0.0000000 |
| fairPct |
0.1406976 |
0.0467571 |
3.009119 |
0.0030680 |
| driveDist |
0.2407452 |
0.0253429 |
9.499498 |
0.0000000 |
| sandAtt |
-0.1105811 |
0.0172524 |
-6.409602 |
0.0000000 |
| sandPct |
0.0525978 |
0.0249874 |
2.104974 |
0.0369384 |
Now we should look at our residual diagnostic analysis to check how
reliable our model is.

In these residual plots we can see that Q-Q residual has a normal
distribution which happens when. you have . The residuals vs fitted
shows the points not in a cone shape throughout and this means the
variance is constant.
Goodness-of-fit
Measures
Now, we look at the goodness of fit measures for the models.
Goodness-of-fit Measures of Full Model
| full.model |
787.5965 |
0.6780546 |
0.6674643 |
6 |
265.8098 |
284.1853 |
862.4798 |
We have a sample size of 158 which is large. We can see from the
above table that the goodness-of-fit measures of the first model are
significant. This shows that the model has a 67% predictive ability to
predict greens in regulation.
Final Model
This is the statistics of the chosen model.
Stats of Final Model
| (Intercept) |
-9.9257920 |
8.8445752 |
-1.122246 |
0.2635273 |
| fairway |
0.0191607 |
0.0018383 |
10.423042 |
0.0000000 |
| fairPct |
0.1406976 |
0.0467571 |
3.009119 |
0.0030680 |
| driveDist |
0.2407452 |
0.0253429 |
9.499498 |
0.0000000 |
| sandAtt |
-0.1105811 |
0.0172524 |
-6.409602 |
0.0000000 |
| sandPct |
0.0525978 |
0.0249874 |
2.104974 |
0.0369384 |
Since the sample size of 158 is large, the argument for validating
p-values is the Central Limit Theorem. All the p-values are close to 0
meaning that all coefficients are significant
In this case, due to the p-values there is no need to perform
variable selection to determine the final model.
Conclusion/Discussion
We didn’t have to use many different techniques such as Box-Cox to
transform the response variables. This was due to the assumption of
constant variance being met. We got rid of all the variables that would
not be significant or have any association in evaluating getting on the
green in regulation due to my past experience.
We looked at the residual plots and the goodness of fit measures to
access the model. In doing this we came to the conclusion that the model
we had didn’t need any transformations and our model was
significant.
LS0tCnRpdGxlOiAiV2hhdCBoZWxwcyBhIGdvbGZlciBnZXQgdG8gZ3JlZW5zIGluIHJlZ3VsYXRpb24/IgphdXRob3I6ICJSeWFuIExlYm8iCmRhdGU6ICIyMDI0LTEwLTIyIgpvdXRwdXQ6IAogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgICB0b2NfZmxvYXQ6IHllcwogICAgZmlnX3dpZHRoOiA0CiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwogICAgdG9jX2NvbGxhcHNlZDogeWVzCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgc21vb3RoX3Njcm9sbDogeWVzCiAgICB0aGVtZTogbHVtZW4KICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAga2VlcF9tZDogeWVzCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogNAogICAgZmlnX2NhcHRpb246IHllcwogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMKICAgIGZpZ193aWR0aDogMwogICAgZmlnX2hlaWdodDogMwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCnNsd2F5c19hbGxvd19odG1sOiB0cnVlCi0tLQoKYGBgez1odG1sfQoKPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCi8qIENhc2NhZGluZyBTdHlsZSBTaGVldHMgKENTUykgaXMgYSBzdHlsZXNoZWV0IGxhbmd1YWdlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHByZXNlbnRhdGlvbiBvZiBhIGRvY3VtZW50IHdyaXR0ZW4gaW4gSFRNTCBvciBYTUwuIGl0IGlzIGEgc2ltcGxlIG1lY2hhbmlzbSBmb3IgYWRkaW5nIHN0eWxlIChlLmcuLCBmb250cywgY29sb3JzLCBzcGFjaW5nKSB0byBXZWIgZG9jdW1lbnRzLiAqLwoKaDEudGl0bGUgeyAgLyogVGl0bGUgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIHRoZSByZXBvcnQgdGl0bGUgKi8KICBmb250LXNpemU6IDI0cHg7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGZvbnQtZmFtaWx5OiAiR2lsbCBTYW5zIiwgc2Fucy1zZXJpZjsKfQpoNC5hdXRob3IgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGF1dGhvcnMgICovCiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWk7CiAgY29sb3I6IERhcmtSZWQ7CiAgdGV4dC1hbGlnbjogY2VudGVyOwp9Cmg0LmRhdGUgeyAvKiBIZWFkZXIgNCAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIHRoZSBkYXRlICAqLwogIGZvbnQtc2l6ZTogMThweDsKICBmb250LWZhbWlseTogc3lzdGVtLXVpOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDEgeyAvKiBIZWFkZXIgMSAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDEgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMjJweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDIgeyAvKiBIZWFkZXIgMiAtIGZvbnQgc3BlY2lmaWNhdGlvbnMgZm9yIGxldmVsIDIgc2VjdGlvbiB0aXRsZSAqLwogICAgZm9udC1zaXplOiAyMHB4OwogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgICBjb2xvcjogbmF2eTsKICAgIHRleHQtYWxpZ246IGxlZnQ7Cn0KCmgzIHsgLyogSGVhZGVyIDMgLSBmb250IHNwZWNpZmljYXRpb25zIG9mIGxldmVsIDMgc2VjdGlvbiB0aXRsZSAgKi8KICAgIGZvbnQtc2l6ZTogMThweDsKICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOwogICAgY29sb3I6IG5hdnk7CiAgICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgpoNCB7IC8qIEhlYWRlciA0IC0gZm9udCBzcGVjaWZpY2F0aW9ucyBvZiBsZXZlbCA0IHNlY3Rpb24gdGl0bGUgICovCiAgICBmb250LXNpemU6IDE4cHg7CiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsKICAgIGNvbG9yOiBkYXJrcmVkOwogICAgdGV4dC1hbGlnbjogbGVmdDsKfQoKYm9keSB7IGJhY2tncm91bmQtY29sb3I6d2hpdGU7IH0KCi5oaWdobGlnaHRtZSB7IGJhY2tncm91bmQtY29sb3I6eWVsbG93OyB9CgpwIHsgYmFja2dyb3VuZC1jb2xvcjp3aGl0ZTsgfQoKPC9zdHlsZT4KYGBgCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIERldGVjdCwgaW5zdGFsbCwgYW5kIGxvYWQgcGFja2FnZXMgaWYgbmVlZGVkLgppZiAoIXJlcXVpcmUoImtuaXRyIikpIHsKICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQogICBsaWJyYXJ5KGtuaXRyKQp9CmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQogICBsaWJyYXJ5KGxlYWZsZXQpCn0KaWYgKCFyZXF1aXJlKCJFbnZTdGF0cyIpKSB7CiAgIGluc3RhbGwucGFja2FnZXMoIkVudlN0YXRzIikKICAgbGlicmFyeShFbnZTdGF0cykKfQppZiAoIXJlcXVpcmUoIk1BU1MiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJNQVNTIikKICAgbGlicmFyeShNQVNTKQp9CmlmICghcmVxdWlyZSgicGh5dG9vbHMiKSkgewogICBpbnN0YWxsLnBhY2thZ2VzKCJwaHl0b29scyIpCiAgIGxpYnJhcnkocGh5dG9vbHMpCn0KIwojIFNwZWNpZmljYXRpb25zIG9mIG91dHB1dHMgb2YgY29kZSBpbiBjb2RlIGNodW5rcwprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAgIyBpbmNsdWRlIGNvZGUgY2h1bmsgaW4gdGhlIG91dHB1dCBmaWxlCiAgICAgICAgICAgICAgICAgICB3YXJuaW5nID0gRkFMU0UsICAjIFNvbWV0aW1lcywgeW91ciBjb2RlIG1heSBwcm9kdWNlIGEgd2FybmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcywgeW91IGNhbiBjaG9vc2UgdG8gaW5jbHVkZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2FybmluZyBtZXNzYWdlcyBpbiB0aGUgb3V0cHV0IGZpbGUuIAogICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLCAgCiAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gVFJVRSwgICAjIHlvdSBjYW4gYWxzbyBkZWNpZGUgd2hldGhlciB0byBpbmNsdWRlIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgb3V0cHV0IGluIHRoZSBvdXRwdXQgZmlsZS4KICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBGQUxTRSAgICMgU3VwcHJlc3MgaGFzaC10YWdzIGluIHRoZSBvdXRwdXQgcmVzdWx0cy4KICAgICAgICAgICAgICAgICAgICAgICkgICAKYGBgCgojIEludHJvZHVjdGlvbgpJbiB0aGlzIGFzc2lnbm1lbnQgd2Ugd2lsbCBiZSBsb29raW5nIGF0IGEgZGF0YSBzZXQgYWJvdXQgdGhlIExQR0Egd2hpY2ggaXMgdGhlIHdvbWFuJ3MgZ29sZiBsZWFndWUuIFdpdGggdGhpcyBkYXRhIHNldCB3ZSB3aWxsIGJlIHNlZWluZyBpZiBvdXIgaW5pdGlhbCBtb2RlbCB3aWxsIG5lZWQgYW55IHRyYW5zZm9ybWF0aW9ucy4gV2Ugd2lsbCBhbHNvIGJlaW5nIHVzaW5nIGdyZWVucyBpbiByZWd1bGF0aW9uIGFzIG91ciByZXNwb25zZSB2YXJpYWJsZS4gV2Ugd2FudCB0byBsb29rIGF0IGhvdyBhbGwgdGhlc2UgZGlmZmVyZW50IHByZWRpY3RvciB2YXJpYWJsZXMgaW4gZ29sZiBjb3JyZWxhdGUgdG8gZ3JlZW5zIGluIHJlZ3VsYXRpb24uIFdlIHdpbGwgcGVyZm9ybSBuZWNlc3NhcnkgdGVzdHMgdG8gZmluZCBhIGdvb2QgbW9kZWwgZm9yIHRoaXMuCgoKCiMjIERhdGEgRGVzY3JpcHRpb24KVGhlIGRhdGEgaW4gdGhpcyBwcm9qZWN0IHdhcyB0YWtlbiBmcm9tIChodHRwczovL3VzZXJzLnN0YXQudWZsLmVkdS9+d2lubmVyL2RhdGFzZXRzLmh0bWwpLiBNeSB2YXJpYWJsZXMgYXJlCgoqIEdvbGZlci0gTmFtZSBvZiB0aGUgR29sZmVyCiogTmF0aW9uLSBXaGVyZSB0aGUgZ29sZmVyIGlzIGZyb20KKiBSZWdpb24tIFdoYXQgcmVnaW9uIHRoZSBnb2xmZXIgaXMgZnJvbQoqIGZhaXJ3YXlzLSBIb3cgbWFueSBmYWlyd2F5cyB0aGUgZ29sZmVyIGhpdCBpbiByZWd1bGF0aW9uCiogZmFpckF0dC0gSG93IG1hbnkgYXR0ZW1wdHMgdGhlIGdvbGZlciB0b29rIHRvIGdldCB0byB0aGUgZmFpcndheQoqIGZhaXJQY3QtIFRoZSBwZXJjZW50IG9mIGZhaXJ3YXlzIGhpdCBpbiByZWd1bGF0aW9uCiogdG90UHV0dHMtIFRvdGFsIGFtb3VudCBvZiBwdXR0cyB0aGUgZ29sZmVyIGhhZCAKKiB0b3RSb3VuZHMtIFRvdGFsIGFtb3VpbnQgb2Ygcm91bmRzIHBsYXllZCBieSB0aGUgZ29sZmVyCiogYXZlUHV0dHMtIEF2ZXJhZ2UgYW1vdW50IG9mIHB1dHRzIHdoZW4geW91IHJlYWNoZWQgdGhlIGdyZWVuIHBlciBob2xlCiogZ3JlZW5SZWctIEhvdyBtYW55IGdyZWVucyB3ZXJlIGhpdCBpbiByZWd1bGF0aW9uCiogdG90UHJpemUtIEFtb3VudCBvZiBtb25leSB3b24KKiBldmVudHMtIEhvdyBtYW55IGV2ZW50cyB0aGUgZ29sZmVyIHdlbnQgdG8KKiBkcml2ZURpc3QtIFRoZSBhdmVyYWdlIGRpc3RhbmNlIHRoYXQgdGhlIGdvbGZlciBoaXQgd2l0aCB0aGVpciBkcml2ZQoqIHNhbmRTYXZlcy0gVGhlIGFtb3VudCBvZiBzYW5kIHNhdmVzIHRoZSBnb2xmZXIgaGFkCiogc2FuZEF0dC0gVGhlIGFtb3VudCBvZiBzaG90cyB0YWtlbiBmcm9tIHRoZSBzYW5kCiogc2FuZFBjdC0gVGhlIHBlcmNlbnRhZ2Ugb2Ygc2hvdHMgdGhhdCBtYWRlIGl0IG91dCBvZiB0aGUgc2FuZAoKIyMgUHJhY3RpY2FsIFF1ZXN0aW9uClRoZSBwb2ludCBvZiB0aGlzIHN0dWR5IGlzIHRvIGZpZ3VyZSBvdXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gZ3JlZW5zIGluIHJlZ3VsYXRpb24gYW5kIHRoZSBwcmVkaWN0b3IgdmFsdWVzIGF2YWlsYWJsZSBpbiB0aGlzIGRhdGEgc2V0LiAKCiMgRXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcwoKV2UgZmlyc3Qgd2FudCB0byBsb29rIGF0IGhvdyB0aGUgcHJlZGljdG9yIHZhcmlhYmxlcyBhZmZlY3Qgb3VyIHJlc3BvbnNlIHZhcmlhYmxlIGluIGdyZWVucyBoaXQgaW4gcmVndWxhdGlvbi4KCmBgYHtyIGZpZy5hbGlnbj0nY2VudGVyJ30KbHBnYTAgPC0gcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9SeWFuTGViby9TVEEtMzIxL3JlZnMvaGVhZHMvbWFpbi9scGdhMjAyMi5jc3YiLCBoZWFkZXIgPSBUUlVFKQpscGdhIDwtIGxwZ2EwWywgLTFdCgpmYWlyd2F5PC0gbHBnYSRmYWlyd2F5cwpncmVlbnMgPC0gbHBnYSRncmVlblJlZyAKZnBjdDwtbHBnYSRmYWlyUGN0CmRyaXZlcl9kaXN0YW5jZTwtIGxwZ2EkZHJpdmVEaXN0CnNfQVRUPC0gbHBnYSRzYW5kQXR0CnNfUENUPC0gbHBnYSRzYW5kUGN0CgpwbG90KGZhaXJ3YXksIGdyZWVucywgbWFpbiA9ICJHcmVlbnMgaW4gcmVndWxhdGlvbiB2cyBGYWlyd2F5cyBoaXQiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChmcGN0LCBncmVlbnMsIG1haW4gPSAiR3JlZW5zIGluIHJlZ3VsYXRpb24gdnMgRmFpcndheSBwZXJjZW50YWdlIikKYWJsaW5lKHY9MTIxLjUyOSwgaD0yNC45NiwgY29sPSJyZWQiLCBsdHk9MikKCnBsb3QoZHJpdmVyX2Rpc3RhbmNlLCBncmVlbnMsIG1haW4gPSAiR3JlZW5zIGluIHJlZ3VsYXRpb24gdnMgRHJpdmUgZGlzdGFuY2UiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChzX0FUVCwgZ3JlZW5zLCBtYWluID0gIkdyZWVucyBpbiByZWd1bGF0aW9uIHZzIFNhbmQgYXR0ZW1wdHMiKQphYmxpbmUodj0xMjEuNTI5LCBoPTI0Ljk2LCBjb2w9InJlZCIsIGx0eT0yKQoKcGxvdChzX1BDVCwgZ3JlZW5zLCBtYWluID0gIkdyZWVucyBpbiByZWd1bGF0aW9uIHZzIFNhbmQgcGVyY2VudGFnZSIpCmFibGluZSh2PTEyMS41MjksIGg9MjQuOTYsIGNvbD0icmVkIiwgbHR5PTIpCmBgYAoKTG9va2luZyBhdCB0aGUgZmlyc3Qgc2NhdHRlciBwbG90IHdpdGggdGhlIHZhcmlhYmxlIGZhaXJ3YXkgd2UgY2FuIHNlZSB0aGF0IGl0IGhhcyBhIHBvc2l0aXZlIGxpbmVhciB0cmVuZC4gVGhpcyBtZWFucyB0aGF0IHRoZSBtb3JlIGZhaXJ3YXlzIHlvdSBoaXQgaW4gcmVndWxhdGlvbiwgdGhlIG1vcmUgZ3JlZW5zIHlvdSB3aWxsIGhpdCBpbiByZWd1bGF0aW9uLiAKClRoZSBzY2F0dGVyIHBsb3Qgd2l0aCBmYWlyd2F5IHBlcmNlbnRhZ2Ugc2VlbXMgbGVmdCBza2V3ZWQuIFRoaXMgc2hvd3MgdGhhdCBtb3N0IG9mIHRoZSBnb2xmZXJzIGluIHRoaXMgZGF0YSBzZXQgd2VyZSBtb3N0bHkgaGl0dGluZyBoaWdoZXIgcGVyY2VudGFnZXMgaW50byB0aGUgZmFpcndheXMuCgpUaGUgc2NhdHRlciBwbG90IGZvciBkcml2ZSBkaXN0YW5jZSBzZWVtcyB0byBoYXZlIGEgbW9yZSBwb3NpdGl2ZSBsaW5lYXIgdHJlbmQuCgpUaGUgc2NhdHRlciBwbG90IGZvciBzYW5kIGF0dGVtcHRzIHNlZW1zIHRvIGJlIHNsaWdodGx5IHJpZ2h0IHNrZXdlZCB3aXRoIHR3byBwb3NzaWJsZSBvdXRsaWVycyBwYXN0IHRoZSAxMjAgc2FuZCBhdHRlbXB0cy4gCgpUaGUgc2NhdHRlciBwbG90IGZvciBzYW5kIHBlcmNlbnRhZ2UgYWxzbyBoYXMgYSBwb3NpdGl2ZSBsaW5lYXIgdHJlbmQuIAoKCgojIyBGdWxsIG1vZGVsIGFuZCBkaWFnbm9zdGljcwpXZSBuZWVkIHRvIG1ha2UgYSBsaW5lYXIgbW9kZWwgd2l0aCB0aGUgcHJlZGljdG9yIHZhbHVlcy4gQmFzZWQgb24gcHJldmlvdXMgZXhwZXJpZW5jZXMsIHdlIGhhdmUgdGFrZW4gb3V0IEdvbGZlciwgTmF0aW9uLCBSZWdpb24sIHRvdFByaXplLCBhbmQgdG90Um91bmRzLiBUaGUgbnVtYmVyIG9mIGV2ZW50cywgbnVtYmVyIG9mIHJvdW5kcywgYW5kIHRvdGFsIHByaXplIHdpbGwgbm90IGJlIGFibGUgdG8gaW5mbHVlbmNlIGdldHRpbmcgb24gdGhlIGdyZWVuIGluIHJlZ3VsYXRpb24uIFdlIGFsc28gbmVlZCB0byBkcm9wIHRoZSB2YXJpYWJsZXMgdG90UHV0dHMsIGF2ZVB1dHRzLCBzYW5kU2F2ZXMsIGFuZCBmYWlyQXR0IGJlY2F1c2UgdGhleSBhcmUgYWxzbyBub3QgdmFyaWFibGVzIHRoYXQgY2FuIGFmZmVjdCBhIHBlcnNvbnMgYWJpbGl0eSB0byBnZXQgb24gdGhlIGdyZWVuIGluIHJlZ3VsYXRpb24uIFRoaXMgaXMgZHVlIHRvIHRoZW0gZWl0aGVyIG5vdCBkaXJlY3RseSBjb3JyZWxhdGVkIG9yIGhhcHBlbiBhZnRlciB5b3UgZ2V0IG9udG8gdGhlIGdyZWVuLgoKYGBge3J9CmZ1bGwubW9kZWwgPSBsbShncmVlbnMgfiBmYWlyd2F5KyBmYWlyUGN0KyBkcml2ZURpc3QrIHNhbmRBdHQrIHNhbmRQY3QsIGRhdGEgPSBscGdhKQprYWJsZShzdW1tYXJ5KGZ1bGwubW9kZWwpJGNvZWYsIGNhcHRpb24gPSJSZWdyZXNzaW9uIENvZWZmaWNpZW50cyIpCgpgYGAKCgoKCk5vdyB3ZSBzaG91bGQgbG9vayBhdCBvdXIgcmVzaWR1YWwgZGlhZ25vc3RpYyBhbmFseXNpcyB0byBjaGVjayBob3cgcmVsaWFibGUgb3VyIG1vZGVsIGlzLgoKYGBge3J9CnBhcihtZnJvdz1jKDIsMikpCnBsb3QoZnVsbC5tb2RlbCkKCmBgYAoKSW4gdGhlc2UgcmVzaWR1YWwgcGxvdHMgd2UgY2FuIHNlZSB0aGF0IFEtUSByZXNpZHVhbCBoYXMgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdoaWNoIGhhcHBlbnMgd2hlbi4geW91IGhhdmUgLiBUaGUgcmVzaWR1YWxzIHZzIGZpdHRlZCBzaG93cyB0aGUgcG9pbnRzIG5vdCBpbiBhIGNvbmUgc2hhcGUgdGhyb3VnaG91dCBhbmQgdGhpcyBtZWFucyB0aGUgdmFyaWFuY2UgaXMgY29uc3RhbnQuCgoKIyMgR29vZG5lc3Mtb2YtZml0IE1lYXN1cmVzCgpOb3csIHdlIGxvb2sgYXQgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyBmb3IgdGhlIG1vZGVscy4KCmBgYHtyfQpzZWxlY3Q9ZnVuY3Rpb24obSl7IAogZSA9IG0kcmVzaWQgICAgICAgICAgICAgICAgICAgICAgICAgCiBuMCA9IGxlbmd0aChlKSAgICAgICAgICAgICAgICAgICAgICAgIAogU1NFPShtJGRmKSooc3VtbWFyeShtKSRzaWdtYSleMiAgICAgIAogUi5zcT1zdW1tYXJ5KG0pJHIuc3F1YXJlZCAgICAgICAgICAgICAKIFIuYWRqPXN1bW1hcnkobSkkYWRqLnIgICAgICAgICAgICAgICAgCiBNU0U9KHN1bW1hcnkobSkkc2lnbWEpXjIgICAgICAgICAgICAgIAogQ3A9KFNTRS9NU0UpLShuMC0yKihuMC1tJGRmKSkgICAgICAgIAogQUlDPW4wKmxvZyhTU0UpLW4wKmxvZyhuMCkrMioobjAtbSRkZikgICAgICAgICAKIFNCQz1uMCpsb2coU1NFKS1uMCpsb2cobjApKyhsb2cobjApKSoobjAtbSRkZikgIAogWD1tb2RlbC5tYXRyaXgobSkgICAgICAgICAgICAgICAgICAgICAKIEg9WCUqJXNvbHZlKHQoWCklKiVYKSUqJXQoWCkgICAgICAgICAKIGQ9ZS8oMS1kaWFnKEgpKSAgICAgICAgICAgICAgICAgICAgICAgCiBQUkVTUz10KGQpJSolZCAgIAogdGJsID0gYXMuZGF0YS5mcmFtZShjYmluZChTU0U9U1NFLCBSLnNxPVIuc3EsIFIuYWRqID0gUi5hZGosIENwID0gQ3AsIEFJQyA9IEFJQywgU0JDID0gU0JDLCBQUkQgPSBQUkVTUykpCiBuYW1lcyh0YmwpPWMoIlNTRSIsICJSLnNxIiwgIlIuYWRqIiwgIkNwIiwgIkFJQyIsICJTQkMiLCAiUFJFU1MiKQogdGJsCiB9CgpgYGAKCmBgYHtyfQpvdXRwdXQuc3VtID0gcmJpbmQoc2VsZWN0KGZ1bGwubW9kZWwpKQpyb3cubmFtZXMob3V0cHV0LnN1bSkgPSBjKCJmdWxsLm1vZGVsIikKa2FibGUob3V0cHV0LnN1bSwgY2FwdGlvbiA9ICJHb29kbmVzcy1vZi1maXQgTWVhc3VyZXMgb2YgRnVsbCBNb2RlbCIpCmBgYAoKV2UgaGF2ZSBhIHNhbXBsZSBzaXplIG9mIDE1OCB3aGljaCBpcyBsYXJnZS4gV2UgY2FuIHNlZSBmcm9tIHRoZSBhYm92ZSB0YWJsZSB0aGF0IHRoZSBnb29kbmVzcy1vZi1maXQgbWVhc3VyZXMgb2YgdGhlIGZpcnN0IG1vZGVsIGFyZSBzaWduaWZpY2FudC4gVGhpcyBzaG93cyB0aGF0IHRoZSBtb2RlbCBoYXMgYSA2NyUgcHJlZGljdGl2ZSBhYmlsaXR5IHRvIHByZWRpY3QgZ3JlZW5zIGluIHJlZ3VsYXRpb24uCgoKCiMgRmluYWwgTW9kZWwKClRoaXMgaXMgdGhlIHN0YXRpc3RpY3Mgb2YgdGhlIGNob3NlbiBtb2RlbC4KCmBgYHtyfQprYWJsZShzdW1tYXJ5KGZ1bGwubW9kZWwpJGNvZWYsIGNhcHRpb24gPSAiU3RhdHMgb2YgRmluYWwgTW9kZWwiKQpgYGAKClNpbmNlIHRoZSBzYW1wbGUgc2l6ZSBvZiAxNTggaXMgbGFyZ2UsIHRoZSBhcmd1bWVudCBmb3IgdmFsaWRhdGluZyBwLXZhbHVlcyBpcyB0aGUgQ2VudHJhbCBMaW1pdCBUaGVvcmVtLiBBbGwgdGhlIHAtdmFsdWVzIGFyZSBjbG9zZSB0byAwIG1lYW5pbmcgdGhhdCBhbGwgY29lZmZpY2llbnRzIGFyZSBzaWduaWZpY2FudAoKSW4gdGhpcyBjYXNlLCBkdWUgdG8gdGhlIHAtdmFsdWVzIHRoZXJlIGlzIG5vIG5lZWQgdG8gcGVyZm9ybSB2YXJpYWJsZSBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBtb2RlbC4KCgojIENvbmNsdXNpb24vRGlzY3Vzc2lvbgoKV2UgZGlkbid0IGhhdmUgdG8gdXNlIG1hbnkgZGlmZmVyZW50IHRlY2huaXF1ZXMgc3VjaCBhcyBCb3gtQ294IHRvIHRyYW5zZm9ybSB0aGUgcmVzcG9uc2UgdmFyaWFibGVzLiBUaGlzIHdhcyBkdWUgdG8gdGhlIGFzc3VtcHRpb24gb2YgY29uc3RhbnQgdmFyaWFuY2UgYmVpbmcgbWV0LiBXZSBnb3QgcmlkIG9mIGFsbCB0aGUgdmFyaWFibGVzIHRoYXQgd291bGQgbm90IGJlIHNpZ25pZmljYW50IG9yIGhhdmUgYW55IGFzc29jaWF0aW9uIGluIGV2YWx1YXRpbmcgZ2V0dGluZyBvbiB0aGUgZ3JlZW4gaW4gcmVndWxhdGlvbiBkdWUgdG8gbXkgcGFzdCBleHBlcmllbmNlLgoKV2UgbG9va2VkIGF0IHRoZSByZXNpZHVhbCBwbG90cyBhbmQgdGhlIGdvb2RuZXNzIG9mIGZpdCBtZWFzdXJlcyB0byBhY2Nlc3MgdGhlIG1vZGVsLiBJbiBkb2luZyB0aGlzIHdlIGNhbWUgdG8gdGhlIGNvbmNsdXNpb24gdGhhdCB0aGUgbW9kZWwgd2UgaGFkIGRpZG4ndCBuZWVkIGFueSB0cmFuc2Zvcm1hdGlvbnMgYW5kIG91ciBtb2RlbCB3YXMgc2lnbmlmaWNhbnQuCgoKCgoKCgo=