Assignment: 2016 US Senate Montana election: Tester/Rosendale

The Senate election may be an even better test of these two hypotheses, because the election was even closer to 50-50, but this time Tester the Democrat won.

Run through the senate election as we did above with the house election. You can get the data from the same spreadsheet, but it’s on sheet = 1.

library(tidyverse)
library(leaflet)
library(sf)
library(readxl)
library(DT)
library(plotly)
library(broom)
library(tidycensus)
census_api_key("3d4c45181796a28eee4974c4c41568433a7d229f")
To install your API key for use in future sessions, run this function with `install = TRUE`.
senate_counties <- read_xlsx("Statewide Results.xlsx", sheet = 1, range = "B7:E63")
senate_counties <- senate_counties %>% 
rename(Republican = "MATT ROSENDALE\r\nRepublican") %>% 
  rename(Democrat = "JON TESTER\r\nDemocrat") %>% 
  rename(Libertarian = "RICK BRECKENRIDGE\r\nLibertarian")

For this assignment, we are looking at the 2016 Montana Senate race between Jon Tester (Democrat) and Matt Rosendale (Republican). Rick Breckenridge ran as a Libertarian, but we aren’t going to analyze his contribution to the race.

senate_counties <- senate_counties %>% 
  mutate(total_votes = Republican + Democrat + Libertarian) %>% 
  mutate(Repub_advantage = Republican/total_votes - Democrat/total_votes) %>% 
  mutate(Repub_advantage = round(Repub_advantage*100, 1))

senate_counties %>% 
  arrange(-Repub_advantage)

Here are the counties’ senate results organized by Democrat, Republican, and Libertarian votes. The Republican-Democrat split is shown in column “Repub_advantage” with a higher number indicating a Republican advantage, and a lower number (all the way through negative) indicating a Democrat advantage.

mt_counties <- get_acs(geography = "county",
                       variables = "B01003_001",
                       state = "MT",
                       geometry = TRUE) 
