Replication Project

Study Preregistration form: https://rpubs.com/H220175230/1185493

Information about this replication project

  • Replication project based on paper, Eady, G., Paskhalis, T., Zilinsky, J., Bonneau, R., Nagler, J., & Tucker, J. A. (2023). Exposure to the Russian Internet Research Agency foreign influence campaign on Twitter in the 2016 US election and its relationship to attitudes and voting behavior. Nature Communications, 14(1), 62. Avaiable at: https://doi.org/10.1038/s41467-022-35576-9

  • Replication method:

    • Used materials obtained from authors

Workspace setup

YAML settings

output:
  html_document:
   code_download: true
    toc: true
    toc_depth: 2
    toc_float:
     collapsed: false
     smooth_scroll: true

Global settings of R chunks

# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)

Libraries

# All used libraries
library(rmarkdown)
library(knitr)
library(dplyr)
library(estimatr)
library(lfe)
library(lmtest)
library(MASS)
library(mvtnorm)
library(nnet)
library(sandwich)
library(tidyr)
library(cowplot)
library(lubridate)
library(openxlsx)
library(ggplot2)
library(sjPlot)
library(reshape2)

Versions of used packages

$rmarkdown
[1] '2.23'

$knitr
[1] '1.43'

$dplyr
[1] '1.1.2'

$estimatr
[1] '1.0.2'

$lfe
[1] '3.0.0'

$lmtest
[1] '0.9.40'

$MASS
[1] '7.3.60'

$mvtnorm
[1] '1.2.3'

$nnet
[1] '7.3.19'

$sandwich
[1] '3.1.0'

$tidyr
[1] '1.3.0'

$cowplot
[1] '1.1.3'

$lubridate
[1] '1.9.2'

$openxlsx
[1] '4.2.5.2'

$ggplot2
[1] '3.4.4'

$sjPlot
[1] '2.8.15'

$reshape2
[1] '1.4.4'

My enviroment

[1] "R version 4.3.2 (2023-10-31)"

1. Introduction

The paper examines whether exposure to Russian foreign influence Twitter posts affects the voting choice of voters in the 2016 US election, and specifically whether they are more likely to switch towards Donald Trump. The authors find that there is no significant relationship between exposure to Russian posts and changes in voting behaviour. Their analysis assumes a linear relationship, meaning that the effect does not depend upon the characteristics of the individuals exposed to the posts. It is plausible, however, that effects are heterogeneous. While there is no significant relationship between exposure and voting choices for the full sample, there may be some demographic groups for which the posts do have an influence. Various demographic characteristics may be relevant when considering heterogeneity, including age, education levels, ethnicity, and gender (e.g. Pew Research Center, 2023). This study focuses explicitly on the strength of an individual’s political views and whether this affects the relationship between exposure to Russian tweets and voting patterns.

The Pew Research Center study (2020) shows that voters rarely switch parties, an outcome consistent with the data used in Eady et al. (2023). They do find, however, that switching is more likely among less politically engaged voters. Such outcomes further suggest that foreign influence campaigns are unlikely to influence the voting choices of more politically engaged voters but have a better chance of influencing those less politically engaged (Fujiwara et al, 2023). This is in part due to politically engaged voters often seeking out information online which align with their current beliefs (Weeks et al, 2017). Given that these voters tend to view posts that reinforce their beliefs, there is often a lesser likelihood of viewing posts that provide alternate viewpoints (Garcia, 2023).

In order to undertake this extension, the same data as in the original study will be used. The methodology used, however, will be different, with the approach allowing for non-linear effects. Using information in the dataset of Eady et al. (2023) on the strength of a voter’s affiliation to a particular party, the study tests the hypothesis that foreign influence campaigns are more likely to change the voting behaviour of those with moderate political views. The study uses an indicator of where voters rank themselves on a scale (0 being strong Democrat and 1 strong Republican) to address this hypothesis. To test for this heterogeneity or non-linearity, a linear regression model with interaction terms is employed. Specifically, the approach includes an interaction term between the strength of political views and the exposure to foreign influence campaigns. The expectation is that the interaction term will be significant, such that individuals with weaker political views will show a greater likelihood of changing their voting behaviour in response to Russian tweets.

Given the above information I am testing the hypothesis that voters with more politically moderate views are more likely to be influenced by foreign influence campaigns to change their vote preferences.

2. Data and methods

2.1. Data

#load in the data 
us2016_twitter <- readRDS("Survey_Data.rds")

The data combines a YouGov survey and Twitter 27 election integrity data. The data comprises 3,500 observations on 190 variables, though the authors exclude individuals without a Twitter account. There are three dependent variables; ‘change_rank_trump_over_clinton_w1w3’; ‘voted_trump_versus_clinton’: and ‘voted_trump_versus_clinton_benefit’. All three take on three possible values: +1 indicating a shift towards Trump, -1 a shift away from Trump, and 0 indicating no change. The first variable captures changes in the ranking of Trump versus Clinton between the 1st and 2nd survey waves; the second shifts towards (or away) Trump, a no vote, or a 3rd candidate (+1); and the third changes in voting preferences between the 1st survey and the actual vote.

The main independent variable captures the number of Russian tweets an individual is exposed to. Given the interest in the strength of political views and not whether they are strongly Democrat or Republican, the variable on political persuasion (pid7) is recoded so that ‘Strong Democrat’ and ‘Strong Republican’ are classified as ‘Strong’, ‘Lean Democrat’ and ‘Lean Republican’ are ‘Lean’, ‘Not very strong Democrat’ and ‘Not very strong Republican’ are ‘Not Strong’, and ‘Independent’ remains ‘Independent’. A numerical variable is also created, with 0 being ‘Strong’, 0.25 being ‘Lean’, 0.5 being ‘Not Strong’, and 0.75 being ‘Independent’.

#re-code the data so that education is now split between 'High school or below' and 'College', the race variable is now 'White' or 'Non-White', regions are also divided into 'South', 'Northeast', 'Midwest' and 'West' 
us2016_recoded <- us2016_twitter %>%
  filter(have_twitter_data == 1) %>%
  mutate(
    income = as.numeric(income),
    education = factor(case_when(
      education == "High school or below" ~ "High school or below",
      education %in% c("College degree", "Post-graduate degree") ~ "College+"
    ), levels = c("High school or below", "College+")),
    race = factor(case_when(
      race == "White" ~ "White",
      race %in% c("Black", "Hispanic", "Other") ~ "Non-White"
    ), levels = c("White", "Non-White")),
    region = factor(region, levels = c("South", "Northeast", "Midwest", "West"))
  )

#Recode variables into 4 categories "Strong", "Lean", "Not Strong" and "Independent" 

us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Strong Democrat"] <- "Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Strong Republican"] <- "Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Lean Democrat"] <- "Lean"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Lean Republican"] <- "Lean"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Not very strong Democrat"] <- "Not Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Not very strong Republican"] <- "Not Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Independent"] <- "Independent"

#Recode variables 
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Strong Democrat"] <- 0
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Strong Republican"] <- 0
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Lean Democrat"] <- .25
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Lean Republican"] <- .25
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Not very strong Democrat"] <- .5
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Not very strong Republican"] <- .5
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Independent"] <- 0.75
# Average value of the newly created political strength variable
mean(us2016_recoded$pol_strength_num, na.rm = TRUE)
[1] 0.2672999
# Plot of distribution of newly created political strength variable
desc_plot <- ggplot((data = us2016_recoded), aes(x = pol_strength, na.rm = TRUE)) + labs(x = "Political Strength", y = "Count", title = "Figure 1: Distribution of Political Views") +
    geom_bar() 

desc_plot

The mean of the political strength variable is 0.27, with Figure 1 indicating the majority of respondents classified themselves as either “Strong Democrat” or “Strong Republican”.

# Descriptive two-way tables on numbers switching vote by political leaning
desc_table_1 <- table(us2016_recoded$pol_strength_num, us2016_recoded$change_rank_trump_over_clinton_w1w3)
colnames(desc_table_1) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_1) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_1
             
              Away from Trump No Change Towards Trump
  Strong                    7       381            12
  Not Strong                6       187            10
  Lean                      9       203            13
  Independent               6       115            11
desc_table_2 <- table(us2016_recoded$pol_strength_num, us2016_recoded$voted_trump_versus_clinton)
colnames(desc_table_2) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_2) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_2
             
              Away from Trump No Change Towards Trump
  Strong                    7       440            12
  Not Strong                5       174             1
  Lean                      7       231            12
  Independent               2        70             5
desc_table_3 <- table(us2016_recoded$pol_strength_num, us2016_recoded$voted_trump_versus_clinton_benefit)
colnames(desc_table_3) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_3) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_3
             
              Away from Trump No Change Towards Trump
  Strong                   19       440            51
  Not Strong               23       174            40
  Lean                     34       231            38
  Independent              38        70            48

The tables shows the distribution of the dependent variables by strength of political views. “No change” has the highest percentages, indicating that few voters tend to change voting intentions. Those that do change are generally favourable for Trump, with independents more likely to switch political views.

2.2. Methods

The original paper uses Ordinary Least Squares (OLS) regression, estimating a linear relationship between exposure to Russian tweets and changes in voter preferences. The original study also included a range of control variables in the regression. This study also uses OLS regression, but includes an interaction between the exposure variable and an indicator of the strength of political views. This is done in two ways.

Firstly, an interaction between the exposure variable and the numerical variable capturing the strength of political views is included. These two variables are also included individually. The numerical variable takes on values of 0, 0.25, 0.5, or 0.75, with higher values indicating less strong political views. A positive coefficient on the interaction would indicate that people with less strong political views are more likely to switch their vote choice for a given level of exposure to Russian tweets.

A shortcoming of the interaction term described above is that it assumes that the difference in likelihood of switching vote is the same for strong vs lean as it is for not strong vs independent. A second approach relaxes this assumption. In this case, the exposure variable is interacted with a categorical variable. This results in the estimation of a coefficient on the exposure variable and coefficients on three interactions of the exposure variable with dummy variables for lean, not strong, and independent. In this case, the coefficient on the non-interacted exposure variable captures the effect of exposure on vote choice for the excluded category (i.e., strong political views), while the coefficients on the three interactions capture the effects of exposure on vote choice for the three other categories. By estimating separate coefficients for each category, this approach doesn’t restrict the difference in coefficients to be the same between consecutive categories.

3. Results

To examine whether the influence of exposure to Russian tweets depends on how strong an individual’s political views are, an interaction between the exposure variable and political strength variable is included in the model. Given that higher numbers of the political strength variable imply a more independent (less politically strong) view, then a positive (and significant) coefficient on the interaction term would mean that more politically independent voters are more likely to switch their vote (towards Trump) in response to exposure to Russian tweets.

#===============================================================================
# Introduce the Interactions between Exposure and Strength of Political Views

#Create a new Table E6 with Interaction term 
vote_rank_total_russia_count_lm_controls <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)

vote_rank_total_russia_count_lm_controls_black <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black)

vote_rank_total_russia_count_lm_controls_total_tweets <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model (vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"), title = "Table 1: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between survey waves", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 1: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between survey waves
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure 0.010 0.005 0.010 0.005 0.009 0.006
Political Views 0.102 * 0.048 0.106 * 0.048 0.106 * 0.049
Exposure * Political Views -0.048 ** 0.015 -0.048 ** 0.015 -0.048 ** 0.015
Age 0.000 0.001 0.000 0.001 0.000 0.001
Woman 0.031 0.018 0.031 0.018 0.031 0.018
College-educated 0.007 0.019 0.008 0.018 0.008 0.018
Income -0.011 0.010 -0.011 0.010 -0.011 0.010
Other/Hispanic -0.041 0.026 -0.041 0.026
Black 0.026 0.029 0.026 0.029
Person of Color -0.010 0.020
Region: Northeast 0.001 0.028 0.003 0.028 0.003 0.028
Region: Midwest -0.019 0.020 -0.018 0.020 -0.018 0.021
Region: West -0.014 0.025 -0.009 0.025 -0.009 0.025
log(Total Tweets) 0.001 0.005
Freq. of social media use -0.004 0.007 -0.004 0.007 -0.004 0.007
Constant 0.016 0.068 0.017 0.068 0.012 0.081
Observations 917 917 917
R2 / R2 adjusted 0.020 / 0.007 0.023 / 0.009 0.023 / 0.008
  • p<0.05   ** p<0.01   *** p<0.001

Beginning with Table 1, which reports the results when using the first dependent variable, the coefficient on the level of exposure is positive, which indicates a positive association between exposure to Russian tweets and the probability of switching towards Trump for those with strong political views (a political strength value of zero).

plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + labs(title = "Figure 2: Nonlinear effect of exposure to Russian tweets on change 
in voting preferences towards Trump between survey 
Wave 1 and 2", x = " Total Exposure (log +1)", y = "Change in voting preference 
towards Trump between Wave 1 and Wave 2", color = "Strength of Political Views")

The interaction term (exposure * political strength) is found to be negative and significant indicating that the probability of shifting towards Trump is smaller for those that have less strong political views. This can be seen in Figure 2. The figure also reports the confidence intervals and effects are generally not significant at the 5% level. This indicates that the impact is found to be positive for strong political views and negative for the other three. The effects are generally not significant at the 95% level. There are exceptions, however, with high levels of exposure significantly reducing the probability of changing for more independent voters. At the 90% level, effects are significant, including the positive effect of exposure on the probability of shifting for those with stronger views.

# New Table E7 with Interaction
vote_rank_total_russia_count_lm_controls <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)

vote_rank_total_russia_count_lm_controls_black <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black)


vote_rank_total_russia_count_lm_controls_total_tweets <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model (vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"), title = "Table 2: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 2: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure 0.004 0.004 0.004 0.004 0.005 0.005
Political Views 0.069 0.038 0.068 0.038 0.067 0.038
Exposure * Political Views -0.022 0.014 -0.022 0.014 -0.022 0.014
Age -0.000 0.000 -0.000 0.000 -0.000 0.000
Woman 0.033 * 0.015 0.033 * 0.015 0.033 * 0.015
College-educated 0.010 0.015 0.010 0.015 0.010 0.015
Income -0.003 0.008 -0.003 0.008 -0.003 0.008
Other/Hispanic 0.036 0.030 0.037 0.030
Black 0.007 0.024 0.007 0.024
Person of Color 0.022 0.020
Region: Northeast -0.007 0.022 -0.008 0.022 -0.008 0.022
Region: Midwest -0.006 0.018 -0.006 0.018 -0.005 0.018
Region: West 0.005 0.024 0.004 0.024 0.004 0.024
log(Total Tweets) -0.002 0.006
Freq. of social media use 0.004 0.006 0.004 0.006 0.005 0.006
Constant -0.046 0.056 -0.046 0.056 -0.030 0.070
Observations 923 923 923
R2 / R2 adjusted 0.012 / -0.001 0.013 / -0.001 0.013 / -0.002
  • p<0.05   ** p<0.01   *** p<0.001
plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + labs(title = "Figure 3:  Nonlinear effect of exposure to Russian tweets 
                on changes in voter preference towards Trump, third party 
                candidates or no vote", x = " Total Exposure (log +1)", 
y = "Change in voting preference towards Trump, 
      third party candidates and no vote"     , color = "Strength of Political Views")

In terms of the signs of the effects, Table 2, which reports results from the second dependent variable, is consistent with those in 1, but none of the coefficients are significant. This implies that exposure has no impact on the probability of changing voting intentions and that there are no significant differences between groups when considering a dependent variable that also allows for changes towards third candidates or choosing not to vote.

The results in Table 3 below, which reports results when using the third dependent variable, also show the same signs on the main coefficients as in the other two tables. Here the final specification provides the strongest evidence of a positive effect of exposure on changing the voting intentions of those with strong political views, with the coefficient on the exposure variable being positive and significant. While the coefficient on the interaction term is negative, consistent with previous results, it is not significant.

# New Table E8 with Interaction

vote_rank_total_russia_count_lm_controls <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)


vote_rank_total_russia_count_lm_controls_black <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)

summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black )


vote_rank_total_russia_count_lm_controls_total_tweets <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)

summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model(vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 3: Non-linear effects of exposure to Russian tweets on changes in voting preferences between the 1st wave of the YouGov survey and the actual vote", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 3: Non-linear effects of exposure to Russian tweets on changes in voting preferences between the 1st wave of the YouGov survey and the actual vote
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure 0.011 0.007 0.011 0.007 0.022 * 0.009
Political Views 0.069 0.077 0.071 0.077 0.063 0.077
Exposure * Political Views -0.054 * 0.026 -0.055 * 0.026 -0.051 0.026
Age -0.001 0.001 -0.001 0.001 -0.001 0.001
Woman 0.090 ** 0.028 0.089 ** 0.028 0.092 ** 0.028
College-educated 0.046 0.029 0.046 0.029 0.045 0.029
Income -0.036 * 0.015 -0.036 * 0.015 -0.036 * 0.015
Other/Hispanic 0.053 0.052 0.053 0.052
Black 0.094 * 0.041 0.092 * 0.040
Person of Color 0.072 * 0.036
Region: Northeast -0.018 0.041 -0.017 0.041 -0.016 0.041
Region: Midwest 0.021 0.036 0.021 0.036 0.025 0.036
Region: West -0.005 0.040 -0.003 0.040 -0.000 0.040
log(Total Tweets) -0.020 * 0.010
Freq. of social media use 0.008 0.014 0.007 0.014 0.009 0.014
Constant 0.023 0.117 0.024 0.117 0.198 0.138
Observations 1146 1146 1146
R2 / R2 adjusted 0.027 / 0.017 0.028 / 0.017 0.031 / 0.019
  • p<0.05   ** p<0.01   *** p<0.001
plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + 
  labs(title = "Figure 4:  Nonlinear effect of exposure to Russian tweets on 
  changes in voting preferences between the 1st wave of the 
       YouGov survey and the actual vote. ", x = "Total Exposure (log +1)", 
       y = "Change in voting preference between the 1st 
       wave of the survey and the actual vote",  color = "Strength of Political Views")

This following results interact the exposure variable with the categorical political strength variable. In this case the linear exposure variable will refer to the coefficient on exposure for the omitted group (independent voters) while the coefficients on the three different interactions refer to the coefficients on the exposure variable for the other three political strength groups.

# Introduce the Interactions between Exposure and Strength of Political Views

# New Table E6 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new1)

confint(vote_rank_total_russia_count_lm_controls_new1)



vote_rank_total_russia_count_lm_controls_black_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new1)

confint(vote_rank_total_russia_count_lm_controls_black_new1)



vote_rank_total_russia_count_lm_controls_total_tweets_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new1)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new1)
tab_model (vote_rank_total_russia_count_lm_controls_new1, vote_rank_total_russia_count_lm_controls_black_new1, vote_rank_total_russia_count_lm_controls_total_tweets_new1, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 4: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between waves of the survey ", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 4: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between waves of the survey
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure - Independent -0.021 0.013 -0.020 0.013 -0.021 0.014
Exposure - Lean 0.023 0.017 0.023 0.017 0.023 0.017
Exposure - Not Strong -0.000 0.015 -0.002 0.015 -0.002 0.015
Exposure - Strong 0.030 * 0.014 0.030 * 0.014 0.030 * 0.014
Political Views - Lean -0.041 0.051 -0.043 0.051 -0.042 0.051
Political Views - Not Strong -0.002 0.053 -0.004 0.053 -0.003 0.052
Political Views - Strong -0.063 0.047 -0.067 0.047 -0.067 0.047
Age 0.000 0.001 0.000 0.001 0.000 0.001
Woman 0.032 0.018 0.032 0.018 0.032 0.018
College-educated 0.006 0.018 0.007 0.018 0.007 0.018
Income -0.011 0.010 -0.011 0.010 -0.011 0.010
Person of Color -0.011 0.020
Other/Hispanic -0.044 0.026 -0.044 0.026
Black 0.027 0.028 0.027 0.028
Region: Northeast -0.000 0.028 0.002 0.028 0.001 0.028
Region: Midwest -0.020 0.020 -0.019 0.020 -0.019 0.021
Region: West -0.013 0.025 -0.008 0.025 -0.008 0.025
log(Total Tweets) 0.001 0.005
Freq. of social media use -0.004 0.007 -0.004 0.007 -0.005 0.008
Constant 0.084 0.069 0.089 0.070 0.079 0.077
Observations 917 917 917
R2 / R2 adjusted 0.021 / 0.004 0.025 / 0.006 0.025 / 0.005
  • p<0.05   ** p<0.01   *** p<0.001

In table 4 we find a negative effect on the exposure variable for independent voters, implying that greater exposure is associated with a lower probability of changing vote for independents. Conversely the coefficient for strong political views is positive and significant, so higher exposure increases the probability of voters switching preferences. As such, the results are consistent with those above, with independent voters showing a lower likelihood of switching voting preferences and those with strong political views showing a higher likelihood of switching.

# New Table E7 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new)

confint(vote_rank_total_russia_count_lm_controls_new)



vote_rank_total_russia_count_lm_controls_black_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new)

confint(vote_rank_total_russia_count_lm_controls_black_new)



vote_rank_total_russia_count_lm_controls_total_tweets_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new)
tab_model (vote_rank_total_russia_count_lm_controls_new, vote_rank_total_russia_count_lm_controls_black_new, vote_rank_total_russia_count_lm_controls_total_tweets_new, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 5: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 5: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure - Independent 0.006 0.014 0.006 0.014 0.007 0.014
Exposure - Lean -0.008 0.014 -0.008 0.014 -0.008 0.014
Exposure - Not Strong -0.019 0.015 -0.019 0.015 -0.019 0.015
Exposure - Strong -0.000 0.014 0.000 0.014 -0.000 0.014
Political Views - Lean -0.043 0.036 -0.042 0.036 -0.042 0.036
Political Views - Not Strong 0.015 0.040 0.016 0.040 0.016 0.040
Political Views - Strong -0.029 0.035 -0.027 0.035 -0.027 0.035
Age -0.000 0.000 -0.000 0.000 -0.000 0.000
Woman 0.033 * 0.016 0.033 * 0.016 0.033 * 0.015
College-educated 0.011 0.015 0.012 0.015 0.012 0.015
Income -0.004 0.008 -0.004 0.008 -0.004 0.008
Person of Color 0.019 0.020
Other/Hispanic 0.034 0.030 0.034 0.030
Black 0.006 0.025 0.006 0.025
Region: Northeast -0.010 0.022 -0.010 0.022 -0.010 0.022
Region: Midwest -0.007 0.018 -0.007 0.018 -0.007 0.018
Region: West 0.004 0.024 0.002 0.024 0.002 0.024
log(Total Tweets) -0.002 0.006
Freq. of social media use 0.003 0.006 0.003 0.006 0.003 0.007
Constant -0.003 0.067 -0.004 0.066 0.009 0.075
Observations 923 923 923
R2 / R2 adjusted 0.020 / 0.002 0.020 / 0.002 0.020 / 0.001
  • p<0.05   ** p<0.01   *** p<0.001

In table 5, none of the coefficients on our variables of interest are significant. Interestingly, however, the pattern of coefficients is different to the results above, with positive coefficients for independents and negative for strong voters. Similar to the results from using the alternative interaction term, therefore, the results suggest that when accounting for the possibility of switching to third candidates or not voting results are generally insignificant, and in this case showing opposite signs to when using the alternative dependent variables.

# New Table E8 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new3)

confint(vote_rank_total_russia_count_lm_controls_new3)



vote_rank_total_russia_count_lm_controls_black_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new3)

confint(vote_rank_total_russia_count_lm_controls_black_new3)


vote_rank_total_russia_count_lm_controls_total_tweets_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new3)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new3)
tab_model (vote_rank_total_russia_count_lm_controls_new3, vote_rank_total_russia_count_lm_controls_black_new3, vote_rank_total_russia_count_lm_controls_total_tweets_new3, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 6: Nonlinear effect of exposure to Russian tweets on 
  changes in voting preferences between the 1st wave of the 
       YouGov survey and the actual vote", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
Table 6: Nonlinear effect of exposure to Russian tweets on changes in voting preferences between the 1st wave of the YouGov survey and the actual vote
  (1) (2) (3)
Predictors Estimates std. Error Estimates std. Error Estimates std. Error
Exposure - Independent -0.057 * 0.027 -0.057 * 0.027 -0.044 0.028
Exposure - Lean 0.050 0.030 0.049 0.030 0.048 0.030
Exposure - Not Strong 0.058 * 0.030 0.057 0.030 0.060 * 0.029
Exposure - Strong 0.065 * 0.028 0.065 * 0.028 0.064 * 0.028
Political Views - Lean -0.086 0.093 -0.086 0.093 -0.084 0.093
Political Views - Not Strong -0.157 0.088 -0.157 0.088 -0.163 0.088
Political Views - Strong -0.130 0.083 -0.132 0.083 -0.130 0.083
Age -0.001 0.001 -0.001 0.001 -0.001 0.001
Woman 0.089 ** 0.029 0.088 ** 0.029 0.092 ** 0.029
College-educated 0.046 0.029 0.046 0.029 0.044 0.028
Income -0.034 * 0.015 -0.034 * 0.015 -0.034 * 0.015
Person of Color 0.076 * 0.035
Other/Hispanic 0.057 0.052 0.058 0.052
Black 0.096 * 0.041 0.093 * 0.040
Region: Northeast -0.013 0.041 -0.013 0.041 -0.011 0.041
Region: Midwest 0.026 0.036 0.026 0.036 0.030 0.036
Region: West -0.004 0.040 -0.001 0.040 0.001 0.040
log(Total Tweets) -0.021 * 0.010
Freq. of social media use 0.009 0.014 0.009 0.014 0.011 0.014
Constant 0.132 0.144 0.135 0.144 0.321 * 0.159
Observations 1146 1146 1146
R2 / R2 adjusted 0.032 / 0.019 0.033 / 0.018 0.037 / 0.022
  • p<0.05   ** p<0.01   *** p<0.001

In table 6 we find the strongest results. Higher exposure reduces the likelihood of changing voting preferences for independents, while it increases the probability for all other groups, with the effects being somewhat larger for strong groups. That this case represents actual voting patterns, it provides the strongest evidence that some groups are significantly affected by exposure to Russian tweets.

4. Conclusions

The results provide some partial support for the view that exposure to Russian tweets does have non-linear effects. The evidence suggests that higher exposure to Russian tweets is more likely to encourage voters with strong political preferences to switch their voting intentions towards Trump, but to lower the probability of voters with more independent political views to switch towards Trump. This is the opposite of the hypothesis tested, which was that more independent voters would be more likely to be influenced by exposure to Russian tweets (Fujiwara et al, 2023). These results are found to be robust to two alternative approaches to accounting for non-linearities, as well as to alternative definitions of the dependent variable and to the inclusion of different explanatory variables.

The explanation for such results is not so clear but may partly reflect that independents are less likely to be swayed by outside noise in their vote choice, potentially because they access a wide range of knowledge in reaching their voting choice. Conversely, those with stronger political views are perhaps less likely to receive signals contrary to their political opinions, such that when they do it has a greater impact on their voting patterns. If such results are found to hold in other studies, they suggest that those wanting to influence outcomes of elections are likely to be more effective if they focus on changing the opinions of those with stronger views.

References

Eady, G., Paskhalis, T., Zilinsky, J., Bonneau, R., Nagler, J., & Tucker, J. A. (2023). Exposure to the Russian Internet Research Agency foreign influence campaign on Twitter in the 2016 US election and its relationship to attitudes and voting behavior. Nature Communications, 14(1), 62. doi: https://doi.org/10.1038/s41467-022-35576-9

Freese, J., & Peterson, D. (2017). Replication in social science. Annual Review of Sociology, 43, 147-165, doi: 10.1146.

Fujiwara, T., Müller, K. and Schwarz, C. (2022). The Effect of Social Media on Elections: Evidence from the United States. SSRN Electronic Journal. [online] doi:https://doi.org/10.2139/ssrn.3719998.

Garcia, D. (2023). Influence of Facebook algorithms on political polarization tested. Nature. [online] doi:https://doi.org/10.1038/d41586-023-02325-x.

Nadeem, R. (2023). Voting patterns in the 2022 elections. [online] Pew Research Center - U.S. Politics & Policy. Available at: https://www.pewresearch.org/politics/2023/07/12/voting-patterns-in-the-2022-elections/ [Accessed 14 May 2024].

Pew Research Center (2020). Voters Rarely Switch Parties, but Recent Shifts Further Educational, Racial Divergence. [online]

Pew Research Center (2023). U.S. Politics & Policy. Available at: https://www.pewresearch.org/politics/2020/08/04/voters-rarely-switch-parties-but-recent-shifts-further-educational-racial-divergence/ [Accessed 14 May 2024].

Tpaskhalis (2023) Tpaskhalis/NCOMMS_RUSSIA_US_2016: Replication materials for ‘exposure to the Russian Internet Research Agency Foreign Influence Campaign on Twitter in the 2016 US election and its relationship to attitudes and voting behavior’, GitHub. Available at: https://github.com/tpaskhalis/ncomms_russia_us_2016 (Accessed: 8 May 2024).

Weeks, B.E., Lane, D.S., Kim, D.H., Lee, S.S. and Kwak, N. (2017). Incidental Exposure, Selective Exposure, and Political Information Sharing: Integrating Online Exposure Patterns and Expression on Social Media. Journal of Computer-Mediated Communication, 22(6), pp.363–379. doi:https://doi.org/10.1111/jcc4.12199.

Appendix

Appendix 1. My enviroment (full information)

# Detailed information about my environment
sessionInfo()
R version 4.3.2 (2023-10-31)
Platform: x86_64-apple-darwin20 (64-bit)
Running under: macOS Sonoma 14.3.1

Matrix products: default
BLAS:   /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRblas.0.dylib 
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib;  LAPACK version 3.11.0

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

time zone: Europe/Amsterdam
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] reshape2_1.4.4   sjPlot_2.8.15    ggplot2_3.4.4    openxlsx_4.2.5.2
 [5] lubridate_1.9.2  cowplot_1.1.3    tidyr_1.3.0      sandwich_3.1-0  
 [9] nnet_7.3-19      mvtnorm_1.2-3    MASS_7.3-60      lmtest_0.9-40   
[13] zoo_1.8-12       lfe_3.0-0        Matrix_1.6-5     estimatr_1.0.2  
[17] dplyr_1.1.2      knitr_1.43       rmarkdown_2.23  

loaded via a namespace (and not attached):
 [1] sjlabelled_1.2.0   tidyselect_1.2.0   farver_2.1.1       fastmap_1.1.1     
 [5] bayestestR_0.13.2  sjstats_0.18.2     digest_0.6.33      timechange_0.2.0  
 [9] estimability_1.4.1 lifecycle_1.0.3    magrittr_2.0.3     compiler_4.3.2    
[13] rlang_1.1.1        sass_0.4.7         tools_4.3.2        utf8_1.2.3        
[17] yaml_2.3.7         labeling_0.4.2     RColorBrewer_1.1-3 plyr_1.8.9        
[21] withr_2.5.0        purrr_1.0.2        grid_4.3.2         datawizard_0.9.1  
[25] fansi_1.0.4        xtable_1.8-4       colorspace_2.1-0   emmeans_1.8.8     
[29] scales_1.2.1       insight_0.19.10    cli_3.6.1          generics_0.1.3    
[33] rstudioapi_0.15.0  performance_0.10.9 modelr_0.1.11      parameters_0.21.2 
[37] minqa_1.2.6        cachem_1.0.8       stringr_1.5.0      splines_4.3.2     
[41] parallel_4.3.2     effectsize_0.8.6   vctrs_0.6.3        boot_1.3-28.1     
[45] jsonlite_1.8.7     hms_1.1.3          Formula_1.2-5      jquerylib_0.1.4   
[49] glue_1.6.2         nloptr_2.0.3       codetools_0.2-19   stringi_1.7.12    
[53] gtable_0.3.3       ggeffects_1.3.1    lme4_1.1-35.1      munsell_0.5.0     
[57] tibble_3.2.1       pillar_1.9.0       htmltools_0.5.5    R6_2.5.1          
[61] evaluate_0.21      lattice_0.21-9     haven_2.5.3        highr_0.10        
[65] backports_1.4.1    snakecase_0.11.1   broom_1.0.5        bslib_0.5.0       
[69] Rcpp_1.0.11        zip_2.3.1          coda_0.19-4        nlme_3.1-163      
[73] xfun_0.40          forcats_1.0.0      sjmisc_2.8.9       pkgconfig_2.0.3   

Appendix 2. Entire R code used in the project

# Opening key libraries first
library(rmarkdown)
library(knitr)
# Global options
opts_chunk$set(echo=TRUE,
                 cache=TRUE,
               comment=NA,
               message=FALSE,
               warning=FALSE)
# All used libraries
library(rmarkdown)
library(knitr)
library(dplyr)
library(estimatr)
library(lfe)
library(lmtest)
library(MASS)
library(mvtnorm)
library(nnet)
library(sandwich)
library(tidyr)
library(cowplot)
library(lubridate)
library(openxlsx)
library(ggplot2)
library(sjPlot)
library(reshape2)
# Versions of used packages
packages <- c("rmarkdown", "knitr", "dplyr", "estimatr", "lfe", "lmtest", "MASS", "mvtnorm", "nnet", "sandwich", "tidyr", "cowplot", "lubridate", "openxlsx", "ggplot2", "sjPlot", "reshape2")
names(packages) <- packages
lapply(packages, packageVersion)
# What is my R version?
version[['version.string']]
#load in the data 
us2016_twitter <- readRDS("Survey_Data.rds")

