Load Packages

library(tidyverse)
library(tigris)
library(tidycensus)
library(ggplot2)
library(tmap)
library(codebookr)
library(dplyr)

Import Data

vax_deid <- read_csv("~/Desktop/R-Code/SDOH_Vax/ibd_vax.csv", show_col_types = FALSE)

Delete non-Michigan states

vax_deid %>% 
  mutate(STATE = na_if(STATE, "OHIO")) %>%
  mutate(STATE = na_if(STATE, "CALIFORNIA")) %>%
  mutate(STATE = na_if(STATE, "TEXAS")) %>%
  mutate(STATE = na_if(STATE, "ARIZONA")) %>%
  mutate(STATE = na_if(STATE, "FLORIDA")) %>%
  mutate(STATE = na_if(STATE, "MARYLAND")) %>%
  mutate(STATE = na_if(STATE, "NEW JERSEY")) %>% 
  mutate(STATE = na_if(STATE, "ILLINOIS")) %>% 
  mutate(STATE = na_if(STATE, "INDIANA")) %>% 
  mutate(STATE = na_if(STATE, "NEW YORK")) %>% 
  mutate(STATE = na_if(STATE, "NORTH CAROLINA")) %>% 
  mutate(STATE = na_if(STATE, "PENNSYLVANIA")) -> vax_state

vax_state %>% 
  dplyr::select(STATE, RPL_THEMES, tract_fips10) -> vax3
print(dfSummary(vax3), method = 'render')

Data Frame Summary

vax3

Dimensions: 15245 x 3
Duplicates: 12296
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 STATE [character] 1. MICHIGAN
14103(100.0%)
14103 (92.5%) 1142 (7.5%)
2 RPL_THEMES [numeric]
Mean (sd) : -0.2 (23.4)
min ≤ med ≤ max:
-999 ≤ 0.3 ≤ 1
IQR (CV) : 0.4 (-130.9)
2507 distinct values 14615 (95.9%) 630 (4.1%)
3 tract_fips10 [numeric]
Mean (sd) : 26364799737 (3164697243)
min ≤ med ≤ max:
1081040502 ≤ 26125142000 ≤ 5.5101e+10
IQR (CV) : 80422200 (0.1)
2949 distinct values 15245 (100.0%) 0 (0.0%)

Generated by summarytools 1.0.1 (R version 4.2.1)
2022-11-03

NA

Delete Missing RPL_THEMES values

vax3 %>% 
  mutate(RPL_THEMES = na_if(RPL_THEMES, "-999")) %>%
  mutate(RPL_THEMES = na_if(RPL_THEMES, "0")) %>%
  na.omit -> vax3_nomiss

print(dfSummary(vax3_nomiss), method = 'render')

Data Frame Summary

vax3_nomiss

Dimensions: 14095 x 3
Duplicates: 11815
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 STATE [character] 1. MICHIGAN
14095(100.0%)
14095 (100.0%) 0 (0.0%)
2 RPL_THEMES [numeric]
Mean (sd) : 0.4 (0.3)
min ≤ med ≤ max:
0 ≤ 0.3 ≤ 1
IQR (CV) : 0.4 (0.7)
2244 distinct values 14095 (100.0%) 0 (0.0%)
3 tract_fips10 [numeric]
Mean (sd) : 26117278442 (45126191)
min ≤ med ≤ max:
2.6001e+10 ≤ 26125144200 ≤ 26165380800
IQR (CV) : 74080900 (0)
2280 distinct values 14095 (100.0%) 0 (0.0%)

Generated by summarytools 1.0.1 (R version 4.2.1)
2022-11-03

Exclude state variable

vax3_nomiss %>% 
  dplyr::select(tract_fips10, RPL_THEMES) -> svi_map_data
print(dfSummary(svi_map_data), method = 'render')

Data Frame Summary

svi_map_data

