library(tidyverse)
library(openintro)
library(statsr)
## Warning: package 'statsr' was built under R version 4.0.3

Exercise 1

What are the dimensions of the data set?

1458 rows by 123 columns

arbuthnot$girls
##  [1] 4683 4457 4102 4590 4839 4820 4928 4605 4457 4952 4784 5332 5200 4910 4617
## [16] 3997 3919 3395 3536 3181 2746 2722 2840 2908 2959 3179 3349 3382 3289 3013
## [31] 2781 3247 4107 4803 4881 5681 4858 4319 5322 5560 5829 5719 6061 6120 5822
## [46] 5738 5717 5847 6203 6033 6041 6299 6533 6744 7158 7127 7246 7119 7214 7101
## [61] 7167 7302 7392 7316 7483 6647 6713 7229 7767 7626 7452 7061 7514 7656 7683
## [76] 5738 7779 7417 7687 7623 7380 7288
hfi
## # A tibble: 1,458 x 123
##     year ISO_code countries region pf_rol_procedur~ pf_rol_civil pf_rol_criminal
##    <dbl> <chr>    <chr>     <chr>             <dbl>        <dbl>           <dbl>
##  1  2016 ALB      Albania   Easte~             6.66         4.55            4.67
##  2  2016 DZA      Algeria   Middl~            NA           NA              NA   
##  3  2016 AGO      Angola    Sub-S~            NA           NA              NA   
##  4  2016 ARG      Argentina Latin~             7.10         5.79            4.34
##  5  2016 ARM      Armenia   Cauca~            NA           NA              NA   
##  6  2016 AUS      Australia Ocean~             8.44         7.53            7.36
##  7  2016 AUT      Austria   Weste~             8.97         7.87            7.67
##  8  2016 AZE      Azerbaij~ Cauca~            NA           NA              NA   
##  9  2016 BHS      Bahamas   Latin~             6.93         6.01            6.26
## 10  2016 BHR      Bahrain   Middl~            NA           NA              NA   
## # ... with 1,448 more rows, and 116 more variables: pf_rol <dbl>,
## #   pf_ss_homicide <dbl>, pf_ss_disappearances_disap <dbl>,
## #   pf_ss_disappearances_violent <dbl>, pf_ss_disappearances_organized <dbl>,
## #   pf_ss_disappearances_fatalities <dbl>, pf_ss_disappearances_injuries <dbl>,
## #   pf_ss_disappearances <dbl>, pf_ss_women_fgm <dbl>,
## #   pf_ss_women_missing <dbl>, pf_ss_women_inheritance_widows <dbl>,
## #   pf_ss_women_inheritance_daughters <dbl>, pf_ss_women_inheritance <dbl>,
## #   pf_ss_women <dbl>, pf_ss <dbl>, pf_movement_domestic <dbl>,
## #   pf_movement_foreign <dbl>, pf_movement_women <dbl>, pf_movement <dbl>,
## #   pf_religion_estop_establish <dbl>, pf_religion_estop_operate <dbl>,
## #   pf_religion_estop <dbl>, pf_religion_harassment <dbl>,
## #   pf_religion_restrictions <dbl>, pf_religion <dbl>,
## #   pf_association_association <dbl>, pf_association_assembly <dbl>,
## #   pf_association_political_establish <dbl>,
## #   pf_association_political_operate <dbl>, pf_association_political <dbl>,
## #   pf_association_prof_establish <dbl>, pf_association_prof_operate <dbl>,
## #   pf_association_prof <dbl>, pf_association_sport_establish <dbl>,
## #   pf_association_sport_operate <dbl>, pf_association_sport <dbl>,
## #   pf_association <dbl>, pf_expression_killed <dbl>,
## #   pf_expression_jailed <dbl>, pf_expression_influence <dbl>,
## #   pf_expression_control <dbl>, pf_expression_cable <dbl>,
## #   pf_expression_newspapers <dbl>, pf_expression_internet <dbl>,
## #   pf_expression <dbl>, pf_identity_legal <dbl>,
## #   pf_identity_parental_marriage <dbl>, pf_identity_parental_divorce <dbl>,
## #   pf_identity_parental <dbl>, pf_identity_sex_male <dbl>,
## #   pf_identity_sex_female <dbl>, pf_identity_sex <dbl>,
## #   pf_identity_divorce <dbl>, pf_identity <dbl>, pf_score <dbl>,
## #   pf_rank <dbl>, ef_government_consumption <dbl>,
## #   ef_government_transfers <dbl>, ef_government_enterprises <dbl>,
## #   ef_government_tax_income <dbl>, ef_government_tax_payroll <dbl>,
## #   ef_government_tax <dbl>, ef_government <dbl>, ef_legal_judicial <dbl>,
## #   ef_legal_courts <dbl>, ef_legal_protection <dbl>, ef_legal_military <dbl>,
## #   ef_legal_integrity <dbl>, ef_legal_enforcement <dbl>,
## #   ef_legal_restrictions <dbl>, ef_legal_police <dbl>, ef_legal_crime <dbl>,
## #   ef_legal_gender <dbl>, ef_legal <dbl>, ef_money_growth <dbl>,
## #   ef_money_sd <dbl>, ef_money_inflation <dbl>, ef_money_currency <dbl>,
## #   ef_money <dbl>, ef_trade_tariffs_revenue <dbl>,
## #   ef_trade_tariffs_mean <dbl>, ef_trade_tariffs_sd <dbl>,
## #   ef_trade_tariffs <dbl>, ef_trade_regulatory_nontariff <dbl>,
## #   ef_trade_regulatory_compliance <dbl>, ef_trade_regulatory <dbl>,
## #   ef_trade_black <dbl>, ef_trade_movement_foreign <dbl>,
## #   ef_trade_movement_capital <dbl>, ef_trade_movement_visit <dbl>,
## #   ef_trade_movement <dbl>, ef_trade <dbl>,
## #   ef_regulation_credit_ownership <dbl>, ef_regulation_credit_private <dbl>,
## #   ef_regulation_credit_interest <dbl>, ef_regulation_credit <dbl>,
## #   ef_regulation_labor_minwage <dbl>, ef_regulation_labor_firing <dbl>,
## #   ef_regulation_labor_bargain <dbl>, ef_regulation_labor_hours <dbl>, ...
dim(hfi)
## [1] 1458  123
names(hfi)
##   [1] "year"                               "ISO_code"                          
##   [3] "countries"                          "region"                            
##   [5] "pf_rol_procedural"                  "pf_rol_civil"                      
##   [7] "pf_rol_criminal"                    "pf_rol"                            
##   [9] "pf_ss_homicide"                     "pf_ss_disappearances_disap"        
##  [11] "pf_ss_disappearances_violent"       "pf_ss_disappearances_organized"    
##  [13] "pf_ss_disappearances_fatalities"    "pf_ss_disappearances_injuries"     
##  [15] "pf_ss_disappearances"               "pf_ss_women_fgm"                   
##  [17] "pf_ss_women_missing"                "pf_ss_women_inheritance_widows"    
##  [19] "pf_ss_women_inheritance_daughters"  "pf_ss_women_inheritance"           
##  [21] "pf_ss_women"                        "pf_ss"                             
##  [23] "pf_movement_domestic"               "pf_movement_foreign"               
##  [25] "pf_movement_women"                  "pf_movement"                       
##  [27] "pf_religion_estop_establish"        "pf_religion_estop_operate"         
##  [29] "pf_religion_estop"                  "pf_religion_harassment"            
##  [31] "pf_religion_restrictions"           "pf_religion"                       
##  [33] "pf_association_association"         "pf_association_assembly"           
##  [35] "pf_association_political_establish" "pf_association_political_operate"  
##  [37] "pf_association_political"           "pf_association_prof_establish"     
##  [39] "pf_association_prof_operate"        "pf_association_prof"               
##  [41] "pf_association_sport_establish"     "pf_association_sport_operate"      
##  [43] "pf_association_sport"               "pf_association"                    
##  [45] "pf_expression_killed"               "pf_expression_jailed"              
##  [47] "pf_expression_influence"            "pf_expression_control"             
##  [49] "pf_expression_cable"                "pf_expression_newspapers"          
##  [51] "pf_expression_internet"             "pf_expression"                     
##  [53] "pf_identity_legal"                  "pf_identity_parental_marriage"     
##  [55] "pf_identity_parental_divorce"       "pf_identity_parental"              
##  [57] "pf_identity_sex_male"               "pf_identity_sex_female"            
##  [59] "pf_identity_sex"                    "pf_identity_divorce"               
##  [61] "pf_identity"                        "pf_score"                          
##  [63] "pf_rank"                            "ef_government_consumption"         
##  [65] "ef_government_transfers"            "ef_government_enterprises"         
##  [67] "ef_government_tax_income"           "ef_government_tax_payroll"         
##  [69] "ef_government_tax"                  "ef_government"                     
##  [71] "ef_legal_judicial"                  "ef_legal_courts"                   
##  [73] "ef_legal_protection"                "ef_legal_military"                 
##  [75] "ef_legal_integrity"                 "ef_legal_enforcement"              
##  [77] "ef_legal_restrictions"              "ef_legal_police"                   
##  [79] "ef_legal_crime"                     "ef_legal_gender"                   
##  [81] "ef_legal"                           "ef_money_growth"                   
##  [83] "ef_money_sd"                        "ef_money_inflation"                
##  [85] "ef_money_currency"                  "ef_money"                          
##  [87] "ef_trade_tariffs_revenue"           "ef_trade_tariffs_mean"             
##  [89] "ef_trade_tariffs_sd"                "ef_trade_tariffs"                  
##  [91] "ef_trade_regulatory_nontariff"      "ef_trade_regulatory_compliance"    
##  [93] "ef_trade_regulatory"                "ef_trade_black"                    
##  [95] "ef_trade_movement_foreign"          "ef_trade_movement_capital"         
##  [97] "ef_trade_movement_visit"            "ef_trade_movement"                 
##  [99] "ef_trade"                           "ef_regulation_credit_ownership"    
## [101] "ef_regulation_credit_private"       "ef_regulation_credit_interest"     
## [103] "ef_regulation_credit"               "ef_regulation_labor_minwage"       
## [105] "ef_regulation_labor_firing"         "ef_regulation_labor_bargain"       
## [107] "ef_regulation_labor_hours"          "ef_regulation_labor_dismissal"     
## [109] "ef_regulation_labor_conscription"   "ef_regulation_labor"               
## [111] "ef_regulation_business_adm"         "ef_regulation_business_bureaucracy"
## [113] "ef_regulation_business_start"       "ef_regulation_business_bribes"     
## [115] "ef_regulation_business_licensing"   "ef_regulation_business_compliance" 
## [117] "ef_regulation_business"             "ef_regulation"                     
## [119] "ef_score"                           "ef_rank"                           
## [121] "hf_score"                           "hf_rank"                           
## [123] "hf_quartile"

