This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

library(dplyr)
library(tidyverse)
library(sf) #for reading in shapefiles
Shinagh_Habitats = st_read("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Shinagh_Habitats.shp")
Shinagh_Habitats$Shape_Area <- st_area(Shinagh_Habitats$geometry)
Shinagh_Habitats$Shape_Area <- as.numeric(Shinagh_Habitats$Shape_Area)

Shinagh_Farm = st_read("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Shinagh_Farm.shp")
Shinagh_Habitats$Name <- as.factor(Shinagh_Habitats$Name) 

Shinagh_Farm_proj = st_read("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Shinagh_Farm_Project.shp")

Shinagh_Habitats_proj = st_read("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Shinagh_Habitats_Project.shp") %>% 
  select(Name, PopupInfo) %>% 
  mutate(Area =  st_area(geometry)) %>% 
  st_transform("+proj=longlat +datum=WGS84 +no_defs")

Shinagh_Habitats_proj <- Shinagh_Habitats_proj[105:140,]
Shinagh_Habitats_proj$Area <- as.numeric(Shinagh_Habitats_proj$Area)
st_crs(Shinagh_Habitats_proj)

Shinagh_Habitats_proj[Shinagh_Habitats_proj$Name == "Hedgerow",]$PopupInfo <- c(1:15)
Shinagh_Habitats_proj[Shinagh_Habitats_proj$Name == "Ditch",]$PopupInfo <- c(1:5)
Shinagh_Habitats_proj[Shinagh_Habitats_proj$Name == "Grassy Bank",]$PopupInfo <- c(1:3)
Shinagh_Habitats_proj[Shinagh_Habitats_proj$Name == "Field Margin",]$PopupInfo <- c(1:4)
Shinagh_Habitats_proj[Shinagh_Habitats_proj$Name == "Woodland",]$PopupInfo <- c(1:9)


Bird_Surveys <- Shinagh_Farm_proj[Shinagh_Farm_proj$Name == "Bird_Proj",]

#st_write(Bird_Surveys, "C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Bird_Surveys.shp")

Bird_Survey_Habitat <-  st_read("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Bird_Surveys_Intersect_Project.shp") %>% 
  select(Name_1, PopupInfo_, AltMode) %>% 
  mutate(Area =  st_area(geometry)) %>% 
  st_transform("+proj=longlat +datum=WGS84 +no_defs")

Bird_Survey_Habitat$Area <- as.numeric(Bird_Survey_Habitat$Area)

st_crs(Bird_Survey_Habitat)
st_crs(Shinagh_Farm)

saving map as PNG

Interactive Map for web

Shinagh_Habitats %>% 
  group_by(Name) %>% 
  summarise(Area = sum(Shape_Area)) %>% 
  st_drop_geometry() -> Habitat_Area
`summarise()` ungrouping output (override with `.groups` argument)
farm_area <- Shinagh_Farm$Shape_Area

Habitat_Area$Percent_Covering <- round(Habitat_Area$Area/farm_area[1],4)*100
Habitat_Area$Transect_Distance <- (Habitat_Area$Percent_Covering/100)*1000

Habitat_on_Farm <- Habitat_Area %>% 
  filter(Name != "BL3",
         Name != "ED2",
         Name != "GA1",
         Name != "GA2",
         Name != "WD5")

Natural_Habitat_Cover <- sum(Habitat_on_Farm$Percent_Covering)
Hedgerow_Cover <- sum(Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WL1"], Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WL2"])
Woodland_Cover <- sum(
  Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WD1"],
  Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WD3"],
  Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WN2"],
  Habitat_on_Farm$Percent_Covering[Habitat_on_Farm$Name == "WN5"])

Natural_Habitat_Cover - (Woodland_Cover + Hedgerow_Cover)
[1] 1.26
(Natural_Habitat_Cover/farm_area)*100
 [1] 0.0009547527 1.2922859165          Inf          Inf          Inf          Inf          Inf          Inf
 [9]          Inf          Inf          Inf          Inf          Inf          Inf          Inf          Inf
[17]          Inf          Inf          Inf          Inf          Inf          Inf          Inf          Inf
[25]          Inf          Inf          Inf          Inf          Inf          Inf          Inf          Inf
[33]          Inf          Inf
sum(Habitat_on_Farm$Area)/10000
[1] 8.720607
g2 <- ggplot(Habitat_Area, aes(x=Name, y = Percent_Covering)) +
  geom_col(aes(fill=Name))
g2



Bird_Data <- readxl::read_xlsx("C:/Users/Administrator/Documents/Shinagh/Data/Scripts/Bird_Survey.xlsx")
Bird_Data$Point <- as.factor(Bird_Data$Point)
Bird_Data$Habitat <- as.factor(Bird_Data$Habitat)

colnames(Bird_Survey_Habitat) <- c("Habitat", "PopupInfo", "Point", "geometry", "Area")
Bird_Survey_Habitat$Point <- as.factor(Bird_Survey_Habitat$Point)

Birds <- left_join(Bird_Survey_Habitat, Bird_Data)
Joining, by = c("Habitat", "Point")
Birds$Abundance <- as.numeric(Birds$Abundance)
NAs introduced by coercion
Birds$Species[Birds$Species == "NA"] <- NA
unique(Birds$Species)
 [1] "Magpie"           "Hooded Crow"      "Swallow"          NA                 "Wren"            
 [6] "Song Thrush"      "Blue Tit"         "Swift"            "Long Tailed Tits" "Stonechat"       