Dimensions: 14095 x 2
Duplicates: 11815
No Variable Stats / Values Freqs (% of Valid) Graph Valid Missing
1 tract_fips10 [numeric]
Mean (sd) : 26117278442 (45126191)
min ≤ med ≤ max:
2.6001e+10 ≤ 26125144200 ≤ 26165380800
IQR (CV) : 74080900 (0)
2280 distinct values 14095 (100.0%) 0 (0.0%)
2 RPL_THEMES [numeric]
Mean (sd) : 0.4 (0.3)
min ≤ med ≤ max:
0 ≤ 0.3 ≤ 1
IQR (CV) : 0.4 (0.7)
2244 distinct values 14095 (100.0%) 0 (0.0%)

Generated by summarytools 1.0.1 (R version 4.2.1)
2022-11-03

convert tract_fips10 to character


svi_map_data %>% 
  mutate(tract_fips10_char = as.character(tract_fips10)) -> svi_map_data1
summary(tract_fips10_char)
   Length     Class      Mode 
       18 character character 
svi_map_data1 %>% 
  dplyr::select(tract_fips10_char, RPL_THEMES)
NA
NA

Michigan census tracts

mi_tracts <- tracts("MI", 
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
mi_tracts_join <- mi_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> map_SVI

ggplot(data = map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "SVI") + 
  theme_void()


library(mapview)
mapview(map_SVI)

Interactive Map

library(mapview)
mapview(map_SVI, zcol = "RPL_THEMES")

tmap

library(tmap)
library(leaflet)
tmap_mode("view")
tmap mode set to interactive viewing
tm_shape(map_SVI) + 
  tm_fill(col = "RPL_THEMES", palette = "OrRd", direction = 2,
          alpha = 0.5)
NA
NA

Wayne County Tracts

wayne_tracts <- tracts("MI", "Wayne",
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
Using FIPS code '163' for 'Wayne County'
mi_tracts_join <- wayne_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> wayne_map_SVI

ggplot(data = wayne_map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract in Wayne County, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "Estimated Average SVI") + 
  theme_void()

Washtenaw County Tracts

wash_tracts <- tracts("MI", "Washtenaw",
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
Using FIPS code '161' for 'Washtenaw County'
mi_tracts_join <- wash_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> wash_map_SVI

ggplot(data = wash_map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract in Washtenaw County, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "Estimated Average SVI") +
theme_void()

Oakland County Tracts

oak_tracts <- tracts("MI", "Oakland",
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
Using FIPS code '125' for 'Oakland County'
mi_tracts_join <- oak_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> oak_map_SVI

ggplot(data = oak_map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract in Oakland County, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "Estimated Average SVI") +
theme_void()

McComb County Census Tracts

Macomb_tracts <- tracts("MI", "Macomb",
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
Using FIPS code '099' for 'Macomb County'
mi_tracts_join <- Macomb_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> Macomb_map_SVI

ggplot(data = Macomb_map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract in Macomb County, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "Estimated Average SVI") +
theme_void()

Monroe County Census Tracts

monroe_tracts <- tracts("MI", "Monroe",
                    cb = TRUE, 
                    year = 2018)
Using FIPS code '26' for state 'MI'
Using FIPS code '115' for 'Monroe County'
mi_tracts_join <- monroe_tracts %>%
  left_join(svi_map_data1, by = c("GEOID" = "tract_fips10_char")) -> monroe_map_SVI

ggplot(data = monroe_map_SVI, aes(fill = RPL_THEMES)) + 
  geom_sf() + 
    scale_fill_distiller(palette = "OrRd", 
                       direction = 2,
                       na.value = "grey70") + 
  labs(title = "Average SVI by Census Tract in Monroe County, 2018",
       caption = "Data source: 2018 1-year ACS, US Census Bureau",
       fill = "Estimated Average SVI") +
theme_void()

LS0tCnRpdGxlOiAiU1ZJIEhlYXQgTWFwIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRoZW1lczogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwplZGl0b3Jfb3B0aW9uczoKICBjaHVua19vdXRwdXRfdHlwZTogaW5saW5lCmRhdGU6ICIyMDIyLTExLTAzIgotLS0KCiMgTG9hZCBQYWNrYWdlcyAKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZ3JpcykKbGlicmFyeSh0aWR5Y2Vuc3VzKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkodG1hcCkKbGlicmFyeShjb2RlYm9va3IpCmxpYnJhcnkoZHBseXIpCgpgYGAKCiMgSW1wb3J0IERhdGEgCmBgYHtyfQp2YXhfZGVpZCA8LSByZWFkX2Nzdigifi9EZXNrdG9wL1ItQ29kZS9TRE9IX1ZheC9pYmRfdmF4LmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpCgpgYGAKCiMgRGVsZXRlIG5vbi1NaWNoaWdhbiBzdGF0ZXMKYGBge3J9CnZheF9kZWlkICU+JSAKICBtdXRhdGUoU1RBVEUgPSBuYV9pZihTVEFURSwgIk9ISU8iKSkgJT4lCiAgbXV0YXRlKFNUQVRFID0gbmFfaWYoU1RBVEUsICJDQUxJRk9STklBIikpICU+JQogIG11dGF0ZShTVEFURSA9IG5hX2lmKFNUQVRFLCAiVEVYQVMiKSkgJT4lCiAgbXV0YXRlKFNUQVRFID0gbmFfaWYoU1RBVEUsICJBUklaT05BIikpICU+JQogIG11dGF0ZShTVEFURSA9IG5hX2lmKFNUQVRFLCAiRkxPUklEQSIpKSAlPiUKICBtdXRhdGUoU1RBVEUgPSBuYV9pZihTVEFURSwgIk1BUllMQU5EIikpICU+JQogIG11dGF0ZShTVEFURSA9IG5hX2lmKFNUQVRFLCAiTkVXIEpFUlNFWSIpKSAlPiUgCiAgbXV0YXRlKFNUQVRFID0gbmFfaWYoU1RBVEUsICJJTExJTk9JUyIpKSAlPiUgCiAgbXV0YXRlKFNUQVRFID0gbmFfaWYoU1RBVEUsICJJTkRJQU5BIikpICU+JSAKICBtdXRhdGUoU1RBVEUgPSBuYV9pZihTVEFURSwgIk5FVyBZT1JLIikpICU+JSAKICBtdXRhdGUoU1RBVEUgPSBuYV9pZihTVEFURSwgIk5PUlRIIENBUk9MSU5BIikpICU+JSAKICBtdXRhdGUoU1RBVEUgPSBuYV9pZihTVEFURSwgIlBFTk5TWUxWQU5JQSIpKSAtPiB2YXhfc3RhdGUKCnZheF9zdGF0ZSAlPiUgCiAgZHBseXI6OnNlbGVjdChTVEFURSwgUlBMX1RIRU1FUywgdHJhY3RfZmlwczEwKSAtPiB2YXgzCnByaW50KGRmU3VtbWFyeSh2YXgzKSwgbWV0aG9kID0gJ3JlbmRlcicpCiAgCmBgYAoKIyBEZWxldGUgTWlzc2luZyBSUExfVEhFTUVTIHZhbHVlcwpgYGB7cn0KdmF4MyAlPiUgCiAgbXV0YXRlKFJQTF9USEVNRVMgPSBuYV9pZihSUExfVEhFTUVTLCAiLTk5OSIpKSAlPiUKICBtdXRhdGUoUlBMX1RIRU1FUyA9IG5hX2lmKFJQTF9USEVNRVMsICIwIikpICU+JQogIG5hLm9taXQgLT4gdmF4M19ub21pc3MKCnByaW50KGRmU3VtbWFyeSh2YXgzX25vbWlzcyksIG1ldGhvZCA9ICdyZW5kZXInKQpgYGAKCiMgRXhjbHVkZSBzdGF0ZSB2YXJpYWJsZSAKYGBge3J9CnZheDNfbm9taXNzICU+JSAKICBkcGx5cjo6c2VsZWN0KHRyYWN0X2ZpcHMxMCwgUlBMX1RIRU1FUykgLT4gc3ZpX21hcF9kYXRhCnByaW50KGRmU3VtbWFyeShzdmlfbWFwX2RhdGEpLCBtZXRob2QgPSAncmVuZGVyJykKYGBgCgojIGNvbnZlcnQgdHJhY3RfZmlwczEwIHRvIGNoYXJhY3RlcgpgYGB7cn0KCnN2aV9tYXBfZGF0YSAlPiUgCiAgbXV0YXRlKHRyYWN0X2ZpcHMxMF9jaGFyID0gYXMuY2hhcmFjdGVyKHRyYWN0X2ZpcHMxMCkpIC0+IHN2aV9tYXBfZGF0YTEKc3VtbWFyeSh0cmFjdF9maXBzMTBfY2hhcikKCnN2aV9tYXBfZGF0YTEgJT4lIAogIGRwbHlyOjpzZWxlY3QodHJhY3RfZmlwczEwX2NoYXIsIFJQTF9USEVNRVMpCgogICAgICAgICAgIApgYGAKCgoKCiMgTWljaGlnYW4gY2Vuc3VzIHRyYWN0cwpgYGB7cn0KCiMgaWRlbnRpZnlpbmcgY2Vuc3VzIHRyYWN0IGZyb20gMjAxOCBBQ1MgdXNpbmcgdGlncmlzIHBhY2thZ2UgCm1pX3RyYWN0cyA8LSB0cmFjdHMoIk1JIiwgCiAgICAgICAgICAgICAgICAgICAgY2IgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOCkKCiMgbWVyZ2luZyBNaWNoaWdhbiBjZW5zdXMgdHJhY3RzIHdpdGggQ0RDIFNWSSBkYXRhIChHRU9JRCA9IGNlbnN1cyB0cmFjdHMgaW4gdGlncmlzIHBhY2thZ2UsIHRyYWN0X2ZsaXBzMTBfY2hhciA9IGNlbnN1cyB0cmFjdHMgZnJvbSBDREMvb3VyIGRhdGEgYnV0IG11dGF0ZWQgZnJvbSBudW1lcmljIHRvIGNoYXJhY3RlcikuIAptaV90cmFjdHNfam9pbiA8LSBtaV90cmFjdHMgJT4lCiAgbGVmdF9qb2luKHN2aV9tYXBfZGF0YTEsIGJ5ID0gYygiR0VPSUQiID0gInRyYWN0X2ZpcHMxMF9jaGFyIikpIC0+IG1hcF9TVkkKCgpnZ3Bsb3QoZGF0YSA9IG1hcF9TVkksIGFlcyhmaWxsID0gUlBMX1RIRU1FUykpICsgCiAgZ2VvbV9zZigpICsgCiAgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIk9yUmQiLCAKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAyLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk3MCIpICsgCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIFNWSSBieSBDZW5zdXMgVHJhY3QsIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogMjAxOCAxLXllYXIgQUNTLCBVUyBDZW5zdXMgQnVyZWF1IiwKICAgICAgIGZpbGwgPSAiU1ZJIikgKyAKICB0aGVtZV92b2lkKCkKCgoKYGBgCgojIEludGVyYWN0aXZlIE1hcApgYGB7cn0KbGlicmFyeShtYXB2aWV3KQptYXB2aWV3KG1hcF9TVkksIHpjb2wgPSAiUlBMX1RIRU1FUyIpCgpgYGAKCiMgdG1hcApgYGB7cn0KbGlicmFyeSh0bWFwKQpsaWJyYXJ5KGxlYWZsZXQpCnRtYXBfbW9kZSgidmlldyIpCgp0bV9zaGFwZShtYXBfU1ZJKSArIAogIHRtX2ZpbGwoY29sID0gIlJQTF9USEVNRVMiLCBwYWxldHRlID0gIk9yUmQiLCBkaXJlY3Rpb24gPSAyLAogICAgICAgICAgYWxwaGEgPSAwLjUpCgoKYGBgCgoKCiMgV2F5bmUgQ291bnR5IFRyYWN0cwpgYGB7cn0Kd2F5bmVfdHJhY3RzIDwtIHRyYWN0cygiTUkiLCAiV2F5bmUiLAogICAgICAgICAgICAgICAgICAgIGNiID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTgpCgptaV90cmFjdHNfam9pbiA8LSB3YXluZV90cmFjdHMgJT4lCiAgbGVmdF9qb2luKHN2aV9tYXBfZGF0YTEsIGJ5ID0gYygiR0VPSUQiID0gInRyYWN0X2ZpcHMxMF9jaGFyIikpIC0+IHdheW5lX21hcF9TVkkKCmdncGxvdChkYXRhID0gd2F5bmVfbWFwX1NWSSwgYWVzKGZpbGwgPSBSUExfVEhFTUVTKSkgKyAKICBnZW9tX3NmKCkgKyAKICAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiT3JSZCIsIAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTcwIikgKyAKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgU1ZJIGJ5IENlbnN1cyBUcmFjdCBpbiBXYXluZSBDb3VudHksIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogMjAxOCAxLXllYXIgQUNTLCBVUyBDZW5zdXMgQnVyZWF1IiwKICAgICAgIGZpbGwgPSAiRXN0aW1hdGVkIEF2ZXJhZ2UgU1ZJIikgKyAKICB0aGVtZV92b2lkKCkKYGBgCgoKIyBXYXNodGVuYXcgQ291bnR5IFRyYWN0cwpgYGB7cn0Kd2FzaF90cmFjdHMgPC0gdHJhY3RzKCJNSSIsICJXYXNodGVuYXciLAogICAgICAgICAgICAgICAgICAgIGNiID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgeWVhciA9IDIwMTgpCgptaV90cmFjdHNfam9pbiA8LSB3YXNoX3RyYWN0cyAlPiUKICBsZWZ0X2pvaW4oc3ZpX21hcF9kYXRhMSwgYnkgPSBjKCJHRU9JRCIgPSAidHJhY3RfZmlwczEwX2NoYXIiKSkgLT4gd2FzaF9tYXBfU1ZJCgpnZ3Bsb3QoZGF0YSA9IHdhc2hfbWFwX1NWSSwgYWVzKGZpbGwgPSBSUExfVEhFTUVTKSkgKyAKICBnZW9tX3NmKCkgKyAKICAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiT3JSZCIsIAogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTcwIikgKyAKICBsYWJzKHRpdGxlID0gIkF2ZXJhZ2UgU1ZJIGJ5IENlbnN1cyBUcmFjdCBpbiBXYXNodGVuYXcgQ291bnR5LCAyMDE4IiwKICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IDIwMTggMS15ZWFyIEFDUywgVVMgQ2Vuc3VzIEJ1cmVhdSIsCiAgICAgICBmaWxsID0gIkVzdGltYXRlZCBBdmVyYWdlIFNWSSIpICsKdGhlbWVfdm9pZCgpCgpgYGAKCiMgT2FrbGFuZCBDb3VudHkgVHJhY3RzCmBgYHtyfQpvYWtfdHJhY3RzIDwtIHRyYWN0cygiTUkiLCAiT2FrbGFuZCIsCiAgICAgICAgICAgICAgICAgICAgY2IgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOCkKCm1pX3RyYWN0c19qb2luIDwtIG9ha190cmFjdHMgJT4lCiAgbGVmdF9qb2luKHN2aV9tYXBfZGF0YTEsIGJ5ID0gYygiR0VPSUQiID0gInRyYWN0X2ZpcHMxMF9jaGFyIikpIC0+IG9ha19tYXBfU1ZJCgpnZ3Bsb3QoZGF0YSA9IG9ha19tYXBfU1ZJLCBhZXMoZmlsbCA9IFJQTF9USEVNRVMpKSArIAogIGdlb21fc2YoKSArIAogICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJPclJkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMiwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5NzAiKSArIAogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBTVkkgYnkgQ2Vuc3VzIFRyYWN0IGluIE9ha2xhbmQgQ291bnR5LCAyMDE4IiwKICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IDIwMTggMS15ZWFyIEFDUywgVVMgQ2Vuc3VzIEJ1cmVhdSIsCiAgICAgICBmaWxsID0gIkVzdGltYXRlZCBBdmVyYWdlIFNWSSIpICsKdGhlbWVfdm9pZCgpCmBgYAoKCiMgTWNDb21iIENvdW50eSBDZW5zdXMgVHJhY3RzCmBgYHtyfQpNYWNvbWJfdHJhY3RzIDwtIHRyYWN0cygiTUkiLCAiTWFjb21iIiwKICAgICAgICAgICAgICAgICAgICBjYiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgIHllYXIgPSAyMDE4KQoKbWlfdHJhY3RzX2pvaW4gPC0gTWFjb21iX3RyYWN0cyAlPiUKICBsZWZ0X2pvaW4oc3ZpX21hcF9kYXRhMSwgYnkgPSBjKCJHRU9JRCIgPSAidHJhY3RfZmlwczEwX2NoYXIiKSkgLT4gTWFjb21iX21hcF9TVkkKCmdncGxvdChkYXRhID0gTWFjb21iX21hcF9TVkksIGFlcyhmaWxsID0gUlBMX1RIRU1FUykpICsgCiAgZ2VvbV9zZigpICsgCiAgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIk9yUmQiLCAKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAyLAogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk3MCIpICsgCiAgbGFicyh0aXRsZSA9ICJBdmVyYWdlIFNWSSBieSBDZW5zdXMgVHJhY3QgaW4gTWFjb21iIENvdW50eSwgMjAxOCIsCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiAyMDE4IDEteWVhciBBQ1MsIFVTIENlbnN1cyBCdXJlYXUiLAogICAgICAgZmlsbCA9ICJFc3RpbWF0ZWQgQXZlcmFnZSBTVkkiKSArCnRoZW1lX3ZvaWQoKQpgYGAKCgojIE1vbnJvZSBDb3VudHkgQ2Vuc3VzIFRyYWN0cwpgYGB7cn0KbW9ucm9lX3RyYWN0cyA8LSB0cmFjdHMoIk1JIiwgIk1vbnJvZSIsCiAgICAgICAgICAgICAgICAgICAgY2IgPSBUUlVFLCAKICAgICAgICAgICAgICAgICAgICB5ZWFyID0gMjAxOCkKCm1pX3RyYWN0c19qb2luIDwtIG1vbnJvZV90cmFjdHMgJT4lCiAgbGVmdF9qb2luKHN2aV9tYXBfZGF0YTEsIGJ5ID0gYygiR0VPSUQiID0gInRyYWN0X2ZpcHMxMF9jaGFyIikpIC0+IG1vbnJvZV9tYXBfU1ZJCgpnZ3Bsb3QoZGF0YSA9IG1vbnJvZV9tYXBfU1ZJLCBhZXMoZmlsbCA9IFJQTF9USEVNRVMpKSArIAogIGdlb21fc2YoKSArIAogICAgc2NhbGVfZmlsbF9kaXN0aWxsZXIocGFsZXR0ZSA9ICJPclJkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMiwKICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5NzAiKSArIAogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBTVkkgYnkgQ2Vuc3VzIFRyYWN0IGluIE1vbnJvZSBDb3VudHksIDIwMTgiLAogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogMjAxOCAxLXllYXIgQUNTLCBVUyBDZW5zdXMgQnVyZWF1IiwKICAgICAgIGZpbGwgPSAiRXN0aW1hdGVkIEF2ZXJhZ2UgU1ZJIikgKwp0aGVtZV92b2lkKCkKYGBgCgoKCgoKCgoK