Getting data from the 2014-2018 5-year ACS
Downloading feature geometry from the Census website.  To cache shapefiles for use in future sessions, set `options(tigris_use_cache = TRUE)`.
Using FIPS code '30' for state 'MT'

  |                                                                                                                         
  |                                                                                                                   |   0%
  |                                                                                                                         
  |=                                                                                                                  |   0%
  |                                                                                                                         
  |=                                                                                                                  |   1%
  |                                                                                                                         
  |==                                                                                                                 |   1%
  |                                                                                                                         
  |==                                                                                                                 |   2%
  |                                                                                                                         
  |===                                                                                                                |   2%
  |                                                                                                                         
  |===                                                                                                                |   3%
  |                                                                                                                         
  |====                                                                                                               |   3%
  |                                                                                                                         
  |====                                                                                                               |   4%
  |                                                                                                                         
  |=====                                                                                                              |   4%
  |                                                                                                                         
  |=====                                                                                                              |   5%
  |                                                                                                                         
  |======                                                                                                             |   5%
  |                                                                                                                         
  |======                                                                                                             |   6%
  |                                                                                                                         
  |=======                                                                                                            |   6%
  |                                                                                                                         
  |=======                                                                                                            |   7%
  |                                                                                                                         
  |========                                                                                                           |   7%
  |                                                                                                                         
  |=========                                                                                                          |   8%
  |                                                                                                                         
  |==========                                                                                                         |   8%
  |                                                                                                                         
  |==========                                                                                                         |   9%
  |                                                                                                                         
  |===========                                                                                                        |   9%
  |                                                                                                                         
  |===========                                                                                                        |  10%
  |                                                                                                                         
  |============                                                                                                       |  10%
  |                                                                                                                         
  |============                                                                                                       |  11%
  |                                                                                                                         
  |=============                                                                                                      |  11%
  |                                                                                                                         
  |=============                                                                                                      |  12%
  |                                                                                                                         
  |==============                                                                                                     |  12%
  |                                                                                                                         
  |==============                                                                                                     |  13%
  |                                                                                                                         
  |===============                                                                                                    |  13%
  |                                                                                                                         
  |================                                                                                                   |  14%
  |                                                                                                                         
  |=================                                                                                                  |  14%
  |                                                                                                                         
  |=================                                                                                                  |  15%
  |                                                                                                                         
  |==================                                                                                                 |  15%
  |                                                                                                                         
  |==================                                                                                                 |  16%
  |                                                                                                                         
  |===================                                                                                                |  16%
  |                                                                                                                         
  |===================                                                                                                |  17%
  |                                                                                                                         
  |====================                                                                                               |  17%
  |                                                                                                                         
  |====================                                                                                               |  18%
  |                                                                                                                         
  |=====================                                                                                              |  18%
  |                                                                                                                         
  |=====================                                                                                              |  19%
  |                                                                                                                         
  |======================                                                                                             |  19%
  |                                                                                                                         
  |======================                                                                                             |  20%
  |                                                                                                                         
  |=======================                                                                                            |  20%
  |                                                                                                                         
  |========================                                                                                           |  21%
  |                                                                                                                         
  |=========================                                                                                          |  21%
  |                                                                                                                         
  |=========================                                                                                          |  22%
  |                                                                                                                         
  |==========================                                                                                         |  22%
  |                                                                                                                         
  |==========================                                                                                         |  23%
  |                                                                                                                         
  |===========================                                                                                        |  23%
  |                                                                                                                         
  |===========================                                                                                        |  24%
  |                                                                                                                         
  |============================                                                                                       |  24%
  |                                                                                                                         
  |============================                                                                                       |  25%
  |                                                                                                                         
  |=============================                                                                                      |  25%
  |                                                                                                                         
  |=============================                                                                                      |  26%
  |                                                                                                                         
  |==============================                                                                                     |  26%
  |                                                                                                                         
  |===============================                                                                                    |  27%
  |                                                                                                                         
  |================================                                                                                   |  27%
  |                                                                                                                         
  |================================                                                                                   |  28%
  |                                                                                                                         
  |=================================                                                                                  |  28%
  |                                                                                                                         
  |=================================                                                                                  |  29%
  |                                                                                                                         
  |==================================                                                                                 |  29%
  |                                                                                                                         
  |==================================                                                                                 |  30%
  |                                                                                                                         
  |===================================                                                                                |  30%
  |                                                                                                                         
  |===================================                                                                                |  31%
  |                                                                                                                         
  |====================================                                                                               |  31%
  |                                                                                                                         
  |====================================                                                                               |  32%
  |                                                                                                                         
  |=====================================                                                                              |  32%
  |                                                                                                                         
  |=====================================                                                                              |  33%
  |                                                                                                                         
  |======================================                                                                             |  33%
  |                                                                                                                         
  |=======================================                                                                            |  34%
  |                                                                                                                         
  |========================================                                                                           |  34%
  |                                                                                                                         
  |========================================                                                                           |  35%
  |                                                                                                                         
  |=========================================                                                                          |  35%
  |                                                                                                                         
  |=========================================                                                                          |  36%
  |                                                                                                                         
  |==========================================                                                                         |  36%
  |                                                                                                                         
  |==========================================                                                                         |  37%
  |                                                                                                                         
  |===========================================                                                                        |  37%
  |                                                                                                                         
  |===========================================                                                                        |  38%
  |                                                                                                                         
  |============================================                                                                       |  38%
  |                                                                                                                         
  |============================================                                                                       |  39%
  |                                                                                                                         
  |=============================================                                                                      |  39%
  |                                                                                                                         
  |==============================================                                                                     |  40%
  |                                                                                                                         
  |===============================================                                                                    |  41%
  |                                                                                                                         
  |================================================                                                                   |  41%
  |                                                                                                                         
  |================================================                                                                   |  42%
  |                                                                                                                         
  |=================================================                                                                  |  42%
  |                                                                                                                         
  |=================================================                                                                  |  43%
  |                                                                                                                         
  |==================================================                                                                 |  43%
  |                                                                                                                         
  |==================================================                                                                 |  44%
  |                                                                                                                         
  |===================================================                                                                |  44%
  |                                                                                                                         
  |===================================================                                                                |  45%
  |                                                                                                                         
  |====================================================                                                               |  45%
  |                                                                                                                         
  |====================================================                                                               |  46%
  |                                                                                                                         
  |=====================================================                                                              |  46%
  |                                                                                                                         
  |======================================================                                                             |  47%
  |                                                                                                                         
  |=======================================================                                                            |  47%
  |                                                                                                                         
  |=======================================================                                                            |  48%
  |                                                                                                                         
  |========================================================                                                           |  48%
  |                                                                                                                         
  |========================================================                                                           |  49%
  |                                                                                                                         
  |=========================================================                                                          |  49%
  |                                                                                                                         
  |=========================================================                                                          |  50%
  |                                                                                                                         
  |==========================================================                                                         |  50%
  |                                                                                                                         
  |==========================================================                                                         |  51%
  |                                                                                                                         
  |===========================================================                                                        |  51%
  |                                                                                                                         
  |===========================================================                                                        |  52%
  |                                                                                                                         
  |============================================================                                                       |  52%
  |                                                                                                                         
  |============================================================                                                       |  53%
  |                                                                                                                         
  |=============================================================                                                      |  53%
  |                                                                                                                         
  |==============================================================                                                     |  54%
  |                                                                                                                         
  |===============================================================                                                    |  54%
  |                                                                                                                         
  |===============================================================                                                    |  55%
  |                                                                                                                         
  |================================================================                                                   |  55%
  |                                                                                                                         
  |================================================================                                                   |  56%
  |                                                                                                                         
  |=================================================================                                                  |  56%
  |                                                                                                                         
  |=================================================================                                                  |  57%
  |                                                                                                                         
  |==================================================================                                                 |  57%
  |                                                                                                                         
  |==================================================================                                                 |  58%
  |                                                                                                                         
  |===================================================================                                                |  58%
  |                                                                                                                         
  |===================================================================                                                |  59%
  |                                                                                                                         
  |====================================================================                                               |  59%
  |                                                                                                                         
  |====================================================================                                               |  60%
  |                                                                                                                         
  |=====================================================================                                              |  60%
  |                                                                                                                         
  |======================================================================                                             |  60%
  |                                                                                                                         
  |======================================================================                                             |  61%
  |                                                                                                                         
  |=======================================================================                                            |  61%
  |                                                                                                                         
  |=======================================================================                                            |  62%
  |                                                                                                                         
  |========================================================================                                           |  62%
  |                                                                                                                         
  |========================================================================                                           |  63%
  |                                                                                                                         
  |=========================================================================                                          |  63%
  |                                                                                                                         
  |=========================================================================                                          |  64%
  |                                                                                                                         
  |==========================================================================                                         |  64%
  |                                                                                                                         
  |==========================================================================                                         |  65%
  |                                                                                                                         
  |===========================================================================                                        |  65%
  |                                                                                                                         
  |===========================================================================                                        |  66%
  |                                                                                                                         
  |============================================================================                                       |  66%
  |                                                                                                                         
  |=============================================================================                                      |  67%
  |                                                                                                                         
  |==============================================================================                                     |  67%
  |                                                                                                                         
  |==============================================================================                                     |  68%
  |                                                                                                                         
  |===============================================================================                                    |  68%
  |                                                                                                                         
  |===============================================================================                                    |  69%
  |                                                                                                                         
  |================================================================================                                   |  69%
  |                                                                                                                         
  |================================================================================                                   |  70%
  |                                                                                                                         
  |=================================================================================                                  |  70%
  |                                                                                                                         
  |=================================================================================                                  |  71%
  |                                                                                                                         
  |==================================================================================                                 |  71%
  |                                                                                                                         
  |==================================================================================                                 |  72%
  |                                                                                                                         
  |===================================================================================                                |  72%
  |                                                                                                                         
  |===================================================================================                                |  73%
  |                                                                                                                         
  |====================================================================================                               |  73%
  |                                                                                                                         
  |=====================================================================================                              |  73%
  |                                                                                                                         
  |=====================================================================================                              |  74%
  |                                                                                                                         
  |======================================================================================                             |  74%
  |                                                                                                                         
  |======================================================================================                             |  75%
  |                                                                                                                         
  |=======================================================================================                            |  75%
  |                                                                                                                         
  |=======================================================================================                            |  76%
  |                                                                                                                         
  |========================================================================================                           |  76%
  |                                                                                                                         
  |========================================================================================                           |  77%
  |                                                                                                                         
  |=========================================================================================                          |  77%
  |                                                                                                                         
  |=========================================================================================                          |  78%
  |                                                                                                                         
  |==========================================================================================                         |  78%
  |                                                                                                                         
  |==========================================================================================                         |  79%
  |                                                                                                                         
  |===========================================================================================                        |  79%
  |                                                                                                                         
  |===========================================================================================                        |  80%
  |                                                                                                                         
  |============================================================================================                       |  80%
  |                                                                                                                         
  |=============================================================================================                      |  80%
  |                                                                                                                         
  |=============================================================================================                      |  81%
  |                                                                                                                         
  |==============================================================================================                     |  81%
  |                                                                                                                         
  |==============================================================================================                     |  82%
  |                                                                                                                         
  |===============================================================================================                    |  82%
  |                                                                                                                         
  |===============================================================================================                    |  83%
  |                                                                                                                         
  |================================================================================================                   |  83%
  |                                                                                                                         
  |================================================================================================                   |  84%
  |                                                                                                                         
  |=================================================================================================                  |  84%
  |                                                                                                                         
  |=================================================================================================                  |  85%
  |                                                                                                                         
  |==================================================================================================                 |  85%
  |                                                                                                                         
  |==================================================================================================                 |  86%
  |                                                                                                                         
  |===================================================================================================                |  86%
  |                                                                                                                         
  |====================================================================================================               |  87%
  |                                                                                                                         
  |=====================================================================================================              |  87%
  |                                                                                                                         
  |=====================================================================================================              |  88%
  |                                                                                                                         
  |======================================================================================================             |  88%
  |                                                                                                                         
  |======================================================================================================             |  89%
  |                                                                                                                         
  |=======================================================================================================            |  89%
  |                                                                                                                         
  |=======================================================================================================            |  90%
  |                                                                                                                         
  |========================================================================================================           |  90%
  |                                                                                                                         
  |========================================================================================================           |  91%
  |                                                                                                                         
  |=========================================================================================================          |  91%
  |                                                                                                                         
  |=========================================================================================================          |  92%
  |                                                                                                                         
  |==========================================================================================================         |  92%
  |                                                                                                                         
  |==========================================================================================================         |  93%
  |                                                                                                                         
  |===========================================================================================================        |  93%
  |                                                                                                                         
  |============================================================================================================       |  93%
  |                                                                                                                         
  |============================================================================================================       |  94%
  |                                                                                                                         
  |=============================================================================================================      |  94%
  |                                                                                                                         
  |=============================================================================================================      |  95%
  |                                                                                                                         
  |==============================================================================================================     |  95%
  |                                                                                                                         
  |==============================================================================================================     |  96%
  |                                                                                                                         
  |===============================================================================================================    |  96%
  |                                                                                                                         
  |===============================================================================================================    |  97%
  |                                                                                                                         
  |================================================================================================================   |  97%
  |                                                                                                                         
  |================================================================================================================   |  98%
  |                                                                                                                         
  |=================================================================================================================  |  98%
  |                                                                                                                         
  |=================================================================================================================  |  99%
  |                                                                                                                         
  |================================================================================================================== |  99%
  |                                                                                                                         
  |================================================================================================================== | 100%
  |                                                                                                                         
  |===================================================================================================================| 100%
