knitr::opts_chunk$set(cache = TRUE, dev = c("png", "pdf", "tiff"))
library(eucs)
library(ggplot2)
library(GGally)
library(here)
library(oz)
library(png)
library(raster)
library(rgeos)
library(sp)
library(tidyr)
library(xtable)
Plot Locations
ibra_subregions <- unique(
c(
subset(
occupancy_southeast,
occupancy_southeast$ibra_subregion_coverage > .5,
ibra_subregion
)[[1]],
occupancy_grampians$ibra_subregion
)
)
tmp <- tempfile()
png(tmp, 600, 500, bg = rgb(1, 1, 1, 1))
oz(FALSE)
plot(
subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions),
col = "grey",
border = NA,
add = TRUE
)
dev.off()
par(mar = c(3, 3, 1, 1))
plot(
map_southeast, xlim = c(141, 151), ylim = -c(39, 34), border = "black",
lwd = .5, panel.first = grid()
)
plot(
subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions),
col = grey.colors(length(ibra_subregions), .1, .8),
border = NA,
add = TRUE
)
points(
occupancy_grampians[c("longitude_gda94", "latitude_gda94")], pch = 16,
cex = .1, col = rgb(.1, .1, .1, .1)
)
points(
occupancy_grampians[c("longitude_gda94", "latitude_gda94")], pch = 16,
cex = .01, col = rgb(1, 1, 1)
)
text(142.4, -38, "Greater Grampians", pos = 3)
points(
subset(
occupancy_southeast,
ibra_subregion_coverage > .5,
c("longitude_gda94", "latitude_gda94")
),
cex = .1,
pch = 16,
col = rgb(.1, .1, .1, .1)
)
points(
subset(
occupancy_southeast,
ibra_subregion_coverage > .5,
c("longitude_gda94", "latitude_gda94")
),
cex = .01,
pch = 16,
col = rgb(1, 1, 1)
)
points(144.963056, -37.813611, pch = 16)
text(144.963056, -37.813611, label = "Melbourne", cex = .5, pos = 2)
points(151.209444, -33.865, pch = 16)
text(151.209444, -33.865, label = "Sydney", cex = .5, pos = 2)
axis(1, tick = FALSE)
axis(2, tick = FALSE, las = 1)
rasterImage(readPNG(tmp), 149, -39.2, 151, -37.9)

Correlations among sampled covariates
hist_data <- do.call(
rbind,
list(
with(
covariates_grampians,
data.frame(
Region = "Grampians",
mlq = mean_moisture_index_of_low_qtr,
twi = topographic_wetness_index_3sec,
r1k = relief_1000m_radius,
tn = total_nitrogen
)
),
with(
covariates_southeast,
data.frame(
Region = "South-east Australia",
mlq = mean_moisture_index_of_low_qtr,
twi = topographic_wetness_index_3sec,
r1k = relief_1000m_radius,
tn = total_nitrogen
)
)
)
)
hist_data$Region <- relevel(hist_data$Region, "South-east Australia")
par(mar = rep(.5, 4), oma = c(3, 4, 4, 3), mfrow = c(3, 3))
ramps <- list()
ramps[[1]] <- colorRampPalette(
c(rgb(.7, .7, .7, 0), rgb(0, 0, 0, 1)), alpha = TRUE
)
ramps[[2]] <- colorRampPalette(
c(rgb(.3, .3, .3, 0), rgb(1, 1, 1, 1)), alpha = TRUE
)
rgns <- c("South-east Australia" = FALSE, "Grampians" = TRUE)
vars <- list()
vars[[1]] <- c("mlq", "twi", "r1k")
vars[[2]] <- c("tn", "r1k", "twi")
labels <- c(
mlq = "Mean Moisture Index\nLowest Quarter",
twi = "Topographic\nWetness Index",
r1k = "Relief\n(1000m Radius)",
tn = "Total Nitrogen"
)
for (i in seq(vars[[1]])) {
for (j in seq(vars[[2]])) {
if (sum(i, j) > 4) {
plot.new()
if (i == j) {
legend(
"center", c("Southeast","Grampians"),
fill = c("black", "white"),
bty = "n", cex = 2, xpd = NA
)
}
} else {
for (k in seq(rgns)) {
smoothScatter(
subset(
hist_data, Region == names(rgns)[k], c(vars[[1]][j], vars[[2]][i])
),
colramp = ramps[[k]], nrpoints = 0, add = rgns[k], xaxt = "n",
yaxt = "n",
panel.first = {
rect(
par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[4],
col = "lightgrey"
)
grid(col = "grey")
},
xlim = range(hist_data[[vars[[1]][j]]], na.rm = TRUE),
ylim = range(hist_data[[vars[[2]][i]]], na.rm = TRUE)
)
}
if (sum(i, j) == 4) {
axis(1)
axis(4, las = 1)
}
if (i == 1) mtext(labels[vars[[1]][j]], 3, 1)
if (j == 1) mtext(labels[vars[[2]][i]], 2, 1)
}
}
}

