#Define an ordinal or multinomial outcome variable of your choosing and define how you will recode the original variable:
brfss20sm <- readRDS("C:/Users/shahi/Dropbox/PC/Downloads/brfss20sm.rds")
names(brfss20sm) <- tolower(gsub(pattern = "_",replacement = "",x = names(brfss20sm)))
#My binary outcome variable is Poor Mental Health (MENT14D)
brfss20sm$poormentalhlth<-Recode(brfss20sm$ment14d, recodes="1=1; 2=2;3=3; 9=NA",
as.factor=T)
brfss20sm$poormentalhlth <- relevel(brfss20sm$poormentalhlth,ref = "1")
###State a research question about what factors you believe will affect your outcome variable:
**How does poor mental health affected by employment, marital status, and age category? Are divorced people suffer poorer mental health than married? Are unable or retired people suffer poorer mental health than employed? Do young adult suffer from poorer mental health than aged people?
#sex
brfss20sm$male<-as.factor(ifelse(brfss20sm$sex==1,
"Male",
"Female"))
#Age cut into intervals
brfss20sm$agec<-cut(brfss20sm$age80,
breaks=c(0,24,39,59,79,99))
#race/ethnicity
brfss20sm$black<-Recode(brfss20sm$racegr3,
recodes="2=1; 9=NA; else=0")
brfss20sm$white<-Recode(brfss20sm$racegr3,
recodes="1=1; 9=NA; else=0")
brfss20sm$other<-Recode(brfss20sm$racegr3,
recodes="3:4=1; 9=NA; else=0")
brfss20sm$hispanic<-Recode(brfss20sm$racegr3,
recodes="5=1; 9=NA; else=0")
brfss20sm$race_eth<-Recode(brfss20sm$racegr3,
recodes="1='nhwhite'; 2='nh_black'; 3='nh_other';4='nh_multirace'; 5='hispanic'; else=NA",
as.factor = T)
#insurance
brfss20sm$ins<-Recode(brfss20sm$hlthpln1,
recodes ="7:9=NA; 1=1;2=0")
#income grouping
brfss20sm$inc<-ifelse(brfss20sm$incomg==9,
NA,
brfss20sm$incomg)
#education level
brfss20sm$educ<-Recode(brfss20sm$educa,
recodes="1:2='0Prim'; 3='1somehs'; 4='2hsgrad'; 5='3somecol'; 6='4colgrad';9=NA",
as.factor=T)
#brfss20sm$educ<-relevel(brfss20sm$educ, ref='2hsgrad')
#employment
brfss20sm$employ<-Recode(brfss20sm$employ1,
recodes="1:2='Employed'; 2:6='nilf'; 7='retired'; 8='unable'; else=NA",
as.factor=T)
brfss20sm$employ<-relevel(brfss20sm$employ,
ref='Employed')
#marital status
brfss20sm$marst<-Recode(brfss20sm$marital,
recodes="1='married'; 2='divorced'; 3='widowed'; 4='separated'; 5='nm';6='cohab'; else=NA",
as.factor=T)
brfss20sm$marst<-relevel(brfss20sm$marst,
ref='married')
#BMI, in the brfss20a the bmi variable has 2 implied decimal places, so we must divide by 100 to get real bmi's
brfss20sm$bmi<-brfss20sm$bmi5/100
brfss20sm$obese<-ifelse(brfss20sm$bmi>=30,
1,
0)
brfss20sm$healthnum<-car::Recode(brfss20sm$poormentalhlth,
recodes="1=1;2=2;3=3; 9=NA",
as.factor = F)
options(survey.lonely.psu = "adjust")
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
sub<-brfss20sm%>%
select(poormentalhlth,healthnum,sex,
agec, marst, employ, mmsawt, ststr) %>%
filter( complete.cases(.))
#First we tell R our survey design
options(survey.lonely.psu = "adjust")
des<-svydesign(ids=~1,
strata=~ststr,
weights=~mmsawt,
data =sub )
Fit the ordinal or the multinomial logistic regression models to your outcome:
###present output from the model in terms of odds ratios and confidence intervals for all model parameters in a table:
To fit an ordinal logit to survey data in R, we use the svyolr function in the survey library.
library(gtsummary)
fit.solr1<-svyolr(poormentalhlth~employ+marst+agec,
design = des)
fit.solr1%>%
tbl_regression()
| Characteristic |
log(OR) |
95% CI |
| employ |
|
|
| Employed |
— |
— |
| nilf |
0.27 |
0.21, 0.33 |
| retired |
-0.06 |
-0.14, 0.02 |
| unable |
1.0 |
0.94, 1.2 |
| marst |
|
|
| married |
— |
— |
| cohab |
0.35 |
0.25, 0.45 |
| divorced |
0.46 |
0.39, 0.53 |
| nm |
0.30 |
0.24, 0.37 |
| separated |
0.31 |
0.17, 0.45 |
| widowed |
0.35 |
0.24, 0.46 |
| agec |
|
|
| (0,24] |
— |
— |
| (24,39] |
-0.18 |
-0.26, -0.11 |
| (39,59] |
-0.56 |
-0.65, -0.48 |
| (59,79] |
-1.0 |
-1.1, -0.86 |
| (79,99] |
-1.4 |
-1.6, -1.2 |
##Here, we can see unable to work people are more likely to report poorer mental health than employed people. Again, divorced people have higher oods of reporting poorer mental health compared to married people. As age increases, the odds of reporting poorer mental health decreases, compared to those are less than 25 years of age.
####If you use the ordinal model, are the assumptions of the proportional odds model met? How did you evaluate the proportional odds assumption?
Now we can “examine” the proportional odds assumption by fitting logits for each change
ex1<-svyglm(I(healthnum>1)~employ+marst+agec,
design = des,
family="binomial")
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
ex2<-svyglm(I(healthnum>2)~employ+marst+agec,
design = des,
family="binomial")
## Warning in eval(family$initialize): non-integer #successes in a binomial glm!
This is NOT a statistical test, just a a rough guide. Here, I plot the coefficients of each model. If the proportional odds is correct, and the assumption is ok, then all these should be “approximately” the same values.
coefs<-data.frame(parms =c( coefficients(ex1)[-1],
coefficients(ex2)[-1]),
beta = rep(names(coefficients(ex1))[-1], 2 ),
mod = c(rep("I(healthnum>1)",12 ),
rep("I(healthnum>2)",12 )))
coefs%>%
ggplot()+
geom_point(aes(x=beta, y=parms, color=mod))+
theme(axis.text.x = element_text(angle = 45))+
labs(title = "Graphical Summary of Proportional Odds Assumption",
x= "Beta",
y= "Estimate")

