Data Manipulations
# Get US county socio-economic variables from Area resource file 2019-2020
arf2020<-import("ahrf2020.sas7bdat")
arf2020<-arf2020%>%
mutate(cofips=as.factor(f00004),
coname=f00010,
state = f00011,
medhouvl=f1461314,
pctcrpop= round(100*(f1492010/f0453010),2),
medhinc= f1434514,
pctctyunemp=round(100*(f1451214/f1451014),2),
ctypopdes= (f0453010/f1387410),
rucc= as.numeric(f0002013),
pctperpov= f1332118,
obgyn10_pc= 1000*(f1168410/ f0453010) )%>%
dplyr::select(medhouvl, pctcrpop,medhinc, pctctyunemp,state, cofips, coname, ctypopdes, rucc, obgyn10_pc,pctperpov)%>%
mutate(rurality= car::Recode(rucc, recodes ="1:3 ='Metro';4:9='Non-Metro'"))
# Get other US county socioeconomic variables from the 5 year (2015-2019) ASC data source.
US_county <- get_acs(geography = 'county',variables = c(totPop19 = "B03003_001",
hispanic ="B03003_003",
afrAm = "B03002_004",
white="B03002_003",
gini="B19083_001"),
year = 2019, geometry = TRUE, shift_geo = TRUE) %>%
dplyr::select(GEOID, NAME, variable, estimate) %>%
spread(variable, estimate) %>%
mutate(pcthispPr19 = round((hispanic/totPop19)*100),1,
pctnhblackpr19 = round((afrAm/totPop19)*100),1 , pctnhpwhite19=round((white/totPop19)*100),1, cofips=as.factor(GEOID)) %>%
dplyr::select(cofips,totPop19,pcthispPr19, pctnhblackpr19, pctnhpwhite19,gini)
#Merge the socioeconomic variables from the Area resource file 2019-2020 with the other socioeconomic variables from the 5 year (2015-2019) ACS estimates.
sevar <- geo_join( US_county, arf2020, by_sp="cofips", by_df="cofips",how="left")
#load and calculate maternal mortality rates for counties in US for a 5year period (2015-2019)
alldat<-readRDS("~/OneDrive - University of Texas at San Antonio/maternalmortality/aggregate/alldat.rds")
countyMMR <- alldat %>%
group_by(cofips)%>%
summarise(nbir=sum(nbirths, na.rm = T), ndea = sum(ndeaths, na.rm = T)) %>%
mutate(mmrate =round(100000*(ndea/nbir),2))
#Merge the socioeconomic variables with US counties maternal mortality rates for a 5- years period(2015-2019)
MMRdata<- geo_join( sevar, countyMMR, by_sp="cofips", by_df="cofips",how="left") %>%
mutate(rmmrate=ifelse(mmrate>=1,mmrate,NA)) %>%
filter(!is.na(ndea), mmrate!=Inf)
Descriptive Maps

