1) Define a binary outcome of your choosing

I will look at those who self report being in bad health and those who self report of not having bad health bsed on sex (gender), health plan, checkups, and race/ethnicity.

2) Fit a predictive logistic regression model using as many predictor variables as you think you need

knitr::kable(head(predbrfss2020))
badhealth sex hlthpln1 checkup1 raceeth
0 Female hp 0last2yrs nhwhite
0 Male nohp 1last5yrs nhblack
0 Female hp 0last2yrs nhwhite
0 Female hp 0last2yrs nhwhite
0 Female hp 0last2yrs nhwhite
0 Male hp 0last2yrs nhwhite

3) Use a 80% training/20% test split for your data.

library(caret)
## Loading required package: lattice
## 
## Attaching package: 'caret'
## The following object is masked from 'package:purrr':
## 
##     lift
## The following object is masked from 'package:survival':
## 
##     cluster
set.seed(1014)
train<- createDataPartition(y = predbrfss2020$badhealth, p = .80, list=F)

predbrfss2020train<-predbrfss2020[train,]
prebrfss2020test<-predbrfss2020[-train,]

table(predbrfss2020train$badhealth)
## 
##      0      1 
## 129371  20421
prop.table(table(predbrfss2020train$badhealth))
## 
##        0        1 
## 0.863671 0.136329
summary(predbrfss2020train)
##    badhealth          sex          hlthpln1              checkup1     
##  Min.   :0.0000   Female:81038   Length:149792      0last2yrs:135134  
##  1st Qu.:0.0000   Male  :68754   Class :character   1last5yrs: 13941  
##  Median :0.0000                  Mode  :character   2never   :   717  
##  Mean   :0.1363                                                       
##  3rd Qu.:0.0000                                                       
##  Max.   :1.0000                                                       
##      raceeth      
##  hispanic: 16225  
##  nhblack : 15075  
##  nhmulti :  2717  
##  nhother :  6981  
##  nhwhite :108794  
## 

4) Report the % correct classification from the training data using the .5 decision rule and again useing the mean of the outcome decision rule

I had to reduce the .5 decision to .2 bacuse I would not get any 1s with the .5 threshold as seen in cm0 below. In cm1 the accuracy with a .2 decision threshold is 84.6% , however, the 0s are 97% correct, the 1s are 4% correct (which is really bad) and the balanced accuracy is about 50%

cm0<-confusionMatrix(data = trpredcl,reference = factor(predbrfss2020train$badhealth))
## Warning in confusionMatrix.default(data = trpredcl, reference =
## factor(predbrfss2020train$badhealth)): Levels are not in the same order for
## reference and data. Refactoring data to match.
cm0
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction      0      1
##          0 129371  20421
##          1      0      0
##                                           
##                Accuracy : 0.8637          
##                  95% CI : (0.8619, 0.8654)
##     No Information Rate : 0.8637          
##     P-Value [Acc > NIR] : 0.5019          
##                                           
##                   Kappa : 0               
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.0000          
##          Pos Pred Value : 0.8637          
##          Neg Pred Value :    NaN          
##              Prevalence : 0.8637          
##          Detection Rate : 0.8637          
##    Detection Prevalence : 1.0000          
##       Balanced Accuracy : 0.5000          
##                                           
##        'Positive' Class : 0               
## 
cm1<-confusionMatrix(data = trpredcl,reference = factor(predbrfss2020train$badhealth))

cm1
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction      0      1
##          0 125951  19613
##          1   3420    808
##                                           
##                Accuracy : 0.8462          
##                  95% CI : (0.8444, 0.8481)
##     No Information Rate : 0.8637          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.0197          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.97356         
##             Specificity : 0.03957         
##          Pos Pred Value : 0.86526         
##          Neg Pred Value : 0.19111         
##              Prevalence : 0.86367         
##          Detection Rate : 0.84084         
##    Detection Prevalence : 0.97177         
##       Balanced Accuracy : 0.50657         
##                                           
##        'Positive' Class : 0               
## 