#re-code the data so that education is now split between 'High school or below' and 'College', the race variable is now 'White' or 'Non-White', regions are also divided into 'South', 'Northeast', 'Midwest' and 'West' 
us2016_recoded <- us2016_twitter %>%
  filter(have_twitter_data == 1) %>%
  mutate(
    income = as.numeric(income),
    education = factor(case_when(
      education == "High school or below" ~ "High school or below",
      education %in% c("College degree", "Post-graduate degree") ~ "College+"
    ), levels = c("High school or below", "College+")),
    race = factor(case_when(
      race == "White" ~ "White",
      race %in% c("Black", "Hispanic", "Other") ~ "Non-White"
    ), levels = c("White", "Non-White")),
    region = factor(region, levels = c("South", "Northeast", "Midwest", "West"))
  )

#Recode variables into 4 categories "Strong", "Lean", "Not Strong" and "Independent" 

us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Strong Democrat"] <- "Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Strong Republican"] <- "Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Lean Democrat"] <- "Lean"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Lean Republican"] <- "Lean"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Not very strong Democrat"] <- "Not Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Not very strong Republican"] <- "Not Strong"
us2016_recoded$pol_strength[us2016_recoded$pid7_factor == "Independent"] <- "Independent"

#Recode variables 
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Strong Democrat"] <- 0
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Strong Republican"] <- 0
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Lean Democrat"] <- .25
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Lean Republican"] <- .25
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Not very strong Democrat"] <- .5
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Not very strong Republican"] <- .5
us2016_recoded$pol_strength_num[us2016_recoded$pid7_factor == "Independent"] <- 0.75


# Average value of the newly created political strength variable
mean(us2016_recoded$pol_strength_num, na.rm = TRUE)
# Plot of distribution of newly created political strength variable
desc_plot <- ggplot((data = us2016_recoded), aes(x = pol_strength, na.rm = TRUE)) + labs(x = "Political Strength", y = "Count", title = "Figure 1: Distribution of Political Views") +
    geom_bar() 

desc_plot

# Descriptive two-way tables on numbers switching vote by political leaning
desc_table_1 <- table(us2016_recoded$pol_strength_num, us2016_recoded$change_rank_trump_over_clinton_w1w3)
colnames(desc_table_1) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_1) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_1

desc_table_2 <- table(us2016_recoded$pol_strength_num, us2016_recoded$voted_trump_versus_clinton)
colnames(desc_table_2) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_2) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_2


desc_table_3 <- table(us2016_recoded$pol_strength_num, us2016_recoded$voted_trump_versus_clinton_benefit)
colnames(desc_table_3) = c("Away from Trump", "No Change", "Towards Trump")
rownames(desc_table_3) = c("Strong", "Not Strong", "Lean", "Independent") 
desc_table_3

#===============================================================================
# Introduce the Interactions between Exposure and Strength of Political Views

#Create a new Table E6 with Interaction term 
vote_rank_total_russia_count_lm_controls <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)

vote_rank_total_russia_count_lm_controls_black <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black)

vote_rank_total_russia_count_lm_controls_total_tweets <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model (vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"), title = "Table 1: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between survey waves", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + labs(title = "Figure 2: Nonlinear effect of exposure to Russian tweets on change 
in voting preferences towards Trump between survey 
Wave 1 and 2", x = " Total Exposure (log +1)", y = "Change in voting preference 
towards Trump between Wave 1 and Wave 2", color = "Strength of Political Views")
# New Table E7 with Interaction
vote_rank_total_russia_count_lm_controls <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)

vote_rank_total_russia_count_lm_controls_black <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black)


vote_rank_total_russia_count_lm_controls_total_tweets <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model (vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"), title = "Table 2: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + labs(title = "Figure 3:  Nonlinear effect of exposure to Russian tweets 
                on changes in voter preference towards Trump, third party 
                candidates or no vote", x = " Total Exposure (log +1)", 
y = "Change in voting preference towards Trump, 
      third party candidates and no vote"     , color = "Strength of Political Views")
# New Table E8 with Interaction

vote_rank_total_russia_count_lm_controls <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls)

confint(vote_rank_total_russia_count_lm_controls)


vote_rank_total_russia_count_lm_controls_black <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)

summary(vote_rank_total_russia_count_lm_controls_black)

confint(vote_rank_total_russia_count_lm_controls_black )


vote_rank_total_russia_count_lm_controls_total_tweets <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength_num + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log + pol_strength_num, data = us2016_recoded)

summary(vote_rank_total_russia_count_lm_controls_total_tweets)

confint(vote_rank_total_russia_count_lm_controls_total_tweets)
#Create a tab model combining the above regressions 
tab_model(vote_rank_total_russia_count_lm_controls, vote_rank_total_russia_count_lm_controls_black, vote_rank_total_russia_count_lm_controls_total_tweets, pred.labels = c ("Constant", "Exposure", "Political Views", "Age", " Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure * Political Views", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 3: Non-linear effects of exposure to Russian tweets on changes in voting preferences between the 1st wave of the YouGov survey and the actual vote", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 3, 13, 4, 5, 6, 7, 14, 15, 8, 9, 10, 11, 16, 12, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
plot_model(vote_rank_total_russia_count_lm_controls, type = "pred", terms = c("total_exposure_russia_log", "pol_strength_num")) + 
  labs(title = "Figure 4:  Nonlinear effect of exposure to Russian tweets on 
  changes in voting preferences between the 1st wave of the 
       YouGov survey and the actual vote. ", x = "Total Exposure (log +1)", 
       y = "Change in voting preference between the 1st 
       wave of the survey and the actual vote",  color = "Strength of Political Views")
# Introduce the Interactions between Exposure and Strength of Political Views

# New Table E6 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new1)

confint(vote_rank_total_russia_count_lm_controls_new1)



vote_rank_total_russia_count_lm_controls_black_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new1)

confint(vote_rank_total_russia_count_lm_controls_black_new1)



vote_rank_total_russia_count_lm_controls_total_tweets_new1 <- lm(change_rank_trump_over_clinton_w1w3 ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new1)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new1)

tab_model (vote_rank_total_russia_count_lm_controls_new1, vote_rank_total_russia_count_lm_controls_black_new1, vote_rank_total_russia_count_lm_controls_total_tweets_new1, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 4: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference between waves of the survey ", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)

# New Table E7 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new)

confint(vote_rank_total_russia_count_lm_controls_new)



vote_rank_total_russia_count_lm_controls_black_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new)

confint(vote_rank_total_russia_count_lm_controls_black_new)



vote_rank_total_russia_count_lm_controls_total_tweets_new <- lm(voted_trump_versus_clinton ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new)

tab_model (vote_rank_total_russia_count_lm_controls_new, vote_rank_total_russia_count_lm_controls_black_new, vote_rank_total_russia_count_lm_controls_total_tweets_new, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 5: Non-linear effects of exposure to Russian tweets on the likelihood of shifting voter preference towards Trump, a no vote, or a 3rd candidate", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
# New Table E8 with Interaction (This is an alternative where we estimate a separate coefficient on exposure for each type of political strength)

vote_rank_total_russia_count_lm_controls_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_new3)

confint(vote_rank_total_russia_count_lm_controls_new3)



vote_rank_total_russia_count_lm_controls_black_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_black_new3)

confint(vote_rank_total_russia_count_lm_controls_black_new3)


vote_rank_total_russia_count_lm_controls_total_tweets_new3 <- lm(voted_trump_versus_clinton_benefit ~  total_exposure_russia_log * pol_strength + age + gender + education + income + race_other_hispanic + race_black + region + internet_social_media_w1 + total_tweets_log, data = us2016_recoded)
summary(vote_rank_total_russia_count_lm_controls_total_tweets_new3)

confint(vote_rank_total_russia_count_lm_controls_total_tweets_new3)
tab_model (vote_rank_total_russia_count_lm_controls_new3, vote_rank_total_russia_count_lm_controls_black_new3, vote_rank_total_russia_count_lm_controls_total_tweets_new3, pred.labels = c ("Constant", "Exposure - Independent", "Political Views - Lean", "Political Views - Not Strong", "Political Views - Strong", "Age", "Woman", "College-educated", "Income", "Person of Color", "Region: Northeast", "Region: Midwest", "Region: West", "Freq. of social media use", "Exposure - Lean", "Exposure - Not Strong", "Exposure - Strong", "Other/Hispanic", "Black", "log(Total Tweets)"),  title = "Table 6: Nonlinear effect of exposure to Russian tweets on 
  changes in voting preferences between the 1st wave of the 
       YouGov survey and the actual vote", digits = 3, 
           dv.labels = c("(1)", "(2)", "(3)"),
           order.terms = c(2, 15, 16, 17, 3, 4, 5, 6, 7, 8, 9, 10, 18, 19, 11, 12, 13, 20, 14, 1), 
            p.style = "stars", show.ci = FALSE, vcov.fun = "HC0", show.se = TRUE)