Exercise 2

The dataset has a lot of variables, but we are only interested in four: pf_score, pf_expression_control, hf_score, year, and region. Select these variables from the hfi dataframe, and assign the result to a dataframe named hfi_small.

# Insert code for Exercise 2 here

hfi_small <- hfi[,c(1,4,48,62,121)]
#pf_score (62), pf_expression_control (48), hf_score (121), year (1),  region (4)
View(hfi_small)

Exercise 3

Using the code below, how many rows in the hfi_small data have missing values?__ Next, use the drop_na() function to created another new dataframe named hfi_small_clean that does not contain any missing values.

# Insert code for Exercise 3 here
dim(hfi_small)
## [1] 1458    5
drop_na(hfi_small) %>% dim()
## [1] 1378    5

80 rows have missing values.

Exercise 4

What type of plot would you use to display the relationship between the personal freedom score, pf_score, and pf_expression_control? Plot this relationship using the variable pf_expression_control as the predictor. Does the relationship look linear? If you knew a country’s pf_expression_control, or its score out of 10, with 0 being the most, of political pressures and controls on media content, would you be comfortable using a linear model to predict the personal freedom score?

# Insert code for Exercise 4 here

hfi_small <- drop_na(hfi_small)

hfi_small %>%
  summarise(cor(pf_expression_control, pf_score))