Based on this, the effects appear to be pretty consistent across transitions.
#Just print the odds ratios,
round(exp(rbind(coef(ex1)[-1],
coef(ex2)[-1])),3)
## employnilf employretired employunable marstcohab marstdivorced marstnm
## [1,] 1.276 0.920 2.287 1.368 1.510 1.336
## [2,] 1.516 1.053 3.952 1.658 1.902 1.508
## marstseparated marstwidowed agec(24,39] agec(39,59] agec(59,79]
## [1,] 1.216 1.360 0.781 0.516 0.349
## [2,] 1.973 1.683 0.953 0.738 0.526
## agec(79,99]
## [1,] 0.231
## [2,] 0.357
Yes, the assumptions of the proportional odds model met.It exactly matched with the previous odd ratio.
Poorer mental health is more likely to experience by young , unable to do work and divorced people. The proportional odds assumption
LS0tDQp0aXRsZTogIkhvbWV3b3JrIDUiDQphdXRob3I6ICJNYWhtdWRhIFN1bHRhbmEiDQpkYXRlOiAiMi8yNC8yMDIyIg0Kb3V0cHV0Og0KICAgICAgaHRtbF9kb2N1bWVudDoNCiAgICAgICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgICAgIGZpZ19oZWlnaHQ6IDcNCiAgICAgICAgZmlnX3dpZHRoOiA3DQogICAgICAgIHRvYzogeWVzDQogICAgICAgIHRvY19mbG9hdDogeWVzDQogICAgICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCiNEZWZpbmUgYW4gb3JkaW5hbCBvciBtdWx0aW5vbWlhbCBvdXRjb21lIHZhcmlhYmxlIG9mIHlvdXIgY2hvb3NpbmcgYW5kIGRlZmluZSBob3cgeW91IHdpbGwgcmVjb2RlIHRoZSBvcmlnaW5hbCB2YXJpYWJsZToNCg0KDQpgYGB7ciAic2V0dXAiLCBpbmNsdWRlPUZBTFNFfQ0KcmVxdWlyZSgia25pdHIiKQ0KIw0KYGBgDQoNCg0KYGBge3IsZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiNsb2FkIGJyZnNzDQpsaWJyYXJ5KGNhcikNCmxpYnJhcnkoVkdBTSkNCmxpYnJhcnkoc3RhcmdhemVyKQ0KbGlicmFyeShzdXJ2ZXkpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHN2eVZHQU0pDQpsaWJyYXJ5KGd0c3VtbWFyeSkNCmBgYA0KDQoNCg0KYGBge3J9DQoNCmJyZnNzMjBzbSA8LSByZWFkUkRTKCJDOi9Vc2Vycy9zaGFoaS9Ecm9wYm94L1BDL0Rvd25sb2Fkcy9icmZzczIwc20ucmRzIikNCg0KbmFtZXMoYnJmc3MyMHNtKSA8LSB0b2xvd2VyKGdzdWIocGF0dGVybiA9ICJfIixyZXBsYWNlbWVudCA9ICAiIix4ID0gIG5hbWVzKGJyZnNzMjBzbSkpKQ0KDQpgYGANCg0KI015IGJpbmFyeSBvdXRjb21lIHZhcmlhYmxlIGlzIFBvb3IgTWVudGFsIEhlYWx0aCAoTUVOVDE0RCkNCg0KYGBge3J9DQpicmZzczIwc20kcG9vcm1lbnRhbGhsdGg8LVJlY29kZShicmZzczIwc20kbWVudDE0ZCwgcmVjb2Rlcz0iMT0xOyAyPTI7Mz0zOyA5PU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yPVQpDQpicmZzczIwc20kcG9vcm1lbnRhbGhsdGggPC0gcmVsZXZlbChicmZzczIwc20kcG9vcm1lbnRhbGhsdGgscmVmID0gIjEiKQ0KDQpgYGANCg0KDQojIyNTdGF0ZSBhIHJlc2VhcmNoIHF1ZXN0aW9uIGFib3V0IHdoYXQgZmFjdG9ycyB5b3UgYmVsaWV2ZSB3aWxsIGFmZmVjdCB5b3VyIG91dGNvbWUgdmFyaWFibGU6DQoNCioqSG93IGRvZXMgcG9vciBtZW50YWwgaGVhbHRoIGFmZmVjdGVkIGJ5IGVtcGxveW1lbnQsIG1hcml0YWwgc3RhdHVzLCBhbmQgYWdlIGNhdGVnb3J5Pw0KIEFyZSBkaXZvcmNlZCBwZW9wbGUgc3VmZmVyIHBvb3JlciBtZW50YWwgaGVhbHRoIHRoYW4gbWFycmllZD8NCiBBcmUgdW5hYmxlIG9yIHJldGlyZWQgcGVvcGxlIHN1ZmZlciBwb29yZXIgbWVudGFsIGhlYWx0aCB0aGFuIGVtcGxveWVkPw0KIERvIHlvdW5nIGFkdWx0IHN1ZmZlciBmcm9tIHBvb3JlciBtZW50YWwgaGVhbHRoIHRoYW4gYWdlZCBwZW9wbGU/DQoNCg0KDQoNCmBgYHtyfQ0KI3NleA0KYnJmc3MyMHNtJG1hbGU8LWFzLmZhY3RvcihpZmVsc2UoYnJmc3MyMHNtJHNleD09MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmVtYWxlIikpDQoNCiNBZ2UgY3V0IGludG8gaW50ZXJ2YWxzDQpicmZzczIwc20kYWdlYzwtY3V0KGJyZnNzMjBzbSRhZ2U4MCwNCiAgICAgICAgICAgICAgICAgICBicmVha3M9YygwLDI0LDM5LDU5LDc5LDk5KSkNCg0KI3JhY2UvZXRobmljaXR5DQpicmZzczIwc20kYmxhY2s8LVJlY29kZShicmZzczIwc20kcmFjZWdyMywNCiAgICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMj0xOyA5PU5BOyBlbHNlPTAiKQ0KYnJmc3MyMHNtJHdoaXRlPC1SZWNvZGUoYnJmc3MyMHNtJHJhY2VncjMsDQogICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE9MTsgOT1OQTsgZWxzZT0wIikNCmJyZnNzMjBzbSRvdGhlcjwtUmVjb2RlKGJyZnNzMjBzbSRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIzOjQ9MTsgOT1OQTsgZWxzZT0wIikNCmJyZnNzMjBzbSRoaXNwYW5pYzwtUmVjb2RlKGJyZnNzMjBzbSRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSI1PTE7IDk9TkE7IGVsc2U9MCIpDQoNCmJyZnNzMjBzbSRyYWNlX2V0aDwtUmVjb2RlKGJyZnNzMjBzbSRyYWNlZ3IzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPSduaHdoaXRlJzsgMj0nbmhfYmxhY2snOyAzPSduaF9vdGhlcic7ND0nbmhfbXVsdGlyYWNlJzsgNT0naGlzcGFuaWMnOyBlbHNlPU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yID0gVCkNCg0KI2luc3VyYW5jZQ0KYnJmc3MyMHNtJGluczwtUmVjb2RlKGJyZnNzMjBzbSRobHRocGxuMSwNCiAgICAgICAgICAgICAgICAgICAgIHJlY29kZXMgPSI3Ojk9TkE7IDE9MTsyPTAiKQ0KDQojaW5jb21lIGdyb3VwaW5nDQpicmZzczIwc20kaW5jPC1pZmVsc2UoYnJmc3MyMHNtJGluY29tZz09OSwNCiAgICAgICAgICAgICAgICAgICAgIE5BLA0KICAgICAgICAgICAgICAgICAgICAgYnJmc3MyMHNtJGluY29tZykNCg0KI2VkdWNhdGlvbiBsZXZlbA0KYnJmc3MyMHNtJGVkdWM8LVJlY29kZShicmZzczIwc20kZWR1Y2EsDQogICAgICAgICAgICAgICAgICAgICAgcmVjb2Rlcz0iMToyPScwUHJpbSc7IDM9JzFzb21laHMnOyA0PScyaHNncmFkJzsgNT0nM3NvbWVjb2wnOyA2PSc0Y29sZ3JhZCc7OT1OQSIsDQogICAgICAgICAgICAgICAgICAgICAgYXMuZmFjdG9yPVQpDQoNCiNicmZzczIwc20kZWR1YzwtcmVsZXZlbChicmZzczIwc20kZWR1YywgcmVmPScyaHNncmFkJykNCg0KI2VtcGxveW1lbnQNCmJyZnNzMjBzbSRlbXBsb3k8LVJlY29kZShicmZzczIwc20kZW1wbG95MSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29kZXM9IjE6Mj0nRW1wbG95ZWQnOyAyOjY9J25pbGYnOyA3PSdyZXRpcmVkJzsgOD0ndW5hYmxlJzsgZWxzZT1OQSIsDQogICAgICAgICAgICAgICAgICAgICAgICBhcy5mYWN0b3I9VCkNCg0KYnJmc3MyMHNtJGVtcGxveTwtcmVsZXZlbChicmZzczIwc20kZW1wbG95LA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0nRW1wbG95ZWQnKQ0KDQojbWFyaXRhbCBzdGF0dXMNCmJyZnNzMjBzbSRtYXJzdDwtUmVjb2RlKGJyZnNzMjBzbSRtYXJpdGFsLA0KICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPSdtYXJyaWVkJzsgMj0nZGl2b3JjZWQnOyAzPSd3aWRvd2VkJzsgND0nc2VwYXJhdGVkJzsgNT0nbm0nOzY9J2NvaGFiJzsgZWxzZT1OQSIsDQogICAgICAgICAgICAgICAgICAgICAgIGFzLmZhY3Rvcj1UKQ0KDQpicmZzczIwc20kbWFyc3Q8LXJlbGV2ZWwoYnJmc3MyMHNtJG1hcnN0LA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSdtYXJyaWVkJykNCg0KDQoNCiNCTUksIGluIHRoZSBicmZzczIwYSB0aGUgYm1pIHZhcmlhYmxlIGhhcyAyIGltcGxpZWQgZGVjaW1hbCBwbGFjZXMsIHNvIHdlIG11c3QgZGl2aWRlIGJ5IDEwMCB0byBnZXQgcmVhbCBibWkncw0KDQpicmZzczIwc20kYm1pPC1icmZzczIwc20kYm1pNS8xMDANCg0KYnJmc3MyMHNtJG9iZXNlPC1pZmVsc2UoYnJmc3MyMHNtJGJtaT49MzAsDQogICAgICAgICAgICAgICAgICAgICAgIDEsDQogICAgICAgICAgICAgICAgICAgICAgIDApDQpgYGANCg0KDQoNCiANCmBgYHtyfQ0KYnJmc3MyMHNtJGhlYWx0aG51bTwtY2FyOjpSZWNvZGUoYnJmc3MyMHNtJHBvb3JtZW50YWxobHRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZGVzPSIxPTE7Mj0yOzM9MzsgOT1OQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLmZhY3RvciA9IEYpDQoNCmBgYA0KDQoNCmBgYHtyfQ0Kb3B0aW9ucyhzdXJ2ZXkubG9uZWx5LnBzdSA9ICJhZGp1c3QiKQ0KDQoNCmxpYnJhcnkoZHBseXIpDQpzdWI8LWJyZnNzMjBzbSU+JQ0KICBzZWxlY3QocG9vcm1lbnRhbGhsdGgsaGVhbHRobnVtLHNleCwNCiAgICAgIGFnZWMsIG1hcnN0LCBlbXBsb3ksIG1tc2F3dCwgc3RzdHIpICU+JQ0KICBmaWx0ZXIoIGNvbXBsZXRlLmNhc2VzKC4pKQ0KDQojRmlyc3Qgd2UgdGVsbCBSIG91ciBzdXJ2ZXkgZGVzaWduDQpvcHRpb25zKHN1cnZleS5sb25lbHkucHN1ID0gImFkanVzdCIpDQpkZXM8LXN2eWRlc2lnbihpZHM9fjEsDQogICAgICAgICAgICAgICBzdHJhdGE9fnN0c3RyLA0KICAgICAgICAgICAgICAgd2VpZ2h0cz1+bW1zYXd0LA0KICAgICAgICAgICAgICAgZGF0YSA9c3ViICkNCg0KYGBgDQoNCg0KDQoNCiMjIEZpdCB0aGUgb3JkaW5hbCBvciB0aGUgbXVsdGlub21pYWwgbG9naXN0aWMgcmVncmVzc2lvbiBtb2RlbHMgdG8geW91ciBvdXRjb21lOg0KDQojIyNwcmVzZW50IG91dHB1dCBmcm9tIHRoZSBtb2RlbCBpbiB0ZXJtcyBvZiBvZGRzIHJhdGlvcyBhbmQgY29uZmlkZW5jZSBpbnRlcnZhbHMgZm9yIGFsbCBtb2RlbCBwYXJhbWV0ZXJzIGluIGEgdGFibGU6DQoNClRvIGZpdCBhbiBvcmRpbmFsIGxvZ2l0IHRvIHN1cnZleSBkYXRhIGluIFIsIHdlIHVzZSB0aGUgYHN2eW9scmAgZnVuY3Rpb24gaW4gdGhlIHN1cnZleSBsaWJyYXJ5LiANCg0KYGBge3J9DQpsaWJyYXJ5KGd0c3VtbWFyeSkNCg0KZml0LnNvbHIxPC1zdnlvbHIocG9vcm1lbnRhbGhsdGh+ZW1wbG95K21hcnN0K2FnZWMsDQogICAgICAgICAgICAgICAgICBkZXNpZ24gPSBkZXMpDQpmaXQuc29scjElPiUNCiAgdGJsX3JlZ3Jlc3Npb24oKQ0KDQpgYGANCiMjSGVyZSwgd2UgY2FuIHNlZSB1bmFibGUgdG8gd29yayBwZW9wbGUgYXJlIG1vcmUgbGlrZWx5IHRvIHJlcG9ydCBwb29yZXIgbWVudGFsIGhlYWx0aCB0aGFuIGVtcGxveWVkIHBlb3BsZS4gQWdhaW4sIGRpdm9yY2VkIHBlb3BsZSBoYXZlIGhpZ2hlciBvb2RzIG9mIHJlcG9ydGluZyBwb29yZXIgbWVudGFsIGhlYWx0aCBjb21wYXJlZCB0byBtYXJyaWVkIHBlb3BsZS4gQXMgYWdlIGluY3JlYXNlcywgdGhlIG9kZHMgb2YgcmVwb3J0aW5nIHBvb3JlciBtZW50YWwgaGVhbHRoIGRlY3JlYXNlcywgY29tcGFyZWQgdG8gdGhvc2UgYXJlIGxlc3MgdGhhbiAyNSB5ZWFycyBvZiBhZ2UuDQoNCg0KIyMjI0lmIHlvdSB1c2UgdGhlIG9yZGluYWwgbW9kZWwsIGFyZSB0aGUgYXNzdW1wdGlvbnMgb2YgdGhlIHByb3BvcnRpb25hbCBvZGRzIG1vZGVsIG1ldD8gSG93IGRpZCB5b3UgZXZhbHVhdGUgdGhlIHByb3BvcnRpb25hbCBvZGRzIGFzc3VtcHRpb24/DQoNCk5vdyB3ZSBjYW4gImV4YW1pbmUiIHRoZSBwcm9wb3J0aW9uYWwgb2RkcyBhc3N1bXB0aW9uIGJ5IGZpdHRpbmcgbG9naXRzIGZvciBlYWNoIGNoYW5nZQ0KDQpgYGB7cn0NCmV4MTwtc3Z5Z2xtKEkoaGVhbHRobnVtPjEpfmVtcGxveSttYXJzdCthZ2VjLA0KICAgICAgICAgICAgZGVzaWduID0gZGVzLA0KICAgICAgICAgICAgZmFtaWx5PSJiaW5vbWlhbCIpDQpleDI8LXN2eWdsbShJKGhlYWx0aG51bT4yKX5lbXBsb3krbWFyc3QrYWdlYywNCiAgICAgICAgICAgIGRlc2lnbiA9IGRlcywNCiAgICAgICAgICAgIGZhbWlseT0iYmlub21pYWwiKQ0KYGBgDQoNClRoaXMgaXMgKipOT1QqKiBhIHN0YXRpc3RpY2FsIHRlc3QsIGp1c3QgYSBhIHJvdWdoIGd1aWRlLiBIZXJlLCBJIHBsb3QgdGhlIGNvZWZmaWNpZW50cyBvZiBlYWNoIG1vZGVsLiBJZiB0aGUgcHJvcG9ydGlvbmFsIG9kZHMgaXMgY29ycmVjdCwgYW5kIHRoZSBhc3N1bXB0aW9uIGlzIG9rLCB0aGVuIGFsbCB0aGVzZSBzaG91bGQgYmUgImFwcHJveGltYXRlbHkiIHRoZSBzYW1lIHZhbHVlcy4NCg0KYGBge3J9DQpjb2VmczwtZGF0YS5mcmFtZShwYXJtcyA9YyggY29lZmZpY2llbnRzKGV4MSlbLTFdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50cyhleDIpWy0xXSksDQogICAgICAgICAgICAgICAgICBiZXRhID0gcmVwKG5hbWVzKGNvZWZmaWNpZW50cyhleDEpKVstMV0sIDIgKSwgDQogICAgICAgICAgICAgICAgICBtb2QgPSBjKHJlcCgiSShoZWFsdGhudW0+MSkiLDEyICksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgiSShoZWFsdGhudW0+MikiLDEyICkpKQ0KDQpjb2VmcyU+JQ0KICBnZ3Bsb3QoKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1iZXRhLCB5PXBhcm1zLCBjb2xvcj1tb2QpKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSkpKw0KICBsYWJzKHRpdGxlID0gIkdyYXBoaWNhbCBTdW1tYXJ5IG9mIFByb3BvcnRpb25hbCBPZGRzIEFzc3VtcHRpb24iLA0KICAgICAgIHg9ICJCZXRhIiwNCiAgICAgICB5PSAiRXN0aW1hdGUiKQ0KICANCg0KYGBgDQoNCkJhc2VkIG9uIHRoaXMsIHRoZSBlZmZlY3RzIGFwcGVhciB0byBiZSBwcmV0dHkgY29uc2lzdGVudCBhY3Jvc3MgdHJhbnNpdGlvbnMuIA0KDQpgYGB7cn0NCg0KI0p1c3QgcHJpbnQgdGhlIG9kZHMgcmF0aW9zLCANCnJvdW5kKGV4cChyYmluZChjb2VmKGV4MSlbLTFdLA0KICAgICAgICAgICAgICAgIGNvZWYoZXgyKVstMV0pKSwzKQ0KDQpgYGANCg0KDQpZZXMsIHRoZSBhc3N1bXB0aW9ucyBvZiB0aGUgcHJvcG9ydGlvbmFsIG9kZHMgbW9kZWwgbWV0Lkl0IGV4YWN0bHkgbWF0Y2hlZCB3aXRoIHRoZSBwcmV2aW91cyBvZGQgcmF0aW8uDQoNClBvb3JlciBtZW50YWwgaGVhbHRoIGlzIG1vcmUgbGlrZWx5IHRvIGV4cGVyaWVuY2UgYnkgeW91bmcgLCB1bmFibGUgdG8gZG8gd29yayBhbmQgZGl2b3JjZWQgcGVvcGxlLiBUaGUgcHJvcG9ydGlvbmFsIG9kZHMgYXNzdW1wdGlvbiANCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K