Introduction

I am using the same dataset as last homework, which I found on kaggle, and is based on a survey about people’s opinions on gun control. The topic for this week is about support for more extensive background checks for potential gun buyers. There have been many discussions about having more extensive background checks for potential gun buyers, as this is currently a popular topic in the current political climate https://www.nraila.org/get-the-facts/background-checks-nics/.

I am interested in seeing the relationship between support for more extensive background checks on gun buyers (dependent binary variable), ones’ age group, gender, support for restrictions on who can buy a gun, and political affiliation (all independent variables). Since I personally feel that factors such as political affiliation and gender are very important when looking at surveys about the second amendment, I will be looking at them again.

#Loading the dataset
library(texreg)
library(tidyr)
library(list)
library(corpcor)
library(tidyverse)
library(knitr)
library (Zelig)
library(readr)
gun_control <- read_csv("C:/Users/abbys/Downloads/gun_control.csv")
Parsed with column specification:
cols(
  gender = col_character(),
  age = col_character(),
  region = col_character(),
  political_affiliation = col_character(),
  `should_background_checks_on_gun_buyers_be_more_extensive<U+613C><U+3E30>` = col_character(),
  should_there_be_more_restrictions_on_who_can_buy_a_gun = col_character(),
  will_further_gun_control_reduce_the_possibilities_of_mass_shootings = col_character(),
  `should_civilians_be_allowed_to_own_guns<U+613C><U+3E30>` = col_character()
)
head(gun_control)

Changing the names of 2 long variable names. background_checks is my dependent binary variable.

guncontrol2=gun_control %>% 
  rename(`more_restrictions`=`should_there_be_more_restrictions_on_who_can_buy_a_gun`,
         `background_checks`=`should_background_checks_on_gun_buyers_be_more_extensive `)%>% 
   mutate(background_checks = sjmisc::rec(background_checks, rec = "No=0; Yes=1"))
head(guncontrol2)

Recoding 2 independent variables, age and political_affiliation, to condense categories for analysis.

guncontrol2$age=recode(guncontrol2$age,"17 or younger"="Under 18", "18 to 24 years"="Young Adult", "25 to 34 years"="Young Adult", "35 to 44 years"="Adult/Middle Aged", "45 to 54 years"="Adult/Middle Aged", "55 to 64 years"="Adult/Middle Aged", "65 years and over"="Senior Citizen")
guncontrol2$political_affiliation=recode(guncontrol2$political_affiliation,"Green Party"="Liberals","Democratic Party"="Liberals", "Republican Party"="Conservatives","Constitution Party"="Conservatives")
head(guncontrol2)

Regression models

Model 1:

Starting with the age variable.

glm1<-glm(background_checks ~ age,data = guncontrol2,family="binomial")
summary(glm1)

Call:
glm(formula = background_checks ~ age, family = "binomial", data = guncontrol2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.1184   0.4735   0.4735   0.5448   0.5448  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)         1.8326     0.1795  10.209   <2e-16 ***
ageSenior Citizen  15.7335   907.6100   0.017    0.986    
ageUnder 18         0.1133     0.7769   0.146    0.884    
ageYoung Adult      0.2990     0.2687   1.113    0.266    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 406.15  on 559  degrees of freedom
Residual deviance: 400.05  on 556  degrees of freedom
AIC: 408.05

Number of Fisher Scoring iterations: 16

Model 1: Intercept: when age=middle aged (ie when age=0, absorbed by the intercept), middle aged people have a log odds of supporting background checks of 1.8326. The other age variables (slopes) are not statistically significant.

Model 2

Adding the variables gender and political_affiliation to the model.

glm2<-glm(background_checks ~ age+political_affiliation+gender,data = guncontrol2,family = "binomial")
summary(glm2)