## # A tibble: 1 x 1
##   `cor(pf_expression_control, pf_score)`
##                                    <dbl>
## 1                                  0.796

Yes, I be comfortable using a linear model to predict the personal freedom score because correlation is high.

Exercise 5

Looking at your plot from the previous exercise, describe the relationship between these two variables. Make sure to discuss the form, direction, and strength of the relationship as well as any unusual observations.

# Insert code for Exercise 5 here

There appears to be a few outliers. It is also a positive linear relationship.

Exercise 6

Using plot_ss, choose a line that does a good job of minimizing the sum of squares. Run the function several times. What was the smallest sum of squares that you got? How does it compare to your neighbors?

# Insert code for Exercise 6 here 
plot_ss(x = pf_expression_control, y = pf_score, data = hfi_small, showSquares = TRUE)

## Click two points to make a line.
                                
## Call:
## lm(formula = y ~ x, data = pts)
## 
## Coefficients:
## (Intercept)            x  
##      4.6171       0.4914  
## 
## Sum of Squares:  952.153

I ran the code several times and the best result was 952 which is close to other attempts I ran.

Exercise 7

Fit a new model that uses pf_expression_control to predict hf_score, or the total human freedom score. Using the estimates from the R output, write the equation of the regression line. What does the slope tell us in the context of the relationship between human freedom and the amount of political pressure on media content?

# Insert code for Exercise 7 here
m2 <- lm(hf_score ~ pf_expression_control, data = hfi_small)
summary(m2)
## 
## Call:
## lm(formula = hf_score ~ pf_expression_control, data = hfi_small)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.6198 -0.4908  0.1031  0.4703  2.2933 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           5.153687   0.046070  111.87   <2e-16 ***
## pf_expression_control 0.349862   0.008067   43.37   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.667 on 1376 degrees of freedom
## Multiple R-squared:  0.5775, Adjusted R-squared:  0.5772 
## F-statistic:  1881 on 1 and 1376 DF,  p-value: < 2.2e-16