4a) Does changing the decision rule threshold affect your classification accuracy?

When changing the threshold rule to .1 in cm2 below, the accuracy percent ges down to 19% and accuracy of the 0s goes down to 7% as well but the accuracy for the prediction of 1s gos up significantly to 95% and the balanced accuracy also goes up although its just one percent to 51%.

cm2<-confusionMatrix(data = trpredcl,reference = factor(predbrfss2020train$badhealth))

cm2
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction      0      1
##          0   9210    826
##          1 120161  19595
##                                           
##                Accuracy : 0.1923          
##                  95% CI : (0.1903, 0.1943)
##     No Information Rate : 0.8637          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.0089          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.07119         
##             Specificity : 0.95955         
##          Pos Pred Value : 0.91770         
##          Neg Pred Value : 0.14021         
##              Prevalence : 0.86367         
##          Detection Rate : 0.06149         
##    Detection Prevalence : 0.06700         
##       Balanced Accuracy : 0.51537         
##                                           
##        'Positive' Class : 0               
## 

5) Report the % correct classification from the test data using the .5 decision rule and again useing the mean of the outcome decision rule

Again, I changed the threshold of .5 to .2 to get predictions of 0s and 1s. So instead, when comparing the threshold of .2 to the mean of .1362 (cm3), the .2 threshold had a larger accuracy of 84% versus the 72% when using the mean. While the accuracy of predicting 0s goes down when changing the threshold from .2 to .1362 from 97% to 78%, the accuracy for predicting 1s goes up quite a bit from 4% to almost 32%. The balanced accuracy also goes up when using the mean by 5%, from 50% to 55%.

cm3<-confusionMatrix(data = trpredcl,reference = factor(predbrfss2020train$badhealth))