senate_counties[25, "County"] <- "Lewis and Clark"             

mt_counties <- mt_counties %>% 
  mutate(County = gsub(" County, Montana", "", NAME)) %>%     
  rename(Population = estimate) 
senate_election <- mt_counties %>% 
  full_join(senate_counties)
Joining, by = "County"
senate_election %>%
  as_tibble() %>% 
  select(County, Population, Democrat, Republican, Libertarian, total_votes, Repub_advantage) %>% 
  datatable()

Here is a datatable of all the Senate votings throughout Montana counties. Glacier county has the highest Democrat advantage, and Garfield county has the highest Republican advantage.

vote_colors <- colorNumeric(palette = "viridis", domain = senate_election$Repub_advantage)

senate_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1,
              fillColor = ~vote_colors(Repub_advantage), 
              label = ~paste0(County, ", Republican advantage = ", Repub_advantage),
              highlight = highlightOptions(weight = 2)) %>% 
  setView(-110, 47, zoom = 6) %>% 
  addLegend(pal = vote_colors, values = ~Repub_advantage)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'

Here’s a choreopleth of the senate voting in Montana counties, distinguished by color according to Republican or Democrat advantage. Not surprisingly, Missoula county has a much higher Democrat advantage over Republicans.

pop_model <- lm(Repub_advantage ~ Population, data = senate_election)

