Binary Dependent Variable Models
The dataset I will use is stop and frisk data from \(2018\). Every time a police officer stops a person in \(NYC\), the officer is require to fill out a form recording the details of the stop. The forms were filled out by hand and manually entered into an \(NYPD\) database. When the forms became electronic, database are available for download for public . Each row of the data set represent a stop by \(NYPD\) officer. Dataset also contain variable such as the age, race, weight, height of the person stopped, if a person was frisked (when an officer pass the hands over someone in a search for hidden weapons, drugs, or other items and the location of the stop.
I am interested to find likelihood of someone being arrested based on different variables. Therefore, my binary dependent variable will be betting arrested or not.
Prepering Dataset for Binary Dependent Variable:
library(readxl)
# Reading the excel data
sqf<- read_excel("C:/Users/Afzal Hossain/Documents/A.Spring 2019/SOC 712/HW/HW4/sqf_2018.xlsx")
#Keeping the variable that i am interested in.
sq<-select(sqf, 'STOP_FRISK_ID',"MONTH2",'SUSPECT_ARRESTED_FLAG','FRISKED_FLAG','SEARCHED_FLAG','WEAPON_FOUND_FLAG','SUSPECT_REPORTED_AGE':'SUSPECT_BODY_BUILD_TYPE','STOP_LOCATION_BORO_NAME')
# Lets look the Data
head(sq)
We need to handle the missing value that is mention as (null) in categorical variable that we will use later in our model and only consider the recors with complete status in our dataset. I will also recode the race variable in order to easy understanding.
# making the the variable character temporarily
sq$SUSPECT_SEX <- as.character(sq$SUSPECT_SEX)
sq$SUSPECT_SEX[sq$SUSPECT_SEX == "(null)"] <- NA
sq$SUSPECT_RACE_DESCRIPTION <- as.character(sq$SUSPECT_RACE_DESCRIPTION)
sq$SUSPECT_RACE_DESCRIPTION[sq$SUSPECT_RACE_DESCRIPTION == "(null)"]<- NA
sq$SUSPECT_BODY_BUILD_TYPE <- as.character(sq$SUSPECT_BODY_BUILD_TYPE)
sq$SUSPECT_BODY_BUILD_TYPE[sq$SUSPECT_BODY_BUILD_TYPE== "(null)"]<- NA
sq<-sq[complete.cases(sq), ]
# Recoding Variable for bodu type
sq$SUSPECT_BODY_BUILD_TYPE[sq$SUSPECT_BODY_BUILD_TYPE=='EA' |
sq$SUSPECT_BODY_BUILD_TYPE=='HEA' |
sq$SUSPECT_BODY_BUILD_TYPE=='THN'|
sq$SUSPECT_BODY_BUILD_TYPE=='U' |
sq$SUSPECT_BODY_BUILD_TYPE=='XXX'] <- "BIG/Athletic"
sq$SUSPECT_BODY_BUILD_TYPE[sq$SUSPECT_BODY_BUILD_TYPE=='MED' |
sq$SUSPECT_BODY_BUILD_TYPE=='THN'] <- "Small"
# Recoding Variable for Race
sq$SUSPECT_RACE_DESCRIPTION[sq$SUSPECT_RACE_DESCRIPTION=='ASIAN / PACIFIC ISLANDER' |
sq$SUSPECT_RACE_DESCRIPTION=='BLACK HISPANIC'|
sq$SUSPECT_RACE_DESCRIPTION=='WHITE HISPANIC' |
sq$SUSPECT_RACE_DESCRIPTION=='AMERICAN INDIAN/ALASKAN NATIVE'] <- "LATINO/OTHER"
# Taking records that are only complete
sq<-sq[complete.cases(sq), ]
dim(sq)
[1] 10776 13
I can see that it reduce the data size by deleting incomplete dataset.
In order to build our model we need to convert our data to apocopate data format and i will create new variable arrast, Frisk and weapon for the from the existing binary variable which contain \(Y/N\) values.
# Making apropate data type
sq$SUSPECT_ARRESTED_FLAG<- as.factor(sq$SUSPECT_ARRESTED_FLAG)
sq$FRISKED_FLAG<- as.factor(sq$FRISKED_FLAG)
sq$WEAPON_FOUND_FLAG<- as.factor(sq$WEAPON_FOUND_FLAG)
sq$SUSPECT_REPORTED_AGE<- as.double(sq$SUSPECT_REPORTED_AGE)
sq$SUSPECT_SEX<- as.factor(sq$SUSPECT_SEX)
sq$SUSPECT_RACE_DESCRIPTION<- as.factor(sq$SUSPECT_RACE_DESCRIPTION)
sq$SUSPECT_BODY_BUILD_TYPE<- as.factor(sq$SUSPECT_BODY_BUILD_TYPE)
sq$SUSPECT_HEIGHT<- as.double(sq$SUSPECT_HEIGHT)
sq$SUSPECT_WEIGHT<- as.double(sq$SUSPECT_WEIGHT)
# Creating New Variables
sq <- sq %>%
mutate(arrast = as.integer(SUSPECT_ARRESTED_FLAG),Frisk = as.integer(FRISKED_FLAG), weapon =as.integer(WEAPON_FOUND_FLAG))
sq <- sq %>%
select(arrast, Frisk, weapon,SUSPECT_SEX,SUSPECT_REPORTED_AGE,SUSPECT_RACE_DESCRIPTION, everything())
head(sq)
I will now recode the variable to \(0/1\) instead of \(Y/N\) for my newly created variables which are arrast, Frisk and weapon. Also Filter any missing value.
sq <- sq %>% filter(!is.na(SUSPECT_REPORTED_AGE),!is.na(SUSPECT_HEIGHT),!is.na(SUSPECT_WEIGHT),!is.na(SUSPECT_SEX))%>%
mutate(arrasted = sjmisc::rec(arrast, rec = "1=0; 2=1"), Frisked = sjmisc::rec(Frisk, rec = "1=0; 2=1"),
weapon_found = sjmisc::rec(weapon, rec = "1=0; 2=1")) %>%
select(arrasted, SUSPECT_ARRESTED_FLAG, Frisked,FRISKED_FLAG,
weapon_found,WEAPON_FOUND_FLAG,SUSPECT_SEX,SUSPECT_REPORTED_AGE,
SUSPECT_RACE_DESCRIPTION, everything()) %>%
select(-arrast)
head(sq)
Logistic Regression
Lets create our First simple model where we predict using our bineary dependent variable arrasted and a independent continuas variable Age of the suspect stop by officer, SUSPECT_REPORTED_AGE
m0 <- glm(arrasted ~ SUSPECT_REPORTED_AGE, family = binomial, data = sq)
summary(m0)
Call:
glm(formula = arrasted ~ SUSPECT_REPORTED_AGE, family = binomial,
data = sq)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.9719 -0.8460 -0.8250 1.5098 1.6037
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.021811 0.056976 -17.934 < 2e-16 ***
SUSPECT_REPORTED_AGE 0.005945 0.001768 3.363 0.000771 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 11963 on 9788 degrees of freedom
Residual deviance: 11952 on 9787 degrees of freedom
AIC: 11956
Number of Fisher Scoring iterations: 4
From \(m_0\), the coefficient is positive,so we can say that as people get older, chances of them being arrested in crease. From the \(Y-intercept\), I can say that when age is zero, the log odd of being arrested is \(-1.028211\). From the slope value, I can say that for every one-unit increase of age, the log odds of being arrested increases by \(0.005945\). Furthermore, from the \(Z\) \(value\) we can say that it is more than two standard deviation way from zero therefore it is statistically significant and this is confirm by the small \(p-value\). Therefore, suspect age is significant for predicting arrest.
Improving Model:
I will add suspect gender and race information to our second model and expect to find statistically not significant since, a police office are not allow to consider race and gender to arrest someone.
m1 <- glm(arrasted ~ SUSPECT_SEX + SUSPECT_REPORTED_AGE + SUSPECT_RACE_DESCRIPTION , family = binomial, data = sq)
summary(m1)
Call:
glm(formula = arrasted ~ SUSPECT_SEX + SUSPECT_REPORTED_AGE +
SUSPECT_RACE_DESCRIPTION, family = binomial, data = sq)
Deviance Residuals:
Min 1Q Median 3Q Max
-0.9980 -0.8538 -0.8180 1.5046 1.6264
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.960084 0.090326 -10.629 < 2e-16 ***
SUSPECT_SEXMALE -0.112396 0.075536 -1.488 0.136756
SUSPECT_REPORTED_AGE 0.005977 0.001775 3.367 0.000759 ***
SUSPECT_RACE_DESCRIPTIONLATINO/OTHER 0.114725 0.047819 2.399 0.016433 *
SUSPECT_RACE_DESCRIPTIONWHITE 0.003273 0.077097 0.042 0.966135
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 11963 on 9788 degrees of freedom
Residual deviance: 11944 on 9784 degrees of freedom
AIC: 11954
Number of Fisher Scoring iterations: 4
We can see that age remain significant variable. However, we can see only been lotion have some significant when cones being arrested, but no other race and gender are statistically significant.
Lets Add Intersection and More:
Let me add more variable and intersection between weapon found and been frisked(searched for drug, weapon etc.)
m2 <- glm(arrasted ~ SUSPECT_SEX +SUSPECT_REPORTED_AGE + weapon_found*Frisked +SUSPECT_RACE_DESCRIPTION + SUSPECT_HEIGHT +SUSPECT_BODY_BUILD_TYPE, family = binomial, data = sq)
summary(m2)
Call:
glm(formula = arrasted ~ SUSPECT_SEX + SUSPECT_REPORTED_AGE +
weapon_found * Frisked + SUSPECT_RACE_DESCRIPTION + SUSPECT_HEIGHT +
SUSPECT_BODY_BUILD_TYPE, family = binomial, data = sq)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.9317 -0.7796 -0.7237 0.7718 1.8328
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -1.290108 0.350854 -3.677 0.000236 ***
SUSPECT_SEXMALE -0.226927 0.080349 -2.824 0.004739 **
SUSPECT_REPORTED_AGE 0.006213 0.001896 3.277 0.001050 **
weapon_found 1.876116 0.195850 9.579 < 2e-16 ***
Frisked -0.182285 0.050219 -3.630 0.000284 ***
SUSPECT_RACE_DESCRIPTIONLATINO/OTHER 0.139205 0.050820 2.739 0.006159 **
SUSPECT_RACE_DESCRIPTIONWHITE 0.080195 0.080718 0.994 0.320454
SUSPECT_HEIGHT 0.060340 0.062626 0.964 0.335293
SUSPECT_BODY_BUILD_TYPESmall -0.168502 0.049008 -3.438 0.000585 ***
weapon_found:Frisked 0.468597 0.215828 2.171 0.029919 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 11963 on 9788 degrees of freedom
Residual deviance: 11017 on 9779 degrees of freedom
AIC: 11037
Number of Fisher Scoring iterations: 4
I can see that weapon, frisked significant coefficient that is expected since if weapon found, chance of getting arrested are high. Furthermore, intersection of weapon found and frisk and body type are very important coefficient as well. The age remain significant, and gender become an important coefficient. Therefore, log odds of been arrested change based those coefficient. It is interesting to see that Male has negative log odds of been arrested.
Model Selection
We will use likelihood ratio test and information criteria for our best model selection
Likelihood Ratio Test:
anova(m0, m1, m2, test = "Chisq")
Analysis of Deviance Table
Model 1: arrasted ~ SUSPECT_REPORTED_AGE
Model 2: arrasted ~ SUSPECT_SEX + SUSPECT_REPORTED_AGE + SUSPECT_RACE_DESCRIPTION
Model 3: arrasted ~ SUSPECT_SEX + SUSPECT_REPORTED_AGE + weapon_found *
Frisked + SUSPECT_RACE_DESCRIPTION + SUSPECT_HEIGHT + SUSPECT_BODY_BUILD_TYPE
Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1 9787 11952
2 9784 11944 3 8.3 0.04019 *
3 9779 11018 5 926.4 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Form this test, we can see that model 3 which is \(m_2\) has a significantly improved based on very small P-value. Now we will use Information criteria to find which model is better.
Information Criteria:
Bayesian information criterion (BIC): \[BIC = -2L + k\times log(n)\]
Akaike information criterion (AIC): \[AIC = 2(L-k)\]
library(texreg)
#htmlreg(list(m0, m1, m2), doctype = FALSE)
Statistical models
|
|
Model 1
|
Model 2
|
Model 3
|
|
(Intercept)
|
-1.02***
|
-0.96***
|
-1.29***
|
|
|
(0.06)
|
(0.09)
|
(0.35)
|
|
SUSPECT_REPORTED_AGE
|
0.01***
|
0.01***
|
0.01**
|
|
|
(0.00)
|
(0.00)
|
(0.00)
|
|
SUSPECT_SEXMALE
|
|
-0.11
|
-0.23**
|
|
|
|
(0.08)
|
(0.08)
|
|
SUSPECT_RACE_DESCRIPTIONLatino/Other
|
|
0.11*
|
0.14**
|
|
|
|
(0.05)
|
(0.05)
|
|
SUSPECT_RACE_DESCRIPTIONWHITE
|
|
0.00
|
0.08
|
|
|
|
(0.08)
|
(0.08)
|
|
weapon_found
|
|
|
1.88***
|
|
|
|
|
(0.20)
|
|
Frisked
|
|
|
-0.18***
|
|
|
|
|
(0.05)
|
|
SUSPECT_HEIGHT
|
|
|
0.06
|
|
|
|
|
(0.06)
|
|
SUSPECT_BODY_BUILD_TYPESmall
|
|
|
-0.17***
|
|
|
|
|
(0.05)
|
|
weapon_found:Frisked
|
|
|
0.47*
|
|
|
|
|
(0.22)
|
|
AIC
|
11956.17
|
11953.86
|
11037.47
|
|
BIC
|
11970.54
|
11989.81
|
11109.36
|
|
Log Likelihood
|
-5976.08
|
-5971.93
|
-5508.73
|
|
Deviance
|
11952.17
|
11943.86
|
11017.47
|
|
Num. obs.
|
9789
|
9789
|
9789
|
|
p < 0.001, p < 0.01, p < 0.05
|
From both \(AIC\) and \(BIC\), we can see that models get better as their value decrease with more variable and complexity. The best performing model based on both of these metrics is Model 3 which is model \(m_2\)
Visualizations Our Best Model:
library(visreg)
visreg(m2, "SUSPECT_REPORTED_AGE",scale="response",line=list(col="magenta2"),fill=list(col="burlywood2"),
xlab="Suspect Age") + theme_bw()
Conditions used in construction of plot
SUSPECT_SEX: MALE
weapon_found: 0
Frisked: 1
SUSPECT_RACE_DESCRIPTION: BLACK
SUSPECT_HEIGHT: 5.7
SUSPECT_BODY_BUILD_TYPE: BIG/Athletic
NULL

We can see that, as age increase probability of being arrested slightly increased.
visreg(m2, "SUSPECT_SEX", by = "weapon_found", scale = "response",line=list(col="magenta2"),
fill=list(col="navyblue"), xlab="Suspect Sex")

For above, we can see that when weapon found and not found, the probability of getting arrest for Female is slightly high. This may explain earlier result where we saw male has negative log odd of being arrested. This result surprise me, but the difference is very insignificant and given that male sample is larger than female may contribute to this slight different.
visreg(m2, "SUSPECT_RACE_DESCRIPTION", by = "Frisked",scale ="response",line=list(col="deeppink1"),
fill=list(col="darkcyan"), xlab="Suspect Race")

From this plot, we see that when comes to weather different race was frisked (searched for drug, weapon etc.) or not, Black people are less likely to get arrested compare to white.But they are the one stop most compare to other race almost \(56\%\) of stop were Black. Therefore, we might want to look into this more to find weather there is a racial bias exist or not. Latinos/ other race has highest probability of being arrested in both scenario. May be they tend to have burgs or illegal substances compare to other demography.
visreg(m2, "SUSPECT_BODY_BUILD_TYPE", by = "Frisked", scale = "response",line=list(col="darkgoldenrod1"),
fill=list(col="firebrick4"), xlab="Suspect Body Type")

This plot clearly show that whether they were frisked or not people with big body are more likely to get arrested. Maybe because office feel threaten by their body type.
LS0tDQp0aXRsZTogIk1kIEFmemFsIEhvc3NhaW4gfCBTT0MgNzEyIHwgSG9tZSBXb3JrIDQiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojKipCaW5hcnkgRGVwZW5kZW50IFZhcmlhYmxlIE1vZGVscyoqDQoNClRoZSBkYXRhc2V0IEkgd2lsbCB1c2UgaXMgc3RvcCBhbmQgZnJpc2sgZGF0YSBmcm9tICQyMDE4JC4gRXZlcnkgdGltZSBhIHBvbGljZSBvZmZpY2VyIHN0b3BzIGEgcGVyc29uIGluICROWUMkLCB0aGUgb2ZmaWNlciBpcyByZXF1aXJlIHRvIGZpbGwgb3V0IGEgZm9ybSByZWNvcmRpbmcgdGhlIGRldGFpbHMgb2YgdGhlIHN0b3AuIFRoZSBmb3JtcyB3ZXJlIGZpbGxlZCBvdXQgYnkgaGFuZCBhbmQgbWFudWFsbHkgZW50ZXJlZCBpbnRvIGFuICROWVBEJCBkYXRhYmFzZS4gV2hlbiB0aGUgZm9ybXMgYmVjYW1lIGVsZWN0cm9uaWMsIGRhdGFiYXNlIGFyZSBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZvciBwdWJsaWMgLiBFYWNoIHJvdyBvZiB0aGUgZGF0YSBzZXQgcmVwcmVzZW50IGEgc3RvcCBieSAkTllQRCQgb2ZmaWNlci4gRGF0YXNldCBhbHNvIGNvbnRhaW4gdmFyaWFibGUgc3VjaCBhcyB0aGUgYWdlLCByYWNlLCB3ZWlnaHQsIGhlaWdodCBvZiB0aGUgcGVyc29uIHN0b3BwZWQsIGlmIGEgcGVyc29uIHdhcyBmcmlza2VkICh3aGVuIGFuIG9mZmljZXIgcGFzcyB0aGUgaGFuZHMgb3ZlciBzb21lb25lIGluIGEgc2VhcmNoIGZvciBoaWRkZW4gd2VhcG9ucywgZHJ1Z3MsIG9yIG90aGVyIGl0ZW1zIGFuZCB0aGUgbG9jYXRpb24gb2YgdGhlIHN0b3AuDQoNCg0KSSBhbSBpbnRlcmVzdGVkIHRvIGZpbmQgbGlrZWxpaG9vZCBvZiBzb21lb25lIGJlaW5nIGFycmVzdGVkIGJhc2VkIG9uIGRpZmZlcmVudCB2YXJpYWJsZXMuIFRoZXJlZm9yZSwgbXkgYmluYXJ5IGRlcGVuZGVudCB2YXJpYWJsZSB3aWxsIGJlIGJldHRpbmcgYXJyZXN0ZWQgb3Igbm90Lg0KDQoNCiMjIyAqKlByZXBlcmluZyBEYXRhc2V0IGZvciBCaW5hcnkgRGVwZW5kZW50IFZhcmlhYmxlOioqDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KDQojIFJlYWRpbmcgdGhlIGV4Y2VsIGRhdGENCnNxZjwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0FmemFsIEhvc3NhaW4vRG9jdW1lbnRzL0EuU3ByaW5nIDIwMTkvU09DIDcxMi9IVy9IVzQvc3FmXzIwMTgueGxzeCIpDQoNCiNLZWVwaW5nIHRoZSB2YXJpYWJsZSB0aGF0IGkgYW0gaW50ZXJlc3RlZCBpbi4NCnNxPC1zZWxlY3Qoc3FmLCAnU1RPUF9GUklTS19JRCcsIk1PTlRIMiIsJ1NVU1BFQ1RfQVJSRVNURURfRkxBRycsJ0ZSSVNLRURfRkxBRycsJ1NFQVJDSEVEX0ZMQUcnLCdXRUFQT05fRk9VTkRfRkxBRycsJ1NVU1BFQ1RfUkVQT1JURURfQUdFJzonU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEUnLCdTVE9QX0xPQ0FUSU9OX0JPUk9fTkFNRScpDQoNCiMgTGV0cyBsb29rIHRoZSBEYXRhDQpoZWFkKHNxKQ0KDQpgYGANCg0KDQoNCg0KV2UgbmVlZCB0byBoYW5kbGUgdGhlIG1pc3NpbmcgdmFsdWUgdGhhdCBpcyBtZW50aW9uIGFzIGAobnVsbClgIGluIGNhdGVnb3JpY2FsIHZhcmlhYmxlIHRoYXQgd2Ugd2lsbCB1c2UgbGF0ZXIgaW4gb3VyIG1vZGVsIGFuZCBvbmx5IGNvbnNpZGVyIHRoZSByZWNvcnMgd2l0aCBjb21wbGV0ZSBzdGF0dXMgaW4gb3VyIGRhdGFzZXQuIEkgd2lsbCBhbHNvIHJlY29kZSB0aGUgcmFjZSB2YXJpYWJsZSBpbiBvcmRlciB0byBlYXN5IHVuZGVyc3RhbmRpbmcuDQogDQpgYGB7cn0NCg0KIyBtYWtpbmcgdGhlIHRoZSB2YXJpYWJsZSBjaGFyYWN0ZXIgdGVtcG9yYXJpbHkNCnNxJFNVU1BFQ1RfU0VYIDwtIGFzLmNoYXJhY3RlcihzcSRTVVNQRUNUX1NFWCkNCnNxJFNVU1BFQ1RfU0VYW3NxJFNVU1BFQ1RfU0VYID09ICIobnVsbCkiXSA8LSBOQQ0KDQpzcSRTVVNQRUNUX1JBQ0VfREVTQ1JJUFRJT04gPC0gYXMuY2hhcmFjdGVyKHNxJFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTikNCnNxJFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTltzcSRTVVNQRUNUX1JBQ0VfREVTQ1JJUFRJT04gPT0gIihudWxsKSJdPC0gTkENCg0Kc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEUgPC0gYXMuY2hhcmFjdGVyKHNxJFNVU1BFQ1RfQk9EWV9CVUlMRF9UWVBFKQ0Kc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEVbc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSAiKG51bGwpIl08LSBOQQ0Kc3E8LXNxW2NvbXBsZXRlLmNhc2VzKHNxKSwgXQ0KDQoNCiMgUmVjb2RpbmcgVmFyaWFibGUgZm9yIGJvZHUgdHlwZQ0Kc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEVbc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdFQScgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdIRUEnIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdUSE4nfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcSRTVVNQRUNUX0JPRFlfQlVJTERfVFlQRT09J1UnIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdYWFgnXSA8LSAiQklHL0F0aGxldGljIiANCg0Kc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEVbc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdNRUQnIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU9PSdUSE4nXSA8LSAiU21hbGwiIA0KDQoNCg0KIyBSZWNvZGluZyBWYXJpYWJsZSBmb3IgUmFjZQ0Kc3EkU1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OW3NxJFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTj09J0FTSUFOIC8gUEFDSUZJQyBJU0xBTkRFUicgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxJFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTj09J0JMQUNLIEhJU1BBTklDJ3wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxJFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTj09J1dISVRFIEhJU1BBTklDJyB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcSRTVVNQRUNUX1JBQ0VfREVTQ1JJUFRJT049PSdBTUVSSUNBTiBJTkRJQU4vQUxBU0tBTiBOQVRJVkUnXSA8LSAiTEFUSU5PL09USEVSIiANCg0KIyBUYWtpbmcgcmVjb3JkcyB0aGF0IGFyZSBvbmx5IGNvbXBsZXRlDQpzcTwtc3FbY29tcGxldGUuY2FzZXMoc3EpLCBdDQoNCmRpbShzcSkNCmBgYA0KDQpJIGNhbiBzZWUgdGhhdCBpdCByZWR1Y2UgdGhlIGRhdGEgc2l6ZSBieSBkZWxldGluZyBpbmNvbXBsZXRlIGRhdGFzZXQuXG4NCg0KSW4gb3JkZXIgdG8gYnVpbGQgb3VyIG1vZGVsIHdlIG5lZWQgdG8gY29udmVydCBvdXIgZGF0YSB0byBhcG9jb3BhdGUgZGF0YSBmb3JtYXQgYW5kIGkgd2lsbCBjcmVhdGUgbmV3IHZhcmlhYmxlIGBhcnJhc3RgLCBgRnJpc2tgIGFuZCBgd2VhcG9uYCBmb3IgdGhlIGZyb20gdGhlIGV4aXN0aW5nIGJpbmFyeSB2YXJpYWJsZSB3aGljaCBjb250YWluICRZL04kIHZhbHVlcy4NCg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KDQojIE1ha2luZyBhcHJvcGF0ZSBkYXRhIHR5cGUNCg0Kc3EkU1VTUEVDVF9BUlJFU1RFRF9GTEFHPC0gYXMuZmFjdG9yKHNxJFNVU1BFQ1RfQVJSRVNURURfRkxBRykNCnNxJEZSSVNLRURfRkxBRzwtIGFzLmZhY3RvcihzcSRGUklTS0VEX0ZMQUcpDQpzcSRXRUFQT05fRk9VTkRfRkxBRzwtIGFzLmZhY3RvcihzcSRXRUFQT05fRk9VTkRfRkxBRykNCnNxJFNVU1BFQ1RfUkVQT1JURURfQUdFPC0gYXMuZG91YmxlKHNxJFNVU1BFQ1RfUkVQT1JURURfQUdFKQ0Kc3EkU1VTUEVDVF9TRVg8LSBhcy5mYWN0b3Ioc3EkU1VTUEVDVF9TRVgpDQpzcSRTVVNQRUNUX1JBQ0VfREVTQ1JJUFRJT048LSBhcy5mYWN0b3Ioc3EkU1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OKQ0Kc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEU8LSBhcy5mYWN0b3Ioc3EkU1VTUEVDVF9CT0RZX0JVSUxEX1RZUEUpDQpzcSRTVVNQRUNUX0hFSUdIVDwtIGFzLmRvdWJsZShzcSRTVVNQRUNUX0hFSUdIVCkNCnNxJFNVU1BFQ1RfV0VJR0hUPC0gYXMuZG91YmxlKHNxJFNVU1BFQ1RfV0VJR0hUKQ0KDQoNCiMgQ3JlYXRpbmcgTmV3IFZhcmlhYmxlcw0Kc3EgPC0gc3EgJT4lIA0KICBtdXRhdGUoYXJyYXN0ID0gYXMuaW50ZWdlcihTVVNQRUNUX0FSUkVTVEVEX0ZMQUcpLEZyaXNrID0gYXMuaW50ZWdlcihGUklTS0VEX0ZMQUcpLCB3ZWFwb24gPWFzLmludGVnZXIoV0VBUE9OX0ZPVU5EX0ZMQUcpKQ0KDQpzcSA8LSBzcSAlPiUgDQogIHNlbGVjdChhcnJhc3QsIEZyaXNrLCB3ZWFwb24sU1VTUEVDVF9TRVgsU1VTUEVDVF9SRVBPUlRFRF9BR0UsU1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OLCBldmVyeXRoaW5nKCkpDQoNCmhlYWQoc3EpDQoNCmBgYA0KDQoNCg0KDQpJIHdpbGwgbm93IHJlY29kZSB0aGUgdmFyaWFibGUgdG8gJDAvMSQgaW5zdGVhZCBvZiAkWS9OJCBmb3IgbXkgbmV3bHkgY3JlYXRlZCB2YXJpYWJsZXMgd2hpY2ggYXJlIGBhcnJhc3RgLCBgRnJpc2tgIGFuZCBgd2VhcG9uYC4gQWxzbyBGaWx0ZXIgYW55IG1pc3NpbmcgdmFsdWUuDQoNCmBgYHtyfQ0Kc3EgPC0gc3EgJT4lIGZpbHRlcighaXMubmEoU1VTUEVDVF9SRVBPUlRFRF9BR0UpLCFpcy5uYShTVVNQRUNUX0hFSUdIVCksIWlzLm5hKFNVU1BFQ1RfV0VJR0hUKSwhaXMubmEoU1VTUEVDVF9TRVgpKSU+JQ0KICBtdXRhdGUoYXJyYXN0ZWQgPSBzam1pc2M6OnJlYyhhcnJhc3QsIHJlYyA9ICIxPTA7IDI9MSIpLCBGcmlza2VkID0gc2ptaXNjOjpyZWMoRnJpc2ssICAgcmVjID0gIjE9MDsgMj0xIiksDQogICAgICAgICB3ZWFwb25fZm91bmQgPSBzam1pc2M6OnJlYyh3ZWFwb24sIHJlYyA9ICIxPTA7IDI9MSIpKSAlPiUgDQogICAgICAgICAgICAgc2VsZWN0KGFycmFzdGVkLCBTVVNQRUNUX0FSUkVTVEVEX0ZMQUcsIEZyaXNrZWQsRlJJU0tFRF9GTEFHLCAgIA0KICAgICAgICAgICAgICAgICAgICB3ZWFwb25fZm91bmQsV0VBUE9OX0ZPVU5EX0ZMQUcsU1VTUEVDVF9TRVgsU1VTUEVDVF9SRVBPUlRFRF9BR0UsDQogICAgICAgICAgICAgICAgICAgICAgICAgIFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTiwgZXZlcnl0aGluZygpKSAlPiUgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCgtYXJyYXN0KQ0KDQpoZWFkKHNxKQ0KYGBgDQoNCiMjIyoqTG9naXN0aWMgUmVncmVzc2lvbioqDQoNCkxldHMgY3JlYXRlIG91ciBGaXJzdCBzaW1wbGUgbW9kZWwgd2hlcmUgd2UgcHJlZGljdCB1c2luZyBvdXIgYmluZWFyeSBkZXBlbmRlbnQgdmFyaWFibGUgYGFycmFzdGVkYCBhbmQgYSBpbmRlcGVuZGVudCBjb250aW51YXMgdmFyaWFibGUgQWdlIG9mIHRoZSBzdXNwZWN0IHN0b3AgYnkgb2ZmaWNlciwgYFNVU1BFQ1RfUkVQT1JURURfQUdFYA0KDQoNCmBgYHtyfQ0KDQptMCA8LSBnbG0oYXJyYXN0ZWQgfiBTVVNQRUNUX1JFUE9SVEVEX0FHRSwgZmFtaWx5ID0gYmlub21pYWwsIGRhdGEgPSBzcSkNCnN1bW1hcnkobTApDQpgYGANCg0KDQpGcm9tICRtXzAkLCB0aGUgY29lZmZpY2llbnQgaXMgcG9zaXRpdmUsc28gd2UgY2FuIHNheSB0aGF0IGFzIHBlb3BsZSBnZXQgb2xkZXIsIGNoYW5jZXMgb2YgdGhlbSBiZWluZyBhcnJlc3RlZCBpbiBjcmVhc2UuIEZyb20gdGhlICRZLWludGVyY2VwdCQsIEkgY2FuIHNheSB0aGF0IHdoZW4gYWdlIGlzIHplcm8sIHRoZSBsb2cgb2RkIG9mIGJlaW5nIGFycmVzdGVkIGlzICQtMS4wMjgyMTEkLiBGcm9tIHRoZSBzbG9wZSB2YWx1ZSwgSSBjYW4gc2F5IHRoYXQgZm9yIGV2ZXJ5IG9uZS11bml0IGluY3JlYXNlIG9mIGFnZSwgdGhlIGxvZyBvZGRzIG9mIGJlaW5nIGFycmVzdGVkIGluY3JlYXNlcyBieSAkMC4wMDU5NDUkLiBGdXJ0aGVybW9yZSwgZnJvbSB0aGUgJFokICR2YWx1ZSQgd2UgY2FuIHNheSB0aGF0IGl0IGlzIG1vcmUgdGhhbiB0d28gc3RhbmRhcmQgZGV2aWF0aW9uIHdheSBmcm9tIHplcm8gdGhlcmVmb3JlIGl0IGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgYW5kIHRoaXMgaXMgY29uZmlybSBieSB0aGUgc21hbGwgJHAtdmFsdWUkLiBUaGVyZWZvcmUsIHN1c3BlY3QgYWdlIGlzIHNpZ25pZmljYW50IGZvciBwcmVkaWN0aW5nIGFycmVzdC4NCg0KDQoNCioqSW1wcm92aW5nIE1vZGVsOioqDQoNCkkgd2lsbCBhZGQgc3VzcGVjdCBnZW5kZXIgYW5kIHJhY2UgaW5mb3JtYXRpb24gdG8gb3VyIHNlY29uZCBtb2RlbCBhbmQgZXhwZWN0IHRvIGZpbmQgc3RhdGlzdGljYWxseSBub3Qgc2lnbmlmaWNhbnQgc2luY2UsIGEgcG9saWNlIG9mZmljZSBhcmUgbm90IGFsbG93IHRvIGNvbnNpZGVyIHJhY2UgYW5kIGdlbmRlciB0byAgYXJyZXN0IHNvbWVvbmUuIA0KDQpgYGB7cn0NCg0KDQptMSA8LSBnbG0oYXJyYXN0ZWQgfiBTVVNQRUNUX1NFWCAgKyBTVVNQRUNUX1JFUE9SVEVEX0FHRSArIFNVU1BFQ1RfUkFDRV9ERVNDUklQVElPTiAsIGZhbWlseSA9IGJpbm9taWFsLCBkYXRhID0gc3EpDQpzdW1tYXJ5KG0xKQ0KYGBgDQoNCg0KV2UgY2FuIHNlZSB0aGF0IGFnZSByZW1haW4gc2lnbmlmaWNhbnQgdmFyaWFibGUuIEhvd2V2ZXIsIHdlIGNhbiBzZWUgb25seSBiZWVuIGxvdGlvbiBoYXZlIHNvbWUgc2lnbmlmaWNhbnQgd2hlbiBjb25lcyBiZWluZyBhcnJlc3RlZCwgYnV0IG5vIG90aGVyIHJhY2UgYW5kIGdlbmRlciBhcmUgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4NCg0KDQoqKkxldHMgQWRkIEludGVyc2VjdGlvbiBhbmQgTW9yZToqKg0KDQoNCkxldCBtZSBhZGQgbW9yZSB2YXJpYWJsZSBhbmQgaW50ZXJzZWN0aW9uIGJldHdlZW4gd2VhcG9uIGZvdW5kIGFuZCBiZWVuIGZyaXNrZWQoc2VhcmNoZWQgZm9yIGRydWcsIHdlYXBvbiBldGMuKQ0KDQoNCmBgYHtyfQ0KDQptMiA8LSBnbG0oYXJyYXN0ZWQgfiBTVVNQRUNUX1NFWCArU1VTUEVDVF9SRVBPUlRFRF9BR0UgKyB3ZWFwb25fZm91bmQqRnJpc2tlZCArU1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OICsgU1VTUEVDVF9IRUlHSFQgK1NVU1BFQ1RfQk9EWV9CVUlMRF9UWVBFLCBmYW1pbHkgPSBiaW5vbWlhbCwgZGF0YSA9IHNxKQ0Kc3VtbWFyeShtMikNCmBgYA0KDQpJIGNhbiBzZWUgdGhhdCB3ZWFwb24sIGZyaXNrZWQgc2lnbmlmaWNhbnQgY29lZmZpY2llbnQgdGhhdCBpcyBleHBlY3RlZCBzaW5jZSBpZiB3ZWFwb24gZm91bmQsIGNoYW5jZSBvZiBnZXR0aW5nIGFycmVzdGVkIGFyZSBoaWdoLiBGdXJ0aGVybW9yZSwgaW50ZXJzZWN0aW9uIG9mIHdlYXBvbiBmb3VuZCBhbmQgZnJpc2sgYW5kIGJvZHkgdHlwZSBhcmUgdmVyeSBpbXBvcnRhbnQgY29lZmZpY2llbnQgYXMgd2VsbC4gVGhlIGFnZSByZW1haW4gc2lnbmlmaWNhbnQsIGFuZCBnZW5kZXIgYmVjb21lIGFuIGltcG9ydGFudCBjb2VmZmljaWVudC4gVGhlcmVmb3JlLCBsb2cgb2RkcyBvZiBiZWVuIGFycmVzdGVkIGNoYW5nZSBiYXNlZCB0aG9zZSBjb2VmZmljaWVudC4gSXQgaXMgaW50ZXJlc3RpbmcgdG8gc2VlIHRoYXQgTWFsZSBoYXMgbmVnYXRpdmUgbG9nIG9kZHMgb2YgYmVlbiBhcnJlc3RlZC4NCg0KDQojIyMqKk1vZGVsIFNlbGVjdGlvbioqDQoNCldlIHdpbGwgdXNlIGxpa2VsaWhvb2QgcmF0aW8gdGVzdCBhbmQgaW5mb3JtYXRpb24gY3JpdGVyaWEgZm9yIG91ciBiZXN0IG1vZGVsIHNlbGVjdGlvbg0KDQoqKkxpa2VsaWhvb2QgUmF0aW8gVGVzdDoqKg0KDQoNCg0KYGBge3J9DQphbm92YShtMCwgbTEsIG0yLCB0ZXN0ID0gIkNoaXNxIikNCmBgYA0KDQpGb3JtIHRoaXMgdGVzdCwgd2UgY2FuIHNlZSB0aGF0IG1vZGVsIDMgd2hpY2ggaXMgJG1fMiQgaGFzIGEgc2lnbmlmaWNhbnRseSBpbXByb3ZlZCBiYXNlZCBvbiB2ZXJ5IHNtYWxsIFAtdmFsdWUuIE5vdyB3ZSB3aWxsIHVzZSBJbmZvcm1hdGlvbiBjcml0ZXJpYSB0byBmaW5kIHdoaWNoIG1vZGVsIGlzIGJldHRlci4NCg0KDQoqKkluZm9ybWF0aW9uIENyaXRlcmlhOioqDQoNCkJheWVzaWFuIGluZm9ybWF0aW9uIGNyaXRlcmlvbiAoQklDKTogJCRCSUMgPSAtMkwgKyBrXHRpbWVzIGxvZyhuKSQkDQoNCkFrYWlrZSBpbmZvcm1hdGlvbiBjcml0ZXJpb24gKEFJQyk6ICQkQUlDID0gMihMLWspJCQNCg0KDQpgYGB7cn0NCmxpYnJhcnkodGV4cmVnKQ0KI2h0bWxyZWcobGlzdChtMCwgbTEsIG0yKSwgZG9jdHlwZSA9IEZBTFNFKQ0KYGBgDQoNCjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgYWxpZ249ImNlbnRlciIgc3R5bGU9ImJvcmRlcjogbm9uZTsiPg0KPGNhcHRpb24gYWxpZ249ImJvdHRvbSIgc3R5bGU9Im1hcmdpbi10b3A6MC4zZW07Ij5TdGF0aXN0aWNhbCBtb2RlbHM8L2NhcHRpb24+DQo8dHI+DQo8dGggc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7IGJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nLXJpZ2h0OiAxMnB4OyI+PGI+PC9iPjwvdGg+DQo8dGggc3R5bGU9InRleHQtYWxpZ246IGxlZnQ7IGJvcmRlci10b3A6IDJweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nLXJpZ2h0OiAxMnB4OyI+PGI+TW9kZWwgMTwvYj48L3RoPg0KPHRoIHN0eWxlPSJ0ZXh0LWFsaWduOiBsZWZ0OyBib3JkZXItdG9wOiAycHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsgcGFkZGluZy1yaWdodDogMTJweDsiPjxiPk1vZGVsIDI8L2I+PC90aD4NCjx0aCBzdHlsZT0idGV4dC1hbGlnbjogbGVmdDsgYm9yZGVyLXRvcDogMnB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmctcmlnaHQ6IDEycHg7Ij48Yj5Nb2RlbCAzPC9iPjwvdGg+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oSW50ZXJjZXB0KTwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPi0xLjAyPHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPioqKjwvc3VwPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPi0wLjk2PHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPioqKjwvc3VwPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPi0xLjI5PHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPioqKjwvc3VwPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wNik8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wOSk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4zNSk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+U1VTUEVDVF9SRVBPUlRFRF9BR0U8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4wLjAxPHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPioqKjwvc3VwPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPjAuMDE8c3VwIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogMHB4OyI+KioqPC9zdXA+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MC4wMTxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKjwvc3VwPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wMCk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wMCk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wMCk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+U1VTUEVDVF9TRVhNQUxFPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+LTAuMTE8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4tMC4yMzxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKjwvc3VwPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wOCk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wOCk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+U1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OTGF0aW5vL090aGVyPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MC4xMTxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qPC9zdXA+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MC4xNDxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKjwvc3VwPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wNSk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wNSk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+U1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OV0hJVEU8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4wLjAwPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MC4wODwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wOCk8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wOCk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+d2VhcG9uX2ZvdW5kPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MS44ODxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKio8L3N1cD48L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+KDAuMjApPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPkZyaXNrZWQ8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4tMC4xODxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKio8L3N1cD48L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+KDAuMDUpPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPlNVU1BFQ1RfSEVJR0hUPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MC4wNjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wNik8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+U1VTUEVDVF9CT0RZX0JVSUxEX1RZUEVTbWFsbDwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPjwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPi0wLjE3PHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPioqKjwvc3VwPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4oMC4wNSk8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+d2VhcG9uX2ZvdW5kOkZyaXNrZWQ8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij48L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4wLjQ3PHN1cCBzdHlsZT0idmVydGljYWwtYWxpZ246IDBweDsiPio8L3N1cD48L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+KDAuMjIpPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9ImJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsiPkFJQzwvdGQ+DQo8dGQgc3R5bGU9ImJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsiPjExOTU2LjE3PC90ZD4NCjx0ZCBzdHlsZT0iYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyI+MTE5NTMuODY8L3RkPg0KPHRkIHN0eWxlPSJib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7Ij4xMTAzNy40NzwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij5CSUM8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4xMTk3MC41NDwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPjExOTg5LjgxPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MTExMDkuMzY8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+TG9nIExpa2VsaWhvb2Q8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4tNTk3Ni4wODwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPi01OTcxLjkzPC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+LTU1MDguNzM8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+RGV2aWFuY2U8L3RkPg0KPHRkIHN0eWxlPSJwYWRkaW5nLXJpZ2h0OiAxMnB4OyBib3JkZXI6IG5vbmU7Ij4xMTk1Mi4xNzwvdGQ+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiPjExOTQzLjg2PC90ZD4NCjx0ZCBzdHlsZT0icGFkZGluZy1yaWdodDogMTJweDsgYm9yZGVyOiBub25lOyI+MTEwMTcuNDc8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsYWNrOyI+TnVtLiBvYnMuPC90ZD4NCjx0ZCBzdHlsZT0iYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIGJsYWNrOyI+OTc4OTwvdGQ+DQo8dGQgc3R5bGU9ImJvcmRlci1ib3R0b206IDJweCBzb2xpZCBibGFjazsiPjk3ODk8L3RkPg0KPHRkIHN0eWxlPSJib3JkZXItYm90dG9tOiAycHggc29saWQgYmxhY2s7Ij45Nzg5PC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgc3R5bGU9InBhZGRpbmctcmlnaHQ6IDEycHg7IGJvcmRlcjogbm9uZTsiIGNvbHNwYW49IjUiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MC44ZW0iPjxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKio8L3N1cD5wICZsdDsgMC4wMDEsIDxzdXAgc3R5bGU9InZlcnRpY2FsLWFsaWduOiAwcHg7Ij4qKjwvc3VwPnAgJmx0OyAwLjAxLCA8c3VwIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjogMHB4OyI+Kjwvc3VwPnAgJmx0OyAwLjA1PC9zcGFuPjwvdGQ+DQo8L3RyPg0KPC90YWJsZT4NCg0KDQoNCkZyb20gYm90aCAkQUlDJCBhbmQgJEJJQyQsIHdlIGNhbiBzZWUgdGhhdCBtb2RlbHMgZ2V0IGJldHRlciBhcyB0aGVpciB2YWx1ZSBkZWNyZWFzZSB3aXRoIG1vcmUgdmFyaWFibGUgYW5kIGNvbXBsZXhpdHkuIFRoZSBiZXN0IHBlcmZvcm1pbmcgbW9kZWwgYmFzZWQgb24gYm90aCBvZiB0aGVzZSBtZXRyaWNzIGlzIE1vZGVsIDMgd2hpY2ggaXMgbW9kZWwgJG1fMiQNCg0KIyMjKipWaXN1YWxpemF0aW9ucyBPdXIgQmVzdCBNb2RlbDoqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1UUlVFfQ0KbGlicmFyeSh2aXNyZWcpDQoNCnZpc3JlZyhtMiwgIlNVU1BFQ1RfUkVQT1JURURfQUdFIixzY2FsZT0icmVzcG9uc2UiLGxpbmU9bGlzdChjb2w9Im1hZ2VudGEyIiksZmlsbD1saXN0KGNvbD0iYnVybHl3b29kMiIpLA0KICAgICAgIHhsYWI9IlN1c3BlY3QgQWdlIikgKyAgdGhlbWVfYncoKQ0KDQpgYGANCg0KDQpXZSBjYW4gc2VlIHRoYXQsIGFzIGFnZSBpbmNyZWFzZSBwcm9iYWJpbGl0eSBvZiBiZWluZyBhcnJlc3RlZCBzbGlnaHRseSBpbmNyZWFzZWQuDQoNCmBgYHtyfQ0KDQp2aXNyZWcobTIsICJTVVNQRUNUX1NFWCIsIGJ5ID0gIndlYXBvbl9mb3VuZCIsIHNjYWxlID0gInJlc3BvbnNlIixsaW5lPWxpc3QoY29sPSJtYWdlbnRhMiIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPWxpc3QoY29sPSJuYXZ5Ymx1ZSIpLCB4bGFiPSJTdXNwZWN0IFNleCIpDQpgYGANCg0KDQoNCg0KRm9yIGFib3ZlLCB3ZSBjYW4gc2VlIHRoYXQgd2hlbiB3ZWFwb24gZm91bmQgYW5kIG5vdCBmb3VuZCwgdGhlIHByb2JhYmlsaXR5IG9mIGdldHRpbmcgYXJyZXN0IGZvciBGZW1hbGUgaXMgc2xpZ2h0bHkgaGlnaC4gVGhpcyBtYXkgZXhwbGFpbiBlYXJsaWVyIHJlc3VsdCB3aGVyZSB3ZSBzYXcgbWFsZSBoYXMgbmVnYXRpdmUgbG9nIG9kZCBvZiBiZWluZyBhcnJlc3RlZC4gVGhpcyByZXN1bHQgc3VycHJpc2UgbWUsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB2ZXJ5IGluc2lnbmlmaWNhbnQgYW5kIGdpdmVuIHRoYXQgbWFsZSBzYW1wbGUgaXMgbGFyZ2VyIHRoYW4gZmVtYWxlIG1heSBjb250cmlidXRlIHRvIHRoaXMgc2xpZ2h0IGRpZmZlcmVudC4NCg0KDQoNCmBgYHtyfQ0KdmlzcmVnKG0yLCAiU1VTUEVDVF9SQUNFX0RFU0NSSVBUSU9OIiwgYnkgPSAiRnJpc2tlZCIsc2NhbGUgPSJyZXNwb25zZSIsbGluZT1saXN0KGNvbD0iZGVlcHBpbmsxIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9bGlzdChjb2w9ImRhcmtjeWFuIiksIHhsYWI9IlN1c3BlY3QgUmFjZSIpDQpgYGANCg0KDQpGcm9tIHRoaXMgcGxvdCwgd2Ugc2VlIHRoYXQgd2hlbiBjb21lcyB0byB3ZWF0aGVyIGRpZmZlcmVudCByYWNlIHdhcyBmcmlza2VkIChzZWFyY2hlZCBmb3IgZHJ1Zywgd2VhcG9uIGV0Yy4pIG9yIG5vdCwgQmxhY2sgcGVvcGxlIGFyZSBsZXNzIGxpa2VseSB0byBnZXQgYXJyZXN0ZWQgY29tcGFyZSB0byB3aGl0ZS5CdXQgdGhleSBhcmUgdGhlIG9uZSBzdG9wIG1vc3QgY29tcGFyZSB0byBvdGhlciByYWNlIGFsbW9zdCAkNTZcJSQgb2Ygc3RvcCB3ZXJlIEJsYWNrLiBUaGVyZWZvcmUsIHdlIG1pZ2h0IHdhbnQgdG8gbG9vayBpbnRvIHRoaXMgbW9yZSB0byBmaW5kIHdlYXRoZXIgdGhlcmUgaXMgYSByYWNpYWwgYmlhcyBleGlzdCBvciBub3QuIExhdGlub3MvIG90aGVyIHJhY2UgaGFzIGhpZ2hlc3QgcHJvYmFiaWxpdHkgb2YgYmVpbmcgYXJyZXN0ZWQgaW4gYm90aCBzY2VuYXJpby4gTWF5IGJlIHRoZXkgdGVuZCB0byBoYXZlIGJ1cmdzIG9yIGlsbGVnYWwgc3Vic3RhbmNlcyBjb21wYXJlIHRvIG90aGVyIGRlbW9ncmFwaHkuDQoNCg0KYGBge3J9DQp2aXNyZWcobTIsICJTVVNQRUNUX0JPRFlfQlVJTERfVFlQRSIsIGJ5ID0gIkZyaXNrZWQiLCBzY2FsZSA9ICJyZXNwb25zZSIsbGluZT1saXN0KGNvbD0iZGFya2dvbGRlbnJvZDEiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1saXN0KGNvbD0iZmlyZWJyaWNrNCIpLCB4bGFiPSJTdXNwZWN0IEJvZHkgVHlwZSIpDQpgYGANCg0KVGhpcyBwbG90IGNsZWFybHkgc2hvdyB0aGF0IHdoZXRoZXIgdGhleSB3ZXJlIGZyaXNrZWQgb3Igbm90IHBlb3BsZSB3aXRoIGJpZyBib2R5IGFyZSBtb3JlIGxpa2VseSB0byBnZXQgYXJyZXN0ZWQuIE1heWJlIGJlY2F1c2Ugb2ZmaWNlIGZlZWwgdGhyZWF0ZW4gYnkgdGhlaXIgYm9keSB0eXBlLg0KDQojIyMqKkNoZWNraW5nIE91ciBNb2RlbCBQZXJmb3JtYW5jZToqKg0KDQpOb3cgbGV0J3MgY2hlY2sgaG93IG91ciBtb2RlbCBhY3R1YWxseSBkaWQgb24gb3VyIGRhdGEuIFRoZXJlZm9yZSwgd2Ugd2lsbCBkcmF3IGEgZ3JhcGggdGhhdCB3aWxsIHNob3cgdGhlIHByZWRpY3RlZCBwcm9iYWJpbGl0aWVzIG9mIGVhY2ggYXJyZXN0IHdpdGggdGhlaXIgYWN0dWFsIGFycmVzdCBzdGF0dXMuDQoNCkZpcnN0LCB3ZSBjcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBwcm9iYWJpbGl0aWVzIG9mIGJlaW5nIGFycmVzdGVkIGFsb25nIHdpdGggYWN0dWFsIGFycmVzdCBzdGF0dXMuVGhlbiB3ZSBzb3J0IHRoZSBkYXRhIGZyYW1lIGZyb20gbG93IHRvIGhpZ2ggcHJvYmFiaWxpdGllcy4gVGhlbiB3ZSBhZGQgYSBuZXcgY29sdW1uIHRvIHRoZSBkYXRhIGZyYW1lIHRoYXQgaGFzIHRoZSBgcmFua2Agb2YgZWFjaCBzYW1wbGUsIGZyb20gbG93IHByb2JhYmlsaXR5IHRvIGhpZ2ggcHJvYmFiaWxpdHkuDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiNDcmVhdGUgYSBuZXcgZGF0YSBmcmFtZSB0aGF0IGNvbnRhaW5zIHRoZSBwcm9iYWJpbGl0aWVzIG9mIGJlaW5nIGFycmVzdGVkIGFsb25nIHdpdGggYWN0dWFsIGFycmVzdCBzdGF0dXMNCnByZWRfZGF0YTwtZGF0YS5mcmFtZSggcHJlZGljdF9vZl9hcnJlc3RlZCA9IG0yJGZpdHRlZC52YWx1ZXMsIEFycmVzdGVkID0gc3EkU1VTUEVDVF9BUlJFU1RFRF9GTEFHKQ0KDQojU29ydCB0aGUgZGF0YSBmcmFtZSBmcm9tIGxvdyB0byBoaWdoIHByb2JhYmlsaXRpZXMNCnByZWRfZGF0YSA8LSBwcmVkX2RhdGFbb3JkZXIocHJlZF9kYXRhJHByZWRpY3Rfb2ZfYXJyZXN0ZWQsZGVjcmVhc2luZyA9IEZBTFNFKSxdDQoNCiNhZGQgYSBuZXcgY29sdW1uIHRvIHRoZSBkYXRhIGZyYW1lIHRoYXQgaGFzIHRoZSBgcmFua2Agb2YgZWFjaCBzYW1wbGUNCnByZWRfZGF0YSRyYW5rIDwtIDE6bnJvdyhwcmVkX2RhdGEpDQoNCg0KZ2dwbG90KGRhdGE9IHByZWRfZGF0YSxhZXMoeD1yYW5rLHk9cHJlZGljdF9vZl9hcnJlc3RlZCkpKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvciA9QXJyZXN0ZWQpLGFscGhhID0xLHNoYXBlPTUsIHN0cm9rZSA9MikrDQogIHhsYWIoIkluZGV4IikgKyB5bGFiKCJQcm9iYWJpbGl0eSBvZiBHZXR0aW5nIEFycmVzdGVkIikgK3RoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KDQoNCkZyb20gb3VyIGdyYXBoLCB3ZSBjYW4gc2VlIHRoYXQgbW9zdCBvZiB0aGUgcGVvcGxlIGhvdyBnb3QgYXJyZXN0ZWQgKG9uZSBpbiB0dXJxdW9pc2UvYmx1ZSkgYXJlIHByZWRpY3RlZCB0byBoYXZlIGEgaGlnaCBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIGFycmVzdC4gT3RoZXIgaGFuZCwgbW9zdCBvZiB0aGUgcGVvcGxlIGhvdyBkaWQgbm90IGdldCBhcnJlc3RlZCAodGhlIG9uZXMgaW4gcmVkL3NhbG1vbikgYXJlIHByZWRpY3RlZCB0byBoYXZlIGxvdyBwcm9iYWJpbGl0eSBvZiBnZXR0aW5nIGFycmVzdGVkLg0KDQpXaGljaCBtZWFuIG91ciBtb2RlIGRpZCBhIGRlY2VudCBqb2Igb2YgcHJlZGljdGluZyBhcnJlc3QuIEhvd2V2ZXIsaXQgaXMgbm90IHBlcmZlY3QuIFdlIGNhbiBzZWUgdGhhdCBzb21lIG9mIHBlb3BsZSBob3cgd2VyZSBub3QgYXJyZXN0ZWQgYXJlIHNob3duIGhpZ2ggcHJvYmFiaWxpdHkgb2YgYmVpbmcgYXJyZXN0ZWQocmVkL3NhbG1vbiBjb2xvciBpbiB0b3ApLiBJbiBmdXR1cmUgd2UgbWlnaHQgd2FudCB0byBhZGQgbW9yZSB2YXJpYWJsZSBsaWtlIG5laWdoYm9yaG9vZCBpbiBvdXIgbW9kZWwgc2luY2UgcG9saWNlIHN0b3AgdXN1YWxseSBjb252ZXJ0IHRvIGFycmVzdCBpbiBoaWdoIGNyaW1lIGFyZWEgbW9yZSBmcmVxdWVudGx5LiBJbiBhZGRpdGlvbixpbiBmdXR1cmUgd2UgbWlnaHQgd2FudCB0byBzcGxpdCBvdXIgZGF0YSB0byB0ZXN0IGFuZCB0cmFpbiBkYXRhIHNldCB0byBhY3R1YWxseSB0ZXN0IG91ciBtb2RlbCB0byBhIGRhdGFzZXQgaXQgbmV2ZXIgc2F3Lg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=