# Detailed information about my environment
sessionInfo()
LS0tCnRpdGxlOiAiU01JMjA1IFJlcGxpY2F0aW9uIFByb2plY3QgKDIwMjQpIgphdXRob3I6ICcyMjAxNzUyMzAnCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICB0b2M6IHRydWUKICAgIHRvY19kZXB0aDogMgogICAgdG9jX2Zsb2F0OgogICAgICBjb2xsYXBzZWQ6IGZhbHNlCiAgICAgIHNtb290aF9zY3JvbGw6IHRydWUKICB3b3JkX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICcyJwogIHBkZl9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMicKLS0tCgpgYGB7ciBzdGFydCwgaW5jbHVkZT1GQUxTRX0KIyBPcGVuaW5nIGtleSBsaWJyYXJpZXMgZmlyc3QKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoa25pdHIpCmBgYAoKIyBSZXBsaWNhdGlvbiBQcm9qZWN0IAoKIyMjIFJwdWJzIGxpbms6IGh0dHBzOi8vcnB1YnMuY29tL0gyMjAxNzUyMzAvMTE5MTA2OAojIyMgR2l0SHViIFJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS8yMjAxNzUyMzAvU01JMjA1LVByb2plY3QKIyMjIFN0dWR5IFByZXJlZ2lzdHJhdGlvbiBmb3JtOiBodHRwczovL3JwdWJzLmNvbS9IMjIwMTc1MjMwLzExODU0OTMKCiMjIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgcmVwbGljYXRpb24gcHJvamVjdAoqIFJlcGxpY2F0aW9uIHByb2plY3QgYmFzZWQgb24gcGFwZXIsIEVhZHksIEcuLCBQYXNraGFsaXMsIFQuLCBaaWxpbnNreSwgSi4sIEJvbm5lYXUsIFIuLCBOYWdsZXIsIEouLCAmIFR1Y2tlciwgSi4gQS4gKDIwMjMpLiBFeHBvc3VyZSB0byB0aGUgUnVzc2lhbiBJbnRlcm5ldCBSZXNlYXJjaCBBZ2VuY3kgZm9yZWlnbiBpbmZsdWVuY2UgY2FtcGFpZ24gb24gVHdpdHRlciBpbiB0aGUgMjAxNiBVUyBlbGVjdGlvbiBhbmQgaXRzIHJlbGF0aW9uc2hpcCB0byBhdHRpdHVkZXMgYW5kIHZvdGluZyBiZWhhdmlvci4gTmF0dXJlIENvbW11bmljYXRpb25zLCAxNCgxKSwgNjIuIEF2YWlhYmxlIGF0OiBodHRwczovL2RvaS5vcmcvMTAuMTAzOC9zNDE0NjctMDIyLTM1NTc2LTkKCiogUmVwbGljYXRpb24gbWV0aG9kOgogICsgVXNlZCBtYXRlcmlhbHMgb2J0YWluZWQgZnJvbSBhdXRob3JzCgoKIyMgV29ya3NwYWNlIHNldHVwIHsudGFic2V0IC50YWJzZXQtcGlsbHN9CgojIyMgWUFNTCBzZXR0aW5ncwoKIG91dHB1dDogPC9icj4KICAmbmJzcDsgaHRtbF9kb2N1bWVudDogPC9icj4KICAgICZuYnNwOyZuYnNwOyBjb2RlX2Rvd25sb2FkOiB0cnVlIDwvYnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jOiB0cnVlIDwvYnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jX2RlcHRoOiAyIDwvYnI+CiAgICAmbmJzcDsmbmJzcDsmbmJzcDsgdG9jX2Zsb2F0OiA8L2JyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgY29sbGFwc2VkOiBmYWxzZSA8L2JyPgogICAgICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgc21vb3RoX3Njcm9sbDogdHJ1ZSA8L2JyPgoKIyMjIEdsb2JhbCBzZXR0aW5ncyBvZiBSIGNodW5rcwoKYGBge3Igc2V0dXAsIGluY2x1ZGU9VFJVRX0KIyBHbG9iYWwgb3B0aW9ucwpvcHRzX2NodW5rJHNldChlY2hvPVRSVUUsCgkgICAgICAgICAgICAgY2FjaGU9VFJVRSwKICAgICAgICAgICAgICAgY29tbWVudD1OQSwKICAgICAgICAgICAgICAgbWVzc2FnZT1GQUxTRSwKICAgICAgICAgICAgICAgd2FybmluZz1GQUxTRSkKYGBgCgojIyMgTGlicmFyaWVzCgpgYGB7ciBsaWJyYXJpZXMsIGluY2x1ZGU9VFJVRX0KIyBBbGwgdXNlZCBsaWJyYXJpZXMKbGlicmFyeShybWFya2Rvd24pCmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZXN0aW1hdHIpCmxpYnJhcnkobGZlKQpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShNQVNTKQpsaWJyYXJ5KG12dG5vcm0pCmxpYnJhcnkobm5ldCkKbGlicmFyeShzYW5kd2ljaCkKbGlicmFyeSh0aWR5cikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShvcGVueGxzeCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHNqUGxvdCkKbGlicmFyeShyZXNoYXBlMikKYGBgCgojIyMgVmVyc2lvbnMgb2YgdXNlZCBwYWNrYWdlcwoKYGBge3IgdmVyc2lvbnMsIGVjaG89RkFMU0V9CiMgVmVyc2lvbnMgb2YgdXNlZCBwYWNrYWdlcwpwYWNrYWdlcyA8LSBjKCJybWFya2Rvd24iLCAia25pdHIiLCAiZHBseXIiLCAiZXN0aW1hdHIiLCAibGZlIiwgImxtdGVzdCIsICJNQVNTIiwgIm12dG5vcm0iLCAibm5ldCIsICJzYW5kd2ljaCIsICJ0aWR5ciIsICJjb3dwbG90IiwgImx1YnJpZGF0ZSIsICJvcGVueGxzeCIsICJnZ3Bsb3QyIiwgInNqUGxvdCIsICJyZXNoYXBlMiIpCm5hbWVzKHBhY2thZ2VzKSA8LSBwYWNrYWdlcwpsYXBwbHkocGFja2FnZXMsIHBhY2thZ2VWZXJzaW9uKQpgYGAKIyMjIE15IGVudmlyb21lbnQKCmBgYHtyIG15UiwgZWNobz1GQUxTRX0KIyBXaGF0IGlzIG15IFIgdmVyc2lvbj8KdmVyc2lvbltbJ3ZlcnNpb24uc3RyaW5nJ11dCmBgYAoKIyMgMS4gSW50cm9kdWN0aW9uCgpUaGUgcGFwZXIgZXhhbWluZXMgd2hldGhlciBleHBvc3VyZSB0byBSdXNzaWFuIGZvcmVpZ24gaW5mbHVlbmNlIFR3aXR0ZXIgcG9zdHMgYWZmZWN0cyB0aGUgdm90aW5nIGNob2ljZSBvZiB2b3RlcnMgaW4gdGhlIDIwMTYgVVMgZWxlY3Rpb24sIGFuZCBzcGVjaWZpY2FsbHkgd2hldGhlciB0aGV5IGFyZSBtb3JlIGxpa2VseSB0byBzd2l0Y2ggdG93YXJkcyBEb25hbGQgVHJ1bXAuIFRoZSBhdXRob3JzIGZpbmQgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCByZWxhdGlvbnNoaXAgYmV0d2VlbiBleHBvc3VyZSB0byBSdXNzaWFuIHBvc3RzIGFuZCBjaGFuZ2VzIGluIHZvdGluZyBiZWhhdmlvdXIuIFRoZWlyIGFuYWx5c2lzIGFzc3VtZXMgYSBsaW5lYXIgcmVsYXRpb25zaGlwLCBtZWFuaW5nIHRoYXQgdGhlIGVmZmVjdCBkb2VzIG5vdCBkZXBlbmQgdXBvbiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBpbmRpdmlkdWFscyBleHBvc2VkIHRvIHRoZSBwb3N0cy4gSXQgaXMgcGxhdXNpYmxlLCBob3dldmVyLCB0aGF0IGVmZmVjdHMgYXJlIGhldGVyb2dlbmVvdXMuIFdoaWxlIHRoZXJlIGlzIG5vIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGV4cG9zdXJlIGFuZCB2b3RpbmcgY2hvaWNlcyBmb3IgdGhlIGZ1bGwgc2FtcGxlLCB0aGVyZSBtYXkgYmUgc29tZSBkZW1vZ3JhcGhpYyBncm91cHMgZm9yIHdoaWNoIHRoZSBwb3N0cyBkbyBoYXZlIGFuIGluZmx1ZW5jZS4gVmFyaW91cyBkZW1vZ3JhcGhpYyBjaGFyYWN0ZXJpc3RpY3MgbWF5IGJlIHJlbGV2YW50IHdoZW4gY29uc2lkZXJpbmcgaGV0ZXJvZ2VuZWl0eSwgaW5jbHVkaW5nIGFnZSwgZWR1Y2F0aW9uIGxldmVscywgZXRobmljaXR5LCBhbmQgZ2VuZGVyIChlLmcuIFBldyBSZXNlYXJjaCBDZW50ZXIsIDIwMjMpLiBUaGlzIHN0dWR5IGZvY3VzZXMgZXhwbGljaXRseSBvbiB0aGUgc3RyZW5ndGggb2YgYW4gaW5kaXZpZHVhbOKAmXMgcG9saXRpY2FsIHZpZXdzIGFuZCB3aGV0aGVyIHRoaXMgYWZmZWN0cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgYW5kIHZvdGluZyBwYXR0ZXJucy4gCgpUaGUgUGV3IFJlc2VhcmNoIENlbnRlciBzdHVkeSAoMjAyMCkgc2hvd3MgdGhhdCB2b3RlcnMgcmFyZWx5IHN3aXRjaCBwYXJ0aWVzLCBhbiBvdXRjb21lIGNvbnNpc3RlbnQgd2l0aCB0aGUgZGF0YSB1c2VkIGluIEVhZHkgZXQgYWwuICgyMDIzKS4gVGhleSBkbyBmaW5kLCBob3dldmVyLCB0aGF0IHN3aXRjaGluZyBpcyBtb3JlIGxpa2VseSBhbW9uZyBsZXNzIHBvbGl0aWNhbGx5IGVuZ2FnZWQgdm90ZXJzLiBTdWNoIG91dGNvbWVzIGZ1cnRoZXIgc3VnZ2VzdCB0aGF0IGZvcmVpZ24gaW5mbHVlbmNlIGNhbXBhaWducyBhcmUgdW5saWtlbHkgdG8gaW5mbHVlbmNlIHRoZSB2b3RpbmcgY2hvaWNlcyBvZiBtb3JlIHBvbGl0aWNhbGx5IGVuZ2FnZWQgdm90ZXJzIGJ1dCBoYXZlIGEgYmV0dGVyIGNoYW5jZSBvZiBpbmZsdWVuY2luZyB0aG9zZSBsZXNzIHBvbGl0aWNhbGx5IGVuZ2FnZWQgKEZ1aml3YXJhIGV0IGFsLCAyMDIzKS4gVGhpcyBpcyBpbiBwYXJ0IGR1ZSB0byBwb2xpdGljYWxseSBlbmdhZ2VkIHZvdGVycyBvZnRlbiBzZWVraW5nIG91dCBpbmZvcm1hdGlvbiBvbmxpbmUgd2hpY2ggYWxpZ24gd2l0aCB0aGVpciBjdXJyZW50IGJlbGllZnMgKFdlZWtzIGV0IGFsLCAyMDE3KS4gR2l2ZW4gdGhhdCB0aGVzZSB2b3RlcnMgdGVuZCB0byB2aWV3IHBvc3RzIHRoYXQgcmVpbmZvcmNlIHRoZWlyIGJlbGllZnMsIHRoZXJlIGlzIG9mdGVuIGEgbGVzc2VyIGxpa2VsaWhvb2Qgb2Ygdmlld2luZyBwb3N0cyB0aGF0IHByb3ZpZGUgYWx0ZXJuYXRlIHZpZXdwb2ludHMgKEdhcmNpYSwgMjAyMykuIAoKSW4gb3JkZXIgdG8gdW5kZXJ0YWtlIHRoaXMgZXh0ZW5zaW9uLCB0aGUgc2FtZSBkYXRhIGFzIGluIHRoZSBvcmlnaW5hbCBzdHVkeSB3aWxsIGJlIHVzZWQuIFRoZSBtZXRob2RvbG9neSB1c2VkLCBob3dldmVyLCB3aWxsIGJlIGRpZmZlcmVudCwgd2l0aCB0aGUgYXBwcm9hY2ggYWxsb3dpbmcgZm9yIG5vbi1saW5lYXIgZWZmZWN0cy4gVXNpbmcgaW5mb3JtYXRpb24gaW4gdGhlIGRhdGFzZXQgb2YgRWFkeSBldCBhbC4gKDIwMjMpIG9uIHRoZSBzdHJlbmd0aCBvZiBhIHZvdGVy4oCZcyBhZmZpbGlhdGlvbiB0byBhIHBhcnRpY3VsYXIgcGFydHksIHRoZSBzdHVkeSB0ZXN0cyB0aGUgaHlwb3RoZXNpcyB0aGF0IGZvcmVpZ24gaW5mbHVlbmNlIGNhbXBhaWducyBhcmUgbW9yZSBsaWtlbHkgdG8gY2hhbmdlIHRoZSB2b3RpbmcgYmVoYXZpb3VyIG9mIHRob3NlIHdpdGggbW9kZXJhdGUgcG9saXRpY2FsIHZpZXdzLiBUaGUgc3R1ZHkgdXNlcyBhbiBpbmRpY2F0b3Igb2Ygd2hlcmUgdm90ZXJzIHJhbmsgdGhlbXNlbHZlcyBvbiBhIHNjYWxlICgwIGJlaW5nIHN0cm9uZyBEZW1vY3JhdCBhbmQgMSBzdHJvbmcgUmVwdWJsaWNhbikgdG8gYWRkcmVzcyB0aGlzIGh5cG90aGVzaXMuIFRvIHRlc3QgZm9yIHRoaXMgaGV0ZXJvZ2VuZWl0eSBvciBub24tbGluZWFyaXR5LCBhIGxpbmVhciByZWdyZXNzaW9uIG1vZGVsIHdpdGggaW50ZXJhY3Rpb24gdGVybXMgaXMgZW1wbG95ZWQuIFNwZWNpZmljYWxseSwgdGhlIGFwcHJvYWNoIGluY2x1ZGVzIGFuIGludGVyYWN0aW9uIHRlcm0gYmV0d2VlbiB0aGUgc3RyZW5ndGggb2YgcG9saXRpY2FsIHZpZXdzIGFuZCB0aGUgZXhwb3N1cmUgdG8gZm9yZWlnbiBpbmZsdWVuY2UgY2FtcGFpZ25zLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgaW50ZXJhY3Rpb24gdGVybSB3aWxsIGJlIHNpZ25pZmljYW50LCBzdWNoIHRoYXQgaW5kaXZpZHVhbHMgd2l0aCB3ZWFrZXIgcG9saXRpY2FsIHZpZXdzIHdpbGwgc2hvdyBhIGdyZWF0ZXIgbGlrZWxpaG9vZCBvZiBjaGFuZ2luZyB0aGVpciB2b3RpbmcgYmVoYXZpb3VyIGluIHJlc3BvbnNlIHRvIFJ1c3NpYW4gdHdlZXRzLgoKR2l2ZW4gdGhlIGFib3ZlIGluZm9ybWF0aW9uIEkgYW0gdGVzdGluZyB0aGUgaHlwb3RoZXNpcyB0aGF0IHZvdGVycyB3aXRoIG1vcmUgcG9saXRpY2FsbHkgbW9kZXJhdGUgdmlld3MgYXJlIG1vcmUgbGlrZWx5IHRvIGJlIGluZmx1ZW5jZWQgYnkgZm9yZWlnbiBpbmZsdWVuY2UgY2FtcGFpZ25zIHRvIGNoYW5nZSB0aGVpciB2b3RlIHByZWZlcmVuY2VzLiAKCiMjIDIuIERhdGEgYW5kIG1ldGhvZHMKCiMjIyAyLjEuIERhdGEKCmBgYHtyLCByZXN1bHRzID0gJ2hpZGUnfQojbG9hZCBpbiB0aGUgZGF0YSAKdXMyMDE2X3R3aXR0ZXIgPC0gcmVhZFJEUygiU3VydmV5X0RhdGEucmRzIikKCmBgYAoKClRoZSBkYXRhIGNvbWJpbmVzIGEgWW91R292IHN1cnZleSBhbmQgVHdpdHRlciAyNyBlbGVjdGlvbiBpbnRlZ3JpdHkgZGF0YS4gVGhlIGRhdGEgY29tcHJpc2VzIDMsNTAwIG9ic2VydmF0aW9ucyBvbiAxOTAgdmFyaWFibGVzLCB0aG91Z2ggdGhlIGF1dGhvcnMgZXhjbHVkZSBpbmRpdmlkdWFscyB3aXRob3V0IGEgVHdpdHRlciBhY2NvdW50LiBUaGVyZSBhcmUgdGhyZWUgZGVwZW5kZW50IHZhcmlhYmxlczsgJ2NoYW5nZV9yYW5rX3RydW1wX292ZXJfY2xpbnRvbl93MXczJzsgJ3ZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uJzogYW5kICd2b3RlZF90cnVtcF92ZXJzdXNfY2xpbnRvbl9iZW5lZml0Jy4gQWxsIHRocmVlIHRha2Ugb24gdGhyZWUgcG9zc2libGUgdmFsdWVzOiArMSBpbmRpY2F0aW5nIGEgc2hpZnQgdG93YXJkcyBUcnVtcCwgLTEgYSBzaGlmdCBhd2F5IGZyb20gVHJ1bXAsIGFuZCAwIGluZGljYXRpbmcgbm8gY2hhbmdlLiBUaGUgZmlyc3QgdmFyaWFibGUgY2FwdHVyZXMgY2hhbmdlcyBpbiB0aGUgcmFua2luZyBvZiBUcnVtcCB2ZXJzdXMgQ2xpbnRvbiBiZXR3ZWVuIHRoZSAxc3QgYW5kIDJuZCBzdXJ2ZXkgd2F2ZXM7IHRoZSBzZWNvbmQgc2hpZnRzIHRvd2FyZHMgKG9yIGF3YXkpIFRydW1wLCBhIG5vIHZvdGUsIG9yIGEgM3JkIGNhbmRpZGF0ZSAoKzEpOyBhbmQgdGhlIHRoaXJkIGNoYW5nZXMgaW4gdm90aW5nIHByZWZlcmVuY2VzIGJldHdlZW4gdGhlIDFzdCBzdXJ2ZXkgYW5kIHRoZSBhY3R1YWwgdm90ZS4KClRoZSBtYWluIGluZGVwZW5kZW50IHZhcmlhYmxlIGNhcHR1cmVzIHRoZSBudW1iZXIgb2YgUnVzc2lhbiB0d2VldHMgYW4gaW5kaXZpZHVhbCBpcyBleHBvc2VkIHRvLiBHaXZlbiB0aGUgaW50ZXJlc3QgaW4gdGhlIHN0cmVuZ3RoIG9mIHBvbGl0aWNhbCB2aWV3cyBhbmQgbm90IHdoZXRoZXIgdGhleSBhcmUgc3Ryb25nbHkgRGVtb2NyYXQgb3IgUmVwdWJsaWNhbiwgdGhlIHZhcmlhYmxlIG9uIHBvbGl0aWNhbCBwZXJzdWFzaW9uIChwaWQ3KSBpcyByZWNvZGVkIHNvIHRoYXQgJ1N0cm9uZyBEZW1vY3JhdCcgYW5kICdTdHJvbmcgUmVwdWJsaWNhbicgYXJlIGNsYXNzaWZpZWQgYXMgJ1N0cm9uZycsICdMZWFuIERlbW9jcmF0JyBhbmQgJ0xlYW4gUmVwdWJsaWNhbicgYXJlICdMZWFuJywgJ05vdCB2ZXJ5IHN0cm9uZyBEZW1vY3JhdCcgYW5kICdOb3QgdmVyeSBzdHJvbmcgUmVwdWJsaWNhbicgYXJlICdOb3QgU3Ryb25nJywgYW5kICdJbmRlcGVuZGVudCcgcmVtYWlucyAnSW5kZXBlbmRlbnQnLiBBIG51bWVyaWNhbCB2YXJpYWJsZSBpcyBhbHNvIGNyZWF0ZWQsIHdpdGggMCBiZWluZyDigJhTdHJvbmfigJksIDAuMjUgYmVpbmcg4oCYTGVhbuKAmSwgMC41IGJlaW5nIOKAmE5vdCBTdHJvbmfigJksIGFuZCAwLjc1IGJlaW5nIOKAmEluZGVwZW5kZW504oCZLgoKYGBge3J9CiNyZS1jb2RlIHRoZSBkYXRhIHNvIHRoYXQgZWR1Y2F0aW9uIGlzIG5vdyBzcGxpdCBiZXR3ZWVuICdIaWdoIHNjaG9vbCBvciBiZWxvdycgYW5kICdDb2xsZWdlJywgdGhlIHJhY2UgdmFyaWFibGUgaXMgbm93ICdXaGl0ZScgb3IgJ05vbi1XaGl0ZScsIHJlZ2lvbnMgYXJlIGFsc28gZGl2aWRlZCBpbnRvICdTb3V0aCcsICdOb3J0aGVhc3QnLCAnTWlkd2VzdCcgYW5kICdXZXN0JyAKdXMyMDE2X3JlY29kZWQgPC0gdXMyMDE2X3R3aXR0ZXIgJT4lCiAgZmlsdGVyKGhhdmVfdHdpdHRlcl9kYXRhID09IDEpICU+JQogIG11dGF0ZSgKICAgIGluY29tZSA9IGFzLm51bWVyaWMoaW5jb21lKSwKICAgIGVkdWNhdGlvbiA9IGZhY3RvcihjYXNlX3doZW4oCiAgICAgIGVkdWNhdGlvbiA9PSAiSGlnaCBzY2hvb2wgb3IgYmVsb3ciIH4gIkhpZ2ggc2Nob29sIG9yIGJlbG93IiwKICAgICAgZWR1Y2F0aW9uICVpbiUgYygiQ29sbGVnZSBkZWdyZWUiLCAiUG9zdC1ncmFkdWF0ZSBkZWdyZWUiKSB+ICJDb2xsZWdlKyIKICAgICksIGxldmVscyA9IGMoIkhpZ2ggc2Nob29sIG9yIGJlbG93IiwgIkNvbGxlZ2UrIikpLAogICAgcmFjZSA9IGZhY3RvcihjYXNlX3doZW4oCiAgICAgIHJhY2UgPT0gIldoaXRlIiB+ICJXaGl0ZSIsCiAgICAgIHJhY2UgJWluJSBjKCJCbGFjayIsICJIaXNwYW5pYyIsICJPdGhlciIpIH4gIk5vbi1XaGl0ZSIKICAgICksIGxldmVscyA9IGMoIldoaXRlIiwgIk5vbi1XaGl0ZSIpKSwKICAgIHJlZ2lvbiA9IGZhY3RvcihyZWdpb24sIGxldmVscyA9IGMoIlNvdXRoIiwgIk5vcnRoZWFzdCIsICJNaWR3ZXN0IiwgIldlc3QiKSkKICApCgojUmVjb2RlIHZhcmlhYmxlcyBpbnRvIDQgY2F0ZWdvcmllcyAiU3Ryb25nIiwgIkxlYW4iLCAiTm90IFN0cm9uZyIgYW5kICJJbmRlcGVuZGVudCIgCgp1czIwMTZfcmVjb2RlZCRwb2xfc3RyZW5ndGhbdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIlN0cm9uZyBEZW1vY3JhdCJdIDwtICJTdHJvbmciCnVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aFt1czIwMTZfcmVjb2RlZCRwaWQ3X2ZhY3RvciA9PSAiU3Ryb25nIFJlcHVibGljYW4iXSA8LSAiU3Ryb25nIgp1czIwMTZfcmVjb2RlZCRwb2xfc3RyZW5ndGhbdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIkxlYW4gRGVtb2NyYXQiXSA8LSAiTGVhbiIKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoW3VzMjAxNl9yZWNvZGVkJHBpZDdfZmFjdG9yID09ICJMZWFuIFJlcHVibGljYW4iXSA8LSAiTGVhbiIKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoW3VzMjAxNl9yZWNvZGVkJHBpZDdfZmFjdG9yID09ICJOb3QgdmVyeSBzdHJvbmcgRGVtb2NyYXQiXSA8LSAiTm90IFN0cm9uZyIKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoW3VzMjAxNl9yZWNvZGVkJHBpZDdfZmFjdG9yID09ICJOb3QgdmVyeSBzdHJvbmcgUmVwdWJsaWNhbiJdIDwtICJOb3QgU3Ryb25nIgp1czIwMTZfcmVjb2RlZCRwb2xfc3RyZW5ndGhbdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIkluZGVwZW5kZW50Il0gPC0gIkluZGVwZW5kZW50IgoKI1JlY29kZSB2YXJpYWJsZXMgCnVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW1bdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIlN0cm9uZyBEZW1vY3JhdCJdIDwtIDAKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoX251bVt1czIwMTZfcmVjb2RlZCRwaWQ3X2ZhY3RvciA9PSAiU3Ryb25nIFJlcHVibGljYW4iXSA8LSAwCnVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW1bdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIkxlYW4gRGVtb2NyYXQiXSA8LSAuMjUKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoX251bVt1czIwMTZfcmVjb2RlZCRwaWQ3X2ZhY3RvciA9PSAiTGVhbiBSZXB1YmxpY2FuIl0gPC0gLjI1CnVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW1bdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIk5vdCB2ZXJ5IHN0cm9uZyBEZW1vY3JhdCJdIDwtIC41CnVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW1bdXMyMDE2X3JlY29kZWQkcGlkN19mYWN0b3IgPT0gIk5vdCB2ZXJ5IHN0cm9uZyBSZXB1YmxpY2FuIl0gPC0gLjUKdXMyMDE2X3JlY29kZWQkcG9sX3N0cmVuZ3RoX251bVt1czIwMTZfcmVjb2RlZCRwaWQ3X2ZhY3RvciA9PSAiSW5kZXBlbmRlbnQiXSA8LSAwLjc1CgoKYGBgCgpgYGB7cn0KIyBBdmVyYWdlIHZhbHVlIG9mIHRoZSBuZXdseSBjcmVhdGVkIHBvbGl0aWNhbCBzdHJlbmd0aCB2YXJpYWJsZQptZWFuKHVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW0sIG5hLnJtID0gVFJVRSkKYGBgCmBgYHtyfQojIFBsb3Qgb2YgZGlzdHJpYnV0aW9uIG9mIG5ld2x5IGNyZWF0ZWQgcG9saXRpY2FsIHN0cmVuZ3RoIHZhcmlhYmxlCmRlc2NfcGxvdCA8LSBnZ3Bsb3QoKGRhdGEgPSB1czIwMTZfcmVjb2RlZCksIGFlcyh4ID0gcG9sX3N0cmVuZ3RoLCBuYS5ybSA9IFRSVUUpKSArIGxhYnMoeCA9ICJQb2xpdGljYWwgU3RyZW5ndGgiLCB5ID0gIkNvdW50IiwgdGl0bGUgPSAiRmlndXJlIDE6IERpc3RyaWJ1dGlvbiBvZiBQb2xpdGljYWwgVmlld3MiKSArCiAgICBnZW9tX2JhcigpIAoKZGVzY19wbG90CgpgYGAKVGhlIG1lYW4gb2YgdGhlIHBvbGl0aWNhbCBzdHJlbmd0aCB2YXJpYWJsZSBpcyAwLjI3LCB3aXRoIEZpZ3VyZSAxIGluZGljYXRpbmcgdGhlIG1ham9yaXR5IG9mIHJlc3BvbmRlbnRzIGNsYXNzaWZpZWQgdGhlbXNlbHZlcyBhcyBlaXRoZXIgIlN0cm9uZyBEZW1vY3JhdCIgb3IgIlN0cm9uZyBSZXB1YmxpY2FuIi4gCgpgYGB7cn0KIyBEZXNjcmlwdGl2ZSB0d28td2F5IHRhYmxlcyBvbiBudW1iZXJzIHN3aXRjaGluZyB2b3RlIGJ5IHBvbGl0aWNhbCBsZWFuaW5nCmRlc2NfdGFibGVfMSA8LSB0YWJsZSh1czIwMTZfcmVjb2RlZCRwb2xfc3RyZW5ndGhfbnVtLCB1czIwMTZfcmVjb2RlZCRjaGFuZ2VfcmFua190cnVtcF9vdmVyX2NsaW50b25fdzF3MykKY29sbmFtZXMoZGVzY190YWJsZV8xKSA9IGMoIkF3YXkgZnJvbSBUcnVtcCIsICJObyBDaGFuZ2UiLCAiVG93YXJkcyBUcnVtcCIpCnJvd25hbWVzKGRlc2NfdGFibGVfMSkgPSBjKCJTdHJvbmciLCAiTm90IFN0cm9uZyIsICJMZWFuIiwgIkluZGVwZW5kZW50IikgCmRlc2NfdGFibGVfMQoKZGVzY190YWJsZV8yIDwtIHRhYmxlKHVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW0sIHVzMjAxNl9yZWNvZGVkJHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uKQpjb2xuYW1lcyhkZXNjX3RhYmxlXzIpID0gYygiQXdheSBmcm9tIFRydW1wIiwgIk5vIENoYW5nZSIsICJUb3dhcmRzIFRydW1wIikKcm93bmFtZXMoZGVzY190YWJsZV8yKSA9IGMoIlN0cm9uZyIsICJOb3QgU3Ryb25nIiwgIkxlYW4iLCAiSW5kZXBlbmRlbnQiKSAKZGVzY190YWJsZV8yCgoKZGVzY190YWJsZV8zIDwtIHRhYmxlKHVzMjAxNl9yZWNvZGVkJHBvbF9zdHJlbmd0aF9udW0sIHVzMjAxNl9yZWNvZGVkJHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uX2JlbmVmaXQpCmNvbG5hbWVzKGRlc2NfdGFibGVfMykgPSBjKCJBd2F5IGZyb20gVHJ1bXAiLCAiTm8gQ2hhbmdlIiwgIlRvd2FyZHMgVHJ1bXAiKQpyb3duYW1lcyhkZXNjX3RhYmxlXzMpID0gYygiU3Ryb25nIiwgIk5vdCBTdHJvbmciLCAiTGVhbiIsICJJbmRlcGVuZGVudCIpIApkZXNjX3RhYmxlXzMKCmBgYApUaGUgdGFibGVzIHNob3dzIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGRlcGVuZGVudCB2YXJpYWJsZXMgYnkgc3RyZW5ndGggb2YgcG9saXRpY2FsIHZpZXdzLiAiTm8gY2hhbmdlIiBoYXMgdGhlIGhpZ2hlc3QgcGVyY2VudGFnZXMsIGluZGljYXRpbmcgdGhhdCBmZXcgdm90ZXJzIHRlbmQgdG8gY2hhbmdlIHZvdGluZyBpbnRlbnRpb25zLiBUaG9zZSB0aGF0IGRvIGNoYW5nZSBhcmUgZ2VuZXJhbGx5IGZhdm91cmFibGUgZm9yIFRydW1wLCB3aXRoIGluZGVwZW5kZW50cyBtb3JlIGxpa2VseSB0byBzd2l0Y2ggcG9saXRpY2FsIHZpZXdzLiAKCgojIyMgMi4yLiBNZXRob2RzCgpUaGUgb3JpZ2luYWwgcGFwZXIgdXNlcyBPcmRpbmFyeSBMZWFzdCBTcXVhcmVzIChPTFMpIHJlZ3Jlc3Npb24sIGVzdGltYXRpbmcgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgYW5kIGNoYW5nZXMgaW4gdm90ZXIgcHJlZmVyZW5jZXMuIFRoZSBvcmlnaW5hbCBzdHVkeSBhbHNvIGluY2x1ZGVkIGEgcmFuZ2Ugb2YgY29udHJvbCB2YXJpYWJsZXMgaW4gdGhlIHJlZ3Jlc3Npb24uIFRoaXMgc3R1ZHkgYWxzbyB1c2VzIE9MUyByZWdyZXNzaW9uLCBidXQgaW5jbHVkZXMgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgZXhwb3N1cmUgdmFyaWFibGUgYW5kIGFuIGluZGljYXRvciBvZiB0aGUgc3RyZW5ndGggb2YgcG9saXRpY2FsIHZpZXdzLiBUaGlzIGlzIGRvbmUgaW4gdHdvIHdheXMuCgpGaXJzdGx5LCBhbiBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBleHBvc3VyZSB2YXJpYWJsZSBhbmQgdGhlIG51bWVyaWNhbCB2YXJpYWJsZSBjYXB0dXJpbmcgdGhlIHN0cmVuZ3RoIG9mIHBvbGl0aWNhbCB2aWV3cyBpcyBpbmNsdWRlZC4gVGhlc2UgdHdvIHZhcmlhYmxlcyBhcmUgYWxzbyBpbmNsdWRlZCBpbmRpdmlkdWFsbHkuIFRoZSBudW1lcmljYWwgdmFyaWFibGUgdGFrZXMgb24gdmFsdWVzIG9mIDAsIDAuMjUsIDAuNSwgb3IgMC43NSwgd2l0aCBoaWdoZXIgdmFsdWVzIGluZGljYXRpbmcgbGVzcyBzdHJvbmcgcG9saXRpY2FsIHZpZXdzLiBBIHBvc2l0aXZlIGNvZWZmaWNpZW50IG9uIHRoZSBpbnRlcmFjdGlvbiB3b3VsZCBpbmRpY2F0ZSB0aGF0IHBlb3BsZSB3aXRoIGxlc3Mgc3Ryb25nIHBvbGl0aWNhbCB2aWV3cyBhcmUgbW9yZSBsaWtlbHkgdG8gc3dpdGNoIHRoZWlyIHZvdGUgY2hvaWNlIGZvciBhIGdpdmVuIGxldmVsIG9mIGV4cG9zdXJlIHRvIFJ1c3NpYW4gdHdlZXRzLgoKQSBzaG9ydGNvbWluZyBvZiB0aGUgaW50ZXJhY3Rpb24gdGVybSBkZXNjcmliZWQgYWJvdmUgaXMgdGhhdCBpdCBhc3N1bWVzIHRoYXQgdGhlIGRpZmZlcmVuY2UgaW4gbGlrZWxpaG9vZCBvZiBzd2l0Y2hpbmcgdm90ZSBpcyB0aGUgc2FtZSBmb3Igc3Ryb25nIHZzIGxlYW4gYXMgaXQgaXMgZm9yIG5vdCBzdHJvbmcgdnMgaW5kZXBlbmRlbnQuIEEgc2Vjb25kIGFwcHJvYWNoIHJlbGF4ZXMgdGhpcyBhc3N1bXB0aW9uLiBJbiB0aGlzIGNhc2UsIHRoZSBleHBvc3VyZSB2YXJpYWJsZSBpcyBpbnRlcmFjdGVkIHdpdGggYSBjYXRlZ29yaWNhbCB2YXJpYWJsZS4gVGhpcyByZXN1bHRzIGluIHRoZSBlc3RpbWF0aW9uIG9mIGEgY29lZmZpY2llbnQgb24gdGhlIGV4cG9zdXJlIHZhcmlhYmxlIGFuZCBjb2VmZmljaWVudHMgb24gdGhyZWUgaW50ZXJhY3Rpb25zIG9mIHRoZSBleHBvc3VyZSB2YXJpYWJsZSB3aXRoIGR1bW15IHZhcmlhYmxlcyBmb3IgbGVhbiwgbm90IHN0cm9uZywgYW5kIGluZGVwZW5kZW50LiBJbiB0aGlzIGNhc2UsIHRoZSBjb2VmZmljaWVudCBvbiB0aGUgbm9uLWludGVyYWN0ZWQgZXhwb3N1cmUgdmFyaWFibGUgY2FwdHVyZXMgdGhlIGVmZmVjdCBvZiBleHBvc3VyZSBvbiB2b3RlIGNob2ljZSBmb3IgdGhlIGV4Y2x1ZGVkIGNhdGVnb3J5IChpLmUuLCBzdHJvbmcgcG9saXRpY2FsIHZpZXdzKSwgd2hpbGUgdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgdGhyZWUgaW50ZXJhY3Rpb25zIGNhcHR1cmUgdGhlIGVmZmVjdHMgb2YgZXhwb3N1cmUgb24gdm90ZSBjaG9pY2UgZm9yIHRoZSB0aHJlZSBvdGhlciBjYXRlZ29yaWVzLiBCeSBlc3RpbWF0aW5nIHNlcGFyYXRlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBjYXRlZ29yeSwgdGhpcyBhcHByb2FjaCBkb2VzbuKAmXQgcmVzdHJpY3QgdGhlIGRpZmZlcmVuY2UgaW4gY29lZmZpY2llbnRzIHRvIGJlIHRoZSBzYW1lIGJldHdlZW4gY29uc2VjdXRpdmUgY2F0ZWdvcmllcy4gCgoKCiMjIDMuIFJlc3VsdHMKClRvIGV4YW1pbmUgd2hldGhlciB0aGUgaW5mbHVlbmNlIG9mIGV4cG9zdXJlIHRvIFJ1c3NpYW4gdHdlZXRzIGRlcGVuZHMgb24gaG93IHN0cm9uZyBhbiBpbmRpdmlkdWFsJ3MgcG9saXRpY2FsIHZpZXdzIGFyZSwgYW4gaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUgZXhwb3N1cmUgdmFyaWFibGUgYW5kIHBvbGl0aWNhbCBzdHJlbmd0aCB2YXJpYWJsZSBpcyBpbmNsdWRlZCBpbiB0aGUgbW9kZWwuIEdpdmVuIHRoYXQgaGlnaGVyIG51bWJlcnMgb2YgdGhlIHBvbGl0aWNhbCBzdHJlbmd0aCB2YXJpYWJsZSBpbXBseSBhIG1vcmUgaW5kZXBlbmRlbnQgKGxlc3MgcG9saXRpY2FsbHkgc3Ryb25nKSB2aWV3LCB0aGVuIGEgcG9zaXRpdmUgKGFuZCBzaWduaWZpY2FudCkgY29lZmZpY2llbnQgb24gdGhlIGludGVyYWN0aW9uIHRlcm0gd291bGQgbWVhbiB0aGF0IG1vcmUgcG9saXRpY2FsbHkgaW5kZXBlbmRlbnQgdm90ZXJzIGFyZSBtb3JlIGxpa2VseSB0byBzd2l0Y2ggdGhlaXIgdm90ZSAodG93YXJkcyBUcnVtcCkgaW4gcmVzcG9uc2UgdG8gZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMuIAoKCmBgYHtyIGVjaG8gPSBUUlVFLCByZXN1bHRzID0naGlkZSd9CiM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgSW50cm9kdWNlIHRoZSBJbnRlcmFjdGlvbnMgYmV0d2VlbiBFeHBvc3VyZSBhbmQgU3RyZW5ndGggb2YgUG9saXRpY2FsIFZpZXdzCgojQ3JlYXRlIGEgbmV3IFRhYmxlIEU2IHdpdGggSW50ZXJhY3Rpb24gdGVybSAKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9scyA8LSBsbShjaGFuZ2VfcmFua190cnVtcF9vdmVyX2NsaW50b25fdzF3MyB+ICB0b3RhbF9leHBvc3VyZV9ydXNzaWFfbG9nICogcG9sX3N0cmVuZ3RoX251bSArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2UgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEsIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzKQoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjayA8LSBsbShjaGFuZ2VfcmFua190cnVtcF9vdmVyX2NsaW50b25fdzF3MyB+ICB0b3RhbF9leHBvc3VyZV9ydXNzaWFfbG9nICogcG9sX3N0cmVuZ3RoX251bSArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2Vfb3RoZXJfaGlzcGFuaWMgKyByYWNlX2JsYWNrICsgcmVnaW9uICsgaW50ZXJuZXRfc29jaWFsX21lZGlhX3cxLCBkYXRhID0gdXMyMDE2X3JlY29kZWQpCnN1bW1hcnkodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjaykKCmNvbmZpbnQodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjaykKCnZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzIDwtIGxtKGNoYW5nZV9yYW5rX3RydW1wX292ZXJfY2xpbnRvbl93MXczIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZV9vdGhlcl9oaXNwYW5pYyArIHJhY2VfYmxhY2sgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEgKyB0b3RhbF90d2VldHNfbG9nICsgcG9sX3N0cmVuZ3RoX251bSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0cykKYGBgCgpgYGB7cn0KI0NyZWF0ZSBhIHRhYiBtb2RlbCBjb21iaW5pbmcgdGhlIGFib3ZlIHJlZ3Jlc3Npb25zIAp0YWJfbW9kZWwgKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2ssIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzLCBwcmVkLmxhYmVscyA9IGMgKCJDb25zdGFudCIsICJFeHBvc3VyZSIsICJQb2xpdGljYWwgVmlld3MiLCAiQWdlIiwgIiBXb21hbiIsICJDb2xsZWdlLWVkdWNhdGVkIiwgIkluY29tZSIsICJQZXJzb24gb2YgQ29sb3IiLCAiUmVnaW9uOiBOb3J0aGVhc3QiLCAiUmVnaW9uOiBNaWR3ZXN0IiwgIlJlZ2lvbjogV2VzdCIsICJGcmVxLiBvZiBzb2NpYWwgbWVkaWEgdXNlIiwgIkV4cG9zdXJlICogUG9saXRpY2FsIFZpZXdzIiwgIk90aGVyL0hpc3BhbmljIiwgIkJsYWNrIiwgImxvZyhUb3RhbCBUd2VldHMpIiksIHRpdGxlID0gIlRhYmxlIDE6IE5vbi1saW5lYXIgZWZmZWN0cyBvZiBleHBvc3VyZSB0byBSdXNzaWFuIHR3ZWV0cyBvbiB0aGUgbGlrZWxpaG9vZCBvZiBzaGlmdGluZyB2b3RlciBwcmVmZXJlbmNlIGJldHdlZW4gc3VydmV5IHdhdmVzIiwgZGlnaXRzID0gMywgCiAgICAgICAgICAgZHYubGFiZWxzID0gYygiKDEpIiwgIigyKSIsICIoMykiKSwKICAgICAgICAgICBvcmRlci50ZXJtcyA9IGMoMiwgMywgMTMsIDQsIDUsIDYsIDcsIDE0LCAxNSwgOCwgOSwgMTAsIDExLCAxNiwgMTIsIDEpLCAKICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyIsIHNob3cuY2kgPSBGQUxTRSwgdmNvdi5mdW4gPSAiSEMwIiwgc2hvdy5zZSA9IFRSVUUpCmBgYAoKQmVnaW5uaW5nIHdpdGggVGFibGUgMSwgd2hpY2ggcmVwb3J0cyB0aGUgcmVzdWx0cyB3aGVuIHVzaW5nIHRoZSBmaXJzdCBkZXBlbmRlbnQgdmFyaWFibGUsIHRoZSBjb2VmZmljaWVudCBvbiB0aGUgbGV2ZWwgb2YgZXhwb3N1cmUgaXMgcG9zaXRpdmUsIHdoaWNoIGluZGljYXRlcyBhIHBvc2l0aXZlIGFzc29jaWF0aW9uIGJldHdlZW4gZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgYW5kIHRoZSBwcm9iYWJpbGl0eSBvZiBzd2l0Y2hpbmcgdG93YXJkcyBUcnVtcCBmb3IgdGhvc2Ugd2l0aCBzdHJvbmcgcG9saXRpY2FsIHZpZXdzIChhIHBvbGl0aWNhbCBzdHJlbmd0aCB2YWx1ZSBvZiB6ZXJvKS4gCmBgYHtyfQpwbG90X21vZGVsKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gYygidG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyIsICJwb2xfc3RyZW5ndGhfbnVtIikpICsgbGFicyh0aXRsZSA9ICJGaWd1cmUgMjogTm9ubGluZWFyIGVmZmVjdCBvZiBleHBvc3VyZSB0byBSdXNzaWFuIHR3ZWV0cyBvbiBjaGFuZ2UgCmluIHZvdGluZyBwcmVmZXJlbmNlcyB0b3dhcmRzIFRydW1wIGJldHdlZW4gc3VydmV5IApXYXZlIDEgYW5kIDIiLCB4ID0gIiBUb3RhbCBFeHBvc3VyZSAobG9nICsxKSIsIHkgPSAiQ2hhbmdlIGluIHZvdGluZyBwcmVmZXJlbmNlIAp0b3dhcmRzIFRydW1wIGJldHdlZW4gV2F2ZSAxIGFuZCBXYXZlIDIiLCBjb2xvciA9ICJTdHJlbmd0aCBvZiBQb2xpdGljYWwgVmlld3MiKQpgYGAKClRoZSBpbnRlcmFjdGlvbiB0ZXJtIChleHBvc3VyZSAqIHBvbGl0aWNhbCBzdHJlbmd0aCkgaXMgZm91bmQgdG8gYmUgbmVnYXRpdmUgYW5kIHNpZ25pZmljYW50IGluZGljYXRpbmcgdGhhdCB0aGUgcHJvYmFiaWxpdHkgb2Ygc2hpZnRpbmcgdG93YXJkcyBUcnVtcCBpcyBzbWFsbGVyIGZvciB0aG9zZSB0aGF0IGhhdmUgbGVzcyBzdHJvbmcgcG9saXRpY2FsIHZpZXdzLiBUaGlzIGNhbiBiZSBzZWVuIGluIEZpZ3VyZSAyLiBUaGUgZmlndXJlIGFsc28gcmVwb3J0cyB0aGUgY29uZmlkZW5jZSBpbnRlcnZhbHMgYW5kIGVmZmVjdHMgYXJlIGdlbmVyYWxseSBub3Qgc2lnbmlmaWNhbnQgYXQgdGhlIDUlIGxldmVsLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBpbXBhY3QgaXMgZm91bmQgdG8gYmUgcG9zaXRpdmUgZm9yIHN0cm9uZyBwb2xpdGljYWwgdmlld3MgYW5kIG5lZ2F0aXZlIGZvciB0aGUgb3RoZXIgdGhyZWUuIFRoZSBlZmZlY3RzIGFyZSBnZW5lcmFsbHkgbm90IHNpZ25pZmljYW50ICBhdCB0aGUgOTUlIGxldmVsLiBUaGVyZSBhcmUgZXhjZXB0aW9ucywgaG93ZXZlciwgd2l0aCBoaWdoIGxldmVscyBvZiBleHBvc3VyZSBzaWduaWZpY2FudGx5IHJlZHVjaW5nIHRoZSBwcm9iYWJpbGl0eSBvZiBjaGFuZ2luZyBmb3IgbW9yZSBpbmRlcGVuZGVudCB2b3RlcnMuIEF0IHRoZSA5MCUgbGV2ZWwsIGVmZmVjdHMgYXJlIHNpZ25pZmljYW50LCBpbmNsdWRpbmcgdGhlIHBvc2l0aXZlIGVmZmVjdCBvZiBleHBvc3VyZSBvbiB0aGUgcHJvYmFiaWxpdHkgb2Ygc2hpZnRpbmcgZm9yIHRob3NlIHdpdGggc3Ryb25nZXIgdmlld3MuIAoKYGBge3IgZWNobyA9IFRSVUUsIHJlc3VsdHMgPSdoaWRlJ30KIyBOZXcgVGFibGUgRTcgd2l0aCBJbnRlcmFjdGlvbgp2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzIDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZSArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMpCgp2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrIDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZV9vdGhlcl9oaXNwYW5pYyArIHJhY2VfYmxhY2sgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEsIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrKQoKCnZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzIDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZV9vdGhlcl9oaXNwYW5pYyArIHJhY2VfYmxhY2sgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEgKyB0b3RhbF90d2VldHNfbG9nICsgcG9sX3N0cmVuZ3RoX251bSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0cykKYGBgCgpgYGB7cn0KI0NyZWF0ZSBhIHRhYiBtb2RlbCBjb21iaW5pbmcgdGhlIGFib3ZlIHJlZ3Jlc3Npb25zIAp0YWJfbW9kZWwgKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2ssIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzLCBwcmVkLmxhYmVscyA9IGMgKCJDb25zdGFudCIsICJFeHBvc3VyZSIsICJQb2xpdGljYWwgVmlld3MiLCAiQWdlIiwgIiBXb21hbiIsICJDb2xsZWdlLWVkdWNhdGVkIiwgIkluY29tZSIsICJQZXJzb24gb2YgQ29sb3IiLCAiUmVnaW9uOiBOb3J0aGVhc3QiLCAiUmVnaW9uOiBNaWR3ZXN0IiwgIlJlZ2lvbjogV2VzdCIsICJGcmVxLiBvZiBzb2NpYWwgbWVkaWEgdXNlIiwgIkV4cG9zdXJlICogUG9saXRpY2FsIFZpZXdzIiwgIk90aGVyL0hpc3BhbmljIiwgIkJsYWNrIiwgImxvZyhUb3RhbCBUd2VldHMpIiksIHRpdGxlID0gIlRhYmxlIDI6IE5vbi1saW5lYXIgZWZmZWN0cyBvZiBleHBvc3VyZSB0byBSdXNzaWFuIHR3ZWV0cyBvbiB0aGUgbGlrZWxpaG9vZCBvZiBzaGlmdGluZyB2b3RlciBwcmVmZXJlbmNlIHRvd2FyZHMgVHJ1bXAsIGEgbm8gdm90ZSwgb3IgYSAzcmQgY2FuZGlkYXRlIiwgZGlnaXRzID0gMywgCiAgICAgICAgICAgZHYubGFiZWxzID0gYygiKDEpIiwgIigyKSIsICIoMykiKSwKICAgICAgICAgICBvcmRlci50ZXJtcyA9IGMoMiwgMywgMTMsIDQsIDUsIDYsIDcsIDE0LCAxNSwgOCwgOSwgMTAsIDExLCAxNiwgMTIsIDEpLCAKICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyIsIHNob3cuY2kgPSBGQUxTRSwgdmNvdi5mdW4gPSAiSEMwIiwgc2hvdy5zZSA9IFRSVUUpCmBgYAoKCmBgYHtyfQpwbG90X21vZGVsKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gYygidG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyIsICJwb2xfc3RyZW5ndGhfbnVtIikpICsgbGFicyh0aXRsZSA9ICJGaWd1cmUgMzogIE5vbmxpbmVhciBlZmZlY3Qgb2YgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgCiAgICAgICAgICAgICAgICBvbiBjaGFuZ2VzIGluIHZvdGVyIHByZWZlcmVuY2UgdG93YXJkcyBUcnVtcCwgdGhpcmQgcGFydHkgCiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzIG9yIG5vIHZvdGUiLCB4ID0gIiBUb3RhbCBFeHBvc3VyZSAobG9nICsxKSIsIAp5ID0gIkNoYW5nZSBpbiB2b3RpbmcgcHJlZmVyZW5jZSB0b3dhcmRzIFRydW1wLCAKICAgICAgdGhpcmQgcGFydHkgY2FuZGlkYXRlcyBhbmQgbm8gdm90ZSIgICAgICwgY29sb3IgPSAiU3RyZW5ndGggb2YgUG9saXRpY2FsIFZpZXdzIikKYGBgCgpJbiB0ZXJtcyBvZiB0aGUgc2lnbnMgb2YgdGhlIGVmZmVjdHMsIFRhYmxlIDIsIHdoaWNoIHJlcG9ydHMgcmVzdWx0cyBmcm9tIHRoZSBzZWNvbmQgZGVwZW5kZW50IHZhcmlhYmxlLCBpcyBjb25zaXN0ZW50IHdpdGggdGhvc2UgaW4gMSwgYnV0IG5vbmUgb2YgdGhlIGNvZWZmaWNpZW50cyBhcmUgc2lnbmlmaWNhbnQuIFRoaXMgaW1wbGllcyB0aGF0IGV4cG9zdXJlIGhhcyBubyBpbXBhY3Qgb24gdGhlIHByb2JhYmlsaXR5IG9mIGNoYW5naW5nIHZvdGluZyBpbnRlbnRpb25zIGFuZCB0aGF0IHRoZXJlIGFyZSBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGdyb3VwcyB3aGVuIGNvbnNpZGVyaW5nIGEgZGVwZW5kZW50IHZhcmlhYmxlIHRoYXQgYWxzbyBhbGxvd3MgZm9yIGNoYW5nZXMgdG93YXJkcyB0aGlyZCBjYW5kaWRhdGVzIG9yIGNob29zaW5nIG5vdCB0byB2b3RlLiAKClRoZSByZXN1bHRzIGluIFRhYmxlIDMgYmVsb3csIHdoaWNoIHJlcG9ydHMgcmVzdWx0cyB3aGVuIHVzaW5nIHRoZSB0aGlyZCBkZXBlbmRlbnQgdmFyaWFibGUsIGFsc28gc2hvdyB0aGUgc2FtZSBzaWducyBvbiB0aGUgbWFpbiBjb2VmZmljaWVudHMgYXMgaW4gdGhlIG90aGVyIHR3byB0YWJsZXMuIEhlcmUgdGhlIGZpbmFsIHNwZWNpZmljYXRpb24gcHJvdmlkZXMgdGhlIHN0cm9uZ2VzdCBldmlkZW5jZSBvZiBhIHBvc2l0aXZlIGVmZmVjdCBvZiBleHBvc3VyZSBvbiBjaGFuZ2luZyB0aGUgdm90aW5nIGludGVudGlvbnMgb2YgdGhvc2Ugd2l0aCBzdHJvbmcgcG9saXRpY2FsIHZpZXdzLCB3aXRoIHRoZSBjb2VmZmljaWVudCBvbiB0aGUgZXhwb3N1cmUgdmFyaWFibGUgYmVpbmcgcG9zaXRpdmUgYW5kIHNpZ25pZmljYW50LiBXaGlsZSB0aGUgY29lZmZpY2llbnQgb24gdGhlIGludGVyYWN0aW9uIHRlcm0gaXMgbmVnYXRpdmUsIGNvbnNpc3RlbnQgd2l0aCBwcmV2aW91cyByZXN1bHRzLCBpdCBpcyBub3Qgc2lnbmlmaWNhbnQuIAoKYGBge3IgZWNobyA9IFRSVUUsIHJlc3VsdHMgPSdoaWRlJ30KIyBOZXcgVGFibGUgRTggd2l0aCBJbnRlcmFjdGlvbgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9scyA8LSBsbSh2b3RlZF90cnVtcF92ZXJzdXNfY2xpbnRvbl9iZW5lZml0IH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZSArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMpCgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjayA8LSBsbSh2b3RlZF90cnVtcF92ZXJzdXNfY2xpbnRvbl9iZW5lZml0IH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGhfbnVtICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZV9vdGhlcl9oaXNwYW5pYyArIHJhY2VfYmxhY2sgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEsIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKCnN1bW1hcnkodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjaykKCmNvbmZpbnQodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFjayApCgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc190b3RhbF90d2VldHMgPC0gbG0odm90ZWRfdHJ1bXBfdmVyc3VzX2NsaW50b25fYmVuZWZpdCB+ICB0b3RhbF9leHBvc3VyZV9ydXNzaWFfbG9nICogcG9sX3N0cmVuZ3RoX251bSArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2Vfb3RoZXJfaGlzcGFuaWMgKyByYWNlX2JsYWNrICsgcmVnaW9uICsgaW50ZXJuZXRfc29jaWFsX21lZGlhX3cxICsgdG90YWxfdHdlZXRzX2xvZyArIHBvbF9zdHJlbmd0aF9udW0sIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKCnN1bW1hcnkodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc190b3RhbF90d2VldHMpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzKQpgYGAKYGBge3J9CiNDcmVhdGUgYSB0YWIgbW9kZWwgY29tYmluaW5nIHRoZSBhYm92ZSByZWdyZXNzaW9ucyAKdGFiX21vZGVsKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2ssIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzLCBwcmVkLmxhYmVscyA9IGMgKCJDb25zdGFudCIsICJFeHBvc3VyZSIsICJQb2xpdGljYWwgVmlld3MiLCAiQWdlIiwgIiBXb21hbiIsICJDb2xsZWdlLWVkdWNhdGVkIiwgIkluY29tZSIsICJQZXJzb24gb2YgQ29sb3IiLCAiUmVnaW9uOiBOb3J0aGVhc3QiLCAiUmVnaW9uOiBNaWR3ZXN0IiwgIlJlZ2lvbjogV2VzdCIsICJGcmVxLiBvZiBzb2NpYWwgbWVkaWEgdXNlIiwgIkV4cG9zdXJlICogUG9saXRpY2FsIFZpZXdzIiwgIk90aGVyL0hpc3BhbmljIiwgIkJsYWNrIiwgImxvZyhUb3RhbCBUd2VldHMpIiksICB0aXRsZSA9ICJUYWJsZSAzOiBOb24tbGluZWFyIGVmZmVjdHMgb2YgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgb24gY2hhbmdlcyBpbiB2b3RpbmcgcHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgMXN0IHdhdmUgb2YgdGhlIFlvdUdvdiBzdXJ2ZXkgYW5kIHRoZSBhY3R1YWwgdm90ZSIsIGRpZ2l0cyA9IDMsIAogICAgICAgICAgIGR2LmxhYmVscyA9IGMoIigxKSIsICIoMikiLCAiKDMpIiksCiAgICAgICAgICAgb3JkZXIudGVybXMgPSBjKDIsIDMsIDEzLCA0LCA1LCA2LCA3LCAxNCwgMTUsIDgsIDksIDEwLCAxMSwgMTYsIDEyLCAxKSwgCiAgICAgICAgICAgIHAuc3R5bGUgPSAic3RhcnMiLCBzaG93LmNpID0gRkFMU0UsIHZjb3YuZnVuID0gIkhDMCIsIHNob3cuc2UgPSBUUlVFKQpgYGAKCmBgYHtyfQpwbG90X21vZGVsKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHMsIHR5cGUgPSAicHJlZCIsIHRlcm1zID0gYygidG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyIsICJwb2xfc3RyZW5ndGhfbnVtIikpICsgCiAgbGFicyh0aXRsZSA9ICJGaWd1cmUgNDogIE5vbmxpbmVhciBlZmZlY3Qgb2YgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgb24gCiAgY2hhbmdlcyBpbiB2b3RpbmcgcHJlZmVyZW5jZXMgYmV0d2VlbiB0aGUgMXN0IHdhdmUgb2YgdGhlIAogICAgICAgWW91R292IHN1cnZleSBhbmQgdGhlIGFjdHVhbCB2b3RlLiAiLCB4ID0gIlRvdGFsIEV4cG9zdXJlIChsb2cgKzEpIiwgCiAgICAgICB5ID0gIkNoYW5nZSBpbiB2b3RpbmcgcHJlZmVyZW5jZSBiZXR3ZWVuIHRoZSAxc3QgCiAgICAgICB3YXZlIG9mIHRoZSBzdXJ2ZXkgYW5kIHRoZSBhY3R1YWwgdm90ZSIsICBjb2xvciA9ICJTdHJlbmd0aCBvZiBQb2xpdGljYWwgVmlld3MiKQpgYGAKClRoaXMgZm9sbG93aW5nIHJlc3VsdHMgaW50ZXJhY3QgdGhlIGV4cG9zdXJlIHZhcmlhYmxlIHdpdGggdGhlIGNhdGVnb3JpY2FsIHBvbGl0aWNhbCBzdHJlbmd0aCB2YXJpYWJsZS4gSW4gdGhpcyBjYXNlIHRoZSBsaW5lYXIgZXhwb3N1cmUgdmFyaWFibGUgd2lsbCByZWZlciB0byB0aGUgY29lZmZpY2llbnQgb24gZXhwb3N1cmUgZm9yIHRoZSBvbWl0dGVkIGdyb3VwIChpbmRlcGVuZGVudCB2b3RlcnMpIHdoaWxlIHRoZSBjb2VmZmljaWVudHMgb24gdGhlIHRocmVlIGRpZmZlcmVudCBpbnRlcmFjdGlvbnMgcmVmZXIgdG8gdGhlIGNvZWZmaWNpZW50cyBvbiB0aGUgZXhwb3N1cmUgdmFyaWFibGUgZm9yIHRoZSBvdGhlciB0aHJlZSBwb2xpdGljYWwgc3RyZW5ndGggZ3JvdXBzLiAKYGBge3IgZWNobyA9IFRSVUUsIHJlc3VsdHMgPSdoaWRlJ30KIyBJbnRyb2R1Y2UgdGhlIEludGVyYWN0aW9ucyBiZXR3ZWVuIEV4cG9zdXJlIGFuZCBTdHJlbmd0aCBvZiBQb2xpdGljYWwgVmlld3MKCiMgTmV3IFRhYmxlIEU2IHdpdGggSW50ZXJhY3Rpb24gKFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgd2hlcmUgd2UgZXN0aW1hdGUgYSBzZXBhcmF0ZSBjb2VmZmljaWVudCBvbiBleHBvc3VyZSBmb3IgZWFjaCB0eXBlIG9mIHBvbGl0aWNhbCBzdHJlbmd0aCkKCnZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfbmV3MSA8LSBsbShjaGFuZ2VfcmFua190cnVtcF9vdmVyX2NsaW50b25fdzF3MyB+ICB0b3RhbF9leHBvc3VyZV9ydXNzaWFfbG9nICogcG9sX3N0cmVuZ3RoICsgYWdlICsgZ2VuZGVyICsgZWR1Y2F0aW9uICsgaW5jb21lICsgcmFjZSArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfbmV3MSkKCmNvbmZpbnQodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19uZXcxKQoKCgp2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrX25ldzEgPC0gbG0oY2hhbmdlX3JhbmtfdHJ1bXBfb3Zlcl9jbGludG9uX3cxdzMgfiAgdG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyAqIHBvbF9zdHJlbmd0aCArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2Vfb3RoZXJfaGlzcGFuaWMgKyByYWNlX2JsYWNrICsgcmVnaW9uICsgaW50ZXJuZXRfc29jaWFsX21lZGlhX3cxLCBkYXRhID0gdXMyMDE2X3JlY29kZWQpCnN1bW1hcnkodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFja19uZXcxKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrX25ldzEpCgoKCnZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzX25ldzEgPC0gbG0oY2hhbmdlX3JhbmtfdHJ1bXBfb3Zlcl9jbGludG9uX3cxdzMgfiAgdG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyAqIHBvbF9zdHJlbmd0aCArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2Vfb3RoZXJfaGlzcGFuaWMgKyByYWNlX2JsYWNrICsgcmVnaW9uICsgaW50ZXJuZXRfc29jaWFsX21lZGlhX3cxICsgdG90YWxfdHdlZXRzX2xvZywgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzX25ldzEpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzX25ldzEpCgpgYGAKCmBgYHtyfQp0YWJfbW9kZWwgKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfbmV3MSwgdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFja19uZXcxLCB2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXcxLCBwcmVkLmxhYmVscyA9IGMgKCJDb25zdGFudCIsICJFeHBvc3VyZSAtIEluZGVwZW5kZW50IiwgIlBvbGl0aWNhbCBWaWV3cyAtIExlYW4iLCAiUG9saXRpY2FsIFZpZXdzIC0gTm90IFN0cm9uZyIsICJQb2xpdGljYWwgVmlld3MgLSBTdHJvbmciLCAiQWdlIiwgIldvbWFuIiwgIkNvbGxlZ2UtZWR1Y2F0ZWQiLCAiSW5jb21lIiwgIlBlcnNvbiBvZiBDb2xvciIsICJSZWdpb246IE5vcnRoZWFzdCIsICJSZWdpb246IE1pZHdlc3QiLCAiUmVnaW9uOiBXZXN0IiwgIkZyZXEuIG9mIHNvY2lhbCBtZWRpYSB1c2UiLCAiRXhwb3N1cmUgLSBMZWFuIiwgIkV4cG9zdXJlIC0gTm90IFN0cm9uZyIsICJFeHBvc3VyZSAtIFN0cm9uZyIsICJPdGhlci9IaXNwYW5pYyIsICJCbGFjayIsICJsb2coVG90YWwgVHdlZXRzKSIpLCAgdGl0bGUgPSAiVGFibGUgNDogTm9uLWxpbmVhciBlZmZlY3RzIG9mIGV4cG9zdXJlIHRvIFJ1c3NpYW4gdHdlZXRzIG9uIHRoZSBsaWtlbGlob29kIG9mIHNoaWZ0aW5nIHZvdGVyIHByZWZlcmVuY2UgYmV0d2VlbiB3YXZlcyBvZiB0aGUgc3VydmV5ICIsIGRpZ2l0cyA9IDMsIAogICAgICAgICAgIGR2LmxhYmVscyA9IGMoIigxKSIsICIoMikiLCAiKDMpIiksCiAgICAgICAgICAgb3JkZXIudGVybXMgPSBjKDIsIDE1LCAxNiwgMTcsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxOCwgMTksIDExLCAxMiwgMTMsIDIwLCAxNCwgMSksIAogICAgICAgICAgICBwLnN0eWxlID0gInN0YXJzIiwgc2hvdy5jaSA9IEZBTFNFLCB2Y292LmZ1biA9ICJIQzAiLCBzaG93LnNlID0gVFJVRSkKCmBgYAoKSW4gdGFibGUgNCB3ZSBmaW5kIGEgbmVnYXRpdmUgZWZmZWN0IG9uIHRoZSBleHBvc3VyZSB2YXJpYWJsZSBmb3IgaW5kZXBlbmRlbnQgdm90ZXJzLCBpbXBseWluZyB0aGF0IGdyZWF0ZXIgZXhwb3N1cmUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgbG93ZXIgcHJvYmFiaWxpdHkgb2YgY2hhbmdpbmcgdm90ZSBmb3IgaW5kZXBlbmRlbnRzLiBDb252ZXJzZWx5IHRoZSBjb2VmZmljaWVudCBmb3Igc3Ryb25nIHBvbGl0aWNhbCB2aWV3cyBpcyBwb3NpdGl2ZSBhbmQgc2lnbmlmaWNhbnQsIHNvIGhpZ2hlciBleHBvc3VyZSBpbmNyZWFzZXMgdGhlIHByb2JhYmlsaXR5IG9mIHZvdGVycyBzd2l0Y2hpbmcgcHJlZmVyZW5jZXMuIEFzIHN1Y2gsIHRoZSByZXN1bHRzIGFyZSBjb25zaXN0ZW50IHdpdGggdGhvc2UgYWJvdmUsIHdpdGggaW5kZXBlbmRlbnQgdm90ZXJzIHNob3dpbmcgYSBsb3dlciBsaWtlbGlob29kIG9mIHN3aXRjaGluZyB2b3RpbmcgcHJlZmVyZW5jZXMgYW5kIHRob3NlIHdpdGggc3Ryb25nIHBvbGl0aWNhbCB2aWV3cyBzaG93aW5nIGEgaGlnaGVyIGxpa2VsaWhvb2Qgb2Ygc3dpdGNoaW5nLiAKYGBge3IgZWNobyA9IFRSVUUsIHJlc3VsdHMgPSdoaWRlJ30KIyBOZXcgVGFibGUgRTcgd2l0aCBJbnRlcmFjdGlvbiAoVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB3aGVyZSB3ZSBlc3RpbWF0ZSBhIHNlcGFyYXRlIGNvZWZmaWNpZW50IG9uIGV4cG9zdXJlIGZvciBlYWNoIHR5cGUgb2YgcG9saXRpY2FsIHN0cmVuZ3RoKQoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19uZXcgPC0gbG0odm90ZWRfdHJ1bXBfdmVyc3VzX2NsaW50b24gfiAgdG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyAqIHBvbF9zdHJlbmd0aCArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2UgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEsIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX25ldykKCmNvbmZpbnQodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19uZXcpCgoKCnZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2tfbmV3IDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGggKyBhZ2UgKyBnZW5kZXIgKyBlZHVjYXRpb24gKyBpbmNvbWUgKyByYWNlX290aGVyX2hpc3BhbmljICsgcmFjZV9ibGFjayArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSwgZGF0YSA9IHVzMjAxNl9yZWNvZGVkKQpzdW1tYXJ5KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2tfbmV3KQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrX25ldykKCgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc190b3RhbF90d2VldHNfbmV3IDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uIH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGggKyBhZ2UgKyBnZW5kZXIgKyBlZHVjYXRpb24gKyBpbmNvbWUgKyByYWNlX290aGVyX2hpc3BhbmljICsgcmFjZV9ibGFjayArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSArIHRvdGFsX3R3ZWV0c19sb2csIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXcpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfdG90YWxfdHdlZXRzX25ldykKCmBgYAoKYGBge3J9CnRhYl9tb2RlbCAodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19uZXcsIHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfYmxhY2tfbmV3LCB2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXcsIHByZWQubGFiZWxzID0gYyAoIkNvbnN0YW50IiwgIkV4cG9zdXJlIC0gSW5kZXBlbmRlbnQiLCAiUG9saXRpY2FsIFZpZXdzIC0gTGVhbiIsICJQb2xpdGljYWwgVmlld3MgLSBOb3QgU3Ryb25nIiwgIlBvbGl0aWNhbCBWaWV3cyAtIFN0cm9uZyIsICJBZ2UiLCAiV29tYW4iLCAiQ29sbGVnZS1lZHVjYXRlZCIsICJJbmNvbWUiLCAiUGVyc29uIG9mIENvbG9yIiwgIlJlZ2lvbjogTm9ydGhlYXN0IiwgIlJlZ2lvbjogTWlkd2VzdCIsICJSZWdpb246IFdlc3QiLCAiRnJlcS4gb2Ygc29jaWFsIG1lZGlhIHVzZSIsICJFeHBvc3VyZSAtIExlYW4iLCAiRXhwb3N1cmUgLSBOb3QgU3Ryb25nIiwgIkV4cG9zdXJlIC0gU3Ryb25nIiwgIk90aGVyL0hpc3BhbmljIiwgIkJsYWNrIiwgImxvZyhUb3RhbCBUd2VldHMpIiksICB0aXRsZSA9ICJUYWJsZSA1OiBOb24tbGluZWFyIGVmZmVjdHMgb2YgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgb24gdGhlIGxpa2VsaWhvb2Qgb2Ygc2hpZnRpbmcgdm90ZXIgcHJlZmVyZW5jZSB0b3dhcmRzIFRydW1wLCBhIG5vIHZvdGUsIG9yIGEgM3JkIGNhbmRpZGF0ZSIsIGRpZ2l0cyA9IDMsIAogICAgICAgICAgIGR2LmxhYmVscyA9IGMoIigxKSIsICIoMikiLCAiKDMpIiksCiAgICAgICAgICAgb3JkZXIudGVybXMgPSBjKDIsIDE1LCAxNiwgMTcsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxOCwgMTksIDExLCAxMiwgMTMsIDIwLCAxNCwgMSksIAogICAgICAgICAgICBwLnN0eWxlID0gInN0YXJzIiwgc2hvdy5jaSA9IEZBTFNFLCB2Y292LmZ1biA9ICJIQzAiLCBzaG93LnNlID0gVFJVRSkKYGBgCgpJbiB0YWJsZSA1LCBub25lIG9mIHRoZSBjb2VmZmljaWVudHMgb24gb3VyIHZhcmlhYmxlcyBvZiBpbnRlcmVzdCBhcmUgc2lnbmlmaWNhbnQuIEludGVyZXN0aW5nbHksIGhvd2V2ZXIsIHRoZSBwYXR0ZXJuIG9mIGNvZWZmaWNpZW50cyBpcyBkaWZmZXJlbnQgdG8gdGhlIHJlc3VsdHMgYWJvdmUsIHdpdGggcG9zaXRpdmUgY29lZmZpY2llbnRzIGZvciBpbmRlcGVuZGVudHMgYW5kIG5lZ2F0aXZlIGZvciBzdHJvbmcgdm90ZXJzLiBTaW1pbGFyIHRvIHRoZSByZXN1bHRzIGZyb20gdXNpbmcgdGhlIGFsdGVybmF0aXZlIGludGVyYWN0aW9uIHRlcm0sIHRoZXJlZm9yZSwgdGhlIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IHdoZW4gYWNjb3VudGluZyBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHN3aXRjaGluZyB0byB0aGlyZCBjYW5kaWRhdGVzIG9yIG5vdCB2b3RpbmcgcmVzdWx0cyBhcmUgZ2VuZXJhbGx5IGluc2lnbmlmaWNhbnQsIGFuZCBpbiB0aGlzIGNhc2Ugc2hvd2luZyBvcHBvc2l0ZSBzaWducyB0byB3aGVuIHVzaW5nIHRoZSBhbHRlcm5hdGl2ZSBkZXBlbmRlbnQgdmFyaWFibGVzLgoKYGBge3IgZWNobyA9IFRSVUUsIHJlc3VsdHMgPSdoaWRlJ30KIyBOZXcgVGFibGUgRTggd2l0aCBJbnRlcmFjdGlvbiAoVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSB3aGVyZSB3ZSBlc3RpbWF0ZSBhIHNlcGFyYXRlIGNvZWZmaWNpZW50IG9uIGV4cG9zdXJlIGZvciBlYWNoIHR5cGUgb2YgcG9saXRpY2FsIHN0cmVuZ3RoKQoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19uZXczIDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uX2JlbmVmaXQgfiAgdG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyAqIHBvbF9zdHJlbmd0aCArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2UgKyByZWdpb24gKyBpbnRlcm5ldF9zb2NpYWxfbWVkaWFfdzEsIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX25ldzMpCgpjb25maW50KHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfbmV3MykKCgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFja19uZXczIDwtIGxtKHZvdGVkX3RydW1wX3ZlcnN1c19jbGludG9uX2JlbmVmaXQgfiAgdG90YWxfZXhwb3N1cmVfcnVzc2lhX2xvZyAqIHBvbF9zdHJlbmd0aCArIGFnZSArIGdlbmRlciArIGVkdWNhdGlvbiArIGluY29tZSArIHJhY2Vfb3RoZXJfaGlzcGFuaWMgKyByYWNlX2JsYWNrICsgcmVnaW9uICsgaW50ZXJuZXRfc29jaWFsX21lZGlhX3cxLCBkYXRhID0gdXMyMDE2X3JlY29kZWQpCnN1bW1hcnkodm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFja19uZXczKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX2JsYWNrX25ldzMpCgoKdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc190b3RhbF90d2VldHNfbmV3MyA8LSBsbSh2b3RlZF90cnVtcF92ZXJzdXNfY2xpbnRvbl9iZW5lZml0IH4gIHRvdGFsX2V4cG9zdXJlX3J1c3NpYV9sb2cgKiBwb2xfc3RyZW5ndGggKyBhZ2UgKyBnZW5kZXIgKyBlZHVjYXRpb24gKyBpbmNvbWUgKyByYWNlX290aGVyX2hpc3BhbmljICsgcmFjZV9ibGFjayArIHJlZ2lvbiArIGludGVybmV0X3NvY2lhbF9tZWRpYV93MSArIHRvdGFsX3R3ZWV0c19sb2csIGRhdGEgPSB1czIwMTZfcmVjb2RlZCkKc3VtbWFyeSh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXczKQoKY29uZmludCh2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXczKQpgYGAKCmBgYHtyfQp0YWJfbW9kZWwgKHZvdGVfcmFua190b3RhbF9ydXNzaWFfY291bnRfbG1fY29udHJvbHNfbmV3Mywgdm90ZV9yYW5rX3RvdGFsX3J1c3NpYV9jb3VudF9sbV9jb250cm9sc19ibGFja19uZXczLCB2b3RlX3JhbmtfdG90YWxfcnVzc2lhX2NvdW50X2xtX2NvbnRyb2xzX3RvdGFsX3R3ZWV0c19uZXczLCBwcmVkLmxhYmVscyA9IGMgKCJDb25zdGFudCIsICJFeHBvc3VyZSAtIEluZGVwZW5kZW50IiwgIlBvbGl0aWNhbCBWaWV3cyAtIExlYW4iLCAiUG9saXRpY2FsIFZpZXdzIC0gTm90IFN0cm9uZyIsICJQb2xpdGljYWwgVmlld3MgLSBTdHJvbmciLCAiQWdlIiwgIldvbWFuIiwgIkNvbGxlZ2UtZWR1Y2F0ZWQiLCAiSW5jb21lIiwgIlBlcnNvbiBvZiBDb2xvciIsICJSZWdpb246IE5vcnRoZWFzdCIsICJSZWdpb246IE1pZHdlc3QiLCAiUmVnaW9uOiBXZXN0IiwgIkZyZXEuIG9mIHNvY2lhbCBtZWRpYSB1c2UiLCAiRXhwb3N1cmUgLSBMZWFuIiwgIkV4cG9zdXJlIC0gTm90IFN0cm9uZyIsICJFeHBvc3VyZSAtIFN0cm9uZyIsICJPdGhlci9IaXNwYW5pYyIsICJCbGFjayIsICJsb2coVG90YWwgVHdlZXRzKSIpLCAgdGl0bGUgPSAiVGFibGUgNjogTm9ubGluZWFyIGVmZmVjdCBvZiBleHBvc3VyZSB0byBSdXNzaWFuIHR3ZWV0cyBvbiAKICBjaGFuZ2VzIGluIHZvdGluZyBwcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSAxc3Qgd2F2ZSBvZiB0aGUgCiAgICAgICBZb3VHb3Ygc3VydmV5IGFuZCB0aGUgYWN0dWFsIHZvdGUiLCBkaWdpdHMgPSAzLCAKICAgICAgICAgICBkdi5sYWJlbHMgPSBjKCIoMSkiLCAiKDIpIiwgIigzKSIpLAogICAgICAgICAgIG9yZGVyLnRlcm1zID0gYygyLCAxNSwgMTYsIDE3LCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTgsIDE5LCAxMSwgMTIsIDEzLCAyMCwgMTQsIDEpLCAKICAgICAgICAgICAgcC5zdHlsZSA9ICJzdGFycyIsIHNob3cuY2kgPSBGQUxTRSwgdmNvdi5mdW4gPSAiSEMwIiwgc2hvdy5zZSA9IFRSVUUpCmBgYApJbiB0YWJsZSA2IHdlIGZpbmQgdGhlIHN0cm9uZ2VzdCByZXN1bHRzLiBIaWdoZXIgZXhwb3N1cmUgcmVkdWNlcyB0aGUgbGlrZWxpaG9vZCBvZiBjaGFuZ2luZyB2b3RpbmcgcHJlZmVyZW5jZXMgZm9yIGluZGVwZW5kZW50cywgd2hpbGUgaXQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBmb3IgYWxsIG90aGVyIGdyb3Vwcywgd2l0aCB0aGUgZWZmZWN0cyBiZWluZyBzb21ld2hhdCBsYXJnZXIgZm9yIHN0cm9uZyBncm91cHMuIFRoYXQgdGhpcyBjYXNlIHJlcHJlc2VudHMgYWN0dWFsIHZvdGluZyBwYXR0ZXJucywgaXQgcHJvdmlkZXMgdGhlIHN0cm9uZ2VzdCBldmlkZW5jZSB0aGF0IHNvbWUgZ3JvdXBzIGFyZSBzaWduaWZpY2FudGx5IGFmZmVjdGVkIGJ5IGV4cG9zdXJlIHRvIFJ1c3NpYW4gdHdlZXRzLgoKIyMgNC4gQ29uY2x1c2lvbnMKClRoZSByZXN1bHRzIHByb3ZpZGUgc29tZSBwYXJ0aWFsIHN1cHBvcnQgZm9yIHRoZSB2aWV3IHRoYXQgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgZG9lcyBoYXZlIG5vbi1saW5lYXIgZWZmZWN0cy4gVGhlIGV2aWRlbmNlIHN1Z2dlc3RzIHRoYXQgaGlnaGVyIGV4cG9zdXJlIHRvIFJ1c3NpYW4gdHdlZXRzIGlzIG1vcmUgbGlrZWx5IHRvIGVuY291cmFnZSB2b3RlcnMgd2l0aCBzdHJvbmcgcG9saXRpY2FsIHByZWZlcmVuY2VzIHRvIHN3aXRjaCB0aGVpciB2b3RpbmcgaW50ZW50aW9ucyB0b3dhcmRzIFRydW1wLCBidXQgdG8gbG93ZXIgdGhlIHByb2JhYmlsaXR5IG9mIHZvdGVycyB3aXRoIG1vcmUgaW5kZXBlbmRlbnQgcG9saXRpY2FsIHZpZXdzIHRvIHN3aXRjaCB0b3dhcmRzIFRydW1wLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUgaHlwb3RoZXNpcyB0ZXN0ZWQsIHdoaWNoIHdhcyB0aGF0IG1vcmUgaW5kZXBlbmRlbnQgdm90ZXJzIHdvdWxkIGJlIG1vcmUgbGlrZWx5IHRvIGJlIGluZmx1ZW5jZWQgYnkgZXhwb3N1cmUgdG8gUnVzc2lhbiB0d2VldHMgKEZ1aml3YXJhIGV0IGFsLCAyMDIzKS4gVGhlc2UgcmVzdWx0cyBhcmUgZm91bmQgdG8gYmUgcm9idXN0IHRvIHR3byBhbHRlcm5hdGl2ZSBhcHByb2FjaGVzIHRvIGFjY291bnRpbmcgZm9yIG5vbi1saW5lYXJpdGllcywgYXMgd2VsbCBhcyB0byBhbHRlcm5hdGl2ZSBkZWZpbml0aW9ucyBvZiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGFuZCB0byB0aGUgaW5jbHVzaW9uIG9mIGRpZmZlcmVudCBleHBsYW5hdG9yeSB2YXJpYWJsZXMuCgpUaGUgZXhwbGFuYXRpb24gZm9yIHN1Y2ggcmVzdWx0cyBpcyBub3Qgc28gY2xlYXIgYnV0IG1heSBwYXJ0bHkgcmVmbGVjdCB0aGF0IGluZGVwZW5kZW50cyBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgc3dheWVkIGJ5IG91dHNpZGUgbm9pc2UgaW4gdGhlaXIgdm90ZSBjaG9pY2UsIHBvdGVudGlhbGx5IGJlY2F1c2UgdGhleSBhY2Nlc3MgYSB3aWRlIHJhbmdlIG9mIGtub3dsZWRnZSBpbiByZWFjaGluZyB0aGVpciB2b3RpbmcgY2hvaWNlLiBDb252ZXJzZWx5LCB0aG9zZSB3aXRoIHN0cm9uZ2VyIHBvbGl0aWNhbCB2aWV3cyBhcmUgcGVyaGFwcyBsZXNzIGxpa2VseSB0byByZWNlaXZlIHNpZ25hbHMgY29udHJhcnkgdG8gdGhlaXIgcG9saXRpY2FsIG9waW5pb25zLCBzdWNoIHRoYXQgd2hlbiB0aGV5IGRvIGl0IGhhcyBhIGdyZWF0ZXIgaW1wYWN0IG9uIHRoZWlyIHZvdGluZyBwYXR0ZXJucy4gSWYgc3VjaCByZXN1bHRzIGFyZSBmb3VuZCB0byBob2xkIGluIG90aGVyIHN0dWRpZXMsIHRoZXkgc3VnZ2VzdCB0aGF0IHRob3NlIHdhbnRpbmcgdG8gaW5mbHVlbmNlIG91dGNvbWVzIG9mIGVsZWN0aW9ucyBhcmUgbGlrZWx5IHRvIGJlIG1vcmUgZWZmZWN0aXZlIGlmIHRoZXkgIGZvY3VzIG9uIGNoYW5naW5nIHRoZSBvcGluaW9ucyBvZiB0aG9zZSB3aXRoIHN0cm9uZ2VyIHZpZXdzLiAKCgojIyBSZWZlcmVuY2VzCgpFYWR5LCBHLiwgUGFza2hhbGlzLCBULiwgWmlsaW5za3ksIEouLCBCb25uZWF1LCBSLiwgTmFnbGVyLCBKLiwgJiBUdWNrZXIsIEouIEEuICgyMDIzKS4gRXhwb3N1cmUgdG8gdGhlIFJ1c3NpYW4gSW50ZXJuZXQgUmVzZWFyY2ggQWdlbmN5IGZvcmVpZ24gaW5mbHVlbmNlIGNhbXBhaWduIG9uIFR3aXR0ZXIgaW4gdGhlIDIwMTYgVVMgZWxlY3Rpb24gYW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gYXR0aXR1ZGVzIGFuZCB2b3RpbmcgYmVoYXZpb3IuIE5hdHVyZSBDb21tdW5pY2F0aW9ucywgMTQoMSksIDYyLiBkb2k6IGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L3M0MTQ2Ny0wMjItMzU1NzYtOQoKRnJlZXNlLCBKLiwgJiBQZXRlcnNvbiwgRC4gKDIwMTcpLiBSZXBsaWNhdGlvbiBpbiBzb2NpYWwgc2NpZW5jZS4gKkFubnVhbCBSZXZpZXcgb2YgU29jaW9sb2d5KiwgNDMsIDE0Ny0xNjUsIFtkb2k6IDEwLjExNDZdKGh0dHBzOi8vd3d3LmFubnVhbHJldmlld3Mub3JnL2RvaS9hYnMvMTAuMTE0Ni9hbm51cmV2LXNvYy0wNjAxMTYtMDUzNDUwKS4KCkZ1aml3YXJhLCBULiwgTcO8bGxlciwgSy4gYW5kIFNjaHdhcnosIEMuICgyMDIyKS4gVGhlIEVmZmVjdCBvZiBTb2NpYWwgTWVkaWEgb24gRWxlY3Rpb25zOiBFdmlkZW5jZSBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzLiBTU1JOIEVsZWN0cm9uaWMgSm91cm5hbC4gW29ubGluZV0gZG9pOmh0dHBzOi8vZG9pLm9yZy8xMC4yMTM5L3Nzcm4uMzcxOTk5OC4KCkdhcmNpYSwgRC4gKDIwMjMpLiBJbmZsdWVuY2Ugb2YgRmFjZWJvb2sgYWxnb3JpdGhtcyBvbiBwb2xpdGljYWwgcG9sYXJpemF0aW9uIHRlc3RlZC4gTmF0dXJlLiBbb25saW5lXSBkb2k6aHR0cHM6Ly9kb2kub3JnLzEwLjEwMzgvZDQxNTg2LTAyMy0wMjMyNS14LgoKTmFkZWVtLCBSLiAoMjAyMykuIFZvdGluZyBwYXR0ZXJucyBpbiB0aGUgMjAyMiBlbGVjdGlvbnMuIFtvbmxpbmVdIFBldyBSZXNlYXJjaCBDZW50ZXIgLSBVLlMuIFBvbGl0aWNzICYgUG9saWN5LiBBdmFpbGFibGUgYXQ6IGh0dHBzOi8vd3d3LnBld3Jlc2VhcmNoLm9yZy9wb2xpdGljcy8yMDIzLzA3LzEyL3ZvdGluZy1wYXR0ZXJucy1pbi10aGUtMjAyMi1lbGVjdGlvbnMvIFtBY2Nlc3NlZCAxNCBNYXkgMjAyNF0uCgpQZXcgUmVzZWFyY2ggQ2VudGVyICgyMDIwKS4gVm90ZXJzIFJhcmVseSBTd2l0Y2ggUGFydGllcywgYnV0IFJlY2VudCBTaGlmdHMgRnVydGhlciBFZHVjYXRpb25hbCwgUmFjaWFsIERpdmVyZ2VuY2UuIFtvbmxpbmVdIAoKUGV3IFJlc2VhcmNoIENlbnRlciAoMjAyMykuIFUuUy4gUG9saXRpY3MgJiBQb2xpY3kuIEF2YWlsYWJsZSBhdDogaHR0cHM6Ly93d3cucGV3cmVzZWFyY2gub3JnL3BvbGl0aWNzLzIwMjAvMDgvMDQvdm90ZXJzLXJhcmVseS1zd2l0Y2gtcGFydGllcy1idXQtcmVjZW50LXNoaWZ0cy1mdXJ0aGVyLWVkdWNhdGlvbmFsLXJhY2lhbC1kaXZlcmdlbmNlLyBbQWNjZXNzZWQgMTQgTWF5IDIwMjRdLgoKVHBhc2toYWxpcyAoMjAyMykgVHBhc2toYWxpcy9OQ09NTVNfUlVTU0lBX1VTXzIwMTY6IFJlcGxpY2F0aW9uIG1hdGVyaWFscyBmb3Ig4oCYZXhwb3N1cmUgdG8gdGhlIFJ1c3NpYW4gSW50ZXJuZXQgUmVzZWFyY2ggQWdlbmN5IEZvcmVpZ24gSW5mbHVlbmNlIENhbXBhaWduIG9uIFR3aXR0ZXIgaW4gdGhlIDIwMTYgVVMgZWxlY3Rpb24gYW5kIGl0cyByZWxhdGlvbnNoaXAgdG8gYXR0aXR1ZGVzIGFuZCB2b3RpbmcgYmVoYXZpb3LigJksIEdpdEh1Yi4gQXZhaWxhYmxlIGF0OiBodHRwczovL2dpdGh1Yi5jb20vdHBhc2toYWxpcy9uY29tbXNfcnVzc2lhX3VzXzIwMTYgIChBY2Nlc3NlZDogOCBNYXkgMjAyNCkuICAKCldlZWtzLCBCLkUuLCBMYW5lLCBELlMuLCBLaW0sIEQuSC4sIExlZSwgUy5TLiBhbmQgS3dhaywgTi4gKDIwMTcpLiBJbmNpZGVudGFsIEV4cG9zdXJlLCBTZWxlY3RpdmUgRXhwb3N1cmUsIGFuZCBQb2xpdGljYWwgSW5mb3JtYXRpb24gU2hhcmluZzogSW50ZWdyYXRpbmcgT25saW5lIEV4cG9zdXJlIFBhdHRlcm5zIGFuZCBFeHByZXNzaW9uIG9uIFNvY2lhbCBNZWRpYS4gSm91cm5hbCBvZiBDb21wdXRlci1NZWRpYXRlZCBDb21tdW5pY2F0aW9uLCAyMig2KSwgcHAuMzYz4oCTMzc5LiBkb2k6aHR0cHM6Ly9kb2kub3JnLzEwLjExMTEvamNjNC4xMjE5OS4KCgojIyBBcHBlbmRpeAoKIyMjIEFwcGVuZGl4IDEuIE15IGVudmlyb21lbnQgKGZ1bGwgaW5mb3JtYXRpb24pIAoKYGBge3Igc2Vzc2lvbn0KIyBEZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBteSBlbnZpcm9ubWVudApzZXNzaW9uSW5mbygpCmBgYAoKIyMjIEFwcGVuZGl4IDIuIEVudGlyZSBSIGNvZGUgdXNlZCBpbiB0aGUgcHJvamVjdAoKYGBge3IgcmVmLmxhYmVsPWtuaXRyOjphbGxfbGFiZWxzKCksIGVjaG89VFJVRSwgZXZhbD1GQUxTRX0KYGBgCg==