Call:
glm(formula = background_checks ~ age + political_affiliation + 
    gender, family = "binomial", data = guncontrol2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.4281   0.3283   0.4355   0.5288   0.8767  

Coefficients:
                                       Estimate Std. Error z value Pr(>|z|)    
(Intercept)                              1.8969     0.2876   6.595 4.26e-11 ***
ageSenior Citizen                       15.7304   894.2276   0.018   0.9860    
ageUnder 18                              0.2001     0.7877   0.254   0.7995    
ageYoung Adult                           0.3604     0.2773   1.300   0.1936    
political_affiliationLiberals            0.6367     0.2935   2.169   0.0301 *  
political_affiliationLibertarian Party  -0.5527     0.3910  -1.413   0.1575    
genderMale                              -0.5863     0.2805  -2.090   0.0366 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 406.15  on 559  degrees of freedom
Residual deviance: 384.18  on 553  degrees of freedom
AIC: 398.18

Number of Fisher Scoring iterations: 16

Model 2: Age does not seem to be statistically significant except for the intercept. However, adding political affiliation and gender are.

Liberals have higher log odds of supporting extensive background checks than other political ideologies by .6367. Compared to females, males have a decreased log odds for supporting extensive background checks by .5863.

Model 3

Adding more_restrictions variable to the model, and adding an interaction between more_restrictions and gender

glm3<-glm(background_checks ~  age+political_affiliation+more_restrictions*gender,data =guncontrol2,family = "binomial")
summary(glm3)

Call:
glm(formula = background_checks ~ age + political_affiliation + 
    more_restrictions * gender, family = "binomial", data = guncontrol2)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.7816   0.2216   0.2562   0.2998   1.6703  

Coefficients:
                                       Estimate Std. Error z value Pr(>|z|)    
(Intercept)                             -0.8565     0.5044  -1.698   0.0895 .  
ageSenior Citizen                       15.6114   831.0393   0.019   0.9850    
ageUnder 18                              0.9851     0.9784   1.007   0.3140    
ageYoung Adult                           0.2943     0.3557   0.827   0.4081    
political_affiliationLiberals           -0.1529     0.3931  -0.389   0.6972    
political_affiliationLibertarian Party  -0.7132     0.5301  -1.345   0.1785    
more_restrictionsYes                     4.4097     0.5990   7.362 1.82e-13 ***
genderMale                               0.4597     0.5493   0.837   0.4027    
more_restrictionsYes:genderMale         -1.0744     0.7312  -1.469   0.1418    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 406.15  on 559  degrees of freedom
Residual deviance: 248.71  on 551  degrees of freedom
AIC: 266.71

Number of Fisher Scoring iterations: 16

Model 3: For the 3rd model, gender and political affiliation are no longer statistically significant, and neither is the new interaction term. The only statistically significant terms are the intercept but only at the .1 level, and more_restictionsYes.

Those who support more restrictions on who can buy a gun have an increase in log odds by 4.410 of supporting more extensive background checks for gun purchasers compared to those who do not support more restrictions on who can buy a gun.

more_restrictionsYes:genderMale: Males who support more restrictions on who can buy a gun have a decrease in log odds by 1.074 of supporting more extensive background checks for gun purchasers compared to females, (which is not statistically significant).

Table

The best fit model is Model 3 due to the AIC and BIC being the lowest.

library(texreg)
htmlreg(list(glm1, glm2, glm3), caption = "", digits = 3)
Model 1 Model 2 Model 3
(Intercept) 1.833*** 1.897*** -0.857
(0.180) (0.288) (0.504)
ageSenior Citizen 15.733 15.730 15.611
(907.610) (894.228) (831.039)
ageUnder 18 0.113 0.200 0.985
(0.777) (0.788) (0.978)
ageYoung Adult 0.299 0.360 0.294
(0.269) (0.277) (0.356)
political_affiliationLiberals 0.637* -0.153
(0.294) (0.393)
political_affiliationLibertarian Party -0.553 -0.713
(0.391) (0.530)
genderMale -0.586* 0.460
(0.280) (0.549)
more_restrictionsYes 4.410***
(0.599)
more_restrictionsYes:genderMale -1.074
(0.731)
AIC 408.047 398.182 266.712
BIC 425.359 428.477 305.663
Log Likelihood -200.023 -192.091 -124.356
Deviance 400.047 384.182 248.712
Num. obs. 560 560 560
p < 0.001, p < 0.01, p < 0.05

Likelihood Ratio Test-Anova

The anova test shows that the best model is Model 3, having the lowest p value of < 2.2e-16.

anova(glm1, glm2,glm3, test = "Chisq")
Analysis of Deviance Table

Model 1: background_checks ~ age
Model 2: background_checks ~ age + political_affiliation + gender
Model 3: background_checks ~ age + political_affiliation + more_restrictions * 
    gender
  Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
1       556     400.05                          
2       553     384.18  3   15.865  0.001208 ** 
3       551     248.71  2  135.470 < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Visualizations of Model 3 (Best Model) using Visreg:

Although not statistically significant, I am showing a visualization of the interaction between gender and supporting more restrictions on who can buy a gun. Compared to males that support more restrictions on who can buy a gun, females that support more restrictions are more likely to support more extensive background checks on gun buyers, but only by a little bit, which supports my interpretation of the interaction in model 3, which is what I found in my interpretation above.

However, males that do not support more restrictions on who can buy a gun are more likely to support more extensive background checks than females who also do not support more restrictions on who can buy a gun.

visreg::visreg(glm3,"more_restrictions",by = "gender",scale = 'response')

Something interesting to look at: when looking at more restrictions on who can buy a gun by age, senior citizens have the most support for background checks regardless of whether they support or do not support more restrictions. People under 18, young adults, and adults/middle aged people who support more restrictions on buying a gun are more likely to support background checks than people who do not support more gun restrictions, with those under age 18 being more likely to support background checks than young adults and adults/middle aged people who say don’t support more restrictions.

library(visreg)
visreg(glm3,"more_restrictions", by = "age",scale = 'response')

Looking at political affiliation by age in the 3rd model, senior citizens support background checks across all 3 political ideologies. Conservatives and liberals within the other age groups are slightly more likely to support background checks than libertarians.

library(visreg)
visreg(glm3,"political_affiliation", by = "age",scale = 'response')

Just to take a look at more_restrictions alone since it is statistically significant in model 3, I see that those who support more restrictions on who can buy a gun are more likely to support extensive background checks than those who do not support more restrictions, which supports my interpretation above.

visreg::visreg(glm3,"more_restrictions",scale = 'response')
  Note that you are attempting to plot a 'main effect' in a model that contains an
  interaction.  This is potentially misleading; you may wish to consider using the 'by'
  argument.
Conditions used in construction of plot
age: Young Adult
political_affiliation: Liberals
gender: Male

LS0tDQp0aXRsZTogIkhXIDUgLSBJbnRlcmFjdGlvbnMiDQphdXRob3I6ICJBYmlnYWlsIFN0cmljayINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQojIyNJbnRyb2R1Y3Rpb24NCkkgYW0gdXNpbmcgdGhlIHNhbWUgZGF0YXNldCBhcyBsYXN0IGhvbWV3b3JrLCB3aGljaCBJIGZvdW5kIG9uIGthZ2dsZSwgYW5kIGlzIGJhc2VkIG9uIGEgc3VydmV5IGFib3V0IHBlb3BsZSdzIG9waW5pb25zIG9uIGd1biBjb250cm9sLiBUaGUgdG9waWMgZm9yIHRoaXMgd2VlayBpcyBhYm91dCBzdXBwb3J0IGZvciBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyBmb3IgcG90ZW50aWFsIGd1biBidXllcnMuIFRoZXJlIGhhdmUgYmVlbiBtYW55IGRpc2N1c3Npb25zIGFib3V0IGhhdmluZyBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyBmb3IgcG90ZW50aWFsIGd1biBidXllcnMsIGFzIHRoaXMgaXMgY3VycmVudGx5IGEgcG9wdWxhciB0b3BpYyBpbiB0aGUgY3VycmVudCBwb2xpdGljYWwgY2xpbWF0ZSBodHRwczovL3d3dy5ucmFpbGEub3JnL2dldC10aGUtZmFjdHMvYmFja2dyb3VuZC1jaGVja3Mtbmljcy8uIA0KDQpJIGFtIGludGVyZXN0ZWQgaW4gc2VlaW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBzdXBwb3J0IGZvciBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyBvbiBndW4gYnV5ZXJzIChkZXBlbmRlbnQgYmluYXJ5IHZhcmlhYmxlKSwgb25lcycgYWdlIGdyb3VwLCBnZW5kZXIsIHN1cHBvcnQgZm9yIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biwgYW5kIHBvbGl0aWNhbCBhZmZpbGlhdGlvbiAoYWxsIGluZGVwZW5kZW50IHZhcmlhYmxlcykuIFNpbmNlIEkgcGVyc29uYWxseSBmZWVsIHRoYXQgZmFjdG9ycyBzdWNoIGFzIHBvbGl0aWNhbCBhZmZpbGlhdGlvbiBhbmQgZ2VuZGVyIGFyZSB2ZXJ5IGltcG9ydGFudCB3aGVuIGxvb2tpbmcgYXQgc3VydmV5cyBhYm91dCB0aGUgc2Vjb25kIGFtZW5kbWVudCwgSSB3aWxsIGJlIGxvb2tpbmcgYXQgdGhlbSBhZ2Fpbi4gDQoNCg0KYGBge3J9DQojTG9hZGluZyB0aGUgZGF0YXNldA0KbGlicmFyeSh0ZXhyZWcpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShsaXN0KQ0KbGlicmFyeShjb3JwY29yKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KGtuaXRyKQ0KbGlicmFyeSAoWmVsaWcpDQpsaWJyYXJ5KHJlYWRyKQ0KZ3VuX2NvbnRyb2wgPC0gcmVhZF9jc3YoIkM6L1VzZXJzL2FiYnlzL0Rvd25sb2Fkcy9ndW5fY29udHJvbC5jc3YiKQ0KaGVhZChndW5fY29udHJvbCkNCmBgYA0KIyMjQ2hhbmdpbmcgdGhlIG5hbWVzIG9mIDIgbG9uZyB2YXJpYWJsZSBuYW1lcy4gYmFja2dyb3VuZF9jaGVja3MgaXMgbXkgZGVwZW5kZW50IGJpbmFyeSB2YXJpYWJsZS4NCmBgYHtyfQ0KZ3VuY29udHJvbDI9Z3VuX2NvbnRyb2wgJT4lIA0KICByZW5hbWUoYG1vcmVfcmVzdHJpY3Rpb25zYD1gc2hvdWxkX3RoZXJlX2JlX21vcmVfcmVzdHJpY3Rpb25zX29uX3dob19jYW5fYnV5X2FfZ3VuYCwNCiAgICAgICAgIGBiYWNrZ3JvdW5kX2NoZWNrc2A9YHNob3VsZF9iYWNrZ3JvdW5kX2NoZWNrc19vbl9ndW5fYnV5ZXJzX2JlX21vcmVfZXh0ZW5zaXZloGApJT4lIA0KICAgbXV0YXRlKGJhY2tncm91bmRfY2hlY2tzID0gc2ptaXNjOjpyZWMoYmFja2dyb3VuZF9jaGVja3MsIHJlYyA9ICJObz0wOyBZZXM9MSIpKQ0KDQpoZWFkKGd1bmNvbnRyb2wyKQ0KYGBgDQojIyNSZWNvZGluZyAyIGluZGVwZW5kZW50IHZhcmlhYmxlcywgYWdlIGFuZCBwb2xpdGljYWxfYWZmaWxpYXRpb24sIHRvIGNvbmRlbnNlIGNhdGVnb3JpZXMgZm9yIGFuYWx5c2lzLg0KYGBge3J9DQpndW5jb250cm9sMiRhZ2U9cmVjb2RlKGd1bmNvbnRyb2wyJGFnZSwiMTcgb3IgeW91bmdlciI9IlVuZGVyIDE4IiwgIjE4IHRvIDI0IHllYXJzIj0iWW91bmcgQWR1bHQiLCAiMjUgdG8gMzQgeWVhcnMiPSJZb3VuZyBBZHVsdCIsICIzNSB0byA0NCB5ZWFycyI9IkFkdWx0L01pZGRsZSBBZ2VkIiwgIjQ1IHRvIDU0IHllYXJzIj0iQWR1bHQvTWlkZGxlIEFnZWQiLCAiNTUgdG8gNjQgeWVhcnMiPSJBZHVsdC9NaWRkbGUgQWdlZCIsICI2NSB5ZWFycyBhbmQgb3ZlciI9IlNlbmlvciBDaXRpemVuIikNCg0KZ3VuY29udHJvbDIkcG9saXRpY2FsX2FmZmlsaWF0aW9uPXJlY29kZShndW5jb250cm9sMiRwb2xpdGljYWxfYWZmaWxpYXRpb24sIkdyZWVuIFBhcnR5Ij0iTGliZXJhbHMiLCJEZW1vY3JhdGljIFBhcnR5Ij0iTGliZXJhbHMiLCAiUmVwdWJsaWNhbiBQYXJ0eSI9IkNvbnNlcnZhdGl2ZXMiLCJDb25zdGl0dXRpb24gUGFydHkiPSJDb25zZXJ2YXRpdmVzIikNCg0KaGVhZChndW5jb250cm9sMikNCmBgYA0KIyNSZWdyZXNzaW9uIG1vZGVscw0KDQojIyNNb2RlbCAxOg0KU3RhcnRpbmcgd2l0aCB0aGUgYWdlIHZhcmlhYmxlLg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCmdsbTE8LWdsbShiYWNrZ3JvdW5kX2NoZWNrcyB+IGFnZSxkYXRhID0gZ3VuY29udHJvbDIsZmFtaWx5PSJiaW5vbWlhbCIpDQpzdW1tYXJ5KGdsbTEpDQpgYGANCk1vZGVsIDE6DQpJbnRlcmNlcHQ6IHdoZW4gYWdlPW1pZGRsZSBhZ2VkIChpZSB3aGVuIGFnZT0wLCBhYnNvcmJlZCBieSB0aGUgaW50ZXJjZXB0KSwgbWlkZGxlIGFnZWQgcGVvcGxlIGhhdmUgYSBsb2cgb2RkcyBvZiBzdXBwb3J0aW5nIGJhY2tncm91bmQgY2hlY2tzIG9mIDEuODMyNi4gVGhlIG90aGVyIGFnZSB2YXJpYWJsZXMgKHNsb3BlcykgYXJlIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50Lg0KDQojIyNNb2RlbCAyDQpBZGRpbmcgdGhlIHZhcmlhYmxlcyBnZW5kZXIgYW5kIHBvbGl0aWNhbF9hZmZpbGlhdGlvbiB0byB0aGUgbW9kZWwuDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZ2xtMjwtZ2xtKGJhY2tncm91bmRfY2hlY2tzIH4gYWdlK3BvbGl0aWNhbF9hZmZpbGlhdGlvbitnZW5kZXIsZGF0YSA9IGd1bmNvbnRyb2wyLGZhbWlseSA9ICJiaW5vbWlhbCIpDQpzdW1tYXJ5KGdsbTIpDQpgYGANCk1vZGVsIDI6DQpBZ2UgZG9lcyBub3Qgc2VlbSB0byBiZSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IGV4Y2VwdCBmb3IgdGhlIGludGVyY2VwdC4gSG93ZXZlciwgYWRkaW5nIHBvbGl0aWNhbCBhZmZpbGlhdGlvbiBhbmQgZ2VuZGVyIGFyZS4gDQoNCkxpYmVyYWxzIGhhdmUgaGlnaGVyIGxvZyBvZGRzIG9mIHN1cHBvcnRpbmcgZXh0ZW5zaXZlIGJhY2tncm91bmQgY2hlY2tzIHRoYW4gb3RoZXIgcG9saXRpY2FsIGlkZW9sb2dpZXMgYnkgLjYzNjcuIENvbXBhcmVkIHRvIGZlbWFsZXMsIG1hbGVzIGhhdmUgYSBkZWNyZWFzZWQgbG9nIG9kZHMgZm9yIHN1cHBvcnRpbmcgZXh0ZW5zaXZlIGJhY2tncm91bmQgY2hlY2tzDQpieSAuNTg2My4NCg0KIyMjTW9kZWwgMw0KQWRkaW5nIG1vcmVfcmVzdHJpY3Rpb25zIHZhcmlhYmxlIHRvIHRoZSBtb2RlbCwgYW5kIGFkZGluZyBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIG1vcmVfcmVzdHJpY3Rpb25zIGFuZCBnZW5kZXINCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpnbG0zPC1nbG0oYmFja2dyb3VuZF9jaGVja3MgfiAgYWdlK3BvbGl0aWNhbF9hZmZpbGlhdGlvbittb3JlX3Jlc3RyaWN0aW9ucypnZW5kZXIsZGF0YSA9Z3VuY29udHJvbDIsZmFtaWx5ID0gImJpbm9taWFsIikNCnN1bW1hcnkoZ2xtMykNCmBgYA0KDQpNb2RlbCAzOg0KRm9yIHRoZSAzcmQgbW9kZWwsIGdlbmRlciBhbmQgcG9saXRpY2FsIGFmZmlsaWF0aW9uIGFyZSBubyBsb25nZXIgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCwgYW5kIG5laXRoZXIgaXMgdGhlIG5ldyBpbnRlcmFjdGlvbiB0ZXJtLiBUaGUgb25seSBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50IHRlcm1zIGFyZSB0aGUgaW50ZXJjZXB0IGJ1dCBvbmx5IGF0IHRoZSAuMSBsZXZlbCwgYW5kIG1vcmVfcmVzdGljdGlvbnNZZXMuDQoNClRob3NlIHdobyBzdXBwb3J0IG1vcmUgcmVzdHJpY3Rpb25zIG9uIHdobyBjYW4gYnV5IGEgZ3VuIGhhdmUgYW4gaW5jcmVhc2UgaW4gbG9nIG9kZHMgYnkgNC40MTAgb2Ygc3VwcG9ydGluZyBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyBmb3IgZ3VuIHB1cmNoYXNlcnMgY29tcGFyZWQgdG8gdGhvc2Ugd2hvIGRvIG5vdCBzdXBwb3J0IG1vcmUgcmVzdHJpY3Rpb25zIG9uIHdobyBjYW4gYnV5IGEgZ3VuLg0KDQptb3JlX3Jlc3RyaWN0aW9uc1llczpnZW5kZXJNYWxlOiBNYWxlcyB3aG8gc3VwcG9ydCBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biBoYXZlIGEgZGVjcmVhc2UgaW4gbG9nIG9kZHMgYnkgMS4wNzQgb2Ygc3VwcG9ydGluZyBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyBmb3IgZ3VuIHB1cmNoYXNlcnMgY29tcGFyZWQgdG8gZmVtYWxlcywgKHdoaWNoIGlzIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50KS4NCg0KIyNUYWJsZQ0KVGhlIGJlc3QgZml0IG1vZGVsIGlzIE1vZGVsIDMgZHVlIHRvIHRoZSBBSUMgYW5kIEJJQyBiZWluZyB0aGUgbG93ZXN0Lg0KYGBge3IsIHJlc3VsdHM9J2FzaXMnfQ0KbGlicmFyeSh0ZXhyZWcpDQpodG1scmVnKGxpc3QoZ2xtMSwgZ2xtMiwgZ2xtMyksIGNhcHRpb24gPSAiIiwgZGlnaXRzID0gMykNCmBgYA0KIyMjTGlrZWxpaG9vZCBSYXRpbyBUZXN0LUFub3ZhDQpUaGUgYW5vdmEgdGVzdCBzaG93cyB0aGF0IHRoZSBiZXN0IG1vZGVsIGlzIE1vZGVsIDMsIGhhdmluZyB0aGUgbG93ZXN0IHAgdmFsdWUgb2YgPCAyLjJlLTE2Lg0KYGBge3J9DQphbm92YShnbG0xLCBnbG0yLGdsbTMsIHRlc3QgPSAiQ2hpc3EiKQ0KYGBgDQojI1Zpc3VhbGl6YXRpb25zIG9mIE1vZGVsIDMgKEJlc3QgTW9kZWwpIHVzaW5nIFZpc3JlZzoNCkFsdGhvdWdoIG5vdCBzdGF0aXN0aWNhbGx5IHNpZ25pZmljYW50LCBJIGFtIHNob3dpbmcgYSB2aXN1YWxpemF0aW9uIG9mIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIGdlbmRlciBhbmQgc3VwcG9ydGluZyBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1bi4NCkNvbXBhcmVkIHRvIG1hbGVzIHRoYXQgc3VwcG9ydCBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biwgZmVtYWxlcyB0aGF0IHN1cHBvcnQgbW9yZSByZXN0cmljdGlvbnMgYXJlIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgbW9yZSBleHRlbnNpdmUgYmFja2dyb3VuZCBjaGVja3Mgb24gZ3VuIGJ1eWVycywgYnV0IG9ubHkgYnkgYSBsaXR0bGUgYml0LCB3aGljaCBzdXBwb3J0cyBteSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgaW50ZXJhY3Rpb24gaW4gbW9kZWwgMywgd2hpY2ggaXMgd2hhdCBJIGZvdW5kIGluIG15IGludGVycHJldGF0aW9uIGFib3ZlLiANCg0KSG93ZXZlciwgbWFsZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biBhcmUgbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBtb3JlIGV4dGVuc2l2ZSBiYWNrZ3JvdW5kIGNoZWNrcyB0aGFuIGZlbWFsZXMgd2hvIGFsc28gZG8gbm90IHN1cHBvcnQgbW9yZSByZXN0cmljdGlvbnMgb24gd2hvIGNhbiBidXkgYSBndW4uDQpgYGB7cn0NCnZpc3JlZzo6dmlzcmVnKGdsbTMsIm1vcmVfcmVzdHJpY3Rpb25zIixieSA9ICJnZW5kZXIiLHNjYWxlID0gJ3Jlc3BvbnNlJykNCmBgYA0KU29tZXRoaW5nIGludGVyZXN0aW5nIHRvIGxvb2sgYXQ6IHdoZW4gbG9va2luZyBhdCBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biBieSBhZ2UsIHNlbmlvciBjaXRpemVucyBoYXZlIHRoZSBtb3N0IHN1cHBvcnQgZm9yIGJhY2tncm91bmQgY2hlY2tzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IHN1cHBvcnQgb3IgZG8gbm90IHN1cHBvcnQgbW9yZSByZXN0cmljdGlvbnMuIFBlb3BsZSB1bmRlciAxOCwgeW91bmcgYWR1bHRzLCBhbmQgYWR1bHRzL21pZGRsZSBhZ2VkIHBlb3BsZSB3aG8gc3VwcG9ydCBtb3JlIHJlc3RyaWN0aW9ucyBvbiBidXlpbmcgYSBndW4gYXJlIG1vcmUgbGlrZWx5IHRvIHN1cHBvcnQgYmFja2dyb3VuZCBjaGVja3MgdGhhbiBwZW9wbGUgd2hvIGRvIG5vdCBzdXBwb3J0IG1vcmUgZ3VuIHJlc3RyaWN0aW9ucywgd2l0aCB0aG9zZSB1bmRlciBhZ2UgMTggYmVpbmcgbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBiYWNrZ3JvdW5kIGNoZWNrcyB0aGFuIHlvdW5nIGFkdWx0cyBhbmQgYWR1bHRzL21pZGRsZSBhZ2VkIHBlb3BsZSB3aG8gc2F5IGRvbid0IHN1cHBvcnQgbW9yZSByZXN0cmljdGlvbnMuDQpgYGB7cn0NCmxpYnJhcnkodmlzcmVnKQ0KdmlzcmVnKGdsbTMsIm1vcmVfcmVzdHJpY3Rpb25zIiwgYnkgPSAiYWdlIixzY2FsZSA9ICdyZXNwb25zZScpDQpgYGANCkxvb2tpbmcgYXQgcG9saXRpY2FsIGFmZmlsaWF0aW9uIGJ5IGFnZSBpbiB0aGUgM3JkIG1vZGVsLCBzZW5pb3IgY2l0aXplbnMgc3VwcG9ydCBiYWNrZ3JvdW5kIGNoZWNrcyBhY3Jvc3MgYWxsIDMgcG9saXRpY2FsIGlkZW9sb2dpZXMuIENvbnNlcnZhdGl2ZXMgYW5kIGxpYmVyYWxzIHdpdGhpbiB0aGUgb3RoZXIgYWdlIGdyb3VwcyBhcmUgc2xpZ2h0bHkgbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBiYWNrZ3JvdW5kIGNoZWNrcyB0aGFuIGxpYmVydGFyaWFucy4gDQpgYGB7cn0NCmxpYnJhcnkodmlzcmVnKQ0KdmlzcmVnKGdsbTMsInBvbGl0aWNhbF9hZmZpbGlhdGlvbiIsIGJ5ID0gImFnZSIsc2NhbGUgPSAncmVzcG9uc2UnKQ0KYGBgDQpKdXN0IHRvIHRha2UgYSBsb29rIGF0IG1vcmVfcmVzdHJpY3Rpb25zIGFsb25lIHNpbmNlIGl0IGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaW4gbW9kZWwgMywgSSBzZWUgdGhhdCB0aG9zZSB3aG8gc3VwcG9ydCBtb3JlIHJlc3RyaWN0aW9ucyBvbiB3aG8gY2FuIGJ1eSBhIGd1biBhcmUgbW9yZSBsaWtlbHkgdG8gc3VwcG9ydCBleHRlbnNpdmUgYmFja2dyb3VuZCBjaGVja3MgdGhhbiB0aG9zZSB3aG8gZG8gbm90IHN1cHBvcnQgbW9yZSByZXN0cmljdGlvbnMsIHdoaWNoIHN1cHBvcnRzIG15IGludGVycHJldGF0aW9uIGFib3ZlLg0KDQpgYGB7cn0NCnZpc3JlZzo6dmlzcmVnKGdsbTMsIm1vcmVfcmVzdHJpY3Rpb25zIixzY2FsZSA9ICdyZXNwb25zZScpDQpgYGANCg0KDQo=