cm3
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction      0      1
##          0 101362  13940
##          1  28009   6481
##                                           
##                Accuracy : 0.72            
##                  95% CI : (0.7177, 0.7222)
##     No Information Rate : 0.8637          
##     P-Value [Acc > NIR] : 1               
##                                           
##                   Kappa : 0.0782          
##                                           
##  Mcnemar's Test P-Value : <2e-16          
##                                           
##             Sensitivity : 0.7835          
##             Specificity : 0.3174          
##          Pos Pred Value : 0.8791          
##          Neg Pred Value : 0.1879          
##              Prevalence : 0.8637          
##          Detection Rate : 0.6767          
##    Detection Prevalence : 0.7697          
##       Balanced Accuracy : 0.5504          
##                                           
##        'Positive' Class : 0               
## 
LS0tDQp0aXRsZTogIkhvbWV3b3JrIEFzc2lnbm1lbnQgNCINCmF1dGhvcjogIlNlbGVuZSBNLiBHb21leiINCmRhdGU6ICAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiDQpvdXRwdXQ6DQogICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIGZpZ19oZWlnaHQ6IDcNCiAgICBmaWdfd2lkdGg6IDcNCiAgICB0b2M6IHllcw0KICAgIHRvY19mbG9hdDogeWVzDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KHN0YXJnYXplcikNCmxpYnJhcnkoc3VydmV5KQ0KbGlicmFyeShxdWVzdGlvbnIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShoYXZlbikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShqYW5pdG9yKQ0KYGBgDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KYnJmc3MyMDIwPC0gcmVhZFJEUyh1cmwoImh0dHBzOi8vZ2l0aHViLmNvbS9jb3JleXNwYXJrcy9ERU03MjgzL2Jsb2IvbWFzdGVyL2RhdGEvYnJmc3MyMHNtLnJkcz9yYXc9dHJ1ZSIpKQ0KDQpuYW1lcyhicmZzczIwMjApIDwtIHRvbG93ZXIoZ3N1YihwYXR0ZXJuID0gIl8iLHJlcGxhY2VtZW50ID0gICIiLHggPSAgbmFtZXMoYnJmc3MyMDIwKSkpDQoNCmJyZnNzMjAyMCRiYWRoZWFsdGg8LVJlY29kZShicmZzczIwMjAkZ2VuaGx0aCwgcmVjb2Rlcz0iNDo1PTE7IDE6Mz0wOyBlbHNlPU5BIikNCg0KYnJmc3MyMDIwJHNleDwtYXMuZmFjdG9yKGlmZWxzZShicmZzczIwMjAkc2V4PT0xLCAiTWFsZSIsICJGZW1hbGUiKSkNCg0KYnJmc3MyMDIwJGhsdGhwbG4xPC1SZWNvZGUoYnJmc3MyMDIwJGhsdGhwbG4xLCByZWNvZGVzPSIxPSdocCcgOyAyPSdub2hwJzsgZWxzZT1OQSIpDQoNCg0KYnJmc3MyMDIwJGNoZWNrdXAxPC1SZWNvZGUoYnJmc3MyMDIwJGNoZWNrdXAxLA0KICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMToyPScwbGFzdDJ5cnMnOyAzOjQ9JzFsYXN0NXlycyc7IDg9JzJuZXZlcic7IDc9TkE7IDk9TkEiLA0KICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yPVQpDQpicmZzczIwMjAkY2hlY2t1cDE8LWZjdF9yZWxldmVsKGJyZnNzMjAyMCRjaGVja3VwMSwnMGxhc3QyeXJzJywnMWxhc3Q1eXJzJywnMm5ldmVyJykgDQoNCmJyZnNzMjAyMCRibGFjazwtUmVjb2RlKGJyZnNzMjAyMCRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIyPTE7IDk9TkE7IGVsc2U9MCIpDQpicmZzczIwMjAkd2hpdGU8LVJlY29kZShicmZzczIwMjAkcmFjZWdyMywNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0xOyA5PU5BOyBlbHNlPTAiKQ0KYnJmc3MyMDIwJG90aGVyPC1SZWNvZGUoYnJmc3MyMDIwJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjM6ND0xOyA5PU5BOyBlbHNlPTAiKQ0KYnJmc3MyMDIwJGhpc3BhbmljPC1SZWNvZGUoYnJmc3MyMDIwJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjU9MTsgOT1OQTsgZWxzZT0wIikNCg0KYnJmc3MyMDIwJHJhY2VldGg8LVJlY29kZShicmZzczIwMjAkcmFjZWdyMywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMT0nbmh3aGl0ZSc7IDI9J25oYmxhY2snOyAzPSduaG90aGVyJzs0PSduaG11bHRpJzsgNT0naGlzcGFuaWMnOyBlbHNlPU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yID0gVCkNCg0KaW5zdGFsbC5wYWNrYWdlcygibWFncml0dHIiLCByZXBvcyA9ICJodHRwOi8vY3Jhbi51cy5yLXByb2plY3Qub3JnIikNCmxpYnJhcnkobWFncml0dHIpDQoNCmJyZnNzMjAyMDwtYnJmc3MyMDIwICU+JQ0KICANCiAgZmlsdGVyKHNleCE9OSwNCiAgICAgICAgIGlzLm5hKGhsdGhwbG4xKT09RiwNCiAgICAgICAgIGlzLm5hKGNoZWNrdXAxKT09RiwNCiAgICAgICAgIGlzLm5hKGJhZGhlYWx0aCk9PUYsDQogICAgICAgICBpcy5uYShyYWNlZXRoKT09RikNCg0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KDQpkZXM8LXN2eWRlc2lnbihpZHM9fjEsIHN0cmF0YT1+c3RzdHIsIHdlaWdodHM9fm1tc2F3dCwgZGF0YSA9IGJyZnNzMjAyMCApDQpkZXMNCmBgYA0KDQoNCiMjIyMgMSkgRGVmaW5lIGEgYmluYXJ5IG91dGNvbWUgb2YgeW91ciBjaG9vc2luZw0KDQpJIHdpbGwgbG9vayBhdCB0aG9zZSB3aG8gc2VsZiByZXBvcnQgYmVpbmcgaW4gYmFkIGhlYWx0aCBhbmQgdGhvc2Ugd2hvIHNlbGYgcmVwb3J0IG9mIG5vdCBoYXZpbmcgYmFkIGhlYWx0aCBic2VkIG9uIHNleCAoZ2VuZGVyKSwgaGVhbHRoIHBsYW4sIGNoZWNrdXBzLCBhbmQgcmFjZS9ldGhuaWNpdHkuDQoNCiMjIyMgMikgRml0IGEgcHJlZGljdGl2ZSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIHVzaW5nIGFzIG1hbnkgcHJlZGljdG9yIHZhcmlhYmxlcyBhcyB5b3UgdGhpbmsgeW91IG5lZWQNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KDQpwcmVkYnJmc3MyMDIwPC0gYnJmc3MyMDIwICU+JQ0KICANCiAgDQpkcGx5cjo6c2VsZWN0KGJhZGhlYWx0aCwgc2V4LCBobHRocGxuMSwgY2hlY2t1cDEsIHJhY2VldGgpDQpgYGANCg0KYGBge3J9DQprbml0cjo6a2FibGUoaGVhZChwcmVkYnJmc3MyMDIwKSkNCg0KYGBgDQoNCiMjIyMgMykgVXNlIGEgODAlIHRyYWluaW5nLzIwJSB0ZXN0IHNwbGl0IGZvciB5b3VyIGRhdGEuDQoNCmBgYHtyfQ0KbGlicmFyeShjYXJldCkNCnNldC5zZWVkKDEwMTQpDQp0cmFpbjwtIGNyZWF0ZURhdGFQYXJ0aXRpb24oeSA9IHByZWRicmZzczIwMjAkYmFkaGVhbHRoLCBwID0gLjgwLCBsaXN0PUYpDQoNCnByZWRicmZzczIwMjB0cmFpbjwtcHJlZGJyZnNzMjAyMFt0cmFpbixdDQpwcmVicmZzczIwMjB0ZXN0PC1wcmVkYnJmc3MyMDIwWy10cmFpbixdDQoNCnRhYmxlKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpDQpwcm9wLnRhYmxlKHRhYmxlKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShwcmVkYnJmc3MyMDIwdHJhaW4pDQoNCmBgYA0KDQoNCiMjIyMgNCkgUmVwb3J0IHRoZSAlIGNvcnJlY3QgY2xhc3NpZmljYXRpb24gZnJvbSB0aGUgdHJhaW5pbmcgZGF0YSB1c2luZyB0aGUgLjUgZGVjaXNpb24gcnVsZSBhbmQgYWdhaW4gdXNlaW5nIHRoZSBtZWFuIG9mIHRoZSBvdXRjb21lIGRlY2lzaW9uIHJ1bGUNCg0KSSBoYWQgdG8gcmVkdWNlIHRoZSAuNSBkZWNpc2lvbiB0byAuMiBiYWN1c2UgSSB3b3VsZCBub3QgZ2V0IGFueSAxcyB3aXRoIHRoZSAuNSB0aHJlc2hvbGQgYXMgc2VlbiBpbiBjbTAgYmVsb3cuIEluIGNtMSB0aGUgYWNjdXJhY3kgd2l0aCBhIC4yIGRlY2lzaW9uIHRocmVzaG9sZCBpcyA4NC42JSAsIGhvd2V2ZXIsIHRoZSAwcyBhcmUgOTclIGNvcnJlY3QsIHRoZSAxcyBhcmUgNCUgY29ycmVjdCAod2hpY2ggaXMgcmVhbGx5IGJhZCkgYW5kIHRoZSBiYWxhbmNlZCBhY2N1cmFjeSBpcyBhYm91dCA1MCUNCg0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQpnbG0xPC1nbG0ocHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aH5mYWN0b3IocHJlZGJyZnNzMjAyMHRyYWluJHNleCkrZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRobHRocGxuMSkrZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRjaGVja3VwMSkrZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRyYWNlZXRoKSwNCiAgICAgICAgICBkYXRhPXByZWRicmZzczIwMjB0cmFpblssLTFdLA0KICAgICAgICAgIGZhbWlseSA9IGJpbm9taWFsKQ0KDQpzdW1tYXJ5KGdsbTEpDQoNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnRycHJlZDwtIHByZWRpY3QoZ2xtMSwNCiAgICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBwcmVkYnJmc3MyMDIwdHJhaW4sDQogICAgICAgICAgICAgICAgICB0eXBlID0gInJlc3BvbnNlIikNCg0KaGVhZCh0cnByZWQpDQoNCmBgYA0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnRycHJlZGNsPC1mYWN0b3IoaWZlbHNlKHRycHJlZD4uNSwgMSwgMCkpDQoNCmFzLmZhY3RvcihwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpzdW1tYXJ5KHRycHJlZGNsKQ0Kc3VtbWFyeShwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpwcmVkYnJmc3MyMDIwdHJhaW4gJT4lIGRyb3BfbmEoKQ0KDQpsZW5ndGgodHJwcmVkY2wpDQpsZW5ndGgocHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkNCg0KDQp0YWJsZSh0cnByZWRjbCwgcHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmNtMDwtY29uZnVzaW9uTWF0cml4KGRhdGEgPSB0cnByZWRjbCxyZWZlcmVuY2UgPSBmYWN0b3IocHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkpDQoNCmNtMA0KDQpgYGANCg0KDQpgYGB7ciwgaW5jbHVkZT1GQUxTRX0NCnRycHJlZGNsPC1mYWN0b3IoaWZlbHNlKHRycHJlZD4uMiwgMSwgMCkpDQoNCmFzLmZhY3RvcihwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpzdW1tYXJ5KHRycHJlZGNsKQ0Kc3VtbWFyeShwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpwcmVkYnJmc3MyMDIwdHJhaW4gJT4lIGRyb3BfbmEoKQ0KDQpsZW5ndGgodHJwcmVkY2wpDQpsZW5ndGgocHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkNCg0KDQp0YWJsZSh0cnByZWRjbCwgcHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmNtMTwtY29uZnVzaW9uTWF0cml4KGRhdGEgPSB0cnByZWRjbCxyZWZlcmVuY2UgPSBmYWN0b3IocHJlZGJyZnNzMjAyMHRyYWluJGJhZGhlYWx0aCkpDQoNCmNtMQ0KDQpgYGANCg0KIyMjIyA0YSkgRG9lcyBjaGFuZ2luZyB0aGUgZGVjaXNpb24gcnVsZSB0aHJlc2hvbGQgYWZmZWN0IHlvdXIgY2xhc3NpZmljYXRpb24gYWNjdXJhY3k/DQoNCldoZW4gY2hhbmdpbmcgdGhlIHRocmVzaG9sZCBydWxlIHRvIC4xIGluIGNtMiBiZWxvdywgdGhlIGFjY3VyYWN5IHBlcmNlbnQgZ2VzIGRvd24gdG8gMTklIGFuZCBhY2N1cmFjeSBvZiB0aGUgMHMgZ29lcyBkb3duIHRvIDclIGFzIHdlbGwgYnV0IHRoZSBhY2N1cmFjeSBmb3IgdGhlIHByZWRpY3Rpb24gb2YgMXMgZ29zIHVwIHNpZ25pZmljYW50bHkgdG8gOTUlIGFuZCB0aGUgYmFsYW5jZWQgYWNjdXJhY3kgYWxzbyBnb2VzIHVwIGFsdGhvdWdoIGl0cyBqdXN0IG9uZSBwZXJjZW50IHRvIDUxJS4gDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KdHJwcmVkY2w8LWZhY3RvcihpZmVsc2UodHJwcmVkPi4xLCAxLCAwKSkNCg0KYXMuZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpDQoNCnN1bW1hcnkodHJwcmVkY2wpDQpzdW1tYXJ5KHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpDQoNCnByZWRicmZzczIwMjB0cmFpbiAlPiUgZHJvcF9uYSgpDQoNCmxlbmd0aCh0cnByZWRjbCkNCmxlbmd0aChwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQoNCnRhYmxlKHRycHJlZGNsLCBwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpgYGANCg0KYGBge3J9DQpjbTI8LWNvbmZ1c2lvbk1hdHJpeChkYXRhID0gdHJwcmVkY2wscmVmZXJlbmNlID0gZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpKQ0KDQpjbTINCg0KYGBgDQogIA0KIyMjIyA1KSBSZXBvcnQgdGhlICUgY29ycmVjdCBjbGFzc2lmaWNhdGlvbiBmcm9tIHRoZSB0ZXN0IGRhdGEgdXNpbmcgdGhlIC41IGRlY2lzaW9uIHJ1bGUgYW5kIGFnYWluIHVzZWluZyB0aGUgbWVhbiBvZiB0aGUgb3V0Y29tZSBkZWNpc2lvbiBydWxlDQoNCkFnYWluLCBJIGNoYW5nZWQgdGhlIHRocmVzaG9sZCBvZiAuNSB0byAuMiB0byBnZXQgcHJlZGljdGlvbnMgb2YgMHMgYW5kIDFzLiBTbyBpbnN0ZWFkLCB3aGVuIGNvbXBhcmluZyB0aGUgdGhyZXNob2xkIG9mIC4yIHRvIHRoZSBtZWFuIG9mIC4xMzYyIChjbTMpLCB0aGUgLjIgdGhyZXNob2xkIGhhZCBhIGxhcmdlciBhY2N1cmFjeSBvZiA4NCUgdmVyc3VzIHRoZSA3MiUgd2hlbiB1c2luZyB0aGUgbWVhbi4gV2hpbGUgdGhlIGFjY3VyYWN5IG9mIHByZWRpY3RpbmcgMHMgZ29lcyBkb3duIHdoZW4gY2hhbmdpbmcgdGhlIHRocmVzaG9sZCBmcm9tIC4yIHRvIC4xMzYyIGZyb20gOTclIHRvIDc4JSwgdGhlIGFjY3VyYWN5IGZvciBwcmVkaWN0aW5nIDFzIGdvZXMgdXAgcXVpdGUgYSBiaXQgZnJvbSA0JSB0byBhbG1vc3QgMzIlLiBUaGUgYmFsYW5jZWQgYWNjdXJhY3kgYWxzbyBnb2VzIHVwIHdoZW4gdXNpbmcgdGhlIG1lYW4gYnkgNSUsIGZyb20gNTAlIHRvIDU1JS4gDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KdHJwcmVkY2w8LWZhY3RvcihpZmVsc2UodHJwcmVkPi4xMzYzLCAxLCAwKSkNCg0KYXMuZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpDQoNCnN1bW1hcnkodHJwcmVkY2wpDQpzdW1tYXJ5KHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpDQoNCnByZWRicmZzczIwMjB0cmFpbiAlPiUgZHJvcF9uYSgpDQoNCmxlbmd0aCh0cnByZWRjbCkNCmxlbmd0aChwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQoNCnRhYmxlKHRycHJlZGNsLCBwcmVkYnJmc3MyMDIwdHJhaW4kYmFkaGVhbHRoKQ0KDQpgYGANCg0KYGBge3J9DQpjbTM8LWNvbmZ1c2lvbk1hdHJpeChkYXRhID0gdHJwcmVkY2wscmVmZXJlbmNlID0gZmFjdG9yKHByZWRicmZzczIwMjB0cmFpbiRiYWRoZWFsdGgpKQ0KDQpjbTMNCg0KYGBg