[11] "Blackbird"        "Robin"            "Goldfinch"        "Goldcrest"        "Jackdaw"         
[16] "Woodpigeon"       "Great Tit"        "Chiffchaff"       "Blackcap"         "Rook"            
[21] "Starling"         "Buzzard"          "Chaffinch"        "Bullfinch"        "Pied Wagtail"    
[26] "House Martin"    
length(na.omit(unique(Birds$Species)))
[1] 25
Birds$Species <- as.factor(Birds$Species)

Birds %>% 
  group_by(Habitat) %>% 
  summarise(Abundance = sum(Abundance, na.rm = TRUE),
            Area= round(sum(Area),1)) %>% 
  mutate(bird_per_m2 = Abundance/Area) %>% 
  st_drop_geometry() -> Abundance
`summarise()` ungrouping output (override with `.groups` argument)
g3 <- ggplot(Abundance, aes(x=Habitat, y = Abundance)) +
  geom_col(aes(fill=Habitat))
g4 <- ggplot(Abundance, aes(x=Habitat, y = bird_per_m2)) +
  geom_col(aes(fill=Habitat))


Birds %>% 
  group_by(Habitat) %>% 
  summarise(Richness = length(na.omit(unique(Species))),
            Area= round(sum(Area),1)) %>% 
  mutate(species_per_m2 = Richness/Area) %>% 
  st_drop_geometry() -> Richness
`summarise()` ungrouping output (override with `.groups` argument)
g5 <- ggplot(Richness, aes(x=Habitat, y = Richness)) +
  geom_col(aes(fill=Habitat))
g6 <- ggplot(Richness, aes(x=Habitat, y = species_per_m2)) +
  geom_col(aes(fill=Habitat))

g1

g2

g3

g4

g5

g6



Bird_Data$Abundance <- as.numeric(Bird_Data$Abundance)
NAs introduced by coercion
Bird_Data %>% 
  group_by(Species, Habitat) %>% 
  summarise(Abundance = sum(Abundance, na.rm = TRUE)) %>% 
  pivot_wider(names_from = Species, values_from = Abundance) -> Species_Habitat
`summarise()` regrouping output by 'Species' (override with `.groups` argument)
order <- as.character(Species_Habitat$Habitat)

Species_Habitat[is.na(Species_Habitat)] <- 0
Species_Habitat[,2:26]

library(vegan)
Loading required package: permute
Loading required package: lattice
This is vegan 2.5-6
div <- vegan::contribdiv(Species_Habitat[,2:26], index = "simpson",
                  relative = TRUE, scaled = TRUE, drop.zero = FALSE)
## S3 method for class 'contribdiv'
#plot(div)

div$habitat <- order

g7 <- ggplot(div, aes(x=habitat)) +
  geom_col(aes(y = alpha, fill=habitat))
g8 <- ggplot(div, aes(x=habitat)) +
  geom_col(aes(y = beta, fill=habitat))
g9 <- ggplot(div, aes(x=habitat)) +
  geom_col(aes(y = gamma, fill=habitat))
g7

g8

g9



plot(contribdiv(Species_Habitat[,2:26], "richness"), main = "Absolute")


opar <- par(mfrow=c(2,2))