Defining Variables
The denominator/ offset variable for this analysis is Total number of births in US county. Five socioeconomic variables were used as predictors in the models–percentage of county population that is rural;the median household income in the county; the county’s median house value; the population density per square mile of the county; and ercentage of non Hispanic black population in the counties. All variables were Z scored
Estimating Generalized Linear Model
##
## Call:
## glm.nb(formula = ndea ~ offset(log(nbir)) + rurality + medhouvlz +
## pctcrpopz + ctypopdesz + pctnhblackpr19z + medhincz, data = usctymmrr,
## init.theta = 5.874759265, link = log)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -6.1469 -0.5259 -0.0197 0.5194 7.5038
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.59014 0.04983 -152.335 < 2e-16 ***
## ruralityNon-Metro 0.26739 0.06872 3.891 9.97e-05 ***
## medhouvlz -0.15762 0.03133 -5.030 4.89e-07 ***
## pctcrpopz 0.58810 0.03537 16.629 < 2e-16 ***
## ctypopdesz 0.37213 0.01049 35.473 < 2e-16 ***
## pctnhblackpr19z 0.11609 0.02286 5.078 3.82e-07 ***
## medhincz -0.07698 0.03367 -2.286 0.0222 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Negative Binomial(5.8748) family taken to be 1)
##
## Null deviance: 2286.23 on 1245 degrees of freedom
## Residual deviance: 889.32 on 1239 degrees of freedom
## (30 observations deleted due to missingness)
## AIC: 4557.8
##
## Number of Fisher Scoring iterations: 1
##
##
## Theta: 5.875
## Std. Err.: 0.496
## Warning while fitting theta: alternation limit reached
##
## 2 x log-likelihood: -4541.753
## (Intercept) ruralityNon-Metro medhouvlz pctcrpopz
## 0.0005054108 1.3065501892 0.8541755812 1.8005727263
## ctypopdesz pctnhblackpr19z medhincz
## 1.4508233576 1.1230981105 0.9259127913
The model above shows a 30% increase in relative risk for maternal death in non metropolitan counties compared to metropolitan counties. Also, for every one unit increase in county’s median house value and median household income, maternal death decrease by 15% and 7.5% respectively. One unit increase in county’s percentage of rural population, County’s population density, and percentage of Non-Hispanic black increase maternal mortality significantly.
Testing for Overdispersion
# Testing for overdispersion using the ratio of residual deviance and residual degree of freedom from the poisson model.
scale<-sqrt(fit_nb$deviance/fit_nb$df.residual)
scale
## [1] 0.8472132
# Testing for overdispersion using the goodness of fit statistic.
1-pchisq(fit_nb$deviance, df = fit_nb$df.residual)
## [1] 1
The overdispersion test shows that the model fits the data properly. The scale test is approximately equals to 1 showing that the mean and the variance of the model is equal to 1. Likewise the goodness of fit statistic gave a large p value of 1. Hence, the model fit the data.
Testing model for Residual Autocorrelation
nbs<-knearneigh(coordinates(as(usctymmrr, "Spatial")), k = 2, longlat = T)
nbs<-knn2nb(nbs, sym = T)
us.wt2<-nb2listw(nbs, style = "W")
lm.morantest(fit_nb, listw = us.wt2)
##
## Global Moran I for regression residuals
##
## data:
## model: glm.nb(formula = ndea ~ offset(log(nbir)) + rurality + medhouvlz
## + pctcrpopz + ctypopdesz + pctnhblackpr19z + medhincz, data =
## usctymmrr, init.theta = 5.874759265, link = log)
## weights: us.wt2
##
## Moran I statistic standard deviate = 0.55844, p-value = 0.2883
## alternative hypothesis: greater
## sample estimates:
## Observed Moran I Expectation Variance
## 0.0136988488 -0.0006232626 0.0006577452
Given the result from the above model; testing for autocorrelation, it appears there is no autocorrelation in our data. The global Moran I is 0.013 with a p-value that is larger than 0.05. At this point, I am not sure on how to move forward with the rest of the assignment.
LS0tCnRpdGxlOiAiU3BhdGlhbCBEZW1vZ3JhcGh5IC0gSG9tZXdrIDQgLUdlbmVyYWxpemVkIExpbmVhciBNb2RlbHMgZm9yIFNwYXRpYWwgQ291bnQgZGF0YSIKYXV0aG9yOiAiU2Ftc29uIEEuIE9sb3dvbGFqdSwgTVBIIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiwgJVknKWAiCm91dHB1dDoKICAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgZmlnX2hlaWdodDogNwogICAgZmlnX3dpZHRoOiA3CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKLS0tCgoKYGBge3IgbG9hZGxpYnMsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsZWNobz1GQUxTRX0KbGlicmFyeShub3J0ZXN0KQpsaWJyYXJ5KGNhcikKbGlicmFyeShNQVNTKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShjbGFzc0ludCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3BkZXApCmxpYnJhcnkocmlvKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkoYnJvb20pCmxpYnJhcnkodGlkeWNlbnN1cykKbGlicmFyeShzZikKbGlicmFyeSh0aWdyaXMpCmxpYnJhcnkoc3BhdGlhbHJlZykKbGlicmFyeShtYXB2aWV3KQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShndHN1bW1hcnkpCmBgYAoKIyMjIERhdGEgTWFuaXB1bGF0aW9ucwpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQojIEdldCBVUyBjb3VudHkgc29jaW8tZWNvbm9taWMgdmFyaWFibGVzIGZyb20gQXJlYSByZXNvdXJjZSBmaWxlIDIwMTktMjAyMAoKYXJmMjAyMDwtaW1wb3J0KCJhaHJmMjAyMC5zYXM3YmRhdCIpIAogYXJmMjAyMDwtYXJmMjAyMCU+JQogIG11dGF0ZShjb2ZpcHM9YXMuZmFjdG9yKGYwMDAwNCksIAogICAgICAgICBjb25hbWU9ZjAwMDEwLAogICAgICAgICBzdGF0ZSA9IGYwMDAxMSwKICAgICAgICAgbWVkaG91dmw9ZjE0NjEzMTQsCiAgICAgICAgIHBjdGNycG9wPSByb3VuZCgxMDAqKGYxNDkyMDEwL2YwNDUzMDEwKSwyKSwKICAgICAgICAgbWVkaGluYz0gZjE0MzQ1MTQsCiAgICAgICAgIHBjdGN0eXVuZW1wPXJvdW5kKDEwMCooZjE0NTEyMTQvZjE0NTEwMTQpLDIpLAogICAgICAgICBjdHlwb3BkZXM9IChmMDQ1MzAxMC9mMTM4NzQxMCksICAKICAgICAgICAgcnVjYz0gYXMubnVtZXJpYyhmMDAwMjAxMyksCiAgICAgICAgIHBjdHBlcnBvdj0gZjEzMzIxMTgsCiAgICAgICAgIG9iZ3luMTBfcGM9IDEwMDAqKGYxMTY4NDEwLyBmMDQ1MzAxMCkgKSU+JQogIGRwbHlyOjpzZWxlY3QobWVkaG91dmwsIHBjdGNycG9wLG1lZGhpbmMsIHBjdGN0eXVuZW1wLHN0YXRlLCBjb2ZpcHMsIGNvbmFtZSwgY3R5cG9wZGVzLCBydWNjLCBvYmd5bjEwX3BjLHBjdHBlcnBvdiklPiUKICAgIG11dGF0ZShydXJhbGl0eT0gY2FyOjpSZWNvZGUocnVjYywgcmVjb2RlcyA9IjE6MyA9J01ldHJvJzs0Ojk9J05vbi1NZXRybyciKSkgCgoKIyBHZXQgb3RoZXIgIFVTIGNvdW50eSBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyBmcm9tIHRoZSA1IHllYXIgKDIwMTUtMjAxOSkgQVNDIGRhdGEgc291cmNlLgoKIFVTX2NvdW50eSA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICdjb3VudHknLHZhcmlhYmxlcyA9IGModG90UG9wMTkgPSAiQjAzMDAzXzAwMSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXNwYW5pYyA9IkIwMzAwM18wMDMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZyQW0gPSAiQjAzMDAyXzAwNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaXRlPSJCMDMwMDJfMDAzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2luaT0iQjE5MDgzXzAwMSIpLCAKICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOSwgZ2VvbWV0cnkgPSBUUlVFLCBzaGlmdF9nZW8gPSBUUlVFKSAlPiUgCiAgICAgICAgICAgIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIHZhcmlhYmxlLCBlc3RpbWF0ZSkgJT4lIAogICAgICAgICAgICBzcHJlYWQodmFyaWFibGUsIGVzdGltYXRlKSAlPiUgCiAgICAgICAgICAgIG11dGF0ZShwY3RoaXNwUHIxOSAgPSByb3VuZCgoaGlzcGFuaWMvdG90UG9wMTkpKjEwMCksMSwgCiAgICAgICAgICAgICAgICAgICBwY3RuaGJsYWNrcHIxOSA9IHJvdW5kKChhZnJBbS90b3RQb3AxOSkqMTAwKSwxICwgcGN0bmhwd2hpdGUxOT1yb3VuZCgod2hpdGUvdG90UG9wMTkpKjEwMCksMSwgY29maXBzPWFzLmZhY3RvcihHRU9JRCkpICU+JQogICAgICAgICAgICBkcGx5cjo6c2VsZWN0KGNvZmlwcyx0b3RQb3AxOSxwY3RoaXNwUHIxOSwgcGN0bmhibGFja3ByMTksIHBjdG5ocHdoaXRlMTksZ2luaSkKCgojTWVyZ2UgdGhlIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIGZyb20gdGhlIEFyZWEgcmVzb3VyY2UgZmlsZSAyMDE5LTIwMjAgd2l0aCB0aGUgb3RoZXIgc29jaW9lY29ub21pYyB2YXJpYWJsZXMgZnJvbSB0aGUgNSB5ZWFyICgyMDE1LTIwMTkpIEFDUyBlc3RpbWF0ZXMuCgogc2V2YXIgPC0gZ2VvX2pvaW4oIFVTX2NvdW50eSwgYXJmMjAyMCwgYnlfc3A9ImNvZmlwcyIsIGJ5X2RmPSJjb2ZpcHMiLGhvdz0ibGVmdCIpIAoKICNsb2FkIGFuZCBjYWxjdWxhdGUgbWF0ZXJuYWwgbW9ydGFsaXR5IHJhdGVzIGZvciBjb3VudGllcyBpbiBVUyBmb3IgIGEgNXllYXIgcGVyaW9kICgyMDE1LTIwMTkpCmFsbGRhdDwtcmVhZFJEUygifi9PbmVEcml2ZSAtIFVuaXZlcnNpdHkgb2YgVGV4YXMgYXQgU2FuIEFudG9uaW8vbWF0ZXJuYWxtb3J0YWxpdHkvYWdncmVnYXRlL2FsbGRhdC5yZHMiKSAKIGNvdW50eU1NUiA8LSAgYWxsZGF0ICU+JSAKICBncm91cF9ieShjb2ZpcHMpJT4lCiAgc3VtbWFyaXNlKG5iaXI9c3VtKG5iaXJ0aHMsIG5hLnJtID0gVCksIG5kZWEgPSBzdW0obmRlYXRocywgbmEucm0gPSBUKSkgICU+JSAKICBtdXRhdGUobW1yYXRlID1yb3VuZCgxMDAwMDAqKG5kZWEvbmJpciksMikpCiAKICAjTWVyZ2UgdGhlIHNvY2lvZWNvbm9taWMgdmFyaWFibGVzIHdpdGggVVMgY291bnRpZXMgbWF0ZXJuYWwgbW9ydGFsaXR5IHJhdGVzIGZvciBhIDUtIHllYXJzIHBlcmlvZCgyMDE1LTIwMTkpCk1NUmRhdGE8LSBnZW9fam9pbiggc2V2YXIsIGNvdW50eU1NUiwgYnlfc3A9ImNvZmlwcyIsIGJ5X2RmPSJjb2ZpcHMiLGhvdz0ibGVmdCIpICU+JSAKICBtdXRhdGUocm1tcmF0ZT1pZmVsc2UobW1yYXRlPj0xLG1tcmF0ZSxOQSkpICU+JSAKICBmaWx0ZXIoIWlzLm5hKG5kZWEpLCBtbXJhdGUhPUluZikgCmBgYAoKCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLGVjaG89RkFMU0V9CgojIEFzc2lnbiBDUlMgIHRvIHRoZSBkYXRhc2V0IGZvciBwcm9wZXIgbWFwIHByb2plY3Rpb24sCnVzY3R5bW1yPC0gc3RfdHJhbnNmb3JtKE1NUmRhdGEsIDMwODMpCgojIE1ha2UgVVMgY291bnR5IE1hdGVybmFsIE1vcnRhbGl0eSBSYXRlIE1hcApVU21tciA8LSB1c2N0eW1tciU+JQogIG11dGF0ZShNTVJfZ3JvdXAgPSBjdXQocm1tcmF0ZSwgYnJlYWtzPXF1YW50aWxlKHJtbXJhdGUsIG5hLnJtPVRSVUUpLCBpbmNsdWRlLmxvd2VzdD1UICkpJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9zZihhZXMoZmlsbD1NTVJfZ3JvdXApKSsKICBzY2FsZV9maWxsX2JyZXdlcihuYW1lPSJNYXRlcm5hbCBNb3J0YWxpdHkgUmF0ZSIsIHBhbGV0dGUgPSAiWWxHbiIKICAgICAgICAgICAgICAgICAgICApKwogIGdndGl0bGUoIlVTIENvdW50aWVzIE1hdGVybmFsIE1vcnRhbGl0eSBSYXRlIFBlciAxMDAsMDAwLCAyMDE1LTIwMTkiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTAsIGhqdXN0ID0gMC4yKSkgKwogIHRoZW1lKAogICAgICAgIGxlZ2VuZC5rZXkud2lkdGggPSB1bml0KDAuMjUsICJpbiIpLAogICAgICAgIGxlZ2VuZC5rZXkuaGVpZ2h0ID0gdW5pdCgwLjIsICJpbiIpLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9OCksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvciA9IE5BKSkKCmBgYAoKIyMjIERlc2NyaXB0aXZlIE1hcHMKYGBge3IsIGVjaG89RkFMU0V9ClVTbW1yCmBgYAoKCiMjIyBEZWZpbmluZyBWYXJpYWJsZXMKVGhlIGRlbm9taW5hdG9yLyBvZmZzZXQgdmFyaWFibGUgZm9yIHRoaXMgYW5hbHlzaXMgaXMgVG90YWwgbnVtYmVyIG9mIGJpcnRocyBpbiBVUyBjb3VudHkuIEZpdmUgc29jaW9lY29ub21pYyB2YXJpYWJsZXMgd2VyZSB1c2VkIGFzIHByZWRpY3RvcnMgaW4gdGhlIG1vZGVscy0tcGVyY2VudGFnZSBvZiBjb3VudHkgcG9wdWxhdGlvbiB0aGF0IGlzIHJ1cmFsO3RoZSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBpbiB0aGUgY291bnR5OyB0aGUgY291bnR54oCZcyBtZWRpYW4gaG91c2UgdmFsdWU7IHRoZSBwb3B1bGF0aW9uIGRlbnNpdHkgcGVyIHNxdWFyZSBtaWxlIG9mIHRoZSBjb3VudHk7IGFuZCBlcmNlbnRhZ2Ugb2Ygbm9uIEhpc3BhbmljIGJsYWNrIHBvcHVsYXRpb24gaW4gdGhlIGNvdW50aWVzLiBBbGwgdmFyaWFibGVzIHdlcmUgWiBzY29yZWQgCgpgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCBlY2hvPUZBTFNFfQojIFogc2NvcmUgYWxsIHZhcmlhYmxlcyAKdXNjdHltbXIkbWVkaGluY3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkbWVkaGluYywgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRtZWRob3V2bHo8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkbWVkaG91dmwsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0Y3Jwb3B6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdGNycG9wLCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJHBjdHBlcnBvdno8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkcGN0cGVycG92LCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJGN0eXBvcGRlc3o8LWFzLm51bWVyaWMoc2NhbGUodXNjdHltbXIkY3R5cG9wZGVzLCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJG9iZ3luMTBfcGN6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJG9iZ3luMTBfcGMsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0Y3R5dW5lbXB6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdGN0eXVuZW1wLCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJHJ1Y2N6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHJ1Y2MsIGNlbnRlcj1ULCBzY2FsZT1UKSkKdXNjdHltbXIkcGN0aGlzcFByMTl6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJHBjdGhpc3BQcjE5LCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJHBjdG5oYmxhY2twcjE5ejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRwY3RuaGJsYWNrcHIxOSwgY2VudGVyPVQsIHNjYWxlPVQpKQp1c2N0eW1tciRwY3RuaHB3aGl0ZTE5ejwtYXMubnVtZXJpYyhzY2FsZSh1c2N0eW1tciRwY3RuaHB3aGl0ZTE5LCBjZW50ZXI9VCwgc2NhbGU9VCkpCnVzY3R5bW1yJGdpbml6PC1hcy5udW1lcmljKHNjYWxlKHVzY3R5bW1yJGdpbmksIGNlbnRlcj1ULCBzY2FsZT1UKSkKYGBgCgojIyMgRXN0aW1hdGluZyBHZW5lcmFsaXplZCBMaW5lYXIgTW9kZWwKYGBge3Isd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgZWNobz1GQUxTRX0KIyBGaWx0ZXIgb3V0IGNvdW50aWVzIHdpdGhvdXQgbWF0ZXJuYWwgZGVhdGhzCnVzY3R5bW1yciA8LSB1c2N0eW1tciAlPiUgCiAgZmlsdGVyKG5kZWE+PTEpCiNmaXQgdGhlIE5lZ2F0aXZlIEJpbm9taWFsIG1vZGVsIApmaXRfbmI8LSBnbG0ubmIobmRlYSB+IG9mZnNldChsb2cobmJpcikpICsgcnVyYWxpdHkrIG1lZGhvdXZseisgcGN0Y3Jwb3B6ICsgY3R5cG9wZGVzeiArIHBjdG5oYmxhY2twcjE5eittZWRoaW5jeiwKICAgICAgICAgICAgICAgZGF0YT11c2N0eW1tcnIpCnN1bW1hcnkoZml0X25iKQojIEV4cG9uZW50cyBvZiB0aGUgY29lZmZpY2llbnQgCmV4cChjb2VmKGZpdF9uYikpCmBgYAoKVGhlIG1vZGVsIGFib3ZlIHNob3dzIGEgMzAlIGluY3JlYXNlIGluIHJlbGF0aXZlIHJpc2sgZm9yIG1hdGVybmFsIGRlYXRoIGluIG5vbiBtZXRyb3BvbGl0YW4gY291bnRpZXMgY29tcGFyZWQgdG8gbWV0cm9wb2xpdGFuIGNvdW50aWVzLiBBbHNvLCBmb3IgZXZlcnkgb25lIHVuaXQgaW5jcmVhc2UgaW4gY291bnR5J3MgbWVkaWFuIGhvdXNlIHZhbHVlIGFuZCBtZWRpYW4gaG91c2Vob2xkIGluY29tZSwgbWF0ZXJuYWwgZGVhdGggZGVjcmVhc2UgYnkgMTUlIGFuZCA3LjUlIHJlc3BlY3RpdmVseS4gT25lIHVuaXQgaW5jcmVhc2UgaW4gY291bnR5J3MgcGVyY2VudGFnZSBvZiBydXJhbCBwb3B1bGF0aW9uLCBDb3VudHkncyBwb3B1bGF0aW9uIGRlbnNpdHksIGFuZCBwZXJjZW50YWdlIG9mIE5vbi1IaXNwYW5pYyBibGFjayBpbmNyZWFzZSBtYXRlcm5hbCBtb3J0YWxpdHkgc2lnbmlmaWNhbnRseS4gICAKCiMjIyBUZXN0aW5nIGZvciBPdmVyZGlzcGVyc2lvbiAKYGBge3J9CiMgVGVzdGluZyBmb3Igb3ZlcmRpc3BlcnNpb24gIHVzaW5nIHRoZSByYXRpbyBvZiByZXNpZHVhbCBkZXZpYW5jZSBhbmQgcmVzaWR1YWwgZGVncmVlIG9mIGZyZWVkb20gZnJvbSB0aGUgcG9pc3NvbiBtb2RlbC4gCnNjYWxlPC1zcXJ0KGZpdF9uYiRkZXZpYW5jZS9maXRfbmIkZGYucmVzaWR1YWwpCnNjYWxlCgojIFRlc3RpbmcgZm9yIG92ZXJkaXNwZXJzaW9uIHVzaW5nIHRoZSBnb29kbmVzcyBvZiBmaXQgc3RhdGlzdGljLgoxLXBjaGlzcShmaXRfbmIkZGV2aWFuY2UsIGRmID0gZml0X25iJGRmLnJlc2lkdWFsKQoKYGBgCgpUaGUgb3ZlcmRpc3BlcnNpb24gdGVzdCBzaG93cyB0aGF0IHRoZSBtb2RlbCBmaXRzIHRoZSBkYXRhIHByb3Blcmx5LiBUaGUgc2NhbGUgdGVzdCBpcyBhcHByb3hpbWF0ZWx5IGVxdWFscyB0byAxIHNob3dpbmcgdGhhdCB0aGUgIG1lYW4gYW5kIHRoZSB2YXJpYW5jZSBvZiB0aGUgbW9kZWwgaXMgZXF1YWwgdG8gMS4gTGlrZXdpc2UgdGhlIGdvb2RuZXNzIG9mIGZpdCBzdGF0aXN0aWMgZ2F2ZSBhIGxhcmdlIHAgdmFsdWUgb2YgMS4gSGVuY2UsIHRoZSBtb2RlbCBmaXQgdGhlIGRhdGEuCgojIyMgVGVzdGluZyBtb2RlbCBmb3IgUmVzaWR1YWwgQXV0b2NvcnJlbGF0aW9uIApgYGB7cix3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpuYnM8LWtuZWFybmVpZ2goY29vcmRpbmF0ZXMoYXModXNjdHltbXJyLCAiU3BhdGlhbCIpKSwgayA9IDIsIGxvbmdsYXQgPSBUKQpuYnM8LWtubjJuYihuYnMsIHN5bSA9IFQpCnVzLnd0MjwtbmIybGlzdHcobmJzLCBzdHlsZSA9ICJXIikKbG0ubW9yYW50ZXN0KGZpdF9uYiwgbGlzdHcgPSB1cy53dDIpCmBgYAoKR2l2ZW4gdGhlIHJlc3VsdCBmcm9tIHRoZSBhYm92ZSBtb2RlbDsgdGVzdGluZyBmb3IgYXV0b2NvcnJlbGF0aW9uLCBpdCBhcHBlYXJzIHRoZXJlIGlzIG5vIGF1dG9jb3JyZWxhdGlvbiBpbiBvdXIgZGF0YS4gVGhlIGdsb2JhbCBNb3JhbiBJIGlzIDAuMDEzIHdpdGggYSBwLXZhbHVlIHRoYXQgaXMgbGFyZ2VyIHRoYW4gMC4wNS4gQXQgdGhpcyBwb2ludCwgSSBhbSBub3Qgc3VyZSBvbiBob3cgdG8gbW92ZSBmb3J3YXJkIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGFzc2lnbm1lbnQuIAoK