Histograms of sampled covariates
hist_data$Region <- relevel(hist_data$Region, "Grampians")
hist_data <- gather(hist_data, type, value, -Region)
hist_data$type <- factor(hist_data$type, rev(levels(factor(hist_data$type))))
hist_data$Region <- factor(hist_data$Region, rev(levels(hist_data$Region)))
ggplot(na.omit(hist_data)) +
aes(value, fill = Region) +
geom_histogram(bins = 25) +
scale_fill_grey() +
facet_grid(
~type,
labeller = as_labeller(labels),
scales = "free_x"
) +
xlab("") +
ylab("Plots") +
theme_bw(base_size = 14) +
theme(
legend.position = c(.975, .95), legend.justification = c("right", "top"),
legend.title = element_blank()
)

rgns <- subset(map_ibra_southeast, IBRA_SUB_N %in% ibra_subregions)
km2 <- 1000000
aa <- CRS("+init=epsg:3577")
summary_table <- data.frame(
Region = ibra_subregions,
"Area (km$^2$)" = as.integer(round(as.vector(tapply(
gArea(spTransform(rgns, aa), TRUE) / km2, rgns@data$IBRA_SUB_N, sum
)[ibra_subregions]), -2)),
"No. of plots" = as.vector(table(
c(occupancy_grampians[, 2], occupancy_southeast[, 2])
)[ibra_subregions]),
"No. of taxa" = c(
apply(
with(
subset(modeldata_southeast, occupancy),
table(taxon, ibra_subregion) > 0
),
2,
sum
),
`Greater Grampians` = length(unique(modeldata_grampians$taxon))
)[ibra_subregions],
check.names = FALSE,
stringsAsFactors = FALSE
)
summary_table <- xtable(
summary_table, caption = "IBRA subregions", label = "tab:summary"
)
dir.create(
here("notebooks/eucalypt_project_maps_files/figure-html"),
showWarnings = FALSE, recursive = TRUE
)
print(
summary_table,
file = here(
"notebooks/eucalypt_project_maps_files/figure-html/summarytab.tex"
),
include.rownames = FALSE,
table.placement = "htbp!",
caption.placement = "top",
sanitize.text.function = identity
)
IycgLS0tCiMnIHRpdGxlOiAiTWFwcyBhbmQgcGxvdHMgZm9yIHRoZSBldWNhbHlwdCBwcm9qZWN0IgojJyBhdXRob3I6ICJXaWxsaWFtIEsuIE1vcnJpcyIKIycgZGF0ZTogImByIFN5cy5EYXRlKClgIgojJyBvdXRwdXQ6CiMnICAgcm1hcmtkb3duOjpodG1sX25vdGVib29rOgojJyAgICAgY29kZV9mb2xkaW5nOiBoaWRlCiMnIC0tLQoKIysgc2V0dXAsIG1lc3NhZ2U9RkFMU0UKa25pdHI6Om9wdHNfY2h1bmskc2V0KGNhY2hlID0gVFJVRSwgZGV2ID0gYygicG5nIiwgInBkZiIsICJ0aWZmIikpCmxpYnJhcnkoZXVjcykKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KEdHYWxseSkKbGlicmFyeShoZXJlKQpsaWJyYXJ5KG96KQpsaWJyYXJ5KHBuZykKbGlicmFyeShyYXN0ZXIpCmxpYnJhcnkocmdlb3MpCmxpYnJhcnkoc3ApCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoeHRhYmxlKQoKIycgIyMgUGxvdCBMb2NhdGlvbnMKIysgcGxvdC1sb2NhdGlvbi1tYXAsIG1lc3NhZ2U9RkFMU0UsIGZpZy53aWR0aD03LjUsIHJlc3VsdHM9ImhpZGUiCmlicmFfc3VicmVnaW9ucyA8LSB1bmlxdWUoCiAgYygKICAgIHN1YnNldCgKICAgICAgb2NjdXBhbmN5X3NvdXRoZWFzdCwKICAgICAgb2NjdXBhbmN5X3NvdXRoZWFzdCRpYnJhX3N1YnJlZ2lvbl9jb3ZlcmFnZSA+IC41LAogICAgICBpYnJhX3N1YnJlZ2lvbgogICAgKVtbMV1dLAogICAgb2NjdXBhbmN5X2dyYW1waWFucyRpYnJhX3N1YnJlZ2lvbgogICkKKQoKdG1wIDwtIHRlbXBmaWxlKCkKcG5nKHRtcCwgNjAwLCA1MDAsIGJnID0gcmdiKDEsIDEsIDEsIDEpKQpveihGQUxTRSkKcGxvdCgKICBzdWJzZXQobWFwX2licmFfc291dGhlYXN0LCBJQlJBX1NVQl9OICVpbiUgaWJyYV9zdWJyZWdpb25zKSwKICBjb2wgPSAiZ3JleSIsCiAgYm9yZGVyID0gTkEsCiAgYWRkID0gVFJVRQopCmRldi5vZmYoKQoKcGFyKG1hciA9IGMoMywgMywgMSwgMSkpCnBsb3QoCiAgbWFwX3NvdXRoZWFzdCwgeGxpbSA9IGMoMTQxLCAxNTEpLCB5bGltID0gLWMoMzksIDM0KSwgYm9yZGVyID0gImJsYWNrIiwKICBsd2QgPSAuNSwgcGFuZWwuZmlyc3QgPSBncmlkKCkKKQpwbG90KAogIHN1YnNldChtYXBfaWJyYV9zb3V0aGVhc3QsIElCUkFfU1VCX04gJWluJSBpYnJhX3N1YnJlZ2lvbnMpLAogIGNvbCA9IGdyZXkuY29sb3JzKGxlbmd0aChpYnJhX3N1YnJlZ2lvbnMpLCAuMSwgLjgpLAogIGJvcmRlciA9IE5BLAogIGFkZCA9IFRSVUUKKQpwb2ludHMoCiAgb2NjdXBhbmN5X2dyYW1waWFuc1tjKCJsb25naXR1ZGVfZ2RhOTQiLCAibGF0aXR1ZGVfZ2RhOTQiKV0sIHBjaCA9IDE2LAogIGNleCA9IC4xLCBjb2wgPSByZ2IoLjEsIC4xLCAuMSwgLjEpCikKcG9pbnRzKAogIG9jY3VwYW5jeV9ncmFtcGlhbnNbYygibG9uZ2l0dWRlX2dkYTk0IiwgImxhdGl0dWRlX2dkYTk0IildLCBwY2ggPSAxNiwKICBjZXggPSAuMDEsIGNvbCA9IHJnYigxLCAxLCAxKQopCgoKdGV4dCgxNDIuNCwgLTM4LCAiR3JlYXRlciBHcmFtcGlhbnMiLCBwb3MgPSAzKQpwb2ludHMoCiAgc3Vic2V0KAogICAgb2NjdXBhbmN5X3NvdXRoZWFzdCwKICAgIGlicmFfc3VicmVnaW9uX2NvdmVyYWdlID4gLjUsCiAgICBjKCJsb25naXR1ZGVfZ2RhOTQiLCAibGF0aXR1ZGVfZ2RhOTQiKQogICksCiAgY2V4ID0gLjEsCiAgcGNoID0gMTYsCiAgY29sID0gcmdiKC4xLCAuMSwgLjEsIC4xKQopCnBvaW50cygKICBzdWJzZXQoCiAgICBvY2N1cGFuY3lfc291dGhlYXN0LAogICAgaWJyYV9zdWJyZWdpb25fY292ZXJhZ2UgPiAuNSwKICAgIGMoImxvbmdpdHVkZV9nZGE5NCIsICJsYXRpdHVkZV9nZGE5NCIpCiAgKSwKICBjZXggPSAuMDEsCiAgcGNoID0gMTYsCiAgY29sID0gcmdiKDEsIDEsIDEpCikKCnBvaW50cygxNDQuOTYzMDU2LCAtMzcuODEzNjExLCBwY2ggPSAxNikKdGV4dCgxNDQuOTYzMDU2LCAtMzcuODEzNjExLCBsYWJlbCA9ICJNZWxib3VybmUiLCBjZXggPSAuNSwgcG9zID0gMikKcG9pbnRzKDE1MS4yMDk0NDQsIC0zMy44NjUsIHBjaCA9IDE2KQp0ZXh0KDE1MS4yMDk0NDQsIC0zMy44NjUsIGxhYmVsID0gIlN5ZG5leSIsIGNleCA9IC41LCBwb3MgPSAyKQoKYXhpcygxLCB0aWNrID0gRkFMU0UpCmF4aXMoMiwgdGljayA9IEZBTFNFLCBsYXMgPSAxKQpyYXN0ZXJJbWFnZShyZWFkUE5HKHRtcCksIDE0OSwgLTM5LjIsIDE1MSwgLTM3LjkpCgojJyAjIyBDb3JyZWxhdGlvbnMgYW1vbmcgc2FtcGxlZCBjb3ZhcmlhdGVzCiMrIHBhaXJzLWNvdmFycywgZmlnLndpZHRoPTMuNSwgZmlnLmhlaWdodD0zLjUsIHdhcm5pbmc9RkFMU0UsIGRldi5hcmdzPWxpc3QocG9pbnRzaXplPTgpCmhpc3RfZGF0YSA8LSBkby5jYWxsKAogIHJiaW5kLAogIGxpc3QoCiAgICB3aXRoKAogICAgICBjb3ZhcmlhdGVzX2dyYW1waWFucywKICAgICAgZGF0YS5mcmFtZSgKICAgICAgICBSZWdpb24gPSAiR3JhbXBpYW5zIiwKICAgICAgICBtbHEgPSBtZWFuX21vaXN0dXJlX2luZGV4X29mX2xvd19xdHIsCiAgICAgICAgdHdpID0gdG9wb2dyYXBoaWNfd2V0bmVzc19pbmRleF8zc2VjLAogICAgICAgIHIxayA9IHJlbGllZl8xMDAwbV9yYWRpdXMsCiAgICAgICAgdG4gID0gdG90YWxfbml0cm9nZW4KICAgICAgKQogICAgKSwKICAgIHdpdGgoCiAgICAgIGNvdmFyaWF0ZXNfc291dGhlYXN0LAogICAgICBkYXRhLmZyYW1lKAogICAgICAgIFJlZ2lvbiA9ICJTb3V0aC1lYXN0IEF1c3RyYWxpYSIsCiAgICAgICAgbWxxID0gbWVhbl9tb2lzdHVyZV9pbmRleF9vZl9sb3dfcXRyLAogICAgICAgIHR3aSA9IHRvcG9ncmFwaGljX3dldG5lc3NfaW5kZXhfM3NlYywKICAgICAgICByMWsgPSByZWxpZWZfMTAwMG1fcmFkaXVzLAogICAgICAgIHRuICA9IHRvdGFsX25pdHJvZ2VuCiAgICAgICkKICAgICkKICApCikKCmhpc3RfZGF0YSRSZWdpb24gPC0gcmVsZXZlbChoaXN0X2RhdGEkUmVnaW9uLCAiU291dGgtZWFzdCBBdXN0cmFsaWEiKQoKcGFyKG1hciA9IHJlcCguNSwgNCksIG9tYSA9IGMoMywgNCwgNCwgMyksIG1mcm93ID0gYygzLCAzKSkKcmFtcHMgPC0gbGlzdCgpCnJhbXBzW1sxXV0gPC0gY29sb3JSYW1wUGFsZXR0ZSgKICBjKHJnYiguNywgLjcsIC43LCAwKSwgcmdiKDAsIDAsIDAsIDEpKSwgYWxwaGEgPSBUUlVFCikKcmFtcHNbWzJdXSA8LSBjb2xvclJhbXBQYWxldHRlKAogIGMocmdiKC4zLCAuMywgLjMsIDApLCByZ2IoMSwgMSwgMSwgMSkpLCBhbHBoYSA9IFRSVUUKKQpyZ25zIDwtIGMoIlNvdXRoLWVhc3QgQXVzdHJhbGlhIiA9IEZBTFNFLCAiR3JhbXBpYW5zIiA9IFRSVUUpCnZhcnMgPC0gbGlzdCgpCnZhcnNbWzFdXSA8LSBjKCJtbHEiLCAidHdpIiwgInIxayIpCnZhcnNbWzJdXSA8LSBjKCJ0biIsICJyMWsiLCAidHdpIikKbGFiZWxzIDwtIGMoCiAgbWxxID0gIk1lYW4gTW9pc3R1cmUgSW5kZXhcbkxvd2VzdCBRdWFydGVyIiwKICB0d2kgPSAiVG9wb2dyYXBoaWNcbldldG5lc3MgSW5kZXgiLAogIHIxayA9ICJSZWxpZWZcbigxMDAwbSBSYWRpdXMpIiwKICB0biAgPSAiVG90YWwgTml0cm9nZW4iCikKCmZvciAoaSBpbiBzZXEodmFyc1tbMV1dKSkgewogIGZvciAoaiBpbiBzZXEodmFyc1tbMl1dKSkgewogICAgaWYgKHN1bShpLCBqKSA+IDQpIHsKICAgICAgcGxvdC5uZXcoKQogICAgICBpZiAoaSA9PSBqKSB7CiAgICAgICAgbGVnZW5kKAogICAgICAgICAgImNlbnRlciIsIGMoIlNvdXRoZWFzdCIsIkdyYW1waWFucyIpLAogICAgICAgICAgZmlsbCA9IGMoImJsYWNrIiwgIndoaXRlIiksCiAgICAgICAgICBidHkgPSAibiIsIGNleCA9IDIsIHhwZCA9IE5BCiAgICAgICAgKQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3IgKGsgaW4gc2VxKHJnbnMpKSB7CiAgICAgICAgc21vb3RoU2NhdHRlcigKICAgICAgICAgIHN1YnNldCgKICAgICAgICAgICAgaGlzdF9kYXRhLCBSZWdpb24gPT0gbmFtZXMocmducylba10sIGModmFyc1tbMV1dW2pdLCB2YXJzW1syXV1baV0pCiAgICAgICAgICApLAogICAgICAgICAgY29scmFtcCA9IHJhbXBzW1trXV0sIG5ycG9pbnRzID0gMCwgYWRkID0gcmduc1trXSwgeGF4dCA9ICJuIiwKICAgICAgICAgIHlheHQgPSAibiIsCiAgICAgICAgICBwYW5lbC5maXJzdCA9IHsKICAgICAgICAgICAgcmVjdCgKICAgICAgICAgICAgICBwYXIoInVzciIpWzFdLCBwYXIoInVzciIpWzNdLCBwYXIoInVzciIpWzJdLCBwYXIoInVzciIpWzRdLAogICAgICAgICAgICAgIGNvbCA9ICJsaWdodGdyZXkiCiAgICAgICAgICAgICkKICAgICAgICAgICAgZ3JpZChjb2wgPSAiZ3JleSIpCiAgICAgICAgICB9LAogICAgICAgICAgeGxpbSA9IHJhbmdlKGhpc3RfZGF0YVtbdmFyc1tbMV1dW2pdXV0sIG5hLnJtID0gVFJVRSksCiAgICAgICAgICB5bGltID0gcmFuZ2UoaGlzdF9kYXRhW1t2YXJzW1syXV1baV1dXSwgbmEucm0gPSBUUlVFKQogICAgICAgICkKICAgICAgfQogICAgICBpZiAoc3VtKGksIGopID09IDQpIHsKICAgICAgICBheGlzKDEpCiAgICAgICAgYXhpcyg0LCBsYXMgPSAxKQogICAgICB9CiAgICAgIGlmIChpID09IDEpIG10ZXh0KGxhYmVsc1t2YXJzW1sxXV1bal1dLCAzLCAxKQogICAgICBpZiAoaiA9PSAxKSBtdGV4dChsYWJlbHNbdmFyc1tbMl1dW2ldXSwgMiwgMSkKICAgIH0KICB9Cn0KCiMnICMjIEhpc3RvZ3JhbXMgb2Ygc2FtcGxlZCBjb3ZhcmlhdGVzCiMrIGhpc3QtY292YXJzLCBmaWcud2lkdGg9MTAsIHdhcm5pbmc9RkFMU0UKaGlzdF9kYXRhJFJlZ2lvbiA8LSByZWxldmVsKGhpc3RfZGF0YSRSZWdpb24sICJHcmFtcGlhbnMiKQpoaXN0X2RhdGEgPC0gZ2F0aGVyKGhpc3RfZGF0YSwgdHlwZSwgdmFsdWUsIC1SZWdpb24pCmhpc3RfZGF0YSR0eXBlIDwtIGZhY3RvcihoaXN0X2RhdGEkdHlwZSwgcmV2KGxldmVscyhmYWN0b3IoaGlzdF9kYXRhJHR5cGUpKSkpCmhpc3RfZGF0YSRSZWdpb24gPC0gZmFjdG9yKGhpc3RfZGF0YSRSZWdpb24sIHJldihsZXZlbHMoaGlzdF9kYXRhJFJlZ2lvbikpKQoKZ2dwbG90KG5hLm9taXQoaGlzdF9kYXRhKSkgKwphZXModmFsdWUsIGZpbGwgPSBSZWdpb24pICsKZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDI1KSArCnNjYWxlX2ZpbGxfZ3JleSgpICsKZmFjZXRfZ3JpZCgKICB+dHlwZSwKICBsYWJlbGxlciA9IGFzX2xhYmVsbGVyKGxhYmVscyksCiAgc2NhbGVzID0gImZyZWVfeCIKKSArCnhsYWIoIiIpICsKeWxhYigiUGxvdHMiKSArCnRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE0KSArCnRoZW1lKAogIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjk3NSwgLjk1KSwgbGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKCJyaWdodCIsICJ0b3AiKSwKICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X2JsYW5rKCkKKQoKcmducyA8LSBzdWJzZXQobWFwX2licmFfc291dGhlYXN0LCBJQlJBX1NVQl9OICVpbiUgaWJyYV9zdWJyZWdpb25zKQprbTIgPC0gMTAwMDAwMAphYSA8LSBDUlMoIitpbml0PWVwc2c6MzU3NyIpCgpzdW1tYXJ5X3RhYmxlIDwtIGRhdGEuZnJhbWUoCiAgUmVnaW9uID0gaWJyYV9zdWJyZWdpb25zLAogICJBcmVhIChrbSReMiQpIiA9IGFzLmludGVnZXIocm91bmQoYXMudmVjdG9yKHRhcHBseSgKICAgIGdBcmVhKHNwVHJhbnNmb3JtKHJnbnMsIGFhKSwgVFJVRSkgLyBrbTIsIHJnbnNAZGF0YSRJQlJBX1NVQl9OLCBzdW0KICApW2licmFfc3VicmVnaW9uc10pLCAtMikpLAogICJOby4gb2YgcGxvdHMiID0gYXMudmVjdG9yKHRhYmxlKAogICAgYyhvY2N1cGFuY3lfZ3JhbXBpYW5zWywgMl0sIG9jY3VwYW5jeV9zb3V0aGVhc3RbLCAyXSkKICApW2licmFfc3VicmVnaW9uc10pLAogICJOby4gb2YgdGF4YSIgPSBjKAogICAgYXBwbHkoCiAgICAgIHdpdGgoCiAgICAgICAgc3Vic2V0KG1vZGVsZGF0YV9zb3V0aGVhc3QsIG9jY3VwYW5jeSksCiAgICAgICAgdGFibGUodGF4b24sIGlicmFfc3VicmVnaW9uKSA+IDAKICAgICAgKSwKICAgICAgMiwKICAgICAgc3VtCiAgICApLAogICAgYEdyZWF0ZXIgR3JhbXBpYW5zYCA9IGxlbmd0aCh1bmlxdWUobW9kZWxkYXRhX2dyYW1waWFucyR0YXhvbikpCiAgKVtpYnJhX3N1YnJlZ2lvbnNdLAogIGNoZWNrLm5hbWVzID0gRkFMU0UsCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFCikKCnN1bW1hcnlfdGFibGUgPC0geHRhYmxlKAogIHN1bW1hcnlfdGFibGUsIGNhcHRpb24gPSAiSUJSQSBzdWJyZWdpb25zIiwgbGFiZWwgPSAidGFiOnN1bW1hcnkiCikKCmRpci5jcmVhdGUoCiAgaGVyZSgibm90ZWJvb2tzL2V1Y2FseXB0X3Byb2plY3RfbWFwc19maWxlcy9maWd1cmUtaHRtbCIpLAogIHNob3dXYXJuaW5ncyA9IEZBTFNFLCByZWN1cnNpdmUgPSBUUlVFCikKCnByaW50KAogIHN1bW1hcnlfdGFibGUsCiAgZmlsZSA9IGhlcmUoCiAgICAibm90ZWJvb2tzL2V1Y2FseXB0X3Byb2plY3RfbWFwc19maWxlcy9maWd1cmUtaHRtbC9zdW1tYXJ5dGFiLnRleCIKICApLAogIGluY2x1ZGUucm93bmFtZXMgPSBGQUxTRSwKICB0YWJsZS5wbGFjZW1lbnQgPSAiaHRicCEiLAogIGNhcHRpb24ucGxhY2VtZW50ID0gInRvcCIsCiAgc2FuaXRpemUudGV4dC5mdW5jdGlvbiA9IGlkZW50aXR5CikK