tidy(pop_model)
glance(pop_model)
sqrt(.1778615)
[1] 0.4217363

Here is a small table of a linear regression of the Republican advantage due to population. The r squared is 0.42, with a statistically significant p-value. This means that there is a positive (and significant) correlation between having a higher population and having a higher Democrat advantage.

senate_election %>%
  plot_ly(x = ~Population, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", 
                        County, "<br>", 
                        "Population: ", Population, "<br>", 
                        "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(showlegend = F, marker = list(opacity = 0.7)) %>%
  layout(title = "Predicting Republican Vote Advantage from Population, by County",
         xaxis = list(title = "County population"),
         yaxis = list(title = "Republican vote advantage")) %>% 
  add_lines(y = ~fitted(pop_model))

NA

Here is a graph depicting the population by county, and the Republican/Democrat advantage as shown by the line. Most of the counties in Montana don’t have many people, so the graph is skewed. However, the linear regression clearly demonstrates a pattern between the population of a county and it’s political advantage. Eastern counties favored Matt Rosendale, while western counties voted for Tester.

senate_election <- senate_election %>% 
  mutate(Longitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$X) %>% 
  mutate(Latitude = as_tibble(st_coordinates(st_centroid(senate_election$geometry)))$Y)
st_centroid does not give correct centroids for longitude/latitude datast_centroid does not give correct centroids for longitude/latitude data
senate_election %>%
  leaflet() %>% 
  addTiles() %>%
  addPolygons(weight = 1) %>% 
  setView(-110, 47, zoom = 6) %>% 
addCircleMarkers(~Longitude, ~Latitude)
sf layer has inconsistent datum (+proj=longlat +datum=NAD83 +no_defs).
Need '+proj=longlat +datum=WGS84'

Here’s a graph illustrating the “center” of each county, geographically.

longitude_lm <- lm(Repub_advantage ~ Longitude, data = senate_election)
tidy(longitude_lm)
glance(longitude_lm)
sqrt(0.1732821)
[1] 0.4162717

This table shows a linear regression of population by geography. The r squared is 0.42 with a significant p-value, indicating that there is a significant, positive correlation between western counties having a higher population compared to eastern counties.

senate_election %>% 
  plot_ly(x = ~Longitude, 
          y = ~Repub_advantage,
          hoverinfo = "text", 
          text = ~paste("County:", County, "<br>", "Longitude: ", Longitude, "<br>", "Republican advantage: ", Repub_advantage)) %>% 
  add_markers(marker = list(opacity = 0.7), showlegend = F) %>%
  layout(title = "Predicting Republican Vote Advantage from Longitude, by County",
         xaxis = list(title = "County longitude"),
         yaxis = list(title = "Republican vote advantage")) %>% 
  add_lines(y = ~fitted(longitude_lm))

This graph illustrates the population density of Montana by geography, with the linear regression indicating a positive correlation between eastern counties (with lower populations) voting more Republican in the senate election. According to the table, Tester did better than Rosendale in the western counties.

multiple_lm <- lm(Repub_advantage ~ Population + Longitude, data = senate_election)
tidy(multiple_lm)
glance(multiple_lm)
sqrt(0.273999   )
[1] 0.5234491

Here is a multiple regression predicting the geographic area (west or east) and population. With an r squared value of 0.52 and a significant p-value, one can predict a positive correlation between population amount and geographic region.

senate_election %>% 
  plot_ly(x = ~Longitude, y = ~Population, z = ~Repub_advantage, 
          text = ~County, hoverinfo = "text") %>% 
  add_markers(opacity = .7, showlegend = F)

Here is a 3D graph showing the relationship between longitude, population, and voting behavior in Montana. The farther east you get, the more votes Matt Rosendale received. The farther west you get, the more votes Jon Tester received. A very interesting result with lots of implications for future politicians campaigning in Montana.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKQXNzaWdubWVudDogMjAxNiBVUyBTZW5hdGUgTW9udGFuYSBlbGVjdGlvbjogVGVzdGVyL1Jvc2VuZGFsZQoKVGhlIFNlbmF0ZSBlbGVjdGlvbiBtYXkgYmUgYW4gZXZlbiBiZXR0ZXIgdGVzdCBvZiB0aGVzZSB0d28gaHlwb3RoZXNlcywgYmVjYXVzZSB0aGUgZWxlY3Rpb24gd2FzIGV2ZW4gY2xvc2VyIHRvIDUwLTUwLCBidXQgdGhpcyB0aW1lIFRlc3RlciB0aGUgRGVtb2NyYXQgd29uLgoKUnVuIHRocm91Z2ggdGhlIHNlbmF0ZSBlbGVjdGlvbiBhcyB3ZSBkaWQgYWJvdmUgd2l0aCB0aGUgaG91c2UgZWxlY3Rpb24uIFlvdSBjYW4gZ2V0IHRoZSBkYXRhIGZyb20gdGhlIHNhbWUgc3ByZWFkc2hlZXQsIGJ1dCBpdCdzIG9uIHNoZWV0ID0gMS4KCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShzZikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoRFQpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGJyb29tKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmNlbnN1c19hcGlfa2V5KCIzZDRjNDUxODE3OTZhMjhlZWU0OTc0YzRjNDE1Njg0MzNhN2QyMjlmIikKYGBgCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHJlYWRfeGxzeCgiU3RhdGV3aWRlIFJlc3VsdHMueGxzeCIsIHNoZWV0ID0gMSwgcmFuZ2UgPSAiQjc6RTYzIikKYGBgCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHNlbmF0ZV9jb3VudGllcyAlPiUgCnJlbmFtZShSZXB1YmxpY2FuID0gIk1BVFQgUk9TRU5EQUxFXHJcblJlcHVibGljYW4iKSAlPiUgCiAgcmVuYW1lKERlbW9jcmF0ID0gIkpPTiBURVNURVJcclxuRGVtb2NyYXQiKSAlPiUgCiAgcmVuYW1lKExpYmVydGFyaWFuID0gIlJJQ0sgQlJFQ0tFTlJJREdFXHJcbkxpYmVydGFyaWFuIikKYGBgCkZvciB0aGlzIGFzc2lnbm1lbnQsIHdlIGFyZSBsb29raW5nIGF0IHRoZSAyMDE2IE1vbnRhbmEgU2VuYXRlIHJhY2UgYmV0d2VlbiBKb24gVGVzdGVyIChEZW1vY3JhdCkgYW5kIE1hdHQgUm9zZW5kYWxlIChSZXB1YmxpY2FuKS4gUmljayBCcmVja2VucmlkZ2UgcmFuIGFzIGEgTGliZXJ0YXJpYW4sIGJ1dCB3ZSBhcmVuJ3QgZ29pbmcgdG8gYW5hbHl6ZSBoaXMgY29udHJpYnV0aW9uIHRvIHRoZSByYWNlLgoKCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzIDwtIHNlbmF0ZV9jb3VudGllcyAlPiUgCiAgbXV0YXRlKHRvdGFsX3ZvdGVzID0gUmVwdWJsaWNhbiArIERlbW9jcmF0ICsgTGliZXJ0YXJpYW4pICU+JSAKICBtdXRhdGUoUmVwdWJfYWR2YW50YWdlID0gUmVwdWJsaWNhbi90b3RhbF92b3RlcyAtIERlbW9jcmF0L3RvdGFsX3ZvdGVzKSAlPiUgCiAgbXV0YXRlKFJlcHViX2FkdmFudGFnZSA9IHJvdW5kKFJlcHViX2FkdmFudGFnZSoxMDAsIDEpKQoKc2VuYXRlX2NvdW50aWVzICU+JSAKICBhcnJhbmdlKC1SZXB1Yl9hZHZhbnRhZ2UpCmBgYApIZXJlIGFyZSB0aGUgY291bnRpZXMnIHNlbmF0ZSByZXN1bHRzIG9yZ2FuaXplZCBieSBEZW1vY3JhdCwgUmVwdWJsaWNhbiwgYW5kIExpYmVydGFyaWFuIHZvdGVzLiBUaGUgUmVwdWJsaWNhbi1EZW1vY3JhdCBzcGxpdCAgaXMgc2hvd24gaW4gY29sdW1uICJSZXB1Yl9hZHZhbnRhZ2UiIHdpdGggYSBoaWdoZXIgbnVtYmVyIGluZGljYXRpbmcgYSBSZXB1YmxpY2FuIGFkdmFudGFnZSwgYW5kIGEgbG93ZXIgbnVtYmVyIChhbGwgdGhlIHdheSB0aHJvdWdoIG5lZ2F0aXZlKSBpbmRpY2F0aW5nIGEgRGVtb2NyYXQgYWR2YW50YWdlLgoKCmBgYHtyfQptdF9jb3VudGllcyA8LSBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyA9ICJCMDEwMDNfMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9ICJNVCIsCiAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBUUlVFKSAKYGBgCgpgYGB7cn0Kc2VuYXRlX2NvdW50aWVzWzI1LCAiQ291bnR5Il0gPC0gIkxld2lzIGFuZCBDbGFyayIgICAgICAgICAgICAgCgptdF9jb3VudGllcyA8LSBtdF9jb3VudGllcyAlPiUgCiAgbXV0YXRlKENvdW50eSA9IGdzdWIoIiBDb3VudHksIE1vbnRhbmEiLCAiIiwgTkFNRSkpICU+JSAgICAgCiAgcmVuYW1lKFBvcHVsYXRpb24gPSBlc3RpbWF0ZSkgCmBgYAoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiA8LSBtdF9jb3VudGllcyAlPiUgCiAgZnVsbF9qb2luKHNlbmF0ZV9jb3VudGllcykKYGBgCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUKICBhc190aWJibGUoKSAlPiUgCiAgc2VsZWN0KENvdW50eSwgUG9wdWxhdGlvbiwgRGVtb2NyYXQsIFJlcHVibGljYW4sIExpYmVydGFyaWFuLCB0b3RhbF92b3RlcywgUmVwdWJfYWR2YW50YWdlKSAlPiUgCiAgZGF0YXRhYmxlKCkKYGBgCkhlcmUgaXMgYSBkYXRhdGFibGUgb2YgYWxsIHRoZSBTZW5hdGUgdm90aW5ncyB0aHJvdWdob3V0IE1vbnRhbmEgY291bnRpZXMuIEdsYWNpZXIgY291bnR5IGhhcyB0aGUgaGlnaGVzdCBEZW1vY3JhdCBhZHZhbnRhZ2UsIGFuZCBHYXJmaWVsZCBjb3VudHkgaGFzIHRoZSBoaWdoZXN0IFJlcHVibGljYW4gYWR2YW50YWdlLiAKCgoKCgpgYGB7cn0Kdm90ZV9jb2xvcnMgPC0gY29sb3JOdW1lcmljKHBhbGV0dGUgPSAidmlyaWRpcyIsIGRvbWFpbiA9IHNlbmF0ZV9lbGVjdGlvbiRSZXB1Yl9hZHZhbnRhZ2UpCgpzZW5hdGVfZWxlY3Rpb24gJT4lCiAgbGVhZmxldCgpICU+JSAKICBhZGRUaWxlcygpICU+JQogIGFkZFBvbHlnb25zKHdlaWdodCA9IDEsCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnZvdGVfY29sb3JzKFJlcHViX2FkdmFudGFnZSksIAogICAgICAgICAgICAgIGxhYmVsID0gfnBhc3RlMChDb3VudHksICIsIFJlcHVibGljYW4gYWR2YW50YWdlID0gIiwgUmVwdWJfYWR2YW50YWdlKSwKICAgICAgICAgICAgICBoaWdobGlnaHQgPSBoaWdobGlnaHRPcHRpb25zKHdlaWdodCA9IDIpKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKICBhZGRMZWdlbmQocGFsID0gdm90ZV9jb2xvcnMsIHZhbHVlcyA9IH5SZXB1Yl9hZHZhbnRhZ2UpCgpgYGAKSGVyZSdzIGEgY2hvcmVvcGxldGggb2YgdGhlIHNlbmF0ZSB2b3RpbmcgaW4gTW9udGFuYSBjb3VudGllcywgZGlzdGluZ3Vpc2hlZCBieSBjb2xvciBhY2NvcmRpbmcgdG8gUmVwdWJsaWNhbiBvciBEZW1vY3JhdCBhZHZhbnRhZ2UuIE5vdCBzdXJwcmlzaW5nbHksIE1pc3NvdWxhIGNvdW50eSBoYXMgYSBtdWNoIGhpZ2hlciBEZW1vY3JhdCBhZHZhbnRhZ2Ugb3ZlciBSZXB1YmxpY2Fucy4gCgoKCmBgYHtyfQpwb3BfbW9kZWwgPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gUG9wdWxhdGlvbiwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKCnRpZHkocG9wX21vZGVsKQpnbGFuY2UocG9wX21vZGVsKQpgYGAKYGBge3J9CnNxcnQoLjE3Nzg2MTUpCmBgYApIZXJlIGlzIGEgc21hbGwgdGFibGUgb2YgYSBsaW5lYXIgcmVncmVzc2lvbiBvZiB0aGUgUmVwdWJsaWNhbiBhZHZhbnRhZ2UgZHVlIHRvIHBvcHVsYXRpb24uIFRoZSByIHNxdWFyZWQgaXMgMC40Miwgd2l0aCBhIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgcC12YWx1ZS4gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIGEgcG9zaXRpdmUgKGFuZCBzaWduaWZpY2FudCkgY29ycmVsYXRpb24gYmV0d2VlbiBoYXZpbmcgYSBoaWdoZXIgcG9wdWxhdGlvbiBhbmQgaGF2aW5nIGEgaGlnaGVyIERlbW9jcmF0IGFkdmFudGFnZS4gCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUKICBwbG90X2x5KHggPSB+UG9wdWxhdGlvbiwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50eSwgIjxicj4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgIlBvcHVsYXRpb246ICIsIFBvcHVsYXRpb24sICI8YnI+IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICJSZXB1YmxpY2FuIGFkdmFudGFnZTogIiwgUmVwdWJfYWR2YW50YWdlKSkgJT4lIAogIGFkZF9tYXJrZXJzKHNob3dsZWdlbmQgPSBGLCBtYXJrZXIgPSBsaXN0KG9wYWNpdHkgPSAwLjcpKSAlPiUKICBsYXlvdXQodGl0bGUgPSAiUHJlZGljdGluZyBSZXB1YmxpY2FuIFZvdGUgQWR2YW50YWdlIGZyb20gUG9wdWxhdGlvbiwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBwb3B1bGF0aW9uIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICJSZXB1YmxpY2FuIHZvdGUgYWR2YW50YWdlIikpICU+JSAKICBhZGRfbGluZXMoeSA9IH5maXR0ZWQocG9wX21vZGVsKSkKICAKYGBgCkhlcmUgaXMgYSBncmFwaCBkZXBpY3RpbmcgdGhlIHBvcHVsYXRpb24gYnkgY291bnR5LCBhbmQgdGhlIFJlcHVibGljYW4vRGVtb2NyYXQgYWR2YW50YWdlIGFzIHNob3duIGJ5IHRoZSBsaW5lLiBNb3N0IG9mIHRoZSBjb3VudGllcyBpbiBNb250YW5hIGRvbid0IGhhdmUgbWFueSBwZW9wbGUsIHNvIHRoZSBncmFwaCBpcyBza2V3ZWQuIEhvd2V2ZXIsIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBjbGVhcmx5IGRlbW9uc3RyYXRlcyBhIHBhdHRlcm4gYmV0d2VlbiB0aGUgcG9wdWxhdGlvbiBvZiBhIGNvdW50eSBhbmQgaXQncyBwb2xpdGljYWwgYWR2YW50YWdlLiBFYXN0ZXJuIGNvdW50aWVzIGZhdm9yZWQgTWF0dCBSb3NlbmRhbGUsIHdoaWxlIHdlc3Rlcm4gY291bnRpZXMgdm90ZWQgZm9yIFRlc3Rlci4gCgoKCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiA8LSBzZW5hdGVfZWxlY3Rpb24gJT4lIAogIG11dGF0ZShMb25naXR1ZGUgPSBhc190aWJibGUoc3RfY29vcmRpbmF0ZXMoc3RfY2VudHJvaWQoc2VuYXRlX2VsZWN0aW9uJGdlb21ldHJ5KSkpJFgpICU+JSAKICBtdXRhdGUoTGF0aXR1ZGUgPSBhc190aWJibGUoc3RfY29vcmRpbmF0ZXMoc3RfY2VudHJvaWQoc2VuYXRlX2VsZWN0aW9uJGdlb21ldHJ5KSkpJFkpCmBgYApgYGB7cn0Kc2VuYXRlX2VsZWN0aW9uICU+JQogIGxlYWZsZXQoKSAlPiUgCiAgYWRkVGlsZXMoKSAlPiUKICBhZGRQb2x5Z29ucyh3ZWlnaHQgPSAxKSAlPiUgCiAgc2V0VmlldygtMTEwLCA0Nywgem9vbSA9IDYpICU+JSAKYWRkQ2lyY2xlTWFya2Vycyh+TG9uZ2l0dWRlLCB+TGF0aXR1ZGUpCmBgYApIZXJlJ3MgYSBncmFwaCBpbGx1c3RyYXRpbmcgdGhlICJjZW50ZXIiIG9mIGVhY2ggY291bnR5LCBnZW9ncmFwaGljYWxseS4gCgoKYGBge3J9CmxvbmdpdHVkZV9sbSA8LSBsbShSZXB1Yl9hZHZhbnRhZ2UgfiBMb25naXR1ZGUsIGRhdGEgPSBzZW5hdGVfZWxlY3Rpb24pCnRpZHkobG9uZ2l0dWRlX2xtKQpnbGFuY2UobG9uZ2l0dWRlX2xtKQpgYGAKYGBge3J9CnNxcnQoMC4xNzMyODIxKQpgYGAKCgpUaGlzIHRhYmxlIHNob3dzIGEgbGluZWFyIHJlZ3Jlc3Npb24gb2YgcG9wdWxhdGlvbiBieSBnZW9ncmFwaHkuIFRoZSByIHNxdWFyZWQgaXMgMC40MiB3aXRoIGEgc2lnbmlmaWNhbnQgcC12YWx1ZSwgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlzIGEgc2lnbmlmaWNhbnQsIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gd2VzdGVybiBjb3VudGllcyBoYXZpbmcgYSBoaWdoZXIgcG9wdWxhdGlvbiBjb21wYXJlZCB0byBlYXN0ZXJuIGNvdW50aWVzLiAKCgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgCiAgICAgICAgICB5ID0gflJlcHViX2FkdmFudGFnZSwKICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IiwgCiAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJDb3VudHk6IiwgQ291bnR5LCAiPGJyPiIsICJMb25naXR1ZGU6ICIsIExvbmdpdHVkZSwgIjxicj4iLCAiUmVwdWJsaWNhbiBhZHZhbnRhZ2U6ICIsIFJlcHViX2FkdmFudGFnZSkpICU+JSAKICBhZGRfbWFya2VycyhtYXJrZXIgPSBsaXN0KG9wYWNpdHkgPSAwLjcpLCBzaG93bGVnZW5kID0gRikgJT4lCiAgbGF5b3V0KHRpdGxlID0gIlByZWRpY3RpbmcgUmVwdWJsaWNhbiBWb3RlIEFkdmFudGFnZSBmcm9tIExvbmdpdHVkZSwgYnkgQ291bnR5IiwKICAgICAgICAgeGF4aXMgPSBsaXN0KHRpdGxlID0gIkNvdW50eSBsb25naXR1ZGUiKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gIlJlcHVibGljYW4gdm90ZSBhZHZhbnRhZ2UiKSkgJT4lIAogIGFkZF9saW5lcyh5ID0gfmZpdHRlZChsb25naXR1ZGVfbG0pKQpgYGAKVGhpcyBncmFwaCBpbGx1c3RyYXRlcyB0aGUgcG9wdWxhdGlvbiBkZW5zaXR5IG9mIE1vbnRhbmEgYnkgZ2VvZ3JhcGh5LCB3aXRoIHRoZSBsaW5lYXIgcmVncmVzc2lvbiBpbmRpY2F0aW5nIGEgcG9zaXRpdmUgY29ycmVsYXRpb24gYmV0d2VlbiBlYXN0ZXJuIGNvdW50aWVzICh3aXRoIGxvd2VyIHBvcHVsYXRpb25zKSB2b3RpbmcgbW9yZSBSZXB1YmxpY2FuIGluIHRoZSBzZW5hdGUgZWxlY3Rpb24uIEFjY29yZGluZyB0byB0aGUgdGFibGUsIFRlc3RlciBkaWQgYmV0dGVyIHRoYW4gUm9zZW5kYWxlIGluIHRoZSB3ZXN0ZXJuIGNvdW50aWVzLgoKCgpgYGB7cn0KbXVsdGlwbGVfbG0gPC0gbG0oUmVwdWJfYWR2YW50YWdlIH4gUG9wdWxhdGlvbiArIExvbmdpdHVkZSwgZGF0YSA9IHNlbmF0ZV9lbGVjdGlvbikKdGlkeShtdWx0aXBsZV9sbSkKZ2xhbmNlKG11bHRpcGxlX2xtKQpgYGAKYGBge3J9CnNxcnQoMC4yNzM5OTkJKQpgYGAKSGVyZSBpcyBhIG11bHRpcGxlIHJlZ3Jlc3Npb24gcHJlZGljdGluZyB0aGUgZ2VvZ3JhcGhpYyBhcmVhICh3ZXN0IG9yIGVhc3QpIGFuZCBwb3B1bGF0aW9uLiBXaXRoIGFuIHIgc3F1YXJlZCB2YWx1ZSBvZiAwLjUyIGFuZCBhIHNpZ25pZmljYW50IHAtdmFsdWUsIG9uZSBjYW4gcHJlZGljdCBhIHBvc2l0aXZlIGNvcnJlbGF0aW9uIGJldHdlZW4gcG9wdWxhdGlvbiBhbW91bnQgYW5kIGdlb2dyYXBoaWMgcmVnaW9uLgoKYGBge3J9CnNlbmF0ZV9lbGVjdGlvbiAlPiUgCiAgcGxvdF9seSh4ID0gfkxvbmdpdHVkZSwgeSA9IH5Qb3B1bGF0aW9uLCB6ID0gflJlcHViX2FkdmFudGFnZSwgCiAgICAgICAgICB0ZXh0ID0gfkNvdW50eSwgaG92ZXJpbmZvID0gInRleHQiKSAlPiUgCiAgYWRkX21hcmtlcnMob3BhY2l0eSA9IC43LCBzaG93bGVnZW5kID0gRikKYGBgCkhlcmUgaXMgYSAzRCBncmFwaCBzaG93aW5nIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBsb25naXR1ZGUsIHBvcHVsYXRpb24sIGFuZCB2b3RpbmcgYmVoYXZpb3IgaW4gTW9udGFuYS4gVGhlIGZhcnRoZXIgZWFzdCB5b3UgZ2V0LCB0aGUgbW9yZSB2b3RlcyBNYXR0IFJvc2VuZGFsZSByZWNlaXZlZC4gVGhlIGZhcnRoZXIgd2VzdCB5b3UgZ2V0LCB0aGUgbW9yZSB2b3RlcyBKb24gVGVzdGVyIHJlY2VpdmVkLiBBIHZlcnkgaW50ZXJlc3RpbmcgcmVzdWx0IHdpdGggbG90cyBvZiBpbXBsaWNhdGlvbnMgZm9yIGZ1dHVyZSBwb2xpdGljaWFucyBjYW1wYWlnbmluZyBpbiBNb250YW5hLiAKCgoKCgo=