Gas
Station Point of Compromise
The original “Gas Station - Point of Compromised (POC)” data set
contained 72,798 observations. A random 500 observations were selected
to display on the map below based on the latitude and longitude of the
observation. Size of marker and color of marker are proportional to the
number of POCs in the ZIP code.
Using the hover over each of
the markers it displays State, County, Address, Zip Code, and Area Type.
Viewing these descriptions it is clear there are more POCs in “urban”
areas as opposed to “urban” areas. This data correlates with the more
populated regions of the United States.
#Import data
poc<- read.csv("https://tkelleman.github.io/tkweb/Week7/POC.csv")
#Select 500 observations at random
poc.rand500<-poc[sample(nrow(poc),500),]
geostyle<- list(scope = 'usa',
projection = list(type = 'albers usa'),
showland = TRUE,
landcolor = toRGB("gray95"),
subunitcolor = toRGB("gray85"),
countrycolor = toRGB("gray85"),
countrywidth = 0.5,
subunitwidth = 0.5
)
map<- plot_geo(poc.rand500, lat = ~ycoord, lon = ~xcoord) %>%
add_markers(text = ~paste("State:", STATE,
"<br>County:", county,
"<br>Address:", ADDRESS,
"<br>Zip Code:", ZIPnew,
"<br>Area Type:", description
),
color = ~ZIPPOC,
symbol = "circle",
size = ~ZIPPOC,
hoverinfo = "text") %>%
colorbar(title = "Number of POC <br>at each Zip Code") %>%
layout( title = 'Gas Station - Point of Compromise',
geo = geostyle)
map
Philadelphia Crime Data
To generate the appropriate subset of data from the original “Philly
Crime Data (2015-2024)” data set the incomplete observations were
removed using na.omit. The date needed to be extracted using the
“lubridate” package. Once the date was properly formatted, the data was
filtered to include only observations from the year 2023.
In
this map it is clear that “nonfatal” crimes are more common than “fatal”
in Philadelphia, but there isn’t much a of a trend based on
neighborhood. There are however some pockets within the city without any
observations that indicate they are either safer areas of the city or
lacking data.
#Import data
#Read the Philly Crime data
phillyCrime <- na.omit(read.csv("https://tkelleman.github.io/tkweb/Week7/PhillyCrimeSince2015.csv"))
# Extract the year from the date
y <- mdy_hm(phillyCrime$date)
phillyCrime$year <- year(y)
# Filter data for 2023
phillyCrime.2023 <- filter(phillyCrime, year == 2023)
phillyCrime.2023$color <- ifelse(phillyCrime.2023$fatal == "Fatal", "#118ab2", "#ffd166")
label.msg<- label.msg <- paste("Neighborhood:", phillyCrime.2023$neighborhood,
"<br> Zip Code:", phillyCrime.2023$zip_code,
"<br> Street Name:", phillyCrime.2023$street_name)
# Create leaflet map
leaflet(phillyCrime.2023) %>%
addProviderTiles(providers$OpenStreetMap) %>%
setView(
lng = mean(phillyCrime.2023$lng),
lat = mean(phillyCrime.2023$lat),
zoom = 11) %>%
addCircleMarkers(
color = "black",
fillColor = ~color,
#radius =
stroke = TRUE,
weight = 1,
fillOpacity = 0.8,
label = label.msg) %>%
addLegend(
position = "bottomright",
colors = c("#118ab2", "#ffd166"),
labels= c("Fatal", "Nonfatal"),
title= "Fatal & Nonfatal Crimes in Philadelphia",
opacity = 0.6) %>%
addControl(
html = "<div class='map-title'>Leaflet Map of Crime in Philadelphia <br>by Fatal and Nonfatal Crimes</div>",
position = "topleft"
)
LS0tDQp0aXRsZTogIldlZWsgNyAtIFIgTWFwcyBmb3IgVmlzdWFsaXppbmcgU3BhdGlvbiBJbmZvcm1hdGlvbiINCmF1dGhvcjogIlRpbSBLZWxsZW1hbiINCmRhdGU6ICIyMDI0LTAzLTIwIg0KDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvYzogbm8NCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZpZ193aWR0aDogOA0KICAgIGZpZ19jYXB0aW9uOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRvY19jb2xsYXBzZWQ6IHllcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHNtb290aF9zY3JvbGw6IHRydWUNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgIA0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIHRvYzogbm8NCiAgICB0b2NfZGVwdGg6IDQNCiAgICBmaWdfY2FwdGlvbjogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICBmaWdfd2lkdGg6IDUNCiAgICBmaWdfaGVpZ2h0OiA0DQotLS0NCg0KYGBgez1odG1sfQ0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCg0KZGl2I1RPQyBsaSB7DQogICAgbGlzdC1zdHlsZTpub25lOw0KICAgIGJhY2tncm91bmQtY29sb3I6bGlnaHRncmF5Ow0KICAgIGJhY2tncm91bmQtaW1hZ2U6bm9uZTsNCiAgICBiYWNrZ3JvdW5kLXJlcGVhdDpub25lOw0KICAgIGJhY2tncm91bmQtcG9zaXRpb246MDsNCiAgICBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsNCiAgICBjb2xvcjogIzc4MGMwYzsNCn0NCg0KLyogbW91c2Ugb3ZlciBsaW5rICovDQpkaXYjVE9DIGE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiB1bnZpc2l0ZWQgbGluayAqLw0KZGl2I1RPQyBhOmxpbmsgew0KICBjb2xvcjogYmx1ZTsNCn0NCg0KDQoNCmgxLnRpdGxlIHsNCiAgZm9udC1zaXplOiAyNHB4Ow0KICBjb2xvcjogRGFya2JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCiAgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7DQogIGZvbnQtdmFyaWFudC1jYXBzOiBub3JtYWw7DQp9DQpoNC5hdXRob3IgeyANCiAgICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya1JlZDsNCiAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDQuZGF0ZSB7IA0KICBmb250LXNpemU6IDE4cHg7DQogIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICBjb2xvcjogRGFya0JsdWU7DQogIHRleHQtYWxpZ246IGNlbnRlcjsNCn0NCmgxIHsNCiAgICBmb250LXNpemU6IDI0cHg7DQogICAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7DQogICAgY29sb3I6IGRhcmtyZWQ7DQogICAgdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KaDIgew0KICAgIGZvbnQtc2l6ZTogMThweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoMyB7IA0KICAgIGZvbnQtc2l6ZTogMTVweDsNCiAgICBmb250LWZhbWlseTogIlRpbWVzIE5ldyBSb21hbiIsIFRpbWVzLCBzZXJpZjsNCiAgICBjb2xvcjogbmF2eTsNCiAgICB0ZXh0LWFsaWduOiBsZWZ0Ow0KfQ0KDQpoNCB7IC8qIEhlYWRlciA0IC0gYW5kIHRoZSBhdXRob3IgYW5kIGRhdGEgaGVhZGVycyB1c2UgdGhpcyB0b28gICovDQogICAgZm9udC1zaXplOiAxOHB4Ow0KICAgIGZvbnQtZmFtaWx5OiAiVGltZXMgTmV3IFJvbWFuIiwgVGltZXMsIHNlcmlmOw0KICAgIGNvbG9yOiBkYXJrcmVkOw0KICAgIHRleHQtYWxpZ246IGxlZnQ7DQp9DQoNCi8qIHVudmlzaXRlZCBsaW5rICovDQphOmxpbmsgew0KICBjb2xvcjogZ3JlZW47DQp9DQoNCi8qIHZpc2l0ZWQgbGluayAqLw0KYTp2aXNpdGVkIHsNCiAgY29sb3I6IGdyZWVuOw0KfQ0KDQovKiBtb3VzZSBvdmVyIGxpbmsgKi8NCmE6aG92ZXIgew0KICBjb2xvcjogcmVkOw0KfQ0KDQovKiBzZWxlY3RlZCBsaW5rICovDQphOmFjdGl2ZSB7DQogIGNvbG9yOiB5ZWxsb3c7DQp9DQo8L3N0eWxlPg0KYGBgDQotLS0NCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0KIyBjb2RlIGNodW5rIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBSIGNvZGUsIHdhcm5pbmdzLCBhbmQgb3V0cHV0IA0KIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgZmlsZXMuDQpvcHRpb25zKHJlcG9zID0gbGlzdChDUkFOPSJodHRwOi8vY3Jhbi5yc3R1ZGlvLmNvbS8iKSkNCmlmICghcmVxdWlyZSgidGlkeXZlcnNlIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQogICBsaWJyYXJ5KHRpZHl2ZXJzZSkNCn0NCmlmICghcmVxdWlyZSgia25pdHIiKSkgew0KICAgaW5zdGFsbC5wYWNrYWdlcygia25pdHIiKQ0KICAgbGlicmFyeShrbml0cikNCn0NCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSB7DQogICBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCiAgIGxpYnJhcnkoY293cGxvdCkNCn0NCmlmICghcmVxdWlyZSgibGF0ZXgyZXhwIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImxhdGV4MmV4cCIpDQogICBsaWJyYXJ5KGxhdGV4MmV4cCkNCn0NCmlmICghcmVxdWlyZSgicGxvdGx5IikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoInBsb3RseSIpDQogICBsaWJyYXJ5KHBsb3RseSkNCn0NCmlmICghcmVxdWlyZSgiZ2FwbWluZGVyIikpIHsNCiAgIGluc3RhbGwucGFja2FnZXMoImdhcG1pbmRlciIpDQogICBsaWJyYXJ5KGdhcG1pbmRlcikNCn0NCmlmICghcmVxdWlyZSgicG5nIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJwbmciKSAgICAgICAgICAgICAjIEluc3RhbGwgcG5nIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJwbmciKQ0KfQ0KaWYgKCFyZXF1aXJlKCJSQ3VybCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiUkN1cmwiKSAgICAgICAgICAgIyBJbnN0YWxsIFJDdXJsIHBhY2thZ2UNCiAgICBsaWJyYXJ5KCJSQ3VybCIpDQp9DQppZiAoIXJlcXVpcmUoImNvbG91cnBpY2tlciIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiY29sb3VycGlja2VyIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImNvbG91cnBpY2tlciIpDQp9DQppZiAoIXJlcXVpcmUoImdpZnNraSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2lmc2tpIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdpZnNraSIpDQp9DQppZiAoIXJlcXVpcmUoIm1hZ2ljayIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibWFnaWNrIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoIm1hZ2ljayIpDQp9DQppZiAoIXJlcXVpcmUoImdyRGV2aWNlcyIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ3JEZXZpY2VzIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdyRGV2aWNlcyIpDQp9DQojIyMgZ2dwbG90IGFuZCBleHRlbnNpb25zDQppZiAoIXJlcXVpcmUoImdncGxvdDIiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgiZ2dwbG90MiIpDQp9DQppZiAoIXJlcXVpcmUoImdnYW5pbWF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygiZ2dhbmltYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImdnYW5pbWF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoImdncmlkZ2VzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJnZ3JpZGdlcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJnZ3JpZGdlcyIpDQp9DQppZiAoIXJlcXVpcmUoImdyYXBoaWNzIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJncmFwaGljcyIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJncmFwaGljcyIpDQp9DQppZiAoIXJlcXVpcmUoImRwbHlyIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJkcGx5ciIpDQp9DQppZiAoIXJlcXVpcmUoImx1YnJpZGF0ZSIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibHVicmlkYXRlIikgICAgICAgICAgICAgIA0KICAgIGxpYnJhcnkoImx1YnJpZGF0ZSIpDQp9DQppZiAoIXJlcXVpcmUoInRtYXAiKSkgew0KICAgIGluc3RhbGwucGFja2FnZXMoInRtYXAiKSAgICAgICAgICAgICAgDQogICAgbGlicmFyeSgidG1hcCIpDQp9DQppZiAoIXJlcXVpcmUoInNmIikpIHsNCiAgICBpbnN0YWxsLnBhY2thZ2VzKCJzZiIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJzZiIpDQp9DQoNCmlmICghcmVxdWlyZSgibGVhZmxldCIpKSB7DQogICAgaW5zdGFsbC5wYWNrYWdlcygibGVhZmxldCIpICAgICAgICAgICAgICANCiAgICBsaWJyYXJ5KCJsZWFmbGV0IikNCn0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFLCAgIA0KICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFRSVUUsICAgDQogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBOQSkNCmBgYA0KIyBHYXMgU3RhdGlvbiBQb2ludCBvZiBDb21wcm9taXNlIHsudGFic2V0fQ0KVGhlIG9yaWdpbmFsIOKAnEdhcyBTdGF0aW9uIC0gUG9pbnQgb2YgQ29tcHJvbWlzZWQgKFBPQynigJ0gZGF0YSBzZXQgY29udGFpbmVkIDcyLDc5OCBvYnNlcnZhdGlvbnMuIEEgcmFuZG9tIDUwMCBvYnNlcnZhdGlvbnMgd2VyZSBzZWxlY3RlZCB0byBkaXNwbGF5IG9uIHRoZSBtYXAgYmVsb3cgYmFzZWQgb24gdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgb2YgdGhlIG9ic2VydmF0aW9uLiBTaXplIG9mIG1hcmtlciBhbmQgY29sb3Igb2YgbWFya2VyIGFyZSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBQT0NzIGluIHRoZSBaSVAgY29kZS4gDQo8YnI+DQo8YnI+DQpVc2luZyB0aGUgaG92ZXIgb3ZlciBlYWNoIG9mIHRoZSBtYXJrZXJzIGl0IGRpc3BsYXlzIFN0YXRlLCBDb3VudHksIEFkZHJlc3MsIFppcCBDb2RlLCBhbmQgQXJlYSBUeXBlLiBWaWV3aW5nIHRoZXNlIGRlc2NyaXB0aW9ucyBpdCBpcyBjbGVhciB0aGVyZSBhcmUgbW9yZSBQT0NzIGluICJ1cmJhbiIgYXJlYXMgYXMgb3Bwb3NlZCB0byAidXJiYW4iIGFyZWFzLiBUaGlzIGRhdGEgY29ycmVsYXRlcyB3aXRoIHRoZSBtb3JlIHBvcHVsYXRlZCByZWdpb25zIG9mIHRoZSBVbml0ZWQgU3RhdGVzLg0KYGBge3IgZXZhbD1UUlVFfQ0KI0ltcG9ydCBkYXRhDQpwb2M8LSByZWFkLmNzdigiaHR0cHM6Ly90a2VsbGVtYW4uZ2l0aHViLmlvL3Rrd2ViL1dlZWs3L1BPQy5jc3YiKQ0KI1NlbGVjdCA1MDAgb2JzZXJ2YXRpb25zIGF0IHJhbmRvbQ0KcG9jLnJhbmQ1MDA8LXBvY1tzYW1wbGUobnJvdyhwb2MpLDUwMCksXQ0KDQoNCmdlb3N0eWxlPC0gbGlzdChzY29wZSA9ICd1c2EnLA0KICAgICAgICAgICAgICBwcm9qZWN0aW9uID0gbGlzdCh0eXBlID0gJ2FsYmVycyB1c2EnKSwNCiAgICAgICAgICAgICAgc2hvd2xhbmQgPSBUUlVFLA0KICAgICAgICAgICAgICBsYW5kY29sb3IgPSB0b1JHQigiZ3JheTk1IiksDQogICAgICAgICAgICAgIHN1YnVuaXRjb2xvciA9IHRvUkdCKCJncmF5ODUiKSwNCiAgICAgICAgICAgICAgY291bnRyeWNvbG9yID0gdG9SR0IoImdyYXk4NSIpLA0KICAgICAgICAgICAgICBjb3VudHJ5d2lkdGggPSAwLjUsDQogICAgICAgICAgICAgIHN1YnVuaXR3aWR0aCA9IDAuNQ0KICAgICAgICAgICAgKQ0KbWFwPC0gcGxvdF9nZW8ocG9jLnJhbmQ1MDAsIGxhdCA9IH55Y29vcmQsIGxvbiA9IH54Y29vcmQpICU+JSANCiAgYWRkX21hcmtlcnModGV4dCA9IH5wYXN0ZSgiU3RhdGU6IiwgU1RBVEUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+Q291bnR5OiIsIGNvdW50eSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj5BZGRyZXNzOiIsIEFERFJFU1MsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+WmlwIENvZGU6IiwgWklQbmV3LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+QXJlYSBUeXBlOiIsIGRlc2NyaXB0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwNCiAgICAgICAgICAgICAgY29sb3IgPSB+WklQUE9DLCANCiAgICAgICAgICAgICAgc3ltYm9sID0gImNpcmNsZSIsIA0KICAgICAgICAgICAgICBzaXplID0gflpJUFBPQywgDQogICAgICAgICAgICAgIGhvdmVyaW5mbyA9ICJ0ZXh0IikgICAlPiUgDQogIGNvbG9yYmFyKHRpdGxlID0gIk51bWJlciBvZiBQT0MgPGJyPmF0IGVhY2ggWmlwIENvZGUiKSAgJT4lIA0KICBsYXlvdXQoIHRpdGxlID0gJ0dhcyBTdGF0aW9uIC0gUG9pbnQgb2YgQ29tcHJvbWlzZScsIA0KICAgICAgICAgIGdlbyA9IGdlb3N0eWxlKQ0KbWFwDQpgYGANCjxicj4NCg0KIyBQaGlsYWRlbHBoaWEgQ3JpbWUgRGF0YSB7LnRhYnNldH0NClRvIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBzdWJzZXQgb2YgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCDigJxQaGlsbHkgQ3JpbWUgRGF0YSAoMjAxNS0yMDI0KeKAnSBkYXRhIHNldCB0aGUgaW5jb21wbGV0ZSBvYnNlcnZhdGlvbnMgd2VyZSByZW1vdmVkIHVzaW5nIG5hLm9taXQuICBUaGUgZGF0ZSBuZWVkZWQgdG8gYmUgZXh0cmFjdGVkIHVzaW5nIHRoZSDigJxsdWJyaWRhdGXigJ0gcGFja2FnZS4gT25jZSB0aGUgZGF0ZSB3YXMgcHJvcGVybHkgZm9ybWF0dGVkLCB0aGUgZGF0YSB3YXMgZmlsdGVyZWQgdG8gaW5jbHVkZSBvbmx5IG9ic2VydmF0aW9ucyBmcm9tIHRoZSB5ZWFyIDIwMjMuIA0KPGJyPg0KPGJyPg0KSW4gdGhpcyBtYXAgaXQgaXMgY2xlYXIgdGhhdCDigJxub25mYXRhbOKAnSBjcmltZXMgYXJlIG1vcmUgY29tbW9uIHRoYW4g4oCcZmF0YWzigJ0gaW4gUGhpbGFkZWxwaGlhLCBidXQgdGhlcmUgaXNu4oCZdCBtdWNoIGEgb2YgYSB0cmVuZCBiYXNlZCBvbiBuZWlnaGJvcmhvb2QuIFRoZXJlIGFyZSBob3dldmVyIHNvbWUgcG9ja2V0cyB3aXRoaW4gdGhlIGNpdHkgd2l0aG91dCBhbnkgb2JzZXJ2YXRpb25zIHRoYXQgaW5kaWNhdGUgdGhleSBhcmUgZWl0aGVyIHNhZmVyIGFyZWFzIG9mIHRoZSBjaXR5IG9yIGxhY2tpbmcgZGF0YS4NCmBgYHtyIGV2YWw9VFJVRX0NCiNJbXBvcnQgZGF0YQ0KI1JlYWQgdGhlIFBoaWxseSBDcmltZSBkYXRhDQpwaGlsbHlDcmltZSA8LSBuYS5vbWl0KHJlYWQuY3N2KCJodHRwczovL3RrZWxsZW1hbi5naXRodWIuaW8vdGt3ZWIvV2VlazcvUGhpbGx5Q3JpbWVTaW5jZTIwMTUuY3N2IikpDQoNCiMgRXh0cmFjdCB0aGUgeWVhciBmcm9tIHRoZSBkYXRlDQp5IDwtIG1keV9obShwaGlsbHlDcmltZSRkYXRlKQ0KcGhpbGx5Q3JpbWUkeWVhciA8LSB5ZWFyKHkpDQoNCiMgRmlsdGVyIGRhdGEgZm9yIDIwMjMNCnBoaWxseUNyaW1lLjIwMjMgPC0gZmlsdGVyKHBoaWxseUNyaW1lLCB5ZWFyID09IDIwMjMpDQoNCg0KcGhpbGx5Q3JpbWUuMjAyMyRjb2xvciA8LSBpZmVsc2UocGhpbGx5Q3JpbWUuMjAyMyRmYXRhbCA9PSAiRmF0YWwiLCAiIzExOGFiMiIsICIjZmZkMTY2IikNCg0KbGFiZWwubXNnPC0gbGFiZWwubXNnIDwtIHBhc3RlKCJOZWlnaGJvcmhvb2Q6IiwgcGhpbGx5Q3JpbWUuMjAyMyRuZWlnaGJvcmhvb2QsICAgIA0KICAgICAgICAgICAgICAgICAgICI8YnI+IFppcCBDb2RlOiIsIHBoaWxseUNyaW1lLjIwMjMkemlwX2NvZGUsIA0KICAgICAgICAgICAgICAgICAgICI8YnI+IFN0cmVldCBOYW1lOiIsIHBoaWxseUNyaW1lLjIwMjMkc3RyZWV0X25hbWUpDQoNCiMgQ3JlYXRlIGxlYWZsZXQgbWFwDQpsZWFmbGV0KHBoaWxseUNyaW1lLjIwMjMpICU+JQ0KICBhZGRQcm92aWRlclRpbGVzKHByb3ZpZGVycyRPcGVuU3RyZWV0TWFwKSAlPiUgDQogIHNldFZpZXcoDQogICAgICAgICAgICBsbmcgPSBtZWFuKHBoaWxseUNyaW1lLjIwMjMkbG5nKSwgDQogICAgICAgICAgICBsYXQgPSBtZWFuKHBoaWxseUNyaW1lLjIwMjMkbGF0KSwgDQogICAgICAgICAgICB6b29tID0gMTEpICU+JQ0KICBhZGRDaXJjbGVNYXJrZXJzKA0KICAgICAgICAgICAgY29sb3IgPSAiYmxhY2siLA0KICAgICAgICAgICAgZmlsbENvbG9yID0gfmNvbG9yLA0KICAgICAgICAgICAgI3JhZGl1cyA9IA0KICAgICAgICAgICAgc3Ryb2tlID0gVFJVRSwgDQogICAgICAgICAgICB3ZWlnaHQgPSAxLA0KICAgICAgICAgICAgZmlsbE9wYWNpdHkgPSAwLjgsDQogICAgICAgICAgICBsYWJlbCA9IGxhYmVsLm1zZykgICU+JQ0KICBhZGRMZWdlbmQoDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJib3R0b21yaWdodCIsIA0KICAgICAgICAgICAgY29sb3JzID0gYygiIzExOGFiMiIsICIjZmZkMTY2IiksDQogICAgICAgICAgICBsYWJlbHM9IGMoIkZhdGFsIiwgIk5vbmZhdGFsIiksDQogICAgICAgICAgICB0aXRsZT0gIkZhdGFsICYgTm9uZmF0YWwgQ3JpbWVzIGluIFBoaWxhZGVscGhpYSIsDQogICAgICAgICAgICBvcGFjaXR5ID0gMC42KSAlPiUNCiAgYWRkQ29udHJvbCgNCiAgICAgICAgICAgIGh0bWwgPSAiPGRpdiBjbGFzcz0nbWFwLXRpdGxlJz5MZWFmbGV0IE1hcCBvZiBDcmltZSBpbiBQaGlsYWRlbHBoaWEgPGJyPmJ5IEZhdGFsIGFuZCBOb25mYXRhbCAgIENyaW1lczwvZGl2PiIsDQogICAgICAgICAgICBwb3NpdGlvbiA9ICJ0b3BsZWZ0Ig0KICApDQpgYGA=