57.7 % of variation in hf_score can be explained by the regression formula and we have a positive linear relationship.

hf_score = 5.153687 + 0.349862*pf_expression_control

With pf_expression_control increasing by one unit hf_score increases by 0.349862.

Exercise 8

If someone saw the least squares regression line and not the actual data, how would they predict a country’s personal freedom school for one with a 7.4 rating for pf_expression_control? Is this an overestimate or an underestimate, and by how much? In other words, what is the residual for this prediction?

# Insert code for Exercise 8 here
ggplot(data = hfi_small, aes(x = pf_expression_control, y = pf_score)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
## `geom_smooth()` using formula 'y ~ x'

pf_expression_control1 = 7.4

pf_score1 = 4.61707 + 0.491432*pf_expression_control1
pf_score1
## [1] 8.253667
pf_score2 <- hfi_small %>% filter(pf_expression_control == 7.5) %>% select(pf_score) %>% pull() %>% mean()
pf_score2
## [1] 8.438356
pf_score3 <- hfi_small %>% filter(pf_expression_control == 7.25) %>% select(pf_score) %>% pull() %>% mean()
pf_score3
## [1] 7.774527
pf_score4 = 0.6*(pf_score2 - pf_score3) + pf_score3
pf_score4
## [1] 8.172824
pf_score4 -pf_score1 
## [1] -0.08084254

Residual = -0.08084254. Predicted value is larger than observed.

Exercise 9

Is there any apparent pattern in the residuals plot? What does this indicate about the linearity of the relationship between the two variables?

# Insert code for Exercise 9 here
ggplot(data = m2, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

ggplot(data = m2, aes(sample = .resid)) +
  stat_qq()

plot(m2)

There is no obvious pattern in the residuals plot.Yes,condition of normality seems to have been met.Conditions for linear regression are satisfied, so we have a strong linear correlation.

Exercise 10

Based on the histogram and the normal probability plot, does the nearly normal residuals condition appear to be violated? Why or why not?

# Insert code for Exercise 10 here
ggplot(data = m2, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

ggplot(data = m2, aes(sample = .resid)) +
  stat_qq()

plot(m2)

No, this is because the conditions for normality appear to be met.

Exercise 11

Based on the residuals vs. fitted plot, does the constant variability condition appear to be violated? Why or why not?

# Insert code for Exercise 11 here
ggplot(data = m2, aes(x = .resid)) +
  geom_histogram(binwidth = 25) +
  xlab("Residuals")

ggplot(data = m2, aes(sample = .resid)) +
  stat_qq()

plot(m2)

No, this is because there is no obvious patterns.

More Practice 1

Choose another freedom variable and a variable you think would strongly correlate with it. Produce a scatterplot of the two variables and fit a linear model. At a glance, does there seem to be a linear relationship? Remember: You’ll need to go back and add that variable into the select() statement!

# Insert code for Exercise 11 here
m3 <- lm(hf_score ~ pf_expression_influence, data = hfi)
summary(m3)
## 
## Call:
## lm(formula = hf_score ~ pf_expression_influence, data = hfi)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.6889 -0.4898  0.1004  0.4824  2.4878 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              5.49066    0.04114  133.47   <2e-16 ***
## pf_expression_influence  0.28898    0.00706   40.93   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.6891 on 1376 degrees of freedom
##   (80 observations deleted due to missingness)
## Multiple R-squared:  0.5491, Adjusted R-squared:  0.5488 
## F-statistic:  1676 on 1 and 1376 DF,  p-value: < 2.2e-16
plot(m3)

ggplot(data = hfi, aes(x = pf_expression_influence, y = hf_score)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE)
## `geom_smooth()` using formula 'y ~ x'
## Warning: Removed 80 rows containing non-finite values (stat_smooth).
## Warning: Removed 80 rows containing missing values (geom_point).

No, this is because there is no obvious patterns.

LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIg0KYXV0aG9yOiAiVGVyZXNhIERvbGV5Ig0KZGF0ZTogImByIFN5cy5EYXRlKDExLzIzLzIwMjApIg0Kb3V0cHV0OiBvcGVuaW50cm86OmxhYl9yZXBvcnQNCi0tLQ0KDQpgYGB7ciBsb2FkLXBhY2thZ2VzLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KG9wZW5pbnRybykNCmxpYnJhcnkoc3RhdHNyKQ0KYGBgDQoNCiMjIyBFeGVyY2lzZSAxDQpXaGF0IGFyZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgZGF0YSBzZXQ/DQoNCjE0NTggcm93cyBieSAxMjMgY29sdW1ucw0KDQpgYGB7ciB2aWV3LWdpcmxzLWNvdW50c30NCmFyYnV0aG5vdCRnaXJscw0KaGZpDQpkaW0oaGZpKQ0KbmFtZXMoaGZpKQ0KYGBgDQoNCg0KIyMjIEV4ZXJjaXNlIDINCg0KVGhlIGRhdGFzZXQgaGFzIGEgbG90IG9mIHZhcmlhYmxlcywgYnV0IHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gZm91cjogcGZfc2NvcmUsIHBmX2V4cHJlc3Npb25fY29udHJvbCwgaGZfc2NvcmUsIHllYXIsIGFuZCByZWdpb24uIFNlbGVjdCB0aGVzZSB2YXJpYWJsZXMgZnJvbSB0aGUgaGZpIGRhdGFmcmFtZSwgYW5kIGFzc2lnbiB0aGUgcmVzdWx0IHRvIGEgZGF0YWZyYW1lIG5hbWVkIGhmaV9zbWFsbC4NCg0KYGBge3IgdHJlbmQtZ2lybHN9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAyIGhlcmUNCg0KaGZpX3NtYWxsIDwtIGhmaVssYygxLDQsNDgsNjIsMTIxKV0NCiNwZl9zY29yZSAoNjIpLCBwZl9leHByZXNzaW9uX2NvbnRyb2wgKDQ4KSwgaGZfc2NvcmUgKDEyMSksIHllYXIgKDEpLCAgcmVnaW9uICg0KQ0KVmlldyhoZmlfc21hbGwpDQpgYGANCg0KDQojIyMgRXhlcmNpc2UgMw0KDQpVc2luZyB0aGUgY29kZSBiZWxvdywgaG93IG1hbnkgcm93cyBpbiB0aGUgaGZpX3NtYWxsIGRhdGEgaGF2ZSBtaXNzaW5nIHZhbHVlcz9fXyBOZXh0LCB1c2UgdGhlIGRyb3BfbmEoKSBmdW5jdGlvbiB0byBjcmVhdGVkIGFub3RoZXIgbmV3IGRhdGFmcmFtZSBuYW1lZCBoZmlfc21hbGxfY2xlYW4gdGhhdCBkb2VzIG5vdCBjb250YWluIGFueSBtaXNzaW5nIHZhbHVlcy4NCg0KYGBge3IgcGxvdC1wcm9wLWJveXMtYXJidXRobm90fQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgMyBoZXJlDQpkaW0oaGZpX3NtYWxsKQ0KDQpkcm9wX25hKGhmaV9zbWFsbCkgJT4lIGRpbSgpDQpgYGANCjgwIHJvd3MgaGF2ZSBtaXNzaW5nIHZhbHVlcy4gDQoNCiMjIyBFeGVyY2lzZSA0DQoNCldoYXQgdHlwZSBvZiBwbG90IHdvdWxkIHlvdSB1c2UgdG8gZGlzcGxheSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHBlcnNvbmFsIGZyZWVkb20gc2NvcmUsIHBmX3Njb3JlLCBhbmQgcGZfZXhwcmVzc2lvbl9jb250cm9sPyBQbG90IHRoaXMgcmVsYXRpb25zaGlwIHVzaW5nIHRoZSB2YXJpYWJsZSBwZl9leHByZXNzaW9uX2NvbnRyb2wgYXMgdGhlIHByZWRpY3Rvci4gRG9lcyB0aGUgcmVsYXRpb25zaGlwIGxvb2sgbGluZWFyPyBJZiB5b3Uga25ldyBhIGNvdW50cnnigJlzIHBmX2V4cHJlc3Npb25fY29udHJvbCwgb3IgaXRzIHNjb3JlIG91dCBvZiAxMCwgd2l0aCAwIGJlaW5nIHRoZSBtb3N0LCBvZiBwb2xpdGljYWwgcHJlc3N1cmVzIGFuZCBjb250cm9scyBvbiBtZWRpYSBjb250ZW50LCB3b3VsZCB5b3UgYmUgY29tZm9ydGFibGUgdXNpbmcgYSBsaW5lYXIgbW9kZWwgdG8gcHJlZGljdCB0aGUgcGVyc29uYWwgZnJlZWRvbSBzY29yZT8NCg0KYGBge3IgZGltLXByZXNlbnR9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA0IGhlcmUNCg0KaGZpX3NtYWxsIDwtIGRyb3BfbmEoaGZpX3NtYWxsKQ0KDQpoZmlfc21hbGwgJT4lDQogIHN1bW1hcmlzZShjb3IocGZfZXhwcmVzc2lvbl9jb250cm9sLCBwZl9zY29yZSkpDQpgYGANClllcywgSSAgYmUgY29tZm9ydGFibGUgdXNpbmcgYSBsaW5lYXIgbW9kZWwgdG8gcHJlZGljdCB0aGUgcGVyc29uYWwgZnJlZWRvbSBzY29yZSBiZWNhdXNlIGNvcnJlbGF0aW9uIGlzIGhpZ2guDQoNCiMjIyBFeGVyY2lzZSA1DQoNCkxvb2tpbmcgYXQgeW91ciBwbG90IGZyb20gdGhlIHByZXZpb3VzIGV4ZXJjaXNlLCBkZXNjcmliZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhYmxlcy4gTWFrZSBzdXJlIHRvIGRpc2N1c3MgdGhlIGZvcm0sIGRpcmVjdGlvbiwgYW5kIHN0cmVuZ3RoIG9mIHRoZSByZWxhdGlvbnNoaXAgYXMgd2VsbCBhcyBhbnkgdW51c3VhbCBvYnNlcnZhdGlvbnMuDQoNCmBgYHtyIGNvdW50LWNvbXBhcmV9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA1IGhlcmUNCg0KYGBgDQpUaGVyZSBhcHBlYXJzIHRvIGJlIGEgZmV3IG91dGxpZXJzLiBJdCBpcyBhbHNvIGEgcG9zaXRpdmUgbGluZWFyIHJlbGF0aW9uc2hpcC4NCg0KIyMjIEV4ZXJjaXNlIDYNCg0KVXNpbmcgcGxvdF9zcywgY2hvb3NlIGEgbGluZSB0aGF0IGRvZXMgYSBnb29kIGpvYiBvZiBtaW5pbWl6aW5nIHRoZSBzdW0gb2Ygc3F1YXJlcy4gUnVuIHRoZSBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzLiBXaGF0IHdhcyB0aGUgc21hbGxlc3Qgc3VtIG9mIHNxdWFyZXMgdGhhdCB5b3UgZ290PyBIb3cgZG9lcyBpdCBjb21wYXJlIHRvIHlvdXIgbmVpZ2hib3JzPw0KDQpgYGB7ciBwbG90LXByb3AtYm95cy1wcmVzZW50fQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgNiBoZXJlIA0KcGxvdF9zcyh4ID0gcGZfZXhwcmVzc2lvbl9jb250cm9sLCB5ID0gcGZfc2NvcmUsIGRhdGEgPSBoZmlfc21hbGwsIHNob3dTcXVhcmVzID0gVFJVRSkNCmBgYA0KSSByYW4gdGhlIGNvZGUgc2V2ZXJhbCB0aW1lcyBhbmQgdGhlIGJlc3QgcmVzdWx0IHdhcyA5NTIgd2hpY2ggaXMgY2xvc2UgdG8gb3RoZXIgYXR0ZW1wdHMgSSByYW4uDQoNCiMjIyBFeGVyY2lzZSA3DQoNCkZpdCBhIG5ldyBtb2RlbCB0aGF0IHVzZXMgcGZfZXhwcmVzc2lvbl9jb250cm9sIHRvIHByZWRpY3QgaGZfc2NvcmUsIG9yIHRoZSB0b3RhbCBodW1hbiBmcmVlZG9tIHNjb3JlLiBVc2luZyB0aGUgZXN0aW1hdGVzIGZyb20gdGhlIFIgb3V0cHV0LCB3cml0ZSB0aGUgZXF1YXRpb24gb2YgdGhlIHJlZ3Jlc3Npb24gbGluZS4gV2hhdCBkb2VzIHRoZSBzbG9wZSB0ZWxsIHVzIGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBodW1hbiBmcmVlZG9tIGFuZCB0aGUgYW1vdW50IG9mIHBvbGl0aWNhbCBwcmVzc3VyZSBvbiBtZWRpYSBjb250ZW50Pw0KDQpgYGB7ciB9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA3IGhlcmUNCm0yIDwtIGxtKGhmX3Njb3JlIH4gcGZfZXhwcmVzc2lvbl9jb250cm9sLCBkYXRhID0gaGZpX3NtYWxsKQ0Kc3VtbWFyeShtMikNCmBgYA0KNTcuNyAlIG9mIHZhcmlhdGlvbiBpbiBoZl9zY29yZSBjYW4gYmUgZXhwbGFpbmVkIGJ5IHRoZSByZWdyZXNzaW9uIGZvcm11bGEgYW5kIHdlIGhhdmUgYSBwb3NpdGl2ZSBsaW5lYXIgcmVsYXRpb25zaGlwLg0KDQpoZl9zY29yZSA9IDUuMTUzNjg3ICsgMC4zNDk4NjIqcGZfZXhwcmVzc2lvbl9jb250cm9sDQoNCldpdGggcGZfZXhwcmVzc2lvbl9jb250cm9sIGluY3JlYXNpbmcgYnkgb25lIHVuaXQgaGZfc2NvcmUgaW5jcmVhc2VzIGJ5IDAuMzQ5ODYyLg0KDQoNCiMjIyBFeGVyY2lzZSA4DQoNCklmIHNvbWVvbmUgc2F3IHRoZSBsZWFzdCBzcXVhcmVzIHJlZ3Jlc3Npb24gbGluZSBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YSwgaG93IHdvdWxkIHRoZXkgcHJlZGljdCBhIGNvdW50cnnigJlzIHBlcnNvbmFsIGZyZWVkb20gc2Nob29sIGZvciBvbmUgd2l0aCBhIDcuNCByYXRpbmcgZm9yIHBmX2V4cHJlc3Npb25fY29udHJvbD8gSXMgdGhpcyBhbiBvdmVyZXN0aW1hdGUgb3IgYW4gdW5kZXJlc3RpbWF0ZSwgYW5kIGJ5IGhvdyBtdWNoPyBJbiBvdGhlciB3b3Jkcywgd2hhdCBpcyB0aGUgcmVzaWR1YWwgZm9yIHRoaXMgcHJlZGljdGlvbj8NCg0KYGBge3J9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSA4IGhlcmUNCmdncGxvdChkYXRhID0gaGZpX3NtYWxsLCBhZXMoeCA9IHBmX2V4cHJlc3Npb25fY29udHJvbCwgeSA9IHBmX3Njb3JlKSkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFKQ0KcGZfZXhwcmVzc2lvbl9jb250cm9sMSA9IDcuNA0KDQpwZl9zY29yZTEgPSA0LjYxNzA3ICsgMC40OTE0MzIqcGZfZXhwcmVzc2lvbl9jb250cm9sMQ0KcGZfc2NvcmUxDQpgYGANCmBgYHtyfQ0KcGZfc2NvcmUyIDwtIGhmaV9zbWFsbCAlPiUgZmlsdGVyKHBmX2V4cHJlc3Npb25fY29udHJvbCA9PSA3LjUpICU+JSBzZWxlY3QocGZfc2NvcmUpICU+JSBwdWxsKCkgJT4lIG1lYW4oKQ0KcGZfc2NvcmUyDQpwZl9zY29yZTMgPC0gaGZpX3NtYWxsICU+JSBmaWx0ZXIocGZfZXhwcmVzc2lvbl9jb250cm9sID09IDcuMjUpICU+JSBzZWxlY3QocGZfc2NvcmUpICU+JSBwdWxsKCkgJT4lIG1lYW4oKQ0KcGZfc2NvcmUzDQpwZl9zY29yZTQgPSAwLjYqKHBmX3Njb3JlMiAtIHBmX3Njb3JlMykgKyBwZl9zY29yZTMNCnBmX3Njb3JlNA0KcGZfc2NvcmU0IC1wZl9zY29yZTEgDQpgYGANClJlc2lkdWFsID0gLTAuMDgwODQyNTQuIFByZWRpY3RlZCB2YWx1ZSBpcyBsYXJnZXIgdGhhbiBvYnNlcnZlZC4NCg0KIyMjIEV4ZXJjaXNlIDkNCg0KSXMgdGhlcmUgYW55IGFwcGFyZW50IHBhdHRlcm4gaW4gdGhlIHJlc2lkdWFscyBwbG90PyBXaGF0IGRvZXMgdGhpcyBpbmRpY2F0ZSBhYm91dCB0aGUgbGluZWFyaXR5IG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgdHdvIHZhcmlhYmxlcz8NCg0KYGBge3IgfQ0KIyBJbnNlcnQgY29kZSBmb3IgRXhlcmNpc2UgOSBoZXJlDQpnZ3Bsb3QoZGF0YSA9IG0yLCBhZXMoeCA9IC5yZXNpZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyNSkgKw0KICB4bGFiKCJSZXNpZHVhbHMiKQ0KZ2dwbG90KGRhdGEgPSBtMiwgYWVzKHNhbXBsZSA9IC5yZXNpZCkpICsNCiAgc3RhdF9xcSgpDQpwbG90KG0yKQ0KYGBgDQpUaGVyZSBpcyBubyBvYnZpb3VzIHBhdHRlcm4gaW4gdGhlIHJlc2lkdWFscyBwbG90Llllcyxjb25kaXRpb24gb2Ygbm9ybWFsaXR5IHNlZW1zIHRvIGhhdmUgYmVlbiBtZXQuQ29uZGl0aW9ucyBmb3IgbGluZWFyIHJlZ3Jlc3Npb24gYXJlIHNhdGlzZmllZCwgc28gd2UgaGF2ZSBhIHN0cm9uZyBsaW5lYXIgY29ycmVsYXRpb24uDQoNCiMjIyBFeGVyY2lzZSAxMA0KDQpCYXNlZCBvbiB0aGUgaGlzdG9ncmFtIGFuZCB0aGUgbm9ybWFsIHByb2JhYmlsaXR5IHBsb3QsIGRvZXMgdGhlIG5lYXJseSBub3JtYWwgcmVzaWR1YWxzIGNvbmRpdGlvbiBhcHBlYXIgdG8gYmUgdmlvbGF0ZWQ/IFdoeSBvciB3aHkgbm90Pw0KDQpgYGB7ciB9DQojIEluc2VydCBjb2RlIGZvciBFeGVyY2lzZSAxMCBoZXJlDQpnZ3Bsb3QoZGF0YSA9IG0yLCBhZXMoeCA9IC5yZXNpZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyNSkgKw0KICB4bGFiKCJSZXNpZHVhbHMiKQ0KZ2dwbG90KGRhdGEgPSBtMiwgYWVzKHNhbXBsZSA9IC5yZXNpZCkpICsNCiAgc3RhdF9xcSgpDQpwbG90KG0yKQ0KYGBgDQpObywgdGhpcyBpcyBiZWNhdXNlIHRoZSBjb25kaXRpb25zIGZvciBub3JtYWxpdHkgYXBwZWFyIHRvIGJlIG1ldC4gDQoNCiMjIyBFeGVyY2lzZSAxMQ0KDQpCYXNlZCBvbiB0aGUgcmVzaWR1YWxzIHZzLiBmaXR0ZWQgcGxvdCwgZG9lcyB0aGUgY29uc3RhbnQgdmFyaWFiaWxpdHkgY29uZGl0aW9uIGFwcGVhciB0byBiZSB2aW9sYXRlZD8gV2h5IG9yIHdoeSBub3Q/DQoNCmBgYHtyIH0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDExIGhlcmUNCmdncGxvdChkYXRhID0gbTIsIGFlcyh4ID0gLnJlc2lkKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDI1KSArDQogIHhsYWIoIlJlc2lkdWFscyIpDQpnZ3Bsb3QoZGF0YSA9IG0yLCBhZXMoc2FtcGxlID0gLnJlc2lkKSkgKw0KICBzdGF0X3FxKCkNCnBsb3QobTIpDQpgYGANCk5vLCB0aGlzIGlzIGJlY2F1c2UgdGhlcmUgaXMgbm8gb2J2aW91cyBwYXR0ZXJucy4NCg0KIyMjIE1vcmUgUHJhY3RpY2UgMQ0KDQpDaG9vc2UgYW5vdGhlciBmcmVlZG9tIHZhcmlhYmxlIGFuZCBhIHZhcmlhYmxlIHlvdSB0aGluayB3b3VsZCBzdHJvbmdseSBjb3JyZWxhdGUgd2l0aCBpdC4gUHJvZHVjZSBhIHNjYXR0ZXJwbG90IG9mIHRoZSB0d28gdmFyaWFibGVzIGFuZCBmaXQgYSBsaW5lYXIgbW9kZWwuIEF0IGEgZ2xhbmNlLCBkb2VzIHRoZXJlIHNlZW0gdG8gYmUgYSBsaW5lYXIgcmVsYXRpb25zaGlwPyBSZW1lbWJlcjogWW914oCZbGwgbmVlZCB0byBnbyBiYWNrIGFuZCBhZGQgdGhhdCB2YXJpYWJsZSBpbnRvIHRoZSBzZWxlY3QoKSBzdGF0ZW1lbnQhDQoNCmBgYHtyIH0NCiMgSW5zZXJ0IGNvZGUgZm9yIEV4ZXJjaXNlIDExIGhlcmUNCm0zIDwtIGxtKGhmX3Njb3JlIH4gcGZfZXhwcmVzc2lvbl9pbmZsdWVuY2UsIGRhdGEgPSBoZmkpDQpzdW1tYXJ5KG0zKQ0KcGxvdChtMykNCmdncGxvdChkYXRhID0gaGZpLCBhZXMoeCA9IHBmX2V4cHJlc3Npb25faW5mbHVlbmNlLCB5ID0gaGZfc2NvcmUpKSArDQogIGdlb21fcG9pbnQoKSArDQogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpDQoNCmBgYA0KTm8sIHRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBvYnZpb3VzIHBhdHRlcm5zLg0KDQo=