plot(contribdiv(Species_Habitat[,2:26], "richness"), main = "Absolute")
plot(contribdiv(Species_Habitat[,2:26], "richness", relative = TRUE), main = "Relative")
plot(contribdiv(Species_Habitat[,2:26], "simpson"))
plot(contribdiv(Species_Habitat[,2:26], "simpson", relative = TRUE))
par(opar)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KVHJ5IGV4ZWN1dGluZyB0aGlzIGNodW5rIGJ5IGNsaWNraW5nIHRoZSAqUnVuKiBidXR0b24gd2l0aGluIHRoZSBjaHVuayBvciBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluc2lkZSBpdCBhbmQgcHJlc3NpbmcgKkN0cmwrU2hpZnQrRW50ZXIqLiANCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNmKSAjZm9yIHJlYWRpbmcgaW4gc2hhcGVmaWxlcw0KU2hpbmFnaF9IYWJpdGF0cyA9IHN0X3JlYWQoIkM6L1VzZXJzL0FkbWluaXN0cmF0b3IvRG9jdW1lbnRzL1NoaW5hZ2gvRGF0YS9TY3JpcHRzL1NoaW5hZ2hfSGFiaXRhdHMuc2hwIikNClNoaW5hZ2hfSGFiaXRhdHMkU2hhcGVfQXJlYSA8LSBzdF9hcmVhKFNoaW5hZ2hfSGFiaXRhdHMkZ2VvbWV0cnkpDQpTaGluYWdoX0hhYml0YXRzJFNoYXBlX0FyZWEgPC0gYXMubnVtZXJpYyhTaGluYWdoX0hhYml0YXRzJFNoYXBlX0FyZWEpDQoNClNoaW5hZ2hfRmFybSA9IHN0X3JlYWQoIkM6L1VzZXJzL0FkbWluaXN0cmF0b3IvRG9jdW1lbnRzL1NoaW5hZ2gvRGF0YS9TY3JpcHRzL1NoaW5hZ2hfRmFybS5zaHAiKQ0KU2hpbmFnaF9IYWJpdGF0cyROYW1lIDwtIGFzLmZhY3RvcihTaGluYWdoX0hhYml0YXRzJE5hbWUpIA0KDQpTaGluYWdoX0Zhcm1fcHJvaiA9IHN0X3JlYWQoIkM6L1VzZXJzL0FkbWluaXN0cmF0b3IvRG9jdW1lbnRzL1NoaW5hZ2gvRGF0YS9TY3JpcHRzL1NoaW5hZ2hfRmFybV9Qcm9qZWN0LnNocCIpDQoNClNoaW5hZ2hfSGFiaXRhdHNfcHJvaiA9IHN0X3JlYWQoIkM6L1VzZXJzL0FkbWluaXN0cmF0b3IvRG9jdW1lbnRzL1NoaW5hZ2gvRGF0YS9TY3JpcHRzL1NoaW5hZ2hfSGFiaXRhdHNfUHJvamVjdC5zaHAiKSAlPiUgDQogIHNlbGVjdChOYW1lLCBQb3B1cEluZm8pICU+JSANCiAgbXV0YXRlKEFyZWEgPSAgc3RfYXJlYShnZW9tZXRyeSkpICU+JSANCiAgc3RfdHJhbnNmb3JtKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCArbm9fZGVmcyIpDQoNClNoaW5hZ2hfSGFiaXRhdHNfcHJvaiA8LSBTaGluYWdoX0hhYml0YXRzX3Byb2pbMTA1OjE0MCxdDQpTaGluYWdoX0hhYml0YXRzX3Byb2okQXJlYSA8LSBhcy5udW1lcmljKFNoaW5hZ2hfSGFiaXRhdHNfcHJvaiRBcmVhKQ0Kc3RfY3JzKFNoaW5hZ2hfSGFiaXRhdHNfcHJvaikNCg0KU2hpbmFnaF9IYWJpdGF0c19wcm9qW1NoaW5hZ2hfSGFiaXRhdHNfcHJvaiROYW1lID09ICJIZWRnZXJvdyIsXSRQb3B1cEluZm8gPC0gYygxOjE1KQ0KU2hpbmFnaF9IYWJpdGF0c19wcm9qW1NoaW5hZ2hfSGFiaXRhdHNfcHJvaiROYW1lID09ICJEaXRjaCIsXSRQb3B1cEluZm8gPC0gYygxOjUpDQpTaGluYWdoX0hhYml0YXRzX3Byb2pbU2hpbmFnaF9IYWJpdGF0c19wcm9qJE5hbWUgPT0gIkdyYXNzeSBCYW5rIixdJFBvcHVwSW5mbyA8LSBjKDE6MykNClNoaW5hZ2hfSGFiaXRhdHNfcHJvaltTaGluYWdoX0hhYml0YXRzX3Byb2okTmFtZSA9PSAiRmllbGQgTWFyZ2luIixdJFBvcHVwSW5mbyA8LSBjKDE6NCkNClNoaW5hZ2hfSGFiaXRhdHNfcHJvaltTaGluYWdoX0hhYml0YXRzX3Byb2okTmFtZSA9PSAiV29vZGxhbmQiLF0kUG9wdXBJbmZvIDwtIGMoMTo5KQ0KDQoNCkJpcmRfU3VydmV5cyA8LSBTaGluYWdoX0Zhcm1fcHJvaltTaGluYWdoX0Zhcm1fcHJvaiROYW1lID09ICJCaXJkX1Byb2oiLF0NCg0KI3N0X3dyaXRlKEJpcmRfU3VydmV5cywgIkM6L1VzZXJzL0FkbWluaXN0cmF0b3IvRG9jdW1lbnRzL1NoaW5hZ2gvRGF0YS9TY3JpcHRzL0JpcmRfU3VydmV5cy5zaHAiKQ0KDQpCaXJkX1N1cnZleV9IYWJpdGF0IDwtICBzdF9yZWFkKCJDOi9Vc2Vycy9BZG1pbmlzdHJhdG9yL0RvY3VtZW50cy9TaGluYWdoL0RhdGEvU2NyaXB0cy9CaXJkX1N1cnZleXNfSW50ZXJzZWN0X1Byb2plY3Quc2hwIikgJT4lIA0KICBzZWxlY3QoTmFtZV8xLCBQb3B1cEluZm9fLCBBbHRNb2RlKSAlPiUgDQogIG11dGF0ZShBcmVhID0gIHN0X2FyZWEoZ2VvbWV0cnkpKSAlPiUgDQogIHN0X3RyYW5zZm9ybSgiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQgK25vX2RlZnMiKQ0KDQpCaXJkX1N1cnZleV9IYWJpdGF0JEFyZWEgPC0gYXMubnVtZXJpYyhCaXJkX1N1cnZleV9IYWJpdGF0JEFyZWEpDQoNCnN0X2NycyhCaXJkX1N1cnZleV9IYWJpdGF0KQ0Kc3RfY3JzKFNoaW5hZ2hfRmFybSkNCg0KYGBgDQoNCg0Kc2F2aW5nIG1hcCBhcyBQTkcNCmBgYHtyfQ0KZzEgPC0gZ2dwbG90KFNoaW5hZ2hfSGFiaXRhdHMpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IE5hbWUpKQ0KDQojZ2dzYXZlKCJTaGluYWdoX0hhYml0YXRfTWFwLnBkZiIsIHBsb3QgPSBnMSkNCmBgYA0KDQoNCkludGVyYWN0aXZlIE1hcCBmb3Igd2ViDQpgYGB7cn0NCmxpYnJhcnkoc2NhbGVzKSMgaW5zZXJ0cyBjb21tYSdzIGludG8gbGFyZ2UgbnVtYmVycyBmb3IgdXNlIG9uIGxhYmVscyB0aHJvdWdoIGNvbW1hKCkNCmxpYnJhcnkoUkNvbG9yQnJld2VyKQ0KbGlicmFyeShsZWFmbGV0KQ0KDQojc2V0dGluZyBsYWJlbCBvcHRpb25zDQpsYWJlbG9wdGlvbnMgPC0gbGFiZWxPcHRpb25zKHN0eWxlID0gbGlzdCgiZm9udC13ZWlnaHQiID0gIm5vcm1hbCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9ICIzcHggOHB4IiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRzaXplID0gIjhweCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9ICJhdXRvIikNCg0KZmFybWxhYmVsIDwtIHBhc3RlMCgiPHN0cm9uZz4iLCAiU2hpbmFnaCBEYWlyeSBGYXJtIiAsIjwvc3Ryb25nPiIsICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmVhOiAiLCByb3VuZChTaGluYWdoX0Zhcm0kU2hhcGVfQXJlYS8xMDAwMCwyKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYSIsICIsICIsIGNvbW1hKHJvdW5kKFNoaW5hZ2hfRmFybSRTaGFwZV9BcmVhLC0xKSksDQogICAgICAgICAgICAgICAgICAgICJtMiIpDQoNCmhhYml0YXRsYWJlbCA8LSBwYXN0ZTAoIjxzdHJvbmc+IiwgU2hpbmFnaF9IYWJpdGF0cyROYW1lLCI8L3N0cm9uZz4iLCAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJlYTogIiwgcm91bmQoU2hpbmFnaF9IYWJpdGF0cyRTaGFwZV9BcmVhLzEwMDAwLDIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhIiwgIiwgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWEocm91bmQoU2hpbmFnaF9IYWJpdGF0cyRTaGFwZV9BcmVhLC0xKSksICJtMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCJEZXRhaWxzOiAiLCBTaGluYWdoX0hhYml0YXRzJFBvcHVwSW5mbykNCg0KYmlyZGhhYml0YXRsYWJlbCA8LSBwYXN0ZTAoIjxzdHJvbmc+IiwgQmlyZF9TdXJ2ZXlfSGFiaXRhdCROYW1lXzEsIjwvc3Ryb25nPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIkFyZWE6ICIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChCaXJkX1N1cnZleV9IYWJpdGF0JEFyZWEvMTAwMDAsMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhIiwgIiwgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWEocm91bmQoQmlyZF9TdXJ2ZXlfSGFiaXRhdCRBcmVhLC0xKSksICJtMiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCJEZXRhaWxzOiAiLCBCaXJkX1N1cnZleV9IYWJpdGF0JFBvcHVwSW5mb18pDQoNClF1YWxpdHlfTGFiZWwgPC0gcGFzdGUwKCI8c3Ryb25nPiIsIFNoaW5hZ2hfSGFiaXRhdHNfcHJvaiROYW1lLCI8L3N0cm9uZz4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCJBcmVhOiAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQoU2hpbmFnaF9IYWJpdGF0c19wcm9qJEFyZWEvMTAwMDAsMiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhIiwgIiwgIiwNCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWEocm91bmQoU2hpbmFnaF9IYWJpdGF0c19wcm9qJEFyZWEsLTEpKSwgIm0yIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsIkRldGFpbHM6ICIsIFNoaW5hZ2hfSGFiaXRhdHNfcHJvaiRQb3B1cEluZm8pDQoNCg0KcGFsIDwtIGNvbG9yRmFjdG9yKA0KICAgIHBhbGV0dGUgPSBjKCIjRDQ1N0E4IiwiIzRGNEU0RSIsICIjOEY1ODU2IiwgIiM5MTkxOTEiLCAiIzFDNzJGQyIsICIjMUVCRjEzIiwgIiMyOUZGMDMiLCAiIzNERjU0MSIsICIjRDhFQjJDIiwgIiNBMEZDMkYiLCAiI0RERkYwMCIsICIjRkYzQjM4IiwgIiNFMDA0MzgiLCAiI0VENjhEMCIsICIjRUIyQzkyIiwgIiNGRjlEMUMiKSwNCiAgICBkb21haW4gPSBTaGluYWdoX0hhYml0YXRzJE5hbWUpDQoNCiNzZXR0aW5nIGhpZ2hsaWdodCBvcHRpb25zDQpoaWdobGlnaHQgPC0gaGlnaGxpZ2h0T3B0aW9ucyhjb2xvciA9ICJncmV5Iix3ZWlnaHQgPSAyLGJyaW5nVG9Gcm9udCA9VFJVRSkNCg0KY29sbmFtZXMoQmlyZF9TdXJ2ZXlfSGFiaXRhdCkgPC0gYygiSGFiaXRhdCIsICJQb3B1cEluZm8iLCAiUG9pbnQiLCAiZ2VvbWV0cnkiLCAiQXJlYSIpDQoNCiNjcmVhdGluZyBtYXANClNoaW5hZ2hfSGFiaXRhdF9NYXAgPC0gbGVhZmxldCgpICU+JQ0KICBhZGRNYXBQYW5lKCJiYWNrZ3JvdW5kX21hcCIsIHpJbmRleCA9IDQxMCkgJT4lICANCiAgYWRkTWFwUGFuZSgiZmFybSIsIHpJbmRleCA9IDQyMCkgJT4lICAgICAgDQogIGFkZE1hcFBhbmUoImhhYml0YXRzIiwgekluZGV4ID0gNDMwKSAlPiUgICAgICAgICAgDQogIGFkZE1hcFBhbmUoImJpcmRfc3VydmV5IiwgekluZGV4ID0gNDQwKSAlPiUgIA0KICAgIGFkZE1hcFBhbmUoImhhYml0YXRfcXVhbGl0eV9zdXJ2ZXkiLCB6SW5kZXggPSA0NTApICU+JSANCiAgYWRkUHJvdmlkZXJUaWxlcyhwcm92aWRlcnMkRXNyaS5Xb3JsZEltYWdlcnksDQogICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHBhdGhPcHRpb25zKHBhbmUgPSAiYmFja2dyb3VuZF9tYXAiKSklPiUNCiAgICBhZGRQb2x5Z29ucyhkYXRhID0gU2hpbmFnaF9GYXJtLCMgYWRkaW5nIGEgcG9seWdvbg0KICAgICAgICAgICAgICAgIGZpbGxDb2xvciA9ICAiZ3JleSIsI2NvbHVyaW5nIGJ5IHJhdGUgb2YgaW5mZWN0aW9uDQogICAgICAgICAgICAgICAgY29sb3IgPSAiI0U4RThFOCIsICMgTmVlZCB0byB1c2UgaGV4IGNvbG9yIGNvZGVzLg0KICAgICAgICAgICAgICAgIGZpbGxPcGFjaXR5ID0gMC41LCANCiAgICAgICAgICAgICAgICB3ZWlnaHQgPSAxLCANCiAgICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjIsDQogICAgICAgICAgICAgICAgcG9wdXAgPSBsYXBwbHkoZmFybWxhYmVsLCBodG1sdG9vbHM6OkhUTUwpLA0KICAgICAgICAgICAgICAgIHBvcHVwT3B0aW9ucyAgPSBsYWJlbG9wdGlvbnMsDQogICAgICAgICAgICAgICAgaGlnaGxpZ2h0T3B0aW9ucyA9IGhpZ2hsaWdodCwNCiAgICAgICAgICAgICAgICBvcHRpb25zID0gcGF0aE9wdGlvbnMocGFuZSA9ICJmYXJtIiksDQogICAgICAgICAgICAgICAgZ3JvdXA9ICJGYXJtIikgJT4lI2FkZGluZyB0byBmYXJtIGxldmVsDQogICAgICBhZGRQb2x5Z29ucyhkYXRhID0gU2hpbmFnaF9IYWJpdGF0cywjIGFkZGluZyBhIHBvbHlnb24NCiAgICAgICAgICAgICAgICBmaWxsQ29sb3IgPSB+cGFsKE5hbWUpLCNjb2x1cmluZyBieSByYXRlIG9mIGluZmVjdGlvbg0KICAgICAgICAgICAgICAgIGNvbG9yID0gIiNFOEU4RTgiLCAjIE5lZWQgdG8gdXNlIGhleCBjb2xvciBjb2Rlcy4NCiAgICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSwgDQogICAgICAgICAgICAgICAgd2VpZ2h0ID0gMSwgDQogICAgICAgICAgICAgICAgc21vb3RoRmFjdG9yID0gMC4yLA0KICAgICAgICAgICAgICAgIHBvcHVwICA9IGxhcHBseShoYWJpdGF0bGFiZWwsIGh0bWx0b29sczo6SFRNTCksDQogICAgICAgICAgICAgICAgcG9wdXBPcHRpb25zICA9IGxhYmVsb3B0aW9ucywNCiAgICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0LA0KICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBwYXRoT3B0aW9ucyhwYW5lID0gImhhYml0YXRzIiksDQogICAgICAgICAgICAgICAgZ3JvdXA9ICJIYWJpdGF0cyIpICU+JSNhZGRpbmcgMiBoYWJpdGF0IGx2bA0KICBhZGRQb2x5Z29ucyhkYXRhID0gQmlyZF9TdXJ2ZXlfSGFiaXRhdCwNCiAgICAgICAgICAgICAgZmlsbENvbG9yID0gfnBhbChIYWJpdGF0KSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiI0U4RThFOCIsICMgTmVlZCB0byB1c2UgaGV4IGNvbG9yIGNvZGVzLg0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSwgDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjIsDQogICAgICAgICAgICAgIHBvcHVwICA9IGxhcHBseShiaXJkaGFiaXRhdGxhYmVsLCBodG1sdG9vbHM6OkhUTUwpLA0KICAgICAgICAgICAgICBwb3B1cE9wdGlvbnMgID0gbGFiZWxvcHRpb25zLA0KICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0LA0KICAgICAgICAgICAgICBvcHRpb25zID0gcGF0aE9wdGlvbnMocGFuZSA9ICJiaXJkX3N1cnZleSIpLA0KICAgICAgICAgICAgICBncm91cD0gIkJpcmRfU3VydmV5IikgJT4lIA0KICBhZGRQb2x5Z29ucyhkYXRhID0gU2hpbmFnaF9IYWJpdGF0c19wcm9qLA0KICAgICAgICAgICAgICBmaWxsQ29sb3IgPSBjKCIjQkVGRjZFIiwgIiM4NUUyRkMiLCAiI0YzNkZGQyIsICIjRkE3M0MyIiwgIiNGQ0NBNkQiKSwNCiAgICAgICAgICAgICAgY29sb3IgPSAiI0U4RThFOCIsICMgTmVlZCB0byB1c2UgaGV4IGNvbG9yIGNvZGVzLg0KICAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDAuNSwgDQogICAgICAgICAgICAgIHdlaWdodCA9IDEsIA0KICAgICAgICAgICAgICBzbW9vdGhGYWN0b3IgPSAwLjIsDQogICAgICAgICAgICAgIHBvcHVwICA9IGxhcHBseShRdWFsaXR5X0xhYmVsLCBodG1sdG9vbHM6OkhUTUwpLA0KICAgICAgICAgICAgICBwb3B1cE9wdGlvbnMgID0gbGFiZWxvcHRpb25zLA0KICAgICAgICAgICAgICBoaWdobGlnaHRPcHRpb25zID0gaGlnaGxpZ2h0LA0KICAgICAgICAgICAgICBvcHRpb25zID0gcGF0aE9wdGlvbnMocGFuZSA9ICJoYWJpdGF0X3F1YWxpdHlfc3VydmV5IiksDQogICAgICAgICAgICAgIGdyb3VwPSAiSGFiaXRhdF9RdWFsaXR5X1N1cnZleSIpICU+JSANCiAgICBhZGRMZWdlbmQocGFsID0gcGFsLA0KICAgICAgICAgICAgICB2YWx1ZXMgPSBTaGluYWdoX0hhYml0YXRzJE5hbWUsDQogICAgICAgICAgICAgIHBvc2l0aW9uID0gImJvdHRvbXJpZ2h0IiwgDQogICAgICAgICAgICAgIHRpdGxlID0gIkhhYml0YXRzIDxicj4iKSAlPiUNCiAgICBhZGRTY2FsZUJhcihwb3NpdGlvbiA9ICJ0b3ByaWdodCIpICU+JSANCiAgICBhZGRMYXllcnNDb250cm9sKG92ZXJsYXlHcm91cHMgPSBjKCJGYXJtIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIYWJpdGF0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmlyZF9TdXJ2ZXkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhYml0YXRfUXVhbGl0eV9TdXJ2ZXkiKSkNCg0KIyBEaXNwbGF5IGFuZCBzYXZlIHRoZSBtYXANCmludmlzaWJsZShwcmludChTaGluYWdoX0hhYml0YXRfTWFwKSkNCg0KYGBgDQoNCg0KYGBge3J9DQpTaGluYWdoX0hhYml0YXRzICU+JSANCiAgZ3JvdXBfYnkoTmFtZSkgJT4lIA0KICBzdW1tYXJpc2UoQXJlYSA9IHN1bShTaGFwZV9BcmVhKSkgJT4lIA0KICBzdF9kcm9wX2dlb21ldHJ5KCkgLT4gSGFiaXRhdF9BcmVhDQoNCmZhcm1fYXJlYSA8LSBTaGluYWdoX0Zhcm0kU2hhcGVfQXJlYQ0KDQpIYWJpdGF0X0FyZWEkUGVyY2VudF9Db3ZlcmluZyA8LSByb3VuZChIYWJpdGF0X0FyZWEkQXJlYS9mYXJtX2FyZWFbMV0sNCkqMTAwDQpIYWJpdGF0X0FyZWEkVHJhbnNlY3RfRGlzdGFuY2UgPC0gKEhhYml0YXRfQXJlYSRQZXJjZW50X0NvdmVyaW5nLzEwMCkqMTAwMA0KDQpIYWJpdGF0X29uX0Zhcm0gPC0gSGFiaXRhdF9BcmVhICU+JSANCiAgZmlsdGVyKE5hbWUgIT0gIkJMMyIsDQogICAgICAgICBOYW1lICE9ICJFRDIiLA0KICAgICAgICAgTmFtZSAhPSAiR0ExIiwNCiAgICAgICAgIE5hbWUgIT0gIkdBMiIsDQogICAgICAgICBOYW1lICE9ICJXRDUiKQ0KDQpOYXR1cmFsX0hhYml0YXRfQ292ZXIgPC0gc3VtKEhhYml0YXRfb25fRmFybSRQZXJjZW50X0NvdmVyaW5nKQ0KSGVkZ2Vyb3dfQ292ZXIgPC0gc3VtKEhhYml0YXRfb25fRmFybSRQZXJjZW50X0NvdmVyaW5nW0hhYml0YXRfb25fRmFybSROYW1lID09ICJXTDEiXSwgSGFiaXRhdF9vbl9GYXJtJFBlcmNlbnRfQ292ZXJpbmdbSGFiaXRhdF9vbl9GYXJtJE5hbWUgPT0gIldMMiJdKQ0KV29vZGxhbmRfQ292ZXIgPC0gc3VtKA0KICBIYWJpdGF0X29uX0Zhcm0kUGVyY2VudF9Db3ZlcmluZ1tIYWJpdGF0X29uX0Zhcm0kTmFtZSA9PSAiV0QxIl0sDQogIEhhYml0YXRfb25fRmFybSRQZXJjZW50X0NvdmVyaW5nW0hhYml0YXRfb25fRmFybSROYW1lID09ICJXRDMiXSwNCiAgSGFiaXRhdF9vbl9GYXJtJFBlcmNlbnRfQ292ZXJpbmdbSGFiaXRhdF9vbl9GYXJtJE5hbWUgPT0gIldOMiJdLA0KICBIYWJpdGF0X29uX0Zhcm0kUGVyY2VudF9Db3ZlcmluZ1tIYWJpdGF0X29uX0Zhcm0kTmFtZSA9PSAiV041Il0pDQoNCk5hdHVyYWxfSGFiaXRhdF9Db3ZlciAtIChXb29kbGFuZF9Db3ZlciArIEhlZGdlcm93X0NvdmVyKQ0KDQooTmF0dXJhbF9IYWJpdGF0X0NvdmVyL2Zhcm1fYXJlYSkqMTAwDQoNCnN1bShIYWJpdGF0X29uX0Zhcm0kQXJlYSkvMTAwMDANCg0KDQoNCmcyIDwtIGdncGxvdChIYWJpdGF0X0FyZWEsIGFlcyh4PU5hbWUsIHkgPSBQZXJjZW50X0NvdmVyaW5nKSkgKw0KICBnZW9tX2NvbChhZXMoZmlsbD1OYW1lKSkNCmcyDQoNCg0KQmlyZF9EYXRhIDwtIHJlYWR4bDo6cmVhZF94bHN4KCJDOi9Vc2Vycy9BZG1pbmlzdHJhdG9yL0RvY3VtZW50cy9TaGluYWdoL0RhdGEvU2NyaXB0cy9CaXJkX1N1cnZleS54bHN4IikNCkJpcmRfRGF0YSRQb2ludCA8LSBhcy5mYWN0b3IoQmlyZF9EYXRhJFBvaW50KQ0KQmlyZF9EYXRhJEhhYml0YXQgPC0gYXMuZmFjdG9yKEJpcmRfRGF0YSRIYWJpdGF0KQ0KDQpjb2xuYW1lcyhCaXJkX1N1cnZleV9IYWJpdGF0KSA8LSBjKCJIYWJpdGF0IiwgIlBvcHVwSW5mbyIsICJQb2ludCIsICJnZW9tZXRyeSIsICJBcmVhIikNCkJpcmRfU3VydmV5X0hhYml0YXQkUG9pbnQgPC0gYXMuZmFjdG9yKEJpcmRfU3VydmV5X0hhYml0YXQkUG9pbnQpDQoNCkJpcmRzIDwtIGxlZnRfam9pbihCaXJkX1N1cnZleV9IYWJpdGF0LCBCaXJkX0RhdGEpDQoNCkJpcmRzJEFidW5kYW5jZSA8LSBhcy5udW1lcmljKEJpcmRzJEFidW5kYW5jZSkNCkJpcmRzJFNwZWNpZXNbQmlyZHMkU3BlY2llcyA9PSAiTkEiXSA8LSBOQQ0KdW5pcXVlKEJpcmRzJFNwZWNpZXMpDQpsZW5ndGgobmEub21pdCh1bmlxdWUoQmlyZHMkU3BlY2llcykpKQ0KQmlyZHMkU3BlY2llcyA8LSBhcy5mYWN0b3IoQmlyZHMkU3BlY2llcykNCg0KQmlyZHMgJT4lIA0KICBncm91cF9ieShIYWJpdGF0KSAlPiUgDQogIHN1bW1hcmlzZShBYnVuZGFuY2UgPSBzdW0oQWJ1bmRhbmNlLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgQXJlYT0gcm91bmQoc3VtKEFyZWEpLDEpKSAlPiUgDQogIG11dGF0ZShiaXJkX3Blcl9tMiA9IEFidW5kYW5jZS9BcmVhKSAlPiUgDQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAtPiBBYnVuZGFuY2UNCg0KZzMgPC0gZ2dwbG90KEFidW5kYW5jZSwgYWVzKHg9SGFiaXRhdCwgeSA9IEFidW5kYW5jZSkpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGw9SGFiaXRhdCkpDQpnNCA8LSBnZ3Bsb3QoQWJ1bmRhbmNlLCBhZXMoeD1IYWJpdGF0LCB5ID0gYmlyZF9wZXJfbTIpKSArDQogIGdlb21fY29sKGFlcyhmaWxsPUhhYml0YXQpKQ0KDQoNCkJpcmRzICU+JSANCiAgZ3JvdXBfYnkoSGFiaXRhdCkgJT4lIA0KICBzdW1tYXJpc2UoUmljaG5lc3MgPSBsZW5ndGgobmEub21pdCh1bmlxdWUoU3BlY2llcykpKSwNCiAgICAgICAgICAgIEFyZWE9IHJvdW5kKHN1bShBcmVhKSwxKSkgJT4lIA0KICBtdXRhdGUoc3BlY2llc19wZXJfbTIgPSBSaWNobmVzcy9BcmVhKSAlPiUgDQogIHN0X2Ryb3BfZ2VvbWV0cnkoKSAtPiBSaWNobmVzcw0KDQpnNSA8LSBnZ3Bsb3QoUmljaG5lc3MsIGFlcyh4PUhhYml0YXQsIHkgPSBSaWNobmVzcykpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGw9SGFiaXRhdCkpDQpnNiA8LSBnZ3Bsb3QoUmljaG5lc3MsIGFlcyh4PUhhYml0YXQsIHkgPSBzcGVjaWVzX3Blcl9tMikpICsNCiAgZ2VvbV9jb2woYWVzKGZpbGw9SGFiaXRhdCkpDQoNCmcxDQpnMg0KZzMNCmc0DQpnNQ0KZzYNCg0KDQpCaXJkX0RhdGEkQWJ1bmRhbmNlIDwtIGFzLm51bWVyaWMoQmlyZF9EYXRhJEFidW5kYW5jZSkNCkJpcmRfRGF0YSAlPiUgDQogIGdyb3VwX2J5KFNwZWNpZXMsIEhhYml0YXQpICU+JSANCiAgc3VtbWFyaXNlKEFidW5kYW5jZSA9IHN1bShBYnVuZGFuY2UsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IFNwZWNpZXMsIHZhbHVlc19mcm9tID0gQWJ1bmRhbmNlKSAtPiBTcGVjaWVzX0hhYml0YXQNCg0Kb3JkZXIgPC0gYXMuY2hhcmFjdGVyKFNwZWNpZXNfSGFiaXRhdCRIYWJpdGF0KQ0KDQpTcGVjaWVzX0hhYml0YXRbaXMubmEoU3BlY2llc19IYWJpdGF0KV0gPC0gMA0KU3BlY2llc19IYWJpdGF0WywyOjI2XQ0KDQpsaWJyYXJ5KHZlZ2FuKQ0KZGl2IDwtIHZlZ2FuOjpjb250cmliZGl2KFNwZWNpZXNfSGFiaXRhdFssMjoyNl0sIGluZGV4ID0gInNpbXBzb24iLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgPSBUUlVFLCBzY2FsZWQgPSBUUlVFLCBkcm9wLnplcm8gPSBGQUxTRSkNCiMjIFMzIG1ldGhvZCBmb3IgY2xhc3MgJ2NvbnRyaWJkaXYnDQojcGxvdChkaXYpDQoNCmRpdiRoYWJpdGF0IDwtIG9yZGVyDQoNCmc3IDwtIGdncGxvdChkaXYsIGFlcyh4PWhhYml0YXQpKSArDQogIGdlb21fY29sKGFlcyh5ID0gYWxwaGEsIGZpbGw9aGFiaXRhdCkpDQpnOCA8LSBnZ3Bsb3QoZGl2LCBhZXMoeD1oYWJpdGF0KSkgKw0KICBnZW9tX2NvbChhZXMoeSA9IGJldGEsIGZpbGw9aGFiaXRhdCkpDQpnOSA8LSBnZ3Bsb3QoZGl2LCBhZXMoeD1oYWJpdGF0KSkgKw0KICBnZW9tX2NvbChhZXMoeSA9IGdhbW1hLCBmaWxsPWhhYml0YXQpKQ0KZzcNCmc4DQpnOQ0KDQoNCnBsb3QoY29udHJpYmRpdihTcGVjaWVzX0hhYml0YXRbLDI6MjZdLCAicmljaG5lc3MiKSwgbWFpbiA9ICJBYnNvbHV0ZSIpDQoNCg0Kb3BhciA8LSBwYXIobWZyb3c9YygyLDIpKQ0KcGxvdChjb250cmliZGl2KFNwZWNpZXNfSGFiaXRhdFssMjoyNl0sICJyaWNobmVzcyIpLCBtYWluID0gIkFic29sdXRlIikNCnBsb3QoY29udHJpYmRpdihTcGVjaWVzX0hhYml0YXRbLDI6MjZdLCAicmljaG5lc3MiLCByZWxhdGl2ZSA9IFRSVUUpLCBtYWluID0gIlJlbGF0aXZlIikNCnBsb3QoY29udHJpYmRpdihTcGVjaWVzX0hhYml0YXRbLDI6MjZdLCAic2ltcHNvbiIpKQ0KcGxvdChjb250cmliZGl2KFNwZWNpZXNfSGFiaXRhdFssMjoyNl0sICJzaW1wc29uIiwgcmVsYXRpdmUgPSBUUlVFKSkNCnBhcihvcGFyKQ0KYGBgDQoNCg==